Skip to content

Commit

Permalink
Refactor/remove kapt from modules (#818)
Browse files Browse the repository at this point in the history
**Background**

Currently, some modules with custom Graphs and Components requires to
have kapt inside them, which is blocker for KMP integration

**Changes**

- Removed kapt from non-app/non-sample modules
- Create manual implementations for DI Components
- Added `getOrCreate` for `ComponentHolder` to add self-created DI
Components

**Test plan**

- Launch application
- See sync, wear service is working
  • Loading branch information
makeevrserg committed Apr 12, 2024
1 parent c5a7bd1 commit a26ad4a
Show file tree
Hide file tree
Showing 15 changed files with 341 additions and 101 deletions.
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 0 additions & 2 deletions components/bridge/service/impl/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
plugins {
id("flipper.android-lib")
id("kotlin-kapt")
id("flipper.anvil")
}

Expand Down Expand Up @@ -45,7 +44,6 @@ dependencies {

// Dagger deps
implementation(libs.dagger)
kapt(libs.dagger.kapt)

testImplementation(projects.components.core.test)
testImplementation(libs.junit)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -32,23 +28,28 @@ interface FlipperBleServiceComponentDependencies {
val bluetoothAdapter: BluetoothAdapter
val flipperReadyListeners: Set<FlipperReadyListener>
val unhandledExceptionApi: UnhandledExceptionApi
val flipperVersionApiImpl: FlipperVersionApiImpl
}

@SingleIn(FlipperBleServiceGraph::class)
@MergeComponent(
FlipperBleServiceGraph::class,
dependencies = [FlipperBleServiceComponentDependencies::class]
)
interface FlipperBleServiceComponent : FlipperBleServiceComponentDependencies {
interface FlipperBleServiceComponent {
val serviceApiImpl: Provider<FlipperServiceApiImpl>

@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
)
}
}
Original file line number Diff line number Diff line change
@@ -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<FlipperServiceApiImpl> = Provider {
flipperServiceApi
}
}
3 changes: 0 additions & 3 deletions components/bridge/synchronization/impl/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -44,7 +42,6 @@ dependencies {

// Dagger deps
implementation(libs.dagger)
kapt(libs.dagger.kapt)

// Testing
testImplementation(projects.components.core.test)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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
)
}
}
Loading

0 comments on commit a26ad4a

Please sign in to comment.