fix(android): unblock first device test — auth contrast + dynamic base URL

Two regressions surfaced on the first real device run.

1. Contrast on ServerUrl + Login screens: both wrapped content in a
   bare Box(fillMaxSize), no Surface. The obsidian background never
   painted (rendered against the system root view's default),
   LocalContentColor cascade fell through to Material's default
   contentColor — the screens rendered as near-invisible dark text
   on dark grey. Wrap both in Surface(color = background, contentColor
   = onBackground) so the bg paints AND the M3 contentColor pipeline
   flows correctly through OutlinedTextField labels / cursor /
   placeholders + the Button content tint.

2. The bigger bug: NetworkModule.provideRetrofit read
   authStore.baseUrl.value ONCE at Retrofit creation. AuthStore loads
   from Room async, so at injection time the value was still the
   localhost:8080 placeholder. Result: even after the user typed
   their real server URL on the ServerUrl screen, every API call
   kept hitting localhost:8080 ("Failed to connect to
   localhost/127.0.0.1:8080" on the login attempt). The pre-fix
   NetworkModule comment even acknowledged it — *"Server-URL
   changes require an app relaunch"*.

   Fix: per-request rewrite. New BaseUrlInterceptor reads the live
   AuthStore.baseUrl.value on every request and rewrites
   scheme/host/port of the outgoing URL. Retrofit now keeps a
   placeholder baseUrl ("http://placeholder.invalid/") solely to
   satisfy its parser; the actual target host is dynamic. Order in
   OkHttp chain: BaseUrl first → Auth → logging, so the cookie
   interceptor sees the final URL.

New:
  - api/BaseUrlInterceptor.kt — per-request scheme/host/port rewrite
    from AuthStore.baseUrl. Falls through to the original request
    when the stored URL is unparseable.

Modified:
  - api/NetworkModule.kt — adds BaseUrlInterceptor to the OkHttp
    chain. Drops the AuthStore dependency from provideRetrofit;
    swaps baseUrl for the placeholder.
  - auth/ui/ServerUrlScreen.kt — Box → Surface wrap.
  - auth/ui/LoginScreen.kt — Box → Surface wrap.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-26 00:27:05 -04:00
parent 0415b5ccc3
commit 0b72827682
5553 changed files with 63548 additions and 10 deletions
@@ -0,0 +1,182 @@
package com.fabledsword.minstrel;
import dagger.hilt.internal.aggregatedroot.codegen._com_fabledsword_minstrel_MinstrelApplication;
import dagger.hilt.internal.componenttreedeps.ComponentTreeDeps;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_android_components_ActivityComponent;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_android_components_ActivityRetainedComponent;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_android_components_FragmentComponent;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_android_components_ServiceComponent;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_android_components_ViewComponent;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_android_components_ViewModelComponent;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_android_components_ViewWithFragmentComponent;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_android_internal_builders_ActivityComponentBuilder;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_android_internal_builders_ActivityRetainedComponentBuilder;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_android_internal_builders_FragmentComponentBuilder;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_android_internal_builders_ServiceComponentBuilder;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_android_internal_builders_ViewComponentBuilder;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_android_internal_builders_ViewModelComponentBuilder;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_android_internal_builders_ViewWithFragmentComponentBuilder;
import dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_components_SingletonComponent;
import hilt_aggregated_deps._androidx_hilt_work_HiltWrapper_WorkerFactoryModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_MainActivity_GeneratedInjector;
import hilt_aggregated_deps._com_fabledsword_minstrel_MinstrelApplication_GeneratedInjector;
import hilt_aggregated_deps._com_fabledsword_minstrel_admin_ui_AdminLandingViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_admin_ui_AdminLandingViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_admin_ui_AdminQuarantineViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_admin_ui_AdminQuarantineViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_admin_ui_AdminRequestsViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_admin_ui_AdminRequestsViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_admin_ui_AdminUsersViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_admin_ui_AdminUsersViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_api_NetworkModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_auth_ui_AuthGateViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_auth_ui_AuthGateViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_auth_ui_LoginViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_auth_ui_LoginViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_auth_ui_ServerUrlViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_auth_ui_ServerUrlViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_cache_db_DatabaseModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_di_AppModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_discover_ui_DiscoverViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_discover_ui_DiscoverViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_history_ui_HistoryTabViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_history_ui_HistoryTabViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_home_ui_HomeViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_home_ui_HomeViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_library_ui_AlbumDetailViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_library_ui_AlbumDetailViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_library_ui_ArtistDetailViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_library_ui_ArtistDetailViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_library_ui_LibraryViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_library_ui_LibraryViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_likes_ui_LikedTabViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_likes_ui_LikedTabViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_player_MinstrelPlayerService_GeneratedInjector;
import hilt_aggregated_deps._com_fabledsword_minstrel_player_PlayerModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_player_ui_PlayerViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_player_ui_PlayerViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_playlists_ui_PlaylistDetailViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_playlists_ui_PlaylistDetailViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_playlists_ui_PlaylistsListViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_playlists_ui_PlaylistsListViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_quarantine_ui_HiddenTabViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_quarantine_ui_HiddenTabViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_requests_ui_RequestsViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_requests_ui_RequestsViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_search_ui_SearchViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_search_ui_SearchViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_settings_ui_SettingsViewModel_HiltModules_BindsModule;
import hilt_aggregated_deps._com_fabledsword_minstrel_settings_ui_SettingsViewModel_HiltModules_KeyModule;
import hilt_aggregated_deps._dagger_hilt_android_flags_FragmentGetContextFix_FragmentGetContextFixEntryPoint;
import hilt_aggregated_deps._dagger_hilt_android_flags_HiltWrapper_FragmentGetContextFix_FragmentGetContextFixModule;
import hilt_aggregated_deps._dagger_hilt_android_internal_lifecycle_DefaultViewModelFactories_ActivityEntryPoint;
import hilt_aggregated_deps._dagger_hilt_android_internal_lifecycle_DefaultViewModelFactories_FragmentEntryPoint;
import hilt_aggregated_deps._dagger_hilt_android_internal_lifecycle_HiltViewModelFactory_ViewModelFactoriesEntryPoint;
import hilt_aggregated_deps._dagger_hilt_android_internal_lifecycle_HiltWrapper_DefaultViewModelFactories_ActivityModule;
import hilt_aggregated_deps._dagger_hilt_android_internal_lifecycle_HiltWrapper_HiltViewModelFactory_ActivityCreatorEntryPoint;
import hilt_aggregated_deps._dagger_hilt_android_internal_lifecycle_HiltWrapper_HiltViewModelFactory_ViewModelModule;
import hilt_aggregated_deps._dagger_hilt_android_internal_managers_ActivityComponentManager_ActivityComponentBuilderEntryPoint;
import hilt_aggregated_deps._dagger_hilt_android_internal_managers_FragmentComponentManager_FragmentComponentBuilderEntryPoint;
import hilt_aggregated_deps._dagger_hilt_android_internal_managers_HiltWrapper_ActivityRetainedComponentManager_ActivityRetainedComponentBuilderEntryPoint;
import hilt_aggregated_deps._dagger_hilt_android_internal_managers_HiltWrapper_ActivityRetainedComponentManager_ActivityRetainedLifecycleEntryPoint;
import hilt_aggregated_deps._dagger_hilt_android_internal_managers_HiltWrapper_ActivityRetainedComponentManager_LifecycleModule;
import hilt_aggregated_deps._dagger_hilt_android_internal_managers_HiltWrapper_ActivitySavedStateHandleModule;
import hilt_aggregated_deps._dagger_hilt_android_internal_managers_ServiceComponentManager_ServiceComponentBuilderEntryPoint;
import hilt_aggregated_deps._dagger_hilt_android_internal_managers_ViewComponentManager_ViewComponentBuilderEntryPoint;
import hilt_aggregated_deps._dagger_hilt_android_internal_managers_ViewComponentManager_ViewWithFragmentComponentBuilderEntryPoint;
import hilt_aggregated_deps._dagger_hilt_android_internal_modules_ApplicationContextModule;
import hilt_aggregated_deps._dagger_hilt_android_internal_modules_HiltWrapper_ActivityModule;
@ComponentTreeDeps(
rootDeps = _com_fabledsword_minstrel_MinstrelApplication.class,
defineComponentDeps = {
_dagger_hilt_android_components_ActivityComponent.class,
_dagger_hilt_android_components_ActivityRetainedComponent.class,
_dagger_hilt_android_components_FragmentComponent.class,
_dagger_hilt_android_components_ServiceComponent.class,
_dagger_hilt_android_components_ViewComponent.class,
_dagger_hilt_android_components_ViewModelComponent.class,
_dagger_hilt_android_components_ViewWithFragmentComponent.class,
_dagger_hilt_android_internal_builders_ActivityComponentBuilder.class,
_dagger_hilt_android_internal_builders_ActivityRetainedComponentBuilder.class,
_dagger_hilt_android_internal_builders_FragmentComponentBuilder.class,
_dagger_hilt_android_internal_builders_ServiceComponentBuilder.class,
_dagger_hilt_android_internal_builders_ViewComponentBuilder.class,
_dagger_hilt_android_internal_builders_ViewModelComponentBuilder.class,
_dagger_hilt_android_internal_builders_ViewWithFragmentComponentBuilder.class,
_dagger_hilt_components_SingletonComponent.class
},
aggregatedDeps = {
_androidx_hilt_work_HiltWrapper_WorkerFactoryModule.class,
_com_fabledsword_minstrel_MainActivity_GeneratedInjector.class,
_com_fabledsword_minstrel_MinstrelApplication_GeneratedInjector.class,
_com_fabledsword_minstrel_admin_ui_AdminLandingViewModel_HiltModules_BindsModule.class,
_com_fabledsword_minstrel_admin_ui_AdminLandingViewModel_HiltModules_KeyModule.class,
_com_fabledsword_minstrel_admin_ui_AdminQuarantineViewModel_HiltModules_BindsModule.class,
_com_fabledsword_minstrel_admin_ui_AdminQuarantineViewModel_HiltModules_KeyModule.class,
_com_fabledsword_minstrel_admin_ui_AdminRequestsViewModel_HiltModules_BindsModule.class,
_com_fabledsword_minstrel_admin_ui_AdminRequestsViewModel_HiltModules_KeyModule.class,
_com_fabledsword_minstrel_admin_ui_AdminUsersViewModel_HiltModules_BindsModule.class,
_com_fabledsword_minstrel_admin_ui_AdminUsersViewModel_HiltModules_KeyModule.class,
_com_fabledsword_minstrel_api_NetworkModule.class,
_com_fabledsword_minstrel_auth_ui_AuthGateViewModel_HiltModules_BindsModule.class,
_com_fabledsword_minstrel_auth_ui_AuthGateViewModel_HiltModules_KeyModule.class,
_com_fabledsword_minstrel_auth_ui_LoginViewModel_HiltModules_BindsModule.class,
_com_fabledsword_minstrel_auth_ui_LoginViewModel_HiltModules_KeyModule.class,
_com_fabledsword_minstrel_auth_ui_ServerUrlViewModel_HiltModules_BindsModule.class,
_com_fabledsword_minstrel_auth_ui_ServerUrlViewModel_HiltModules_KeyModule.class,
_com_fabledsword_minstrel_cache_db_DatabaseModule.class,
_com_fabledsword_minstrel_di_AppModule.class,
_com_fabledsword_minstrel_discover_ui_DiscoverViewModel_HiltModules_BindsModule.class,
_com_fabledsword_minstrel_discover_ui_DiscoverViewModel_HiltModules_KeyModule.class,
_com_fabledsword_minstrel_history_ui_HistoryTabViewModel_HiltModules_BindsModule.class,
_com_fabledsword_minstrel_history_ui_HistoryTabViewModel_HiltModules_KeyModule.class,
_com_fabledsword_minstrel_home_ui_HomeViewModel_HiltModules_BindsModule.class,
_com_fabledsword_minstrel_home_ui_HomeViewModel_HiltModules_KeyModule.class,
_com_fabledsword_minstrel_library_ui_AlbumDetailViewModel_HiltModules_BindsModule.class,
_com_fabledsword_minstrel_library_ui_AlbumDetailViewModel_HiltModules_KeyModule.class,
_com_fabledsword_minstrel_library_ui_ArtistDetailViewModel_HiltModules_BindsModule.class,
_com_fabledsword_minstrel_library_ui_ArtistDetailViewModel_HiltModules_KeyModule.class,
_com_fabledsword_minstrel_library_ui_LibraryViewModel_HiltModules_BindsModule.class,
_com_fabledsword_minstrel_library_ui_LibraryViewModel_HiltModules_KeyModule.class,
_com_fabledsword_minstrel_likes_ui_LikedTabViewModel_HiltModules_BindsModule.class,
_com_fabledsword_minstrel_likes_ui_LikedTabViewModel_HiltModules_KeyModule.class,
_com_fabledsword_minstrel_player_MinstrelPlayerService_GeneratedInjector.class,
_com_fabledsword_minstrel_player_PlayerModule.class,
_com_fabledsword_minstrel_player_ui_PlayerViewModel_HiltModules_BindsModule.class,
_com_fabledsword_minstrel_player_ui_PlayerViewModel_HiltModules_KeyModule.class,
_com_fabledsword_minstrel_playlists_ui_PlaylistDetailViewModel_HiltModules_BindsModule.class,
_com_fabledsword_minstrel_playlists_ui_PlaylistDetailViewModel_HiltModules_KeyModule.class,
_com_fabledsword_minstrel_playlists_ui_PlaylistsListViewModel_HiltModules_BindsModule.class,
_com_fabledsword_minstrel_playlists_ui_PlaylistsListViewModel_HiltModules_KeyModule.class,
_com_fabledsword_minstrel_quarantine_ui_HiddenTabViewModel_HiltModules_BindsModule.class,
_com_fabledsword_minstrel_quarantine_ui_HiddenTabViewModel_HiltModules_KeyModule.class,
_com_fabledsword_minstrel_requests_ui_RequestsViewModel_HiltModules_BindsModule.class,
_com_fabledsword_minstrel_requests_ui_RequestsViewModel_HiltModules_KeyModule.class,
_com_fabledsword_minstrel_search_ui_SearchViewModel_HiltModules_BindsModule.class,
_com_fabledsword_minstrel_search_ui_SearchViewModel_HiltModules_KeyModule.class,
_com_fabledsword_minstrel_settings_ui_SettingsViewModel_HiltModules_BindsModule.class,
_com_fabledsword_minstrel_settings_ui_SettingsViewModel_HiltModules_KeyModule.class,
_dagger_hilt_android_flags_FragmentGetContextFix_FragmentGetContextFixEntryPoint.class,
_dagger_hilt_android_flags_HiltWrapper_FragmentGetContextFix_FragmentGetContextFixModule.class,
_dagger_hilt_android_internal_lifecycle_DefaultViewModelFactories_ActivityEntryPoint.class,
_dagger_hilt_android_internal_lifecycle_DefaultViewModelFactories_FragmentEntryPoint.class,
_dagger_hilt_android_internal_lifecycle_HiltViewModelFactory_ViewModelFactoriesEntryPoint.class,
_dagger_hilt_android_internal_lifecycle_HiltWrapper_DefaultViewModelFactories_ActivityModule.class,
_dagger_hilt_android_internal_lifecycle_HiltWrapper_HiltViewModelFactory_ActivityCreatorEntryPoint.class,
_dagger_hilt_android_internal_lifecycle_HiltWrapper_HiltViewModelFactory_ViewModelModule.class,
_dagger_hilt_android_internal_managers_ActivityComponentManager_ActivityComponentBuilderEntryPoint.class,
_dagger_hilt_android_internal_managers_FragmentComponentManager_FragmentComponentBuilderEntryPoint.class,
_dagger_hilt_android_internal_managers_HiltWrapper_ActivityRetainedComponentManager_ActivityRetainedComponentBuilderEntryPoint.class,
_dagger_hilt_android_internal_managers_HiltWrapper_ActivityRetainedComponentManager_ActivityRetainedLifecycleEntryPoint.class,
_dagger_hilt_android_internal_managers_HiltWrapper_ActivityRetainedComponentManager_LifecycleModule.class,
_dagger_hilt_android_internal_managers_HiltWrapper_ActivitySavedStateHandleModule.class,
_dagger_hilt_android_internal_managers_ServiceComponentManager_ServiceComponentBuilderEntryPoint.class,
_dagger_hilt_android_internal_managers_ViewComponentManager_ViewComponentBuilderEntryPoint.class,
_dagger_hilt_android_internal_managers_ViewComponentManager_ViewWithFragmentComponentBuilderEntryPoint.class,
_dagger_hilt_android_internal_modules_ApplicationContextModule.class,
_dagger_hilt_android_internal_modules_HiltWrapper_ActivityModule.class
}
)
public final class MinstrelApplication_ComponentTreeDeps {
}
@@ -0,0 +1,9 @@
package dagger.hilt.internal.processedrootsentinel.codegen;
import dagger.hilt.internal.processedrootsentinel.ProcessedRootSentinel;
@ProcessedRootSentinel(
roots = "com.fabledsword.minstrel.MinstrelApplication"
)
public final class _com_fabledsword_minstrel_MinstrelApplication {
}