Merge branch 'main' into chore/sync-link-tree

This commit is contained in:
2026-07-22 21:27:11 +00:00

View File

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