diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c6598e557..beda009d7b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,8 @@ - [Feature] Per app loading in installed tab - [Feature] Add ability to preview screenshots of fap entries - [Refactor] Migrate to markdown renderer from upstream -- [Refactor] Basic implementation of new transport ble +- [Refactor] Basic implementation of new transport ble +- [Refactor] Remove kapt from service modules - [FIX] Replace decompose push to move safety push - [FIX] Add fallback for parse url from "Open in App" URI - [FIX] Multiple internet connection placeholders on Hub Apps screen diff --git a/components/bridge/service/impl/build.gradle.kts b/components/bridge/service/impl/build.gradle.kts index 561835773b..8cff3d2bd9 100644 --- a/components/bridge/service/impl/build.gradle.kts +++ b/components/bridge/service/impl/build.gradle.kts @@ -1,6 +1,5 @@ plugins { id("flipper.android-lib") - id("kotlin-kapt") id("flipper.anvil") } @@ -45,7 +44,6 @@ dependencies { // Dagger deps implementation(libs.dagger) - kapt(libs.dagger.kapt) testImplementation(projects.components.core.test) testImplementation(libs.junit) diff --git a/components/bridge/service/impl/src/main/java/com/flipperdevices/bridge/service/impl/FlipperService.kt b/components/bridge/service/impl/src/main/java/com/flipperdevices/bridge/service/impl/FlipperService.kt index b1421a31c1..7b6c763d67 100644 --- a/components/bridge/service/impl/src/main/java/com/flipperdevices/bridge/service/impl/FlipperService.kt +++ b/components/bridge/service/impl/src/main/java/com/flipperdevices/bridge/service/impl/FlipperService.kt @@ -5,7 +5,7 @@ import android.os.Binder import androidx.lifecycle.LifecycleService import androidx.lifecycle.lifecycleScope import com.flipperdevices.bridge.service.api.FlipperServiceApi -import com.flipperdevices.bridge.service.impl.di.DaggerFlipperBleServiceComponent +import com.flipperdevices.bridge.service.impl.di.FlipperBleServiceComponent import com.flipperdevices.bridge.service.impl.di.FlipperServiceComponent import com.flipperdevices.bridge.service.impl.notification.FLIPPER_NOTIFICATION_ID import com.flipperdevices.bridge.service.impl.notification.FlipperNotificationHelper @@ -27,14 +27,13 @@ class FlipperService : LifecycleService(), LogTagProvider { override val TAG = "FlipperService-${hashCode()}" private val listener = CompositeFlipperServiceErrorListenerImpl() - private val bleServiceComponent by lazy { - DaggerFlipperBleServiceComponent.factory() - .create( - deps = ComponentHolder.component(), - context = this, - scope = lifecycleScope + Dispatchers.Default, - serviceErrorListener = listener - ) + private val bleServiceComponent: FlipperBleServiceComponent by lazy { + FlipperBleServiceComponent.ManualFactory.create( + deps = ComponentHolder.component(), + context = this, + scope = lifecycleScope + Dispatchers.Default, + serviceErrorListener = listener + ) } private val serviceApi by bleServiceComponent.serviceApiImpl private val binder by lazy { FlipperServiceBinder(serviceApi, listener) } diff --git a/components/bridge/service/impl/src/main/java/com/flipperdevices/bridge/service/impl/di/FlipperBleServiceComponent.kt b/components/bridge/service/impl/src/main/java/com/flipperdevices/bridge/service/impl/di/FlipperBleServiceComponent.kt index e04360d0c6..4abfeaee6e 100644 --- a/components/bridge/service/impl/src/main/java/com/flipperdevices/bridge/service/impl/di/FlipperBleServiceComponent.kt +++ b/components/bridge/service/impl/src/main/java/com/flipperdevices/bridge/service/impl/di/FlipperBleServiceComponent.kt @@ -3,22 +3,18 @@ package com.flipperdevices.bridge.service.impl.di import android.bluetooth.BluetoothAdapter import android.content.Context import androidx.datastore.core.DataStore -import com.flipperdevices.bridge.api.di.FlipperBleServiceGraph import com.flipperdevices.bridge.api.error.FlipperServiceErrorListener import com.flipperdevices.bridge.api.manager.FlipperReadyListener import com.flipperdevices.bridge.api.scanner.FlipperScanner +import com.flipperdevices.bridge.impl.manager.service.FlipperVersionApiImpl import com.flipperdevices.bridge.service.impl.FlipperServiceApiImpl import com.flipperdevices.core.di.AppGraph -import com.flipperdevices.core.di.SingleIn import com.flipperdevices.core.preference.pb.PairSettings import com.flipperdevices.core.preference.pb.Settings import com.flipperdevices.metric.api.MetricApi import com.flipperdevices.shake2report.api.Shake2ReportApi import com.flipperdevices.unhandledexception.api.UnhandledExceptionApi import com.squareup.anvil.annotations.ContributesTo -import com.squareup.anvil.annotations.MergeComponent -import dagger.BindsInstance -import dagger.Component import kotlinx.coroutines.CoroutineScope import javax.inject.Provider @@ -32,23 +28,28 @@ interface FlipperBleServiceComponentDependencies { val bluetoothAdapter: BluetoothAdapter val flipperReadyListeners: Set val unhandledExceptionApi: UnhandledExceptionApi + val flipperVersionApiImpl: FlipperVersionApiImpl } -@SingleIn(FlipperBleServiceGraph::class) -@MergeComponent( - FlipperBleServiceGraph::class, - dependencies = [FlipperBleServiceComponentDependencies::class] -) -interface FlipperBleServiceComponent : FlipperBleServiceComponentDependencies { +interface FlipperBleServiceComponent { val serviceApiImpl: Provider - @Component.Factory - interface Factory { + /** + * This [ManualFactory] is required to escape from usage of kapt inside this module. + * + * [ManualFactory.create] will return manually created [FlipperBleServiceComponent] instance + */ + object ManualFactory { fun create( deps: FlipperBleServiceComponentDependencies, - @BindsInstance context: Context, - @BindsInstance scope: CoroutineScope, - @BindsInstance serviceErrorListener: FlipperServiceErrorListener - ): FlipperBleServiceComponent + context: Context, + scope: CoroutineScope, + serviceErrorListener: FlipperServiceErrorListener + ): FlipperBleServiceComponent = FlipperBleServiceComponentImpl( + deps = deps, + context = context, + scope = scope, + serviceErrorListener = serviceErrorListener + ) } } diff --git a/components/bridge/service/impl/src/main/java/com/flipperdevices/bridge/service/impl/di/FlipperBleServiceComponentImpl.kt b/components/bridge/service/impl/src/main/java/com/flipperdevices/bridge/service/impl/di/FlipperBleServiceComponentImpl.kt new file mode 100644 index 0000000000..408c368afd --- /dev/null +++ b/components/bridge/service/impl/src/main/java/com/flipperdevices/bridge/service/impl/di/FlipperBleServiceComponentImpl.kt @@ -0,0 +1,108 @@ +package com.flipperdevices.bridge.service.impl.di + +import android.content.Context +import com.flipperdevices.bridge.api.error.FlipperServiceErrorListener +import com.flipperdevices.bridge.api.manager.delegates.FlipperLagsDetector +import com.flipperdevices.bridge.impl.manager.FlipperBleManagerImpl +import com.flipperdevices.bridge.impl.manager.service.FlipperInformationApiImpl +import com.flipperdevices.bridge.impl.manager.service.RestartRPCApiImpl +import com.flipperdevices.bridge.impl.manager.service.request.FlipperRequestApiImpl +import com.flipperdevices.bridge.service.impl.FlipperServiceApiImpl +import com.flipperdevices.bridge.service.impl.delegate.FlipperActionNotifierImpl +import com.flipperdevices.bridge.service.impl.delegate.FlipperLagsDetectorImpl +import com.flipperdevices.bridge.service.impl.delegate.FlipperSafeConnectWrapper +import com.flipperdevices.bridge.service.impl.delegate.FlipperServiceConnectDelegate +import kotlinx.coroutines.CoroutineScope +import javax.inject.Provider + +class FlipperBleServiceComponentImpl( + deps: FlipperBleServiceComponentDependencies, + context: Context, + scope: CoroutineScope, + serviceErrorListener: FlipperServiceErrorListener +) : FlipperBleServiceComponent, + FlipperBleServiceComponentDependencies by deps { + + private val flipperActionNotifier by lazy { + FlipperActionNotifierImpl(scope = scope) + } + + private val restartRPCApiImpl by lazy { + RestartRPCApiImpl( + serviceApiProvider = { serviceApiImpl.get() } + ) + } + + private val flipperInformationApiImpl by lazy { + FlipperInformationApiImpl( + scopeProvider = { scope }, + metricApiProvider = { metricApi }, + dataStoreFirstPairProvider = { pairSettingsStore }, + shake2ReportApiProvider = { sentryApi } + ) + } + + private val flipperLagsDetectorImpl: FlipperLagsDetector by lazy { + FlipperLagsDetectorImpl( + scopeProvider = { scope }, + serviceApiProvider = { flipperServiceApi }, + flipperActionNotifierProvider = { flipperActionNotifier } + ) + } + + private val flipperRequestApiImpl by lazy { + FlipperRequestApiImpl( + scopeProvider = { scope }, + flipperActionNotifierProvider = { flipperActionNotifier }, + lagsDetectorProvider = { flipperLagsDetectorImpl }, + restartRPCApiProvider = { restartRPCApiImpl }, + sentryApiProvider = { sentryApi } + ) + } + + private val flipperBleManagerImpl by lazy { + FlipperBleManagerImpl( + context = context, + settingsStore = settingsStore, + scope = scope, + serviceErrorListener = serviceErrorListener, + flipperActionNotifier = flipperActionNotifier, + restartRPCApiProvider = { restartRPCApiImpl }, + informationApiProvider = { flipperInformationApiImpl }, + flipperRequestApiProvider = { flipperRequestApiImpl }, + flipperVersionApiProvider = { flipperVersionApiImpl }, + flipperReadyListenersProvider = { flipperReadyListeners } + ) + } + + private val flipperServiceConnectDelegate by lazy { + FlipperServiceConnectDelegate( + bleManagerProvider = { flipperBleManagerImpl }, + contextProvider = { context }, + scannerProvider = { bluetoothScanner }, + adapterProvider = { bluetoothAdapter } + ) + } + + private val flipperSafeConnectWrapper by lazy { + FlipperSafeConnectWrapper( + scopeProvider = { scope }, + serviceErrorListenerProvider = { serviceErrorListener }, + connectDelegateProvider = { flipperServiceConnectDelegate } + ) + } + + private val flipperServiceApi by lazy { + FlipperServiceApiImpl( + scopeProvider = { scope }, + pairSettingsStoreProvider = { pairSettingsStore }, + bleManagerProvider = { flipperBleManagerImpl }, + flipperSafeConnectWrapperProvider = { flipperSafeConnectWrapper }, + unhandledExceptionApiProvider = { unhandledExceptionApi } + ) + } + + override val serviceApiImpl: Provider = Provider { + flipperServiceApi + } +} diff --git a/components/bridge/synchronization/impl/build.gradle.kts b/components/bridge/synchronization/impl/build.gradle.kts index 1594d11381..606b3d7e73 100644 --- a/components/bridge/synchronization/impl/build.gradle.kts +++ b/components/bridge/synchronization/impl/build.gradle.kts @@ -3,11 +3,9 @@ plugins { id("flipper.android-compose") id("flipper.anvil") id("kotlinx-serialization") - id("kotlin-kapt") } android.namespace = "com.flipperdevices.bridge.synchronization.impl" -anvil.generateDaggerFactories.set(false) // DaggerTaskSynchronizationComponent dependencies { implementation(projects.components.bridge.synchronization.api) @@ -44,7 +42,6 @@ dependencies { // Dagger deps implementation(libs.dagger) - kapt(libs.dagger.kapt) // Testing testImplementation(projects.components.core.test) diff --git a/components/bridge/synchronization/impl/src/main/java/com/flipperdevices/bridge/synchronization/impl/SynchronizationTask.kt b/components/bridge/synchronization/impl/src/main/java/com/flipperdevices/bridge/synchronization/impl/SynchronizationTask.kt index dc6c4e7d93..b6e58adb8b 100644 --- a/components/bridge/synchronization/impl/src/main/java/com/flipperdevices/bridge/synchronization/impl/SynchronizationTask.kt +++ b/components/bridge/synchronization/impl/src/main/java/com/flipperdevices/bridge/synchronization/impl/SynchronizationTask.kt @@ -8,7 +8,7 @@ import com.flipperdevices.bridge.dao.api.model.FlipperKeyType import com.flipperdevices.bridge.service.api.FlipperServiceApi import com.flipperdevices.bridge.service.api.provider.FlipperServiceProvider import com.flipperdevices.bridge.synchronization.api.SynchronizationState -import com.flipperdevices.bridge.synchronization.impl.di.DaggerTaskSynchronizationComponent +import com.flipperdevices.bridge.synchronization.impl.di.TaskSynchronizationComponent import com.flipperdevices.bridge.synchronization.impl.model.RestartSynchronizationException import com.flipperdevices.core.di.AppGraph import com.flipperdevices.core.di.ComponentHolder @@ -141,7 +141,7 @@ class SynchronizationTaskImpl( progressTracker: ProgressWrapperTracker ) = withContext(Dispatchers.Default) { val startSynchronizationTime = System.currentTimeMillis() - val taskComponent = DaggerTaskSynchronizationComponent.factory() + val taskComponent = TaskSynchronizationComponent.ManualFactory .create( ComponentHolder.component(), serviceApi.requestApi, diff --git a/components/bridge/synchronization/impl/src/main/java/com/flipperdevices/bridge/synchronization/impl/di/TaskSynchronizationComponent.kt b/components/bridge/synchronization/impl/src/main/java/com/flipperdevices/bridge/synchronization/impl/di/TaskSynchronizationComponent.kt index 6e81e4a27e..94a6e834a9 100644 --- a/components/bridge/synchronization/impl/src/main/java/com/flipperdevices/bridge/synchronization/impl/di/TaskSynchronizationComponent.kt +++ b/components/bridge/synchronization/impl/src/main/java/com/flipperdevices/bridge/synchronization/impl/di/TaskSynchronizationComponent.kt @@ -15,12 +15,8 @@ import com.flipperdevices.bridge.synchronization.impl.repository.FavoriteSynchro import com.flipperdevices.bridge.synchronization.impl.repository.KeysSynchronization import com.flipperdevices.bridge.synchronization.impl.repository.manifest.ManifestRepository import com.flipperdevices.core.di.AppGraph -import com.flipperdevices.core.di.SingleIn import com.flipperdevices.core.preference.pb.Settings import com.squareup.anvil.annotations.ContributesTo -import com.squareup.anvil.annotations.MergeComponent -import dagger.BindsInstance -import dagger.Component @ContributesTo(AppGraph::class) interface TaskSynchronizationComponentDependencies { @@ -35,19 +31,25 @@ interface TaskSynchronizationComponentDependencies { val flipperStorageApi: FlipperStorageApi } -@SingleIn(TaskGraph::class) -@MergeComponent(TaskGraph::class, dependencies = [TaskSynchronizationComponentDependencies::class]) interface TaskSynchronizationComponent { val keysSynchronization: KeysSynchronization val favoriteSynchronization: FavoriteSynchronization val manifestRepository: ManifestRepository - @Component.Factory - interface Factory { + /** + * This [ManualFactory] is required to escape from usage of kapt inside this module. + * + * [ManualFactory.create] will return manually created [TaskSynchronizationComponent] instance + */ + object ManualFactory { fun create( deps: TaskSynchronizationComponentDependencies, - @BindsInstance requestApi: FlipperRequestApi, - @BindsInstance flipperVersionApi: FlipperVersionApi - ): TaskSynchronizationComponent + requestApi: FlipperRequestApi, + flipperVersionApi: FlipperVersionApi + ): TaskSynchronizationComponent = TaskSynchronizationComponentImpl( + deps = deps, + requestApi = requestApi, + flipperVersionApi = flipperVersionApi + ) } } diff --git a/components/bridge/synchronization/impl/src/main/java/com/flipperdevices/bridge/synchronization/impl/di/TaskSynchronizationComponentImpl.kt b/components/bridge/synchronization/impl/src/main/java/com/flipperdevices/bridge/synchronization/impl/di/TaskSynchronizationComponentImpl.kt new file mode 100644 index 0000000000..911d0da6b4 --- /dev/null +++ b/components/bridge/synchronization/impl/src/main/java/com/flipperdevices/bridge/synchronization/impl/di/TaskSynchronizationComponentImpl.kt @@ -0,0 +1,106 @@ +package com.flipperdevices.bridge.synchronization.impl.di + +import com.flipperdevices.bridge.api.manager.FlipperRequestApi +import com.flipperdevices.bridge.api.manager.service.FlipperVersionApi +import com.flipperdevices.bridge.synchronization.impl.executor.AndroidKeyStorage +import com.flipperdevices.bridge.synchronization.impl.executor.DiffKeyExecutorImpl +import com.flipperdevices.bridge.synchronization.impl.executor.FlipperKeyStorage +import com.flipperdevices.bridge.synchronization.impl.repository.FavoriteSynchronization +import com.flipperdevices.bridge.synchronization.impl.repository.FavoriteSynchronizationImpl +import com.flipperdevices.bridge.synchronization.impl.repository.FolderKeySynchronizationImpl +import com.flipperdevices.bridge.synchronization.impl.repository.KeyDiffApplierImpl +import com.flipperdevices.bridge.synchronization.impl.repository.KeysSynchronization +import com.flipperdevices.bridge.synchronization.impl.repository.KeysSynchronizationImpl +import com.flipperdevices.bridge.synchronization.impl.repository.android.AndroidHashRepositoryImpl +import com.flipperdevices.bridge.synchronization.impl.repository.android.SynchronizationStateRepositoryImpl +import com.flipperdevices.bridge.synchronization.impl.repository.flipper.FlipperFavoritesRepositoryImpl +import com.flipperdevices.bridge.synchronization.impl.repository.flipper.FlipperHashRepositoryImpl +import com.flipperdevices.bridge.synchronization.impl.repository.flipper.TimestampSynchronizationCheckerImpl +import com.flipperdevices.bridge.synchronization.impl.repository.manifest.DiffMergeHelperImpl +import com.flipperdevices.bridge.synchronization.impl.repository.manifest.ManifestRepositoryImpl +import com.flipperdevices.bridge.synchronization.impl.repository.manifest.ManifestStorageImpl +import com.flipperdevices.bridge.synchronization.impl.repository.manifest.ManifestTimestampRepositoryImpl + +class TaskSynchronizationComponentImpl( + deps: TaskSynchronizationComponentDependencies, + requestApi: FlipperRequestApi, + flipperVersionApi: FlipperVersionApi +) : TaskSynchronizationComponent, + TaskSynchronizationComponentDependencies by deps { + private val manifestStorage = ManifestStorageImpl(context) + + override val manifestRepository = ManifestRepositoryImpl( + manifestStorage = manifestStorage + ) + + private val androidHashRepositoryImpl = AndroidHashRepositoryImpl() + + private val flipperHashRepository = FlipperHashRepositoryImpl( + flipperStorageApi = flipperStorageApi + ) + + private val synchronizationRepository = SynchronizationStateRepositoryImpl( + utilsKeyApi = utilsKeyApi + ) + + private val diffMergeHelper = DiffMergeHelperImpl( + simpleKeyApi = simpleKeyApi, + utilsKeyApi = utilsKeyApi, + updateKeyApi = updateKeyApi + ) + + private val androidStorage = AndroidKeyStorage( + simpleKeyApi = simpleKeyApi, + deleteKeyApi = deleteKeyApi, + flipperFileApi = flipperFileApi + ) + + private val flipperStorage = FlipperKeyStorage( + requestApi = requestApi + ) + + private val diffKeyExecutor = DiffKeyExecutorImpl() + + private val keyDiffApplier = KeyDiffApplierImpl( + diffMergeHelper = diffMergeHelper, + diffKeyExecutor = diffKeyExecutor, + androidStorage = androidStorage, + flipperStorage = flipperStorage + ) + + private val folderKeySynchronization = FolderKeySynchronizationImpl( + androidHashRepository = androidHashRepositoryImpl, + flipperHashRepository = flipperHashRepository, + manifestRepository = manifestRepository, + synchronizationRepository = synchronizationRepository, + simpleKeyApi = simpleKeyApi, + keyDiffApplier = keyDiffApplier, + ) + + private val timestampSynchronizationChecker = TimestampSynchronizationCheckerImpl( + requestApi = requestApi, + flipperVersionApi = flipperVersionApi + ) + + private val manifestTimestampRepository = ManifestTimestampRepositoryImpl( + manifestStorage = manifestStorage + ) + + private val favoritesRepository = FlipperFavoritesRepositoryImpl() + + override val keysSynchronization: KeysSynchronization = KeysSynchronizationImpl( + folderKeySynchronization, + timestampSynchronizationChecker, + manifestTimestampRepository, + manifestRepository, + AndroidHashRepositoryImpl(), + simpleKeyApi + ) + + override val favoriteSynchronization: FavoriteSynchronization = FavoriteSynchronizationImpl( + favoriteApi = favoriteApi, + manifestRepository = manifestRepository, + flipperStorage = flipperStorage, + favoritesRepository = favoritesRepository + ) +} diff --git a/components/keyemulate/api/build.gradle.kts b/components/keyemulate/api/build.gradle.kts index 9a88ab61b9..852abc2af5 100644 --- a/components/keyemulate/api/build.gradle.kts +++ b/components/keyemulate/api/build.gradle.kts @@ -1,7 +1,5 @@ plugins { id("flipper.android-compose") - id("flipper.anvil") - id("kotlin-kapt") } android.namespace = "com.flipperdevices.keyemulate.api" @@ -20,5 +18,4 @@ dependencies { // Dagger deps implementation(libs.dagger) - kapt(libs.dagger.kapt) } diff --git a/components/wearable/emulate/handheld/impl/build.gradle.kts b/components/wearable/emulate/handheld/impl/build.gradle.kts index 385ce258a4..9c7265c03b 100644 --- a/components/wearable/emulate/handheld/impl/build.gradle.kts +++ b/components/wearable/emulate/handheld/impl/build.gradle.kts @@ -1,11 +1,9 @@ plugins { id("flipper.android-lib") id("flipper.anvil") - id("kotlin-kapt") } android.namespace = "com.flipperdevices.wearable.emulate.handheld.impl" -anvil.generateDaggerFactories.set(false) // WearServiceComponent dependencies { implementation(projects.components.wearable.emulate.common) @@ -28,7 +26,6 @@ dependencies { // Dagger deps implementation(libs.dagger) - kapt(libs.dagger.kapt) implementation(libs.wear) implementation(libs.wear.gms) diff --git a/components/wearable/emulate/handheld/impl/src/main/java/com/flipperdevices/wearable/emulate/handheld/impl/di/WearServiceComponent.kt b/components/wearable/emulate/handheld/impl/src/main/java/com/flipperdevices/wearable/emulate/handheld/impl/di/WearServiceComponent.kt index 63567ab193..04fc5a5a7f 100644 --- a/components/wearable/emulate/handheld/impl/src/main/java/com/flipperdevices/wearable/emulate/handheld/impl/di/WearServiceComponent.kt +++ b/components/wearable/emulate/handheld/impl/src/main/java/com/flipperdevices/wearable/emulate/handheld/impl/di/WearServiceComponent.kt @@ -4,7 +4,6 @@ import android.content.Context import com.flipperdevices.bridge.dao.api.delegates.key.SimpleKeyApi import com.flipperdevices.bridge.service.api.provider.FlipperServiceProvider import com.flipperdevices.core.di.AppGraph -import com.flipperdevices.core.di.SingleIn import com.flipperdevices.keyemulate.api.EmulateHelper import com.flipperdevices.keyparser.api.KeyParser import com.flipperdevices.wearable.emulate.common.WearableCommandInputStream @@ -12,9 +11,6 @@ import com.flipperdevices.wearable.emulate.common.WearableCommandOutputStream import com.flipperdevices.wearable.emulate.common.ipcemulate.Main import com.flipperdevices.wearable.emulate.handheld.impl.request.WearableCommandProcessor import com.squareup.anvil.annotations.ContributesTo -import com.squareup.anvil.annotations.MergeComponent -import dagger.BindsInstance -import dagger.Component import kotlinx.coroutines.CoroutineScope @ContributesTo(AppGraph::class) @@ -26,21 +22,23 @@ interface WearServiceComponentDependencies { val keyParser: KeyParser } -@SingleIn(WearHandheldGraph::class) -@MergeComponent( - WearHandheldGraph::class, - dependencies = [WearServiceComponentDependencies::class] -) -interface WearServiceComponent : WearServiceComponentDependencies { +interface WearServiceComponent { val commandInputStream: WearableCommandInputStream val commandOutputStream: WearableCommandOutputStream val commandProcessors: Set - @Component.Factory - interface Factory { + /** + * This [ManualFactory] is required to escape from usage of kapt inside this module. + * + * [ManualFactory.create] will return manually created [WearServiceComponent] instance + */ + object ManualFactory { fun create( deps: WearServiceComponentDependencies, - @BindsInstance scope: CoroutineScope - ): WearServiceComponent + scope: CoroutineScope + ): WearServiceComponent = WearServiceComponentImpl( + deps = deps, + scope = scope + ) } } diff --git a/components/wearable/emulate/handheld/impl/src/main/java/com/flipperdevices/wearable/emulate/handheld/impl/di/WearServiceComponentImpl.kt b/components/wearable/emulate/handheld/impl/src/main/java/com/flipperdevices/wearable/emulate/handheld/impl/di/WearServiceComponentImpl.kt new file mode 100644 index 0000000000..0ee84d68f9 --- /dev/null +++ b/components/wearable/emulate/handheld/impl/src/main/java/com/flipperdevices/wearable/emulate/handheld/impl/di/WearServiceComponentImpl.kt @@ -0,0 +1,70 @@ +package com.flipperdevices.wearable.emulate.handheld.impl.di + +import com.flipperdevices.wearable.emulate.common.WearableCommandInputStream +import com.flipperdevices.wearable.emulate.common.WearableCommandOutputStream +import com.flipperdevices.wearable.emulate.common.ipcemulate.Main.MainRequest +import com.flipperdevices.wearable.emulate.common.ipcemulate.Main.MainResponse +import com.flipperdevices.wearable.emulate.handheld.impl.request.WearableAppStateProcessor +import com.flipperdevices.wearable.emulate.handheld.impl.request.WearableCommandProcessor +import com.flipperdevices.wearable.emulate.handheld.impl.request.WearableFlipperStatusProcessor +import com.flipperdevices.wearable.emulate.handheld.impl.request.WearablePingProcessor +import com.flipperdevices.wearable.emulate.handheld.impl.request.WearableSendProcessor +import com.flipperdevices.wearable.emulate.handheld.impl.request.WearableStartEmulateProcessor +import com.flipperdevices.wearable.emulate.handheld.impl.request.WearableStopEmulateProcessor +import com.google.android.gms.wearable.Wearable +import kotlinx.coroutines.CoroutineScope + +class WearServiceComponentImpl( + deps: WearServiceComponentDependencies, + scope: CoroutineScope +) : WearServiceComponent, WearServiceComponentDependencies by deps { + private val channelClient = Wearable.getChannelClient(context) + override val commandInputStream = WearableCommandInputStream( + channelClient = channelClient, + parser = MainRequest::parseDelimitedFrom + ) + override val commandOutputStream = WearableCommandOutputStream( + channelClient = channelClient + ) + override val commandProcessors: Set = buildSet { + WearableAppStateProcessor( + serviceProvider = flipperServiceProvider, + commandOutputStream = commandOutputStream, + scope = scope + ).run(::add) + WearableFlipperStatusProcessor( + commandInputStream = commandInputStream, + commandOutputStream = commandOutputStream, + scope = scope, + flipperServiceProvider = flipperServiceProvider + ).run(::add) + WearablePingProcessor( + commandInputStream = commandInputStream, + commandOutputStream = commandOutputStream, + scope = scope, + ).run(::add) + WearableSendProcessor( + commandInputStream = commandInputStream, + commandOutputStream = commandOutputStream, + scope = scope, + serviceProvider = flipperServiceProvider, + emulateHelper = emulateHelper, + simpleKeyApi = simpleKeyApi, + keyParser = keyParser + ).run(::add) + WearableStartEmulateProcessor( + commandInputStream = commandInputStream, + commandOutputStream = commandOutputStream, + scope = scope, + serviceProvider = flipperServiceProvider, + emulateHelper = emulateHelper, + ).run(::add) + WearableStopEmulateProcessor( + commandInputStream = commandInputStream, + commandOutputStream = commandOutputStream, + scope = scope, + serviceProvider = flipperServiceProvider, + emulateHelper = emulateHelper, + ).run(::add) + } +} diff --git a/components/wearable/emulate/handheld/impl/src/main/java/com/flipperdevices/wearable/emulate/handheld/impl/di/WearableCommandStreamModule.kt b/components/wearable/emulate/handheld/impl/src/main/java/com/flipperdevices/wearable/emulate/handheld/impl/di/WearableCommandStreamModule.kt deleted file mode 100644 index 93ef383024..0000000000 --- a/components/wearable/emulate/handheld/impl/src/main/java/com/flipperdevices/wearable/emulate/handheld/impl/di/WearableCommandStreamModule.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.flipperdevices.wearable.emulate.handheld.impl.di - -import android.content.Context -import com.flipperdevices.core.di.SingleIn -import com.flipperdevices.wearable.emulate.common.WearableCommandInputStream -import com.flipperdevices.wearable.emulate.common.WearableCommandOutputStream -import com.flipperdevices.wearable.emulate.common.ipcemulate.Main.MainRequest -import com.flipperdevices.wearable.emulate.common.ipcemulate.Main.MainResponse -import com.google.android.gms.wearable.ChannelClient -import com.google.android.gms.wearable.Wearable -import com.squareup.anvil.annotations.ContributesTo -import dagger.Module -import dagger.Provides -import dagger.Reusable - -@Module -@ContributesTo(WearHandheldGraph::class) -class WearableCommandStreamModule { - @Provides - @Reusable - fun provideChannelClient(context: Context) = Wearable.getChannelClient(context) - - @Provides - @SingleIn(WearHandheldGraph::class) - fun provideCommandInputStream( - channelClient: ChannelClient - ) = WearableCommandInputStream(channelClient, MainRequest::parseDelimitedFrom) - - @Provides - @SingleIn(WearHandheldGraph::class) - fun provideCommandOutputStream( - channelClient: ChannelClient - ) = WearableCommandOutputStream(channelClient) -} diff --git a/components/wearable/emulate/handheld/impl/src/main/java/com/flipperdevices/wearable/emulate/handheld/impl/service/WearRequestForegroundService.kt b/components/wearable/emulate/handheld/impl/src/main/java/com/flipperdevices/wearable/emulate/handheld/impl/service/WearRequestForegroundService.kt index 1e67bbf77d..e59b253c04 100644 --- a/components/wearable/emulate/handheld/impl/src/main/java/com/flipperdevices/wearable/emulate/handheld/impl/service/WearRequestForegroundService.kt +++ b/components/wearable/emulate/handheld/impl/src/main/java/com/flipperdevices/wearable/emulate/handheld/impl/service/WearRequestForegroundService.kt @@ -8,7 +8,7 @@ import androidx.lifecycle.lifecycleScope import com.flipperdevices.core.di.ComponentHolder import com.flipperdevices.core.log.LogTagProvider import com.flipperdevices.core.log.info -import com.flipperdevices.wearable.emulate.handheld.impl.di.DaggerWearServiceComponent +import com.flipperdevices.wearable.emulate.handheld.impl.di.WearServiceComponent import com.google.android.gms.wearable.ChannelClient.Channel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.plus @@ -17,7 +17,7 @@ private const val NOTIFICATION_ID = 100 class WearRequestForegroundService : LifecycleService(), WearRequestChannelBinder, LogTagProvider { override val TAG = "WearRequestForegroundService-${hashCode()}" - private val wearServiceComponent = DaggerWearServiceComponent.factory().create( + private val wearServiceComponent = WearServiceComponent.ManualFactory.create( ComponentHolder.component(), lifecycleScope + Dispatchers.Default )