feat: add ota and ui changes

This commit is contained in:
TCFDONMEZ
2026-09-29 14:32:25 +03:00
parent c102625306
commit 511c166436
61 changed files with 895 additions and 2178 deletions
+19 -38
View File
@@ -1,41 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EVSuite tokens - LIGHT theme. See DESIGN.md section Colors.
Generated by tools/sync-tokens.mjs and identical in all six apps: edit
tools/tokens/colors.light.xml, not this copy, and re-check the ratios.
Contrast: this screen is read in daylight, usually through a reflection. Every
text colour clears 7:1 (AAA) on every surface it can land on, not the 4.5:1 AA
minimum, which collapses as soon as outside brightness rises. The AAA floor
applies to the light theme too - a badly contrasted light theme is no more
readable than a badly contrasted dark one. -->
<!-- User-requested app-specific OLED palette. -->
<resources>
<color name="ev_background">#FFF2F4F7</color>
<color name="ev_surface">#FFFFFFFF</color>
<color name="ev_surface_raised">#FFE4E8ED</color>
<!-- Card border. Without it, surface and surface_raised merge in sunlight.
4.07:1 on ev_surface - above the 3:1 floor for non-text UI (WCAG 1.4.11),
which the previous #4A525B (2.25:1) did not clear. -->
<color name="ev_outline">#FF737F8F</color>
<color name="ev_text_primary">#FF101418</color>
<!-- 7.22:1 worst case (on ev_surface_raised). -->
<color name="ev_text_secondary">#FF414B55</color>
<!-- A deep cyan, not the dark theme's pale one: a pale cyan on white falls to
1.5:1 and disappears outright in daylight. 7.69:1 worst case. -->
<color name="ev_accent">#FF044C63</color>
<color name="ev_on_accent">#FFFFFFFF</color>
<!-- Status. Never the sole carrier of meaning: a text label always accompanies
the colour. -->
<color name="ev_ok">#FF09501F</color>
<color name="ev_warn">#FF6B3A00</color>
<color name="ev_error">#FF8F0F18</color>
<!-- Pressed: an alpha veil over the surface, not a different hue, so a pressed
card still reads as the same card. -->
<color name="ev_pressed">#14000000</color>
<color name="ev_pressed_strong">#29000000</color>
<!-- Launcher icon tile. The same in light and dark: it is the suite's mark, not
a surface. See DESIGN.md section Iconography. -->
<color name="ev_icon_tile">#FF2A2A2A</color>
<color name="ev_background">#000000</color>
<color name="ev_surface">#121212</color>
<color name="ev_surface_raised">#1B1D1E</color>
<color name="ev_outline">#363B3D</color>
<color name="ev_text_primary">#F4F3EF</color>
<color name="ev_text_secondary">#BDC4C6</color>
<color name="ev_accent">#D8C39A</color>
<color name="ev_on_accent">#17140E</color>
<color name="ev_cyan">#A0E2E0</color>
<color name="ev_cyan_deep">#103436</color>
<color name="ev_gold_surface">#28241B</color>
<color name="ev_ok">#A4DCC1</color>
<color name="ev_warn">#E9CA96</color>
<color name="ev_error">#FFB4AB</color>
<color name="ev_pressed">#16FFFFFF</color>
<color name="ev_pressed_strong">#28FFFFFF</color>
<color name="ev_icon_tile">#121212</color>
<color name="ev_transparent">#00000000</color>
</resources>
+6 -21
View File
@@ -1,27 +1,12 @@
<resources>
<string name="window_close_title">Kapı açılınca camları kapat</string>
<string name="window_close_hint">P konumunda ve araç dururken WinClose kapı sinyaliyle dört cama 5 saniye kapatma komutu gönderilir. ABRP yüklemesinden bağımsız çalışır.</string>
<string name="window_close_stopped">Cam kapatma kapalı</string>
<string name="window_close_waiting">WinClose kapı sinyali bekleniyor</string>
<string name="window_close_closing">Dört cama kapatma komutu gönderiliyor…</string>
<string name="window_close_sent">5 saniyelik komut tamamlandı. Cam konumu sensörsüz olduğu için doğrulanamıyor.</string>
<string name="window_close_interrupted">Kapatma durdu veya komut gönderilemedi</string>
<string name="window_close_unavailable">Cam bağlantısı henüz hazır değil</string>
<string name="window_close_start_failed">Cam servisi başlatılamadı</string>
<string name="window_close_unsupported">Bu cam entegrasyonu yalnızca SWI69 için etkin</string>
<string name="window_close_no_system_uid">Bu sürüm araca yazamıyor (sistem imzası gerekli)</string>
<string name="window_close_notification">P ve 0 km/sa: kapı açılınca dört camı kapat</string>
<string name="window_close_disable">Kapat</string>
<string name="window_close_log_title">Olay kaydı</string>
<string name="app_name">Fatih\'sMG4</string>
<!-- Main screen -->
<string name="tab_abrp">ABRP</string>
<string name="tab_service">Upload Service</string>
<string name="tab_vehicle">Araç</string>
<string name="tab_windows">Pencereler</string>
<string name="tab_service">Aktarım</string>
<string name="tab_vehicle">Genel</string>
<string name="tab_wifi">Wi-Fi</string>
<string name="tab_log">Log</string>
<string name="tab_log">Kayıtlar</string>
<!-- Wi-Fi page -->
<string name="wifi_card_title">Wi-Fi Bağlantısı</string>
@@ -62,9 +47,9 @@
<string name="helper_token">Find your token in the ABRP app: Settings → Connections → Generic (Manual Entry)</string>
<string name="desc_toggle_api_key">Show or hide API key</string>
<string name="desc_toggle_token">Show or hide user token</string>
<string name="btn_save">Save</string>
<string name="btn_test">Test Connection</string>
<string name="btn_import">Import file</string>
<string name="btn_save">Kaydet</string>
<string name="btn_test">Bağlantıyı test et</string>
<string name="btn_import">Dosyadan al</string>
<!-- Config file import -->
<string name="import_ok">Config imported — press Test to verify</string>
@@ -0,0 +1,28 @@
<?xml version="1.0"?>
<resources>
<string name="design_battery_short">Batarya</string>
<string name="design_probe">VHAL Probe</string>
<string name="design_brand">MG&#x2074;</string>
<string name="design_brand_caption">Fatih&#x2019;s MG4</string>
<string name="design_brand_footer">ELEKTR&#x130;KLE YOLDA</string>
<string name="design_overview_title">S&#xFC;r&#xFC;&#x15F;e bir bak&#x131;&#x15F;.</string>
<string name="design_overview_subtitle">Arac&#x131;ndan gelen veriler, tek bir yerde.</string>
<string name="design_abrp_title">Rotana ba&#x11F;lan.</string>
<string name="design_abrp_subtitle">ABRP hesab&#x131;nla arac&#x131;n&#x131; bulu&#x15F;tur.</string>
<string name="design_service_title">Sen yola odaklan.</string>
<string name="design_service_subtitle">Verilerin arka planda g&#xFC;ncel kals&#x131;n.</string>
<string name="design_wifi_title">Ba&#x11F;lant&#x131;da kal.</string>
<string name="design_wifi_subtitle">Yolculu&#x11F;unun internet ba&#x11F;lant&#x131;s&#x131;.</string>
<string name="design_log_title">Her aktar&#x131;m, burada.</string>
<string name="design_log_subtitle">Son g&#xF6;nderimlerin durumu ve ayr&#x131;nt&#x131;lar&#x131;.</string>
<string name="design_battery">BATARYA</string>
<string name="design_energy">ENERJ&#x130; VE SICAKLIK</string>
<string name="design_tires">LAST&#x130;K BASIN&#xC7;LARI</string>
<string name="design_account">HESAP BA&#x11E;LANTISI</string>
<string name="design_private_title">Sana &#xF6;zel ba&#x11F;lant&#x131;.</string>
<string name="design_private_body">Token, arac&#x131;n&#x131; ABRP hesab&#x131;na ba&#x11F;lar. Bilgilerin bu cihazda &#x15F;ifreli saklan&#x131;r.</string>
<string name="design_no_data">Okunamayan veriler &#x2014; olarak g&#xF6;sterilir.</string>
<string name="design_service_controls">AKTARIM KONTROL&#xDC;</string>
<string name="design_service_timing">G&#xDC;NCELLEME SIKLI&#x11E;I</string>
<string name="design_car_desc">Lastik bas&#x131;n&#xE7;lar&#x131;n&#x131;n ara&#xE7; &#xFC;zerindeki konumlar&#x131;</string>
</resources>
+85 -66
View File
@@ -1,69 +1,88 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Per-app styles (not synced by tools/sync-tokens.mjs — see styles_ev.xml for the
shared set). -->
<resources>
<!-- Icon-over-label nav tab, identical to EVProfile's and EVTasker's. The tabs
share the bar's width equally, so the label has to shrink rather than push its
neighbours around: hence autoSize and a single line. Selected state is
View.isSelected, set by MainActivity.markCurrentPage, read by the
res/color/nav_tab_*.xml selectors — no color is ever set from code. -->
<style name="Widget.EV.NavTab" parent="Widget.Material3.Button.OutlinedButton">
<item name="android:minWidth">0dp</item>
<item name="android:minHeight">0dp</item>
<item name="android:insetTop">0dp</item>
<item name="android:insetBottom">0dp</item>
<item name="android:paddingStart">@dimen/spacing_xs</item>
<item name="android:paddingEnd">@dimen/spacing_xs</item>
<item name="android:paddingTop">@dimen/spacing_xs</item>
<item name="android:paddingBottom">@dimen/spacing_xs</item>
<item name="android:maxLines">1</item>
<item name="android:textStyle">bold</item>
<item name="android:letterSpacing">0.02</item>
<item name="android:textAllCaps">false</item>
<item name="android:textColor">@color/nav_tab_foreground</item>
<item name="autoSizeTextType">uniform</item>
<item name="autoSizeMinTextSize">12sp</item>
<item name="autoSizeMaxTextSize">@dimen/text_label</item>
<item name="iconGravity">top</item>
<item name="iconSize">28dp</item>
<item name="iconPadding">@dimen/spacing_xs</item>
<item name="iconTint">@color/nav_tab_foreground</item>
<item name="backgroundTint">@color/nav_tab_background</item>
<item name="strokeColor">@color/nav_tab_stroke</item>
<item name="strokeWidth">1dp</item>
<item name="cornerRadius">@dimen/ev_corner</item>
<item name="elevation">0dp</item>
</style>
<!-- Vehicle page. A label/value table: the label takes the slack (stretchColumns=0)
and the value is right-aligned so the numbers line up down the column, which
is what makes a reading legible at a glance from the driver's seat. -->
<style name="DataRow" parent="">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:paddingTop">@dimen/spacing_sm</item>
<item name="android:paddingBottom">@dimen/spacing_sm</item>
<item name="android:gravity">center_vertical</item>
</style>
<style name="DataLabel" parent="Text.EV.Body">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textColor">@color/ev_text_secondary</item>
</style>
<style name="DataValue" parent="Text.EV.Body">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:paddingStart">@dimen/spacing_md</item>
<item name="android:gravity">end</item>
<item name="android:textStyle">bold</item>
<item name="android:textColor">@color/ev_text_primary</item>
<!-- Placeholder, replaced on the first refresh tick. A dash, never a zero:
see the note at the top of pane_vehicle.xml. -->
<item name="android:text">—</item>
</style>
<style name="Widget.EV.NavTab" parent="Widget.Material3.Button.OutlinedButton">
<item name="android:minWidth">0dp</item>
<item name="android:minHeight">64dp</item>
<item name="android:insetTop">0dp</item>
<item name="android:insetBottom">0dp</item>
<item name="android:paddingStart">16dp</item>
<item name="android:paddingEnd">12dp</item>
<item name="android:gravity">start|center_vertical</item>
<item name="android:maxLines">1</item>
<item name="android:fontFamily">sans-serif-medium</item>
<item name="android:textSize">16sp</item>
<item name="android:textAllCaps">false</item>
<item name="android:textColor">@color/nav_tab_foreground</item>
<item name="iconGravity">start</item>
<item name="iconSize">24dp</item>
<item name="iconPadding">12dp</item>
<item name="iconTint">@color/nav_tab_foreground</item>
<item name="backgroundTint">@color/nav_tab_background</item>
<item name="strokeColor">@color/nav_tab_stroke</item>
<item name="strokeWidth">1dp</item>
<item name="cornerRadius">18dp</item>
<item name="elevation">0dp</item>
</style>
<style name="Widget.EV.NavTab.Compact">
<item name="android:paddingStart">2dp</item>
<item name="android:paddingEnd">2dp</item>
<item name="android:gravity">center</item>
<item name="iconGravity">top</item>
<item name="iconPadding">5dp</item>
</style>
<style name="Widget.EV.Input" parent="Widget.Material3.TextInputLayout.OutlinedBox">
<item name="boxBackgroundColor">@color/ev_background</item>
<item name="boxStrokeColor">@color/input_stroke</item>
<item name="boxStrokeWidth">1dp</item>
<item name="boxStrokeWidthFocused">2dp</item>
<item name="boxCornerRadiusTopStart">16dp</item>
<item name="boxCornerRadiusTopEnd">16dp</item>
<item name="boxCornerRadiusBottomStart">16dp</item>
<item name="boxCornerRadiusBottomEnd">16dp</item>
<item name="hintTextColor">@color/ev_accent</item>
<item name="endIconTint">@color/ev_text_secondary</item>
<item name="helperTextTextAppearance">@style/Text.EV.Secondary</item>
</style>
<style name="Text.EV.Eyebrow" parent="Text.EV.SectionHeader">
<item name="android:textSize">16sp</item>
<item name="android:textColor">@color/ev_accent</item>
<item name="android:fontFamily">sans-serif-medium</item>
<item name="android:letterSpacing">0.12</item>
</style>
<style name="Text.EV.Hero" parent="Text.EV.Display">
<item name="android:textSize">48sp</item>
<item name="android:fontFamily">sans-serif-light</item>
<item name="android:letterSpacing">-0.025</item>
<item name="android:fontFeatureSettings">tnum</item>
</style>
<style name="Text.EV.Metric" parent="Text.EV.Display">
<item name="android:textSize">34sp</item>
<item name="android:fontFamily">sans-serif-light</item>
<item name="android:fontFeatureSettings">tnum</item>
</style>
<style name="Text.EV.Metric.Compact">
<item name="android:textSize">28sp</item>
</style>
<style name="DataRow" parent="">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:minHeight">48dp</item>
<item name="android:paddingTop">10dp</item>
<item name="android:paddingBottom">10dp</item>
<item name="android:gravity">center_vertical</item>
</style>
<style name="DataLabel" parent="Text.EV.Secondary">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
</style>
<style name="DataValue" parent="Text.EV.Body">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:paddingStart">16dp</item>
<item name="android:gravity">end</item>
<item name="android:fontFamily">sans-serif-medium</item>
<item name="android:fontFeatureSettings">tnum</item>
<item name="android:textColor">@color/ev_text_primary</item>
<item name="android:text">—</item>
</style>
</resources>
+17 -14
View File
@@ -1,11 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EVSuite - component styles. See DESIGN.md section Components.
Generated by tools/sync-tokens.mjs: identical in all six apps, edit only
tools/tokens/styles.xml. The application theme itself stays in values/themes.xml,
because its name changes from one app to the next.
These styles carry the same names everywhere, so a screen can move between
repositories without being renamed. -->
<!-- EVABRPUploader components. The user-requested OLED theme intentionally
overrides the shared EVSuite tokens; see AGENTS.md for the local design direction. -->
<resources>
<!-- Dialogs inherit the same contrast as everything else: without this they fall
@@ -24,6 +19,12 @@
away. This is the minimum used everywhere in the suite, including where
Material offers something much smaller. -->
<style name="Widget.EV.Button" parent="Widget.Material3.Button">
<item name="android:textAllCaps">false</item>
<item name="android:fontFamily">sans-serif-medium</item>
<item name="android:letterSpacing">0.01</item>
<item name="backgroundTint">@color/ev_accent</item>
<item name="android:textColor">@color/ev_on_accent</item>
<item name="elevation">0dp</item>
<item name="shapeAppearanceOverlay">@style/ShapeAppearanceOverlay.EV.Button</item>
<item name="android:minHeight">@dimen/touch_target</item>
<item name="android:textSize">@dimen/text_body</item>
@@ -32,6 +33,11 @@
</style>
<style name="Widget.EV.Button.Outlined" parent="Widget.Material3.Button.OutlinedButton">
<item name="android:textAllCaps">false</item>
<item name="android:fontFamily">sans-serif-medium</item>
<item name="backgroundTint">@color/ev_surface_raised</item>
<item name="strokeColor">@color/ev_outline</item>
<item name="android:textColor">@color/ev_text_primary</item>
<item name="shapeAppearanceOverlay">@style/ShapeAppearanceOverlay.EV.Button</item>
<item name="android:minHeight">@dimen/touch_target</item>
<item name="android:textSize">@dimen/text_body</item>
@@ -64,14 +70,14 @@
<item name="android:textStyle">bold</item>
</style>
<!-- One Display element per screen: two 32sp numbers competing for attention are
two glances, and the glance is the budget. -->
<!-- Shared typography base; the overview uses larger hero and metric variants. -->
<style name="Text.EV.Display" parent="TextAppearance.Material3.HeadlineSmall">
<item name="android:textSize">@dimen/text_display</item>
<item name="android:textColor">@color/ev_text_primary</item>
</style>
<style name="Text.EV.Title" parent="TextAppearance.Material3.TitleLarge">
<item name="android:fontFamily">sans-serif-medium</item>
<item name="android:textSize">@dimen/text_title</item>
<item name="android:textColor">@color/ev_text_primary</item>
</style>
@@ -86,11 +92,8 @@
<item name="android:textColor">@color/ev_text_secondary</item>
</style>
<!-- The suite radius applied to buttons. Material3 buttons are fully rounded by
default, which reads as a different design language from every card and dialog
around them. This lived in EVSwipe only, in a generated file, so the first sync
deleted it — one radius across the suite has to be a token, not a local edit. -->
<!-- Rounded corners echo the glass panels without making every button a pill. -->
<style name="ShapeAppearanceOverlay.EV.Button" parent="">
<item name="cornerSize">@dimen/ev_corner</item>
<item name="cornerSize">18dp</item>
</style>
</resources>
+8 -5
View File
@@ -1,13 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- DayNight, not a forced dark theme: the suite follows the vehicle's day/night
setting. Dark is still the mode that matters - a light background filling the
windscreen at night is glare - which is why the light palette was raised to
the same 7:1 floor as the dark one rather than the other way round.
Shared component styles live in styles_ev.xml. -->
<!-- User-requested OLED theme. MainActivity fixes night mode for system widgets too. -->
<style name="Theme.EVABRPUploader" parent="Theme.Material3.DayNight.NoActionBar">
<item name="colorPrimary">@color/ev_accent</item>
<item name="colorSecondary">@color/ev_cyan</item>
<item name="colorControlActivated">@color/ev_cyan</item>
<item name="android:fontFamily">sans-serif</item>
<item name="android:windowLightStatusBar">false</item>
<item name="android:windowLightNavigationBar">false</item>
<item name="android:navigationBarColor">@color/ev_background</item>
<item name="android:forceDarkAllowed" tools:targetApi="q">false</item>
<item name="colorOnPrimary">@color/ev_on_accent</item>
<item name="colorSurface">@color/ev_surface</item>
<item name="colorSurfaceContainer">@color/ev_surface_raised</item>