From ec841f9e13338fb25429a1c0aa8f2203d72d77c5 Mon Sep 17 00:00:00 2001 From: Tomek Zebrowski Date: Fri, 24 Apr 2026 22:50:32 +0200 Subject: [PATCH 1/2] fix(ui): resolve layout truncation issues in status panel header --- app/build.gradle | 4 ++-- app/src/main/res/layout/activity_main.xml | 22 ++++++++++++++++------ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index f535ce86..c031f687 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -81,7 +81,7 @@ android { resValue "string", "DEFAULT_PROFILE", "profile_8" resValue "string", "applicationId", "org.obd.graphs.my.giulia.aa" applicationId "org.obd.graphs.my.giulia.aa" - versionCode 221 + versionCode 222 } giuliaPerformanceMonitor { @@ -89,7 +89,7 @@ android { resValue "string", "DEFAULT_PROFILE", "profile_8" resValue "string", "applicationId", "org.obd.graphs.my.giulia.performance_monitor" applicationId "org.obd.graphs.my.giulia.performance_monitor" - versionCode 102 + versionCode 103 } giulia { diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index d4839d86..d6ba3006 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -37,6 +37,8 @@ android:textColor="@color/white" android:textSize="12sp" app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toStartOf="@+id/vehicle_profile" + app:layout_constraintHorizontal_bias="0.0" app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintStart_toEndOf="@id/connection_status" + app:layout_constraintEnd_toStartOf="@+id/vehicle_status" /> + app:layout_constraintStart_toEndOf="@id/vehicle_profile" + app:layout_constraintEnd_toStartOf="@+id/timer" /> + app:layout_constraintStart_toEndOf="@id/vehicle_status" + app:layout_constraintEnd_toStartOf="@id/toggle_fullscreen" /> Date: Sun, 26 Apr 2026 10:29:56 +0200 Subject: [PATCH 2/2] feat: extract StatusPanel component and fix header truncation --- .../org/obd/graphs/activity/MainActivity.kt | 6 + .../java/org/obd/graphs/activity/Receivers.kt | 20 +-- .../org/obd/graphs/activity/StatusPanel.kt | 123 +++++++++--------- app/src/main/res/layout/activity_main.xml | 8 +- 4 files changed, 82 insertions(+), 75 deletions(-) diff --git a/app/src/main/java/org/obd/graphs/activity/MainActivity.kt b/app/src/main/java/org/obd/graphs/activity/MainActivity.kt index 9c42b85e..17193e03 100644 --- a/app/src/main/java/org/obd/graphs/activity/MainActivity.kt +++ b/app/src/main/java/org/obd/graphs/activity/MainActivity.kt @@ -68,6 +68,7 @@ class MainActivity : AppCompatActivity(), EasyPermissions.PermissionCallbacks { + internal lateinit var statusPanel: StatusPanel internal val screenLockManager = ScreenLockManager(this) internal lateinit var backupManager: BackupManager @@ -142,6 +143,11 @@ class MainActivity : isAppReady = true } + private fun setupStatusPanel() { + statusPanel = StatusPanel(this) + statusPanel.setup() + } + private fun setupFabButtons() { FabButtons.setupSpeedDialView(this) diff --git a/app/src/main/java/org/obd/graphs/activity/Receivers.kt b/app/src/main/java/org/obd/graphs/activity/Receivers.kt index 59c99c61..456623ab 100644 --- a/app/src/main/java/org/obd/graphs/activity/Receivers.kt +++ b/app/src/main/java/org/obd/graphs/activity/Receivers.kt @@ -222,11 +222,11 @@ internal fun MainActivity.receive(intent: Intent?) { TOOLBAR_SHOW -> Toolbar.hide(this, false) TOOLBAR_TOGGLE_ACTION -> Toolbar.toggle(this) - PROFILE_NAME_CHANGED_EVENT -> updateVehicleProfile() + PROFILE_NAME_CHANGED_EVENT -> statusPanel.updateVehicleProfile() PROFILE_CHANGED_EVENT -> { - updateVehicleProfile() - updateAdapterConnectionType() + statusPanel.updateVehicleProfile() + statusPanel.updateAdapterConnectionType() toggleNavigationItem(GIULIA_VIEW_ID, R.id.nav_giulia) toggleNavigationItem(GRAPH_VIEW_ID, R.id.nav_graph) @@ -276,7 +276,7 @@ internal fun MainActivity.receive(intent: Intent?) { } } - PREFS_CONNECTION_TYPE_CHANGED_EVENT -> updateAdapterConnectionType() + PREFS_CONNECTION_TYPE_CHANGED_EVENT -> statusPanel.updateAdapterConnectionType() DATA_LOGGER_NO_NETWORK_EVENT -> { toast(org.obd.graphs.commons.R.string.main_activity_toast_connection_no_network) @@ -301,7 +301,7 @@ internal fun MainActivity.receive(intent: Intent?) { } Toolbar.hide(this, true) - updateAdapterConnectionType() + statusPanel.updateAdapterConnectionType() } DATA_LOGGER_STOPPED_EVENT -> { @@ -314,13 +314,13 @@ internal fun MainActivity.receive(intent: Intent?) { handleStop() } - EVENT_VEHICLE_STATUS_VEHICLE_RUNNING -> updateVehicleStatus("Running") - EVENT_VEHICLE_STATUS_VEHICLE_IDLING -> updateVehicleStatus("Idling") - EVENT_VEHICLE_STATUS_IGNITION_ON -> updateVehicleStatus("Key on") - EVENT_VEHICLE_STATUS_CHANGED -> updateVehicleStatus("") + EVENT_VEHICLE_STATUS_VEHICLE_RUNNING -> statusPanel.updateVehicleStatus("Running") + EVENT_VEHICLE_STATUS_VEHICLE_IDLING -> statusPanel.updateVehicleStatus("Idling") + EVENT_VEHICLE_STATUS_IGNITION_ON -> statusPanel.updateVehicleStatus("Key on") + EVENT_VEHICLE_STATUS_CHANGED -> statusPanel.updateVehicleStatus("") EVENT_VEHICLE_STATUS_IGNITION_OFF -> { - updateVehicleStatus("Key off") + statusPanel.updateVehicleStatus("Key off") if (dataLoggerSettings.instance().vehicleStatusDisconnectWhenOff) { Log.i(LOG_TAG, "Received vehicle status OFF event. Closing the session.") withDataLogger { diff --git a/app/src/main/java/org/obd/graphs/activity/StatusPanel.kt b/app/src/main/java/org/obd/graphs/activity/StatusPanel.kt index de7e81bb..d520dcac 100644 --- a/app/src/main/java/org/obd/graphs/activity/StatusPanel.kt +++ b/app/src/main/java/org/obd/graphs/activity/StatusPanel.kt @@ -16,7 +16,6 @@ */ package org.obd.graphs.activity -import android.annotation.SuppressLint import android.graphics.Color import android.widget.ImageView import android.widget.TextView @@ -27,77 +26,83 @@ import org.obd.graphs.profile.profile import org.obd.graphs.sendBroadcastEvent import org.obd.graphs.ui.common.* - -internal fun MainActivity.updateVehicleStatus(status: String) { - - updateTextField( - R.id.vehicle_status, - resources.getString(R.string.status_panel_vehicle_status), - status, - COLOR_CARDINAL, - 1.0f - ){ - it.isGone = !dataLoggerSettings.instance().vehicleStatusPanelEnabled +class StatusPanel(private val activity: MainActivity) { + companion object { + private const val MAX_PROFILE_NAME_LENGTH = 15 + private const val TEXT_SIZE_PRIMARY = 1.0f + private const val TEXT_SIZE_SECONDARY = 0.7f } -} - -internal fun MainActivity.updateAdapterConnectionType() { - updateTextField( - R.id.connection_status, - resources.getString(R.string.status_panel_adapter_connection_type), - dataLoggerSettings.instance().adapter.connectionType, - COLOR_PHILIPPINE_GREEN, - 1.0f - ) -} -internal fun MainActivity.setupStatusPanel() { - updateAdapterConnectionType() - updateVehicleProfile() - updateVehicleStatus("") + fun setup() { + updateAdapterConnectionType() + updateVehicleProfile() + updateVehicleStatus("") - (findViewById(R.id.connection_status)).let { - it.setOnClickListener { + activity.findViewById(R.id.connection_status)?.setOnClickListener { navigateToPreferencesScreen("pref.adapter.connection") } - } - (findViewById(R.id.vehicle_profile)).let { - it.setOnClickListener { + activity.findViewById(R.id.vehicle_profile)?.setOnClickListener { navigateToPreferencesScreen("pref.profiles") } + + activity.findViewById(R.id.toggle_fullscreen)?.setOnClickListener { + sendBroadcastEvent(TOOLBAR_TOGGLE_ACTION) + } } - (findViewById(R.id.toggle_fullscreen)).let { - it.setOnClickListener { - sendBroadcastEvent(TOOLBAR_TOGGLE_ACTION) + fun updateVehicleStatus(status: String) { + updateTextField( + R.id.vehicle_status, + activity.getString(R.string.status_panel_vehicle_status), + status, + COLOR_CARDINAL, + TEXT_SIZE_PRIMARY + ) { + it.isGone = !dataLoggerSettings.instance().vehicleStatusPanelEnabled } } -} -internal fun MainActivity.updateVehicleProfile() { - updateTextField( - R.id.vehicle_profile, - resources.getString(R.string.status_panel_vehicle_profile), - profile.getCurrentProfileName(), - COLOR_RAINBOW_INDIGO, - 1.0f - ) -} + fun updateVehicleProfile() { + val fullProfileName = profile.getCurrentProfileName() + var displayName = fullProfileName.substringBefore("(").trim() + + if (displayName.length > MAX_PROFILE_NAME_LENGTH) { + displayName = displayName.substring(0, MAX_PROFILE_NAME_LENGTH).trimEnd() + "..." + } + + updateTextField( + R.id.vehicle_profile, + activity.getString(R.string.status_panel_vehicle_profile), + displayName, + COLOR_RAINBOW_INDIGO, + TEXT_SIZE_PRIMARY + ) + } + + fun updateAdapterConnectionType() { + updateTextField( + R.id.connection_status, + activity.getString(R.string.status_panel_adapter_connection_type), + dataLoggerSettings.instance().adapter.connectionType, + COLOR_PHILIPPINE_GREEN, + TEXT_SIZE_PRIMARY + ) + } -@SuppressLint("SetTextI18n") -private fun MainActivity.updateTextField( - viewId: Int, - text1: String, - text2: String, - color: Int, - text2Size: Float, - func: (p: TextView) -> Unit = {} -) { - (findViewById(viewId)).let { - func(it) - it.text = "$text1 $text2" - it.highLightText(text1, 0.7f, Color.WHITE) - it.highLightText(text2, text2Size, color) + private fun updateTextField( + viewId: Int, + text1: String, + text2: String, + color: Int, + text2Size: Float, + func: (p: TextView) -> Unit = {} + ) { + activity.findViewById(viewId)?.apply { + func(this) + text = "$text1 $text2" + highLightText(text1, TEXT_SIZE_SECONDARY, Color.WHITE) + highLightText(text2, text2Size, color) + } } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index d6ba3006..dea5adf1 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -36,9 +36,10 @@ android:text="@string/status_panel.adapter_connection_type" android:textColor="@color/white" android:textSize="12sp" + app:layout_constraintHorizontal_chainStyle="packed" + app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@+id/vehicle_profile" - app:layout_constraintHorizontal_bias="0.0" app:layout_constraintTop_toTopOf="parent" /> @@ -67,8 +67,6 @@ android:text="@string/status_panel.vehicle_status" android:textColor="@color/white" android:textSize="12sp" - app:layout_constrainedWidth="true" - app:layout_constraintHorizontal_bias="0.0" app:layout_constraintBaseline_toBaselineOf="@id/connection_status" app:layout_constraintStart_toEndOf="@id/vehicle_profile" app:layout_constraintEnd_toStartOf="@+id/timer" /> @@ -81,7 +79,6 @@ android:padding="2dp" android:textColor="@color/white" android:textSize="12sp" - app:layout_constraintHorizontal_bias="0.0" app:layout_constraintBaseline_toBaselineOf="@id/connection_status" app:layout_constraintStart_toEndOf="@id/vehicle_status" app:layout_constraintEnd_toStartOf="@id/toggle_fullscreen" /> @@ -178,7 +175,6 @@ app:layout_behavior="com.google.android.material.behavior.HideBottomViewOnScrollBehavior" tools:ignore="ContentDescription" /> -