summaryrefslogtreecommitdiff
path: root/android-app/app/src/main/res/layout
diff options
context:
space:
mode:
authorClaude <noreply@anthropic.com>2026-05-20 10:06:14 +0000
committerClaude <noreply@anthropic.com>2026-05-20 10:06:14 +0000
commit3793c919f14d8ae8d8814fde37786418a3dfdae4 (patch)
tree2e789c4975df2bc1ac5791c86c53bc6ba9d94e6b /android-app/app/src/main/res/layout
parentddae982f561e1f812d55b5943f79dc76144d93d3 (diff)
Inline saved tracks on Log tab; collapse log entry when not recording
Removed the 'Saved Tracks' button that opened a separate overlay. Tracks now appear directly on the Log screen in a RecyclerView below the Generate Trip Report button. Tapping a track hides the overlay and opens the existing TrackDetailSheet bottom sheet over the map. The log entry section (text field, mic, camera, save/clear) is hidden with visibility=gone when not recording and shown when a recording is in progress. The storage-setup prompt is now surfaced here too. SavedTrackAdapter and DATE_FMT widened to internal so VoiceLogFragment can reuse them directly. SavedTracksFragment kept for the GPX import flow. https://claude.ai/code/session_01YUbuZNDAoLea4cf9UGQ9qn
Diffstat (limited to 'android-app/app/src/main/res/layout')
-rw-r--r--android-app/app/src/main/res/layout/fragment_voice_log.xml350
1 files changed, 203 insertions, 147 deletions
diff --git a/android-app/app/src/main/res/layout/fragment_voice_log.xml b/android-app/app/src/main/res/layout/fragment_voice_log.xml
index 16c3574..389add1 100644
--- a/android-app/app/src/main/res/layout/fragment_voice_log.xml
+++ b/android-app/app/src/main/res/layout/fragment_voice_log.xml
@@ -1,165 +1,221 @@
<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.core.widget.NestedScrollView
+ xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:padding="20dp">
+ android:layout_height="match_parent">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Log Entry"
- android:textAppearance="?attr/textAppearanceHeadlineSmall"
- android:layout_marginBottom="16dp" />
-
- <!-- Note text — voice fills this; user can also type directly -->
- <com.google.android.material.textfield.TextInputLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="12dp"
- style="@style/Widget.Material3.TextInputLayout.OutlinedBox">
-
- <com.google.android.material.textfield.TextInputEditText
- android:id="@+id/et_note"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:minLines="3"
- android:maxLines="6"
- android:gravity="top"
- android:hint="Tap mic or type a note…"
- android:inputType="textMultiLine|textCapSentences"
- android:scrollbars="vertical" />
-
- </com.google.android.material.textfield.TextInputLayout>
-
- <!-- Action row: mic, camera, gallery, status -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:gravity="center_vertical"
- android:layout_marginBottom="12dp">
+ android:orientation="vertical"
+ android:padding="20dp">
- <com.google.android.material.floatingactionbutton.FloatingActionButton
- android:id="@+id/fab_mic"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- app:fabSize="mini"
- android:src="@android:drawable/ic_btn_speak_now"
- android:contentDescription="Start voice recognition"
- android:layout_marginEnd="12dp" />
-
- <com.google.android.material.button.MaterialButton
- android:id="@+id/btn_camera"
- style="@style/Widget.Material3.Button.IconButton.Outlined"
- android:layout_width="wrap_content"
+ <!-- ── Log entry section — visible only while recording ── -->
+ <LinearLayout
+ android:id="@+id/layout_log_entry"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:contentDescription="Take photo"
- app:icon="@android:drawable/ic_menu_camera"
- android:layout_marginEnd="8dp" />
-
+ android:orientation="vertical"
+ android:visibility="gone">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Log Entry"
+ android:textAppearance="?attr/textAppearanceHeadlineSmall"
+ android:layout_marginBottom="16dp" />
+
+ <com.google.android.material.textfield.TextInputLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="12dp"
+ style="@style/Widget.Material3.TextInputLayout.OutlinedBox">
+
+ <com.google.android.material.textfield.TextInputEditText
+ android:id="@+id/et_note"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minLines="3"
+ android:maxLines="6"
+ android:gravity="top"
+ android:hint="Tap mic or type a note…"
+ android:inputType="textMultiLine|textCapSentences"
+ android:scrollbars="vertical" />
+
+ </com.google.android.material.textfield.TextInputLayout>
+
+ <!-- Action row: mic, camera, gallery, status -->
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:gravity="center_vertical"
+ android:layout_marginBottom="12dp">
+
+ <com.google.android.material.floatingactionbutton.FloatingActionButton
+ android:id="@+id/fab_mic"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ app:fabSize="mini"
+ android:src="@android:drawable/ic_btn_speak_now"
+ android:contentDescription="Start voice recognition"
+ android:layout_marginEnd="12dp" />
+
+ <com.google.android.material.button.MaterialButton
+ android:id="@+id/btn_camera"
+ style="@style/Widget.Material3.Button.IconButton.Outlined"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:contentDescription="Take photo"
+ app:icon="@android:drawable/ic_menu_camera"
+ android:layout_marginEnd="8dp" />
+
+ <com.google.android.material.button.MaterialButton
+ android:id="@+id/btn_gallery"
+ style="@style/Widget.Material3.Button.IconButton.Outlined"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:contentDescription="Attach photo from gallery"
+ app:icon="@android:drawable/ic_menu_gallery"
+ android:layout_marginEnd="12dp" />
+
+ <TextView
+ android:id="@+id/tv_status"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text=""
+ android:textSize="14sp"
+ android:textColor="?attr/colorOnSurfaceVariant" />
+
+ </LinearLayout>
+
+ <!-- Photo thumbnail — hidden until a photo is attached -->
+ <FrameLayout
+ android:id="@+id/frame_photo"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="12dp"
+ android:visibility="gone">
+
+ <ImageView
+ android:id="@+id/iv_photo"
+ android:layout_width="120dp"
+ android:layout_height="90dp"
+ android:scaleType="centerCrop"
+ android:contentDescription="Attached photo" />
+
+ <com.google.android.material.button.MaterialButton
+ android:id="@+id/btn_remove_photo"
+ style="@style/Widget.Material3.Button.IconButton"
+ android:layout_width="32dp"
+ android:layout_height="32dp"
+ android:layout_gravity="top|end"
+ android:contentDescription="Remove photo"
+ app:icon="@drawable/ic_close" />
+
+ </FrameLayout>
+
+ <!-- Save / Clear row -->
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:gravity="center_vertical"
+ android:layout_marginBottom="12dp">
+
+ <com.google.android.material.button.MaterialButton
+ android:id="@+id/btn_save"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="Save"
+ android:layout_marginEnd="8dp" />
+
+ <com.google.android.material.button.MaterialButton
+ android:id="@+id/btn_clear"
+ style="@style/Widget.Material3.Button.TextButton"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Clear" />
+
+ </LinearLayout>
+
+ <TextView
+ android:id="@+id/tv_saved_confirmation"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text=""
+ android:textSize="14sp"
+ android:textColor="?attr/colorPrimary"
+ android:layout_marginBottom="20dp" />
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:background="?attr/colorOutline"
+ android:layout_marginBottom="20dp" />
+
+ </LinearLayout>
+ <!-- end layout_log_entry -->
+
+ <!-- Generate Trip Report — always accessible -->
<com.google.android.material.button.MaterialButton
- android:id="@+id/btn_gallery"
- style="@style/Widget.Material3.Button.IconButton.Outlined"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:contentDescription="Attach photo from gallery"
- app:icon="@android:drawable/ic_menu_gallery"
- android:layout_marginEnd="12dp" />
+ android:id="@+id/btn_generate_report"
+ style="@style/Widget.Material3.Button.TonalButton"
+ android:layout_width="match_parent"
+ android:layout_height="60dp"
+ android:text="GENERATE TRIP REPORT"
+ android:layout_marginBottom="24dp" />
+ <!-- ── Trips section ── -->
<TextView
- android:id="@+id/tv_status"
- android:layout_width="0dp"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text=""
- android:textSize="14sp"
- android:textColor="?attr/colorOnSurfaceVariant" />
-
- </LinearLayout>
-
- <!-- Photo thumbnail — hidden until a photo is attached -->
- <FrameLayout
- android:id="@+id/frame_photo"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginBottom="12dp"
- android:visibility="gone">
-
- <ImageView
- android:id="@+id/iv_photo"
- android:layout_width="120dp"
- android:layout_height="90dp"
- android:scaleType="centerCrop"
- android:contentDescription="Attached photo" />
-
- <com.google.android.material.button.MaterialButton
- android:id="@+id/btn_remove_photo"
- style="@style/Widget.Material3.Button.IconButton"
- android:layout_width="32dp"
- android:layout_height="32dp"
- android:layout_gravity="top|end"
- android:contentDescription="Remove photo"
- app:icon="@drawable/ic_close" />
-
- </FrameLayout>
-
- <!-- Save / Clear row -->
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:gravity="center_vertical"
- android:layout_marginBottom="12dp">
-
- <com.google.android.material.button.MaterialButton
- android:id="@+id/btn_save"
- android:layout_width="0dp"
+ android:text="Trips"
+ android:textSize="13sp"
+ android:textAllCaps="true"
+ android:letterSpacing="0.08"
+ android:textColor="?attr/colorOnSurfaceVariant"
+ android:layout_marginBottom="8dp" />
+
+ <!-- Empty state -->
+ <LinearLayout
+ android:id="@+id/layout_empty"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="Save"
- android:layout_marginEnd="8dp" />
-
- <com.google.android.material.button.MaterialButton
- android:id="@+id/btn_clear"
- style="@style/Widget.Material3.Button.TextButton"
- android:layout_width="wrap_content"
+ android:orientation="vertical"
+ android:gravity="center_horizontal"
+ android:paddingVertical="24dp"
+ android:visibility="gone">
+
+ <TextView
+ android:id="@+id/tv_empty"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="No saved tracks yet.\nRecord a trip to see it here."
+ android:textAlignment="center"
+ android:textColor="?attr/colorOnSurfaceVariant" />
+
+ <com.google.android.material.button.MaterialButton
+ android:id="@+id/btn_setup_storage"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="16dp"
+ android:text="Set up track storage"
+ android:visibility="gone" />
+
+ </LinearLayout>
+
+ <androidx.recyclerview.widget.RecyclerView
+ android:id="@+id/rv_saved_tracks"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="Clear" />
+ android:nestedScrollingEnabled="false"
+ android:clipToPadding="false"
+ android:paddingBottom="80dp" />
</LinearLayout>
- <!-- Saved confirmation -->
- <TextView
- android:id="@+id/tv_saved_confirmation"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text=""
- android:textSize="14sp"
- android:textColor="?attr/colorPrimary"
- android:layout_marginBottom="24dp" />
-
- <View
- android:layout_width="match_parent"
- android:layout_height="1dp"
- android:background="?attr/colorOutline"
- android:layout_marginBottom="24dp" />
-
- <com.google.android.material.button.MaterialButton
- android:id="@+id/btn_generate_report"
- style="@style/Widget.Material3.Button.TonalButton"
- android:layout_width="match_parent"
- android:layout_height="60dp"
- android:text="GENERATE TRIP REPORT" />
-
- <com.google.android.material.button.MaterialButton
- android:id="@+id/btn_saved_tracks"
- style="@style/Widget.Material3.Button.OutlinedButton"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="12dp"
- android:text="Saved Tracks"
- android:textAllCaps="false" />
-
-</LinearLayout>
+</androidx.core.widget.NestedScrollView>