diff --git a/AnkiDroid/build.gradle b/AnkiDroid/build.gradle index d0d5858c99fb..911d4f35b9d0 100644 --- a/AnkiDroid/build.gradle +++ b/AnkiDroid/build.gradle @@ -8,6 +8,8 @@ apply plugin: 'app.brant.amazonappstorepublisher' apply plugin: 'idea' apply plugin: 'kotlin-android' apply plugin: 'kotlin-parcelize' +apply plugin: 'kotlin-kapt' +apply plugin: 'dagger.hilt.android.plugin' repositories { @@ -315,6 +317,8 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version" implementation 'com.github.ByteHamster:SearchPreference:v2.3.0' implementation 'com.github.AppIntro:AppIntro:6.2.0' + implementation "com.google.dagger:hilt-android:2.43.2" + kapt "com.google.dagger:hilt-android-compiler:2.43.2" // Cannot use debugImplementation since classes need to be imported in AnkiDroidApp // and there's no no-op version for release build. Usage has been disabled for release diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/AnkiDroidApp.kt b/AnkiDroid/src/main/java/com/ichi2/anki/AnkiDroidApp.kt index c62322e67791..326dd582409d 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/AnkiDroidApp.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/AnkiDroidApp.kt @@ -45,6 +45,7 @@ import com.ichi2.anki.services.NotificationService import com.ichi2.compat.CompatHelper import com.ichi2.themes.Themes import com.ichi2.utils.* +import dagger.hilt.android.HiltAndroidApp import net.ankiweb.rsdroid.BackendFactory import timber.log.Timber import timber.log.Timber.DebugTree @@ -55,6 +56,7 @@ import java.util.regex.Pattern /** * Application class. */ +@HiltAndroidApp @KotlinCleanup("lots to do") @KotlinCleanup("IDE Lint") open class AnkiDroidApp : Application() { diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/di/DispatcherModule.kt b/AnkiDroid/src/main/java/com/ichi2/anki/di/DispatcherModule.kt new file mode 100644 index 000000000000..ad1c1f2c9add --- /dev/null +++ b/AnkiDroid/src/main/java/com/ichi2/anki/di/DispatcherModule.kt @@ -0,0 +1,55 @@ +/**************************************************************************************** + * * + * Copyright (c) 2022 Shridhar Goel * + * * + * This program is free software; you can redistribute it and/or modify it under * + * the terms of the GNU General Public License as published by the Free Software * + * Foundation; either version 3 of the License, or (at your option) any later * + * version. * + * * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY * + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * + * PARTICULAR PURPOSE. See the GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License along with * + * this program. If not, see . * + ****************************************************************************************/ + +package com.ichi2.anki.di + +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Dispatchers +import javax.inject.Qualifier + +@Module +@InstallIn(SingletonComponent::class) +object DispatchersModule { + + @DefaultDispatcher + @Provides + fun providesDefaultDispatcher(): CoroutineDispatcher = Dispatchers.Default + + @IoDispatcher + @Provides + fun providesIoDispatcher(): CoroutineDispatcher = Dispatchers.IO + + @MainDispatcher + @Provides + fun providesMainDispatcher(): CoroutineDispatcher = Dispatchers.Main +} + +@Qualifier +@Retention(AnnotationRetention.BINARY) +annotation class DefaultDispatcher + +@Qualifier +@Retention(AnnotationRetention.BINARY) +annotation class IoDispatcher + +@Qualifier +@Retention(AnnotationRetention.BINARY) +annotation class MainDispatcher diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/multimediacard/activity/LoadPronunciationActivity.kt b/AnkiDroid/src/main/java/com/ichi2/anki/multimediacard/activity/LoadPronunciationActivity.kt index ee2def5a0883..3c038c196d93 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/multimediacard/activity/LoadPronunciationActivity.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/multimediacard/activity/LoadPronunciationActivity.kt @@ -29,11 +29,12 @@ import android.widget.Button import android.widget.LinearLayout import android.widget.Spinner import android.widget.TextView -import androidx.annotation.VisibleForTesting import androidx.lifecycle.lifecycleScope import com.ichi2.anki.AnkiActivity import com.ichi2.anki.R import com.ichi2.anki.UIUtils.showThemedToast +import com.ichi2.anki.di.IoDispatcher +import com.ichi2.anki.di.MainDispatcher import com.ichi2.anki.multimediacard.beolingus.parsing.BeolingusParser import com.ichi2.anki.multimediacard.language.LanguageListerBeolingus import com.ichi2.anki.web.HttpFetcher.downloadFileToSdCard @@ -41,15 +42,16 @@ import com.ichi2.anki.web.HttpFetcher.fetchThroughHttp import com.ichi2.themes.Themes.disableXiaomiForceDarkMode import com.ichi2.utils.AdaptionUtil.isUserATestClient import com.ichi2.utils.NetworkUtils +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import timber.log.Timber import java.io.UnsupportedEncodingException import java.net.URLEncoder +import javax.inject.Inject /** * Activity to load pronunciation files from Beolingus. @@ -58,7 +60,15 @@ import java.net.URLEncoder *

* When activity finished, it passes the filepath as another extra to the caller. */ +@AndroidEntryPoint open class LoadPronunciationActivity : AnkiActivity(), DialogInterface.OnCancelListener { + + @Inject + @MainDispatcher lateinit var mainDispatcher: CoroutineDispatcher + + @Inject + @IoDispatcher lateinit var ioDispatcher: CoroutineDispatcher + private var mStopped = false private lateinit var source: String private lateinit var mTranslationAddress: String @@ -345,14 +355,5 @@ open class LoadPronunciationActivity : AnkiActivity(), DialogInterface.OnCancelL // Passed out as a result const val EXTRA_PRONUNCIATION_FILE_PATH = "com.ichi2.anki.LoadPronounciationActivity.extra.pronun.file.path" - - private var ioDispatcher: CoroutineDispatcher = Dispatchers.IO - private var mainDispatcher: CoroutineDispatcher = Dispatchers.Main - - @VisibleForTesting - fun setTestDispatchers(dispatcher: CoroutineDispatcher) { - ioDispatcher = dispatcher - mainDispatcher = dispatcher - } } } diff --git a/build.gradle b/build.gradle index 4030edebc01e..df153f84b664 100644 --- a/build.gradle +++ b/build.gradle @@ -29,6 +29,8 @@ buildscript { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jlleitschuh.gradle:ktlint-gradle:11.0.0" + + classpath "com.google.dagger:hilt-android-gradle-plugin:2.43.2" } }