# Android App — Project Tree > **Auto-generated.** This file is maintained by the `sync-project-tree` CI workflow in > the [`RunicGateway/Android-app`](https://gitea.whitlocktech.com/RunicGateway/Android-app) repository, which > opens a pull request here whenever the tracked file layout on `main` changes. Do not edit > by hand — changes will be overwritten by the next sync. A snapshot of the tracked files in the repository (build output, dependencies, and other git-ignored paths are excluded). ```text android-app/ ├── .gitea/ │ ├── scripts/ │ │ └── gen_tree.py │ └── workflows/ │ ├── pr-checks.yml │ ├── release.yml │ ├── sonarqube.yml │ └── sync-project-tree.yml ├── app/ │ ├── licenses/ │ │ └── Cinzel-OFL.txt │ ├── src/ │ │ ├── debug/ │ │ │ └── res/ │ │ │ └── xml/ │ │ │ └── network_security_config.xml │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── runicgateway/ │ │ │ │ └── app/ │ │ │ │ ├── core/ │ │ │ │ │ ├── auth/ │ │ │ │ │ │ ├── sso/ │ │ │ │ │ │ │ ├── EncryptedPendingSsoStore.kt │ │ │ │ │ │ │ ├── PendingSsoStore.kt │ │ │ │ │ │ │ ├── Pkce.kt │ │ │ │ │ │ │ └── SsoAuthManager.kt │ │ │ │ │ │ ├── DeviceNameProvider.kt │ │ │ │ │ │ ├── EncryptedTokenStore.kt │ │ │ │ │ │ ├── EncryptedTrustTokenStore.kt │ │ │ │ │ │ ├── Session.kt │ │ │ │ │ │ ├── SessionManager.kt │ │ │ │ │ │ ├── TokenStore.kt │ │ │ │ │ │ └── TrustTokenStore.kt │ │ │ │ │ ├── net/ │ │ │ │ │ │ ├── AuthInterceptor.kt │ │ │ │ │ │ ├── BaseUrlHolder.kt │ │ │ │ │ │ ├── HostSelectionInterceptor.kt │ │ │ │ │ │ ├── Http.kt │ │ │ │ │ │ ├── ServerUrl.kt │ │ │ │ │ │ ├── ShardStream.kt │ │ │ │ │ │ ├── ShardStreamClient.kt │ │ │ │ │ │ ├── ShardStreamEvent.kt │ │ │ │ │ │ ├── TokenAuthenticator.kt │ │ │ │ │ │ └── UserAgentInterceptor.kt │ │ │ │ │ ├── prefs/ │ │ │ │ │ │ └── ServerPreferences.kt │ │ │ │ │ ├── push/ │ │ │ │ │ │ ├── NtfyStreamClient.kt │ │ │ │ │ │ ├── NtfyTopic.kt │ │ │ │ │ │ ├── PushManager.kt │ │ │ │ │ │ ├── PushNotifier.kt │ │ │ │ │ │ ├── PushPreferences.kt │ │ │ │ │ │ ├── PushService.kt │ │ │ │ │ │ ├── PushStreams.kt │ │ │ │ │ │ └── PushTickle.kt │ │ │ │ │ ├── result/ │ │ │ │ │ │ └── ApiResult.kt │ │ │ │ │ ├── web/ │ │ │ │ │ │ ├── WebHandoff.kt │ │ │ │ │ │ └── WebsiteUrls.kt │ │ │ │ │ └── AppConfig.kt │ │ │ │ ├── data/ │ │ │ │ │ ├── api/ │ │ │ │ │ │ ├── dto/ │ │ │ │ │ │ │ ├── AccountDto.kt │ │ │ │ │ │ │ ├── AdminDto.kt │ │ │ │ │ │ │ ├── AuthDto.kt │ │ │ │ │ │ │ ├── ContactDto.kt │ │ │ │ │ │ │ ├── NotificationsDto.kt │ │ │ │ │ │ │ ├── PageDto.kt │ │ │ │ │ │ │ ├── PlayerShardDto.kt │ │ │ │ │ │ │ ├── PostDto.kt │ │ │ │ │ │ │ ├── PublicDto.kt │ │ │ │ │ │ │ ├── ShardDto.kt │ │ │ │ │ │ │ ├── SsoDto.kt │ │ │ │ │ │ │ └── WikiDto.kt │ │ │ │ │ │ ├── AdminApi.kt │ │ │ │ │ │ ├── AuthApi.kt │ │ │ │ │ │ ├── AuthRefreshApi.kt │ │ │ │ │ │ ├── MeApi.kt │ │ │ │ │ │ ├── NotificationsApi.kt │ │ │ │ │ │ ├── PlayerShardApi.kt │ │ │ │ │ │ ├── PublicApi.kt │ │ │ │ │ │ └── SsoApi.kt │ │ │ │ │ └── repository/ │ │ │ │ │ ├── AccountRepository.kt │ │ │ │ │ ├── AdminRepository.kt │ │ │ │ │ ├── AuthRepository.kt │ │ │ │ │ ├── ConnectionRepository.kt │ │ │ │ │ ├── ContactRepository.kt │ │ │ │ │ ├── ContentRepository.kt │ │ │ │ │ ├── NotificationsRepository.kt │ │ │ │ │ ├── PlayerShardRepository.kt │ │ │ │ │ ├── SettingsRepository.kt │ │ │ │ │ ├── ShardRepository.kt │ │ │ │ │ └── WikiRepository.kt │ │ │ │ ├── di/ │ │ │ │ │ ├── AppModule.kt │ │ │ │ │ ├── NetworkModule.kt │ │ │ │ │ └── StorageModule.kt │ │ │ │ ├── ui/ │ │ │ │ │ ├── admin/ │ │ │ │ │ │ ├── AdminContentScreen.kt │ │ │ │ │ │ ├── AdminContentViewModel.kt │ │ │ │ │ │ ├── AdminDashboardScreen.kt │ │ │ │ │ │ ├── AdminDashboardViewModel.kt │ │ │ │ │ │ ├── AdminModerationScreen.kt │ │ │ │ │ │ ├── AdminModerationViewModel.kt │ │ │ │ │ │ ├── AdminSupportScreen.kt │ │ │ │ │ │ └── AdminSupportViewModel.kt │ │ │ │ │ ├── auth/ │ │ │ │ │ │ ├── AccountScreen.kt │ │ │ │ │ │ ├── AccountViewModel.kt │ │ │ │ │ │ ├── LoginScreen.kt │ │ │ │ │ │ ├── LoginViewModel.kt │ │ │ │ │ │ ├── RecoveryCodesScreen.kt │ │ │ │ │ │ ├── RecoveryCodesViewModel.kt │ │ │ │ │ │ ├── TrustedDevicesScreen.kt │ │ │ │ │ │ └── TrustedDevicesViewModel.kt │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── HtmlText.kt │ │ │ │ │ │ ├── StateViews.kt │ │ │ │ │ │ └── ThemeComponents.kt │ │ │ │ │ ├── connect/ │ │ │ │ │ │ ├── ConnectScreen.kt │ │ │ │ │ │ └── ConnectViewModel.kt │ │ │ │ │ ├── contact/ │ │ │ │ │ │ ├── ContactScreen.kt │ │ │ │ │ │ └── ContactViewModel.kt │ │ │ │ │ ├── home/ │ │ │ │ │ │ ├── HomeScreen.kt │ │ │ │ │ │ └── HomeViewModel.kt │ │ │ │ │ ├── navigation/ │ │ │ │ │ │ ├── Menu.kt │ │ │ │ │ │ └── Routes.kt │ │ │ │ │ ├── news/ │ │ │ │ │ │ ├── NewsScreen.kt │ │ │ │ │ │ ├── NewsViewModel.kt │ │ │ │ │ │ ├── PostScreen.kt │ │ │ │ │ │ └── PostViewModel.kt │ │ │ │ │ ├── notifications/ │ │ │ │ │ │ ├── NotificationsScreen.kt │ │ │ │ │ │ └── NotificationsViewModel.kt │ │ │ │ │ ├── page/ │ │ │ │ │ │ ├── BlockRenderer.kt │ │ │ │ │ │ ├── PageScreen.kt │ │ │ │ │ │ └── PageViewModel.kt │ │ │ │ │ ├── player/ │ │ │ │ │ │ ├── CharacterSheetScreen.kt │ │ │ │ │ │ ├── CharactersScreen.kt │ │ │ │ │ │ ├── CharactersViewModel.kt │ │ │ │ │ │ ├── CharacterViewModel.kt │ │ │ │ │ │ ├── MyHousesScreen.kt │ │ │ │ │ │ ├── MyHousesViewModel.kt │ │ │ │ │ │ ├── VendorsScreen.kt │ │ │ │ │ │ └── VendorsViewModel.kt │ │ │ │ │ ├── session/ │ │ │ │ │ │ └── SessionViewModel.kt │ │ │ │ │ ├── shard/ │ │ │ │ │ │ ├── ChampsScreen.kt │ │ │ │ │ │ ├── ChampsViewModel.kt │ │ │ │ │ │ ├── FrameFields.kt │ │ │ │ │ │ ├── GovernorsScreen.kt │ │ │ │ │ │ ├── GovernorsViewModel.kt │ │ │ │ │ │ ├── GuildsScreen.kt │ │ │ │ │ │ ├── GuildsViewModel.kt │ │ │ │ │ │ ├── HousesScreen.kt │ │ │ │ │ │ ├── HousesViewModel.kt │ │ │ │ │ │ ├── LiveBoard.kt │ │ │ │ │ │ ├── ShardComponents.kt │ │ │ │ │ │ ├── ShardEventText.kt │ │ │ │ │ │ ├── ShardScreen.kt │ │ │ │ │ │ └── ShardViewModel.kt │ │ │ │ │ ├── theme/ │ │ │ │ │ │ ├── BrandColor.kt │ │ │ │ │ │ ├── Color.kt │ │ │ │ │ │ ├── Font.kt │ │ │ │ │ │ ├── Theme.kt │ │ │ │ │ │ └── Type.kt │ │ │ │ │ ├── wiki/ │ │ │ │ │ │ ├── WikiPageScreen.kt │ │ │ │ │ │ ├── WikiPageViewModel.kt │ │ │ │ │ │ ├── WikiScreen.kt │ │ │ │ │ │ └── WikiViewModel.kt │ │ │ │ │ ├── AppViewModel.kt │ │ │ │ │ ├── LocalAssetResolver.kt │ │ │ │ │ ├── RunicApp.kt │ │ │ │ │ └── UiState.kt │ │ │ │ ├── MainActivity.kt │ │ │ │ └── RunicGatewayApp.kt │ │ │ ├── res/ │ │ │ │ ├── drawable/ │ │ │ │ │ └── ic_launcher_background.xml │ │ │ │ ├── drawable-anydpi/ │ │ │ │ │ └── ic_stat_name.xml │ │ │ │ ├── drawable-hdpi/ │ │ │ │ │ └── ic_stat_name.png │ │ │ │ ├── drawable-mdpi/ │ │ │ │ │ └── ic_stat_name.png │ │ │ │ ├── drawable-xhdpi/ │ │ │ │ │ └── ic_stat_name.png │ │ │ │ ├── drawable-xxhdpi/ │ │ │ │ │ └── ic_stat_name.png │ │ │ │ ├── font/ │ │ │ │ │ └── cinzel_variable.ttf │ │ │ │ ├── mipmap-anydpi-v26/ │ │ │ │ │ ├── ic_launcher.xml │ │ │ │ │ └── ic_launcher_round.xml │ │ │ │ ├── mipmap-hdpi/ │ │ │ │ │ ├── ic_launcher.webp │ │ │ │ │ ├── ic_launcher_foreground.webp │ │ │ │ │ └── ic_launcher_round.webp │ │ │ │ ├── mipmap-mdpi/ │ │ │ │ │ ├── ic_launcher.webp │ │ │ │ │ ├── ic_launcher_foreground.webp │ │ │ │ │ └── ic_launcher_round.webp │ │ │ │ ├── mipmap-xhdpi/ │ │ │ │ │ ├── ic_launcher.webp │ │ │ │ │ ├── ic_launcher_foreground.webp │ │ │ │ │ └── ic_launcher_round.webp │ │ │ │ ├── mipmap-xxhdpi/ │ │ │ │ │ ├── ic_launcher.webp │ │ │ │ │ ├── ic_launcher_foreground.webp │ │ │ │ │ └── ic_launcher_round.webp │ │ │ │ ├── mipmap-xxxhdpi/ │ │ │ │ │ ├── ic_launcher.webp │ │ │ │ │ ├── ic_launcher_foreground.webp │ │ │ │ │ └── ic_launcher_round.webp │ │ │ │ ├── values/ │ │ │ │ │ ├── colors.xml │ │ │ │ │ ├── strings.xml │ │ │ │ │ └── themes.xml │ │ │ │ └── xml/ │ │ │ │ ├── backup_rules.xml │ │ │ │ ├── data_extraction_rules.xml │ │ │ │ └── network_security_config.xml │ │ │ ├── AndroidManifest.xml │ │ │ └── ic_launcher-playstore.png │ │ └── test/ │ │ └── java/ │ │ └── com/ │ │ └── runicgateway/ │ │ └── app/ │ │ ├── core/ │ │ │ ├── auth/ │ │ │ │ ├── sso/ │ │ │ │ │ ├── PkceTest.kt │ │ │ │ │ └── SsoAuthManagerTest.kt │ │ │ │ └── SessionManagerTest.kt │ │ │ ├── net/ │ │ │ │ ├── HostRewriteTest.kt │ │ │ │ ├── ServerUrlTest.kt │ │ │ │ └── ShardStreamClientTest.kt │ │ │ ├── push/ │ │ │ │ ├── NtfyTopicTest.kt │ │ │ │ └── PushTickleTest.kt │ │ │ └── result/ │ │ │ ├── ApiResultExtrasTest.kt │ │ │ └── ApiResultTest.kt │ │ ├── data/ │ │ │ ├── api/ │ │ │ │ ├── dto/ │ │ │ │ │ ├── AccountDtoTest.kt │ │ │ │ │ ├── AdminDtoTest.kt │ │ │ │ │ ├── AuthDtoTest.kt │ │ │ │ │ ├── AuthRequestDtoTest.kt │ │ │ │ │ ├── ContentDtoTest.kt │ │ │ │ │ ├── NotificationsDtoTest.kt │ │ │ │ │ ├── PlayerGameDataDtoTest.kt │ │ │ │ │ ├── PlayerShardDtoTest.kt │ │ │ │ │ ├── PublicDtoTest.kt │ │ │ │ │ ├── ShardBoardDtoTest.kt │ │ │ │ │ ├── ShardDtoTest.kt │ │ │ │ │ ├── SsoDtoTest.kt │ │ │ │ │ └── WikiDtoTest.kt │ │ │ │ └── fake/ │ │ │ │ ├── FakeAdminApi.kt │ │ │ │ ├── FakePlayerShardApi.kt │ │ │ │ ├── FakePublicApi.kt │ │ │ │ └── FakeShardStream.kt │ │ │ └── repository/ │ │ │ ├── AccountTrustedDevicesTest.kt │ │ │ └── ConnectionVersionGuardTest.kt │ │ ├── ui/ │ │ │ ├── admin/ │ │ │ │ ├── AdminContentViewModelTest.kt │ │ │ │ ├── AdminDashboardViewModelTest.kt │ │ │ │ ├── AdminModerationViewModelTest.kt │ │ │ │ └── AdminSupportViewModelTest.kt │ │ │ ├── contact/ │ │ │ │ └── ContactViewModelTest.kt │ │ │ ├── navigation/ │ │ │ │ └── MenuAccessTest.kt │ │ │ ├── notifications/ │ │ │ │ └── NotificationRoutingTest.kt │ │ │ ├── player/ │ │ │ │ ├── CharacterSheetHelpersTest.kt │ │ │ │ ├── CharactersViewModelTest.kt │ │ │ │ └── PlayerViewModelTest.kt │ │ │ ├── shard/ │ │ │ │ ├── FrameFieldsTest.kt │ │ │ │ ├── LiveBoardTest.kt │ │ │ │ ├── ShardBoardViewModelTest.kt │ │ │ │ └── ShardEventTextTest.kt │ │ │ ├── theme/ │ │ │ │ └── BrandColorTest.kt │ │ │ ├── ContentViewModelTest.kt │ │ │ └── UiStateTest.kt │ │ ├── util/ │ │ │ ├── FakeApiSupport.kt │ │ │ └── MainDispatcherRule.kt │ │ └── ScaffoldSanityTest.kt │ ├── build.gradle.kts │ └── proguard-rules.pro ├── gradle/ │ ├── wrapper/ │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ └── libs.versions.toml ├── .gitattributes ├── .gitignore ├── build.gradle.kts ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── CONTRIBUTORS.md ├── gradle.properties ├── gradlew ├── gradlew.bat ├── LICENSE.md ├── README.md ├── SECURITY.md ├── settings.gradle.kts └── sonar-project.properties ```