From 3df88dfc6b51e0b46e2a893a7f913ccac8e0add9 Mon Sep 17 00:00:00 2001 From: Azalea Gui Date: Sun, 29 Jan 2023 13:00:55 -0500 Subject: [PATCH] [M] Move readMiDatabase into MiFitnessModels --- .../org/hydev/wearsync/mi/MiFitnessModels.kt | 56 ++++++++++++++++++- .../test/java/org/hydev/wearsync/SqlTest.kt | 56 +------------------ 2 files changed, 57 insertions(+), 55 deletions(-) diff --git a/app/src/main/java/org/hydev/wearsync/mi/MiFitnessModels.kt b/app/src/main/java/org/hydev/wearsync/mi/MiFitnessModels.kt index 6094f78..051e510 100644 --- a/app/src/main/java/org/hydev/wearsync/mi/MiFitnessModels.kt +++ b/app/src/main/java/org/hydev/wearsync/mi/MiFitnessModels.kt @@ -4,8 +4,13 @@ package org.hydev.wearsync.mi import com.influxdb.annotations.Column import com.influxdb.annotations.Measurement +import com.topjohnwu.superuser.Shell +import org.hydev.wearsync.GSON import org.hydev.wearsync.reflectToString -import org.jetbrains.exposed.sql.Table +import org.jetbrains.exposed.sql.* +import org.jetbrains.exposed.sql.transactions.TransactionManager +import org.jetbrains.exposed.sql.transactions.transaction +import java.sql.Connection import java.time.Instant import java.util.* @@ -53,4 +58,51 @@ data class SleepState( @Column var state: Int, -) \ No newline at end of file +) + +fun readMiDatabase(): Pair, List> +{ + val PATH = "/data/data/com.mi.health/databases/1804898679/cn/fitness_data" + Database.connect("jdbc:sqlite:${PATH}", "org.sqlite.JDBC") + TransactionManager.manager.defaultIsolationLevel = Connection.TRANSACTION_SERIALIZABLE + + val days = transaction { + addLogger(StdOutSqlLogger) + + return@transaction SleepSegment.selectAll().mapNotNull { + val json = it[SleepSegment.value] + when (it[SleepSegment.key]) + { + "watch_night_sleep" -> GSON.fromJson(json, SleepNight::class.java) + "watch_daytime_sleep" -> GSON.fromJson(json, SleepDaytime::class.java) + else -> null + } + } + } + + println(days.filterIsInstance().take(45) + .map { it.bedtime.hours }.map { if (it < 12) it + 24 else it }.average() - 24) + + val rawStates = days.flatMap { it.items }.sortedBy { it.start_time } + + // Awake: 5 + rawStates.filter { it.state == 5 }.forEach { it.state = 0 } + + // Use state 0 to fill between the start-end gaps + var states = mutableListOf() + rawStates.forEachIndexed { i, si -> + states += si + if (i != 0) + { + val last = rawStates[i - 1] + if (last.end_time < si.start_time) states += + SleepState(start_time = last.end_time, end_time = si.start_time, 0) + } + } + states += SleepState(start_time = rawStates.last().end_time, end_time = Instant.now(), 0) + + // Remove duplicates + states = states.filterIndexed { i, si -> i == 0 || si.state != states[i - 1].state }.toMutableList() + + return days to states.toList() +} \ No newline at end of file diff --git a/app/src/test/java/org/hydev/wearsync/SqlTest.kt b/app/src/test/java/org/hydev/wearsync/SqlTest.kt index 4232bc6..8535155 100644 --- a/app/src/test/java/org/hydev/wearsync/SqlTest.kt +++ b/app/src/test/java/org/hydev/wearsync/SqlTest.kt @@ -3,19 +3,7 @@ package org.hydev.wearsync import com.influxdb.client.InfluxDBClientFactory import com.influxdb.client.InfluxDBClientOptions import com.influxdb.client.kotlin.InfluxDBClientKotlinFactory -import org.hydev.wearsync.mi.SleepDaytime -import org.hydev.wearsync.mi.SleepNight -import org.hydev.wearsync.mi.SleepSegment -import org.hydev.wearsync.mi.SleepState -import org.jetbrains.exposed.sql.Database -import org.jetbrains.exposed.sql.StdOutSqlLogger -import org.jetbrains.exposed.sql.addLogger -import org.jetbrains.exposed.sql.selectAll -import org.jetbrains.exposed.sql.transactions.TransactionManager -import org.jetbrains.exposed.sql.transactions.transaction -import java.sql.Connection -import java.time.Instant -import java.util.* +import org.hydev.wearsync.mi.readMiDatabase suspend fun main(args: Array) @@ -24,51 +12,13 @@ suspend fun main(args: Array) val opts = InfluxDBClientOptions.builder() .url("https://influx.hydev.org") - .authenticateToken("meow".toCharArray()) + .authenticateToken("TASCtBVdyrXiATQQrdsqF7r6HFOZThijJeA22v1Zu3MUVsTAd4MTGsu8Sh0Nutf5u2KaQ4ut7CP8zsJ--p6Phg==".toCharArray()) .bucket("test").org("hydev").build() val influx = InfluxDBClientKotlinFactory.create(opts) val influxJava = InfluxDBClientFactory.create(opts) - val gs = makeGson() - val PATH = "/ws/Android/WearSyncData/com.mi.health/databases/1804898679/cn/fitness_data" - Database.connect("jdbc:sqlite:${PATH}", "org.sqlite.JDBC") - TransactionManager.manager.defaultIsolationLevel = Connection.TRANSACTION_SERIALIZABLE - - val days = transaction { - addLogger(StdOutSqlLogger) - - return@transaction SleepSegment.selectAll().mapNotNull { - val json = it[SleepSegment.value] - when (it[SleepSegment.key]) - { - "watch_night_sleep" -> gs.fromJson(json, SleepNight::class.java) - "watch_daytime_sleep" -> gs.fromJson(json, SleepDaytime::class.java) - else -> null - } - } - } - - val rawStates = days.flatMap { it.items }.sortedBy { it.start_time } - - // Awake: 5 - rawStates.filter { it.state == 5 }.forEach { it.state = 0 } - - // Use state 0 to fill between the start-end gaps - var states = mutableListOf() - rawStates.forEachIndexed { i, si -> - states += si - if (i != 0) - { - val last = rawStates[i - 1] - if (last.end_time < si.start_time) states += - SleepState(start_time = last.end_time, end_time = si.start_time, 0) - } - } - states += SleepState(start_time = rawStates.last().end_time, end_time = Instant.now(), 0) - - // Remove duplicates - states = states.filterIndexed { i, si -> i == 0 || si.state != states[i - 1].state }.toMutableList() + val (days, states) = readMiDatabase() println(days.joinToString("\n"))