App 2.17.0: speed average, compact top bar, About in Settings

- "Speed, 5-min average" card under Speed: time-weighted mean speed,
  standing included, from the same samples as the other averages.
- The top bar is one compact line (title and subtitle side by side).
  Version, update check and About moved from it to an App card on the
  Settings tab.
- The Overview no longer scrolls in the car's window: checked on the
  emulator at 1778x640, the layout height the car reports, after
  trimming the page's padding and the tyre card's height.
- The capacity hint says "Overview" instead of "Vehicle tab".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QLJfZQZeAKAwSqViTmLzki
This commit is contained in:
2026-10-18 20:26:02 +02:00
co-authored by Claude Opus 5.5
parent 79bcfa05f6
commit 8d3eb80f66
13 changed files with 93 additions and 29 deletions
@@ -94,7 +94,8 @@ public class MainActivity extends AppCompatActivity {
vehTireFl, vehTireFr, vehTireRl, vehTireRr,
vehRangeTrip, vehRangeTripNote, vehRangeAverage, vehRangeAverageNote,
vehUsageTrip, vehUsageTripNote, vehUsageAverage, vehUsageAverageNote,
vehEnergyTrip, vehEnergyTripNote, vehPowerAverage, vehPowerAverageNote;
vehEnergyTrip, vehEnergyTripNote, vehPowerAverage, vehPowerAverageNote,
vehSpeedAverage, vehSpeedAverageNote;
/** Usable pack capacity for the range estimates; the car does not publish it. */
static final String USABLE_KWH_KEY = "usable_kwh";
@@ -233,7 +234,6 @@ public class MainActivity extends AppCompatActivity {
getTheme().applyStyle(AccentColor.fromPref(prefs.getString(AccentColor.PREF_KEY, null)).overlay, true);
setContentView(R.layout.activity_main);
((TextView) findViewById(R.id.version_badge)).setText("v" + BuildConfig.VERSION_NAME);
// The pages are inflated here, once, and handed to the pager as fixed,
@@ -277,8 +277,10 @@ public class MainActivity extends AppCompatActivity {
if (savedInstanceState != null) {
((ViewPager2) findViewById(R.id.content)).setCurrentItem(savedInstanceState.getInt(STATE_PAGE, 0), false);
}
findViewById(R.id.about_button).setOnClickListener(v -> showAbout());
findViewById(R.id.update_button).setOnClickListener(v -> checkForUpdate(v));
((TextView) settingsPane.findViewById(R.id.settings_version))
.setText(getString(R.string.settings_version, BuildConfig.VERSION_NAME));
settingsPane.findViewById(R.id.settings_about_button).setOnClickListener(v -> showAbout());
settingsPane.findViewById(R.id.settings_update_button).setOnClickListener(v -> checkForUpdate(v));
// Unstable builds check for a newer pre-release; the stable flavor's UpdateHook is
// a no-op and does not even contain the updater.
@@ -1288,6 +1290,8 @@ public class MainActivity extends AppCompatActivity {
vehEnergyTripNote = vehiclePane.findViewById(R.id.vehicle_energy_trip_note);
vehPowerAverage = vehiclePane.findViewById(R.id.vehicle_power_average);
vehPowerAverageNote = vehiclePane.findViewById(R.id.vehicle_power_average_note);
vehSpeedAverage = vehiclePane.findViewById(R.id.vehicle_speed_average);
vehSpeedAverageNote = vehiclePane.findViewById(R.id.vehicle_speed_average_note);
}
private double usableKwh() {
@@ -1308,6 +1312,9 @@ public class MainActivity extends AppCompatActivity {
Double power = estimator.averagePowerKw(monotonicMs);
vehPowerAverage.setText(power == null ? "—" : getString(R.string.power_kw, power));
vehPowerAverageNote.setText(power == null ? R.string.power_waiting : R.string.usage_last_5_min);
Double speed = estimator.averageSpeedKmh(monotonicMs);
vehSpeedAverage.setText(speed == null ? "—" : getString(R.string.speed_kmh, speed));
vehSpeedAverageNote.setText(speed == null ? R.string.power_waiting : R.string.usage_last_5_min);
Double energy = estimator.energySinceStart();
vehEnergyTrip.setText(energy == null ? "—" : getString(R.string.energy_kwh, energy));
vehEnergyTripNote.setText(energy == null ? R.string.energy_trip_waiting : R.string.energy_trip_note);