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 @@
+
+
+
+
+