summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTanuj <thetanuj@hotmail.com>2026-03-12 14:55:15 +0530
committerTanuj <thetanuj@hotmail.com>2026-03-12 14:55:15 +0530
commit97c83970679132e232d04377b9fe922d6c4566b7 (patch)
tree5b3d9318b3591f2c24ce16ce881473e16f1e8c8c
parentd57f72805b8a87d0df16218e83c16b9292d89786 (diff)
downloadSidePhOnelauncher-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.kt36
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?)