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,687 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:ns1="http://schemas.android.com/tools" xmlns:ns2="urn:oasis:names:tc:xliff:document:1.2">
<array name="com_google_android_gms_fonts_certs">
<item>@array/com_google_android_gms_fonts_certs_dev</item>
<item>@array/com_google_android_gms_fonts_certs_prod</item>
</array>
<string-array name="com_google_android_gms_fonts_certs_dev">
<item>MIIEqDCCA5CgAwIBAgIJANWFuGx90071MA0GCSqGSIb3DQEBBAUAMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAeFw0wODA0MTUyMzM2NTZaFw0zNTA5MDEyMzM2NTZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBANbOLggKv+IxTdGNs8/TGFy0PTP6DHThvbbR24kT9ixcOd9W+EaBPWW+wPPKQmsHxajtWjmQwWfna8mZuSeJS48LIgAZlKkpoyLcfobBPv6yyz8x1IxWWmF9c1IGN3vSL6BLNJEUyMEPzC2WZdwT4ZG2cuJTtzeETl6jWFKx68ETtZxNVHe9Iy9NMxEljDqVZ4y6+FlHaiYJqq3LcJpJVuKYz4kvOcyf3M0nDA8mUlVdfsOlw/H4uoNQ7VrAQUKB4kAyfxsKp/RZmnZSJ7+8Ag9aTC+oguTd1iFNuMqDUlpePo6CGuh73iKuq8mYvtdQQ0Yz+mF4j2YWB7Gj0R1k2cCAQOjgfwwgfkwHQYDVR0OBBYEFI0cxb6VTEM8YYY6FbBMvAPyT+CyMIHJBgNVHSMEgcEwgb6AFI0cxb6VTEM8YYY6FbBMvAPyT+CyoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJANWFuGx90071MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEBABnTDPEF+3iSP0wNfdIjIz1AlnrPzgAIHVvXxunW7SBrDhEglQZBbKJEk5kT0mtKoOD1JMrSu1xuTKEBahWRbqHsXclaXjoBADb0kkjVEJu/Lh5hgYZnOjvlba8Ld7HCKePCVePoTJBdI4fvugnL8TsgK05aIskyY0hKI9L8KfqfGTl1lzOv2KoWD0KWwtAWPoGChZxmQ+nBli+gwYMzM1vAkP+aayLe0a1EQimlOalO762r0GXO0ks+UeXde2Z4e+8S/pf7pITEI/tP+MxJTALw9QUWEv9lKTk+jkbqxbsh8nfBUapfKqYn0eidpwq2AzVp3juYl7//fKnaPhJD9gs=</item>
</string-array>
<string-array name="com_google_android_gms_fonts_certs_prod">
<item>MIIEQzCCAyugAwIBAgIJAMLgh0ZkSjCNMA0GCSqGSIb3DQEBBAUAMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDAeFw0wODA4MjEyMzEzMzRaFw0zNjAxMDcyMzEzMzRaMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKtWLgDYO6IIrgqWbxJOKdoR8qtW0I9Y4sypEwPpt1TTcvZApxsdyxMJZ2JORland2qSGT2y5b+3JKkedxiLDmpHpDsz2WCbdxgxRczfey5YZnTJ4VZbH0xqWVW/8lGmPav5xVwnIiJS6HXk+BVKZF+JcWjAsb/GEuq/eFdpuzSqeYTcfi6idkyugwfYwXFU1+5fZKUaRKYCwkkFQVfcAs1fXA5V+++FGfvjJ/CxURaSxaBvGdGDhfXE28LWuT9ozCl5xw4Yq5OGazvV24mZVSoOO0yZ31j7kYvtwYK6NeADwbSxDdJEqO4k//0zOHKrUiGYXtqw/A0LFFtqoZKFjnkCAwEAAaOB1zCB1DAdBgNVHQ4EFgQUhzkS9E6G+x8U7eIYZVgWyN4j2u4wgaQGA1UdIwSBnDCBmYAUhzkS9E6G+x8U7eIYZVgWyN4j2u6heKR2MHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZIIJAMLgh0ZkSjCNMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEBABywqUAtNkXf2EVQuRGiI3pnNvIYx7N5xj4LMtloEdEqMpEcMa6Qe87qDx2hsArOR1nzQAFGsT/8YIIfX0fAJjQuP1lAcExSxVKbFICEvFBaWuhGgOOZ7CYzfHB6tEzJFLR2DQHQrXLT2HKDDhxhe9hKzqIRDSc5Hjr3jY5MMzfYM5lFvKK9pLqEsP6/Ad9SDhupcVoOWVrSCNKfRb6jpJbZuxJhCnq8tmlV4iy5tEW0a3VBYzpRoBdAaORWqHQTUlt+iL3aH7C5OxhgN/JuxvxXBL/3kkc0wK1ZNuk+sb4lNXmHnVqQYTcyowQHRPCRsPzCCl4ANULRpZjxAd0xUgg=</item>
</string-array>
<attr format="color" name="animationBackgroundColor"/>
<attr format="enum" name="finishPrimaryWithPlaceholder">
<enum name="always" value="1"/>
<enum name="adjacent" value="2"/>
</attr>
<attr format="enum" name="finishPrimaryWithSecondary">
<enum name="never" value="0"/>
<enum name="always" value="1"/>
<enum name="adjacent" value="2"/>
</attr>
<attr format="enum" name="finishSecondaryWithPrimary">
<enum name="never" value="0"/>
<enum name="always" value="1"/>
<enum name="adjacent" value="2"/>
</attr>
<attr format="reference" name="nestedScrollViewStyle"/>
<attr format="enum" name="splitChangeAnimation">
<enum name="systemDefault" value="0"/>
<enum name="jumpCut" value="1"/>
</attr>
<attr format="enum" name="splitCloseAnimation">
<enum name="systemDefault" value="0"/>
<enum name="jumpCut" value="1"/>
</attr>
<attr format="enum" name="splitLayoutDirection">
<enum name="locale" value="0"/>
<enum name="ltr" value="1"/>
<enum name="rtl" value="2"/>
<enum name="topToBottom" value="3"/>
<enum name="bottomToTop" value="4"/>
</attr>
<attr format="float" name="splitMaxAspectRatioInLandscape">
<enum name="alwaysAllow" value="0"/>
<enum name="alwaysDisallow" value="-1"/>
</attr>
<attr format="float" name="splitMaxAspectRatioInPortrait">
<enum name="alwaysAllow" value="0"/>
<enum name="alwaysDisallow" value="-1"/>
</attr>
<attr format="integer" name="splitMinHeightDp"/>
<attr format="integer" name="splitMinSmallestWidthDp"/>
<attr format="integer" name="splitMinWidthDp"/>
<attr format="enum" name="splitOpenAnimation">
<enum name="systemDefault" value="0"/>
<enum name="jumpCut" value="1"/>
</attr>
<attr format="float" name="splitRatio"/>
<attr format="string" name="tag"/>
<bool name="enable_system_alarm_service_default">true</bool>
<bool name="enable_system_foreground_service_default">true</bool>
<bool name="enable_system_job_service_default">false</bool>
<bool name="workmanager_test_configuration">false</bool>
<color name="androidx_core_ripple_material_light">#1f000000</color>
<color name="androidx_core_secondary_text_default_material_light">#8a000000</color>
<color name="call_notification_answer_color">#1d873b</color>
<color name="call_notification_decline_color">#d93025</color>
<color name="notification_action_color_filter">#ffffffff</color>
<color name="notification_icon_bg_color">#ff9e9e9e</color>
<color name="notification_material_background_media_default_color">#ff424242</color>
<color name="primary_text_default_material_dark">#ffffffff</color>
<color name="secondary_text_default_material_dark">#b3ffffff</color>
<dimen name="compat_button_inset_horizontal_material">4dp</dimen>
<dimen name="compat_button_inset_vertical_material">6dp</dimen>
<dimen name="compat_button_padding_horizontal_material">8dp</dimen>
<dimen name="compat_button_padding_vertical_material">4dp</dimen>
<dimen name="compat_control_corner_material">2dp</dimen>
<dimen name="compat_notification_large_icon_max_height">320dp</dimen>
<dimen name="compat_notification_large_icon_max_width">320dp</dimen>
<dimen name="notification_action_icon_size">32dp</dimen>
<dimen name="notification_action_text_size">13sp</dimen>
<dimen name="notification_big_circle_margin">12dp</dimen>
<dimen name="notification_content_margin_start">8dp</dimen>
<dimen name="notification_large_icon_height">64dp</dimen>
<dimen name="notification_large_icon_width">64dp</dimen>
<dimen name="notification_main_column_padding_top">10dp</dimen>
<dimen name="notification_media_narrow_margin">@dimen/notification_content_margin_start</dimen>
<dimen name="notification_right_icon_size">16dp</dimen>
<dimen name="notification_right_side_padding_top">4dp</dimen>
<dimen name="notification_small_icon_background_padding">3dp</dimen>
<dimen name="notification_small_icon_size_as_large">24dp</dimen>
<dimen name="notification_subtext_size">13sp</dimen>
<dimen name="notification_top_pad">10dp</dimen>
<dimen name="notification_top_pad_large_text">5dp</dimen>
<drawable name="media3_notification_small_icon">@drawable/media3_icon_circular_play</drawable>
<drawable name="notification_template_icon_bg">#3333B5E5</drawable>
<drawable name="notification_template_icon_low_bg">#0cffffff</drawable>
<item name="accessibility_action_clickable_span" type="id"/>
<item name="accessibility_custom_action_0" type="id"/>
<item name="accessibility_custom_action_1" type="id"/>
<item name="accessibility_custom_action_10" type="id"/>
<item name="accessibility_custom_action_11" type="id"/>
<item name="accessibility_custom_action_12" type="id"/>
<item name="accessibility_custom_action_13" type="id"/>
<item name="accessibility_custom_action_14" type="id"/>
<item name="accessibility_custom_action_15" type="id"/>
<item name="accessibility_custom_action_16" type="id"/>
<item name="accessibility_custom_action_17" type="id"/>
<item name="accessibility_custom_action_18" type="id"/>
<item name="accessibility_custom_action_19" type="id"/>
<item name="accessibility_custom_action_2" type="id"/>
<item name="accessibility_custom_action_20" type="id"/>
<item name="accessibility_custom_action_21" type="id"/>
<item name="accessibility_custom_action_22" type="id"/>
<item name="accessibility_custom_action_23" type="id"/>
<item name="accessibility_custom_action_24" type="id"/>
<item name="accessibility_custom_action_25" type="id"/>
<item name="accessibility_custom_action_26" type="id"/>
<item name="accessibility_custom_action_27" type="id"/>
<item name="accessibility_custom_action_28" type="id"/>
<item name="accessibility_custom_action_29" type="id"/>
<item name="accessibility_custom_action_3" type="id"/>
<item name="accessibility_custom_action_30" type="id"/>
<item name="accessibility_custom_action_31" type="id"/>
<item name="accessibility_custom_action_4" type="id"/>
<item name="accessibility_custom_action_5" type="id"/>
<item name="accessibility_custom_action_6" type="id"/>
<item name="accessibility_custom_action_7" type="id"/>
<item name="accessibility_custom_action_8" type="id"/>
<item name="accessibility_custom_action_9" type="id"/>
<item name="androidx_compose_ui_view_compose_view_context" type="id"/>
<item name="androidx_compose_ui_view_composition_context" type="id"/>
<item name="androidx_window_activity_scope" type="id"/>
<item name="auto_clear_focus_behavior_tag" type="id"/>
<item name="coil3_request_manager" type="id"/>
<item name="compose_prefetch_scheduler" type="id"/>
<item name="compose_view_saveable_id_tag" type="id"/>
<item name="consume_window_insets_tag" type="id"/>
<item name="fragment_container_view_tag" type="id"/>
<item name="ghost_view" type="id"/>
<item name="ghost_view_holder" type="id"/>
<item name="hide_graphics_layer_in_inspector_tag" type="id"/>
<item name="hide_in_inspector_tag" type="id"/>
<item name="inspection_slot_table_set" type="id"/>
<item name="is_pooling_container_tag" type="id"/>
<item name="line1" type="id"/>
<item name="line3" type="id"/>
<item name="media_controller_compat_view_tag" type="id"/>
<item name="nav_controller_view_tag" type="id"/>
<item name="parent_matrix" type="id"/>
<item name="pooling_container_listener_holder_tag" type="id"/>
<item name="report_drawn" type="id"/>
<item name="save_non_transition_alpha" type="id"/>
<item name="save_overlay_view" type="id"/>
<item name="special_effects_controller_view_tag" type="id"/>
<item name="tag_accessibility_actions" type="id"/>
<item name="tag_accessibility_clickable_spans" type="id"/>
<item name="tag_accessibility_heading" type="id"/>
<item name="tag_accessibility_pane_title" type="id"/>
<item name="tag_compat_insets_dispatch" type="id"/>
<item name="tag_on_apply_window_listener" type="id"/>
<item name="tag_on_receive_content_listener" type="id"/>
<item name="tag_on_receive_content_mime_types" type="id"/>
<item name="tag_screen_reader_focusable" type="id"/>
<item name="tag_state_description" type="id"/>
<item name="tag_system_bar_state_monitor" type="id"/>
<item name="tag_transition_group" type="id"/>
<item name="tag_unhandled_key_event_manager" type="id"/>
<item name="tag_unhandled_key_listeners" type="id"/>
<item name="tag_window_insets_animation_callback" type="id"/>
<item name="text" type="id"/>
<item name="text2" type="id"/>
<item name="title" type="id"/>
<item name="transition_clip" type="id"/>
<item name="transition_current_scene" type="id"/>
<item name="transition_image_transform" type="id"/>
<item name="transition_layout_save" type="id"/>
<item name="transition_pause_alpha" type="id"/>
<item name="transition_position" type="id"/>
<item name="transition_scene_layoutid_cache" type="id"/>
<item name="transition_transform" type="id"/>
<id name="view_tree_disjoint_parent"/>
<id name="view_tree_lifecycle_owner"/>
<id name="view_tree_on_back_pressed_dispatcher_owner"/>
<id name="view_tree_saved_state_registry_owner"/>
<id name="view_tree_view_model_store_owner"/>
<item name="visible_removing_fragment_view_tag" type="id"/>
<item name="wrapped_composition_tag" type="id"/>
<integer name="cancel_button_image_alpha">127</integer>
<integer name="m3c_window_layout_in_display_cutout_mode">1</integer>
<integer name="status_bar_notification_info_maxnum">999</integer>
<string name="androidx_compose_foundation_autofill">Autofill</string>
<string name="androidx_compose_ui_autofill">Autofill</string>
<string name="androidx_startup" translatable="false">androidx.startup</string>
<string name="app_name">Minstrel</string>
<string name="call_notification_answer_action">Answer</string>
<string name="call_notification_answer_video_action">Video</string>
<string name="call_notification_decline_action">Decline</string>
<string name="call_notification_hang_up_action">Hang Up</string>
<string name="call_notification_incoming_text">Incoming call</string>
<string name="call_notification_ongoing_text">Ongoing call</string>
<string name="call_notification_screening_text">Screening an incoming call</string>
<string name="close_drawer">"Close navigation menu"</string>
<string name="close_sheet">"Close sheet"</string>
<string name="default_error_message">"Invalid input"</string>
<string name="default_notification_channel_name">Now playing</string>
<string name="default_popup_window_title" ns1:ignore="ExtraTranslation">"Pop-Up Window"</string>
<string name="dropdown_menu">"Dropdown menu"</string>
<string name="error_message_authentication_expired">Sign in to use this app</string>
<string name="error_message_bad_value">Incorrect input data</string>
<string name="error_message_concurrent_stream_limit">Listening on too many devices</string>
<string name="error_message_content_already_playing">Already playing that content</string>
<string name="error_message_disconnected">Disconnected from media app</string>
<string name="error_message_end_of_playlist">Nothing else is queued up</string>
<string name="error_message_fallback">Somethings wrong. Try later.</string>
<string name="error_message_info_cancelled">Couldnt finish. Try again.</string>
<string name="error_message_invalid_state">Cant do that right now</string>
<string name="error_message_io">Input/output error</string>
<string name="error_message_not_available_in_region">Cant get that content here</string>
<string name="error_message_not_supported">This app cant do that</string>
<string name="error_message_parental_control_restricted">That content is blocked</string>
<string name="error_message_permission_denied">Access denied</string>
<string name="error_message_premium_account_required">Premium access required</string>
<string name="error_message_setup_required">Setup required</string>
<string name="error_message_skip_limit_reached">Cant skip any more tracks</string>
<string name="exo_download_completed">Download completed</string>
<string name="exo_download_description">Download</string>
<string name="exo_download_downloading">Downloading</string>
<string name="exo_download_failed">Download failed</string>
<string name="exo_download_notification_channel_name">Downloads</string>
<string name="exo_download_paused">Downloads paused</string>
<string name="exo_download_paused_for_network">Downloads waiting for network</string>
<string name="exo_download_paused_for_wifi">Downloads waiting for WiFi</string>
<string name="exo_download_removing">Removing downloads</string>
<string name="in_progress">In progress</string>
<string name="indeterminate">Partially checked</string>
<string name="m3c_bottom_sheet_collapse_description">Collapse bottom sheet</string>
<string name="m3c_bottom_sheet_dismiss_description">Dismiss bottom sheet</string>
<string name="m3c_bottom_sheet_drag_handle_description">Drag handle</string>
<string name="m3c_bottom_sheet_expand_description">Expand bottom sheet</string>
<string name="m3c_bottom_sheet_pane_title">Bottom Sheet</string>
<string name="m3c_date_input_headline">Entered date</string>
<string name="m3c_date_input_headline_description">Entered date: %1$s</string>
<string name="m3c_date_input_invalid_for_pattern">Date does not match expected pattern: %1$s</string>
<string name="m3c_date_input_invalid_not_allowed">Date not allowed: %1$s</string>
<string name="m3c_date_input_invalid_year_range">
Date out of expected year range %1$s - %2$s
</string>
<string name="m3c_date_input_label">Date</string>
<string name="m3c_date_input_no_input_description">None</string>
<string name="m3c_date_input_title">Select date</string>
<string name="m3c_date_picker_headline">"Selected date"</string>
<string name="m3c_date_picker_headline_description">Current selection: %1$s</string>
<string name="m3c_date_picker_navigate_to_year_description">Navigate to year %1$s</string>
<string name="m3c_date_picker_no_selection_description">None</string>
<string name="m3c_date_picker_scroll_to_earlier_years">Scroll to show earlier years</string>
<string name="m3c_date_picker_scroll_to_later_years">Scroll to show later years</string>
<string name="m3c_date_picker_switch_to_calendar_mode">Switch to calendar input mode</string>
<string name="m3c_date_picker_switch_to_day_selection">
"Swipe to select a year, or tap to switch back to selecting a day"
</string>
<string name="m3c_date_picker_switch_to_input_mode">Switch to text input mode</string>
<string name="m3c_date_picker_switch_to_next_month">"Change to next month"</string>
<string name="m3c_date_picker_switch_to_previous_month">"Change to previous month"</string>
<string name="m3c_date_picker_switch_to_year_selection">"Switch to selecting a year"</string>
<string name="m3c_date_picker_title">"Select date"</string>
<string name="m3c_date_picker_today_description">Today</string>
<string name="m3c_date_picker_year_picker_pane_title">Year picker visible</string>
<string name="m3c_date_range_input_invalid_range_input">Invalid date range input</string>
<string name="m3c_date_range_input_title">Enter dates</string>
<string name="m3c_date_range_picker_day_in_range">In range</string>
<string name="m3c_date_range_picker_end_headline">End date</string>
<string name="m3c_date_range_picker_scroll_to_next_month">Scroll to show the next month</string>
<string name="m3c_date_range_picker_scroll_to_previous_month">Scroll to show the previous month</string>
<string name="m3c_date_range_picker_start_headline">Start date</string>
<string name="m3c_date_range_picker_title">Select dates</string>
<string name="m3c_dialog">"Dialog"</string>
<string name="m3c_dropdown_menu_collapsed">Collapsed</string>
<string name="m3c_dropdown_menu_expanded">Expanded</string>
<string name="m3c_dropdown_menu_toggle">Toggle dropdown menu</string>
<string name="m3c_floating_toolbar_collapse">Collapse toolbar</string>
<string name="m3c_floating_toolbar_expand">Expand toolbar</string>
<string name="m3c_search_bar_search">Search</string>
<string name="m3c_snackbar_dismiss">Dismiss</string>
<string name="m3c_snackbar_pane_title">Alert</string>
<string name="m3c_suggestions_available">Suggestions below</string>
<string name="m3c_time_input_dialog_title">Enter Time</string>
<string name="m3c_time_picker_am">AM</string>
<string name="m3c_time_picker_dialog_title">Select Time</string>
<string name="m3c_time_picker_hour">Hour</string>
<string name="m3c_time_picker_hour_24h_suffix">%1$d hours</string>
<string name="m3c_time_picker_hour_selection">Select hour</string>
<string name="m3c_time_picker_hour_suffix">%1$d o\'clock</string>
<string name="m3c_time_picker_hour_text_field">for hour</string>
<string name="m3c_time_picker_minute">Minute</string>
<string name="m3c_time_picker_minute_selection">Select minutes</string>
<string name="m3c_time_picker_minute_suffix">%1$d minutes</string>
<string name="m3c_time_picker_minute_text_field">for minutes</string>
<string name="m3c_time_picker_period_toggle_description">Select AM or PM</string>
<string name="m3c_time_picker_pm">PM</string>
<string name="m3c_time_picker_toggle_keyboard">Switch to text input mode for the time input</string>
<string name="m3c_time_picker_toggle_touch">Switch to clock mode for the time input</string>
<string name="m3c_tooltip_long_press_label">Show tooltip</string>
<string name="m3c_tooltip_pane_description">Tooltip</string>
<string name="m3c_wide_navigation_rail_close_rail">"Close rail"</string>
<string name="m3c_wide_navigation_rail_pane_title">"Navigation rail"</string>
<string name="media3_controls_pause_description">Pause</string>
<string name="media3_controls_play_description">Play</string>
<string name="media3_controls_seek_back_description">Seek back</string>
<string name="media3_controls_seek_forward_description">Seek forward</string>
<string name="media3_controls_seek_to_next_description">Seek to next item</string>
<string name="media3_controls_seek_to_previous_description">Seek to previous item</string>
<string name="navigation_menu">"Navigation menu"</string>
<string name="not_selected">Not selected</string>
<string name="range_end">"Range end"</string>
<string name="range_start">"Range start"</string>
<string name="selected">Selected</string>
<string name="snackbar_pane_title">Alert</string>
<string name="state_empty">Empty</string>
<string name="state_off">Off</string>
<string name="state_on">On</string>
<string name="status_bar_notification_info_overflow">999+</string>
<string name="switch_role">Switch</string>
<string name="tab">Tab</string>
<string name="template_percent"><ns2:g id="percentage">%1$d</ns2:g> percent.</string>
<string name="tooltip_description">tooltip</string>
<string name="tooltip_label">show tooltip</string>
<style name="DialogWindowTheme">
<item name="android:windowClipToOutline">false</item>
</style>
<style name="EdgeToEdgeFloatingDialogTheme" parent="android:Theme.DeviceDefault.Dialog">
<item name="android:windowAnimationStyle">@null</item>
<item name="android:windowLayoutInDisplayCutoutMode" ns1:targetApi="27">@integer/m3c_window_layout_in_display_cutout_mode</item>
<item name="android:windowClipToOutline">false</item>
<item name="android:windowIsFloating">false</item>
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowElevation">0dp</item>
</style>
<style name="EdgeToEdgeFloatingDialogWindowTheme">
<item name="android:dialogTheme">@style/EdgeToEdgeFloatingDialogTheme</item>
</style>
<style name="FloatingDialogWindowTheme">
<item name="android:windowClipToOutline">false</item>
<item name="android:backgroundDimEnabled">true</item>
</style>
<style name="TextAppearance.Compat.Notification" parent="@android:style/TextAppearance.StatusBar.EventContent"/>
<style name="TextAppearance.Compat.Notification.Info">
<item name="android:textSize">12sp</item>
<item name="android:textColor">?android:attr/textColorSecondary</item>
</style>
<style name="TextAppearance.Compat.Notification.Info.Media"/>
<style name="TextAppearance.Compat.Notification.Line2" parent="TextAppearance.Compat.Notification.Info"/>
<style name="TextAppearance.Compat.Notification.Line2.Media" parent="TextAppearance.Compat.Notification.Info.Media"/>
<style name="TextAppearance.Compat.Notification.Media"/>
<style name="TextAppearance.Compat.Notification.Time">
<item name="android:textSize">12sp</item>
<item name="android:textColor">?android:attr/textColorSecondary</item>
</style>
<style name="TextAppearance.Compat.Notification.Time.Media"/>
<style name="TextAppearance.Compat.Notification.Title" parent="@android:style/TextAppearance.StatusBar.EventContent.Title"/>
<style name="TextAppearance.Compat.Notification.Title.Media"/>
<style name="Theme.Minstrel" parent="android:Theme.Material.NoActionBar">
<item name="android:windowBackground">@android:color/black</item>
</style>
<style name="Widget.Compat.NotificationActionContainer" parent=""/>
<style name="Widget.Compat.NotificationActionText" parent=""/>
<declare-styleable name="ActivityFilter">
<attr format="string" name="activityName"/>
<attr format="string" name="activityAction"/>
</declare-styleable>
<declare-styleable name="ActivityNavigator">
<attr name="android:name"/>
<attr format="string" name="action"/>
<attr format="string" name="data"/>
<attr format="string" name="dataPattern"/>
<attr format="string" name="targetPackage"/>
</declare-styleable>
<declare-styleable name="ActivityRule">
<attr format="boolean" name="alwaysExpand"/>
<attr name="tag"/>
</declare-styleable>
<declare-styleable name="AnimatedStateListDrawableCompat">
<attr name="android:visible"/>
<attr name="android:variablePadding"/>
<attr name="android:constantSize"/>
<attr name="android:dither"/>
<attr name="android:enterFadeDuration"/>
<attr name="android:exitFadeDuration"/>
</declare-styleable>
<declare-styleable name="AnimatedStateListDrawableItem">
<attr name="android:drawable"/>
<attr name="android:id"/>
</declare-styleable>
<declare-styleable name="AnimatedStateListDrawableTransition">
<attr name="android:fromId"/>
<attr name="android:toId"/>
<attr name="android:drawable"/>
<attr name="android:reversible"/>
</declare-styleable>
<declare-styleable name="Capability">
<attr format="reference" name="queryPatterns"/>
<attr format="boolean" name="shortcutMatchRequired"/>
</declare-styleable>
<declare-styleable name="ColorStateListItem">
<attr name="android:color"/>
<attr format="float" name="alpha"/>
<attr name="android:alpha"/>
<attr format="float" name="lStar"/>
<attr name="android:lStar"/>
</declare-styleable>
<declare-styleable name="DividerAttributes">
<attr format="enum" name="embeddingDividerType">
<!-- Fixed divider type. -->
<enum name="fixed" value="0"/>
<!-- Draggable divider type. -->
<enum name="draggable" value="1"/>
</attr>
<attr format="integer" name="embeddingDividerWidthDp"/>
<attr format="color|reference" name="embeddingDividerColor"/>
<attr format="float" name="dragRangeMinRatio"/>
<attr format="float" name="dragRangeMaxRatio"/>
<attr format="boolean" name="isDraggingToFullscreenAllowed"/>
</declare-styleable>
<declare-styleable name="FontFamily">
<attr format="string" name="fontProviderAuthority"/>
<attr format="string" name="fontProviderPackage"/>
<attr format="string" name="fontProviderQuery"/>
<attr format="string" name="fontProviderFallbackQuery"/>
<attr format="reference" name="fontProviderCerts"/>
<attr name="fontProviderFetchStrategy">
<!-- The blocking font fetch works as follows.
First, check the local cache, then if the requested font is not cached, request the
font from the provider and wait until it is finished. You can change the length of
the timeout by modifying fontProviderFetchTimeout. If the timeout happens, the
default typeface will be used instead. -->
<enum name="blocking" value="0"/>
<!-- The async font fetch works as follows.
First, check the local cache, then if the requested font is not cached, trigger a
request the font and continue with layout inflation. Once the font fetch succeeds, the
target text view will be refreshed with the downloaded font data. The
fontProviderFetchTimeout will be ignored if async loading is specified. -->
<enum name="async" value="1"/>
</attr>
<attr format="integer" name="fontProviderFetchTimeout">
<!-- A special value for the timeout. In this case, the blocking font fetching will not
timeout and wait until a reply is received from the font provider. -->
<enum name="forever" value="-1"/>
</attr>
<attr format="string" name="fontProviderSystemFontFamily"/>
</declare-styleable>
<declare-styleable name="FontFamilyFont">
<attr name="fontStyle">
<enum name="normal" value="0"/>
<enum name="italic" value="1"/>
</attr>
<attr format="reference" name="font"/>
<attr format="integer" name="fontWeight"/>
<attr format="string" name="fontVariationSettings"/>
<attr format="integer" name="ttcIndex"/>
<attr name="android:fontStyle"/>
<attr name="android:font"/>
<attr name="android:fontWeight"/>
<attr name="android:fontVariationSettings"/>
<attr name="android:ttcIndex"/>
</declare-styleable>
<declare-styleable name="Fragment">
<attr name="android:name"/>
<attr name="android:id"/>
<attr name="android:tag"/>
</declare-styleable>
<declare-styleable name="FragmentContainerView">
<attr name="android:name"/>
<attr name="android:tag"/>
</declare-styleable>
<declare-styleable name="GradientColor">
<attr name="android:startColor"/>
<attr name="android:centerColor"/>
<attr name="android:endColor"/>
<attr name="android:type"/>
<attr name="android:gradientRadius"/>
<attr name="android:centerX"/>
<attr name="android:centerY"/>
<attr name="android:startX"/>
<attr name="android:startY"/>
<attr name="android:endX"/>
<attr name="android:endY"/>
<attr name="android:tileMode"/>
</declare-styleable>
<declare-styleable name="GradientColorItem">
<attr name="android:offset"/>
<attr name="android:color"/>
</declare-styleable>
<declare-styleable name="NavAction">
<attr name="android:id"/>
<attr format="reference" name="destination"/>
<attr format="boolean" name="launchSingleTop"/>
<attr format="boolean" name="restoreState"/>
<attr format="reference" name="popUpTo"/>
<attr format="boolean" name="popUpToInclusive"/>
<attr format="boolean" name="popUpToSaveState"/>
<attr format="reference" name="enterAnim"/>
<attr format="reference" name="exitAnim"/>
<attr format="reference" name="popEnterAnim"/>
<attr format="reference" name="popExitAnim"/>
</declare-styleable>
<declare-styleable name="NavArgument">
<attr name="android:name"/>
<attr name="android:defaultValue"/>
<attr format="boolean" name="nullable"/>
<attr format="string" name="argType"/>
</declare-styleable>
<declare-styleable name="NavDeepLink">
<attr format="string" name="uri"/>
<attr format="string" name="action"/>
<attr format="string" name="mimeType"/>
<attr name="android:autoVerify"/>
</declare-styleable>
<declare-styleable name="NavGraphNavigator">
<attr format="reference" name="startDestination"/>
</declare-styleable>
<declare-styleable name="NavHost">
<attr format="reference" name="navGraph"/>
</declare-styleable>
<declare-styleable name="NavInclude">
<attr format="reference" name="graph"/>
</declare-styleable>
<declare-styleable name="Navigator">
<attr name="android:id"/>
<attr format="string" name="route"/>
<attr name="android:label"/>
</declare-styleable>
<declare-styleable name="SplitPairFilter">
<attr format="string" name="primaryActivityName"/>
<attr format="string" name="secondaryActivityName"/>
<attr format="string" name="secondaryActivityAction"/>
</declare-styleable>
<declare-styleable name="SplitPairRule">
<attr format="boolean" name="clearTop"/>
<attr name="finishPrimaryWithSecondary"/>
<attr name="finishSecondaryWithPrimary"/>
<attr name="splitRatio"/>
<attr name="splitMinWidthDp"/>
<attr name="splitMinHeightDp"/>
<attr name="splitMinSmallestWidthDp"/>
<attr name="splitMaxAspectRatioInPortrait"/>
<attr name="splitMaxAspectRatioInLandscape"/>
<attr name="splitLayoutDirection"/>
<attr name="tag"/>
<attr name="animationBackgroundColor"/>
<attr name="splitOpenAnimation"/>
<attr name="splitCloseAnimation"/>
<attr name="splitChangeAnimation"/>
</declare-styleable>
<declare-styleable name="SplitPlaceholderRule">
<attr format="string" name="placeholderActivityName"/>
<attr format="boolean" name="stickyPlaceholder"/>
<attr name="finishPrimaryWithPlaceholder"/>
<attr name="splitRatio"/>
<attr name="splitMinWidthDp"/>
<attr name="splitMinHeightDp"/>
<attr name="splitMinSmallestWidthDp"/>
<attr name="splitMaxAspectRatioInPortrait"/>
<attr name="splitMaxAspectRatioInLandscape"/>
<attr name="splitLayoutDirection"/>
<attr name="tag"/>
<attr name="animationBackgroundColor"/>
<attr name="splitOpenAnimation"/>
<attr name="splitCloseAnimation"/>
<attr name="splitChangeAnimation"/>
</declare-styleable>
<declare-styleable name="StateListDrawable">
<attr name="android:visible"/>
<attr name="android:variablePadding"/>
<attr name="android:constantSize"/>
<attr name="android:dither"/>
<attr name="android:enterFadeDuration"/>
<attr name="android:exitFadeDuration"/>
</declare-styleable>
<declare-styleable name="StateListDrawableItem">
<attr name="android:drawable"/>
</declare-styleable>
</resources>