Retain four months of selectable daily consumption
This commit is contained in:
@@ -1 +0,0 @@
|
||||
e16113c3dd3d83492b0807836e01520323e5cc7e5a33a4e2c13b904e0152c2a8 FatihsMG4-unstable-2.2.25.apk
|
||||
@@ -0,0 +1 @@
|
||||
792f5e63d35dd2ffcfd95cad7ad56728c6b74b6063822b17535328a7858341b5 FatihsMG4-unstable-2.2.27.apk
|
||||
+2
-2
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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")); }
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -23,5 +23,10 @@
|
||||
<com.google.android.material.button.MaterialButton android:id="@+id/consumption_reset" style="@style/Widget.EV.Button.Outlined" android:layout_width="match_parent" android:layout_height="64dp" android:layout_marginTop="12dp" android:text="Seçili tripi sıfırla" android:visibility="gone"/>
|
||||
</LinearLayout>
|
||||
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="12dp" android:text="Son 7/30 gün, tüm zamanlar ve Trip A/B cihazda kalıcı saklanır; uygulama ve OTA güncellemeleriyle silinmez." android:textAppearance="@style/Text.EV.Secondary"/>
|
||||
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="20dp" android:layout_marginTop="16dp" android:background="@drawable/bg_glass">
|
||||
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="GÜNLÜK KAYIT · SON 4 AY" android:textAppearance="@style/Text.EV.Eyebrow"/>
|
||||
<com.google.android.material.button.MaterialButton android:id="@+id/consumption_date_button" style="@style/Widget.EV.Button.Outlined" android:layout_width="match_parent" android:layout_height="56dp" android:layout_marginTop="12dp" android:text="Tarih seç"/>
|
||||
<TextView android:id="@+id/consumption_daily_history" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="12dp" android:fontFamily="monospace" android:text="Henüz günlük veri yok" android:textAppearance="@style/Text.EV.Body" android:textColor="@color/ev_cyan"/>
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
</ScrollView>
|
||||
|
||||
Reference in New Issue
Block a user