parent
1d25feadf9
commit
ac626917f4
|
@ -0,0 +1,7 @@
|
|||
package cash.z.ecc.android.di.annotation
|
||||
|
||||
import javax.inject.Scope
|
||||
|
||||
@Scope
|
||||
@Retention(AnnotationRetention.SOURCE)
|
||||
annotation class SynchronizerScope
|
|
@ -9,9 +9,10 @@ import javax.inject.Singleton
|
|||
@Singleton
|
||||
@Component(modules = [AppModule::class])
|
||||
interface AppComponent {
|
||||
|
||||
// Subcomponents
|
||||
fun mainActivityComponent(): MainActivitySubcomponent.Factory
|
||||
fun mainActivitySubcomponent(): MainActivitySubcomponent.Factory
|
||||
fun synchronizerSubcomponent(): SynchronizerSubcomponent.Factory
|
||||
fun initializerSubcomponent(): InitializerSubcomponent.Factory
|
||||
|
||||
@Component.Factory
|
||||
interface Factory {
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
package cash.z.ecc.android.di.component
|
||||
|
||||
import cash.z.ecc.android.ZcashWalletApp
|
||||
import cash.z.ecc.android.di.annotation.ActivityScope
|
||||
import cash.z.ecc.android.di.annotation.SynchronizerScope
|
||||
import cash.z.ecc.android.di.module.InitializerModule
|
||||
import cash.z.wallet.sdk.Initializer
|
||||
import dagger.BindsInstance
|
||||
import dagger.Subcomponent
|
||||
|
||||
@SynchronizerScope
|
||||
@Subcomponent(modules = [InitializerModule::class])
|
||||
interface InitializerSubcomponent {
|
||||
|
||||
fun initializer(): Initializer
|
||||
fun birthdayStore(): Initializer.WalletBirthdayStore
|
||||
|
||||
@Subcomponent.Factory
|
||||
interface Factory {
|
||||
fun create(@BindsInstance birthdayStore: Initializer.WalletBirthdayStore = Initializer.DefaultBirthdayStore(ZcashWalletApp.instance)): InitializerSubcomponent
|
||||
}
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
package cash.z.ecc.android.di.component
|
||||
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import cash.z.ecc.android.di.annotation.SynchronizerScope
|
||||
import cash.z.ecc.android.di.module.SynchronizerModule
|
||||
import cash.z.wallet.sdk.Initializer
|
||||
import cash.z.wallet.sdk.Synchronizer
|
||||
import dagger.BindsInstance
|
||||
import dagger.Subcomponent
|
||||
import javax.inject.Named
|
||||
|
||||
@SynchronizerScope
|
||||
@Subcomponent(modules = [SynchronizerModule::class])
|
||||
interface SynchronizerSubcomponent {
|
||||
|
||||
fun synchronizer(): Synchronizer
|
||||
|
||||
@Named("Synchronizer") fun viewModelFactory(): ViewModelProvider.Factory
|
||||
|
||||
@Subcomponent.Factory
|
||||
interface Factory {
|
||||
fun create(@BindsInstance initializer: Initializer): SynchronizerSubcomponent
|
||||
}
|
||||
}
|
|
@ -1,8 +0,0 @@
|
|||
package cash.z.ecc.android.di.module
|
||||
|
||||
import dagger.Module
|
||||
|
||||
@Module
|
||||
abstract class AppBindingModule {
|
||||
|
||||
}
|
|
@ -3,9 +3,13 @@ package cash.z.ecc.android.di.module
|
|||
import android.content.ClipboardManager
|
||||
import android.content.Context
|
||||
import cash.z.ecc.android.ZcashWalletApp
|
||||
import cash.z.ecc.android.di.component.InitializerSubcomponent
|
||||
import cash.z.ecc.android.di.component.MainActivitySubcomponent
|
||||
import cash.z.ecc.android.di.component.SynchronizerSubcomponent
|
||||
import cash.z.wallet.sdk.Initializer
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
import dagger.Reusable
|
||||
import javax.inject.Singleton
|
||||
|
||||
@Module(subcomponents = [MainActivitySubcomponent::class])
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
package cash.z.ecc.android.di.module
|
||||
|
||||
import android.content.Context
|
||||
import cash.z.wallet.sdk.Initializer
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
import dagger.Reusable
|
||||
|
||||
@Module
|
||||
class InitializerModule {
|
||||
private val host = "lightd-main.zecwallet.co"
|
||||
private val port = 443
|
||||
|
||||
@Provides
|
||||
@Reusable
|
||||
fun provideInitializer(appContext: Context) = Initializer(appContext, host, port)
|
||||
}
|
|
@ -1,22 +1,16 @@
|
|||
package cash.z.ecc.android.di.module
|
||||
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import cash.z.ecc.android.di.annotation.ActivityScope
|
||||
import cash.z.ecc.android.di.component.InitializerSubcomponent
|
||||
import cash.z.ecc.android.di.component.SynchronizerSubcomponent
|
||||
import cash.z.ecc.android.feedback.*
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
import dagger.multibindings.IntoSet
|
||||
|
||||
@Module
|
||||
@Module(includes = [ViewModelsActivityModule::class], subcomponents = [SynchronizerSubcomponent::class, InitializerSubcomponent::class])
|
||||
class MainActivityModule {
|
||||
|
||||
@Provides
|
||||
@ActivityScope
|
||||
fun provideViewModelProvider(activity: FragmentActivity, factory: ViewModelProvider.Factory): ViewModelProvider {
|
||||
return ViewModelProvider(activity, factory)
|
||||
}
|
||||
|
||||
@Provides
|
||||
@ActivityScope
|
||||
fun provideFeedback(): Feedback = Feedback()
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
package cash.z.ecc.android.di.module
|
||||
|
||||
import android.content.Context
|
||||
import cash.z.ecc.android.di.annotation.SynchronizerScope
|
||||
import cash.z.wallet.sdk.Initializer
|
||||
import cash.z.wallet.sdk.Synchronizer
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
|
||||
/**
|
||||
* Module that creates the synchronizer from an initializer and also everything that depends on the
|
||||
* synchronizer (because it doesn't exist prior to this module being installed).
|
||||
*/
|
||||
@Module(includes = [ViewModelsSynchronizerModule::class])
|
||||
class SynchronizerModule {
|
||||
|
||||
@Provides
|
||||
@SynchronizerScope
|
||||
fun provideSynchronizer(appContext: Context, initializer: Initializer): Synchronizer {
|
||||
return Synchronizer(appContext, initializer)
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
package cash.z.ecc.android.di.module
|
||||
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import cash.z.ecc.android.di.annotation.ActivityScope
|
||||
import cash.z.ecc.android.di.annotation.SynchronizerScope
|
||||
import cash.z.ecc.android.di.annotation.ViewModelKey
|
||||
import cash.z.ecc.android.di.viewmodel.ViewModelFactory
|
||||
import cash.z.ecc.android.ui.setup.WalletSetupViewModel
|
||||
import dagger.Binds
|
||||
import dagger.Module
|
||||
import dagger.multibindings.IntoMap
|
||||
import javax.inject.Named
|
||||
|
||||
/**
|
||||
* View model related objects, scoped to the activity that do not depend on the Synchronizer. These
|
||||
* are any VMs that must be created before the Synchronizer.
|
||||
*/
|
||||
@Module
|
||||
abstract class ViewModelsActivityModule {
|
||||
|
||||
@ActivityScope
|
||||
@Binds
|
||||
@IntoMap
|
||||
@ViewModelKey(WalletSetupViewModel::class)
|
||||
abstract fun bindWalletSetupViewModel(implementation: WalletSetupViewModel): ViewModel
|
||||
|
||||
/**
|
||||
* Factory for view models that are created until before the Synchronizer exists. This is a
|
||||
* little tricky because we cannot make them all in one place or else they won't be available
|
||||
* to both the parent and the child components. If they all live in the child component, which
|
||||
* isn't created until the synchronizer exists, then the parent component will not have the
|
||||
* view models yet.
|
||||
*/
|
||||
@ActivityScope
|
||||
@Named("BeforeSynchronizer")
|
||||
@Binds
|
||||
abstract fun bindViewModelFactory(viewModelFactory: ViewModelFactory): ViewModelProvider.Factory
|
||||
|
||||
}
|
|
@ -1,55 +0,0 @@
|
|||
package cash.z.ecc.android.di.module
|
||||
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import cash.z.ecc.android.di.annotation.ActivityScope
|
||||
import cash.z.ecc.android.di.annotation.ViewModelKey
|
||||
import cash.z.ecc.android.di.viewmodel.ViewModelFactory
|
||||
import cash.z.ecc.android.ui.home.HomeViewModel
|
||||
import cash.z.ecc.android.ui.send.SendViewModel
|
||||
import cash.z.ecc.android.ui.setup.WalletSetupViewModel
|
||||
import dagger.Binds
|
||||
import dagger.Module
|
||||
import dagger.multibindings.IntoMap
|
||||
|
||||
@Module
|
||||
abstract class ViewModelsModule {
|
||||
|
||||
//
|
||||
// Activity View Models
|
||||
//
|
||||
|
||||
@ActivityScope
|
||||
@Binds
|
||||
@IntoMap
|
||||
@ViewModelKey(WalletSetupViewModel::class)
|
||||
abstract fun bindWalletSetupViewModel(implementation: WalletSetupViewModel): ViewModel
|
||||
|
||||
@ActivityScope
|
||||
@Binds
|
||||
@IntoMap
|
||||
@ViewModelKey(SendViewModel::class)
|
||||
abstract fun bindSendViewModel(implementation: SendViewModel): ViewModel
|
||||
|
||||
|
||||
//
|
||||
// Fragment View Models
|
||||
//
|
||||
|
||||
@ActivityScope
|
||||
@Binds
|
||||
@IntoMap
|
||||
@ViewModelKey(HomeViewModel::class)
|
||||
abstract fun bindHomeViewModel(implementation: HomeViewModel): ViewModel
|
||||
|
||||
|
||||
//
|
||||
// View Model Helpers
|
||||
//
|
||||
|
||||
@ActivityScope
|
||||
@Binds
|
||||
abstract fun bindViewModelFactory(implementation: ViewModelFactory): ViewModelProvider.Factory
|
||||
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
package cash.z.ecc.android.di.module
|
||||
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import cash.z.ecc.android.di.annotation.SynchronizerScope
|
||||
import cash.z.ecc.android.di.annotation.ViewModelKey
|
||||
import cash.z.ecc.android.di.viewmodel.ViewModelFactory
|
||||
import cash.z.ecc.android.ui.detail.WalletDetailViewModel
|
||||
import cash.z.ecc.android.ui.home.HomeViewModel
|
||||
import cash.z.ecc.android.ui.receive.ReceiveViewModel
|
||||
import cash.z.ecc.android.ui.send.SendViewModel
|
||||
import dagger.Binds
|
||||
import dagger.Module
|
||||
import dagger.multibindings.IntoMap
|
||||
import javax.inject.Named
|
||||
|
||||
/**
|
||||
* View model related objects, scoped to the synchronizer.
|
||||
*/
|
||||
@Module
|
||||
abstract class ViewModelsSynchronizerModule {
|
||||
@SynchronizerScope
|
||||
@Binds
|
||||
@IntoMap
|
||||
@ViewModelKey(HomeViewModel::class)
|
||||
abstract fun bindHomeViewModel(implementation: HomeViewModel): ViewModel
|
||||
|
||||
@SynchronizerScope
|
||||
@Binds
|
||||
@IntoMap
|
||||
@ViewModelKey(SendViewModel::class)
|
||||
abstract fun bindSendViewModel(implementation: SendViewModel): ViewModel
|
||||
|
||||
@SynchronizerScope
|
||||
@Binds
|
||||
@IntoMap
|
||||
@ViewModelKey(WalletDetailViewModel::class)
|
||||
abstract fun bindWalletDetailViewModel(implementation: WalletDetailViewModel): ViewModel
|
||||
|
||||
@SynchronizerScope
|
||||
@Binds
|
||||
@IntoMap
|
||||
@ViewModelKey(ReceiveViewModel::class)
|
||||
abstract fun bindReceiveViewModel(implementation: ReceiveViewModel): ViewModel
|
||||
|
||||
|
||||
/**
|
||||
* Factory for view models that are not created until the Synchronizer exists. Only VMs that
|
||||
* require the Synchronizer should wait until it is created. In other words, these are the VMs
|
||||
* that live within the scope of the Synchronizer.
|
||||
*/
|
||||
@SynchronizerScope
|
||||
@Named("Synchronizer")
|
||||
@Binds
|
||||
abstract fun bindViewModelFactory(viewModelFactory: ViewModelFactory): ViewModelProvider.Factory
|
||||
}
|
Loading…
Reference in New Issue