diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 783e8700..53431573 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -6,13 +6,12 @@ appintro = "6.3.1" commonsCodec = "1.16.0" commonsIo = "1.3.2" commonsLang3 = "3.14.0" -dagger = "2.55" +kotlin-inject = "0.9.0" desugar = "2.1.4" dexmaker = "2.28.3" espresso = "3.6.1" guava = "33.2.1-android" hamcrest = "2.2" -jsr250 = "1.0" jsr305 = "3.0.2" junit = "1.2.1" junitJupiter = "5.10.1" @@ -41,15 +40,14 @@ appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "a commons-codec = { module = "commons-codec:commons-codec", version.ref = "commonsCodec" } commons-io = { module = "org.apache.commons:commons-io", version.ref = "commonsIo" } commons-lang3 = { module = "org.apache.commons:commons-lang3", version.ref = "commonsLang3" } -dagger = { group = "com.google.dagger", name = "dagger", version.ref = "dagger" } -dagger-compiler = { group = "com.google.dagger", name = "dagger-compiler", version.ref = "dagger" } +kotlin-inject-runtime = { group = "me.tatarka.inject", name = "kotlin-inject-runtime", version.ref = "kotlin-inject" } +kotlin-inject-compiler = { group = "me.tatarka.inject", name = "kotlin-inject-compiler-ksp", version.ref = "kotlin-inject" } desugar_jdk_libs = { group = "com.android.tools", name = "desugar_jdk_libs", version.ref = "desugar" } dexmaker-mockito = { group = "com.linkedin.dexmaker", name = "dexmaker-mockito", version.ref = "dexmaker" } espresso-contrib = { group = "androidx.test.espresso", name = "espresso-contrib", version.ref = "espresso" } espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espresso" } guava = { group = "com.google.guava", name = "guava", version.ref = "guava" } hamcrest = { module = "org.hamcrest:hamcrest", version.ref = "hamcrest" } -jsr250-api = { group = "javax.annotation", name = "jsr250-api", version.ref = "jsr250" } jsr305 = { group = "com.google.code.findbugs", name = "jsr305", version.ref = "jsr305" } junit = { group = "androidx.test.ext", name = "junit", version.ref = "junit" } junit-junit = { module = "junit:junit", version.ref = "junitVersion" } @@ -79,7 +77,7 @@ documentfile = { group = "androidx.documentfile", name = "documentfile", version [bundles] androidTest = [ "annotation", - "dagger", + "kotlin-inject-runtime", "dexmaker-mockito", "espresso-contrib", "espresso-core", @@ -91,7 +89,7 @@ androidTest = [ "uiautomator" ] test = [ - "dagger", + "kotlin-inject-runtime", "junit-junit", "mockito-kotlin", ] diff --git a/uhabits-android/build.gradle.kts b/uhabits-android/build.gradle.kts index 960333f3..8947cfcd 100644 --- a/uhabits-android/build.gradle.kts +++ b/uhabits-android/build.gradle.kts @@ -89,11 +89,10 @@ android { } dependencies { - compileOnly(libs.jsr250.api) coreLibraryDesugaring(libs.desugar.jdk.libs) implementation(libs.appIntro) implementation(libs.jsr305) - implementation(libs.dagger) + implementation(libs.kotlin.inject.runtime) implementation(libs.guava) implementation(libs.ktor.client.android) implementation(libs.ktor.client.core) @@ -110,7 +109,7 @@ dependencies { implementation(libs.opencsv) implementation(libs.konfetti.xml) implementation(project(":uhabits-core")) - ksp(libs.dagger.compiler) + ksp(libs.kotlin.inject.compiler) androidTestImplementation(libs.bundles.androidTest) testImplementation(libs.bundles.test) diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.kt index aac323f4..ab162864 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.kt +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.kt @@ -37,9 +37,7 @@ import org.isoron.uhabits.core.models.HabitList import org.isoron.uhabits.core.models.ModelFactory import org.isoron.uhabits.core.preferences.Preferences import org.isoron.uhabits.core.tasks.TaskRunner -import org.isoron.uhabits.inject.ActivityContextModule -import org.isoron.uhabits.inject.AppContextModule -import org.isoron.uhabits.inject.HabitsModule +import org.isoron.uhabits.inject.create import org.isoron.uhabits.utils.DatabaseUtils.getDatabaseFile import org.isoron.uhabits.utils.InterfaceUtils.setFixedResolution import org.isoron.uhabits.utils.StyledResources.Companion.setFixedTheme @@ -81,11 +79,10 @@ abstract class BaseAndroidTest : TestCase() { latch = CountDownLatch(1) val context = targetContext.applicationContext val dbFile = getDatabaseFile(context) - appComponent = DaggerHabitsApplicationTestComponent - .builder() - .appContextModule(AppContextModule(context)) - .habitsModule(HabitsModule(dbFile)) - .build() + appComponent = HabitsApplicationTestComponent::class.create( + appContext = context, + dbFile = dbFile + ) HabitsApplication.component = appComponent prefs = appComponent.preferences habitList = appComponent.habitList @@ -96,11 +93,10 @@ abstract class BaseAndroidTest : TestCase() { fixtures = HabitFixtures(modelFactory, habitList) fixtures.purgeHabits(appComponent.habitList) fixtures.createEmptyHabit() - component = DaggerHabitsActivityTestComponent - .builder() - .activityContextModule(ActivityContextModule(targetContext)) - .habitsApplicationComponent(appComponent) - .build() + component = HabitsActivityTestComponent::class.create( + parent = appComponent, + activityContext = targetContext + ) } protected fun assertWidgetProviderIsInstalled(componentClass: Class?) { diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitsActivityTestComponent.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitsActivityTestComponent.kt index 25a82f69..1c1351cc 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitsActivityTestComponent.kt +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitsActivityTestComponent.kt @@ -19,38 +19,60 @@ package org.isoron.uhabits -import dagger.Component -import dagger.Module -import dagger.Provides +import android.content.Context +import me.tatarka.inject.annotations.Component +import me.tatarka.inject.annotations.Provides +import org.isoron.uhabits.activities.HabitsDirFinder import org.isoron.uhabits.activities.habits.list.ListHabitsModule +import org.isoron.uhabits.activities.habits.list.ListHabitsScreen import org.isoron.uhabits.activities.habits.list.views.CheckmarkButtonViewFactory import org.isoron.uhabits.activities.habits.list.views.CheckmarkPanelViewFactory +import org.isoron.uhabits.activities.habits.list.views.HabitCardListAdapter import org.isoron.uhabits.activities.habits.list.views.HabitCardViewFactory import org.isoron.uhabits.activities.habits.list.views.NumberButtonViewFactory import org.isoron.uhabits.activities.habits.list.views.NumberPanelViewFactory import org.isoron.uhabits.core.ui.screens.habits.list.ListHabitsBehavior -import org.isoron.uhabits.inject.ActivityContextModule +import org.isoron.uhabits.core.ui.screens.habits.list.ListHabitsMenuBehavior +import org.isoron.uhabits.core.ui.screens.habits.list.ListHabitsSelectionMenuBehavior +import org.isoron.uhabits.inject.ActivityContext import org.isoron.uhabits.inject.ActivityScope -import org.isoron.uhabits.inject.HabitModule -import org.isoron.uhabits.inject.HabitsActivityModule import org.isoron.uhabits.inject.HabitsApplicationComponent import org.mockito.kotlin.mock -@Module -class TestModule { - @Provides - fun listHabitsBehavior(): ListHabitsBehavior = mock() -} - @ActivityScope -@Component( - modules = [ActivityContextModule::class, HabitsActivityModule::class, ListHabitsModule::class, HabitModule::class, TestModule::class], - dependencies = [HabitsApplicationComponent::class] -) -interface HabitsActivityTestComponent { - fun getCheckmarkPanelViewFactory(): CheckmarkPanelViewFactory - fun getHabitCardViewFactory(): HabitCardViewFactory - fun getEntryButtonViewFactory(): CheckmarkButtonViewFactory - fun getNumberButtonViewFactory(): NumberButtonViewFactory - fun getNumberPanelViewFactory(): NumberPanelViewFactory +@Component +abstract class HabitsActivityTestComponent( + @Component val parent: HabitsApplicationComponent, + @get:Provides @get:ActivityContext + val activityContext: Context +) { + abstract fun getCheckmarkPanelViewFactory(): CheckmarkPanelViewFactory + abstract fun getHabitCardViewFactory(): HabitCardViewFactory + abstract fun getEntryButtonViewFactory(): CheckmarkButtonViewFactory + abstract fun getNumberButtonViewFactory(): NumberButtonViewFactory + abstract fun getNumberPanelViewFactory(): NumberPanelViewFactory + + @Provides + open fun listHabitsBehavior(): ListHabitsBehavior = mock() + + open val HabitCardListAdapter.bindAdapter: ListHabitsMenuBehavior.Adapter + @Provides get() = this + + open val ListHabitsModule.bindBugReporter: ListHabitsBehavior.BugReporter + @Provides get() = this + + open val ListHabitsScreen.bindMenuScreen: ListHabitsMenuBehavior.Screen + @Provides get() = this + + open val ListHabitsScreen.bindScreen: ListHabitsBehavior.Screen + @Provides get() = this + + open val HabitCardListAdapter.bindSelMenuAdapter: ListHabitsSelectionMenuBehavior.Adapter + @Provides get() = this + + open val ListHabitsScreen.bindSelMenuScreen: ListHabitsSelectionMenuBehavior.Screen + @Provides get() = this + + open val HabitsDirFinder.bindDirFinder: ListHabitsBehavior.DirFinder + @Provides get() = this } diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitsApplicationTestComponent.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitsApplicationTestComponent.kt index 82ebf37f..b8742add 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitsApplicationTestComponent.kt +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitsApplicationTestComponent.kt @@ -18,15 +18,28 @@ */ package org.isoron.uhabits -import dagger.Component +import android.content.Context +import me.tatarka.inject.annotations.Component +import me.tatarka.inject.annotations.Provides import org.isoron.uhabits.core.AppScope -import org.isoron.uhabits.inject.AppContextModule +import org.isoron.uhabits.core.tasks.SingleThreadTaskRunner +import org.isoron.uhabits.core.tasks.TaskRunner +import org.isoron.uhabits.inject.AppContext import org.isoron.uhabits.inject.HabitsApplicationComponent -import org.isoron.uhabits.inject.HabitsModule import org.isoron.uhabits.intents.IntentScheduler +import java.io.File @AppScope -@Component(modules = [AppContextModule::class, HabitsModule::class, SingleThreadModule::class]) -interface HabitsApplicationTestComponent : HabitsApplicationComponent { - val intentScheduler: IntentScheduler? +@Component +abstract class HabitsApplicationTestComponent( + @get:Provides @get:AppContext + appContext: Context, + @get:Provides dbFile: File +) : HabitsApplicationComponent(appContext, dbFile) { + + abstract val intentScheduler: IntentScheduler? + + @AppScope + @Provides + override fun taskRunner(): TaskRunner = SingleThreadTaskRunner() } diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/SingleThreadModule.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/SingleThreadModule.kt deleted file mode 100644 index b07aaee6..00000000 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/SingleThreadModule.kt +++ /dev/null @@ -1,17 +0,0 @@ -package org.isoron.uhabits - -import dagger.Module -import dagger.Provides -import org.isoron.uhabits.core.AppScope -import org.isoron.uhabits.core.tasks.SingleThreadTaskRunner -import org.isoron.uhabits.core.tasks.TaskRunner - -@Module -internal object SingleThreadModule { - @JvmStatic - @Provides - @AppScope - fun provideTaskRunner(): TaskRunner { - return SingleThreadTaskRunner() - } -} diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/AndroidBugReporter.kt b/uhabits-android/src/main/java/org/isoron/uhabits/AndroidBugReporter.kt index 8dea7407..960c3035 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/AndroidBugReporter.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/AndroidBugReporter.kt @@ -22,6 +22,7 @@ import android.content.Context import android.os.Build import android.os.Environment import android.view.WindowManager +import me.tatarka.inject.annotations.Inject import org.isoron.uhabits.inject.AppContext import java.io.BufferedReader import java.io.File @@ -32,9 +33,9 @@ import java.text.SimpleDateFormat import java.util.Date import java.util.LinkedList import java.util.Locale -import javax.inject.Inject -open class AndroidBugReporter @Inject constructor(@AppContext private val context: Context) { +@Inject +open class AndroidBugReporter(@AppContext private val context: Context) { /** * Captures and returns a bug report. The bug report contains some device diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/AndroidDirFinder.kt b/uhabits-android/src/main/java/org/isoron/uhabits/AndroidDirFinder.kt index a3ed3e65..33900e34 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/AndroidDirFinder.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/AndroidDirFinder.kt @@ -20,12 +20,13 @@ package org.isoron.uhabits import android.content.Context import androidx.core.content.ContextCompat +import me.tatarka.inject.annotations.Inject import org.isoron.uhabits.inject.AppContext import org.isoron.uhabits.utils.FileUtils import java.io.File -import javax.inject.Inject -class AndroidDirFinder @Inject constructor(@param:AppContext private val context: Context) { +@Inject +class AndroidDirFinder(@param:AppContext private val context: Context) { fun getFilesDir(relativePath: String): File? { return FileUtils.getDir( ContextCompat.getExternalFilesDirs(context, null), diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/HabitsApplication.kt b/uhabits-android/src/main/java/org/isoron/uhabits/HabitsApplication.kt index 56ad774f..adcb6707 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/HabitsApplication.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/HabitsApplication.kt @@ -26,10 +26,8 @@ import org.isoron.platform.time.setToday import org.isoron.uhabits.core.database.UnsupportedDatabaseVersionException import org.isoron.uhabits.core.reminders.ReminderScheduler import org.isoron.uhabits.core.ui.NotificationTray -import org.isoron.uhabits.inject.AppContextModule -import org.isoron.uhabits.inject.DaggerHabitsApplicationComponent import org.isoron.uhabits.inject.HabitsApplicationComponent -import org.isoron.uhabits.inject.HabitsModule +import org.isoron.uhabits.inject.create import org.isoron.uhabits.utils.DatabaseUtils import org.isoron.uhabits.widgets.WidgetUpdater import java.io.File @@ -62,11 +60,10 @@ class HabitsApplication : Application() { } val db = DatabaseUtils.getDatabaseFile(this) - HabitsApplication.component = DaggerHabitsApplicationComponent - .builder() - .appContextModule(AppContextModule(context)) - .habitsModule(HabitsModule(db)) - .build() + HabitsApplication.component = HabitsApplicationComponent::class.create( + appContext = context, + dbFile = db + ) val prefs = component.preferences prefs.lastAppVersion = BuildConfig.VERSION_CODE diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/HabitsDirFinder.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/HabitsDirFinder.kt index a50b1149..2003306f 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/HabitsDirFinder.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/HabitsDirFinder.kt @@ -18,14 +18,14 @@ */ package org.isoron.uhabits.activities +import me.tatarka.inject.annotations.Inject import org.isoron.uhabits.AndroidDirFinder import org.isoron.uhabits.core.ui.screens.habits.list.ListHabitsBehavior import org.isoron.uhabits.core.ui.screens.habits.show.ShowHabitMenuPresenter import java.io.File -import javax.inject.Inject -class HabitsDirFinder @Inject -constructor( +@Inject +class HabitsDirFinder( private val androidDirFinder: AndroidDirFinder ) : ShowHabitMenuPresenter.System, ListHabitsBehavior.DirFinder { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ColorPickerDialogFactory.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ColorPickerDialogFactory.kt index c36f462e..81ba24d4 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ColorPickerDialogFactory.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ColorPickerDialogFactory.kt @@ -20,6 +20,7 @@ package org.isoron.uhabits.activities.common.dialogs import android.content.Context import com.android.colorpicker.ColorPickerDialog.SIZE_SMALL +import me.tatarka.inject.annotations.Inject import org.isoron.platform.gui.toInt import org.isoron.uhabits.R import org.isoron.uhabits.core.models.PaletteColor @@ -27,10 +28,10 @@ import org.isoron.uhabits.core.ui.views.Theme import org.isoron.uhabits.inject.ActivityContext import org.isoron.uhabits.inject.ActivityScope import org.isoron.uhabits.utils.StyledResources -import javax.inject.Inject +@Inject @ActivityScope -class ColorPickerDialogFactory @Inject constructor(@param:ActivityContext private val context: Context) { +class ColorPickerDialogFactory(@param:ActivityContext private val context: Context) { fun create(color: PaletteColor, theme: Theme): ColorPickerDialog { val dialog = ColorPickerDialog() val res = StyledResources(context) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt index 20eacb18..553841ae 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt @@ -41,10 +41,9 @@ import org.isoron.uhabits.core.tasks.TaskRunner import org.isoron.uhabits.core.ui.ThemeSwitcher.Companion.THEME_DARK import org.isoron.uhabits.core.utils.MidnightTimer import org.isoron.uhabits.database.AutoBackup -import org.isoron.uhabits.inject.ActivityContextModule -import org.isoron.uhabits.inject.DaggerHabitsActivityComponent import org.isoron.uhabits.inject.HabitsActivityComponent import org.isoron.uhabits.inject.HabitsApplicationComponent +import org.isoron.uhabits.inject.create import org.isoron.uhabits.utils.applyRootViewInsets import org.isoron.uhabits.utils.dismissCurrentDialog import org.isoron.uhabits.utils.restartWithFade @@ -83,11 +82,10 @@ class ListHabitsActivity : AppCompatActivity(), Preferences.Listener { super.onCreate(savedInstanceState) appComponent = (applicationContext as HabitsApplication).component - component = DaggerHabitsActivityComponent - .builder() - .activityContextModule(ActivityContextModule(this)) - .habitsApplicationComponent(appComponent) - .build() + component = HabitsActivityComponent::class.create( + parent = appComponent, + activityContext = this + ) component.themeSwitcher.apply() prefs = appComponent.preferences diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.kt index 59a31c6d..70629fc8 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.kt @@ -24,6 +24,7 @@ import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import androidx.appcompat.app.AppCompatActivity +import me.tatarka.inject.annotations.Inject import org.isoron.uhabits.R import org.isoron.uhabits.core.models.HabitList import org.isoron.uhabits.core.preferences.Preferences @@ -32,10 +33,10 @@ import org.isoron.uhabits.core.ui.screens.habits.list.ListHabitsMenuBehavior import org.isoron.uhabits.inject.ActivityContext import org.isoron.uhabits.inject.ActivityScope import org.isoron.uhabits.utils.StyledResources -import javax.inject.Inject +@Inject @ActivityScope -class ListHabitsMenu @Inject constructor( +class ListHabitsMenu( @ActivityContext context: Context, private val preferences: Preferences, private val themeSwitcher: ThemeSwitcher, diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsModule.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsModule.kt index f1650585..85c185cb 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsModule.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsModule.kt @@ -20,43 +20,12 @@ package org.isoron.uhabits.activities.habits.list import android.content.Context -import dagger.Binds -import dagger.Module +import me.tatarka.inject.annotations.Inject import org.isoron.uhabits.AndroidBugReporter -import org.isoron.uhabits.activities.HabitsDirFinder -import org.isoron.uhabits.activities.habits.list.views.HabitCardListAdapter import org.isoron.uhabits.core.ui.screens.habits.list.ListHabitsBehavior -import org.isoron.uhabits.core.ui.screens.habits.list.ListHabitsMenuBehavior -import org.isoron.uhabits.core.ui.screens.habits.list.ListHabitsSelectionMenuBehavior import org.isoron.uhabits.inject.AppContext -import javax.inject.Inject -class BugReporterProxy -@Inject constructor( +@Inject +class ListHabitsModule( @AppContext context: Context ) : AndroidBugReporter(context), ListHabitsBehavior.BugReporter - -@Module -abstract class ListHabitsModule { - - @Binds - abstract fun getAdapter(adapter: HabitCardListAdapter): ListHabitsMenuBehavior.Adapter - - @Binds - abstract fun getBugReporter(proxy: BugReporterProxy): ListHabitsBehavior.BugReporter - - @Binds - abstract fun getMenuScreen(screen: ListHabitsScreen): ListHabitsMenuBehavior.Screen - - @Binds - abstract fun getScreen(screen: ListHabitsScreen): ListHabitsBehavior.Screen - - @Binds - abstract fun getSelMenuAdapter(adapter: HabitCardListAdapter): ListHabitsSelectionMenuBehavior.Adapter - - @Binds - abstract fun getSelMenuScreen(screen: ListHabitsScreen): ListHabitsSelectionMenuBehavior.Screen - - @Binds - abstract fun getSystem(system: HabitsDirFinder): ListHabitsBehavior.DirFinder -} diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsRootView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsRootView.kt index 021e920c..b165e392 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsRootView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsRootView.kt @@ -23,6 +23,7 @@ import android.content.Context import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.widget.FrameLayout import android.widget.RelativeLayout +import me.tatarka.inject.annotations.Inject import nl.dionsegijn.konfetti.xml.KonfettiView import org.isoron.uhabits.R import org.isoron.uhabits.activities.common.views.ScrollableChart @@ -50,14 +51,14 @@ import org.isoron.uhabits.utils.dim import org.isoron.uhabits.utils.dp import org.isoron.uhabits.utils.setupToolbar import org.isoron.uhabits.utils.sres -import javax.inject.Inject import kotlin.math.max import kotlin.math.min const val MAX_CHECKMARK_COUNT = 60 +@Inject @ActivityScope -class ListHabitsRootView @Inject constructor( +class ListHabitsRootView( @ActivityContext context: Context, hintListFactory: HintListFactory, preferences: Preferences, diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt index c720ae43..d03c8cbd 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt @@ -25,7 +25,7 @@ import android.content.Intent import android.os.Bundle import android.provider.Settings import androidx.appcompat.app.AppCompatActivity -import dagger.Lazy +import me.tatarka.inject.annotations.Inject import nl.dionsegijn.konfetti.core.Party import nl.dionsegijn.konfetti.core.Position import nl.dionsegijn.konfetti.core.emitter.Emitter @@ -78,7 +78,6 @@ import org.isoron.uhabits.utils.showSendFileScreen import java.io.File import java.io.IOException import java.util.concurrent.TimeUnit -import javax.inject.Inject const val RESULT_IMPORT_DATA = 101 const val RESULT_EXPORT_CSV = 102 @@ -88,9 +87,9 @@ const val RESULT_REPAIR_DB = 105 const val REQUEST_OPEN_DOCUMENT = 106 const val REQUEST_SETTINGS = 107 +@Inject @ActivityScope -class ListHabitsScreen -@Inject constructor( +class ListHabitsScreen( @ActivityContext val context: Context, private val commandRunner: CommandRunner, private val intentFactory: IntentFactory, @@ -148,10 +147,10 @@ class ListHabitsScreen private fun onSettingsResult(resultCode: Int) { when (resultCode) { RESULT_IMPORT_DATA -> showImportScreen() - RESULT_EXPORT_CSV -> behavior.get().onExportCSV() + RESULT_EXPORT_CSV -> behavior.value.onExportCSV() RESULT_EXPORT_DB -> onExportDB() - RESULT_BUG_REPORT -> behavior.get().onSendBugReport() - RESULT_REPAIR_DB -> behavior.get().onRepairDB() + RESULT_BUG_REPORT -> behavior.value.onSendBugReport() + RESULT_REPAIR_DB -> behavior.value.onRepairDB() } } @@ -236,7 +235,7 @@ class ListHabitsScreen return } val baseColor = themeSwitcher.currentTheme!!.color(color).toInt() - rootView.get().konfettiView.start( + rootView.value.konfettiView.start( Party( speed = 0f, maxSpeed = 16f, @@ -288,7 +287,7 @@ class ListHabitsScreen color: PaletteColor, callback: ListHabitsBehavior.CheckMarkDialogCallback ) { - val theme = rootView.get().currentTheme() + val theme = rootView.value.currentTheme() val fm = (context as AppCompatActivity).supportFragmentManager val dialog = CheckmarkDialog() dialog.arguments = Bundle().apply { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsSelectionMenu.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsSelectionMenu.kt index 826b01eb..c71565e4 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsSelectionMenu.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsSelectionMenu.kt @@ -24,7 +24,7 @@ import android.view.Menu import android.view.MenuItem import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.view.ActionMode -import dagger.Lazy +import me.tatarka.inject.annotations.Inject import org.isoron.platform.time.getToday import org.isoron.uhabits.R import org.isoron.uhabits.activities.habits.list.views.HabitCardListAdapter @@ -35,10 +35,10 @@ import org.isoron.uhabits.core.ui.NotificationTray import org.isoron.uhabits.core.ui.screens.habits.list.ListHabitsSelectionMenuBehavior import org.isoron.uhabits.inject.ActivityContext import org.isoron.uhabits.inject.ActivityScope -import javax.inject.Inject +@Inject @ActivityScope -class ListHabitsSelectionMenu @Inject constructor( +class ListHabitsSelectionMenu( @ActivityContext context: Context, private val listAdapter: HabitCardListAdapter, var commandRunner: CommandRunner, @@ -86,7 +86,7 @@ class ListHabitsSelectionMenu @Inject constructor( return true } override fun onDestroyActionMode(mode: ActionMode?) { - listController.get().onSelectionFinished() + listController.value.onSelectionFinished() } override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.kt index 0213b1d3..c8653f32 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.kt @@ -28,6 +28,7 @@ import android.text.TextPaint import android.view.HapticFeedbackConstants import android.view.View import android.view.View.MeasureSpec.EXACTLY +import me.tatarka.inject.annotations.Inject import org.isoron.uhabits.R import org.isoron.uhabits.core.models.Entry import org.isoron.uhabits.core.models.Entry.Companion.NO @@ -42,10 +43,9 @@ import org.isoron.uhabits.utils.getFontAwesome import org.isoron.uhabits.utils.sp import org.isoron.uhabits.utils.sres import org.isoron.uhabits.utils.toMeasureSpec -import javax.inject.Inject -class CheckmarkButtonViewFactory -@Inject constructor( +@Inject +class CheckmarkButtonViewFactory( @ActivityContext val context: Context, val preferences: Preferences ) { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelView.kt index cae55074..e01756c3 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelView.kt @@ -20,15 +20,15 @@ package org.isoron.uhabits.activities.habits.list.views import android.content.Context +import me.tatarka.inject.annotations.Inject import org.isoron.platform.time.LocalDate import org.isoron.platform.time.getToday import org.isoron.uhabits.core.models.Entry.Companion.UNKNOWN import org.isoron.uhabits.core.preferences.Preferences import org.isoron.uhabits.inject.ActivityContext -import javax.inject.Inject -class CheckmarkPanelViewFactory -@Inject constructor( +@Inject +class CheckmarkPanelViewFactory( @ActivityContext val context: Context, val preferences: Preferences, private val buttonFactory: CheckmarkButtonViewFactory diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListAdapter.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListAdapter.kt index 9f91834f..ba660b82 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListAdapter.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListAdapter.kt @@ -20,6 +20,7 @@ package org.isoron.uhabits.activities.habits.list.views import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView +import me.tatarka.inject.annotations.Inject import org.isoron.uhabits.activities.habits.list.MAX_CHECKMARK_COUNT import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.core.models.HabitList @@ -32,7 +33,6 @@ import org.isoron.uhabits.core.ui.screens.habits.list.ListHabitsSelectionMenuBeh import org.isoron.uhabits.core.utils.MidnightTimer import org.isoron.uhabits.inject.ActivityScope import java.util.LinkedList -import javax.inject.Inject /** * Provides data that backs a [HabitCardListView]. @@ -41,8 +41,9 @@ import javax.inject.Inject * The data if fetched and cached by a [HabitCardListCache]. This adapter * also holds a list of items that have been selected. */ +@Inject @ActivityScope -class HabitCardListAdapter @Inject constructor( +class HabitCardListAdapter( private val cache: HabitCardListCache, private val preferences: Preferences, private val midnightTimer: MidnightTimer diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListController.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListController.kt index 42d7678f..fb267baa 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListController.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListController.kt @@ -19,21 +19,21 @@ package org.isoron.uhabits.activities.habits.list.views -import dagger.Lazy +import me.tatarka.inject.annotations.Inject import org.isoron.uhabits.activities.habits.list.ListHabitsSelectionMenu import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.core.models.ModelObservable import org.isoron.uhabits.core.ui.screens.habits.list.ListHabitsBehavior import org.isoron.uhabits.inject.ActivityScope -import javax.inject.Inject /** * Controller responsible for receiving and processing the events generated by a * HabitListView. These include selecting and reordering items, toggling * checkmarks and clicking habits. */ +@Inject @ActivityScope -class HabitCardListController @Inject constructor( +class HabitCardListController( private val adapter: HabitCardListAdapter, private val behavior: ListHabitsBehavior, private val selectionMenu: Lazy @@ -69,7 +69,7 @@ class HabitCardListController @Inject constructor( override fun onModelChange() { if (adapter.isSelectionEmpty) { activeMode = NormalMode() - selectionMenu.get().onSelectionFinish() + selectionMenu.value.onSelectionFinish() } } @@ -89,7 +89,7 @@ class HabitCardListController @Inject constructor( private fun cancelSelection() { adapter.clearSelection() activeMode = NormalMode() - selectionMenu.get().onSelectionFinish() + selectionMenu.value.onSelectionFinish() } interface HabitListener { @@ -130,7 +130,7 @@ class HabitCardListController @Inject constructor( private fun startSelection(position: Int) { toggleSelection(position) activeMode = SelectionMode() - selectionMenu.get().onSelectionStart() + selectionMenu.value.onSelectionStart() } } @@ -157,9 +157,9 @@ class HabitCardListController @Inject constructor( private fun notifyListener() { if (activeMode is SelectionMode) { - selectionMenu.get().onSelectionChange() + selectionMenu.value.onSelectionChange() } else { - selectionMenu.get().onSelectionFinish() + selectionMenu.value.onSelectionFinish() } } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.kt index da807ffe..70f3b18c 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.kt @@ -35,15 +35,14 @@ import androidx.recyclerview.widget.ItemTouchHelper.START import androidx.recyclerview.widget.ItemTouchHelper.UP import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import dagger.Lazy +import me.tatarka.inject.annotations.Inject import org.isoron.uhabits.R import org.isoron.uhabits.activities.common.views.BundleSavedState import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.inject.ActivityContext -import javax.inject.Inject -class HabitCardListViewFactory -@Inject constructor( +@Inject +class HabitCardListViewFactory( @ActivityContext val context: Context, val adapter: HabitCardListAdapter, val cardViewFactory: HabitCardViewFactory, @@ -186,13 +185,13 @@ class HabitCardListView( override fun onLongPress(e: MotionEvent) { val position = holder.adapterPosition - controller.get().onItemLongClick(position) + controller.value.onItemLongClick(position) if (adapter.isSortable) touchHelper.startDrag(holder) } override fun onSingleTapUp(e: MotionEvent): Boolean { val position = holder.adapterPosition - controller.get().onItemClick(position) + controller.value.onItemClick(position) return true } } @@ -210,7 +209,7 @@ class HabitCardListView( from: ViewHolder, to: ViewHolder ): Boolean { - controller.get().drop(from.adapterPosition, to.adapterPosition) + controller.value.drop(from.adapterPosition, to.adapterPosition) return true } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt index 6c635694..5a69a5a4 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt @@ -34,6 +34,7 @@ import android.view.ViewGroup.LayoutParams.WRAP_CONTENT import android.widget.FrameLayout import android.widget.LinearLayout import android.widget.TextView +import me.tatarka.inject.annotations.Inject import org.isoron.platform.gui.toInt import org.isoron.platform.time.LocalDate import org.isoron.platform.time.getToday @@ -46,10 +47,9 @@ import org.isoron.uhabits.inject.ActivityContext import org.isoron.uhabits.utils.currentTheme import org.isoron.uhabits.utils.dp import org.isoron.uhabits.utils.sres -import javax.inject.Inject -class HabitCardViewFactory -@Inject constructor( +@Inject +class HabitCardViewFactory( @ActivityContext val context: Context, private val checkmarkPanelFactory: CheckmarkPanelViewFactory, private val numberPanelFactory: NumberPanelViewFactory, diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt index 1d81f3f5..1d1e3201 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt @@ -28,6 +28,7 @@ import android.text.TextPaint import android.view.View import android.view.View.OnClickListener import android.view.View.OnLongClickListener +import me.tatarka.inject.annotations.Inject import org.isoron.uhabits.R import org.isoron.uhabits.core.models.Entry import org.isoron.uhabits.core.models.NumericalHabitType.AT_LEAST @@ -40,7 +41,6 @@ import org.isoron.uhabits.utils.drawNotesIndicator import org.isoron.uhabits.utils.getFontAwesome import org.isoron.uhabits.utils.sres import java.text.DecimalFormat -import javax.inject.Inject private val BOLD_TYPEFACE = Typeface.create("sans-serif-condensed", Typeface.BOLD) private val NORMAL_TYPEFACE = Typeface.create("sans-serif-condensed", Typeface.NORMAL) @@ -58,8 +58,8 @@ fun Double.toShortString(): String = when { else -> DecimalFormat("#.##").format(this) } -class NumberButtonViewFactory -@Inject constructor( +@Inject +class NumberButtonViewFactory( @ActivityContext val context: Context, val preferences: Preferences ) { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelView.kt index b63f45b9..4b83270d 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelView.kt @@ -20,15 +20,15 @@ package org.isoron.uhabits.activities.habits.list.views import android.content.Context +import me.tatarka.inject.annotations.Inject import org.isoron.platform.time.LocalDate import org.isoron.platform.time.getToday import org.isoron.uhabits.core.models.NumericalHabitType import org.isoron.uhabits.core.preferences.Preferences import org.isoron.uhabits.inject.ActivityContext -import javax.inject.Inject -class NumberPanelViewFactory -@Inject constructor( +@Inject +class NumberPanelViewFactory( @ActivityContext val context: Context, val preferences: Preferences, val buttonFactory: NumberButtonViewFactory diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/automation/FireSettingReceiver.kt b/uhabits-android/src/main/java/org/isoron/uhabits/automation/FireSettingReceiver.kt index ad4d7a71..9f1ccf0b 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/automation/FireSettingReceiver.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/automation/FireSettingReceiver.kt @@ -22,7 +22,7 @@ package org.isoron.uhabits.automation import android.content.BroadcastReceiver import android.content.Context import android.content.Intent -import dagger.Component +import me.tatarka.inject.annotations.Component import org.isoron.platform.time.getToday import org.isoron.uhabits.HabitsApplication import org.isoron.uhabits.core.models.HabitList @@ -39,16 +39,21 @@ const val ACTION_DECREMENT = 4 const val EXTRA_BUNDLE = "com.twofortyfouram.locale.intent.extra.BUNDLE" const val EXTRA_STRING_BLURB = "com.twofortyfouram.locale.intent.extra.BLURB" +@ReceiverScope +@Component +internal abstract class FireSettingReceiverComponent( + @Component val parent: HabitsApplicationComponent +) { + abstract val widgetController: WidgetBehavior +} + class FireSettingReceiver : BroadcastReceiver() { private lateinit var allHabits: HabitList override fun onReceive(context: Context, intent: Intent) { val app = context.applicationContext as HabitsApplication - val component = DaggerFireSettingReceiver_ReceiverComponent - .builder() - .habitsApplicationComponent(app.component) - .build() + val component = FireSettingReceiverComponent::class.create(app.component) allHabits = app.component.habitList val args = SettingUtils.parseIntent(intent, allHabits) ?: return val today = getToday() @@ -62,10 +67,4 @@ class FireSettingReceiver : BroadcastReceiver() { ACTION_DECREMENT -> controller.onDecrement(args.habit, today, 1000) } } - - @ReceiverScope - @Component(dependencies = [HabitsApplicationComponent::class]) - internal interface ReceiverComponent { - val widgetController: WidgetBehavior - } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/database/AndroidDatabaseOpener.kt b/uhabits-android/src/main/java/org/isoron/uhabits/database/AndroidDatabaseOpener.kt index b26fbe91..1c6aa0c6 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/database/AndroidDatabaseOpener.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/database/AndroidDatabaseOpener.kt @@ -20,11 +20,12 @@ package org.isoron.uhabits.database import android.database.sqlite.SQLiteDatabase +import me.tatarka.inject.annotations.Inject import org.isoron.uhabits.core.database.DatabaseOpener import java.io.File -import javax.inject.Inject -class AndroidDatabaseOpener @Inject constructor() : DatabaseOpener { +@Inject +class AndroidDatabaseOpener() : DatabaseOpener { override fun open(file: File): AndroidDatabase { return AndroidDatabase( db = SQLiteDatabase.openDatabase( diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/inject/ActivityContext.kt b/uhabits-android/src/main/java/org/isoron/uhabits/inject/ActivityContext.kt index 07629e14..ed281373 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/inject/ActivityContext.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/inject/ActivityContext.kt @@ -18,9 +18,13 @@ */ package org.isoron.uhabits.inject -import javax.inject.Qualifier +import me.tatarka.inject.annotations.Qualifier @Qualifier -@MustBeDocumented -@kotlin.annotation.Retention(AnnotationRetention.RUNTIME) +@Target( + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.FUNCTION, + AnnotationTarget.VALUE_PARAMETER, + AnnotationTarget.TYPE +) annotation class ActivityContext diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/inject/ActivityContextModule.kt b/uhabits-android/src/main/java/org/isoron/uhabits/inject/ActivityContextModule.kt deleted file mode 100644 index b51505f3..00000000 --- a/uhabits-android/src/main/java/org/isoron/uhabits/inject/ActivityContextModule.kt +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2016-2025 Álinson Santos Xavier - * - * This file is part of Loop Habit Tracker. - * - * Loop Habit Tracker 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. - * - * Loop Habit Tracker 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 org.isoron.uhabits.inject - -import android.content.Context -import dagger.Module -import dagger.Provides - -@Module -class ActivityContextModule( - @get:Provides - @get:ActivityContext - val context: Context -) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/inject/ActivityScope.kt b/uhabits-android/src/main/java/org/isoron/uhabits/inject/ActivityScope.kt index bdaeb092..e63ef621 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/inject/ActivityScope.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/inject/ActivityScope.kt @@ -18,7 +18,7 @@ */ package org.isoron.uhabits.inject -import javax.inject.Scope +import me.tatarka.inject.annotations.Scope /** * Scope used by objects that live as long as the activity is alive. diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/inject/AppContext.kt b/uhabits-android/src/main/java/org/isoron/uhabits/inject/AppContext.kt index 4a618a6e..a07adb9f 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/inject/AppContext.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/inject/AppContext.kt @@ -18,9 +18,13 @@ */ package org.isoron.uhabits.inject -import javax.inject.Qualifier +import me.tatarka.inject.annotations.Qualifier @Qualifier -@MustBeDocumented -@Retention(AnnotationRetention.RUNTIME) +@Target( + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.FUNCTION, + AnnotationTarget.VALUE_PARAMETER, + AnnotationTarget.TYPE +) annotation class AppContext diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/inject/AppContextModule.kt b/uhabits-android/src/main/java/org/isoron/uhabits/inject/AppContextModule.kt deleted file mode 100644 index 04714a80..00000000 --- a/uhabits-android/src/main/java/org/isoron/uhabits/inject/AppContextModule.kt +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2016-2025 Álinson Santos Xavier - * - * This file is part of Loop Habit Tracker. - * - * Loop Habit Tracker 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. - * - * Loop Habit Tracker 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 org.isoron.uhabits.inject - -import android.content.Context -import dagger.Module -import dagger.Provides - -@Module -class AppContextModule( - @get:Provides - @get:AppContext - @param:AppContext - val context: Context -) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/inject/HabitModule.kt b/uhabits-android/src/main/java/org/isoron/uhabits/inject/HabitModule.kt deleted file mode 100644 index d2a35d5d..00000000 --- a/uhabits-android/src/main/java/org/isoron/uhabits/inject/HabitModule.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2016-2025 Álinson Santos Xavier - * - * This file is part of Loop Habit Tracker. - * - * Loop Habit Tracker 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. - * - * Loop Habit Tracker 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 org.isoron.uhabits.inject - -import dagger.Module -import dagger.Provides -import org.isoron.uhabits.core.models.Habit - -@Module -class HabitModule(private val habit: Habit) { - @Provides fun getHabit() = habit -} diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/inject/HabitsActivityComponent.kt b/uhabits-android/src/main/java/org/isoron/uhabits/inject/HabitsActivityComponent.kt index 5fdc0635..46263e78 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/inject/HabitsActivityComponent.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/inject/HabitsActivityComponent.kt @@ -19,7 +19,11 @@ package org.isoron.uhabits.inject -import dagger.Component +import android.content.Context +import me.tatarka.inject.annotations.Component +import me.tatarka.inject.annotations.Provides +import org.isoron.uhabits.activities.AndroidThemeSwitcher +import org.isoron.uhabits.activities.HabitsDirFinder import org.isoron.uhabits.activities.common.dialogs.ColorPickerDialogFactory import org.isoron.uhabits.activities.habits.list.ListHabitsMenu import org.isoron.uhabits.activities.habits.list.ListHabitsModule @@ -27,21 +31,53 @@ import org.isoron.uhabits.activities.habits.list.ListHabitsRootView import org.isoron.uhabits.activities.habits.list.ListHabitsScreen import org.isoron.uhabits.activities.habits.list.ListHabitsSelectionMenu import org.isoron.uhabits.activities.habits.list.views.HabitCardListAdapter +import org.isoron.uhabits.core.preferences.Preferences import org.isoron.uhabits.core.ui.ThemeSwitcher import org.isoron.uhabits.core.ui.screens.habits.list.ListHabitsBehavior +import org.isoron.uhabits.core.ui.screens.habits.list.ListHabitsMenuBehavior +import org.isoron.uhabits.core.ui.screens.habits.list.ListHabitsSelectionMenuBehavior @ActivityScope -@Component( - modules = [ActivityContextModule::class, HabitsActivityModule::class, ListHabitsModule::class, HabitModule::class], - dependencies = [HabitsApplicationComponent::class] -) -interface HabitsActivityComponent { - val colorPickerDialogFactory: ColorPickerDialogFactory - val habitCardListAdapter: HabitCardListAdapter - val listHabitsBehavior: ListHabitsBehavior - val listHabitsMenu: ListHabitsMenu - val listHabitsRootView: ListHabitsRootView - val listHabitsScreen: ListHabitsScreen - val listHabitsSelectionMenu: ListHabitsSelectionMenu - val themeSwitcher: ThemeSwitcher +@Component +abstract class HabitsActivityComponent( + @Component val parent: HabitsApplicationComponent, + @get:Provides @get:ActivityContext + val activityContext: Context +) { + abstract val colorPickerDialogFactory: ColorPickerDialogFactory + abstract val habitCardListAdapter: HabitCardListAdapter + abstract val listHabitsBehavior: ListHabitsBehavior + abstract val listHabitsMenu: ListHabitsMenu + abstract val listHabitsRootView: ListHabitsRootView + abstract val listHabitsScreen: ListHabitsScreen + abstract val listHabitsSelectionMenu: ListHabitsSelectionMenu + abstract val themeSwitcher: ThemeSwitcher + + @ActivityScope + @Provides + open fun themeSwitcher( + @ActivityContext context: Context, + prefs: Preferences + ): ThemeSwitcher = AndroidThemeSwitcher(context, prefs) + + open val HabitCardListAdapter.bindAdapter: ListHabitsMenuBehavior.Adapter + @Provides get() = this + + open val ListHabitsModule.bindBugReporter: ListHabitsBehavior.BugReporter + @Provides get() = this + + open val ListHabitsScreen.bindMenuScreen: ListHabitsMenuBehavior.Screen + @Provides get() = this + + open val ListHabitsScreen.bindScreen: ListHabitsBehavior.Screen + @Provides get() = this + + open val HabitCardListAdapter.bindSelMenuAdapter: ListHabitsSelectionMenuBehavior.Adapter + @Provides get() = this + + open val ListHabitsScreen.bindSelMenuScreen: ListHabitsSelectionMenuBehavior.Screen + @Provides get() = this + + open val HabitsDirFinder.bindDirFinder: ListHabitsBehavior.DirFinder + @Provides get() = this } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/inject/HabitsActivityModule.kt b/uhabits-android/src/main/java/org/isoron/uhabits/inject/HabitsActivityModule.kt deleted file mode 100644 index 126bf662..00000000 --- a/uhabits-android/src/main/java/org/isoron/uhabits/inject/HabitsActivityModule.kt +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2016-2025 Álinson Santos Xavier - * - * This file is part of Loop Habit Tracker. - * - * Loop Habit Tracker 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. - * - * Loop Habit Tracker 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 org.isoron.uhabits.inject - -import android.content.Context -import dagger.Module -import dagger.Provides -import org.isoron.uhabits.activities.AndroidThemeSwitcher -import org.isoron.uhabits.core.preferences.Preferences -import org.isoron.uhabits.core.ui.ThemeSwitcher - -@Module -class HabitsActivityModule { - - @Provides - @ActivityScope - fun getThemeSwitcher( - @ActivityContext context: Context, - prefs: Preferences - ): ThemeSwitcher { - return AndroidThemeSwitcher(context, prefs) - } -} diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/inject/HabitsApplicationComponent.kt b/uhabits-android/src/main/java/org/isoron/uhabits/inject/HabitsApplicationComponent.kt index 4a0d614c..5c076000 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/inject/HabitsApplicationComponent.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/inject/HabitsApplicationComponent.kt @@ -19,13 +19,18 @@ package org.isoron.uhabits.inject import android.content.Context -import dagger.Component +import me.tatarka.inject.annotations.Component +import me.tatarka.inject.annotations.Provides import org.isoron.uhabits.core.AppScope import org.isoron.uhabits.core.commands.CommandRunner +import org.isoron.uhabits.core.database.Database +import org.isoron.uhabits.core.database.DatabaseOpener import org.isoron.uhabits.core.io.GenericImporter import org.isoron.uhabits.core.io.Logging import org.isoron.uhabits.core.models.HabitList import org.isoron.uhabits.core.models.ModelFactory +import org.isoron.uhabits.core.models.sqlite.SQLModelFactory +import org.isoron.uhabits.core.models.sqlite.SQLiteHabitList import org.isoron.uhabits.core.preferences.Preferences import org.isoron.uhabits.core.preferences.WidgetPreferences import org.isoron.uhabits.core.reminders.ReminderScheduler @@ -33,34 +38,107 @@ import org.isoron.uhabits.core.tasks.TaskRunner import org.isoron.uhabits.core.ui.NotificationTray import org.isoron.uhabits.core.ui.screens.habits.list.HabitCardListCache import org.isoron.uhabits.core.utils.MidnightTimer +import org.isoron.uhabits.database.AndroidDatabase +import org.isoron.uhabits.database.AndroidDatabaseOpener import org.isoron.uhabits.intents.IntentFactory import org.isoron.uhabits.intents.IntentParser +import org.isoron.uhabits.intents.IntentScheduler import org.isoron.uhabits.intents.PendingIntentFactory +import org.isoron.uhabits.io.AndroidLogging +import org.isoron.uhabits.notifications.AndroidNotificationTray +import org.isoron.uhabits.preferences.SharedPreferencesStorage import org.isoron.uhabits.receivers.ReminderController import org.isoron.uhabits.tasks.AndroidTaskRunner +import org.isoron.uhabits.utils.DatabaseUtils import org.isoron.uhabits.widgets.WidgetUpdater +import java.io.File @AppScope -@Component(modules = [AppContextModule::class, HabitsModule::class, AndroidTaskRunner::class]) -interface HabitsApplicationComponent { - val commandRunner: CommandRunner +@Component +abstract class HabitsApplicationComponent( + @get:Provides @get:AppContext + val appContext: Context, + @get:Provides val dbFile: File +) { + abstract val commandRunner: CommandRunner @get:AppContext - val context: Context - val genericImporter: GenericImporter - val habitCardListCache: HabitCardListCache - val habitList: HabitList - val intentFactory: IntentFactory - val intentParser: IntentParser - val logging: Logging - val midnightTimer: MidnightTimer - val modelFactory: ModelFactory - val notificationTray: NotificationTray - val pendingIntentFactory: PendingIntentFactory - val preferences: Preferences - val reminderScheduler: ReminderScheduler - val reminderController: ReminderController - val taskRunner: TaskRunner - val widgetPreferences: WidgetPreferences - val widgetUpdater: WidgetUpdater + abstract val context: Context + abstract val genericImporter: GenericImporter + abstract val habitCardListCache: HabitCardListCache + abstract val habitList: HabitList + abstract val intentFactory: IntentFactory + abstract val intentParser: IntentParser + abstract val logging: Logging + abstract val midnightTimer: MidnightTimer + abstract val modelFactory: ModelFactory + abstract val notificationTray: NotificationTray + abstract val pendingIntentFactory: PendingIntentFactory + abstract val preferences: Preferences + abstract val reminderScheduler: ReminderScheduler + abstract val reminderController: ReminderController + abstract val taskRunner: TaskRunner + abstract val widgetPreferences: WidgetPreferences + abstract val widgetUpdater: WidgetUpdater + + val db: Database + get() = providedDb + + private val providedDb: Database by lazy { + AndroidDatabase(DatabaseUtils.openDatabase(), dbFile) + } + + @AppScope + @Provides + open fun database(): Database = providedDb + + @AppScope + @Provides + open fun preferences(storage: SharedPreferencesStorage): Preferences = + Preferences(storage) + + @AppScope + @Provides + open fun reminderScheduler( + sys: IntentScheduler, + commandRunner: CommandRunner, + habitList: HabitList, + widgetPreferences: WidgetPreferences + ): ReminderScheduler = + ReminderScheduler(commandRunner, habitList, sys, widgetPreferences) + + @AppScope + @Provides + open fun notificationTray( + taskRunner: TaskRunner, + commandRunner: CommandRunner, + preferences: Preferences, + screen: AndroidNotificationTray + ): NotificationTray = + NotificationTray(taskRunner, commandRunner, preferences, screen) + + @AppScope + @Provides + open fun widgetPreferences(storage: SharedPreferencesStorage): WidgetPreferences = + WidgetPreferences(storage) + + @AppScope + @Provides + open fun modelFactory(): ModelFactory = SQLModelFactory(providedDb) + + @AppScope + @Provides + open fun habitList(list: SQLiteHabitList): HabitList = list + + @AppScope + @Provides + open fun databaseOpener(opener: AndroidDatabaseOpener): DatabaseOpener = opener + + @AppScope + @Provides + open fun logging(): Logging = AndroidLogging() + + @AppScope + @Provides + open fun taskRunner(): TaskRunner = AndroidTaskRunner() } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/inject/HabitsModule.kt b/uhabits-android/src/main/java/org/isoron/uhabits/inject/HabitsModule.kt deleted file mode 100644 index 5a2b32f9..00000000 --- a/uhabits-android/src/main/java/org/isoron/uhabits/inject/HabitsModule.kt +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (C) 2016-2025 Álinson Santos Xavier - * - * This file is part of Loop Habit Tracker. - * - * Loop Habit Tracker 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. - * - * Loop Habit Tracker 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 org.isoron.uhabits.inject - -import dagger.Module -import dagger.Provides -import org.isoron.uhabits.core.AppScope -import org.isoron.uhabits.core.commands.CommandRunner -import org.isoron.uhabits.core.database.Database -import org.isoron.uhabits.core.database.DatabaseOpener -import org.isoron.uhabits.core.io.Logging -import org.isoron.uhabits.core.models.HabitList -import org.isoron.uhabits.core.models.ModelFactory -import org.isoron.uhabits.core.models.sqlite.SQLModelFactory -import org.isoron.uhabits.core.models.sqlite.SQLiteHabitList -import org.isoron.uhabits.core.preferences.Preferences -import org.isoron.uhabits.core.preferences.WidgetPreferences -import org.isoron.uhabits.core.reminders.ReminderScheduler -import org.isoron.uhabits.core.tasks.TaskRunner -import org.isoron.uhabits.core.ui.NotificationTray -import org.isoron.uhabits.database.AndroidDatabase -import org.isoron.uhabits.database.AndroidDatabaseOpener -import org.isoron.uhabits.intents.IntentScheduler -import org.isoron.uhabits.io.AndroidLogging -import org.isoron.uhabits.notifications.AndroidNotificationTray -import org.isoron.uhabits.preferences.SharedPreferencesStorage -import org.isoron.uhabits.utils.DatabaseUtils -import java.io.File - -@Module -class HabitsModule(dbFile: File) { - - val db: Database = AndroidDatabase(DatabaseUtils.openDatabase(), dbFile) - - @Provides - @AppScope - fun getPreferences(storage: SharedPreferencesStorage): Preferences { - return Preferences(storage) - } - - @Provides - @AppScope - fun getReminderScheduler( - sys: IntentScheduler, - commandRunner: CommandRunner, - habitList: HabitList, - widgetPreferences: WidgetPreferences - ): ReminderScheduler { - return ReminderScheduler(commandRunner, habitList, sys, widgetPreferences) - } - - @Provides - @AppScope - fun getTray( - taskRunner: TaskRunner, - commandRunner: CommandRunner, - preferences: Preferences, - screen: AndroidNotificationTray - ): NotificationTray { - return NotificationTray(taskRunner, commandRunner, preferences, screen) - } - - @Provides - @AppScope - fun getWidgetPreferences( - storage: SharedPreferencesStorage - ): WidgetPreferences { - return WidgetPreferences(storage) - } - - @Provides - @AppScope - fun getModelFactory(): ModelFactory { - return SQLModelFactory(db) - } - - @Provides - @AppScope - fun getHabitList(list: SQLiteHabitList): HabitList { - return list - } - - @Provides - @AppScope - fun getDatabaseOpener(opener: AndroidDatabaseOpener): DatabaseOpener { - return opener - } - - @Provides - @AppScope - fun getLogging(): Logging { - return AndroidLogging() - } - - @Provides - @AppScope - fun getDatabase(): Database { - return db - } -} diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentFactory.kt b/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentFactory.kt index 1edbd203..3d5d973f 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentFactory.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentFactory.kt @@ -22,6 +22,7 @@ package org.isoron.uhabits.intents import android.content.Context import android.content.Intent import android.net.Uri +import me.tatarka.inject.annotations.Inject import org.isoron.uhabits.R import org.isoron.uhabits.activities.about.AboutActivity import org.isoron.uhabits.activities.habits.edit.EditHabitActivity @@ -29,10 +30,9 @@ import org.isoron.uhabits.activities.habits.show.ShowHabitActivity import org.isoron.uhabits.activities.intro.IntroActivity import org.isoron.uhabits.activities.settings.SettingsActivity import org.isoron.uhabits.core.models.Habit -import javax.inject.Inject -class IntentFactory -@Inject constructor() { +@Inject +class IntentFactory() { fun helpTranslate(context: Context) = buildViewIntent(context.getString(R.string.translateURL)) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentParser.kt b/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentParser.kt index dc3fe5a8..2d6c79a3 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentParser.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentParser.kt @@ -22,16 +22,16 @@ package org.isoron.uhabits.intents import android.content.ContentUris.parseId import android.content.Intent import android.net.Uri +import me.tatarka.inject.annotations.Inject import org.isoron.platform.time.LocalDate import org.isoron.platform.time.getToday import org.isoron.uhabits.core.AppScope import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.core.models.HabitList -import javax.inject.Inject +@Inject @AppScope -class IntentParser -@Inject constructor( +class IntentParser( private val habits: HabitList ) { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentScheduler.kt b/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentScheduler.kt index 8808b3e9..98b329a4 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentScheduler.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentScheduler.kt @@ -27,6 +27,7 @@ import android.content.Context import android.content.Context.ALARM_SERVICE import android.os.Build import android.util.Log +import me.tatarka.inject.annotations.Inject import org.isoron.uhabits.core.AppScope import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.core.reminders.ReminderScheduler.SchedulerResult @@ -34,12 +35,11 @@ import org.isoron.uhabits.core.reminders.ReminderScheduler.SystemScheduler import org.isoron.uhabits.core.utils.DateFormats import org.isoron.uhabits.inject.AppContext import java.util.Date -import javax.inject.Inject import kotlin.math.min +@Inject @AppScope -class IntentScheduler -@Inject constructor( +class IntentScheduler( @AppContext context: Context, private val pendingIntents: PendingIntentFactory ) : SystemScheduler { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.kt b/uhabits-android/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.kt index d9fe11b4..e3b9b80c 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.kt @@ -29,6 +29,7 @@ import android.content.Context import android.content.Intent import android.net.Uri import android.os.Build +import me.tatarka.inject.annotations.Inject import org.isoron.platform.time.LocalDate import org.isoron.uhabits.activities.habits.list.ListHabitsActivity import org.isoron.uhabits.activities.habits.show.ShowHabitActivity @@ -37,11 +38,10 @@ import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.inject.AppContext import org.isoron.uhabits.receivers.ReminderReceiver import org.isoron.uhabits.receivers.WidgetReceiver -import javax.inject.Inject +@Inject @AppScope -class PendingIntentFactory -@Inject constructor( +class PendingIntentFactory( @AppContext private val context: Context, private val intentFactory: IntentFactory ) { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/notifications/AndroidNotificationTray.kt b/uhabits-android/src/main/java/org/isoron/uhabits/notifications/AndroidNotificationTray.kt index 6a53a25e..c677979f 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/notifications/AndroidNotificationTray.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/notifications/AndroidNotificationTray.kt @@ -32,6 +32,7 @@ import androidx.core.app.NotificationCompat.Action import androidx.core.app.NotificationCompat.Builder import androidx.core.app.NotificationCompat.WearableExtender import androidx.core.app.NotificationManagerCompat +import me.tatarka.inject.annotations.Inject import org.isoron.platform.time.LocalDate import org.isoron.uhabits.R import org.isoron.uhabits.core.AppScope @@ -40,11 +41,10 @@ import org.isoron.uhabits.core.preferences.Preferences import org.isoron.uhabits.core.ui.NotificationTray import org.isoron.uhabits.inject.AppContext import org.isoron.uhabits.intents.PendingIntentFactory -import javax.inject.Inject +@Inject @AppScope -class AndroidNotificationTray -@Inject constructor( +class AndroidNotificationTray( @AppContext private val context: Context, private val pendingIntents: PendingIntentFactory, private val preferences: Preferences, diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/notifications/RingtoneManager.kt b/uhabits-android/src/main/java/org/isoron/uhabits/notifications/RingtoneManager.kt index a491f632..676764c6 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/notifications/RingtoneManager.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/notifications/RingtoneManager.kt @@ -27,14 +27,14 @@ import android.media.RingtoneManager.getRingtone import android.net.Uri import android.preference.PreferenceManager import android.provider.Settings +import me.tatarka.inject.annotations.Inject import org.isoron.uhabits.R import org.isoron.uhabits.core.AppScope import org.isoron.uhabits.inject.AppContext -import javax.inject.Inject +@Inject @AppScope -class RingtoneManager -@Inject constructor(@AppContext private val context: Context) { +class RingtoneManager(@AppContext private val context: Context) { val prefs: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/preferences/SharedPreferencesStorage.kt b/uhabits-android/src/main/java/org/isoron/uhabits/preferences/SharedPreferencesStorage.kt index 036d3385..632ca3f7 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/preferences/SharedPreferencesStorage.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/preferences/SharedPreferencesStorage.kt @@ -22,15 +22,15 @@ package org.isoron.uhabits.preferences import android.content.Context import android.content.SharedPreferences import androidx.preference.PreferenceManager +import me.tatarka.inject.annotations.Inject import org.isoron.uhabits.R import org.isoron.uhabits.core.AppScope import org.isoron.uhabits.core.preferences.Preferences import org.isoron.uhabits.inject.AppContext -import javax.inject.Inject +@Inject @AppScope -class SharedPreferencesStorage -@Inject constructor( +class SharedPreferencesStorage( @AppContext context: Context ) : SharedPreferences.OnSharedPreferenceChangeListener, Preferences.Storage { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReceiverScope.kt b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReceiverScope.kt index 3f908cae..a0bebf4f 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReceiverScope.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReceiverScope.kt @@ -18,7 +18,7 @@ */ package org.isoron.uhabits.receivers -import javax.inject.Scope +import me.tatarka.inject.annotations.Scope @Scope annotation class ReceiverScope diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderController.kt b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderController.kt index 3acc7261..9485d0e9 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderController.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderController.kt @@ -21,6 +21,7 @@ package org.isoron.uhabits.receivers import android.content.Context import android.content.Intent import android.net.Uri +import me.tatarka.inject.annotations.Inject import org.isoron.platform.time.LocalDate import org.isoron.uhabits.core.AppScope import org.isoron.uhabits.core.models.Habit @@ -29,10 +30,10 @@ import org.isoron.uhabits.core.reminders.ReminderScheduler import org.isoron.uhabits.core.ui.NotificationTray import org.isoron.uhabits.core.utils.DateUtils import org.isoron.uhabits.notifications.SnoozeDelayPickerActivity -import javax.inject.Inject +@Inject @AppScope -class ReminderController @Inject constructor( +class ReminderController( private val reminderScheduler: ReminderScheduler, private val notificationTray: NotificationTray, private val preferences: Preferences diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.kt b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.kt index da0dd6c3..71757a14 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.kt @@ -22,7 +22,7 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.util.Log -import dagger.Component +import me.tatarka.inject.annotations.Component import org.isoron.platform.time.computeToday import org.isoron.platform.time.setToday import org.isoron.uhabits.HabitsApplication @@ -30,6 +30,14 @@ import org.isoron.uhabits.core.ui.widgets.WidgetBehavior import org.isoron.uhabits.inject.HabitsApplicationComponent import org.isoron.uhabits.intents.IntentParser.CheckmarkIntentData +@ReceiverScope +@Component +internal abstract class WidgetComponent( + @Component val parent: HabitsApplicationComponent +) { + abstract val widgetController: WidgetBehavior +} + /** * The Android BroadcastReceiver for Loop Habit Tracker. * @@ -39,10 +47,7 @@ import org.isoron.uhabits.intents.IntentParser.CheckmarkIntentData class WidgetReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val app = context.applicationContext as HabitsApplication - val component = DaggerWidgetReceiver_WidgetComponent - .builder() - .habitsApplicationComponent(app.component) - .build() + val component = WidgetComponent::class.create(app.component) val parser = app.component.intentParser val controller = component.widgetController val prefs = app.component.preferences @@ -108,12 +113,6 @@ class WidgetReceiver : BroadcastReceiver() { } } - @ReceiverScope - @Component(dependencies = [HabitsApplicationComponent::class]) - internal interface WidgetComponent { - val widgetController: WidgetBehavior - } - companion object { const val ACTION_ADD_REPETITION = "org.isoron.uhabits.ACTION_ADD_REPETITION" const val ACTION_DISMISS_REMINDER = "org.isoron.uhabits.ACTION_DISMISS_REMINDER" diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/tasks/AndroidTaskRunner.kt b/uhabits-android/src/main/java/org/isoron/uhabits/tasks/AndroidTaskRunner.kt index f2e9b294..4d3b2b9d 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/tasks/AndroidTaskRunner.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/tasks/AndroidTaskRunner.kt @@ -19,16 +19,11 @@ package org.isoron.uhabits.tasks import android.os.AsyncTask -import dagger.Module -import dagger.Provides -import org.isoron.uhabits.core.AppScope import org.isoron.uhabits.core.tasks.Task import org.isoron.uhabits.core.tasks.TaskRunner import java.util.HashMap import java.util.LinkedList -// TODO: @Module not needed? -@Module class AndroidTaskRunner : TaskRunner { private val activeTasks: LinkedList = LinkedList() private val taskToAsyncTask: HashMap = HashMap() @@ -90,14 +85,4 @@ class AndroidTaskRunner : TaskRunner { values[0]?.let { task.onProgressUpdate(it) } } } - - @Module - companion object { - @JvmStatic - @Provides - @AppScope - fun provideTaskRunner(): TaskRunner { - return AndroidTaskRunner() - } - } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ExportDBTaskFactory.kt b/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ExportDBTaskFactory.kt index 0148f656..ff5a055e 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ExportDBTaskFactory.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ExportDBTaskFactory.kt @@ -20,12 +20,12 @@ package org.isoron.uhabits.tasks import android.content.Context +import me.tatarka.inject.annotations.Inject import org.isoron.uhabits.AndroidDirFinder import org.isoron.uhabits.inject.AppContext -import javax.inject.Inject -class ExportDBTaskFactory -@Inject constructor( +@Inject +class ExportDBTaskFactory( @AppContext private val context: Context, private val system: AndroidDirFinder ) { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ImportDataTaskFactory.kt b/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ImportDataTaskFactory.kt index 88fa3a6a..66638e8e 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ImportDataTaskFactory.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ImportDataTaskFactory.kt @@ -19,13 +19,13 @@ package org.isoron.uhabits.tasks +import me.tatarka.inject.annotations.Inject import org.isoron.uhabits.core.io.GenericImporter import org.isoron.uhabits.core.models.ModelFactory import java.io.File -import javax.inject.Inject -class ImportDataTaskFactory -@Inject constructor( +@Inject +class ImportDataTaskFactory( private val importer: GenericImporter, private val modelFactory: ModelFactory ) { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/widgets/WidgetUpdater.kt b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/WidgetUpdater.kt index d875156a..26208c6b 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/widgets/WidgetUpdater.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/WidgetUpdater.kt @@ -23,6 +23,7 @@ import android.appwidget.AppWidgetManager import android.content.ComponentName import android.content.Context import android.content.Intent +import me.tatarka.inject.annotations.Inject import org.isoron.uhabits.core.commands.Command import org.isoron.uhabits.core.commands.CommandRunner import org.isoron.uhabits.core.commands.CreateRepetitionCommand @@ -32,14 +33,13 @@ import org.isoron.uhabits.core.tasks.TaskRunner import org.isoron.uhabits.core.utils.DateUtils import org.isoron.uhabits.inject.AppContext import org.isoron.uhabits.intents.IntentScheduler -import javax.inject.Inject /** * A WidgetUpdater listens to the commands being executed by the application and * updates the home-screen widgets accordingly. */ -class WidgetUpdater -@Inject constructor( +@Inject +class WidgetUpdater( @AppContext private val context: Context, private val commandRunner: CommandRunner, private val taskRunner: TaskRunner, diff --git a/uhabits-core/build.gradle.kts b/uhabits-core/build.gradle.kts index d9f710c3..371efbe0 100644 --- a/uhabits-core/build.gradle.kts +++ b/uhabits-core/build.gradle.kts @@ -44,7 +44,7 @@ kotlin { val jvmMain by getting { dependencies { implementation(kotlin("stdlib-jdk8")) - compileOnly(libs.dagger) + compileOnly(libs.kotlin.inject.runtime) implementation(libs.guava) implementation(libs.kotlinx.coroutines.core.jvm) implementation(libs.annotation) diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/AppScope.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/AppScope.kt index 365dd442..e3c271e3 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/AppScope.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/AppScope.kt @@ -18,7 +18,7 @@ */ package org.isoron.uhabits.core -import javax.inject.Scope +import me.tatarka.inject.annotations.Scope @Scope annotation class AppScope diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/commands/CommandRunner.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/commands/CommandRunner.kt index 44736ef3..ed8cb8f2 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/commands/CommandRunner.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/commands/CommandRunner.kt @@ -18,15 +18,15 @@ */ package org.isoron.uhabits.core.commands +import me.tatarka.inject.annotations.Inject import org.isoron.uhabits.core.AppScope import org.isoron.uhabits.core.tasks.Task import org.isoron.uhabits.core.tasks.TaskRunner import java.util.LinkedList -import javax.inject.Inject @AppScope -open class CommandRunner -@Inject constructor( +@Inject +open class CommandRunner( private val taskRunner: TaskRunner ) { private val listeners: LinkedList = LinkedList() diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/GenericImporter.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/GenericImporter.kt index 3dd099c3..e7aad2c1 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/GenericImporter.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/GenericImporter.kt @@ -18,15 +18,15 @@ */ package org.isoron.uhabits.core.io +import me.tatarka.inject.annotations.Inject import java.io.File -import javax.inject.Inject /** * A GenericImporter decides which implementation of AbstractImporter is able to * handle a given file and delegates to it the task of importing the data. */ -class GenericImporter -@Inject constructor( +@Inject +class GenericImporter( loopDBImporter: LoopDBImporter, rewireDBImporter: RewireDBImporter, tickmateDBImporter: TickmateDBImporter, diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/HabitBullCSVImporter.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/HabitBullCSVImporter.kt index 8782c221..687014fe 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/HabitBullCSVImporter.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/HabitBullCSVImporter.kt @@ -19,6 +19,7 @@ package org.isoron.uhabits.core.io import com.opencsv.CSVReader +import me.tatarka.inject.annotations.Inject import org.isoron.platform.time.LocalDate import org.isoron.uhabits.core.models.Entry import org.isoron.uhabits.core.models.Frequency @@ -29,13 +30,12 @@ import org.isoron.uhabits.core.models.ModelFactory import java.io.BufferedReader import java.io.File import java.io.FileReader -import javax.inject.Inject /** * Class that imports data from HabitBull CSV files. */ -class HabitBullCSVImporter -@Inject constructor( +@Inject +class HabitBullCSVImporter( private val habitList: HabitList, private val modelFactory: ModelFactory, logging: Logging diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/LoopDBImporter.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/LoopDBImporter.kt index f43842f3..8e1a5311 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/LoopDBImporter.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/LoopDBImporter.kt @@ -18,6 +18,7 @@ */ package org.isoron.uhabits.core.io +import me.tatarka.inject.annotations.Inject import org.isoron.platform.time.LocalDate import org.isoron.uhabits.core.AppScope import org.isoron.uhabits.core.DATABASE_VERSION @@ -34,13 +35,12 @@ import org.isoron.uhabits.core.models.sqlite.records.EntryRecord import org.isoron.uhabits.core.models.sqlite.records.HabitRecord import org.isoron.uhabits.core.utils.isSQLite3File import java.io.File -import javax.inject.Inject /** * Class that imports data from database files exported by Loop Habit Tracker. */ -class LoopDBImporter -@Inject constructor( +@Inject +class LoopDBImporter( @AppScope val habitList: HabitList, @AppScope val modelFactory: ModelFactory, @AppScope val opener: DatabaseOpener, diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/RewireDBImporter.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/RewireDBImporter.kt index f0e420bd..c04b5044 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/RewireDBImporter.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/RewireDBImporter.kt @@ -18,6 +18,7 @@ */ package org.isoron.uhabits.core.io +import me.tatarka.inject.annotations.Inject import org.isoron.platform.time.LocalDate import org.isoron.uhabits.core.database.Cursor import org.isoron.uhabits.core.database.Database @@ -31,13 +32,12 @@ import org.isoron.uhabits.core.models.Reminder import org.isoron.uhabits.core.models.WeekdayList import org.isoron.uhabits.core.utils.isSQLite3File import java.io.File -import javax.inject.Inject /** * Class that imports database files exported by Rewire. */ -class RewireDBImporter -@Inject constructor( +@Inject +class RewireDBImporter( private val habitList: HabitList, private val modelFactory: ModelFactory, private val opener: DatabaseOpener diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/TickmateDBImporter.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/TickmateDBImporter.kt index a8fa49b1..100c63a1 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/TickmateDBImporter.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/TickmateDBImporter.kt @@ -18,6 +18,7 @@ */ package org.isoron.uhabits.core.io +import me.tatarka.inject.annotations.Inject import org.isoron.platform.time.LocalDate import org.isoron.uhabits.core.database.Cursor import org.isoron.uhabits.core.database.Database @@ -29,12 +30,12 @@ import org.isoron.uhabits.core.models.HabitList import org.isoron.uhabits.core.models.ModelFactory import org.isoron.uhabits.core.utils.isSQLite3File import java.io.File -import javax.inject.Inject /** * Class that imports data from database files exported by Tickmate. */ -class TickmateDBImporter @Inject constructor( +@Inject +class TickmateDBImporter( private val habitList: HabitList, private val modelFactory: ModelFactory, private val opener: DatabaseOpener diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/SQLModelFactory.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/SQLModelFactory.kt index 6a4e6dc8..ff7ab863 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/SQLModelFactory.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/SQLModelFactory.kt @@ -18,6 +18,7 @@ */ package org.isoron.uhabits.core.models.sqlite +import me.tatarka.inject.annotations.Inject import org.isoron.uhabits.core.database.Database import org.isoron.uhabits.core.database.Repository import org.isoron.uhabits.core.models.EntryList @@ -26,13 +27,12 @@ import org.isoron.uhabits.core.models.ScoreList import org.isoron.uhabits.core.models.StreakList import org.isoron.uhabits.core.models.sqlite.records.EntryRecord import org.isoron.uhabits.core.models.sqlite.records.HabitRecord -import javax.inject.Inject /** * Factory that provides models backed by an SQLite database. */ -class SQLModelFactory -@Inject constructor( +@Inject +class SQLModelFactory( val database: Database ) : ModelFactory { override fun buildOriginalEntries() = SQLiteEntryList(database) diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitList.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitList.kt index cb6f76ca..ba544a89 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitList.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitList.kt @@ -18,6 +18,7 @@ */ package org.isoron.uhabits.core.models.sqlite +import me.tatarka.inject.annotations.Inject import org.isoron.uhabits.core.database.Repository import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.core.models.HabitList @@ -25,12 +26,12 @@ import org.isoron.uhabits.core.models.HabitMatcher import org.isoron.uhabits.core.models.ModelFactory import org.isoron.uhabits.core.models.memory.MemoryHabitList import org.isoron.uhabits.core.models.sqlite.records.HabitRecord -import javax.inject.Inject /** * Implementation of a [HabitList] that is backed by SQLite. */ -class SQLiteHabitList @Inject constructor(private val modelFactory: ModelFactory) : HabitList() { +@Inject +class SQLiteHabitList(private val modelFactory: ModelFactory) : HabitList() { private val repository: Repository = modelFactory.buildHabitListRepository() private val list: MemoryHabitList = MemoryHabitList() private var loaded = false diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/preferences/WidgetPreferences.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/preferences/WidgetPreferences.kt index 32e80365..282c315a 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/preferences/WidgetPreferences.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/preferences/WidgetPreferences.kt @@ -18,11 +18,12 @@ */ package org.isoron.uhabits.core.preferences +import me.tatarka.inject.annotations.Inject import org.isoron.uhabits.core.AppScope -import javax.inject.Inject @AppScope -class WidgetPreferences @Inject constructor(private val storage: Preferences.Storage) { +@Inject +class WidgetPreferences(private val storage: Preferences.Storage) { fun addWidget(widgetId: Int, habitIds: LongArray) { storage.putLongArray(getHabitIdKey(widgetId), habitIds) } diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/reminders/ReminderScheduler.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/reminders/ReminderScheduler.kt index e60d60ea..fcc76c27 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/reminders/ReminderScheduler.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/reminders/ReminderScheduler.kt @@ -18,6 +18,7 @@ */ package org.isoron.uhabits.core.reminders +import me.tatarka.inject.annotations.Inject import org.isoron.uhabits.core.AppScope import org.isoron.uhabits.core.commands.ChangeHabitColorCommand import org.isoron.uhabits.core.commands.Command @@ -30,10 +31,10 @@ import org.isoron.uhabits.core.preferences.WidgetPreferences import org.isoron.uhabits.core.utils.DateUtils import java.util.Locale import java.util.Objects -import javax.inject.Inject @AppScope -class ReminderScheduler @Inject constructor( +@Inject +class ReminderScheduler( private val commandRunner: CommandRunner, private val habitList: HabitList, private val sys: SystemScheduler, diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/tasks/ExportCSVTaskFactory.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/tasks/ExportCSVTaskFactory.kt index fa0b5f1b..9ab87469 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/tasks/ExportCSVTaskFactory.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/tasks/ExportCSVTaskFactory.kt @@ -19,13 +19,13 @@ package org.isoron.uhabits.core.tasks +import me.tatarka.inject.annotations.Inject import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.core.models.HabitList import java.io.File -import javax.inject.Inject -class ExportCSVTaskFactory -@Inject constructor( +@Inject +class ExportCSVTaskFactory( val habitList: HabitList ) { fun create( diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/NotificationTray.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/NotificationTray.kt index 462b3492..0287b807 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/NotificationTray.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/NotificationTray.kt @@ -18,6 +18,7 @@ */ package org.isoron.uhabits.core.ui +import me.tatarka.inject.annotations.Inject import org.isoron.platform.time.LocalDate import org.isoron.uhabits.core.AppScope import org.isoron.uhabits.core.commands.Command @@ -32,10 +33,10 @@ import org.isoron.uhabits.core.tasks.TaskRunner import java.util.HashMap import java.util.Locale import java.util.Objects -import javax.inject.Inject @AppScope -class NotificationTray @Inject constructor( +@Inject +class NotificationTray( private val taskRunner: TaskRunner, private val commandRunner: CommandRunner, private val preferences: Preferences, diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/HabitCardListCache.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/HabitCardListCache.kt index ca72994d..43272e95 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/HabitCardListCache.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/HabitCardListCache.kt @@ -18,6 +18,7 @@ */ package org.isoron.uhabits.core.ui.screens.habits.list +import me.tatarka.inject.annotations.Inject import org.apache.commons.lang3.ArrayUtils import org.isoron.platform.time.getToday import org.isoron.uhabits.core.AppScope @@ -36,7 +37,6 @@ import java.util.Arrays import java.util.HashMap import java.util.LinkedList import java.util.TreeSet -import javax.inject.Inject /** * A HabitCardListCache fetches and keeps a cache of all the data necessary to @@ -52,7 +52,8 @@ import javax.inject.Inject * activities. */ @AppScope -class HabitCardListCache @Inject constructor( +@Inject +class HabitCardListCache( private val allHabits: HabitList, private val commandRunner: CommandRunner, taskRunner: TaskRunner, diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/HintListFactory.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/HintListFactory.kt index ebbd3b8a..5c664297 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/HintListFactory.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/HintListFactory.kt @@ -19,11 +19,11 @@ package org.isoron.uhabits.core.ui.screens.habits.list +import me.tatarka.inject.annotations.Inject import org.isoron.uhabits.core.preferences.Preferences -import javax.inject.Inject -class HintListFactory -@Inject constructor( +@Inject +class HintListFactory( val preferences: Preferences ) { fun create(hints: Array) = HintList(preferences, hints) diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt index 1b4507ca..74749d31 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt @@ -18,6 +18,7 @@ */ package org.isoron.uhabits.core.ui.screens.habits.list +import me.tatarka.inject.annotations.Inject import org.isoron.platform.time.LocalDate import org.isoron.platform.time.getToday import org.isoron.uhabits.core.commands.CommandRunner @@ -35,10 +36,10 @@ import org.isoron.uhabits.core.tasks.TaskRunner import java.io.File import java.io.IOException import java.util.LinkedList -import javax.inject.Inject import kotlin.math.roundToInt -open class ListHabitsBehavior @Inject constructor( +@Inject +open class ListHabitsBehavior( private val habitList: HabitList, private val dirFinder: DirFinder, private val taskRunner: TaskRunner, diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.kt index 42d5dea1..ca36f80b 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.kt @@ -18,13 +18,14 @@ */ package org.isoron.uhabits.core.ui.screens.habits.list +import me.tatarka.inject.annotations.Inject import org.isoron.uhabits.core.models.HabitList import org.isoron.uhabits.core.models.HabitMatcher import org.isoron.uhabits.core.preferences.Preferences import org.isoron.uhabits.core.ui.ThemeSwitcher -import javax.inject.Inject -class ListHabitsMenuBehavior @Inject constructor( +@Inject +class ListHabitsMenuBehavior( private val screen: Screen, private val adapter: Adapter, private val preferences: Preferences, diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehavior.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehavior.kt index 5290205a..a131d88c 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehavior.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehavior.kt @@ -18,6 +18,7 @@ */ package org.isoron.uhabits.core.ui.screens.habits.list +import me.tatarka.inject.annotations.Inject import org.isoron.uhabits.core.commands.ArchiveHabitsCommand import org.isoron.uhabits.core.commands.ChangeHabitColorCommand import org.isoron.uhabits.core.commands.CommandRunner @@ -28,9 +29,9 @@ import org.isoron.uhabits.core.models.HabitList import org.isoron.uhabits.core.models.PaletteColor import org.isoron.uhabits.core.ui.callbacks.OnColorPickedCallback import org.isoron.uhabits.core.ui.callbacks.OnConfirmedCallback -import javax.inject.Inject -class ListHabitsSelectionMenuBehavior @Inject constructor( +@Inject +class ListHabitsSelectionMenuBehavior( private val habitList: HabitList, private val screen: Screen, private val adapter: Adapter, diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/widgets/WidgetBehavior.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/widgets/WidgetBehavior.kt index 868769cd..bc785a1c 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/widgets/WidgetBehavior.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/widgets/WidgetBehavior.kt @@ -18,6 +18,7 @@ */ package org.isoron.uhabits.core.ui.widgets +import me.tatarka.inject.annotations.Inject import org.isoron.platform.time.LocalDate import org.isoron.uhabits.core.commands.CommandRunner import org.isoron.uhabits.core.commands.CreateRepetitionCommand @@ -27,9 +28,9 @@ import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.core.models.HabitList import org.isoron.uhabits.core.preferences.Preferences import org.isoron.uhabits.core.ui.NotificationTray -import javax.inject.Inject -class WidgetBehavior @Inject constructor( +@Inject +class WidgetBehavior( private val habitList: HabitList, private val commandRunner: CommandRunner, private val notificationTray: NotificationTray, diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/MidnightTimer.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/MidnightTimer.kt index 7991bc94..a2096b48 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/MidnightTimer.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/MidnightTimer.kt @@ -18,6 +18,7 @@ */ package org.isoron.uhabits.core.utils +import me.tatarka.inject.annotations.Inject import org.isoron.platform.time.computeToday import org.isoron.platform.time.setToday import org.isoron.uhabits.core.AppScope @@ -27,13 +28,13 @@ import java.util.LinkedList import java.util.concurrent.Executors import java.util.concurrent.ScheduledExecutorService import java.util.concurrent.TimeUnit -import javax.inject.Inject /** * A class that emits events when a new day starts. */ @AppScope -open class MidnightTimer @Inject constructor( +@Inject +open class MidnightTimer( logging: Logging, private val preferences: Preferences ) {