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,133 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:ns1="urn:oasis:names:tc:xliff:document:1.2">
<string msgid="8719607706653693137" name="androidx_compose_foundation_autofill">"ਆਟੋਫਿਲ"</string>
<string msgid="1150566100598813236" name="androidx_compose_ui_autofill">"ਆਟੋਫਿਲ"</string>
<string msgid="881409763997275156" name="call_notification_answer_action">"ਜਵਾਬ ਦਿਓ"</string>
<string msgid="8793775615905189152" name="call_notification_answer_video_action">"ਵੀਡੀਓ"</string>
<string msgid="3229508546291798546" name="call_notification_decline_action">"ਕਾਲ ਕੱਟੋ"</string>
<string msgid="2659457946726154263" name="call_notification_hang_up_action">"ਸਮਾਪਤ ਕਰੋ"</string>
<string msgid="6107532579223922871" name="call_notification_incoming_text">"ਇਨਕਮਿੰਗ ਕਾਲ"</string>
<string msgid="8623827134497363134" name="call_notification_ongoing_text">"ਜਾਰੀ ਕਾਲ"</string>
<string msgid="59049573811482460" name="call_notification_screening_text">"ਇਨਕਮਿੰਗ ਕਾਲ ਦੀ ਸਕ੍ਰੀਨਿੰਗ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ"</string>
<string msgid="406453423630273620" name="close_drawer">"ਨੈਵੀਗੇਸ਼ਨ ਮੀਨੂ ਬੰਦ ਕਰੋ"</string>
<string msgid="7573152094250666567" name="close_sheet">"ਸ਼ੀਟ ਬੰਦ ਕਰੋ"</string>
<string msgid="8038256446254964252" name="default_error_message">"ਅਵੈਧ ਇਨਪੁੱਟ"</string>
<string name="default_notification_channel_name">ਹੁਣੇ ਚੱਲ ਰਿਹਾ ਹੈ</string>
<string msgid="6312721426453364202" name="default_popup_window_title">"ਪੌਪ-ਅੱਪ ਵਿੰਡੋ"</string>
<string msgid="1890207353314751437" name="dropdown_menu">"ਡ੍ਰੌਪ-ਡਾਊਨ ਮੀਨੂ"</string>
<string name="error_message_authentication_expired">ਇਸ ਐਪ ਨੂੰ ਵਰਤਣ ਲਈ ਸਾਈਨ-ਇਨ ਕਰੋ</string>
<string name="error_message_bad_value">ਗਲਤ ਇਨਪੁੱਟ ਡਾਟਾ</string>
<string name="error_message_concurrent_stream_limit">ਬਹੁਤ ਜ਼ਿਆਦਾ ਡੀਵਾਈਸਾਂ \'ਤੇ ਸੁਣਿਆ ਜਾ ਰਿਹਾ ਹੈ</string>
<string name="error_message_content_already_playing">ਇਹ ਸਮੱਗਰੀ ਪਹਿਲਾਂ ਹੀ ਚੱਲ ਰਹੀ ਹੈ</string>
<string name="error_message_disconnected">ਮੀਡੀਆ ਐਪ ਤੋਂ ਡਿਸਕਨੈਕਟ ਕੀਤਾ ਗਿਆ</string>
<string name="error_message_end_of_playlist">ਹੋਰ ਕੁਝ ਵੀ ਕਤਾਰਬੱਧ ਨਹੀਂ ਹੈ</string>
<string name="error_message_fallback">ਕੋਈ ਗੜਬੜ ਹੋ ਗਈ। ਬਾਅਦ ਵਿੱਚ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</string>
<string name="error_message_info_cancelled">ਕਾਰਵਾਈ ਪੂਰੀ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</string>
<string name="error_message_invalid_state">ਫ਼ਿਲਹਾਲ ਬੇਨਤੀ ਪੂਰੀ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ</string>
<string name="error_message_io">ਇਨਪੁੱਟ/ਆਊਟਪੁੱਟ ਸੰਬੰਧੀ ਗੜਬੜ</string>
<string name="error_message_not_available_in_region">ਇੱਥੇ ਇਹ ਸਮੱਗਰੀ ਨਹੀਂ ਮਿਲ ਸਕਦੀ</string>
<string name="error_message_not_supported">ਇਹ ਐਪ ਇਹ ਨਹੀਂ ਕਰ ਸਕਦੀ</string>
<string name="error_message_parental_control_restricted">ਇਸ ਸਮੱਗਰੀ ਨੂੰ ਬਲਾਕ ਕੀਤਾ ਗਿਆ ਹੈ</string>
<string name="error_message_permission_denied">ਪਹੁੰਚ ਨੂੰ ਅਸਵੀਕਾਰ ਕੀਤਾ ਗਿਆ</string>
<string name="error_message_premium_account_required">ਪ੍ਰੀਮੀਅਮ ਪਹੁੰਚ ਦੀ ਲੋੜ ਹੈ</string>
<string name="error_message_setup_required">ਸੈੱਟਅੱਪ ਲੋੜੀਂਦਾ ਹੈ</string>
<string name="error_message_skip_limit_reached">ਕਿਸੇ ਹੋਰ ਟਰੈਕ ਨੂੰ ਛੱਡਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ</string>
<string name="exo_download_completed">ਡਾਊਨਲੋਡ ਮੁਕੰਮਲ ਹੋਇਆ</string>
<string name="exo_download_description">ਡਾਊਨਲੋਡ ਕਰੋ</string>
<string name="exo_download_downloading">ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</string>
<string name="exo_download_failed">ਡਾਊਨਲੋਡ ਅਸਫਲ ਰਿਹਾ</string>
<string name="exo_download_notification_channel_name">ਡਾਊਨਲੋਡ</string>
<string name="exo_download_paused">ਡਾਊਨਲੋਡ ਰੁਕ ਗਏ ਹਨ</string>
<string name="exo_download_paused_for_network">ਡਾਊਨਲੋਡਾਂ ਲਈ ਨੈੱਟਵਰਕ ਦੀ ਉਡੀਕ ਹੋ ਰਹੀ ਹੈ</string>
<string name="exo_download_paused_for_wifi">ਡਾਊਨਲੋਡਾਂ ਲਈ ਵਾਈ-ਫਾਈ ਦੀ ਉਡੀਕ ਹੋ ਰਹੀ ਹੈ</string>
<string name="exo_download_removing">ਡਾਊਨਲੋਡ ਕੀਤੀ ਸਮੱਗਰੀ ਹਟਾਈ ਜਾ ਰਹੀ ਹੈ</string>
<string msgid="6827826412747255547" name="in_progress">"ਜਾਰੀ ਹੈ"</string>
<string msgid="7933458017204019916" name="indeterminate">"ਅੰਸ਼ਕ ਤੌਰ ਤੇ ਜਾਂਚ ਕੀਤੀ ਗਈ"</string>
<string msgid="2988463736136100848" name="m3c_bottom_sheet_collapse_description">"ਹੇਠਲੀ ਸ਼ੀਟ ਨੂੰ ਸਮੇਟੋ"</string>
<string msgid="1555567894577437024" name="m3c_bottom_sheet_dismiss_description">"ਹੇਠਲੀ ਸ਼ੀਟ ਨੂੰ ਖਾਰਜ ਕਰੋ"</string>
<string msgid="8403354765404029791" name="m3c_bottom_sheet_drag_handle_description">"ਘਸੀਟਣ ਵਾਲਾ ਹੈਂਡਲ"</string>
<string msgid="6670819569745899763" name="m3c_bottom_sheet_expand_description">"ਹੇਠਲੀ ਸ਼ੀਟ ਦਾ ਵਿਸਤਾਰ ਕਰੋ"</string>
<string msgid="3010635850035863127" name="m3c_bottom_sheet_pane_title">"ਹੇਠਲੀ ਸ਼ੀਟ"</string>
<string msgid="8166741421776570875" name="m3c_date_input_headline">"ਦਾਖਲ ਕੀਤੀ ਗਈ ਤਾਰੀਖ"</string>
<string msgid="229313757840775812" name="m3c_date_input_headline_description">"ਦਾਖਲ ਕੀਤੀ ਗਈ ਤਾਰੀਖ: %1$s"</string>
<string msgid="6116910750161463197" name="m3c_date_input_invalid_for_pattern">"ਤਾਰੀਖ ਸੰਭਾਵਿਤ ਪੈਟਰਨ ਨਾਲ ਮੇਲ ਨਹੀਂ ਖਾਂਦੀ: %1$s"</string>
<string msgid="2521768508935305279" name="m3c_date_input_invalid_not_allowed">"ਇਸ ਤਾਰੀਖ ਦੀ ਆਗਿਆ ਨਹੀਂ ਹੈ: %1$s"</string>
<string msgid="7052898923934555305" name="m3c_date_input_invalid_year_range">"ਤਾਰੀਖ ਸੰਭਾਵਿਤ ਸਾਲ ਦੀ ਰੇਂਜ, %1$s - %2$s ਤੋਂ ਬਾਹਰ ਹੈ"</string>
<string msgid="2895559812010326913" name="m3c_date_input_label">"ਤਾਰੀਖ"</string>
<string msgid="1237013946323089826" name="m3c_date_input_no_input_description">"ਕੋਈ ਨਹੀਂ"</string>
<string msgid="7306227249789210568" name="m3c_date_input_title">"ਤਾਰੀਖ ਚੁਣੋ"</string>
<string msgid="7605002211875882969" name="m3c_date_picker_headline">"ਚੁਣੀ ਗਈ ਤਾਰੀਖ"</string>
<string msgid="3664277305226978227" name="m3c_date_picker_headline_description">"ਮੌਜੂਦਾ ਚੋਣ: %1$s"</string>
<string msgid="8436650776581492840" name="m3c_date_picker_navigate_to_year_description">"ਸਾਲ %1$s \'ਤੇ ਜਾਓ"</string>
<string msgid="5811000998184572395" name="m3c_date_picker_no_selection_description">"ਕੋਈ ਨਹੀਂ"</string>
<string msgid="7813882352367152251" name="m3c_date_picker_scroll_to_earlier_years">"ਪਿਛਲੇ ਸਾਲਾਂ ਨੂੰ ਦਿਖਾਉਣ ਲਈ ਸਕ੍ਰੋਲ ਕਰੋ"</string>
<string msgid="5727367015496556177" name="m3c_date_picker_scroll_to_later_years">"ਬਾਅਦ ਵਾਲੇ ਸਾਲਾਂ ਨੂੰ ਦਿਖਾਉਣ ਲਈ ਸਕ੍ਰੋਲ ਕਰੋ"</string>
<string msgid="1804346892470238807" name="m3c_date_picker_switch_to_calendar_mode">"ਕੈਲੰਡਰ ਇਨਪੁੱਟ ਮੋਡ \'ਤੇ ਸਵਿੱਚ ਕਰੋ"</string>
<string msgid="395627960681594326" name="m3c_date_picker_switch_to_day_selection">"ਕੋਈ ਸਾਲ ਚੁਣਨ ਲਈ ਸਵਾਈਪ ਕਰੋ ਜਾਂ ਕੋਈ ਦਿਨ ਚੁਣਨ ਲਈ ਵਾਪਸ ਜਾਣ ਵਾਸਤੇ ਟੈਪ ਕਰੋ"</string>
<string msgid="2219746470065162704" name="m3c_date_picker_switch_to_input_mode">"ਲਿਖਤ ਇਨਪੁੱਟ ਮੋਡ \'ਤੇ ਸਵਿੱਚ ਕਰੋ"</string>
<string msgid="7142101321095356500" name="m3c_date_picker_switch_to_next_month">"ਅਗਲੇ ਮਹੀਨੇ \'ਤੇ ਜਾਓ"</string>
<string msgid="228438865139394590" name="m3c_date_picker_switch_to_previous_month">"ਪਿਛਲੇ ਮਹੀਨੇ \'ਤੇ ਜਾਓ"</string>
<string msgid="791651718641787594" name="m3c_date_picker_switch_to_year_selection">"ਸਾਲ ਚੁਣਨ ਲਈ ਸਵਿੱਚ ਕਰੋ"</string>
<string msgid="7430790972741451689" name="m3c_date_picker_title">"ਤਾਰੀਖ ਚੁਣੋ"</string>
<string msgid="3199387177749801575" name="m3c_date_picker_today_description">"ਅੱਜ"</string>
<string msgid="2068382232816991922" name="m3c_date_picker_year_picker_pane_title">"ਸਾਲ ਚੋਣਕਾਰ ਦਿਖਣਯੋਗ ਹੈ"</string>
<string msgid="3190049423327661366" name="m3c_date_range_input_invalid_range_input">"ਇਨਪੁੱਟ ਕੀਤੀ ਗਈ ਤਾਰੀਖ ਦੀ ਰੇਂਜ ਅਵੈਧ ਹੈ"</string>
<string msgid="3148384720560189467" name="m3c_date_range_input_title">"ਤਾਰੀਖਾਂ ਦਾਖਲ ਕਰੋ"</string>
<string msgid="2138321128465719402" name="m3c_date_range_picker_day_in_range">"ਰੇਂਜ ਵਿੱਚ"</string>
<string msgid="4947636797751277713" name="m3c_date_range_picker_end_headline">"ਸਮਾਪਤੀ ਤਾਰੀਖ"</string>
<string msgid="602077859540990149" name="m3c_date_range_picker_scroll_to_next_month">"ਅਗਲਾ ਮਹੀਨਾ ਦਿਖਾਉਣ ਲਈ ਸਕ੍ਰੋਲ ਕਰੋ"</string>
<string msgid="4592174524846109496" name="m3c_date_range_picker_scroll_to_previous_month">"ਪਿਛਲਾ ਮਹੀਨਾ ਦਿਖਾਉਣ ਲਈ ਸਕ੍ਰੋਲ ਕਰੋ"</string>
<string msgid="4665981448952749820" name="m3c_date_range_picker_start_headline">"ਸ਼ੁੁਰੂਆਤੀ ਤਾਰੀਖ"</string>
<string msgid="3134165431120340385" name="m3c_date_range_picker_title">"ਤਾਰੀਖਾਂ ਚੁਣੋ"</string>
<string msgid="7617233117134790350" name="m3c_dialog">"ਡਾਇਲੌਗ"</string>
<string msgid="3177828188723359358" name="m3c_dropdown_menu_collapsed">"ਸਮੇਟਿਆ ਗਿਆ"</string>
<string msgid="2360841780724299882" name="m3c_dropdown_menu_expanded">"ਵਿਸਤਾਰ ਕੀਤਾ ਗਿਆ"</string>
<string msgid="8687821690726149911" name="m3c_dropdown_menu_toggle">"ਡ੍ਰੌਪ-ਡਾਊਨ ਮੀਨੂ ਨੂੰ ਟੌਗਲ ਕਰੋ"</string>
<string msgid="6072492480528318635" name="m3c_floating_toolbar_collapse">"ਟੂਲਬਾਰ ਨੂੰ ਸਮੇਟੋ"</string>
<string msgid="6880757017246780255" name="m3c_floating_toolbar_expand">"ਟੂਲਬਾਰ ਦਾ ਵਿਸਤਾਰ ਕਰੋ"</string>
<string msgid="6152806324422087846" name="m3c_search_bar_search">"ਖੋਜੋ"</string>
<string msgid="6152755701819882931" name="m3c_snackbar_dismiss">"ਖਾਰਜ ਕਰੋ"</string>
<string msgid="3868801555855510515" name="m3c_snackbar_pane_title">"ਅਲਰਟ"</string>
<string msgid="7655536806087401899" name="m3c_suggestions_available">"ਸੁਝਾਅ ਹੇਠਾਂ ਹਨ"</string>
<string msgid="409352516511718051" name="m3c_time_input_dialog_title">"ਸਮਾਂ ਦਾਖਲ ਕਰੋ"</string>
<string msgid="2786685010796619560" name="m3c_time_picker_am">"AM"</string>
<string msgid="7412665527536641863" name="m3c_time_picker_dialog_title">"ਸਮਾਂ ਚੁਣੋ"</string>
<string msgid="2349193472625211372" name="m3c_time_picker_hour">"ਘੰਟਾ"</string>
<string msgid="9179527532316922345" name="m3c_time_picker_hour_24h_suffix">"%1$d ਘੰਟੇ"</string>
<string msgid="8876759303332837035" name="m3c_time_picker_hour_selection">"ਘੰਟਾ ਚੁਣੋ"</string>
<string msgid="3458167507790628988" name="m3c_time_picker_hour_suffix">"%1$d ਵਜੇ"</string>
<string msgid="6973808109666874069" name="m3c_time_picker_hour_text_field">"ਘੰਟੇ ਲਈ"</string>
<string msgid="4313071914266462005" name="m3c_time_picker_minute">"ਮਿੰਟ"</string>
<string msgid="4699133535056739733" name="m3c_time_picker_minute_selection">"ਮਿੰਟ ਚੁਣੋ"</string>
<string msgid="5064177921781937179" name="m3c_time_picker_minute_suffix">"%1$d ਮਿੰਟ"</string>
<string msgid="7661234488295443182" name="m3c_time_picker_minute_text_field">"ਮਿੰਟਾਂ ਲਈ"</string>
<string msgid="5865171949528594571" name="m3c_time_picker_period_toggle_description">"AM ਜਾਂ PM ਚੁਣੋ"</string>
<string msgid="6616362054113087709" name="m3c_time_picker_pm">"PM"</string>
<string msgid="4145073906612931838" name="m3c_time_picker_toggle_keyboard">"ਸਮਾਂ ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਲਿਖਤ ਇਨਪੁੱਟ ਮੋਡ \'ਤੇ ਸਵਿੱਚ ਕਰੋ"</string>
<string msgid="8841786098195101324" name="m3c_time_picker_toggle_touch">"ਸਮਾਂ ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਘੜੀ ਮੋਡ \'ਤੇ ਸਵਿੱਚ ਕਰੋ"</string>
<string msgid="1805687647081129904" name="m3c_tooltip_long_press_label">"ਟੂਲ-ਟਿੱਪ ਦਿਖਾਓ"</string>
<string msgid="5460405025248574620" name="m3c_tooltip_pane_description">"ਟੂਲ-ਟਿੱਪ"</string>
<string msgid="6564222473543418073" name="m3c_wide_navigation_rail_close_rail">"ਰੇਲ ਬੰਦ ਕਰੋ"</string>
<string msgid="8350283435461615411" name="m3c_wide_navigation_rail_pane_title">"ਨੈਵੀਗੇਸ਼ਨ ਰੇਲ"</string>
<string name="media3_controls_pause_description">ਰੋਕੋ</string>
<string name="media3_controls_play_description">ਚਲਾਓ</string>
<string name="media3_controls_seek_back_description">ਪਿੱਛੇ ਲਿਜਾਓ</string>
<string name="media3_controls_seek_forward_description">ਅੱਗੇ ਵਧਾਓ</string>
<string name="media3_controls_seek_to_next_description">ਅਗਲੀ ਆਈਟਮ \'ਤੇ ਜਾਓ</string>
<string name="media3_controls_seek_to_previous_description">ਪਿਛਲੀ ਆਈਟਮ \'ਤੇ ਜਾਓ</string>
<string msgid="542007171693138492" name="navigation_menu">"ਨੈਵੀਗੇਸ਼ਨ ਮੀਨੂ"</string>
<string msgid="6610465462668679431" name="not_selected">"ਚੁਣੀ ਨਹੀਂ ਗਈ"</string>
<string msgid="5941395253238309765" name="range_end">"ਰੇਂਜ ਸਮਾਪਤ"</string>
<string msgid="7097486360902471446" name="range_start">"ਰੇਂਜ ਸ਼ੁਰੂ"</string>
<string msgid="6043586758067023" name="selected">"ਚੁਣੀ ਗਈ"</string>
<string msgid="2792228137354697160" name="snackbar_pane_title">"ਅਲਰਟ"</string>
<string msgid="4139871816613051306" name="state_empty">"ਖਾਲੀ"</string>
<string msgid="5834637030682409883" name="state_off">"ਬੰਦ ਹੈ"</string>
<string msgid="1490883874751719580" name="state_on">"ਚਾਲੂ ਹੈ"</string>
<string msgid="6277540029070332960" name="status_bar_notification_info_overflow">"999+"</string>
<string msgid="2561197295334830845" name="switch_role">"ਸਵਿੱਚ ਕਰੋ"</string>
<string msgid="1672349317127674378" name="tab">"ਟੈਬ"</string>
<string msgid="5946805113151406391" name="template_percent">"<ns1:g id="PERCENTAGE">%1$d</ns1:g> ਫ਼ੀਸਦ।"</string>
<string msgid="3765533235322692011" name="tooltip_description">"ਟੂਲ-ਟਿੱਪ"</string>
<string msgid="3124740595719787496" name="tooltip_label">"ਟੂਲ-ਟਿੱਪ ਦਿਖਾਓ"</string>
</resources>