From c44722bf1242442816fd619299dd40c95a0afced Mon Sep 17 00:00:00 2001 From: TCFDONMEZ Date: Wed, 30 Sep 2026 12:12:25 +0300 Subject: [PATCH] Retain four months of selectable daily consumption --- FatihsMG4-unstable-2.2.25.apk.sha256 | 1 - FatihsMG4-unstable-2.2.27.apk.sha256 | 1 + app/build.gradle | 4 +-- .../com/evsuite/abrp/ConsumptionTracker.java | 24 +++++++++++++ .../java/com/evsuite/abrp/MainActivity.java | 34 ++++++++++++++++++- app/src/main/res/layout/pane_consumption.xml | 5 +++ 6 files changed, 65 insertions(+), 4 deletions(-) delete mode 100644 FatihsMG4-unstable-2.2.25.apk.sha256 create mode 100644 FatihsMG4-unstable-2.2.27.apk.sha256 diff --git a/FatihsMG4-unstable-2.2.25.apk.sha256 b/FatihsMG4-unstable-2.2.25.apk.sha256 deleted file mode 100644 index 59d3080..0000000 --- a/FatihsMG4-unstable-2.2.25.apk.sha256 +++ /dev/null @@ -1 +0,0 @@ -e16113c3dd3d83492b0807836e01520323e5cc7e5a33a4e2c13b904e0152c2a8 FatihsMG4-unstable-2.2.25.apk diff --git a/FatihsMG4-unstable-2.2.27.apk.sha256 b/FatihsMG4-unstable-2.2.27.apk.sha256 new file mode 100644 index 0000000..f2966a9 --- /dev/null +++ b/FatihsMG4-unstable-2.2.27.apk.sha256 @@ -0,0 +1 @@ +792f5e63d35dd2ffcfd95cad7ad56728c6b74b6063822b17535328a7858341b5 FatihsMG4-unstable-2.2.27.apk diff --git a/app/build.gradle b/app/build.gradle index 7a5aeb9..eda523e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -34,8 +34,8 @@ android { applicationId "com.evsuite.abrp" minSdk 27 targetSdk 36 - versionCode 42 - versionName "2.2.25" + versionCode 44 + versionName "2.2.27" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/java/com/evsuite/abrp/ConsumptionTracker.java b/app/src/main/java/com/evsuite/abrp/ConsumptionTracker.java index a4c3bfa..3ac3008 100644 --- a/app/src/main/java/com/evsuite/abrp/ConsumptionTracker.java +++ b/app/src/main/java/com/evsuite/abrp/ConsumptionTracker.java @@ -55,6 +55,7 @@ final class ConsumptionTracker { SharedPreferences.Editor daily = prefs.edit(); save(daily, dayKey, add(load(dayKey), km, kwh, hours, dsoc)); daily.commit(); + pruneOldDays(); tripA = add(tripA, km, kwh, hours, dsoc); tripB = add(tripB, km, kwh, hours, dsoc); persist(); @@ -95,6 +96,28 @@ final class ConsumptionTracker { return result; } + synchronized Totals totalsForDay(LocalDate date) { + if (date == null || date.isAfter(LocalDate.now()) || date.isBefore(LocalDate.now().minusMonths(4))) + return zero(); + return load("day_" + date); + } + + private void pruneOldDays() { + LocalDate oldest = LocalDate.now().minusMonths(4); + SharedPreferences.Editor editor = null; + for (String key : prefs.getAll().keySet()) { + if (!key.startsWith("day_") || key.length() < 14) continue; + try { + LocalDate date = LocalDate.parse(key.substring(4, 14)); + if (date.isBefore(oldest)) { + if (editor == null) editor = prefs.edit(); + editor.remove(key); + } + } catch (RuntimeException ignored) { } + } + if (editor != null) editor.commit(); + } + /** Preserve anything gathered by 2.2.24 by treating its just-created counter as today. */ private void migrateCalendarCounters() { if (prefs.getBoolean("rolling_days_migrated", false)) return; @@ -103,6 +126,7 @@ final class ConsumptionTracker { if (old.km != 0 || old.kwh != 0 || old.hours != 0 || old.soc != 0) save(e, "day_" + LocalDate.now(), old); e.putBoolean("rolling_days_migrated", true).commit(); + pruneOldDays(); } private Totals load(String key) { return new Totals(bits(key,"km"), bits(key,"kwh"), bits(key,"h"), bits(key,"soc")); } diff --git a/app/src/main/java/com/evsuite/abrp/MainActivity.java b/app/src/main/java/com/evsuite/abrp/MainActivity.java index 85ca75c..eebda48 100644 --- a/app/src/main/java/com/evsuite/abrp/MainActivity.java +++ b/app/src/main/java/com/evsuite/abrp/MainActivity.java @@ -110,8 +110,10 @@ public class MainActivity extends AppCompatActivity { private ConsumptionTracker consumptionTracker; private ConsumptionTracker.Period consumptionPeriod = ConsumptionTracker.Period.LIFETIME; private TextView consumptionDistance, consumptionEnergy, consumptionAverage, - consumptionSpeed, consumptionTime, consumptionSoc; + consumptionSpeed, consumptionTime, consumptionSoc, consumptionDailyHistory; private Button consumptionReset; + private MaterialButton consumptionDateButton; + private java.time.LocalDate selectedConsumptionDate = java.time.LocalDate.now(); private TextView chargeStatus, chargeSoc, chargeVoltage, chargeCurrent, chargePower, chargeEnergy, chargeDuration, chargeCurveTable; private ChargingGraphView chargeGraph; @@ -828,6 +830,10 @@ public class MainActivity extends AppCompatActivity { consumptionSpeed = consumptionPane.findViewById(R.id.consumption_speed); consumptionTime = consumptionPane.findViewById(R.id.consumption_time); consumptionSoc = consumptionPane.findViewById(R.id.consumption_soc); + consumptionDailyHistory = consumptionPane.findViewById(R.id.consumption_daily_history); + consumptionDateButton = consumptionPane.findViewById(R.id.consumption_date_button); + consumptionDateButton.setText(selectedConsumptionDate.toString()); + consumptionDateButton.setOnClickListener(v -> showConsumptionDatePicker()); consumptionReset = consumptionPane.findViewById(R.id.consumption_reset); bindPeriodButton(R.id.consumption_lifetime, ConsumptionTracker.Period.LIFETIME); bindPeriodButton(R.id.consumption_week, ConsumptionTracker.Period.WEEK); @@ -923,6 +929,32 @@ public class MainActivity extends AppCompatActivity { consumptionTime.setText(String.format(java.util.Locale.getDefault(), "%d sa %02d dk", minutes / 60, minutes % 60)); consumptionSoc.setText(String.format(java.util.Locale.getDefault(), "%.1f %%", t.soc)); + ConsumptionTracker.Totals day = consumptionTracker.totalsForDay(selectedConsumptionDate); + if (day.km == 0 && day.kwh == 0 && day.hours == 0 && day.soc == 0) { + consumptionDailyHistory.setText("Bu tarih için kayıt yok"); + } else { + String average = day.km < 0.1 ? "—" : String.format(java.util.Locale.getDefault(), + "%.1f kWh/100 km", day.kwh * 100d / day.km); + long dayMinutes = Math.round(day.hours * 60d); + consumptionDailyHistory.setText(String.format(java.util.Locale.getDefault(), + "Mesafe %.1f km\nEnerji %.2f kWh\nOrtalama %s\nSüre %d sa %02d dk\nSOC farkı %.1f %%", + day.km, day.kwh, average, dayMinutes / 60, dayMinutes % 60, day.soc)); + } + } + + private void showConsumptionDatePicker() { + java.time.LocalDate selected = selectedConsumptionDate; + android.app.DatePickerDialog dialog = new android.app.DatePickerDialog(this, + (view, year, month, day) -> { + selectedConsumptionDate = java.time.LocalDate.of(year, month + 1, day); + consumptionDateButton.setText(selectedConsumptionDate.toString()); + refreshConsumption(); + }, selected.getYear(), selected.getMonthValue() - 1, selected.getDayOfMonth()); + java.time.ZoneId zone = java.time.ZoneId.systemDefault(); + dialog.getDatePicker().setMaxDate(System.currentTimeMillis()); + dialog.getDatePicker().setMinDate(java.time.LocalDate.now().minusMonths(4) + .atStartOfDay(zone).toInstant().toEpochMilli()); + dialog.show(); } /** diff --git a/app/src/main/res/layout/pane_consumption.xml b/app/src/main/res/layout/pane_consumption.xml index b926218..6555cff 100644 --- a/app/src/main/res/layout/pane_consumption.xml +++ b/app/src/main/res/layout/pane_consumption.xml @@ -23,5 +23,10 @@ + + + + +