Refactor: FeedbackObservers should not have to know about the Coordinator.

This also makes the initialization of feedback easier to reason about because there is no magic involved with adding the observers.
This commit is contained in:
Kevin Gorham 2019-12-14 15:09:21 -05:00
parent 1af99c0263
commit fcaa04a6fe
No known key found for this signature in database
GPG Key ID: CCA55602DF49FC38
9 changed files with 28 additions and 32 deletions

View File

@ -3,12 +3,20 @@ package cash.z.ecc.android
import android.content.Context
import android.os.Build
import cash.z.ecc.android.di.DaggerAppComponent
import cash.z.ecc.android.feedback.FeedbackCoordinator
import dagger.android.AndroidInjector
import dagger.android.DaggerApplication
import javax.inject.Inject
class ZcashWalletApp : DaggerApplication() {
@Inject
lateinit var feedbackCoordinator: FeedbackCoordinator
@Inject
lateinit var feedbackObservers: Set<@JvmSuppressWildcards FeedbackCoordinator.FeedbackObserver>
var creationTime: Long = 0
private set
@ -22,13 +30,14 @@ class ZcashWalletApp : DaggerApplication() {
Thread.setDefaultUncaughtExceptionHandler(ExceptionReporter(Thread.getDefaultUncaughtExceptionHandler()))
// Twig.plant(TroubleshootingTwig())
feedbackObservers.forEach { feedbackCoordinator.addObserver(it) }
}
/**
* Implement the HasActivityInjector behavior so that dagger knows which [AndroidInjector] to use.
*/
override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
return DaggerAppComponent.builder().create(this)
return DaggerAppComponent.factory().create(this)
}
override fun attachBaseContext(base: Context) {

View File

@ -1,6 +1,5 @@
package cash.z.ecc.android.di
import dagger.Binds
import dagger.Module
@Module

View File

@ -8,6 +8,7 @@ import cash.z.ecc.android.ui.receive.ReceiveFragmentModule
import cash.z.ecc.android.ui.send.SendFragmentModule
import cash.z.ecc.android.ui.setup.BackupFragmentModule
import cash.z.ecc.android.ui.setup.LandingFragmentModule
import dagger.BindsInstance
import dagger.Component
import dagger.android.AndroidInjector
import dagger.android.support.AndroidSupportInjectionModule
@ -33,6 +34,9 @@ import javax.inject.Singleton
]
)
interface AppComponent : AndroidInjector<ZcashWalletApp> {
@Component.Builder
abstract class Builder : AndroidInjector.Builder<ZcashWalletApp>()
@Component.Factory
interface Factory {
fun create(@BindsInstance application: ZcashWalletApp): AppComponent
}
}

View File

@ -22,21 +22,18 @@ class AppModule {
// Feedback Observer Set
//
@Provides
@Singleton
@Provides
@IntoSet
fun provideFeedbackFile(feedbackCoordinator: FeedbackCoordinator)
: FeedbackCoordinator.FeedbackObserver = FeedbackFile(feedbackCoordinator)
fun provideFeedbackFile(): FeedbackCoordinator.FeedbackObserver = FeedbackFile()
@Provides
@Singleton
@Provides
@IntoSet
fun provideFeedbackConsole(feedbackCoordinator: FeedbackCoordinator)
: FeedbackCoordinator.FeedbackObserver = FeedbackConsole(feedbackCoordinator)
fun provideFeedbackConsole(): FeedbackCoordinator.FeedbackObserver = FeedbackConsole()
@Provides
@Singleton
@Provides
@IntoSet
fun provideFeedbackMixpanel(feedbackCoordinator: FeedbackCoordinator)
: FeedbackCoordinator.FeedbackObserver = FeedbackMixpanel(feedbackCoordinator)
fun provideFeedbackMixpanel(): FeedbackCoordinator.FeedbackObserver = FeedbackMixpanel()
}

View File

@ -2,11 +2,7 @@ package cash.z.ecc.android.feedback
import android.util.Log
class FeedbackConsole(coordinator: FeedbackCoordinator) : FeedbackCoordinator.FeedbackObserver {
init {
coordinator.addObserver(this)
}
class FeedbackConsole : FeedbackCoordinator.FeedbackObserver {
override fun onMetric(metric: Feedback.Metric) {
log(metric.toString())

View File

@ -5,13 +5,9 @@ import okio.Okio
import java.io.File
import java.text.SimpleDateFormat
class FeedbackFile(coordinator: FeedbackCoordinator, fileName: String = "feedback.log") :
class FeedbackFile(fileName: String = "feedback.log") :
FeedbackCoordinator.FeedbackObserver {
init {
coordinator.addObserver(this)
}
private val file = File(ZcashWalletApp.instance.noBackupFilesDir, fileName)
private val format = SimpleDateFormat("MM-dd HH:mm:ss.SSS")

View File

@ -5,11 +5,7 @@ import cash.z.ecc.android.ZcashWalletApp
import cash.z.ecc.android.ext.toAppString
import com.mixpanel.android.mpmetrics.MixpanelAPI
class FeedbackMixpanel(coordinator: FeedbackCoordinator) : FeedbackCoordinator.FeedbackObserver {
init {
coordinator.addObserver(this)
}
class FeedbackMixpanel : FeedbackCoordinator.FeedbackObserver {
private val mixpanel =
MixpanelAPI.getInstance(ZcashWalletApp.instance, R.string.mixpanel_project.toAppString())

View File

@ -6,6 +6,7 @@ import android.content.Context
import android.graphics.Color
import android.media.MediaPlayer
import android.os.Bundle
import android.os.FileObserver
import android.os.SystemClock
import android.os.Vibrator
import android.util.Log
@ -36,10 +37,8 @@ class MainActivity : DaggerAppCompatActivity() {
@Inject
lateinit var feedback: Feedback
@Inject
lateinit var observers: Set<@JvmSuppressWildcards FeedbackCoordinator.FeedbackObserver>
lateinit var navController: NavController
private val mediaPlayer: MediaPlayer = MediaPlayer()
override fun onCreate(savedInstanceState: Bundle?) {

View File

@ -30,7 +30,7 @@ class FeedbackCoordinator(val feedback: Feedback) {
private var contextMetrics = Dispatchers.IO
private var contextActions = Dispatchers.IO
private val jobs = CompositeJob()
private val observers = mutableListOf<FeedbackObserver>()
private val observers = mutableSetOf<FeedbackObserver>()
/**
* Wait for any in-flight listeners to complete.