diff --git a/android/DartsScorecard/app/build.gradle b/android/DartsScorecard/app/build.gradle index 8a8107d9..41e5ef83 100644 --- a/android/DartsScorecard/app/build.gradle +++ b/android/DartsScorecard/app/build.gradle @@ -1,7 +1,6 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' -apply plugin: 'kotlin-android-extensions' apply plugin: 'com.google.firebase.crashlytics' apply from: '../scripts/android_common.gradle' apply from: '../scripts/versioning.gradle' @@ -20,7 +19,7 @@ android { applicationIdSuffix ".dev" } release { - shrinkResources true + shrinkResources false // Resource shrinker cannot be used for multi-apk applications } } @@ -28,6 +27,8 @@ android { jniLibs.srcDir 'libs' jni.srcDirs = [] //disable automatic ndk-build call } + + dynamicFeatures = [':sounds'] } dependencies { @@ -51,19 +52,23 @@ dependencies { implementation "com.google.firebase:firebase-config:$fbConfig" implementation "com.google.firebase:firebase-database:$fbDatabase" implementation "com.google.firebase:firebase-ads:$fbAds" + implementation "com.google.firebase:firebase-crashlytics:$fbCrash" + implementation "com.google.android.play:core:$playCore" + implementation "com.google.android.play:core-ktx:$playCoreKtx" + implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion" + implementation "androidx.core:core-ktx:$xCore" implementation "androidx.room:room-runtime:$room" implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle" implementation "androidx.constraintlayout:constraintlayout:$xConstraint" implementation "androidx.preference:preference-ktx:$xPreferences" + implementation "com.github.bumptech.glide:glide:$glide" implementation "com.github.yalantis:jellytoolbar:$jelly" implementation "de.hdodenhof:circleimageview:$circleImageView" implementation "com.airbnb.android:lottie:$lottieVersion" implementation "com.google.code.gson:gson:$gson" - implementation "com.google.firebase:firebase-crashlytics:$fbCrash" - // Leaks debugImplementation "com.squareup.leakcanary:leakcanary-android:$leakCanary" diff --git a/android/DartsScorecard/app/release/output.json b/android/DartsScorecard/app/release/output.json deleted file mode 100644 index f571e316..00000000 --- a/android/DartsScorecard/app/release/output.json +++ /dev/null @@ -1 +0,0 @@ -[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1},"path":"app-release.apk","properties":{"packageId":"nl.entreco.dartsscorecard","split":"","minSdkVersion":"23"}}] \ No newline at end of file diff --git a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/App.kt b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/App.kt index de686081..7951e315 100644 --- a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/App.kt +++ b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/App.kt @@ -2,6 +2,7 @@ package nl.entreco.dartsscorecard import android.app.Application import android.os.StrictMode +import com.google.android.play.core.splitcompat.SplitCompatApplication import nl.entreco.dartsscorecard.di.application.AppComponent import nl.entreco.dartsscorecard.di.application.AppModule import nl.entreco.dartsscorecard.di.application.DaggerAppComponent @@ -10,7 +11,7 @@ import nl.entreco.dartsscorecard.di.application.DaggerAppComponent /** * Created by Entreco on 14/11/2017. */ -class App : Application() { +class App : SplitCompatApplication() { val appComponent: AppComponent by lazy { DaggerAppComponent.builder().appModule(AppModule(this)).build() diff --git a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/base/ViewModelActivity.kt b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/base/ViewModelActivity.kt index bfa8a93a..53d4442d 100644 --- a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/base/ViewModelActivity.kt +++ b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/base/ViewModelActivity.kt @@ -1,13 +1,13 @@ package nl.entreco.dartsscorecard.base import android.app.Activity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import android.os.Bundle +import android.view.MenuItem import androidx.annotation.StringRes import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.Toolbar -import android.view.MenuItem +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider import nl.entreco.dartsscorecard.App import nl.entreco.dartsscorecard.R import nl.entreco.dartsscorecard.di.viewmodel.ViewModelComponent @@ -19,7 +19,7 @@ import nl.entreco.dartsscorecard.faq.WtfActivity */ abstract class ViewModelActivity : AppCompatActivity() { - private val styler by lazy { Styler( this) } + private val styler by lazy { Styler(this) } val Activity.app: App get() = application as App @@ -28,7 +28,8 @@ abstract class ViewModelActivity : AppCompatActivity() { @Suppress("UNCHECKED_CAST") inline fun viewModelProvider( mode: LazyThreadSafetyMode = LazyThreadSafetyMode.NONE, - crossinline provider: () -> VM) = lazy(mode) { + crossinline provider: () -> VM, + ) = lazy(mode) { ViewModelProvider(this, object : ViewModelProvider.Factory { override fun create(aClass: Class) = provider() as T1 @@ -37,7 +38,8 @@ abstract class ViewModelActivity : AppCompatActivity() { inline fun componentProvider( mode: LazyThreadSafetyMode = LazyThreadSafetyMode.NONE, - crossinline provider: (ViewModelComponent) -> VM) = lazy(mode) { + crossinline provider: (ViewModelComponent) -> VM, + ) = lazy(mode) { val component = app.appComponent.plus(ViewModelModule(this)) provider(component) } diff --git a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/beta/BetaAnimator.kt b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/beta/BetaAnimator.kt index 23be1743..067d4494 100644 --- a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/beta/BetaAnimator.kt +++ b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/beta/BetaAnimator.kt @@ -3,7 +3,6 @@ package nl.entreco.dartsscorecard.beta import android.view.View import com.google.android.material.appbar.AppBarLayout import com.google.android.material.bottomsheet.BottomSheetBehavior -import kotlinx.android.synthetic.main.include_beta_detail.view.voteFab import nl.entreco.dartsscorecard.databinding.ActivityBetaBinding import kotlin.math.abs import kotlin.math.max @@ -15,7 +14,7 @@ class BetaAnimator(binding: ActivityBetaBinding) { private val behaviour: BottomSheetBehavior = BottomSheetBehavior.from(binding.sheet) private val appBar = binding.includeToolbar.betaAppbar - private val animator = BetaAnimatorHandler(appBar, binding.includeToolbar.toolbar, binding.sheet, binding.sheet.voteFab) + private val animator = BetaAnimatorHandler(appBar, binding.includeToolbar.toolbar, binding.sheet, binding.includeBetaDetail.voteFab) internal var toggler: Toggler? = null internal var swapper: Swapper? = null diff --git a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/di/play/Play01Component.kt b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/di/play/Play01Component.kt index 243e97f0..f9c029b3 100644 --- a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/di/play/Play01Component.kt +++ b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/di/play/Play01Component.kt @@ -1,6 +1,8 @@ package nl.entreco.dartsscorecard.di.play import dagger.Subcomponent +import nl.entreco.dartsscorecard.dynamic.DynamicInstaller +import nl.entreco.dartsscorecard.dynamic.Installer import nl.entreco.dartsscorecard.play.Play01Navigator import nl.entreco.dartsscorecard.play.Play01ViewModel import nl.entreco.dartsscorecard.play.input.InputViewModel @@ -22,6 +24,7 @@ interface Play01Component { fun inputViewModel(): InputViewModel fun statViewModel(): LiveStatViewModel fun finishUsecase(): GetFinishUsecase + fun installer() : Installer fun billing() : BillingRepo fun ads(): AdViewModel } \ No newline at end of file diff --git a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/di/play/Play01Module.kt b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/di/play/Play01Module.kt index ced78655..2b4f17a4 100644 --- a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/di/play/Play01Module.kt +++ b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/di/play/Play01Module.kt @@ -2,39 +2,44 @@ package nl.entreco.dartsscorecard.di.play import android.content.ComponentName import android.content.Context -import android.media.MediaPlayer -import android.media.SoundPool +import com.google.android.play.core.splitinstall.SplitInstallManager +import com.google.android.play.core.splitinstall.SplitInstallManagerFactory +import com.google.android.play.core.splitinstall.SplitInstallRequest import com.google.firebase.remoteconfig.FirebaseRemoteConfig import dagger.Module import dagger.Provides -import nl.entreco.dartsscorecard.R import nl.entreco.dartsscorecard.archive.ArchiveJobService import nl.entreco.dartsscorecard.archive.ArchiveServiceLauncher -import nl.entreco.dartsscorecard.di.profile.ProfileScope +import nl.entreco.dartsscorecard.dynamic.DynamicInstaller +import nl.entreco.dartsscorecard.dynamic.Installer +import nl.entreco.dartsscorecard.dynamic.NoInstaller +import nl.entreco.dartsscorecard.dynamic.NoMusicRepository +import nl.entreco.dartsscorecard.dynamic.NoSoundRepository +import nl.entreco.dartsscorecard.dynamic.SoundModuleProvider import nl.entreco.dartsscorecard.play.Play01Activity import nl.entreco.data.billing.PlayBillingRepository import nl.entreco.data.description.RemoteMatchDescriptionRepository -import nl.entreco.data.sound.LocalMusicRepository -import nl.entreco.data.sound.LocalSoundRepository -import nl.entreco.data.sound.SoundMapper import nl.entreco.domain.beta.donations.MakePurchaseResponse +import nl.entreco.domain.mastercaller.MusicRepository +import nl.entreco.domain.mastercaller.SoundRepository import nl.entreco.domain.repository.AudioPrefRepository import nl.entreco.domain.repository.BillingRepo import nl.entreco.domain.repository.MatchDescriptionRepository -import nl.entreco.domain.repository.MusicRepository -import nl.entreco.domain.repository.SoundRepository import nl.entreco.liblog.Logger import nl.entreco.shared.scopes.ActivityScope import nl.entreco.shared.scopes.ApplicationScope import java.lang.ref.WeakReference +private const val DYNAMIC_PROVIDER = "nl.entreco.dartsscorecard.sounds.DynamicSoundProvider" +private const val SOUNDS = "sounds" + /** * Created by Entreco on 14/11/2017. */ @Module class Play01Module( private val activity: Play01Activity, - private val listener: (MakePurchaseResponse) -> Unit + private val listener: (MakePurchaseResponse) -> Unit, ) { @Provides @@ -51,23 +56,51 @@ class Play01Module( @Provides @Play01Scope - fun provideSoundMapper(): SoundMapper { - return SoundMapper() + fun provideSplitInstallManager(@ActivityScope context: Context): SplitInstallManager { + return SplitInstallManagerFactory.create(context) + } + + @Provides + @Play01Scope + fun provideSplitInstallRequest() = SplitInstallRequest.newBuilder() + .addModule(SOUNDS) + .build() + + @Provides + @Play01Scope + fun provideSoundRepository( + @ActivityScope context: Context, + splitInstallManager: SplitInstallManager, + prefs: AudioPrefRepository, + ): SoundRepository { + return if (splitInstallManager.installedModules.contains(SOUNDS)) { + val provider = Class.forName(DYNAMIC_PROVIDER).kotlin.objectInstance as? SoundModuleProvider + val updatedContext = context.createPackageContext(context.packageName, 0) + provider?.provideSoundRepository(updatedContext.applicationContext, prefs) ?: NoSoundRepository() + } else NoSoundRepository() } @Provides @Play01Scope - fun provideSoundRepository(@ActivityScope context: Context, @Play01Scope mapper: SoundMapper, @Play01Scope prefs: AudioPrefRepository): SoundRepository { - val soundPool = SoundPool.Builder().setMaxStreams(2).build() - return LocalSoundRepository(context, soundPool, prefs, mapper) + fun provideMusicRepository( + @ActivityScope context: Context, + splitInstallManager: SplitInstallManager, + ): MusicRepository { + return if (splitInstallManager.installedModules.contains(SOUNDS)) { + val provider = Class.forName(DYNAMIC_PROVIDER).kotlin.objectInstance as? SoundModuleProvider + val updatedContext = context.createPackageContext(context.packageName, 0) + provider?.provideMusicRepository(updatedContext.applicationContext) ?: NoMusicRepository() + } else NoMusicRepository() } @Provides @Play01Scope - fun provideMusicRepository(@ActivityScope context: Context): MusicRepository { - val mediaPlayer = MediaPlayer.create(context, R.raw.pdc_tune) - mediaPlayer.isLooping = true - return LocalMusicRepository(mediaPlayer) + fun provideDynamicInstaller( + splitInstallRequest: SplitInstallRequest, + splitInstallManager: SplitInstallManager, + ): Installer { + return if (splitInstallManager.installedModules.contains(SOUNDS)) NoInstaller() + else DynamicInstaller(splitInstallRequest, splitInstallManager) } @Provides diff --git a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/dynamic/DynamicInstaller.kt b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/dynamic/DynamicInstaller.kt new file mode 100644 index 00000000..b2a1ea58 --- /dev/null +++ b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/dynamic/DynamicInstaller.kt @@ -0,0 +1,61 @@ +package nl.entreco.dartsscorecard.dynamic + +import com.google.android.play.core.ktx.status +import com.google.android.play.core.splitinstall.SplitInstallManager +import com.google.android.play.core.splitinstall.SplitInstallRequest +import com.google.android.play.core.splitinstall.SplitInstallSessionState +import com.google.android.play.core.splitinstall.SplitInstallStateUpdatedListener +import com.google.android.play.core.splitinstall.model.SplitInstallSessionStatus + +class DynamicInstaller( + private val request: SplitInstallRequest, + private val manager: SplitInstallManager, +) : Installer { + + private var mySessionId = 0 + + override fun install(callback: SoundInstalledCallback) { + val installListener = InstallListener(callback) + manager.registerListener(installListener) + manager.startInstall(request) + .addOnCompleteListener { } + .addOnSuccessListener { mySessionId = it } + .addOnFailureListener { callback.onError() } + } +} + +class InstallListener( + private val callback: SoundInstalledCallback, +) : SplitInstallStateUpdatedListener { + + override fun onStateUpdate(state: SplitInstallSessionState) { + when (state.status()) { + SplitInstallSessionStatus.DOWNLOADING -> { + val totalBytes = state.totalBytesToDownload() + val bytes = state.bytesDownloaded() + callback.onProgress(bytes, totalBytes) + } + SplitInstallSessionStatus.INSTALLED -> { + + // After a module is installed, you can start accessing its content or + // fire an intent to start an activity in the installed module. + // For other use cases, see access code and resources from installed modules. + + // If the request is an on demand module for an Android Instant App + // running on Android 8.0 (API level 26) or higher, you need to + // update the app context using the SplitInstallHelper API. + callback.onComplete() + } + SplitInstallSessionStatus.CANCELED, + SplitInstallSessionStatus.CANCELING, + SplitInstallSessionStatus.DOWNLOADED, + SplitInstallSessionStatus.FAILED, + SplitInstallSessionStatus.INSTALLING, + SplitInstallSessionStatus.PENDING, + SplitInstallSessionStatus.REQUIRES_USER_CONFIRMATION, + SplitInstallSessionStatus.UNKNOWN -> { + callback.onDebug(state.status()) + } + } + } +} diff --git a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/dynamic/Installer.kt b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/dynamic/Installer.kt new file mode 100644 index 00000000..82fb66a7 --- /dev/null +++ b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/dynamic/Installer.kt @@ -0,0 +1,5 @@ +package nl.entreco.dartsscorecard.dynamic + +interface Installer { + fun install(callback: SoundInstalledCallback) +} \ No newline at end of file diff --git a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/dynamic/NoInstaller.kt b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/dynamic/NoInstaller.kt new file mode 100644 index 00000000..a142d6af --- /dev/null +++ b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/dynamic/NoInstaller.kt @@ -0,0 +1,5 @@ +package nl.entreco.dartsscorecard.dynamic + +class NoInstaller : Installer { + override fun install(callback: SoundInstalledCallback) {} +} \ No newline at end of file diff --git a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/dynamic/NoMusicRepository.kt b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/dynamic/NoMusicRepository.kt new file mode 100644 index 00000000..7253a7ee --- /dev/null +++ b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/dynamic/NoMusicRepository.kt @@ -0,0 +1,14 @@ +package nl.entreco.dartsscorecard.dynamic + +import nl.entreco.domain.mastercaller.MusicRepository + +class NoMusicRepository: MusicRepository { + + override fun play() {} + + override fun pause() {} + + override fun resume() {} + + override fun stop() {} +} \ No newline at end of file diff --git a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/dynamic/NoSoundRepository.kt b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/dynamic/NoSoundRepository.kt new file mode 100644 index 00000000..d1a984be --- /dev/null +++ b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/dynamic/NoSoundRepository.kt @@ -0,0 +1,11 @@ +package nl.entreco.dartsscorecard.dynamic + +import nl.entreco.domain.mastercaller.Sound +import nl.entreco.domain.mastercaller.SoundRepository + +class NoSoundRepository : SoundRepository { + + override fun play(sound: Sound) {} + + override fun release() {} +} \ No newline at end of file diff --git a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/dynamic/SoundInstalledCallback.kt b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/dynamic/SoundInstalledCallback.kt new file mode 100644 index 00000000..5953646d --- /dev/null +++ b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/dynamic/SoundInstalledCallback.kt @@ -0,0 +1,8 @@ +package nl.entreco.dartsscorecard.dynamic + +interface SoundInstalledCallback { + fun onComplete() + fun onProgress(bytes: Long, totalBytes: Long) + fun onError() + fun onDebug(status: Int) +} \ No newline at end of file diff --git a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/dynamic/SoundModuleProvider.kt b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/dynamic/SoundModuleProvider.kt new file mode 100644 index 00000000..41c1b617 --- /dev/null +++ b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/dynamic/SoundModuleProvider.kt @@ -0,0 +1,12 @@ +package nl.entreco.dartsscorecard.dynamic + +import android.content.Context +import nl.entreco.dartsscorecard.di.play.Play01Scope +import nl.entreco.domain.mastercaller.MusicRepository +import nl.entreco.domain.mastercaller.SoundRepository +import nl.entreco.domain.repository.AudioPrefRepository + +interface SoundModuleProvider { + fun provideSoundRepository(context: Context, @Play01Scope prefs: AudioPrefRepository): SoundRepository + fun provideMusicRepository(context: Context): MusicRepository +} \ No newline at end of file diff --git a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/launch/LaunchActivity.kt b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/launch/LaunchActivity.kt index e00375a3..6f47d613 100644 --- a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/launch/LaunchActivity.kt +++ b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/launch/LaunchActivity.kt @@ -6,6 +6,7 @@ import android.graphics.Color import android.os.Bundle import androidx.databinding.DataBindingUtil import androidx.lifecycle.Observer +import com.google.android.play.core.splitcompat.SplitCompat import nl.entreco.dartsscorecard.R import nl.entreco.dartsscorecard.base.ViewModelActivity import nl.entreco.dartsscorecard.databinding.ActivityLaunchBinding diff --git a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/play/Play01Activity.kt b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/play/Play01Activity.kt index c47bc8b5..a9ad0642 100644 --- a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/play/Play01Activity.kt +++ b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/play/Play01Activity.kt @@ -5,14 +5,21 @@ import android.content.Intent import android.os.Bundle import android.view.Menu import android.view.MenuItem +import android.view.View +import android.view.ViewGroup import android.view.WindowManager +import android.widget.ProgressBar +import android.widget.Toast import androidx.appcompat.widget.Toolbar import androidx.databinding.DataBindingUtil +import com.google.android.material.snackbar.Snackbar import nl.entreco.dartsscorecard.R import nl.entreco.dartsscorecard.base.ViewModelActivity import nl.entreco.dartsscorecard.databinding.ActivityPlay01Binding import nl.entreco.dartsscorecard.di.play.Play01Component import nl.entreco.dartsscorecard.di.play.Play01Module +import nl.entreco.dartsscorecard.dynamic.Installer +import nl.entreco.dartsscorecard.dynamic.SoundInstalledCallback import nl.entreco.dartsscorecard.play.input.InputViewModel import nl.entreco.dartsscorecard.play.live.LiveStatViewModel import nl.entreco.dartsscorecard.play.score.ScoreViewModel @@ -23,7 +30,8 @@ import nl.entreco.domain.repository.BillingRepo import nl.entreco.domain.setup.game.CreateGameResponse import nl.entreco.libads.ui.AdViewModel -class Play01Activity : ViewModelActivity() { + +class Play01Activity : ViewModelActivity(), SoundInstalledCallback { private val component: Play01Component by componentProvider { it.plus(Play01Module(this) { response -> @@ -36,6 +44,7 @@ class Play01Activity : ViewModelActivity() { private val statViewModel: LiveStatViewModel by viewModelProvider { component.statViewModel() } private val finishUsecase: GetFinishUsecase by componentProvider { component.finishUsecase() } private val adViewModel: AdViewModel by viewModelProvider { component.ads() } + private val installer: Installer by lazy { component.installer() } private val billingRepo: BillingRepo by lazy { component.billing() } private val navigator: Play01Navigator by lazy { component.navigator() } @@ -103,17 +112,19 @@ class Play01Activity : ViewModelActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { - R.id.menu_play_settings -> { + R.id.menu_play_settings -> { swapStyle() viewModel.loading.set(true) } R.id.menu_music_settings -> { + if (!item.isChecked) installer.install(this) viewModel.toggleBgMusic(item) } R.id.menu_sound_settings -> { + if (!item.isChecked) installer.install(this) viewModel.toggleMasterCaller(item) } - R.id.menu_delete_match -> { + R.id.menu_delete_match -> { viewModel.askToDeleteMatch { onBackPressed() } @@ -129,14 +140,13 @@ class Play01Activity : ViewModelActivity() { companion object { @JvmStatic - fun retrieveSetup(intent: Intent): Play01Request { - return Play01Request(intent.getLongExtra("gameId", -1), - intent.getStringExtra("teamIds").orEmpty(), - intent.getIntExtra("startScore", -1), - intent.getIntExtra("startIndex", -1), - intent.getIntExtra("legs", -1), - intent.getIntExtra("sets", -1)) - } + fun retrieveSetup(intent: Intent) = Play01Request( + intent.getLongExtra("gameId", -1), + intent.getStringExtra("teamIds").orEmpty(), + intent.getIntExtra("startScore", -1), + intent.getIntExtra("startIndex", -1), + intent.getIntExtra("legs", -1), + intent.getIntExtra("sets", -1)) @JvmStatic fun startGame(context: Context, create: CreateGameResponse) { @@ -150,4 +160,20 @@ class Play01Activity : ViewModelActivity() { context.startActivity(intent) } } + + override fun onComplete() { + navigator.doneSnackbar() + } + + override fun onProgress(bytes: Long, totalBytes: Long) { + navigator.showSnackbar((bytes.toFloat() / totalBytes.toFloat() * 100).toInt()) + } + + override fun onError() { + Toast.makeText(this, "Unable to download Sounds", Toast.LENGTH_SHORT).show() + } + + override fun onDebug(status: Int) { + Toast.makeText(this, "Debug code: $status", Toast.LENGTH_SHORT).show() + } } diff --git a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/play/Play01Animator.kt b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/play/Play01Animator.kt index e7a17f31..cfe391b0 100644 --- a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/play/Play01Animator.kt +++ b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/play/Play01Animator.kt @@ -5,10 +5,6 @@ import android.view.ViewPropertyAnimator import android.view.ViewTreeObserver import androidx.viewpager.widget.ViewPager import com.google.android.material.bottomsheet.BottomSheetBehavior -import kotlinx.android.synthetic.main.activity_play_01.view.includeScore -import kotlinx.android.synthetic.main.activity_play_01.view.includeToolbar -import kotlinx.android.synthetic.main.play_01_score.view.footer -import kotlinx.android.synthetic.main.play_01_score.view.header import nl.entreco.dartsscorecard.base.PagerAnimator import nl.entreco.dartsscorecard.base.widget.MaxHeightRecyclerView import nl.entreco.dartsscorecard.databinding.ActivityPlay01Binding @@ -29,8 +25,9 @@ class Play01Animator(binding: ActivityPlay01Binding) { private val animator = Play01AnimatorHandler(binding.root, binding.includeScore.scoreSheet, binding.includeInput.fab, binding.includeMain.mainSheet, binding.includeMain.version, binding.includeInput.inputResume, pager, binding.includeScore.teamContainer, inputSheet, - binding.root.includeScore.header, - binding.root.includeScore.footer, binding.root.includeToolbar) + binding.includeScore.header, + binding.includeScore.footer, + binding.includeToolbar.toolbar) init { animator.calculateHeightForScoreView() diff --git a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/play/Play01Navigator.kt b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/play/Play01Navigator.kt index 6ac6f959..6e9da92f 100644 --- a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/play/Play01Navigator.kt +++ b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/play/Play01Navigator.kt @@ -1,7 +1,7 @@ package nl.entreco.dartsscorecard.play -import com.google.android.material.snackbar.Snackbar import android.view.View +import com.google.android.material.snackbar.Snackbar import nl.entreco.dartsscorecard.R import nl.entreco.dartsscorecard.profile.view.ProfileActivity import nl.entreco.domain.model.players.Bot @@ -11,12 +11,16 @@ import javax.inject.Inject /** * Created by entreco on 24/02/2018. */ -class Play01Navigator @Inject constructor(private val activity: Play01Activity) { +class Play01Navigator @Inject constructor( + private val activity: Play01Activity, +) { + + private var snackbar: Snackbar? = null fun gotoTeamProfile(view: View, team: Team) { val teams = team.players.map { it.id }.filter { it > 0 }.toLongArray() when { - teams.isEmpty() -> { + teams.isEmpty() -> { Snackbar.make(view, R.string.err_player_was_deleted, Snackbar.LENGTH_INDEFINITE) .setAction(android.R.string.ok) { } .show() @@ -26,9 +30,28 @@ class Play01Navigator @Inject constructor(private val activity: Play01Activity) .setAction(android.R.string.ok) { } .show() } - else -> { + else -> { ProfileActivity.launch(activity, teams, view) } } } + + fun showSnackbar(percentage: Int) { + if (snackbar == null) { + snackbar = Snackbar.make(activity.findViewById(R.id.play_root), "Downloading Soundpack", Snackbar.LENGTH_INDEFINITE) + snackbar?.show() + } else if(snackbar?.isShown == true){ + snackbar?.setText("Downloading Soundpack\nProgress ($percentage%)") + } + } + + fun doneSnackbar() { + snackbar?.setAction("Restart") { + activity.runOnUiThread { + activity.finish() + snackbar = null + } + } + snackbar?.show() + } } diff --git a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/play/Play01ViewModel.kt b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/play/Play01ViewModel.kt index 79948666..31bb55c9 100644 --- a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/play/Play01ViewModel.kt +++ b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/play/Play01ViewModel.kt @@ -11,6 +11,11 @@ import nl.entreco.dartsscorecard.base.DialogHelper import nl.entreco.dartsscorecard.play.score.GameLoadedNotifier import nl.entreco.dartsscorecard.play.score.TeamScoreListener import nl.entreco.dartsscorecard.play.score.UiCallback +import nl.entreco.domain.mastercaller.MasterCaller +import nl.entreco.domain.mastercaller.MasterCallerRequest +import nl.entreco.domain.mastercaller.MusicPlayer +import nl.entreco.domain.mastercaller.ToggleMusicUsecase +import nl.entreco.domain.mastercaller.ToggleSoundUsecase import nl.entreco.domain.model.Game import nl.entreco.domain.model.Next import nl.entreco.domain.model.Score @@ -24,11 +29,6 @@ import nl.entreco.domain.play.listeners.PlayerListener import nl.entreco.domain.play.listeners.ScoreListener import nl.entreco.domain.play.listeners.SpecialEventListener import nl.entreco.domain.play.listeners.StatListener -import nl.entreco.domain.play.mastercaller.MasterCaller -import nl.entreco.domain.play.mastercaller.MasterCallerRequest -import nl.entreco.domain.play.mastercaller.MusicPlayer -import nl.entreco.domain.play.mastercaller.ToggleMusicUsecase -import nl.entreco.domain.play.mastercaller.ToggleSoundUsecase import nl.entreco.domain.play.revanche.RevancheRequest import nl.entreco.domain.play.revanche.RevancheResponse import nl.entreco.domain.play.revanche.RevancheUsecase @@ -64,7 +64,7 @@ class Play01ViewModel @Inject constructor( private val askForRatingUsecase: AskForRatingUsecase, private val audioPrefRepository: AudioPrefRepository, private val adViewModel: AdViewModel, - @ActivityScope private val logger: Logger + @ActivityScope private val logger: Logger, ) : BaseViewModel(), UiCallback, InputListener { val loading = ObservableBoolean(true) @@ -78,8 +78,10 @@ class Play01ViewModel @Inject constructor( private var load: GameLoadedNotifier? = null private var loaders: Array>? = null - fun load(request: Play01Request, load: GameLoadedNotifier, - vararg loaders: GameLoadedNotifier) { + fun load( + request: Play01Request, load: GameLoadedNotifier, + vararg loaders: GameLoadedNotifier, + ) { this.load = load this.loaders = arrayOf(*loaders) this.playGameUsecase.loadGameAndStart(request, @@ -101,8 +103,10 @@ class Play01ViewModel @Inject constructor( } } - private fun onGameOk(request: Play01Request, response: Play01Response?, - revancheResponse: RevancheResponse?) { + private fun onGameOk( + request: Play01Request, response: Play01Response?, + revancheResponse: RevancheResponse?, + ) { this.request = request this.game = response?.game ?: revancheResponse!!.game this.teams = response?.teams ?: revancheResponse!!.teams @@ -128,9 +132,11 @@ class Play01ViewModel @Inject constructor( } } - fun registerListeners(scoreListener: ScoreListener, statListener: StatListener, - specialEventListener: SpecialEventListener<*>, - vararg playerListeners: PlayerListener) { + fun registerListeners( + scoreListener: ScoreListener, statListener: StatListener, + specialEventListener: SpecialEventListener<*>, + vararg playerListeners: PlayerListener, + ) { gameListeners.registerListeners(scoreListener, statListener, specialEventListener, *playerListeners) } @@ -217,21 +223,22 @@ class Play01ViewModel @Inject constructor( private fun notifyMasterCaller(next: Next, turn: Turn) { when (next.state) { - State.START -> masterCaller.play(MasterCallerRequest(start = true)) - State.LEG -> masterCaller.play(MasterCallerRequest(leg = true)) - State.SET -> masterCaller.play(MasterCallerRequest(set = true)) - State.MATCH -> masterCaller.play(MasterCallerRequest(match = true)) + State.START -> masterCaller.play(MasterCallerRequest(start = true)) + State.LEG -> masterCaller.play(MasterCallerRequest(leg = true)) + State.SET -> masterCaller.play(MasterCallerRequest(set = true)) + State.MATCH -> masterCaller.play(MasterCallerRequest(match = true)) State.ERR_BUST -> masterCaller.play(MasterCallerRequest(0)) - else -> masterCaller.play(MasterCallerRequest(turn.total())) + else -> masterCaller.play(MasterCallerRequest(turn.total())) } } private fun showInterstitial(next: Next) { when (next.state) { State.START -> adViewModel.provideInterstitial() - State.SET -> adViewModel.provideInterstitial() + State.SET -> adViewModel.provideInterstitial() State.MATCH -> adViewModel.provideInterstitial() - else -> { /* ignore */ } + else -> { /* ignore */ + } } } diff --git a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/play/live/TeamLiveStatModel.kt b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/play/live/TeamLiveStatModel.kt index 411961bf..8fed21f5 100644 --- a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/play/live/TeamLiveStatModel.kt +++ b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/play/live/TeamLiveStatModel.kt @@ -8,8 +8,10 @@ import nl.entreco.domain.model.players.Team /** * Created by entreco on 11/01/2018. */ -class TeamLiveStatModel(val team: Team, - private val liveStats: MutableList = mutableListOf()) { +class TeamLiveStatModel( + val team: Team, + private val liveStats: MutableList = mutableListOf(), +) { companion object { const val empty = "--" @@ -81,7 +83,7 @@ class TeamLiveStatModel(val team: Team, private fun updateHighestScore() { when (val value = liveStats .filter { it.highest.isNotEmpty() } - .maxBy { it.highest[0] } + .maxByOrNull { it.highest[0] } ?.highest?.firstOrNull()) { null -> hScore.set(empty) else -> hScore.set("$value") @@ -91,7 +93,7 @@ class TeamLiveStatModel(val team: Team, private fun updateHighestCheckout() { when (val value = liveStats .filter { it.highestCo.isNotEmpty() } - .maxBy { it.highestCo[0] } + .maxByOrNull { it.highestCo[0] } ?.highestCo?.firstOrNull()) { null -> hCo.set(empty) else -> hCo.set("$value") @@ -144,7 +146,7 @@ class TeamLiveStatModel(val team: Team, private fun update(set: Int, darts: Int, total: Int, nAtCheckout: Int, checkouts: Int) { val avg = when (darts) { 0 -> empty - else -> "%.2f".format(total / darts.toDouble() * 3) + else -> "%.2f".format(total / darts.toDouble() * 3) } val co = "$checkouts/$nAtCheckout" val du = when (nAtCheckout) { diff --git a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/settings/SettingsViewModel.kt b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/settings/SettingsViewModel.kt index b6424689..4076193b 100644 --- a/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/settings/SettingsViewModel.kt +++ b/android/DartsScorecard/app/src/main/java/nl/entreco/dartsscorecard/settings/SettingsViewModel.kt @@ -8,8 +8,8 @@ import androidx.databinding.ObservableInt import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import nl.entreco.dartsscorecard.base.BaseViewModel -import nl.entreco.domain.play.mastercaller.ToggleMusicUsecase -import nl.entreco.domain.play.mastercaller.ToggleSoundUsecase +import nl.entreco.domain.mastercaller.ToggleMusicUsecase +import nl.entreco.domain.mastercaller.ToggleSoundUsecase import nl.entreco.domain.repository.AudioPrefRepository import nl.entreco.domain.repository.BotPrefRepository import nl.entreco.shared.toSingleEvent diff --git a/android/DartsScorecard/app/src/main/res/layout-land/activity_play_01.xml b/android/DartsScorecard/app/src/main/res/layout-land/activity_play_01.xml index bf591e11..bf469384 100644 --- a/android/DartsScorecard/app/src/main/res/layout-land/activity_play_01.xml +++ b/android/DartsScorecard/app/src/main/res/layout-land/activity_play_01.xml @@ -35,6 +35,7 @@ diff --git a/android/DartsScorecard/app/src/main/res/layout/activity_play_01.xml b/android/DartsScorecard/app/src/main/res/layout/activity_play_01.xml index a7a572dc..bb2924b2 100644 --- a/android/DartsScorecard/app/src/main/res/layout/activity_play_01.xml +++ b/android/DartsScorecard/app/src/main/res/layout/activity_play_01.xml @@ -35,6 +35,7 @@ + + sounds + \ No newline at end of file diff --git a/android/DartsScorecard/app/src/test/java/nl/entreco/dartsscorecard/di/play/Play01ModuleTest.kt b/android/DartsScorecard/app/src/test/java/nl/entreco/dartsscorecard/di/play/Play01ModuleTest.kt index e07a6e42..4b59052b 100644 --- a/android/DartsScorecard/app/src/test/java/nl/entreco/dartsscorecard/di/play/Play01ModuleTest.kt +++ b/android/DartsScorecard/app/src/test/java/nl/entreco/dartsscorecard/di/play/Play01ModuleTest.kt @@ -1,13 +1,8 @@ package nl.entreco.dartsscorecard.di.play import android.content.Context -import android.content.SharedPreferences -import android.media.SoundPool -import com.nhaarman.mockito_kotlin.whenever import nl.entreco.dartsscorecard.play.Play01Activity -import nl.entreco.data.sound.SoundMapper import nl.entreco.domain.beta.donations.MakePurchaseResponse -import nl.entreco.domain.repository.AudioPrefRepository import org.junit.Assert.assertEquals import org.junit.Assert.assertNotNull import org.junit.Test @@ -22,9 +17,6 @@ import org.mockito.junit.MockitoJUnitRunner class Play01ModuleTest { @Mock private lateinit var mockListener: (MakePurchaseResponse) -> Unit - @Mock private lateinit var mockSharedPrefs: SharedPreferences - @Mock private lateinit var mockAudioPrefs: AudioPrefRepository - @Mock private lateinit var mockMapper: SoundMapper @Mock private lateinit var mockContext: Context @Mock private lateinit var mockActivity: Play01Activity @@ -40,12 +32,7 @@ class Play01ModuleTest { @Test(expected = NullPointerException::class) // SoundPool.Builder fun `it should provide SoundRepository`() { - assertNotNull(subject().provideSoundRepository(mockContext, mockMapper, mockAudioPrefs)) - } - - @Test - fun `it should provide soundMapper`() { - assertNotNull(subject().provideSoundMapper()) + assertNotNull(subject().provideSoundRepository()) } @Test diff --git a/android/DartsScorecard/app/src/test/java/nl/entreco/dartsscorecard/play/Play01ViewModelMasterCallerTest.kt b/android/DartsScorecard/app/src/test/java/nl/entreco/dartsscorecard/play/Play01ViewModelMasterCallerTest.kt index c0a2f7fa..5b8a22f3 100644 --- a/android/DartsScorecard/app/src/test/java/nl/entreco/dartsscorecard/play/Play01ViewModelMasterCallerTest.kt +++ b/android/DartsScorecard/app/src/test/java/nl/entreco/dartsscorecard/play/Play01ViewModelMasterCallerTest.kt @@ -6,25 +6,21 @@ import com.nhaarman.mockito_kotlin.* import nl.entreco.dartsscorecard.R import nl.entreco.libads.ui.AdViewModel import nl.entreco.dartsscorecard.base.DialogHelper -import nl.entreco.dartsscorecard.play.bot.CalculateBotScoreUsecase import nl.entreco.dartsscorecard.play.score.GameLoadedNotifier import nl.entreco.domain.model.* import nl.entreco.domain.model.players.Player import nl.entreco.domain.model.players.Team -import nl.entreco.domain.play.mastercaller.* +import nl.entreco.dartsscorecard.sounds.mastercaller.* import nl.entreco.domain.play.revanche.RevancheUsecase import nl.entreco.domain.play.start.Play01Request import nl.entreco.domain.play.start.Play01Response import nl.entreco.domain.play.start.Play01Usecase import nl.entreco.domain.rating.AskForRatingUsecase -import nl.entreco.domain.repository.AudioPrefRepository +import nl.entreco.dartsscorecard.sounds.AudioPrefRepository import nl.entreco.domain.settings.ScoreSettings import nl.entreco.liblog.Logger import org.junit.Assert.assertEquals import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.Mock -import org.mockito.junit.MockitoJUnitRunner /** * Created by entreco on 14/03/2018. @@ -36,7 +32,7 @@ class Play01ViewModelMasterCallerTest { private val mockPlayGameUsecase: Play01Usecase = mock() private val mockAskForRatingUsecase: AskForRatingUsecase = mock() private val mockToggleSoundUsecase: ToggleSoundUsecase = mock() - private val mockAudioPrefs: AudioPrefRepository = mock() + private val mockAudioPrefs: nl.entreco.dartsscorecard.sounds.AudioPrefRepository = mock() private val mockAdProvider: AdViewModel = mock() private val mockToggleMusicUsecase: ToggleMusicUsecase = mock() private val mockMusicPlayer: MusicPlayer = mock() diff --git a/android/DartsScorecard/app/src/test/java/nl/entreco/dartsscorecard/play/Play01ViewModelRevancheTest.kt b/android/DartsScorecard/app/src/test/java/nl/entreco/dartsscorecard/play/Play01ViewModelRevancheTest.kt index 5ef69b8c..6e065fbb 100644 --- a/android/DartsScorecard/app/src/test/java/nl/entreco/dartsscorecard/play/Play01ViewModelRevancheTest.kt +++ b/android/DartsScorecard/app/src/test/java/nl/entreco/dartsscorecard/play/Play01ViewModelRevancheTest.kt @@ -7,29 +7,25 @@ import com.nhaarman.mockito_kotlin.verify import com.nhaarman.mockito_kotlin.whenever import nl.entreco.libads.ui.AdViewModel import nl.entreco.dartsscorecard.base.DialogHelper -import nl.entreco.dartsscorecard.play.bot.CalculateBotScoreUsecase import nl.entreco.dartsscorecard.play.score.GameLoadedNotifier import nl.entreco.domain.model.Game import nl.entreco.domain.model.Next import nl.entreco.domain.model.State import nl.entreco.domain.model.players.Team -import nl.entreco.domain.play.mastercaller.MasterCaller -import nl.entreco.domain.play.mastercaller.MusicPlayer -import nl.entreco.domain.play.mastercaller.ToggleMusicUsecase -import nl.entreco.domain.play.mastercaller.ToggleSoundUsecase +import nl.entreco.dartsscorecard.sounds.mastercaller.MasterCaller +import nl.entreco.dartsscorecard.sounds.mastercaller.MusicPlayer +import nl.entreco.dartsscorecard.sounds.mastercaller.ToggleMusicUsecase +import nl.entreco.dartsscorecard.sounds.mastercaller.ToggleSoundUsecase import nl.entreco.domain.play.revanche.RevancheResponse import nl.entreco.domain.play.revanche.RevancheUsecase import nl.entreco.domain.play.start.Play01Request import nl.entreco.domain.play.start.Play01Response import nl.entreco.domain.play.start.Play01Usecase import nl.entreco.domain.rating.AskForRatingUsecase -import nl.entreco.domain.repository.AudioPrefRepository +import nl.entreco.dartsscorecard.sounds.AudioPrefRepository import nl.entreco.domain.settings.ScoreSettings import nl.entreco.liblog.Logger import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.Mock -import org.mockito.junit.MockitoJUnitRunner /** * Created by entreco on 19/02/2018. @@ -40,7 +36,7 @@ class Play01ViewModelRevancheTest { private val mockToggleMusicUsecase: ToggleMusicUsecase = mock() private val mockMusicPlayer: MusicPlayer = mock() private val mockToggleSoundUsecase: ToggleSoundUsecase = mock() - private val mockAudioPrefs: AudioPrefRepository = mock() + private val mockAudioPrefs: nl.entreco.dartsscorecard.sounds.AudioPrefRepository = mock() private val mockAdProvider: AdViewModel = mock() private val mockRevancheUsecase: RevancheUsecase = mock() private val mockGameListeners: Play01Listeners = mock() diff --git a/android/DartsScorecard/app/src/test/java/nl/entreco/dartsscorecard/play/Play01ViewModelTest.kt b/android/DartsScorecard/app/src/test/java/nl/entreco/dartsscorecard/play/Play01ViewModelTest.kt index f92b1b48..1a350f5e 100644 --- a/android/DartsScorecard/app/src/test/java/nl/entreco/dartsscorecard/play/Play01ViewModelTest.kt +++ b/android/DartsScorecard/app/src/test/java/nl/entreco/dartsscorecard/play/Play01ViewModelTest.kt @@ -3,7 +3,6 @@ package nl.entreco.dartsscorecard.play import com.nhaarman.mockito_kotlin.* import nl.entreco.libads.ui.AdViewModel import nl.entreco.dartsscorecard.base.DialogHelper -import nl.entreco.dartsscorecard.play.bot.CalculateBotScoreUsecase import nl.entreco.dartsscorecard.play.score.GameLoadedNotifier import nl.entreco.dartsscorecard.play.score.TeamScoreListener import nl.entreco.domain.model.* @@ -14,24 +13,23 @@ import nl.entreco.domain.play.listeners.PlayerListener import nl.entreco.domain.play.listeners.ScoreListener import nl.entreco.domain.play.listeners.SpecialEventListener import nl.entreco.domain.play.listeners.StatListener -import nl.entreco.domain.play.mastercaller.MasterCaller -import nl.entreco.domain.play.mastercaller.MusicPlayer -import nl.entreco.domain.play.mastercaller.ToggleMusicUsecase -import nl.entreco.domain.play.mastercaller.ToggleSoundUsecase +import nl.entreco.dartsscorecard.sounds.mastercaller.MasterCaller +import nl.entreco.dartsscorecard.sounds.mastercaller.MusicPlayer +import nl.entreco.dartsscorecard.sounds.mastercaller.ToggleMusicUsecase +import nl.entreco.dartsscorecard.sounds.mastercaller.ToggleSoundUsecase import nl.entreco.domain.play.revanche.RevancheUsecase import nl.entreco.domain.play.start.MarkGameAsFinishedRequest import nl.entreco.domain.play.start.Play01Request import nl.entreco.domain.play.start.Play01Response import nl.entreco.domain.play.start.Play01Usecase import nl.entreco.domain.rating.AskForRatingUsecase -import nl.entreco.domain.repository.AudioPrefRepository +import nl.entreco.dartsscorecard.sounds.AudioPrefRepository import nl.entreco.domain.settings.ScoreSettings import nl.entreco.domain.setup.game.CreateGameRequest import nl.entreco.liblog.Logger import org.junit.Assert.assertArrayEquals import org.junit.Before import org.junit.Test -import org.mockito.Mock import org.mockito.MockitoAnnotations /** @@ -53,7 +51,7 @@ class Play01ViewModelTest { private val mockToggleSoundUsecase: ToggleSoundUsecase = mock() private val mockAskForRatingUsecase: AskForRatingUsecase = mock() private val mockAdProvider: AdViewModel = mock() - private val mockAudioPrefs: AudioPrefRepository = mock() + private val mockAudioPrefs: nl.entreco.dartsscorecard.sounds.AudioPrefRepository = mock() private val mockPlayGameUsecase: Play01Usecase = mock() private val mockRevancheUsecase: RevancheUsecase = mock() private val mock01Listeners: Play01Listeners = mock() diff --git a/android/DartsScorecard/app/src/test/java/nl/entreco/dartsscorecard/play/Play01ViewModelUndoTest.kt b/android/DartsScorecard/app/src/test/java/nl/entreco/dartsscorecard/play/Play01ViewModelUndoTest.kt index 66055255..5e8e7349 100644 --- a/android/DartsScorecard/app/src/test/java/nl/entreco/dartsscorecard/play/Play01ViewModelUndoTest.kt +++ b/android/DartsScorecard/app/src/test/java/nl/entreco/dartsscorecard/play/Play01ViewModelUndoTest.kt @@ -3,16 +3,15 @@ package nl.entreco.dartsscorecard.play import com.nhaarman.mockito_kotlin.* import nl.entreco.libads.ui.AdViewModel import nl.entreco.dartsscorecard.base.DialogHelper -import nl.entreco.dartsscorecard.play.bot.CalculateBotScoreUsecase import nl.entreco.dartsscorecard.play.score.GameLoadedNotifier import nl.entreco.domain.model.Game import nl.entreco.domain.model.Next import nl.entreco.domain.model.State import nl.entreco.domain.model.players.Team -import nl.entreco.domain.play.mastercaller.MasterCaller -import nl.entreco.domain.play.mastercaller.MusicPlayer -import nl.entreco.domain.play.mastercaller.ToggleMusicUsecase -import nl.entreco.domain.play.mastercaller.ToggleSoundUsecase +import nl.entreco.dartsscorecard.sounds.mastercaller.MasterCaller +import nl.entreco.dartsscorecard.sounds.mastercaller.MusicPlayer +import nl.entreco.dartsscorecard.sounds.mastercaller.ToggleMusicUsecase +import nl.entreco.dartsscorecard.sounds.mastercaller.ToggleSoundUsecase import nl.entreco.domain.play.revanche.RevancheUsecase import nl.entreco.domain.play.start.Play01Request import nl.entreco.domain.play.start.Play01Response @@ -20,14 +19,11 @@ import nl.entreco.domain.play.start.Play01Usecase import nl.entreco.domain.play.stats.UndoTurnRequest import nl.entreco.domain.play.stats.UndoTurnResponse import nl.entreco.domain.rating.AskForRatingUsecase -import nl.entreco.domain.repository.AudioPrefRepository +import nl.entreco.dartsscorecard.sounds.AudioPrefRepository import nl.entreco.domain.settings.ScoreSettings import nl.entreco.liblog.Logger import org.junit.Assert.assertEquals import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.Mock -import org.mockito.junit.MockitoJUnitRunner /** * Created by entreco on 25/01/2018. @@ -45,7 +41,7 @@ class Play01ViewModelUndoTest { private val mockMusicPlayer: MusicPlayer = mock() private val mockToggleSoundUsecase: ToggleSoundUsecase = mock() private val mockAskForRatingUsecase: AskForRatingUsecase = mock() - private val mockAudioPrefs: AudioPrefRepository = mock() + private val mockAudioPrefs: nl.entreco.dartsscorecard.sounds.AudioPrefRepository = mock() private val mockLoad: GameLoadedNotifier = mock() private val mockLoaders: GameLoadedNotifier = mock() diff --git a/android/DartsScorecard/data/build.gradle b/android/DartsScorecard/data/build.gradle index 0773bdc8..c4b022d2 100644 --- a/android/DartsScorecard/data/build.gradle +++ b/android/DartsScorecard/data/build.gradle @@ -1,7 +1,6 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' -apply plugin: 'kotlin-android-extensions' apply from: '../scripts/android_common.gradle' android { diff --git a/android/DartsScorecard/data/src/main/java/nl/entreco/data/db/hiscores/HiScoreMapper.kt b/android/DartsScorecard/data/src/main/java/nl/entreco/data/db/hiscores/HiScoreMapper.kt index 17fb0711..fda6c64a 100644 --- a/android/DartsScorecard/data/src/main/java/nl/entreco/data/db/hiscores/HiScoreMapper.kt +++ b/android/DartsScorecard/data/src/main/java/nl/entreco/data/db/hiscores/HiScoreMapper.kt @@ -24,8 +24,8 @@ class HiScoreMapper { HiScoreItem.Num60(stats.sumBy { it.num60s }), HiScoreItem.Num20(stats.sumBy { it.num20s }), HiScoreItem.NumBust(stats.sumBy { it.num0s }), - HiScoreItem.BestMatchAvg(stats.map { avg(it.numDarts, it.totalScore) * 3}.max() ?: 0F), - HiScoreItem.BestMatchCheckout(stats.map { avg(it.numDartsAtFinish, it.numFinishes) * 100}.max() ?: 0F) + HiScoreItem.BestMatchAvg(stats.map { avg(it.numDarts, it.totalScore) * 3}.maxOrNull() ?: 0F), + HiScoreItem.BestMatchCheckout(stats.map { avg(it.numDartsAtFinish, it.numFinishes) * 100}.maxOrNull() ?: 0F) ) return HiScore(player.id, player.name, scores) } diff --git a/android/DartsScorecard/data/src/test/java/nl/entreco/data/sound/LocalSoundRepositoryTest.kt b/android/DartsScorecard/data/src/test/java/nl/entreco/data/sound/LocalSoundRepositoryTest.kt index 3572989d..823f938b 100644 --- a/android/DartsScorecard/data/src/test/java/nl/entreco/data/sound/LocalSoundRepositoryTest.kt +++ b/android/DartsScorecard/data/src/test/java/nl/entreco/data/sound/LocalSoundRepositoryTest.kt @@ -9,10 +9,10 @@ import com.nhaarman.mockito_kotlin.never import com.nhaarman.mockito_kotlin.verify import com.nhaarman.mockito_kotlin.whenever import nl.entreco.data.R -import nl.entreco.domain.play.mastercaller.Fx00 -import nl.entreco.domain.play.mastercaller.Fx01 -import nl.entreco.domain.play.mastercaller.Sound -import nl.entreco.domain.repository.AudioPrefRepository +import nl.entreco.dartsscorecard.sounds.mastercaller.Fx00 +import nl.entreco.dartsscorecard.sounds.mastercaller.Fx01 +import nl.entreco.dartsscorecard.sounds.mastercaller.Sound +import nl.entreco.dartsscorecard.sounds.AudioPrefRepository import org.junit.Assert.assertTrue import org.junit.Test import org.junit.runner.RunWith @@ -29,10 +29,10 @@ class LocalSoundRepositoryTest { private val fx0 = Fx00 private val fx1 = Fx01 - @Mock private lateinit var mockAudioRepo: AudioPrefRepository + @Mock private lateinit var mockAudioRepo: nl.entreco.dartsscorecard.sounds.AudioPrefRepository @Mock private lateinit var mockSoundPool: SoundPool @Mock private lateinit var mockContext: Context - private lateinit var subject: LocalSoundRepository + private lateinit var subject: nl.entreco.dartsscorecard.sounds.LocalSoundRepository private var loadedSounds = emptyList() @Test @@ -96,7 +96,7 @@ class LocalSoundRepositoryTest { private fun givenSubject(enabled: Boolean = true) { whenever(mockAudioRepo.isMasterCallerEnabled()).doReturn(enabled) - subject = LocalSoundRepository(mockContext, mockSoundPool, mockAudioRepo, SoundMapper()) + subject = nl.entreco.dartsscorecard.sounds.LocalSoundRepository(mockContext, mockSoundPool, mockAudioRepo, nl.entreco.dartsscorecard.sounds.SoundMapper()) } private fun givenLoadedSounds(vararg sounds: Sound) { @@ -104,7 +104,7 @@ class LocalSoundRepositoryTest { } private fun whenPlaying(sound: Sound) { - val res = SoundMapper().toRaw(sound) + val res = nl.entreco.dartsscorecard.sounds.SoundMapper().toRaw(sound) whenever(mockSoundPool.load(mockContext, res, normalPriority)).doReturn(sound.hashCode()) subject.play(sound) } diff --git a/android/DartsScorecard/data/src/test/java/nl/entreco/data/sound/SoundMapperTest.kt b/android/DartsScorecard/data/src/test/java/nl/entreco/data/sound/SoundMapperTest.kt index a0a3b9ac..3347ab5a 100644 --- a/android/DartsScorecard/data/src/test/java/nl/entreco/data/sound/SoundMapperTest.kt +++ b/android/DartsScorecard/data/src/test/java/nl/entreco/data/sound/SoundMapperTest.kt @@ -1,7 +1,7 @@ package nl.entreco.data.sound import nl.entreco.data.R -import nl.entreco.domain.play.mastercaller.* +import nl.entreco.dartsscorecard.sounds.mastercaller.* import org.junit.Assert.assertEquals import org.junit.Test @@ -10,7 +10,7 @@ import org.junit.Test */ class SoundMapperTest { - private val subject = SoundMapper() + private val subject = nl.entreco.dartsscorecard.sounds.SoundMapper() @Test fun `it should map None`() { diff --git a/android/DartsScorecard/domain/build.gradle b/android/DartsScorecard/domain/build.gradle index 29673435..c3f9f1d3 100644 --- a/android/DartsScorecard/domain/build.gradle +++ b/android/DartsScorecard/domain/build.gradle @@ -1,7 +1,6 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' -apply plugin: 'kotlin-android-extensions' apply from: '../scripts/android_common.gradle' android { diff --git a/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/play/mastercaller/MasterCaller.kt b/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/mastercaller/MasterCaller.kt similarity index 55% rename from android/DartsScorecard/domain/src/main/java/nl/entreco/domain/play/mastercaller/MasterCaller.kt rename to android/DartsScorecard/domain/src/main/java/nl/entreco/domain/mastercaller/MasterCaller.kt index 033477a6..0e4a9e41 100644 --- a/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/play/mastercaller/MasterCaller.kt +++ b/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/mastercaller/MasterCaller.kt @@ -1,20 +1,22 @@ -package nl.entreco.domain.play.mastercaller +package nl.entreco.domain.mastercaller import nl.entreco.shared.BaseUsecase import nl.entreco.shared.threading.Background import nl.entreco.shared.threading.Foreground -import nl.entreco.domain.repository.SoundRepository import nl.entreco.liblog.Logger import javax.inject.Inject /** * Created by entreco on 14/03/2018. */ -class MasterCaller @Inject constructor(private val logger: Logger, - private val soundRepository: SoundRepository, - bg: Background, fg: Foreground) : BaseUsecase(bg, fg) { +class MasterCaller @Inject constructor( + private val logger: Logger, + private val soundRepository: SoundRepository, + bg: Background, + fg: Foreground +) : BaseUsecase(bg, fg) { - fun play(request: MasterCallerRequest){ + fun play(request: MasterCallerRequest) { onBackground({ soundRepository.play(request.toSound()) }, onEnqueueFailed(request)) @@ -27,6 +29,6 @@ class MasterCaller @Inject constructor(private val logger: Logger, } fun stop() { - onBackground({ soundRepository.release()}, {}) + onBackground({ soundRepository.release() }, {}) } } \ No newline at end of file diff --git a/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/play/mastercaller/MasterCallerRequest.kt b/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/mastercaller/MasterCallerRequest.kt similarity index 94% rename from android/DartsScorecard/domain/src/main/java/nl/entreco/domain/play/mastercaller/MasterCallerRequest.kt rename to android/DartsScorecard/domain/src/main/java/nl/entreco/domain/mastercaller/MasterCallerRequest.kt index 7bc21ae8..05d53bbd 100644 --- a/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/play/mastercaller/MasterCallerRequest.kt +++ b/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/mastercaller/MasterCallerRequest.kt @@ -1,9 +1,15 @@ -package nl.entreco.domain.play.mastercaller +package nl.entreco.domain.mastercaller /** * Created by entreco on 14/03/2018. */ -class MasterCallerRequest(val scored: Int = -1, val start: Boolean = false, val leg: Boolean = false, val set: Boolean = false, val match:Boolean = false) { +class MasterCallerRequest( + private val scored: Int = -1, + private val start: Boolean = false, + private val leg: Boolean = false, + private val set: Boolean = false, + private val match: Boolean = false +) { fun toSound(): Sound { return when { diff --git a/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/play/mastercaller/MusicPlayer.kt b/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/mastercaller/MusicPlayer.kt similarity index 83% rename from android/DartsScorecard/domain/src/main/java/nl/entreco/domain/play/mastercaller/MusicPlayer.kt rename to android/DartsScorecard/domain/src/main/java/nl/entreco/domain/mastercaller/MusicPlayer.kt index 1d1e7a18..7164bafd 100644 --- a/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/play/mastercaller/MusicPlayer.kt +++ b/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/mastercaller/MusicPlayer.kt @@ -1,7 +1,5 @@ -package nl.entreco.domain.play.mastercaller +package nl.entreco.domain.mastercaller -import nl.entreco.domain.repository.MusicRepository -import nl.entreco.liblog.Logger import nl.entreco.shared.BaseUsecase import nl.entreco.shared.threading.Background import nl.entreco.shared.threading.Foreground diff --git a/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/repository/MusicRepository.kt b/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/mastercaller/MusicRepository.kt similarity index 70% rename from android/DartsScorecard/domain/src/main/java/nl/entreco/domain/repository/MusicRepository.kt rename to android/DartsScorecard/domain/src/main/java/nl/entreco/domain/mastercaller/MusicRepository.kt index c4666f83..39f13310 100644 --- a/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/repository/MusicRepository.kt +++ b/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/mastercaller/MusicRepository.kt @@ -1,4 +1,4 @@ -package nl.entreco.domain.repository +package nl.entreco.domain.mastercaller interface MusicRepository { fun play() diff --git a/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/play/mastercaller/Sound.kt b/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/mastercaller/Sound.kt similarity index 98% rename from android/DartsScorecard/domain/src/main/java/nl/entreco/domain/play/mastercaller/Sound.kt rename to android/DartsScorecard/domain/src/main/java/nl/entreco/domain/mastercaller/Sound.kt index 170af6f5..ae88b6d3 100644 --- a/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/play/mastercaller/Sound.kt +++ b/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/mastercaller/Sound.kt @@ -1,4 +1,4 @@ -package nl.entreco.domain.play.mastercaller +package nl.entreco.domain.mastercaller /** * Created by entreco on 14/03/2018. diff --git a/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/repository/SoundRepository.kt b/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/mastercaller/SoundRepository.kt similarity index 69% rename from android/DartsScorecard/domain/src/main/java/nl/entreco/domain/repository/SoundRepository.kt rename to android/DartsScorecard/domain/src/main/java/nl/entreco/domain/mastercaller/SoundRepository.kt index 41b6cbea..6c5ec147 100644 --- a/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/repository/SoundRepository.kt +++ b/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/mastercaller/SoundRepository.kt @@ -1,7 +1,7 @@ -package nl.entreco.domain.repository +package nl.entreco.domain.mastercaller import androidx.annotation.WorkerThread -import nl.entreco.domain.play.mastercaller.Sound +import nl.entreco.domain.mastercaller.Sound /** * Created by entreco on 14/03/2018. diff --git a/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/play/mastercaller/ToggleMusicUsecase.kt b/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/mastercaller/ToggleMusicUsecase.kt similarity index 76% rename from android/DartsScorecard/domain/src/main/java/nl/entreco/domain/play/mastercaller/ToggleMusicUsecase.kt rename to android/DartsScorecard/domain/src/main/java/nl/entreco/domain/mastercaller/ToggleMusicUsecase.kt index 1b986096..6905fedb 100644 --- a/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/play/mastercaller/ToggleMusicUsecase.kt +++ b/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/mastercaller/ToggleMusicUsecase.kt @@ -1,4 +1,4 @@ -package nl.entreco.domain.play.mastercaller +package nl.entreco.domain.mastercaller import nl.entreco.domain.repository.AudioPrefRepository import nl.entreco.shared.BaseUsecase @@ -7,8 +7,11 @@ import nl.entreco.shared.threading.Foreground import javax.inject.Inject class ToggleMusicUsecase @Inject constructor( - private val audioPrefRepository: AudioPrefRepository, bg: Background, fg: Foreground + private val audioPrefRepository: AudioPrefRepository, + bg: Background, + fg: Foreground ) : BaseUsecase(bg, fg) { + fun toggle() { onBackground({ val toggled = !audioPrefRepository.isBackgroundMusicEnabled() diff --git a/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/play/mastercaller/ToggleSoundUsecase.kt b/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/mastercaller/ToggleSoundUsecase.kt similarity index 90% rename from android/DartsScorecard/domain/src/main/java/nl/entreco/domain/play/mastercaller/ToggleSoundUsecase.kt rename to android/DartsScorecard/domain/src/main/java/nl/entreco/domain/mastercaller/ToggleSoundUsecase.kt index cadde4e6..a83b0e30 100644 --- a/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/play/mastercaller/ToggleSoundUsecase.kt +++ b/android/DartsScorecard/domain/src/main/java/nl/entreco/domain/mastercaller/ToggleSoundUsecase.kt @@ -1,9 +1,9 @@ -package nl.entreco.domain.play.mastercaller +package nl.entreco.domain.mastercaller +import nl.entreco.domain.repository.AudioPrefRepository import nl.entreco.shared.BaseUsecase import nl.entreco.shared.threading.Background import nl.entreco.shared.threading.Foreground -import nl.entreco.domain.repository.AudioPrefRepository import javax.inject.Inject /** @@ -14,7 +14,7 @@ class ToggleSoundUsecase @Inject constructor( bg: Background, fg: Foreground ) : BaseUsecase(bg, fg) { - fun toggle(){ + fun toggle() { onBackground({ val toggled = !audioPrefRepository.isMasterCallerEnabled() audioPrefRepository.setMasterCallerEnabled(toggled) diff --git a/android/DartsScorecard/domain/src/test/java/nl/entreco/domain/mastercaller/MasterCallerRequestTest.kt b/android/DartsScorecard/domain/src/test/java/nl/entreco/domain/mastercaller/MasterCallerRequestTest.kt new file mode 100644 index 00000000..26274871 --- /dev/null +++ b/android/DartsScorecard/domain/src/test/java/nl/entreco/domain/mastercaller/MasterCallerRequestTest.kt @@ -0,0 +1,210 @@ +package nl.entreco.domain.mastercaller + +import org.junit.Assert.assertTrue +import org.junit.Test + +/** + * Created by entreco on 14/03/2018. + */ +class MasterCallerRequestTest{ + + @Test + fun `it should map to 'Fx00' when scoring 0`() { + assertTrue( req(0) is Fx00) + } + + @Test + fun `it should map to 'Fx01' when scoring 1`() { + assertTrue( req(1) is Fx01) + } + + @Test + fun `it should map to 'Fx02' when scoring 2`() { + assertTrue( req(2) is Fx02) + } + + @Test + fun `it should map to 'others' when scoring others`() { + assertTrue(req(3) is Fx03) + assertTrue(req(4) is Fx04) + assertTrue(req(5) is Fx05) + assertTrue(req(6) is Fx06) + assertTrue(req(7) is Fx07) + assertTrue(req(8) is Fx08) + assertTrue(req(9) is Fx09) + assertTrue(req(10) is Fx10) + assertTrue(req(11) is Fx11) + assertTrue(req(12) is Fx12) + assertTrue(req(13) is Fx13) + assertTrue(req(14) is Fx14) + assertTrue(req(15) is Fx15) + assertTrue(req(16) is Fx16) + assertTrue(req(17) is Fx17) + assertTrue(req(18) is Fx18) + assertTrue(req(19) is Fx19) + assertTrue(req(20) is Fx20) + assertTrue(req(21) is Fx21) + assertTrue(req(22) is Fx22) + assertTrue(req(23) is Fx23) + assertTrue(req(24) is Fx24) + assertTrue(req(25) is Fx25) + assertTrue(req(26) is Fx26) + assertTrue(req(27) is Fx27) + assertTrue(req(28) is Fx28) + assertTrue(req(29) is Fx29) + assertTrue(req(30) is Fx30) + assertTrue(req(31) is Fx31) + assertTrue(req(32) is Fx32) + assertTrue(req(33) is Fx33) + assertTrue(req(34) is Fx34) + assertTrue(req(35) is Fx35) + assertTrue(req(36) is Fx36) + assertTrue(req(37) is Fx37) + assertTrue(req(38) is Fx38) + assertTrue(req(39) is Fx39) + assertTrue(req(40) is Fx40) + assertTrue(req(41) is Fx41) + assertTrue(req(42) is Fx42) + assertTrue(req(43) is Fx43) + assertTrue(req(44) is Fx44) + assertTrue(req(45) is Fx45) + assertTrue(req(46) is Fx46) + assertTrue(req(47) is Fx47) + assertTrue(req(48) is Fx48) + assertTrue(req(49) is Fx49) + assertTrue(req(50) is Fx50) + assertTrue(req(51) is Fx51) + assertTrue(req(52) is Fx52) + assertTrue(req(53) is Fx53) + assertTrue(req(54) is Fx54) + assertTrue(req(55) is Fx55) + assertTrue(req(56) is Fx56) + assertTrue(req(57) is Fx57) + assertTrue(req(58) is Fx58) + assertTrue(req(59) is Fx59) + assertTrue(req(60) is Fx60) + assertTrue(req(61) is Fx61) + assertTrue(req(62) is Fx62) + assertTrue(req(63) is Fx63) + assertTrue(req(64) is Fx64) + assertTrue(req(65) is Fx65) + assertTrue(req(66) is Fx66) + assertTrue(req(67) is Fx67) + assertTrue(req(68) is Fx68) + assertTrue(req(69) is Fx69) + assertTrue(req(70) is Fx70) + assertTrue(req(71) is Fx71) + assertTrue(req(72) is Fx72) + assertTrue(req(73) is Fx73) + assertTrue(req(74) is Fx74) + assertTrue(req(75) is Fx75) + assertTrue(req(76) is Fx76) + assertTrue(req(77) is Fx77) + assertTrue(req(78) is Fx78) + assertTrue(req(79) is Fx79) + assertTrue(req(80) is Fx80) + assertTrue(req(81) is Fx81) + assertTrue(req(82) is Fx82) + assertTrue(req(83) is Fx83) + assertTrue(req(84) is Fx84) + assertTrue(req(85) is Fx85) + assertTrue(req(86) is Fx86) + assertTrue(req(87) is Fx87) + assertTrue(req(88) is Fx88) + assertTrue(req(89) is Fx89) + assertTrue(req(90) is Fx90) + assertTrue(req(91) is Fx91) + assertTrue(req(92) is Fx92) + assertTrue(req(93) is Fx93) + assertTrue(req(94) is Fx94) + assertTrue(req(95) is Fx95) + assertTrue(req(96) is Fx96) + assertTrue(req(97) is Fx97) + assertTrue(req(98) is Fx98) + assertTrue(req(99) is Fx99) + assertTrue(req(100) is Fx100) + assertTrue(req(101) is Fx101) + assertTrue(req(102) is Fx102) + assertTrue(req(103) is Fx103) + assertTrue(req(104) is Fx104) + assertTrue(req(105) is Fx105) + assertTrue(req(106) is Fx106) + assertTrue(req(107) is Fx107) + assertTrue(req(108) is Fx108) + assertTrue(req(109) is Fx109) + assertTrue(req(110) is Fx110) + assertTrue(req(111) is Fx111) + assertTrue(req(112) is Fx112) + assertTrue(req(113) is Fx113) + assertTrue(req(114) is Fx114) + assertTrue(req(115) is Fx115) + assertTrue(req(116) is Fx116) + assertTrue(req(117) is Fx117) + assertTrue(req(118) is Fx118) + assertTrue(req(119) is Fx119) + assertTrue(req(120) is Fx120) + assertTrue(req(121) is Fx121) + assertTrue(req(122) is Fx122) + assertTrue(req(123) is Fx123) + assertTrue(req(124) is Fx124) + assertTrue(req(125) is Fx125) + assertTrue(req(126) is Fx126) + assertTrue(req(127) is Fx127) + assertTrue(req(128) is Fx128) + assertTrue(req(129) is Fx129) + assertTrue(req(130) is Fx130) + assertTrue(req(131) is Fx131) + assertTrue(req(132) is Fx132) + assertTrue(req(133) is Fx133) + assertTrue(req(134) is Fx134) + assertTrue(req(135) is Fx135) + assertTrue(req(136) is Fx136) + assertTrue(req(137) is Fx137) + assertTrue(req(138) is Fx138) + assertTrue(req(139) is Fx139) + assertTrue(req(140) is Fx140) + assertTrue(req(141) is Fx141) + assertTrue(req(142) is Fx142) + assertTrue(req(143) is Fx143) + assertTrue(req(144) is Fx144) + assertTrue(req(145) is Fx145) + assertTrue(req(146) is Fx146) + assertTrue(req(147) is Fx147) + assertTrue(req(148) is Fx148) + assertTrue(req(149) is Fx149) + assertTrue(req(150) is Fx150) + assertTrue(req(151) is Fx151) + assertTrue(req(152) is Fx152) + assertTrue(req(153) is Fx153) + assertTrue(req(154) is Fx154) + assertTrue(req(155) is Fx155) + assertTrue(req(156) is Fx156) + assertTrue(req(157) is Fx157) + assertTrue(req(158) is Fx158) + assertTrue(req(159) is Fx159) + assertTrue(req(160) is Fx160) + assertTrue(req(161) is Fx161) + assertTrue(req(162) is Fx162) + assertTrue(req(163) is Fx163) + assertTrue(req(164) is Fx164) + assertTrue(req(165) is Fx165) + assertTrue(req(166) is Fx166) + assertTrue(req(167) is Fx167) + assertTrue(req(168) is Fx168) + assertTrue(req(169) is Fx169) + assertTrue(req(170) is Fx170) + assertTrue(req(171) is Fx171) + assertTrue(req(174) is Fx174) + assertTrue(req(177) is Fx177) + assertTrue(req(180) is Fx180) + } + + + + @Test + fun `it should map to 'None' for unknown scores`() { + assertTrue(req(181) is None) + } + + private fun req(scored: Int) = MasterCallerRequest(scored = scored).toSound() +} \ No newline at end of file diff --git a/android/DartsScorecard/domain/src/test/java/nl/entreco/domain/play/mastercaller/MasterCallerTest.kt b/android/DartsScorecard/domain/src/test/java/nl/entreco/domain/mastercaller/MasterCallerTest.kt similarity index 95% rename from android/DartsScorecard/domain/src/test/java/nl/entreco/domain/play/mastercaller/MasterCallerTest.kt rename to android/DartsScorecard/domain/src/test/java/nl/entreco/domain/mastercaller/MasterCallerTest.kt index 82790a91..d15ca219 100644 --- a/android/DartsScorecard/domain/src/test/java/nl/entreco/domain/play/mastercaller/MasterCallerTest.kt +++ b/android/DartsScorecard/domain/src/test/java/nl/entreco/domain/mastercaller/MasterCallerTest.kt @@ -1,11 +1,10 @@ -package nl.entreco.domain.play.mastercaller +package nl.entreco.domain.mastercaller import com.nhaarman.mockito_kotlin.any import com.nhaarman.mockito_kotlin.verify import com.nhaarman.mockito_kotlin.whenever import nl.entreco.domain.common.executors.TestBackground import nl.entreco.domain.common.executors.TestForeground -import nl.entreco.domain.repository.SoundRepository import nl.entreco.liblog.Logger import org.junit.Test import org.junit.runner.RunWith diff --git a/android/DartsScorecard/domain/src/test/java/nl/entreco/domain/play/mastercaller/ToggleSoundUsecaseTest.kt b/android/DartsScorecard/domain/src/test/java/nl/entreco/domain/mastercaller/ToggleSoundUsecaseTest.kt similarity index 97% rename from android/DartsScorecard/domain/src/test/java/nl/entreco/domain/play/mastercaller/ToggleSoundUsecaseTest.kt rename to android/DartsScorecard/domain/src/test/java/nl/entreco/domain/mastercaller/ToggleSoundUsecaseTest.kt index c21b4ac5..2c1b2905 100644 --- a/android/DartsScorecard/domain/src/test/java/nl/entreco/domain/play/mastercaller/ToggleSoundUsecaseTest.kt +++ b/android/DartsScorecard/domain/src/test/java/nl/entreco/domain/mastercaller/ToggleSoundUsecaseTest.kt @@ -1,4 +1,4 @@ -package nl.entreco.domain.play.mastercaller +package nl.entreco.domain.mastercaller import com.nhaarman.mockito_kotlin.argumentCaptor import com.nhaarman.mockito_kotlin.verify diff --git a/android/DartsScorecard/domain/src/test/java/nl/entreco/domain/play/mastercaller/MasterCallerRequestTest.kt b/android/DartsScorecard/domain/src/test/java/nl/entreco/domain/play/mastercaller/MasterCallerRequestTest.kt deleted file mode 100644 index 1b3b0336..00000000 --- a/android/DartsScorecard/domain/src/test/java/nl/entreco/domain/play/mastercaller/MasterCallerRequestTest.kt +++ /dev/null @@ -1,210 +0,0 @@ -package nl.entreco.domain.play.mastercaller - -import org.junit.Assert.assertTrue -import org.junit.Test - -/** - * Created by entreco on 14/03/2018. - */ -class MasterCallerRequestTest{ - - @Test - fun `it should map to 'Fx00' when scoring 0`() { - assertTrue( req(0) is Fx00) - } - - @Test - fun `it should map to 'Fx01' when scoring 1`() { - assertTrue( req(1) is Fx01) - } - - @Test - fun `it should map to 'Fx02' when scoring 2`() { - assertTrue( req(2) is Fx02) - } - - @Test - fun `it should map to 'others' when scoring others`() { - assertTrue(req(3) is Fx03 ) - assertTrue(req(4) is Fx04 ) - assertTrue(req(5) is Fx05 ) - assertTrue(req(6) is Fx06 ) - assertTrue(req(7) is Fx07 ) - assertTrue(req(8) is Fx08 ) - assertTrue(req(9) is Fx09 ) - assertTrue(req(10) is Fx10 ) - assertTrue(req(11) is Fx11 ) - assertTrue(req(12) is Fx12 ) - assertTrue(req(13) is Fx13 ) - assertTrue(req(14) is Fx14 ) - assertTrue(req(15) is Fx15 ) - assertTrue(req(16) is Fx16 ) - assertTrue(req(17) is Fx17 ) - assertTrue(req(18) is Fx18 ) - assertTrue(req(19) is Fx19 ) - assertTrue(req(20) is Fx20 ) - assertTrue(req(21) is Fx21 ) - assertTrue(req(22) is Fx22 ) - assertTrue(req(23) is Fx23 ) - assertTrue(req(24) is Fx24 ) - assertTrue(req(25) is Fx25 ) - assertTrue(req(26) is Fx26 ) - assertTrue(req(27) is Fx27 ) - assertTrue(req(28) is Fx28 ) - assertTrue(req(29) is Fx29 ) - assertTrue(req(30) is Fx30 ) - assertTrue(req(31) is Fx31 ) - assertTrue(req(32) is Fx32 ) - assertTrue(req(33) is Fx33 ) - assertTrue(req(34) is Fx34 ) - assertTrue(req(35) is Fx35 ) - assertTrue(req(36) is Fx36 ) - assertTrue(req(37) is Fx37 ) - assertTrue(req(38) is Fx38 ) - assertTrue(req(39) is Fx39 ) - assertTrue(req(40) is Fx40 ) - assertTrue(req(41) is Fx41 ) - assertTrue(req(42) is Fx42 ) - assertTrue(req(43) is Fx43 ) - assertTrue(req(44) is Fx44 ) - assertTrue(req(45) is Fx45 ) - assertTrue(req(46) is Fx46 ) - assertTrue(req(47) is Fx47 ) - assertTrue(req(48) is Fx48 ) - assertTrue(req(49) is Fx49 ) - assertTrue(req(50) is Fx50 ) - assertTrue(req(51) is Fx51 ) - assertTrue(req(52) is Fx52 ) - assertTrue(req(53) is Fx53 ) - assertTrue(req(54) is Fx54 ) - assertTrue(req(55) is Fx55 ) - assertTrue(req(56) is Fx56 ) - assertTrue(req(57) is Fx57 ) - assertTrue(req(58) is Fx58 ) - assertTrue(req(59) is Fx59 ) - assertTrue(req(60) is Fx60 ) - assertTrue(req(61) is Fx61 ) - assertTrue(req(62) is Fx62 ) - assertTrue(req(63) is Fx63 ) - assertTrue(req(64) is Fx64 ) - assertTrue(req(65) is Fx65 ) - assertTrue(req(66) is Fx66 ) - assertTrue(req(67) is Fx67 ) - assertTrue(req(68) is Fx68 ) - assertTrue(req(69) is Fx69 ) - assertTrue(req(70) is Fx70 ) - assertTrue(req(71) is Fx71 ) - assertTrue(req(72) is Fx72 ) - assertTrue(req(73) is Fx73 ) - assertTrue(req(74) is Fx74 ) - assertTrue(req(75) is Fx75 ) - assertTrue(req(76) is Fx76 ) - assertTrue(req(77) is Fx77 ) - assertTrue(req(78) is Fx78 ) - assertTrue(req(79) is Fx79 ) - assertTrue(req(80) is Fx80 ) - assertTrue(req(81) is Fx81 ) - assertTrue(req(82) is Fx82 ) - assertTrue(req(83) is Fx83 ) - assertTrue(req(84) is Fx84 ) - assertTrue(req(85) is Fx85 ) - assertTrue(req(86) is Fx86 ) - assertTrue(req(87) is Fx87 ) - assertTrue(req(88) is Fx88 ) - assertTrue(req(89) is Fx89 ) - assertTrue(req(90) is Fx90 ) - assertTrue(req(91) is Fx91 ) - assertTrue(req(92) is Fx92 ) - assertTrue(req(93) is Fx93 ) - assertTrue(req(94) is Fx94 ) - assertTrue(req(95) is Fx95 ) - assertTrue(req(96) is Fx96 ) - assertTrue(req(97) is Fx97 ) - assertTrue(req(98) is Fx98 ) - assertTrue(req(99) is Fx99 ) - assertTrue(req(100) is Fx100 ) - assertTrue(req(101) is Fx101 ) - assertTrue(req(102) is Fx102 ) - assertTrue(req(103) is Fx103 ) - assertTrue(req(104) is Fx104 ) - assertTrue(req(105) is Fx105 ) - assertTrue(req(106) is Fx106 ) - assertTrue(req(107) is Fx107 ) - assertTrue(req(108) is Fx108 ) - assertTrue(req(109) is Fx109 ) - assertTrue(req(110) is Fx110 ) - assertTrue(req(111) is Fx111 ) - assertTrue(req(112) is Fx112 ) - assertTrue(req(113) is Fx113 ) - assertTrue(req(114) is Fx114 ) - assertTrue(req(115) is Fx115 ) - assertTrue(req(116) is Fx116 ) - assertTrue(req(117) is Fx117 ) - assertTrue(req(118) is Fx118 ) - assertTrue(req(119) is Fx119 ) - assertTrue(req(120) is Fx120 ) - assertTrue(req(121) is Fx121 ) - assertTrue(req(122) is Fx122 ) - assertTrue(req(123) is Fx123 ) - assertTrue(req(124) is Fx124 ) - assertTrue(req(125) is Fx125 ) - assertTrue(req(126) is Fx126 ) - assertTrue(req(127) is Fx127 ) - assertTrue(req(128) is Fx128 ) - assertTrue(req(129) is Fx129 ) - assertTrue(req(130) is Fx130 ) - assertTrue(req(131) is Fx131 ) - assertTrue(req(132) is Fx132 ) - assertTrue(req(133) is Fx133 ) - assertTrue(req(134) is Fx134 ) - assertTrue(req(135) is Fx135 ) - assertTrue(req(136) is Fx136 ) - assertTrue(req(137) is Fx137 ) - assertTrue(req(138) is Fx138 ) - assertTrue(req(139) is Fx139 ) - assertTrue(req(140) is Fx140 ) - assertTrue(req(141) is Fx141 ) - assertTrue(req(142) is Fx142 ) - assertTrue(req(143) is Fx143 ) - assertTrue(req(144) is Fx144 ) - assertTrue(req(145) is Fx145 ) - assertTrue(req(146) is Fx146 ) - assertTrue(req(147) is Fx147 ) - assertTrue(req(148) is Fx148 ) - assertTrue(req(149) is Fx149 ) - assertTrue(req(150) is Fx150 ) - assertTrue(req(151) is Fx151 ) - assertTrue(req(152) is Fx152 ) - assertTrue(req(153) is Fx153 ) - assertTrue(req(154) is Fx154 ) - assertTrue(req(155) is Fx155 ) - assertTrue(req(156) is Fx156 ) - assertTrue(req(157) is Fx157 ) - assertTrue(req(158) is Fx158 ) - assertTrue(req(159) is Fx159 ) - assertTrue(req(160) is Fx160 ) - assertTrue(req(161) is Fx161 ) - assertTrue(req(162) is Fx162 ) - assertTrue(req(163) is Fx163 ) - assertTrue(req(164) is Fx164 ) - assertTrue(req(165) is Fx165 ) - assertTrue(req(166) is Fx166 ) - assertTrue(req(167) is Fx167 ) - assertTrue(req(168) is Fx168 ) - assertTrue(req(169) is Fx169 ) - assertTrue(req(170) is Fx170 ) - assertTrue(req(171) is Fx171 ) - assertTrue(req(174) is Fx174 ) - assertTrue(req(177) is Fx177 ) - assertTrue(req(180) is Fx180 ) - } - - - - @Test - fun `it should map to 'None' for unknown scores`() { - assertTrue(req(181) is None) - } - - private fun req(scored: Int) = MasterCallerRequest(scored = scored).toSound() -} \ No newline at end of file diff --git a/android/DartsScorecard/scripts/dependencies.gradle b/android/DartsScorecard/scripts/dependencies.gradle index b8fe2960..22a6cfc1 100644 --- a/android/DartsScorecard/scripts/dependencies.gradle +++ b/android/DartsScorecard/scripts/dependencies.gradle @@ -33,7 +33,7 @@ ext.versionName = { -> } ext { - kotlinVersion = '1.3.72' + kotlinVersion = '1.4.31' gradleVersion = '4.1.2' gmsVersion = '4.3.3' detektVersion = '1.0.0.RC7' @@ -47,12 +47,14 @@ ext { versionName = versionName() dependencies = [ - daggerVersion = '2.28', - xConstraint = '2.0.0-beta4', + daggerVersion = '2.33', + xConstraint = '2.0.0', xAnnotation = '1.1.0', playBilling = '3.0.3', + playCore = '1.10.0', + playCoreKtx = '1.8.1', xAppCompat = '1.1.0', - xCore = '1.3.0', + xCore = '1.3.2', xCoreCommon = '2.0.1', xCoreRuntime = '2.0.1', xExif = '1.3.2', @@ -75,7 +77,7 @@ ext { jelly = 'v1.0', lottieVersion = '3.4.0', gson = '2.8.6', - leakCanary = '2.3', + leakCanary = '2.6', junit = '4.13.2', mockito = '3.3.3', mockitoKotlin = '1.5.0', diff --git a/android/DartsScorecard/settings.gradle b/android/DartsScorecard/settings.gradle index 944b2418..fbae2a1d 100644 --- a/android/DartsScorecard/settings.gradle +++ b/android/DartsScorecard/settings.gradle @@ -1 +1 @@ -include ':app', ':domain', ':data', ':shared', ':libLog', ':libCore', ':libConsent', ':libAds' +include ':app', ':domain', ':data', ':shared', ':libLog', ':libCore', ':libConsent', ':libAds', ':sounds' diff --git a/android/DartsScorecard/sounds/.gitignore b/android/DartsScorecard/sounds/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/android/DartsScorecard/sounds/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/android/DartsScorecard/sounds/build.gradle b/android/DartsScorecard/sounds/build.gradle new file mode 100644 index 00000000..9d5e213f --- /dev/null +++ b/android/DartsScorecard/sounds/build.gradle @@ -0,0 +1,34 @@ +apply plugin: 'com.android.dynamic-feature' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-kapt' + +android { + def config = rootProject.extensions.getByName("ext") + compileSdkVersion config.androidCompileSdkVersion + + defaultConfig { + minSdkVersion config.androidMinSdkVersion + targetSdkVersion config.androidTargetSdkVersion + } + + buildTypes { + release { + minifyEnabled false + } + } +} + +dependencies { + implementation project(":app") + implementation project(':domain') + + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion" + implementation "androidx.core:core-ktx:$xCore" + + // Dagger + kapt "com.google.dagger:dagger-compiler:$daggerVersion" + implementation "com.google.dagger:dagger:$daggerVersion" + + // Test + testImplementation "junit:junit:$junit" +} \ No newline at end of file diff --git a/android/DartsScorecard/sounds/src/androidTest/java/nl/entreco/dartsscorecard/sounds/ExampleInstrumentedTest.kt b/android/DartsScorecard/sounds/src/androidTest/java/nl/entreco/dartsscorecard/sounds/ExampleInstrumentedTest.kt new file mode 100644 index 00000000..a8a4233d --- /dev/null +++ b/android/DartsScorecard/sounds/src/androidTest/java/nl/entreco/dartsscorecard/sounds/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package nl.entreco.dartsscorecard.sounds + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("nl.entreco.dartsscorecard.sounds", appContext.packageName) + } +} \ No newline at end of file diff --git a/android/DartsScorecard/sounds/src/main/AndroidManifest.xml b/android/DartsScorecard/sounds/src/main/AndroidManifest.xml new file mode 100644 index 00000000..8e376c3c --- /dev/null +++ b/android/DartsScorecard/sounds/src/main/AndroidManifest.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/android/DartsScorecard/sounds/src/main/java/nl/entreco/dartsscorecard/sounds/DynamicSoundProvider.kt b/android/DartsScorecard/sounds/src/main/java/nl/entreco/dartsscorecard/sounds/DynamicSoundProvider.kt new file mode 100644 index 00000000..15d4fbad --- /dev/null +++ b/android/DartsScorecard/sounds/src/main/java/nl/entreco/dartsscorecard/sounds/DynamicSoundProvider.kt @@ -0,0 +1,42 @@ +package nl.entreco.dartsscorecard.sounds + +import android.content.ContentResolver +import android.content.Context +import android.media.MediaPlayer +import android.media.SoundPool +import android.net.Uri +import androidx.annotation.Keep +import nl.entreco.dartsscorecard.di.play.Play01Scope +import nl.entreco.dartsscorecard.dynamic.SoundModuleProvider +import nl.entreco.domain.mastercaller.MusicRepository +import nl.entreco.domain.mastercaller.SoundRepository +import nl.entreco.domain.repository.AudioPrefRepository + +/** + * Accessed dynamically through reflection, + * if the Dynamic Sound module is installed :nerd: + */ +@Keep +object DynamicSoundProvider : SoundModuleProvider { + + override fun provideSoundRepository(context: Context, @Play01Scope prefs: AudioPrefRepository): SoundRepository { + val mapper = SoundMapper() + val soundPool = SoundPool.Builder().setMaxStreams(2).build() + return LocalSoundRepository(context, soundPool, prefs, mapper) + } + + override fun provideMusicRepository(context: Context): MusicRepository { +// val tuneResourceId = R.raw.pdc_tune +// val uri = Uri.Builder() +// .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE) +// .authority(context.packageName) +// .appendPath(context.resources.getResourceTypeName(tuneResourceId)) +// .appendPath(String.format("%s:%s", +// context.resources.getResourcePackageName(tuneResourceId), +// context.resources.getResourceEntryName(tuneResourceId))) +// .build() + val mediaPlayer = MediaPlayer.create(context, R.raw.pdc_tune) + mediaPlayer.isLooping = true + return LocalMusicRepository(mediaPlayer) + } +} \ No newline at end of file diff --git a/android/DartsScorecard/data/src/main/java/nl/entreco/data/sound/LocalMusicRepository.kt b/android/DartsScorecard/sounds/src/main/java/nl/entreco/dartsscorecard/sounds/LocalMusicRepository.kt similarity index 80% rename from android/DartsScorecard/data/src/main/java/nl/entreco/data/sound/LocalMusicRepository.kt rename to android/DartsScorecard/sounds/src/main/java/nl/entreco/dartsscorecard/sounds/LocalMusicRepository.kt index c8143fda..498ff1f4 100644 --- a/android/DartsScorecard/data/src/main/java/nl/entreco/data/sound/LocalMusicRepository.kt +++ b/android/DartsScorecard/sounds/src/main/java/nl/entreco/dartsscorecard/sounds/LocalMusicRepository.kt @@ -1,7 +1,7 @@ -package nl.entreco.data.sound +package nl.entreco.dartsscorecard.sounds import android.media.MediaPlayer -import nl.entreco.domain.repository.MusicRepository +import nl.entreco.domain.mastercaller.MusicRepository class LocalMusicRepository(private val mediaPlayer: MediaPlayer): MusicRepository { diff --git a/android/DartsScorecard/data/src/main/java/nl/entreco/data/sound/LocalSoundRepository.kt b/android/DartsScorecard/sounds/src/main/java/nl/entreco/dartsscorecard/sounds/LocalSoundRepository.kt similarity index 68% rename from android/DartsScorecard/data/src/main/java/nl/entreco/data/sound/LocalSoundRepository.kt rename to android/DartsScorecard/sounds/src/main/java/nl/entreco/dartsscorecard/sounds/LocalSoundRepository.kt index bdd8ed19..5e2101d7 100644 --- a/android/DartsScorecard/data/src/main/java/nl/entreco/data/sound/LocalSoundRepository.kt +++ b/android/DartsScorecard/sounds/src/main/java/nl/entreco/dartsscorecard/sounds/LocalSoundRepository.kt @@ -1,10 +1,9 @@ -package nl.entreco.data.sound +package nl.entreco.dartsscorecard.sounds import android.content.Context import android.media.SoundPool -import nl.entreco.domain.play.mastercaller.Sound +import nl.entreco.domain.mastercaller.SoundRepository import nl.entreco.domain.repository.AudioPrefRepository -import nl.entreco.domain.repository.SoundRepository import java.util.ArrayDeque import java.util.Deque import java.util.HashMap @@ -12,15 +11,17 @@ import java.util.HashMap /** * Created by entreco on 14/03/2018. */ -class LocalSoundRepository(private val context: Context, - private val soundPool: SoundPool, - private val prefs: AudioPrefRepository, - private val mapper: SoundMapper) : SoundRepository { +class LocalSoundRepository( + private val context: Context, + private val soundPool: SoundPool, + private val prefs: AudioPrefRepository, + private val mapper: SoundMapper +) : SoundRepository { private val priorityNormal = 1 internal val queue: Deque = ArrayDeque() - internal val sounds: HashMap = hashMapOf() - private val ready: HashMap = hashMapOf() + internal val sounds: HashMap = hashMapOf() + private val ready: HashMap = hashMapOf() init { soundPool.setOnLoadCompleteListener { _, sampleId, status -> @@ -30,7 +31,7 @@ class LocalSoundRepository(private val context: Context, } } - override fun play(sound: Sound) { + override fun play(sound: nl.entreco.domain.mastercaller.Sound) { if (!prefs.isMasterCallerEnabled()) return if (ready.containsKey(sound)) { @@ -47,7 +48,8 @@ class LocalSoundRepository(private val context: Context, try { soundPool.setOnLoadCompleteListener(null) soundPool.release() - } catch (ignore: Throwable) { } + } catch (ignore: Throwable) { + } } internal fun storeSound(soundId: Int) { @@ -57,7 +59,7 @@ class LocalSoundRepository(private val context: Context, } } - private fun queueSoundWithId(soundID: Int, sound: Sound) { + private fun queueSoundWithId(soundID: Int, sound: nl.entreco.domain.mastercaller.Sound) { queue.addFirst(soundID) sounds[sound] = soundID } diff --git a/android/DartsScorecard/data/src/main/java/nl/entreco/data/sound/SoundMapper.kt b/android/DartsScorecard/sounds/src/main/java/nl/entreco/dartsscorecard/sounds/SoundMapper.kt similarity index 98% rename from android/DartsScorecard/data/src/main/java/nl/entreco/data/sound/SoundMapper.kt rename to android/DartsScorecard/sounds/src/main/java/nl/entreco/dartsscorecard/sounds/SoundMapper.kt index e6818bbb..182a9b77 100644 --- a/android/DartsScorecard/data/src/main/java/nl/entreco/data/sound/SoundMapper.kt +++ b/android/DartsScorecard/sounds/src/main/java/nl/entreco/dartsscorecard/sounds/SoundMapper.kt @@ -1,8 +1,7 @@ -package nl.entreco.data.sound +package nl.entreco.dartsscorecard.sounds import androidx.annotation.RawRes -import nl.entreco.data.R -import nl.entreco.domain.play.mastercaller.* +import nl.entreco.domain.mastercaller.* /** * Created by entreco on 14/03/2018. diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro0.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro0.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro0.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro0.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro1.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro1.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro1.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro1.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro10.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro10.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro10.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro10.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro100.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro100.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro100.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro100.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro101.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro101.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro101.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro101.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro102.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro102.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro102.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro102.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro103.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro103.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro103.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro103.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro104.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro104.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro104.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro104.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro105.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro105.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro105.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro105.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro106.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro106.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro106.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro106.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro107.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro107.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro107.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro107.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro108.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro108.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro108.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro108.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro109.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro109.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro109.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro109.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro11.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro11.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro11.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro11.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro110.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro110.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro110.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro110.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro111.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro111.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro111.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro111.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro112.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro112.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro112.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro112.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro113.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro113.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro113.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro113.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro114.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro114.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro114.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro114.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro115.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro115.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro115.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro115.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro116.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro116.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro116.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro116.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro117.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro117.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro117.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro117.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro118.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro118.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro118.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro118.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro119.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro119.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro119.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro119.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro12.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro12.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro12.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro12.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro120.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro120.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro120.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro120.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro121.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro121.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro121.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro121.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro122.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro122.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro122.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro122.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro123.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro123.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro123.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro123.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro124.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro124.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro124.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro124.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro125.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro125.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro125.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro125.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro126.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro126.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro126.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro126.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro127.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro127.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro127.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro127.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro128.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro128.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro128.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro128.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro129.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro129.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro129.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro129.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro13.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro13.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro13.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro13.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro130.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro130.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro130.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro130.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro131.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro131.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro131.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro131.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro132.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro132.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro132.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro132.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro133.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro133.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro133.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro133.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro134.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro134.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro134.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro134.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro135.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro135.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro135.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro135.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro136.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro136.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro136.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro136.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro137.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro137.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro137.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro137.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro138.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro138.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro138.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro138.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro139.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro139.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro139.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro139.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro14.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro14.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro14.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro14.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro140.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro140.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro140.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro140.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro141.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro141.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro141.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro141.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro142.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro142.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro142.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro142.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro143.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro143.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro143.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro143.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro144.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro144.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro144.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro144.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro145.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro145.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro145.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro145.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro146.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro146.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro146.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro146.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro147.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro147.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro147.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro147.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro148.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro148.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro148.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro148.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro149.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro149.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro149.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro149.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro15.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro15.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro15.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro15.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro150.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro150.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro150.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro150.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro151.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro151.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro151.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro151.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro152.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro152.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro152.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro152.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro153.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro153.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro153.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro153.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro154.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro154.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro154.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro154.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro155.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro155.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro155.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro155.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro156.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro156.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro156.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro156.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro157.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro157.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro157.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro157.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro158.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro158.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro158.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro158.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro159.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro159.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro159.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro159.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro16.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro16.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro16.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro16.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro160.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro160.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro160.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro160.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro161.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro161.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro161.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro161.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro162.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro162.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro162.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro162.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro163.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro163.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro163.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro163.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro164.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro164.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro164.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro164.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro165.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro165.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro165.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro165.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro166.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro166.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro166.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro166.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro167.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro167.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro167.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro167.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro168.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro168.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro168.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro168.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro169.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro169.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro169.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro169.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro17.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro17.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro17.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro17.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro170.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro170.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro170.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro170.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro171.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro171.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro171.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro171.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro174.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro174.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro174.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro174.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro177.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro177.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro177.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro177.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro18.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro18.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro18.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro18.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro180.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro180.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro180.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro180.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro19.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro19.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro19.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro19.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro2.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro2.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro2.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro2.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro20.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro20.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro20.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro20.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro21.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro21.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro21.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro21.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro22.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro22.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro22.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro22.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro23.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro23.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro23.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro23.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro24.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro24.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro24.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro24.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro25.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro25.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro25.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro25.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro26.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro26.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro26.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro26.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro27.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro27.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro27.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro27.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro28.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro28.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro28.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro28.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro29.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro29.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro29.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro29.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro3.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro3.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro3.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro3.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro30.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro30.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro30.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro30.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro31.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro31.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro31.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro31.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro32.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro32.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro32.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro32.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro33.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro33.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro33.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro33.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro34.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro34.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro34.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro34.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro35.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro35.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro35.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro35.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro36.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro36.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro36.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro36.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro37.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro37.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro37.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro37.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro38.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro38.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro38.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro38.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro39.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro39.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro39.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro39.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro4.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro4.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro4.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro4.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro40.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro40.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro40.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro40.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro41.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro41.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro41.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro41.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro42.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro42.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro42.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro42.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro43.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro43.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro43.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro43.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro44.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro44.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro44.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro44.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro45.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro45.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro45.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro45.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro46.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro46.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro46.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro46.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro47.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro47.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro47.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro47.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro48.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro48.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro48.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro48.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro49.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro49.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro49.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro49.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro5.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro5.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro5.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro5.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro50.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro50.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro50.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro50.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro51.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro51.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro51.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro51.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro52.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro52.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro52.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro52.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro53.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro53.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro53.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro53.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro54.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro54.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro54.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro54.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro55.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro55.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro55.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro55.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro56.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro56.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro56.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro56.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro57.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro57.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro57.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro57.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro58.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro58.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro58.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro58.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro59.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro59.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro59.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro59.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro6.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro6.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro6.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro6.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro60.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro60.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro60.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro60.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro61.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro61.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro61.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro61.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro62.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro62.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro62.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro62.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro63.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro63.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro63.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro63.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro64.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro64.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro64.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro64.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro65.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro65.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro65.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro65.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro66.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro66.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro66.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro66.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro67.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro67.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro67.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro67.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro68.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro68.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro68.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro68.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro69.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro69.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro69.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro69.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro7.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro7.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro7.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro7.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro70.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro70.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro70.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro70.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro71.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro71.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro71.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro71.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro72.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro72.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro72.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro72.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro73.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro73.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro73.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro73.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro74.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro74.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro74.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro74.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro75.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro75.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro75.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro75.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro76.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro76.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro76.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro76.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro77.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro77.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro77.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro77.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro78.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro78.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro78.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro78.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro79.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro79.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro79.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro79.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro8.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro8.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro8.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro8.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro80.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro80.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro80.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro80.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro81.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro81.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro81.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro81.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro82.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro82.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro82.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro82.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro83.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro83.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro83.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro83.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro84.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro84.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro84.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro84.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro85.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro85.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro85.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro85.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro86.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro86.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro86.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro86.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro87.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro87.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro87.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro87.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro88.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro88.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro88.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro88.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro89.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro89.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro89.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro89.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro9.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro9.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro9.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro9.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro90.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro90.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro90.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro90.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro91.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro91.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro91.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro91.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro92.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro92.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro92.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro92.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro93.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro93.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro93.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro93.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro94.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro94.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro94.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro94.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro95.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro95.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro95.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro95.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro96.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro96.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro96.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro96.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro97.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro97.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro97.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro97.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro98.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro98.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro98.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro98.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pro99.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pro99.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pro99.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pro99.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_profirstleg.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_profirstleg.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_profirstleg.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_profirstleg.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_profourthleg.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_profourthleg.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_profourthleg.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_profourthleg.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_progameon.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_progameon.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_progameon.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_progameon.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_progameshot.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_progameshot.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_progameshot.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_progameshot.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_proleg.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_proleg.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_proleg.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_proleg.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_proletsplaydarts.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_proletsplaydarts.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_proletsplaydarts.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_proletsplaydarts.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_pronoscore.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_pronoscore.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_pronoscore.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_pronoscore.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_prosecondleg.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_prosecondleg.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_prosecondleg.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_prosecondleg.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_proset.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_proset.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_proset.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_proset.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_prothirdleg.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_prothirdleg.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_prothirdleg.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_prothirdleg.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/dsc_prowhatagame.ogg b/android/DartsScorecard/sounds/src/main/res/raw/dsc_prowhatagame.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/dsc_prowhatagame.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/dsc_prowhatagame.ogg diff --git a/android/DartsScorecard/data/src/main/res/raw/pdc_tune.ogg b/android/DartsScorecard/sounds/src/main/res/raw/pdc_tune.ogg similarity index 100% rename from android/DartsScorecard/data/src/main/res/raw/pdc_tune.ogg rename to android/DartsScorecard/sounds/src/main/res/raw/pdc_tune.ogg diff --git a/android/DartsScorecard/sounds/src/test/java/nl/entreco/dartsscorecard/sounds/ExampleUnitTest.kt b/android/DartsScorecard/sounds/src/test/java/nl/entreco/dartsscorecard/sounds/ExampleUnitTest.kt new file mode 100644 index 00000000..b9f65cc9 --- /dev/null +++ b/android/DartsScorecard/sounds/src/test/java/nl/entreco/dartsscorecard/sounds/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package nl.entreco.dartsscorecard.sounds + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file