diff --git a/SPECS.md b/SPECS.md
index 410abca..85c5a6f 100644
--- a/SPECS.md
+++ b/SPECS.md
@@ -112,8 +112,11 @@ tyre pressures, GPS (lat, lon, elevation, heading) and the is_* flags. It does *
INGEST_TOKEN) into git and pushed it. Commit amended and force-pushed; both values regenerated in
the now gitignored `k8s/secrets.yaml` (since moved to `k8s/secrets/secrets.yaml`, outside
`kubectl apply -f k8s/`). Filled-in secrets live only there from now on.
+- 2026-10-18 — App 2.16.4: drop-downs again, as Material exposed dropdown menus: their list leaves
+ the focus with the activity, so full screen stays (a Spinner's list is a focusable window of its
+ own without the full-screen flags). 2.16.3 had replaced them with buttons.
- 2026-10-18 — App 2.16.3: full screen stays while choosing or reading a dialog. Drop-downs (upload
- frequency, tyre unit, accent colour) are now buttons on the page: a drop-down is a window of its
+ frequency, tyre unit, accent colour) became buttons on the page: a drop-down is a window of its
own without the full-screen flags, so the car showed its bars while it was open. Dialogs are
shown unfocusable, given the activity's full-screen flags, then allowed focus
(`showKeepingFullScreen`); none of them takes typing.
diff --git a/app/build.gradle b/app/build.gradle
index baed5bc..cb04d10 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -34,8 +34,8 @@ android {
applicationId "com.stinnesbeck.nilsmg4"
minSdk 27
targetSdk 36
- versionCode 87
- versionName "2.16.3"
+ versionCode 88
+ versionName "2.16.4"
// Nothing about the server ships in the APK: its URL and ingest token are entered in
// the app's Server tab (ServerConfig), and the database is only reachable by the server.
diff --git a/app/src/main/java/com/evsuite/abrp/MainActivity.java b/app/src/main/java/com/evsuite/abrp/MainActivity.java
index eb48a7b..3ddcdf4 100644
--- a/app/src/main/java/com/evsuite/abrp/MainActivity.java
+++ b/app/src/main/java/com/evsuite/abrp/MainActivity.java
@@ -126,7 +126,7 @@ public class MainActivity extends AppCompatActivity {
/** Upload page: live telemetry switch and cadence. */
private SwitchMaterial liveTelemetrySwitch, boostSwitch, voiceKeySwitch, fullScreenSwitch;
private TextView steeringKeysText;
- private com.google.android.material.chip.ChipGroup intervalChoices;
+ private com.google.android.material.textfield.MaterialAutoCompleteTextView intervalChoices;
private TextInputLayout lowSocLayout;
private TextInputEditText lowSocInput;
@@ -1126,28 +1126,18 @@ public class MainActivity extends AppCompatActivity {
}
/**
- * A single choice as buttons on the page (choice_chip.xml), in place of a drop-down: a
- * drop-down opens a window of its own that is not full screen, and the car's bars came back
- * while it was open. Rebinding replaces the buttons, so it may be called again.
+ * A single choice as a drop-down (Widget.EV.Dropdown). An exposed dropdown menu rather than
+ * a Spinner: a Spinner's list is a focusable window of its own without the full-screen
+ * flags, and the car showed its bars while it was open; this list leaves the focus with
+ * the activity. setSimpleItems keeps every option listed (a plain adapter would filter the
+ * list down to the current text). Rebinding is safe.
*/
- private void bindChoices(com.google.android.material.chip.ChipGroup group, String[] labels, int selected,
- java.util.function.IntConsumer onPick) {
- group.setOnCheckedStateChangeListener(null);
- group.removeAllViews();
- for (int i = 0; i < labels.length; i++) {
- com.google.android.material.chip.Chip chip = (com.google.android.material.chip.Chip)
- getLayoutInflater().inflate(R.layout.choice_chip, group, false);
- chip.setId(View.generateViewId());
- chip.setText(labels[i]);
- chip.setTag(i);
- group.addView(chip);
- if (i == selected) chip.setChecked(true);
- }
- group.setOnCheckedStateChangeListener((g, checkedIds) -> {
- if (checkedIds.isEmpty()) return;
- View chosen = g.findViewById(checkedIds.get(0));
- if (chosen != null) onPick.accept((Integer) chosen.getTag());
- });
+ private void bindChoices(com.google.android.material.textfield.MaterialAutoCompleteTextView view,
+ String[] labels, int selected, java.util.function.IntConsumer onPick) {
+ view.setOnItemClickListener(null);
+ view.setSimpleItems(labels);
+ view.setText(labels[selected], false);
+ view.setOnItemClickListener((parent, item, position, id) -> onPick.accept(position));
}
/** The accent colour; a change recreates the activity so every view takes it. */
diff --git a/app/src/main/res/color/choice_background.xml b/app/src/main/res/color/choice_background.xml
deleted file mode 100644
index c941703..0000000
--- a/app/src/main/res/color/choice_background.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/app/src/main/res/color/choice_stroke.xml b/app/src/main/res/color/choice_stroke.xml
deleted file mode 100644
index c0e21ef..0000000
--- a/app/src/main/res/color/choice_stroke.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/app/src/main/res/color/choice_text.xml b/app/src/main/res/color/choice_text.xml
deleted file mode 100644
index 60b46ae..0000000
--- a/app/src/main/res/color/choice_text.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/app/src/main/res/layout-w1000dp/pane_service.xml b/app/src/main/res/layout-w1000dp/pane_service.xml
index bdff841..1298c51 100644
--- a/app/src/main/res/layout-w1000dp/pane_service.xml
+++ b/app/src/main/res/layout-w1000dp/pane_service.xml
@@ -27,7 +27,9 @@
-
+
+
+
diff --git a/app/src/main/res/layout-w1000dp/pane_settings.xml b/app/src/main/res/layout-w1000dp/pane_settings.xml
index a096c71..113c246 100644
--- a/app/src/main/res/layout-w1000dp/pane_settings.xml
+++ b/app/src/main/res/layout-w1000dp/pane_settings.xml
@@ -9,9 +9,13 @@
-
+
+
+
-
+
+
+
diff --git a/app/src/main/res/layout/choice_chip.xml b/app/src/main/res/layout/choice_chip.xml
deleted file mode 100644
index f0f8440..0000000
--- a/app/src/main/res/layout/choice_chip.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
diff --git a/app/src/main/res/layout/dropdown_item.xml b/app/src/main/res/layout/dropdown_item.xml
new file mode 100644
index 0000000..623a16f
--- /dev/null
+++ b/app/src/main/res/layout/dropdown_item.xml
@@ -0,0 +1,13 @@
+
+
+
diff --git a/app/src/main/res/layout/pane_service.xml b/app/src/main/res/layout/pane_service.xml
index d29a516..b53b64f 100644
--- a/app/src/main/res/layout/pane_service.xml
+++ b/app/src/main/res/layout/pane_service.xml
@@ -24,7 +24,9 @@
-
+
+
+
diff --git a/app/src/main/res/layout/pane_settings.xml b/app/src/main/res/layout/pane_settings.xml
index 0a5b350..ced79f4 100644
--- a/app/src/main/res/layout/pane_settings.xml
+++ b/app/src/main/res/layout/pane_settings.xml
@@ -8,9 +8,13 @@
-
+
+
+
-
+
+
+
diff --git a/app/src/main/res/values/styles_app.xml b/app/src/main/res/values/styles_app.xml
index 1b39cf5..7c74ff9 100644
--- a/app/src/main/res/values/styles_app.xml
+++ b/app/src/main/res/values/styles_app.xml
@@ -43,6 +43,19 @@
- @color/ev_text_secondary
- @style/Text.EV.Secondary
+
+
-
-