diff options
| author | Tanuj <thetanuj@hotmail.com> | 2026-03-12 14:55:15 +0530 |
|---|---|---|
| committer | Tanuj <thetanuj@hotmail.com> | 2026-03-12 14:55:15 +0530 |
| commit | 97c83970679132e232d04377b9fe922d6c4566b7 (patch) | |
| tree | 5b3d9318b3591f2c24ce16ce881473e16f1e8c8c | |
| parent | d57f72805b8a87d0df16218e83c16b9292d89786 (diff) | |
| download | SidePhOnelauncher-97c83970679132e232d04377b9fe922d6c4566b7.tar.gz SidePhOnelauncher-97c83970679132e232d04377b9fe922d6c4566b7.tar.bz2 SidePhOnelauncher-97c83970679132e232d04377b9fe922d6c4566b7.zip | |
Potential fix for occasionally wrong screen time
| -rw-r--r-- | app/src/main/java/app/olauncher/helper/usageStats/EventLogWrapper.kt | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/app/src/main/java/app/olauncher/helper/usageStats/EventLogWrapper.kt b/app/src/main/java/app/olauncher/helper/usageStats/EventLogWrapper.kt index 18be5bf..15eccfa 100644 --- a/app/src/main/java/app/olauncher/helper/usageStats/EventLogWrapper.kt +++ b/app/src/main/java/app/olauncher/helper/usageStats/EventLogWrapper.kt @@ -272,10 +272,12 @@ class EventLogWrapper(private val context: Context) { ): List<SimpleUsageStat> { if (foregroundStats.isEmpty()) return emptyList() - // Group by package name and sum the duration for each + // Group by package name, merge overlapping intervals, then sum durations val applicationTotalTime = foregroundStats .groupBy { it.packageName } - .mapValues { (_, stats) -> stats.sumOf { it.endTime - it.beginTime } } + .mapValues { (_, stats) -> + mergeOverlappingIntervals(stats).sumOf { it.endTime - it.beginTime } + } val firstBeginTime = foregroundStats.first().beginTime val timeZoneOffset = Calendar.getInstance().timeZone.getOffset(firstBeginTime) @@ -353,6 +355,36 @@ class EventLogWrapper(private val context: Context) { return usageStats.sumOf { it.timeUsed } } /** + * Merges overlapping or adjacent time intervals to prevent double-counting + * when multiple components of the same package have overlapping foreground times. + */ + private fun mergeOverlappingIntervals( + stats: List<ComponentForegroundStat> + ): List<ComponentForegroundStat> { + if (stats.size <= 1) return stats + + val sorted = stats.sortedBy { it.beginTime } + val merged = mutableListOf<ComponentForegroundStat>() + var current = sorted[0] + + for (i in 1 until sorted.size) { + val next = sorted[i] + if (next.beginTime <= current.endTime) { + current = ComponentForegroundStat( + current.beginTime, + max(current.endTime, next.endTime), + current.packageName + ) + } else { + merged.add(current) + current = next + } + } + merged.add(current) + return merged + } + + /** * Stores a class name and its corresponding package. */ private data class AppClass(val packageName: String, val className: String?) |
