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 35e9984be3
No known key found for this signature in database
GPG Key ID: CCA55602DF49FC38
8 changed files with 42 additions and 41 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,6 +30,7 @@ class ZcashWalletApp : DaggerApplication() {
Thread.setDefaultUncaughtExceptionHandler(ExceptionReporter(Thread.getDefaultUncaughtExceptionHandler()))
// Twig.plant(TroubleshootingTwig())
feedbackObservers.forEach { feedbackCoordinator.addObserver(it) }
}
/**

View File

@ -1,9 +1,36 @@
package cash.z.ecc.android.di
import cash.z.ecc.android.feedback.FeedbackConsole
import cash.z.ecc.android.feedback.FeedbackCoordinator
import cash.z.ecc.android.feedback.FeedbackFile
import cash.z.ecc.android.feedback.FeedbackMixpanel
import dagger.Binds
import dagger.Module
import dagger.multibindings.IntoSet
import javax.inject.Singleton
@Module
abstract class AppBindingModule {
//
// Feedback Observer Set
//
@Singleton
@Binds
@IntoSet
abstract fun provideFeedbackFile(implementation: FeedbackFile)
: FeedbackCoordinator.FeedbackObserver
@Singleton
@Binds
@IntoSet
abstract fun provideFeedbackConsole(implementation: FeedbackConsole)
: FeedbackCoordinator.FeedbackObserver
@Singleton
@Binds
@IntoSet
abstract fun provideFeedbackMixpanel(implementation: FeedbackMixpanel)
: FeedbackCoordinator.FeedbackObserver
}

View File

@ -17,26 +17,4 @@ class AppModule {
@Singleton
fun provideFeedbackCoordinator(feedback: Feedback) = FeedbackCoordinator(feedback)
//
// Feedback Observer Set
//
@Provides
@Singleton
@IntoSet
fun provideFeedbackFile(feedbackCoordinator: FeedbackCoordinator)
: FeedbackCoordinator.FeedbackObserver = FeedbackFile(feedbackCoordinator)
@Provides
@Singleton
@IntoSet
fun provideFeedbackConsole(feedbackCoordinator: FeedbackCoordinator)
: FeedbackCoordinator.FeedbackObserver = FeedbackConsole(feedbackCoordinator)
@Provides
@Singleton
@IntoSet
fun provideFeedbackMixpanel(feedbackCoordinator: FeedbackCoordinator)
: FeedbackCoordinator.FeedbackObserver = FeedbackMixpanel(feedbackCoordinator)
}

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.