From 8baf3270d2e648b214cdc98c256fdf73affb79b3 Mon Sep 17 00:00:00 2001 From: zhufucdev <1095291434@qq.com> Date: Wed, 7 Feb 2024 11:18:52 +0800 Subject: [PATCH 1/5] :bug: Expected navigation behavior for data page --- .../zhufucdev/motion_emulator/ui/AppHome.kt | 37 +++++++++++-------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/zhufucdev/motion_emulator/ui/AppHome.kt b/app/src/main/java/com/zhufucdev/motion_emulator/ui/AppHome.kt index 5ac4a8f..ae51cc8 100644 --- a/app/src/main/java/com/zhufucdev/motion_emulator/ui/AppHome.kt +++ b/app/src/main/java/com/zhufucdev/motion_emulator/ui/AppHome.kt @@ -86,9 +86,7 @@ fun AppHome(windowSize: WindowSizeClass) { NavigationBarItem( selected = selected, onClick = { - if (!selected - || backStackEntry?.destination?.let { dest.isCurrent(it) } == false - ) { + if (!selected) { navController.navigate(dest.name) } }, @@ -112,9 +110,7 @@ fun AppHome(windowSize: WindowSizeClass) { NavigationRailItem( selected = selected, onClick = { - if (!selected - || backStackEntry?.destination?.let { dest.isCurrent(it) } == false - ) { + if (!selected) { navController.navigate(dest.name) } }, @@ -138,9 +134,15 @@ fun AppHome(windowSize: WindowSizeClass) { drawerContent = { PermanentDrawerSheet { NavigationDestinations.entries.forEach { dest -> + val selected = + backStackEntry?.destination?.let { dest.selected(it) } == true NavigationDrawerItem( - selected = backStackEntry?.destination?.let { dest.selected(it) } == true, - onClick = { navController.navigate(dest.name) }, + selected = selected, + onClick = { + if (!selected) { + navController.navigate(dest.name) + } + }, icon = dest.icon, label = dest.label ) @@ -168,14 +170,14 @@ private fun NavContent(paddingValues: PaddingValues) { navController = LocalNavControllerProvider.current!!, startDestination = NavigationDestinations.Emulate.name ) { - composable(NavigationDestinations.Plugins.name.lowercase()) { + composable(NavigationDestinations.Plugins.route) { CompositionLocalProvider( LocalViewModelStoreOwner provides provider ) { PluginsApp(paddingValues) } } - composable(NavigationDestinations.Emulate.name.lowercase()) { + composable(NavigationDestinations.Emulate.route) { CompositionLocalProvider( LocalViewModelStoreOwner provides provider ) { @@ -184,7 +186,7 @@ private fun NavContent(paddingValues: PaddingValues) { } navigation( startDestination = "home", - route = NavigationDestinations.Data.name.lowercase() + route = NavigationDestinations.Data.route ) { composable("home") { CompositionLocalProvider(LocalViewModelStoreOwner provides provider) { @@ -265,6 +267,7 @@ private fun TopBar(scrollBehavior: TopAppBarScrollBehavior) { enum class NavigationDestinations( val label: @Composable () -> Unit, val icon: @Composable () -> Unit, + val route: String ) { Plugins( label = { Text(text = stringResource(id = R.string.title_activity_plugin)) }, @@ -273,7 +276,8 @@ enum class NavigationDestinations( imageVector = Icons.Default.Extension, contentDescription = null ) - } + }, + route = "plugins" ), Emulate( label = { Text(text = stringResource(id = R.string.title_emulate)) }, @@ -282,7 +286,8 @@ enum class NavigationDestinations( imageVector = Icons.Default.AutoFixHigh, contentDescription = null ) - } + }, + route = "emulate" ), Data( label = { Text(text = stringResource(id = R.string.title_data)) }, @@ -291,11 +296,13 @@ enum class NavigationDestinations( imageVector = Icons.Default.Storage, contentDescription = null ) - } + }, + route = "data" ) } fun NavigationDestinations.selected(currentDest: NavDestination): Boolean = isCurrent(currentDest) || currentDest.hierarchy.any { isCurrent(it) } -fun NavigationDestinations.isCurrent(currentDest: NavDestination) = currentDest.route == name.lowercase() +fun NavigationDestinations.isCurrent(currentDest: NavDestination) = + currentDest.route == name.lowercase() From fa760253384cc823ef51e3323b122b04a4ef3243 Mon Sep 17 00:00:00 2001 From: zhufucdev <1095291434@qq.com> Date: Wed, 7 Feb 2024 11:20:05 +0800 Subject: [PATCH 2/5] :bug: Weird listing behavior --- .../java/com/zhufucdev/motion_emulator/ui/ManagerApp.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/zhufucdev/motion_emulator/ui/ManagerApp.kt b/app/src/main/java/com/zhufucdev/motion_emulator/ui/ManagerApp.kt index f3e6bf2..4f18cbe 100644 --- a/app/src/main/java/com/zhufucdev/motion_emulator/ui/ManagerApp.kt +++ b/app/src/main/java/com/zhufucdev/motion_emulator/ui/ManagerApp.kt @@ -522,7 +522,7 @@ private fun SheetContent( }, body = { val targetList = items[store]!! - val data = targetList.toList() + val data = remember { targetList.toList() } if (data.isNotEmpty()) { Column(Modifier.fillMaxWidth()) { data.forEachIndexed { index, datum -> @@ -658,7 +658,8 @@ fun CellEditor( Box( Modifier .padding(PaddingCommon) - .padding(paddingValues)) { + .padding(paddingValues) + ) { BasicEdit( id = target.id, name = target.metadata.displayName(context), @@ -695,7 +696,8 @@ fun MotionEditor( Box( Modifier .padding(PaddingCommon) - .padding(paddingValues)) { + .padding(paddingValues) + ) { BasicEdit( id = target.id, name = target.metadata.displayName(context), From a75b15726588c218c6911ea2d5369989164e1216 Mon Sep 17 00:00:00 2001 From: zhufucdev <1095291434@qq.com> Date: Fri, 8 Mar 2024 08:30:36 +0800 Subject: [PATCH 3/5] :boom: Motion and Telephony compositional data model --- .idea/misc.xml | 1 - .../zhufucdev/motion_emulator/data/Cells.kt | 16 ---------- .../motion_emulator/data/DataStore.kt | 1 - .../zhufucdev/motion_emulator/data/Motions.kt | 20 +++++++++++- .../motion_emulator/data/Telephony.kt | 31 +++++++++++++++++++ .../zhufucdev/motion_emulator/data/Traces.kt | 2 +- .../zhufucdev/motion_emulator/ui/AppHome.kt | 4 +-- .../motion_emulator/ui/MainActivity.kt | 6 ++-- .../motion_emulator/ui/ManagerApp.kt | 6 ++-- .../motion_emulator/ui/model/EmulationRef.kt | 8 ++--- gradle/libs.versions.toml | 4 +-- gradle/wrapper/gradle-wrapper.properties | 2 +- 12 files changed, 63 insertions(+), 38 deletions(-) delete mode 100644 app/src/main/java/com/zhufucdev/motion_emulator/data/Cells.kt create mode 100644 app/src/main/java/com/zhufucdev/motion_emulator/data/Telephony.kt diff --git a/.idea/misc.xml b/.idea/misc.xml index 0ad17cb..8978d23 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ - diff --git a/app/src/main/java/com/zhufucdev/motion_emulator/data/Cells.kt b/app/src/main/java/com/zhufucdev/motion_emulator/data/Cells.kt deleted file mode 100644 index e2f023d..0000000 --- a/app/src/main/java/com/zhufucdev/motion_emulator/data/Cells.kt +++ /dev/null @@ -1,16 +0,0 @@ -@file:Suppress("DEPRECATION") - -package com.zhufucdev.motion_emulator.data - -import com.zhufucdev.me.stub.CellTimeline -import kotlinx.serialization.KSerializer -import kotlinx.serialization.serializer -import kotlin.reflect.KClass - - -object Cells : DataStore() { - override val typeName: String get() = "cell" - override val clazz: KClass = CellTimeline::class - override val dataSerializer: KSerializer get() = serializer() -} - diff --git a/app/src/main/java/com/zhufucdev/motion_emulator/data/DataStore.kt b/app/src/main/java/com/zhufucdev/motion_emulator/data/DataStore.kt index e579b68..effe0d5 100644 --- a/app/src/main/java/com/zhufucdev/motion_emulator/data/DataStore.kt +++ b/app/src/main/java/com/zhufucdev/motion_emulator/data/DataStore.kt @@ -36,7 +36,6 @@ abstract class DataStore { protected abstract val dataSerializer: KSerializer private val DataLoader.storeName get() = "${typeName}_${id}.json" - private val DataLoader.metaStoreName get() = "meta_${id}.json" /** * Make sure it works diff --git a/app/src/main/java/com/zhufucdev/motion_emulator/data/Motions.kt b/app/src/main/java/com/zhufucdev/motion_emulator/data/Motions.kt index 7893ff0..9f8e2bc 100644 --- a/app/src/main/java/com/zhufucdev/motion_emulator/data/Motions.kt +++ b/app/src/main/java/com/zhufucdev/motion_emulator/data/Motions.kt @@ -1,12 +1,30 @@ package com.zhufucdev.motion_emulator.data +import com.zhufucdev.me.stub.Data import com.zhufucdev.me.stub.Motion +import com.zhufucdev.me.stub.MotionTimeline import kotlinx.serialization.KSerializer +import kotlinx.serialization.Serializable import kotlinx.serialization.serializer import kotlin.reflect.KClass object Motions : DataStore() { override val typeName: String get() = "motion" override val clazz: KClass = Motion::class - override val dataSerializer: KSerializer get() = serializer() + override val dataSerializer: KSerializer = serializer() +} + +object MotionComposites : DataStore() { + override val typeName: String get() = "motion_composite" + override val clazz: KClass get() = MotionComposite::class + override val dataSerializer: KSerializer get() = serializer() +} + +@Serializable +data class MotionComposite( + override val id: String, + val name: String, + private val ref: List +) : Data { + val timelines by lazy { ref.map { Motions[it] } } } \ No newline at end of file diff --git a/app/src/main/java/com/zhufucdev/motion_emulator/data/Telephony.kt b/app/src/main/java/com/zhufucdev/motion_emulator/data/Telephony.kt new file mode 100644 index 0000000..d9522ed --- /dev/null +++ b/app/src/main/java/com/zhufucdev/motion_emulator/data/Telephony.kt @@ -0,0 +1,31 @@ +package com.zhufucdev.motion_emulator.data + +import com.zhufucdev.me.stub.CellTimeline +import com.zhufucdev.me.stub.Data +import kotlinx.serialization.KSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.serializer +import kotlin.reflect.KClass + + +object Telephonies : DataStore() { + override val typeName: String get() = "telephony" + override val clazz: KClass = CellTimeline::class + override val dataSerializer: KSerializer = serializer() +} + +object TelephonyComposites : DataStore() { + override val typeName: String + get() = "telephony_composite" + override val clazz: KClass get() = TelephonyComposite::class + override val dataSerializer: KSerializer = serializer() +} + +@Serializable +data class TelephonyComposite( + override val id: String, + val name: String, + private val ref: List +) : Data { + val timelines by lazy { ref.map { Telephonies[it] } } +} \ No newline at end of file diff --git a/app/src/main/java/com/zhufucdev/motion_emulator/data/Traces.kt b/app/src/main/java/com/zhufucdev/motion_emulator/data/Traces.kt index c1b4e54..7b3d658 100644 --- a/app/src/main/java/com/zhufucdev/motion_emulator/data/Traces.kt +++ b/app/src/main/java/com/zhufucdev/motion_emulator/data/Traces.kt @@ -8,5 +8,5 @@ import kotlin.reflect.KClass object Traces : DataStore() { override val typeName: String get() = "trace" override val clazz: KClass = Trace::class - override val dataSerializer: KSerializer get() = serializer() + override val dataSerializer: KSerializer = serializer() } \ No newline at end of file diff --git a/app/src/main/java/com/zhufucdev/motion_emulator/ui/AppHome.kt b/app/src/main/java/com/zhufucdev/motion_emulator/ui/AppHome.kt index ae51cc8..7b63bf6 100644 --- a/app/src/main/java/com/zhufucdev/motion_emulator/ui/AppHome.kt +++ b/app/src/main/java/com/zhufucdev/motion_emulator/ui/AppHome.kt @@ -48,7 +48,7 @@ import androidx.navigation.compose.navigation import androidx.navigation.compose.rememberNavController import androidx.navigation.navArgument import com.zhufucdev.motion_emulator.R -import com.zhufucdev.motion_emulator.data.Cells +import com.zhufucdev.motion_emulator.data.Telephonies import com.zhufucdev.motion_emulator.data.Motions import com.zhufucdev.motion_emulator.data.Traces import com.zhufucdev.motion_emulator.ui.component.TooltipHost @@ -198,7 +198,7 @@ private fun NavContent(paddingValues: PaddingValues) { arguments = listOf(navArgument("id") { type = NavType.StringType }) ) { val targetId = it.arguments?.getString("id") ?: error("invalid argument") - val target = Cells[targetId] ?: error("unknown datum") + val target = Telephonies[targetId] ?: error("unknown datum") CompositionLocalProvider(LocalViewModelStoreOwner provides provider) { CellEditor(target, paddingValues) } diff --git a/app/src/main/java/com/zhufucdev/motion_emulator/ui/MainActivity.kt b/app/src/main/java/com/zhufucdev/motion_emulator/ui/MainActivity.kt index 58e226a..e10c2e1 100644 --- a/app/src/main/java/com/zhufucdev/motion_emulator/ui/MainActivity.kt +++ b/app/src/main/java/com/zhufucdev/motion_emulator/ui/MainActivity.kt @@ -11,12 +11,10 @@ import androidx.compose.runtime.remember import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewmodel.initializer import androidx.lifecycle.viewmodel.viewModelFactory -import com.zhufucdev.me.stub.Data import com.zhufucdev.motion_emulator.BuildConfig -import com.zhufucdev.motion_emulator.data.Cells +import com.zhufucdev.motion_emulator.data.Telephonies import com.zhufucdev.motion_emulator.data.DataLoader import com.zhufucdev.motion_emulator.data.Emulations -import com.zhufucdev.motion_emulator.data.LazyData import com.zhufucdev.motion_emulator.data.Motions import com.zhufucdev.motion_emulator.data.Traces import com.zhufucdev.motion_emulator.extension.AppUpdater @@ -91,7 +89,7 @@ class MainActivity : ComponentActivity() { } initializer { - val stores = listOf(Traces, Motions, Cells) + val stores = listOf(Traces, Motions, Telephonies) val data = mutableStateListOf>() ManagerViewModel( data = data, diff --git a/app/src/main/java/com/zhufucdev/motion_emulator/ui/ManagerApp.kt b/app/src/main/java/com/zhufucdev/motion_emulator/ui/ManagerApp.kt index 4f18cbe..5f8736c 100644 --- a/app/src/main/java/com/zhufucdev/motion_emulator/ui/ManagerApp.kt +++ b/app/src/main/java/com/zhufucdev/motion_emulator/ui/ManagerApp.kt @@ -80,7 +80,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel import com.zhufucdev.me.stub.CellTimeline import com.zhufucdev.me.stub.Motion import com.zhufucdev.motion_emulator.R -import com.zhufucdev.motion_emulator.data.Cells +import com.zhufucdev.motion_emulator.data.Telephonies import com.zhufucdev.motion_emulator.data.DataLoader import com.zhufucdev.motion_emulator.data.Motions import com.zhufucdev.motion_emulator.data.Traces @@ -825,7 +825,7 @@ fun ListItem( private val iconByStore by lazy { mapOf( Motions to Icons.Default.Smartphone, - Cells to Icons.Default.CellTower, + Telephonies to Icons.Default.CellTower, Traces to Icons.Default.Map ) } @@ -833,7 +833,7 @@ private val iconByStore by lazy { private val nameIdByStore by lazy { mapOf( Motions to R.string.title_motion, - Cells to R.string.title_cells, + Telephonies to R.string.title_cells, Traces to R.string.title_trace ) } \ No newline at end of file diff --git a/app/src/main/java/com/zhufucdev/motion_emulator/ui/model/EmulationRef.kt b/app/src/main/java/com/zhufucdev/motion_emulator/ui/model/EmulationRef.kt index d6bf5da..703c794 100644 --- a/app/src/main/java/com/zhufucdev/motion_emulator/ui/model/EmulationRef.kt +++ b/app/src/main/java/com/zhufucdev/motion_emulator/ui/model/EmulationRef.kt @@ -2,15 +2,11 @@ package com.zhufucdev.motion_emulator.ui.model import com.zhufucdev.me.stub.Data import com.zhufucdev.me.stub.Emulation -import com.zhufucdev.motion_emulator.data.Cells +import com.zhufucdev.motion_emulator.data.Telephonies import com.zhufucdev.motion_emulator.data.Motions import com.zhufucdev.motion_emulator.data.Traces import com.zhufucdev.motion_emulator.extension.StoredBox -import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.Serializable -import kotlinx.serialization.json.Json -import kotlinx.serialization.json.encodeToStream -import java.io.OutputStream @Serializable data class EmulationRef( @@ -27,7 +23,7 @@ data class EmulationRef( fun EmulationRef.emulation() = Emulation( trace = StoredBox(trace, Traces), motion = StoredBox(motion, Motions), - cells = StoredBox(cells, Cells), + cells = StoredBox(cells, Telephonies), repeat = repeat, velocity = velocity, satelliteCount = satelliteCount diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 19bea94..55c00f8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -agp = "8.4.0-alpha08" +agp = "8.4.0-alpha13" kotlin = "1.9.21" coreKtx = "1.12.0" preference = "1.2.1" @@ -31,7 +31,7 @@ gmaps = "3.2.1" mapsUtils = "3.4.0" spongycastle = "1.58.0.0" -stub = "1.1.2" +stub = "1.1.3" update = "1.0.0" sdk = "1.0.0" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8e231d4..7062786 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Wed Oct 12 22:10:46 CST 2022 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-rc-1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From bdba2cb2a9791f6a41de851df491d0d0ef53d98a Mon Sep 17 00:00:00 2001 From: zhufucdev <1095291434@qq.com> Date: Fri, 8 Mar 2024 09:17:40 +0800 Subject: [PATCH 4/5] :bug: API change --- .../motion_emulator/data/DataStore.kt | 2 - .../motion_emulator/data/MotionRecorder.kt | 45 ++++++---------- .../motion_emulator/data/TelephonyRecorder.kt | 34 ++++-------- .../extension/MotionEstimate.kt | 52 +------------------ .../motion_emulator/extension/StatusBar.kt | 1 + 5 files changed, 27 insertions(+), 107 deletions(-) diff --git a/app/src/main/java/com/zhufucdev/motion_emulator/data/DataStore.kt b/app/src/main/java/com/zhufucdev/motion_emulator/data/DataStore.kt index effe0d5..e6466ea 100644 --- a/app/src/main/java/com/zhufucdev/motion_emulator/data/DataStore.kt +++ b/app/src/main/java/com/zhufucdev/motion_emulator/data/DataStore.kt @@ -5,9 +5,7 @@ import com.zhufucdev.me.stub.Data import com.zhufucdev.me.stub.Metadata import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.KSerializer -import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json -import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.buildJsonObject import kotlinx.serialization.json.decodeFromJsonElement import kotlinx.serialization.json.decodeFromStream diff --git a/app/src/main/java/com/zhufucdev/motion_emulator/data/MotionRecorder.kt b/app/src/main/java/com/zhufucdev/motion_emulator/data/MotionRecorder.kt index e2ede66..f63516e 100644 --- a/app/src/main/java/com/zhufucdev/motion_emulator/data/MotionRecorder.kt +++ b/app/src/main/java/com/zhufucdev/motion_emulator/data/MotionRecorder.kt @@ -7,17 +7,14 @@ import android.hardware.SensorEventListener import android.hardware.SensorManager import com.aventrix.jnanoid.jnanoid.NanoIdUtils import com.zhufucdev.me.stub.Motion -import com.zhufucdev.me.stub.MotionMoment -import kotlin.math.abs +import com.zhufucdev.me.stub.SensorMoment interface MotionCallback { fun summarize(): Motion - fun onUpdate(l: (MotionMoment) -> Unit) - fun onUpdate(type: Int, l: (MotionMoment) -> Unit) + fun onUpdate(l: (SensorMoment) -> Unit) + fun onUpdate(type: Int, l: (SensorMoment) -> Unit) } -const val VERTICAL_PERIOD = 0.05F - object MotionRecorder { private lateinit var sensors: SensorManager @@ -29,35 +26,23 @@ object MotionRecorder { fun start(sensorsRequired: List): MotionCallback { val start = System.currentTimeMillis() - val moments = arrayListOf() - var callbackListener: ((MotionMoment) -> Unit)? = null - val typedListeners = hashMapOf Unit>() + val timelines = sensorsRequired.associateWith { arrayListOf() } + var callbackListener: ((SensorMoment) -> Unit)? = null + val typedListeners = hashMapOf Unit>() val listener = object : SensorEventListener { override fun onSensorChanged(event: SensorEvent) { - fun typedFeedback(moment: MotionMoment) { + fun invokeTypedListener(moment: SensorMoment) { typedListeners[event.sensor.type]?.invoke(moment) } val elapsed = (System.currentTimeMillis() - start) / 1000F - if (moments.isNotEmpty()) { - val last = moments.last() - if ( - abs(last.elapsed - elapsed) < VERTICAL_PERIOD - && !last.data.containsKey(event.sensor.type) - ) { - last.data[event.sensor.type] = event.values - typedFeedback(last) - if (last.data.size == sensorsRequired.size) { - callbackListener?.invoke(last) - } - return - } - } + val timeline = timelines[event.sensor.type]!! + val moment = SensorMoment(elapsed, event.values) - val newMoment = MotionMoment(elapsed, mutableMapOf(event.sensor.type to event.values.clone())) - moments.add(newMoment) - typedFeedback(newMoment) + timeline.add(moment) + invokeTypedListener(moment) + callbackListener?.invoke(moment) } override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {} @@ -75,14 +60,14 @@ object MotionRecorder { callbacks.remove(this) } - return Motion(NanoIdUtils.randomNanoId(), moments, sensorsRequired) + return Motion(NanoIdUtils.randomNanoId(), timelines) } - override fun onUpdate(l: (MotionMoment) -> Unit) { + override fun onUpdate(l: (SensorMoment) -> Unit) { callbackListener = l } - override fun onUpdate(type: Int, l: (MotionMoment) -> Unit) { + override fun onUpdate(type: Int, l: (SensorMoment) -> Unit) { typedListeners[type] = l } } diff --git a/app/src/main/java/com/zhufucdev/motion_emulator/data/TelephonyRecorder.kt b/app/src/main/java/com/zhufucdev/motion_emulator/data/TelephonyRecorder.kt index 19d7fe5..af8e2f6 100644 --- a/app/src/main/java/com/zhufucdev/motion_emulator/data/TelephonyRecorder.kt +++ b/app/src/main/java/com/zhufucdev/motion_emulator/data/TelephonyRecorder.kt @@ -21,7 +21,6 @@ import com.zhufucdev.me.stub.CellTimeline import java.util.Timer import java.util.concurrent.Executor import kotlin.concurrent.timer -import kotlin.math.abs import kotlin.reflect.full.memberFunctions object TelephonyRecorder { @@ -47,33 +46,18 @@ object TelephonyRecorder { fun elapsed(): Float = (System.currentTimeMillis() - start) / 1000F val cancel: () -> Unit - @Synchronized - fun mergeIfPossible(moment: CellMoment): CellMoment { - if (timeline.isNotEmpty() && abs(moment.elapsed - timeline.last().elapsed) <= VERTICAL_PERIOD) { - val target = timeline.last() - if (!target.isSameTypeOf(moment)) { - timeline.removeLast() - val merged = target.merge(moment) - timeline.add(merged) - return merged - } - } - timeline.add(moment) - return moment - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { val telephonyCallback = object : TelephonyCallback(), TelephonyCallback.CellInfoListener, TelephonyCallback.CellLocationListener { override fun onCellInfoChanged(cellInfo: MutableList) { val moment = CellMoment(elapsed(), cellInfo) - val merged = mergeIfPossible(moment) - updateListener?.invoke(merged) + timeline.add(moment) + updateListener?.invoke(moment) } override fun onCellLocationChanged(location: CellLocation) { val moment = CellMoment(elapsed(), location = location) - val merged = mergeIfPossible(moment) - updateListener?.invoke(merged) + timeline.add(moment) + updateListener?.invoke(moment) } } @@ -87,7 +71,7 @@ object TelephonyRecorder { override fun onCellInfoChanged(cellInfo: MutableList?) { if (cellInfo != null) { val moment = CellMoment(elapsed(), cellInfo) - mergeIfPossible(moment) + timeline.add(moment) updateListener?.invoke(moment) } } @@ -96,8 +80,8 @@ object TelephonyRecorder { override fun onCellLocationChanged(location: CellLocation?) { if (location != null) { val moment = CellMoment(elapsed(), location = location) - val merged = mergeIfPossible(moment) - updateListener?.invoke(merged) + timeline.add(moment) + updateListener?.invoke(moment) } } } @@ -111,8 +95,8 @@ object TelephonyRecorder { timer = timer("neighboring daemon", period = 1500L) { val infos = method.call(manager) as List? ?: return@timer val moment = CellMoment(elapsed(), neighboring = infos) - val merged = mergeIfPossible(moment) - updateListener?.invoke(merged) + timeline.add(moment) + updateListener?.invoke(moment) } } } diff --git a/app/src/main/java/com/zhufucdev/motion_emulator/extension/MotionEstimate.kt b/app/src/main/java/com/zhufucdev/motion_emulator/extension/MotionEstimate.kt index cdb374c..748a7f1 100644 --- a/app/src/main/java/com/zhufucdev/motion_emulator/extension/MotionEstimate.kt +++ b/app/src/main/java/com/zhufucdev/motion_emulator/extension/MotionEstimate.kt @@ -2,58 +2,10 @@ package com.zhufucdev.motion_emulator.extension import android.hardware.Sensor import com.zhufucdev.me.stub.Motion -import com.zhufucdev.me.stub.MotionMoment -import kotlin.time.Duration -import kotlin.time.Duration.Companion.seconds fun Motion.estimateSpeed(): Double? { - fun containsType(type: Int) = sensorsInvolved.contains(type) + fun containsType(type: Int) = timelines.containsKey(type) val counter = containsType(Sensor.TYPE_STEP_COUNTER) val detector = containsType(Sensor.TYPE_STEP_DETECTOR) - if (!counter && !detector) - return null //TODO use more sensor types - - var lastMoment: MotionMoment? = null - var sum = 0.0 - var count = 0 - if (counter) { - // if counter is available, drop detector - for (current in moments) { - if (current.data.containsKey(Sensor.TYPE_STEP_COUNTER)) { - val last = lastMoment - if (last == null) { - lastMoment = current - continue - } - val steps = - current.data[Sensor.TYPE_STEP_COUNTER]!!.first() - last.data[Sensor.TYPE_STEP_COUNTER]!!.first() - val time = current.elapsed - last.elapsed - sum += 1.2 * steps / time - count++ - } - } - } else { - // if not, relay on detector - for (current in moments) { - if (current.data.containsKey(Sensor.TYPE_STEP_DETECTOR)) { - val last = lastMoment - if (last == null) { - lastMoment = current - continue - } - val time = current.elapsed - last.elapsed - sum += 1.2 / time - count++ - } - } - } - - if (sum < 0 || sum.isNaN() || count <= 0) return null - return sum / count + return null //TODO reimplement } - -fun Motion.estimateTimespan(): Duration { - if (moments.size < 2) return 0.seconds - return (moments.last().elapsed - moments.first().elapsed * 1.0).seconds -} - diff --git a/app/src/main/java/com/zhufucdev/motion_emulator/extension/StatusBar.kt b/app/src/main/java/com/zhufucdev/motion_emulator/extension/StatusBar.kt index 47eb2bf..1683779 100644 --- a/app/src/main/java/com/zhufucdev/motion_emulator/extension/StatusBar.kt +++ b/app/src/main/java/com/zhufucdev/motion_emulator/extension/StatusBar.kt @@ -8,4 +8,5 @@ fun Activity.setUpStatusBar() { WindowCompat.setDecorFitsSystemWindows(window, false) window.statusBarColor = Color.TRANSPARENT window.navigationBarColor = Color.TRANSPARENT + } From a6307c7ae25cadc9271f867eed340b584b580397 Mon Sep 17 00:00:00 2001 From: zhufucdev <1095291434@qq.com> Date: Fri, 8 Mar 2024 09:17:55 +0800 Subject: [PATCH 5/5] :bug: Status bar icon color --- app/src/main/res/values-notnight/themes.xml | 6 ++++++ app/src/main/res/values/themes.xml | 1 - 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/values-notnight/themes.xml diff --git a/app/src/main/res/values-notnight/themes.xml b/app/src/main/res/values-notnight/themes.xml new file mode 100644 index 0000000..ac74985 --- /dev/null +++ b/app/src/main/res/values-notnight/themes.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index bc04e4b..d07bd50 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,5 +1,4 @@ \ No newline at end of file