From 30d7efeec2ff34dc4cf2afd34f7e34f035824899 Mon Sep 17 00:00:00 2001 From: darken Date: Thu, 2 Apr 2026 16:40:56 +0200 Subject: [PATCH] Moving packages around --- .../compose/preview/MockPodDataProvider.kt | 8 +++---- .../capod/monitor/core/DeviceMonitor.kt | 11 +++++---- .../eu/darken/capod/monitor/core/PodDevice.kt | 13 +++++----- .../monitor/core/{ => ble}/BlePodMonitor.kt | 19 ++++++++------- .../core/{ => cache}/CachedDeviceState.kt | 4 ++-- .../core/{ => cache}/DeviceStateCache.kt | 24 ++++++++++--------- .../monitor/core/worker/MonitorService.kt | 7 +++--- .../capod/profiles/core/DeviceProfilesRepo.kt | 4 ++-- .../capod/reaction/core/aap/AapAutoConnect.kt | 4 ++-- .../ui/TroubleShooterViewModel.kt | 2 +- .../capod/monitor/core/PodDeviceCacheTest.kt | 1 + .../reaction/core/aap/AapAutoConnectTest.kt | 4 ++-- 12 files changed, 54 insertions(+), 47 deletions(-) rename app/src/main/java/eu/darken/capod/monitor/core/{ => ble}/BlePodMonitor.kt (91%) rename app/src/main/java/eu/darken/capod/monitor/core/{ => cache}/CachedDeviceState.kt (96%) rename app/src/main/java/eu/darken/capod/monitor/core/{ => cache}/DeviceStateCache.kt (82%) diff --git a/app/src/main/java/eu/darken/capod/common/compose/preview/MockPodDataProvider.kt b/app/src/main/java/eu/darken/capod/common/compose/preview/MockPodDataProvider.kt index ee36728e..99b7c095 100644 --- a/app/src/main/java/eu/darken/capod/common/compose/preview/MockPodDataProvider.kt +++ b/app/src/main/java/eu/darken/capod/common/compose/preview/MockPodDataProvider.kt @@ -4,20 +4,20 @@ import android.content.Context import eu.darken.capod.R import eu.darken.capod.common.bluetooth.BleScanResult import eu.darken.capod.common.upgrade.UpgradeRepo -import eu.darken.capod.monitor.core.CachedDeviceState import eu.darken.capod.monitor.core.PodDevice +import eu.darken.capod.monitor.core.cache.CachedDeviceState +import eu.darken.capod.pods.core.apple.PodModel import eu.darken.capod.pods.core.apple.aap.AapPodState import eu.darken.capod.pods.core.apple.ble.BlePodSnapshot import eu.darken.capod.pods.core.apple.ble.DualBlePodSnapshot +import eu.darken.capod.pods.core.apple.ble.SingleBlePodSnapshot +import eu.darken.capod.pods.core.apple.ble.devices.ApplePods import eu.darken.capod.pods.core.apple.ble.devices.HasCase import eu.darken.capod.pods.core.apple.ble.devices.HasChargeDetection import eu.darken.capod.pods.core.apple.ble.devices.HasChargeDetectionDual import eu.darken.capod.pods.core.apple.ble.devices.HasDualMicrophone import eu.darken.capod.pods.core.apple.ble.devices.HasEarDetection import eu.darken.capod.pods.core.apple.ble.devices.HasEarDetectionDual -import eu.darken.capod.pods.core.apple.PodModel -import eu.darken.capod.pods.core.apple.ble.SingleBlePodSnapshot -import eu.darken.capod.pods.core.apple.ble.devices.ApplePods import eu.darken.capod.pods.core.apple.ble.protocol.ProximityPayload import eu.darken.capod.pods.core.unknown.UnknownSnapshotBle import eu.darken.capod.profiles.core.AppleDeviceProfile diff --git a/app/src/main/java/eu/darken/capod/monitor/core/DeviceMonitor.kt b/app/src/main/java/eu/darken/capod/monitor/core/DeviceMonitor.kt index cc2e6b36..b32d7276 100644 --- a/app/src/main/java/eu/darken/capod/monitor/core/DeviceMonitor.kt +++ b/app/src/main/java/eu/darken/capod/monitor/core/DeviceMonitor.kt @@ -5,7 +5,10 @@ import eu.darken.capod.common.debug.logging.Logging.Priority.VERBOSE import eu.darken.capod.common.debug.logging.log import eu.darken.capod.common.debug.logging.logTag import eu.darken.capod.common.flow.replayingShare -import eu.darken.capod.monitor.core.CachedDeviceState.CachedBatterySlot +import eu.darken.capod.monitor.core.ble.BlePodMonitor +import eu.darken.capod.monitor.core.cache.CachedDeviceState +import eu.darken.capod.monitor.core.cache.CachedDeviceState.CachedBatterySlot +import eu.darken.capod.monitor.core.cache.DeviceStateCache import eu.darken.capod.pods.core.apple.aap.AapConnectionManager import eu.darken.capod.pods.core.apple.ble.DualBlePodSnapshot import eu.darken.capod.pods.core.apple.ble.SingleBlePodSnapshot @@ -22,11 +25,11 @@ import javax.inject.Inject import javax.inject.Singleton /** - * Single merge point: combines BLE scan data ([BlePodMonitor]) with AAP connection data - * ([AapConnectionManager]) and cached device state ([DeviceStateCache]) into unified [PodDevice] objects. + * Single merge point: combines BLE scan data ([eu.darken.capod.monitor.core.ble.BlePodMonitor]) with AAP connection data + * ([AapConnectionManager]) and cached device state ([eu.darken.capod.monitor.core.cache.DeviceStateCache]) into unified [PodDevice] objects. * * Includes cached-only devices for profiles that have cached state but no live BLE data. - * Persists live device state to [DeviceStateCache] as a side effect. + * Persists live device state to [eu.darken.capod.monitor.core.cache.DeviceStateCache] as a side effect. * ViewModels should observe [devices] instead of accessing BlePodMonitor directly. */ @Singleton diff --git a/app/src/main/java/eu/darken/capod/monitor/core/PodDevice.kt b/app/src/main/java/eu/darken/capod/monitor/core/PodDevice.kt index ab5ed6a8..fadb3e59 100644 --- a/app/src/main/java/eu/darken/capod/monitor/core/PodDevice.kt +++ b/app/src/main/java/eu/darken/capod/monitor/core/PodDevice.kt @@ -4,20 +4,21 @@ import android.content.Context import androidx.compose.runtime.Stable import eu.darken.capod.R import eu.darken.capod.common.bluetooth.BluetoothAddress +import eu.darken.capod.monitor.core.cache.CachedDeviceState +import eu.darken.capod.pods.core.apple.PodModel +import eu.darken.capod.pods.core.apple.aap.AapPodState +import eu.darken.capod.pods.core.apple.aap.protocol.AapSetting import eu.darken.capod.pods.core.apple.ble.BlePodSnapshot import eu.darken.capod.pods.core.apple.ble.DualBlePodSnapshot +import eu.darken.capod.pods.core.apple.ble.SingleBlePodSnapshot +import eu.darken.capod.pods.core.apple.ble.devices.ApplePods +import eu.darken.capod.pods.core.apple.ble.devices.DualApplePods import eu.darken.capod.pods.core.apple.ble.devices.HasCase import eu.darken.capod.pods.core.apple.ble.devices.HasChargeDetection import eu.darken.capod.pods.core.apple.ble.devices.HasChargeDetectionDual import eu.darken.capod.pods.core.apple.ble.devices.HasDualMicrophone import eu.darken.capod.pods.core.apple.ble.devices.HasEarDetection import eu.darken.capod.pods.core.apple.ble.devices.HasEarDetectionDual -import eu.darken.capod.pods.core.apple.PodModel -import eu.darken.capod.pods.core.apple.ble.SingleBlePodSnapshot -import eu.darken.capod.pods.core.apple.ble.devices.DualApplePods -import eu.darken.capod.pods.core.apple.ble.devices.ApplePods -import eu.darken.capod.pods.core.apple.aap.AapPodState -import eu.darken.capod.pods.core.apple.aap.protocol.AapSetting import java.time.Duration import java.time.Instant diff --git a/app/src/main/java/eu/darken/capod/monitor/core/BlePodMonitor.kt b/app/src/main/java/eu/darken/capod/monitor/core/ble/BlePodMonitor.kt similarity index 91% rename from app/src/main/java/eu/darken/capod/monitor/core/BlePodMonitor.kt rename to app/src/main/java/eu/darken/capod/monitor/core/ble/BlePodMonitor.kt index 660baebb..58532147 100644 --- a/app/src/main/java/eu/darken/capod/monitor/core/BlePodMonitor.kt +++ b/app/src/main/java/eu/darken/capod/monitor/core/ble/BlePodMonitor.kt @@ -1,4 +1,4 @@ -package eu.darken.capod.monitor.core +package eu.darken.capod.monitor.core.ble import android.bluetooth.le.ScanFilter import eu.darken.capod.common.bluetooth.BleScanResult @@ -8,8 +8,7 @@ import eu.darken.capod.common.bluetooth.ScannerMode import eu.darken.capod.common.bluetooth.onlyNewAndUnique import eu.darken.capod.common.coroutine.AppScope import eu.darken.capod.common.debug.DebugSettings -import eu.darken.capod.common.debug.logging.Logging.Priority.VERBOSE -import eu.darken.capod.common.debug.logging.Logging.Priority.WARN +import eu.darken.capod.common.debug.logging.Logging import eu.darken.capod.common.debug.logging.asLog import eu.darken.capod.common.debug.logging.log import eu.darken.capod.common.debug.logging.logTag @@ -26,7 +25,6 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOf @@ -65,7 +63,7 @@ class BlePodMonitor @Inject constructor( } .flatMapLatest { isReady -> if (!isReady) { - log(TAG, WARN) { "Bluetooth is not ready" } + log(TAG, Logging.Priority.WARN) { "Bluetooth is not ready" } flowOf(null) } else { val staleEvictionTicker: Flow> = flow { @@ -84,10 +82,13 @@ class BlePodMonitor @Inject constructor( } .retryWhen { cause, attempt -> if (cause is SecurityException) { - log(TAG, WARN) { "PodMonitor failed due to missing permission, not retrying: ${cause.asLog()}" } + log( + TAG, + Logging.Priority.WARN + ) { "PodMonitor failed due to missing permission, not retrying: ${cause.asLog()}" } false } else { - log(TAG, WARN) { "PodMonitor failed (attempt=$attempt), will retry: ${cause.asLog()}" } + log(TAG, Logging.Priority.WARN) { "PodMonitor failed (attempt=$attempt), will retry: ${cause.asLog()}" } delay(3000) true } @@ -148,7 +149,7 @@ class BlePodMonitor @Inject constructor( .flatMapLatest { options -> val filters = when { options.showUnfiltered -> { - log(TAG, WARN) { "Using unfiltered scan mode" } + log(TAG, Logging.Priority.WARN) { "Using unfiltered scan mode" } setOf(ScanFilter.Builder().build()) } @@ -177,7 +178,7 @@ class BlePodMonitor @Inject constructor( val now = Instant.now() deviceCache.toList().forEach { (key, value) -> if (Duration.between(value.seenLastAt, now) > STALE_DEVICE_TIMEOUT) { - log(TAG, VERBOSE) { "Removing stale device from cache: $value" } + log(TAG, Logging.Priority.VERBOSE) { "Removing stale device from cache: $value" } deviceCache.remove(key) } } diff --git a/app/src/main/java/eu/darken/capod/monitor/core/CachedDeviceState.kt b/app/src/main/java/eu/darken/capod/monitor/core/cache/CachedDeviceState.kt similarity index 96% rename from app/src/main/java/eu/darken/capod/monitor/core/CachedDeviceState.kt rename to app/src/main/java/eu/darken/capod/monitor/core/cache/CachedDeviceState.kt index 8df3b3f9..c07e99f3 100644 --- a/app/src/main/java/eu/darken/capod/monitor/core/CachedDeviceState.kt +++ b/app/src/main/java/eu/darken/capod/monitor/core/cache/CachedDeviceState.kt @@ -1,4 +1,4 @@ -package eu.darken.capod.monitor.core +package eu.darken.capod.monitor.core.cache import eu.darken.capod.common.serialization.InstantEpochMillisSerializer import eu.darken.capod.pods.core.apple.PodModel @@ -28,4 +28,4 @@ data class CachedDeviceState( @Serializable(with = InstantEpochMillisSerializer::class) @SerialName("updatedAt") val updatedAt: Instant, ) -} +} \ No newline at end of file diff --git a/app/src/main/java/eu/darken/capod/monitor/core/DeviceStateCache.kt b/app/src/main/java/eu/darken/capod/monitor/core/cache/DeviceStateCache.kt similarity index 82% rename from app/src/main/java/eu/darken/capod/monitor/core/DeviceStateCache.kt rename to app/src/main/java/eu/darken/capod/monitor/core/cache/DeviceStateCache.kt index 64fdc6d0..66f6e9ec 100644 --- a/app/src/main/java/eu/darken/capod/monitor/core/DeviceStateCache.kt +++ b/app/src/main/java/eu/darken/capod/monitor/core/cache/DeviceStateCache.kt @@ -1,11 +1,10 @@ -package eu.darken.capod.monitor.core +package eu.darken.capod.monitor.core.cache import android.content.Context import dagger.hilt.android.qualifiers.ApplicationContext import eu.darken.capod.common.coroutine.AppScope import eu.darken.capod.common.coroutine.DispatcherProvider -import eu.darken.capod.common.debug.logging.Logging.Priority.ERROR -import eu.darken.capod.common.debug.logging.Logging.Priority.VERBOSE +import eu.darken.capod.common.debug.logging.Logging import eu.darken.capod.common.debug.logging.asLog import eu.darken.capod.common.debug.logging.log import eu.darken.capod.common.debug.logging.logTag @@ -54,11 +53,14 @@ class DeviceStateCache @Inject constructor( val state = json.decodeFromString(file.readText()) loaded[profileId] = state } catch (e: Exception) { - log(TAG, ERROR) { "Failed to load cached state from ${file.name}: ${e.asLog()}, deleting" } + log( + TAG, + Logging.Priority.ERROR + ) { "Failed to load cached state from ${file.name}: ${e.asLog()}, deleting" } file.delete() } } - log(TAG, VERBOSE) { "loadAll(): loaded ${loaded.size} entries" } + log(TAG, Logging.Priority.VERBOSE) { "loadAll(): loaded ${loaded.size} entries" } _cachedStates.value = loaded } } @@ -67,13 +69,13 @@ class DeviceStateCache @Inject constructor( suspend fun save(id: ProfileId, state: CachedDeviceState) = withContext(dispatcherProvider.IO) { lock.withLock { - log(TAG, VERBOSE) { "save(id=$id)" } + log(TAG, Logging.Priority.VERBOSE) { "save(id=$id)" } val file = id.toCacheFile() try { file.writeText(json.encodeToString(CachedDeviceState.serializer(), state)) _cachedStates.value += (id to state) } catch (e: Exception) { - log(TAG, ERROR) { "Failed to save state for $id: ${e.asLog()}" } + log(TAG, Logging.Priority.ERROR) { "Failed to save state for $id: ${e.asLog()}" } file.delete() } } @@ -89,7 +91,7 @@ class DeviceStateCache @Inject constructor( try { json.decodeFromString(file.readText()) } catch (e: Exception) { - log(TAG, ERROR) { "Failed to load state for $id: ${e.asLog()}, deleting" } + log(TAG, Logging.Priority.ERROR) { "Failed to load state for $id: ${e.asLog()}, deleting" } file.delete() null } @@ -98,7 +100,7 @@ class DeviceStateCache @Inject constructor( suspend fun delete(id: ProfileId) = withContext(dispatcherProvider.IO) { lock.withLock { - log(TAG, VERBOSE) { "delete(id=$id)" } + log(TAG, Logging.Priority.VERBOSE) { "delete(id=$id)" } id.toCacheFile().delete() _cachedStates.value -= id } @@ -106,7 +108,7 @@ class DeviceStateCache @Inject constructor( suspend fun deleteAll() = withContext(dispatcherProvider.IO) { lock.withLock { - log(TAG, VERBOSE) { "deleteAll()" } + log(TAG, Logging.Priority.VERBOSE) { "deleteAll()" } cacheDir.listFiles()?.forEach { it.delete() } _cachedStates.value = emptyMap() } @@ -115,4 +117,4 @@ class DeviceStateCache @Inject constructor( companion object { private val TAG = logTag("Monitor", "DeviceStateCache") } -} +} \ No newline at end of file diff --git a/app/src/main/java/eu/darken/capod/monitor/core/worker/MonitorService.kt b/app/src/main/java/eu/darken/capod/monitor/core/worker/MonitorService.kt index 3661860d..32627e10 100644 --- a/app/src/main/java/eu/darken/capod/monitor/core/worker/MonitorService.kt +++ b/app/src/main/java/eu/darken/capod/monitor/core/worker/MonitorService.kt @@ -27,17 +27,16 @@ import eu.darken.capod.common.hasApiLevel import eu.darken.capod.main.core.GeneralSettings import eu.darken.capod.main.core.MonitorMode import eu.darken.capod.main.core.PermissionTool -import eu.darken.capod.monitor.core.BlePodMonitor import eu.darken.capod.monitor.core.DeviceMonitor import eu.darken.capod.monitor.core.MonitorCoroutineScope +import eu.darken.capod.monitor.core.aap.AapKeyPersister +import eu.darken.capod.monitor.core.ble.BlePodMonitor import eu.darken.capod.monitor.core.primaryDevice import eu.darken.capod.monitor.ui.MonitorNotifications +import eu.darken.capod.pods.core.apple.aap.AapConnectionManager import eu.darken.capod.profiles.core.DeviceProfile import eu.darken.capod.profiles.core.DeviceProfilesRepo -import eu.darken.capod.pods.core.apple.aap.AapConnectionManager import eu.darken.capod.reaction.core.aap.AapAutoConnect - -import eu.darken.capod.monitor.core.aap.AapKeyPersister import eu.darken.capod.reaction.core.autoconnect.AutoConnect import eu.darken.capod.reaction.core.playpause.PlayPause import eu.darken.capod.reaction.core.popup.PopUpReaction diff --git a/app/src/main/java/eu/darken/capod/profiles/core/DeviceProfilesRepo.kt b/app/src/main/java/eu/darken/capod/profiles/core/DeviceProfilesRepo.kt index ac7a3f94..438d13a2 100644 --- a/app/src/main/java/eu/darken/capod/profiles/core/DeviceProfilesRepo.kt +++ b/app/src/main/java/eu/darken/capod/profiles/core/DeviceProfilesRepo.kt @@ -4,11 +4,12 @@ import android.content.Context import dagger.hilt.android.qualifiers.ApplicationContext import eu.darken.capod.R import eu.darken.capod.common.coroutine.AppScope +import eu.darken.capod.common.datastore.valueBlocking import eu.darken.capod.common.debug.logging.Logging.Priority.VERBOSE import eu.darken.capod.common.debug.logging.log import eu.darken.capod.common.debug.logging.logTag import eu.darken.capod.main.core.GeneralSettings -import eu.darken.capod.monitor.core.DeviceStateCache +import eu.darken.capod.monitor.core.cache.DeviceStateCache import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map @@ -17,7 +18,6 @@ import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import javax.inject.Inject import javax.inject.Singleton -import eu.darken.capod.common.datastore.valueBlocking @Singleton class DeviceProfilesRepo @Inject constructor( diff --git a/app/src/main/java/eu/darken/capod/reaction/core/aap/AapAutoConnect.kt b/app/src/main/java/eu/darken/capod/reaction/core/aap/AapAutoConnect.kt index 0f121301..8a7f1811 100644 --- a/app/src/main/java/eu/darken/capod/reaction/core/aap/AapAutoConnect.kt +++ b/app/src/main/java/eu/darken/capod/reaction/core/aap/AapAutoConnect.kt @@ -6,7 +6,7 @@ import eu.darken.capod.common.debug.logging.Logging.Priority.WARN import eu.darken.capod.common.debug.logging.log import eu.darken.capod.common.debug.logging.logTag import eu.darken.capod.common.flow.setupCommonEventHandlers -import eu.darken.capod.monitor.core.BlePodMonitor +import eu.darken.capod.monitor.core.ble.BlePodMonitor import eu.darken.capod.pods.core.apple.PodModel import eu.darken.capod.pods.core.apple.aap.AapConnectionManager import eu.darken.capod.pods.core.apple.aap.AapPodState @@ -24,9 +24,9 @@ import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import kotlinx.coroutines.withTimeout -import kotlin.time.Duration.Companion.seconds import javax.inject.Inject import javax.inject.Singleton +import kotlin.time.Duration.Companion.seconds @Singleton class AapAutoConnect @Inject constructor( diff --git a/app/src/main/java/eu/darken/capod/troubleshooter/ui/TroubleShooterViewModel.kt b/app/src/main/java/eu/darken/capod/troubleshooter/ui/TroubleShooterViewModel.kt index c778a78b..09b0600a 100644 --- a/app/src/main/java/eu/darken/capod/troubleshooter/ui/TroubleShooterViewModel.kt +++ b/app/src/main/java/eu/darken/capod/troubleshooter/ui/TroubleShooterViewModel.kt @@ -13,8 +13,8 @@ import eu.darken.capod.common.debug.logging.log import eu.darken.capod.common.debug.logging.logTag import eu.darken.capod.common.uix.ViewModel4 import eu.darken.capod.main.core.GeneralSettings -import eu.darken.capod.monitor.core.BlePodMonitor import eu.darken.capod.monitor.core.DeviceMonitor +import eu.darken.capod.monitor.core.ble.BlePodMonitor import eu.darken.capod.monitor.core.primaryDevice import eu.darken.capod.pods.core.apple.ble.BlePodSnapshot import eu.darken.capod.pods.core.unknown.UnknownSnapshotBle diff --git a/app/src/test/java/eu/darken/capod/monitor/core/PodDeviceCacheTest.kt b/app/src/test/java/eu/darken/capod/monitor/core/PodDeviceCacheTest.kt index 41dba4fb..53ff609e 100644 --- a/app/src/test/java/eu/darken/capod/monitor/core/PodDeviceCacheTest.kt +++ b/app/src/test/java/eu/darken/capod/monitor/core/PodDeviceCacheTest.kt @@ -1,5 +1,6 @@ package eu.darken.capod.monitor.core +import eu.darken.capod.monitor.core.cache.CachedDeviceState import eu.darken.capod.pods.core.apple.PodModel import eu.darken.capod.pods.core.apple.aap.AapPodState import eu.darken.capod.pods.core.apple.ble.devices.DualApplePods diff --git a/app/src/test/java/eu/darken/capod/reaction/core/aap/AapAutoConnectTest.kt b/app/src/test/java/eu/darken/capod/reaction/core/aap/AapAutoConnectTest.kt index 8b573892..d46d1c69 100644 --- a/app/src/test/java/eu/darken/capod/reaction/core/aap/AapAutoConnectTest.kt +++ b/app/src/test/java/eu/darken/capod/reaction/core/aap/AapAutoConnectTest.kt @@ -2,12 +2,12 @@ package eu.darken.capod.reaction.core.aap import eu.darken.capod.common.bluetooth.BluetoothDevice2 import eu.darken.capod.common.bluetooth.BluetoothManager2 -import eu.darken.capod.monitor.core.BlePodMonitor -import eu.darken.capod.pods.core.apple.ble.BlePodSnapshot +import eu.darken.capod.monitor.core.ble.BlePodMonitor import eu.darken.capod.pods.core.apple.PodModel import eu.darken.capod.pods.core.apple.aap.AapConnectionManager import eu.darken.capod.pods.core.apple.aap.AapPodState import eu.darken.capod.pods.core.apple.aap.protocol.AapDeviceInfo +import eu.darken.capod.pods.core.apple.ble.BlePodSnapshot import eu.darken.capod.profiles.core.AppleDeviceProfile import eu.darken.capod.profiles.core.DeviceProfile import eu.darken.capod.profiles.core.DeviceProfilesRepo