diff --git a/uhabits-android/build.gradle.kts b/uhabits-android/build.gradle.kts index 201ddf7f..d546c3eb 100644 --- a/uhabits-android/build.gradle.kts +++ b/uhabits-android/build.gradle.kts @@ -95,6 +95,8 @@ android { mokkery { defaultMockMode.set(dev.mokkery.MockMode.autofill) + stubs.allowClassInheritance.set(true) + stubs.allowConcreteClassInstantiation.set(true) } dependencies { 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 4d3b2b9d..018c7649 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,6 +19,7 @@ package org.isoron.uhabits.tasks import android.os.AsyncTask +import kotlinx.coroutines.runBlocking import org.isoron.uhabits.core.tasks.Task import org.isoron.uhabits.core.tasks.TaskRunner import java.util.HashMap @@ -58,7 +59,7 @@ class AndroidTaskRunner : TaskRunner { @Deprecated("Deprecated in Java") override fun doInBackground(vararg params: Void?): Void? { if (isCancelled) return null - task.doInBackground() + runBlocking { task.doInBackground() } return null } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.kt b/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.kt index 3804e885..1621b714 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.kt @@ -35,7 +35,7 @@ class ExportDBTask( private val listener: Listener ) : Task { private var filename: String? = null - override fun doInBackground() { + override suspend fun doInBackground() { filename = null filename = try { val prefs = PreferenceManager.getDefaultSharedPreferences(context) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ImportDataTask.kt b/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ImportDataTask.kt index 699ba99b..6a410188 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ImportDataTask.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ImportDataTask.kt @@ -19,7 +19,6 @@ package org.isoron.uhabits.tasks import android.util.Log -import kotlinx.coroutines.runBlocking import org.isoron.platform.io.UserFile import org.isoron.platform.io.begin import org.isoron.platform.io.commit @@ -36,18 +35,16 @@ class ImportDataTask( ) : Task { private var result = 0 private val modelFactory: SQLModelFactory = modelFactory as SQLModelFactory - override fun doInBackground() { + override suspend fun doInBackground() { modelFactory.database.begin() try { - runBlocking { - if (importer.canHandle(file)) { - importer.importHabitsFromFile(file) - result = SUCCESS - modelFactory.database.commit() - } else { - result = NOT_RECOGNIZED - modelFactory.database.commit() - } + if (importer.canHandle(file)) { + importer.importHabitsFromFile(file) + result = SUCCESS + modelFactory.database.commit() + } else { + result = NOT_RECOGNIZED + modelFactory.database.commit() } } catch (e: Exception) { result = FAILED diff --git a/uhabits-core/src/commonMain/kotlin/org/isoron/uhabits/core/commands/CommandRunner.kt b/uhabits-core/src/commonMain/kotlin/org/isoron/uhabits/core/commands/CommandRunner.kt index 84f15e3c..7aa4a588 100644 --- a/uhabits-core/src/commonMain/kotlin/org/isoron/uhabits/core/commands/CommandRunner.kt +++ b/uhabits-core/src/commonMain/kotlin/org/isoron/uhabits/core/commands/CommandRunner.kt @@ -33,7 +33,7 @@ open class CommandRunner( open fun run(command: Command) { taskRunner.execute( object : Task { - override fun doInBackground() { + override suspend fun doInBackground() { command.run() } override fun onPostExecute() { diff --git a/uhabits-core/src/commonMain/kotlin/org/isoron/uhabits/core/models/HabitList.kt b/uhabits-core/src/commonMain/kotlin/org/isoron/uhabits/core/models/HabitList.kt index e56dbf87..58d5b58a 100644 --- a/uhabits-core/src/commonMain/kotlin/org/isoron/uhabits/core/models/HabitList.kt +++ b/uhabits-core/src/commonMain/kotlin/org/isoron/uhabits/core/models/HabitList.kt @@ -197,7 +197,9 @@ abstract class HabitList : Iterable { if (habit.isNumerical) { val s = habit.targetValue.toString() if ('.' !in s) "$s.0" else s - } else "", + } else { + "" + }, habit.isArchived.toString() ) sb.append(csvLine(cols)) diff --git a/uhabits-core/src/commonMain/kotlin/org/isoron/uhabits/core/tasks/ExportCSVTask.kt b/uhabits-core/src/commonMain/kotlin/org/isoron/uhabits/core/tasks/ExportCSVTask.kt index 76c0559c..c04d9c10 100644 --- a/uhabits-core/src/commonMain/kotlin/org/isoron/uhabits/core/tasks/ExportCSVTask.kt +++ b/uhabits-core/src/commonMain/kotlin/org/isoron/uhabits/core/tasks/ExportCSVTask.kt @@ -19,7 +19,6 @@ package org.isoron.uhabits.core.tasks import org.isoron.platform.io.UserFile -import org.isoron.platform.runSuspend import org.isoron.platform.time.getToday import org.isoron.uhabits.core.io.HabitsCSVExporter import org.isoron.uhabits.core.models.Habit @@ -32,13 +31,13 @@ class ExportCSVTask( private val listener: ExportCSVListener ) : Task { private var archiveFilename: String? = null - override fun doInBackground() { + override suspend fun doInBackground() { try { val exporter = HabitsCSVExporter(habitList, selectedHabits) - val bytes = runSuspend { exporter.writeArchive() } + val bytes = exporter.writeArchive() val date = getToday().toCSVString() val zipFile = outputDir.resolve("Loop Habits CSV $date.zip") - runSuspend { zipFile.writeBytes(bytes) } + zipFile.writeBytes(bytes) archiveFilename = zipFile.pathString } catch (e: Exception) { e.printStackTrace() diff --git a/uhabits-core/src/commonMain/kotlin/org/isoron/uhabits/core/tasks/SingleThreadTaskRunner.kt b/uhabits-core/src/commonMain/kotlin/org/isoron/uhabits/core/tasks/SingleThreadTaskRunner.kt index 6b1aed1f..36973188 100644 --- a/uhabits-core/src/commonMain/kotlin/org/isoron/uhabits/core/tasks/SingleThreadTaskRunner.kt +++ b/uhabits-core/src/commonMain/kotlin/org/isoron/uhabits/core/tasks/SingleThreadTaskRunner.kt @@ -18,6 +18,8 @@ */ package org.isoron.uhabits.core.tasks +import org.isoron.platform.runSuspend + class SingleThreadTaskRunner : TaskRunner { override val activeTaskCount: Int get() = 0 @@ -32,7 +34,7 @@ class SingleThreadTaskRunner : TaskRunner { if (!task.isCanceled()) { task.onAttached(this) task.onPreExecute() - task.doInBackground() + runSuspend { task.doInBackground() } task.onPostExecute() } for (l in listeners) l.onTaskFinished(task) diff --git a/uhabits-core/src/commonMain/kotlin/org/isoron/uhabits/core/tasks/Task.kt b/uhabits-core/src/commonMain/kotlin/org/isoron/uhabits/core/tasks/Task.kt index d2b4ba7f..7c802a33 100644 --- a/uhabits-core/src/commonMain/kotlin/org/isoron/uhabits/core/tasks/Task.kt +++ b/uhabits-core/src/commonMain/kotlin/org/isoron/uhabits/core/tasks/Task.kt @@ -21,7 +21,7 @@ package org.isoron.uhabits.core.tasks fun interface Task { fun cancel() {} fun isCanceled() = false - fun doInBackground() + suspend fun doInBackground() fun onAttached(runner: TaskRunner) {} fun onPostExecute() {} fun onPreExecute() {} diff --git a/uhabits-core/src/commonMain/kotlin/org/isoron/uhabits/core/ui/NotificationTray.kt b/uhabits-core/src/commonMain/kotlin/org/isoron/uhabits/core/ui/NotificationTray.kt index afd303b6..2cf63940 100644 --- a/uhabits-core/src/commonMain/kotlin/org/isoron/uhabits/core/ui/NotificationTray.kt +++ b/uhabits-core/src/commonMain/kotlin/org/isoron/uhabits/core/ui/NotificationTray.kt @@ -113,7 +113,7 @@ open class NotificationTray( private val date: LocalDate = data.date private val reminderTime: Long = data.reminderTime - override fun doInBackground() { + override suspend fun doInBackground() { isCompleted = habit.isCompletedToday() } diff --git a/uhabits-core/src/commonMain/kotlin/org/isoron/uhabits/core/ui/screens/habits/list/HabitCardListCache.kt b/uhabits-core/src/commonMain/kotlin/org/isoron/uhabits/core/ui/screens/habits/list/HabitCardListCache.kt index b7ef20a7..e71cb292 100644 --- a/uhabits-core/src/commonMain/kotlin/org/isoron/uhabits/core/ui/screens/habits/list/HabitCardListCache.kt +++ b/uhabits-core/src/commonMain/kotlin/org/isoron/uhabits/core/ui/screens/habits/list/HabitCardListCache.kt @@ -292,7 +292,7 @@ class HabitCardListCache( } @Synchronized - override fun doInBackground() { + override suspend fun doInBackground() { newData.fetchHabits() newData.copyScoresFrom(data) newData.copyCheckmarksFrom(data) diff --git a/uhabits-core/src/commonTest/kotlin/org/isoron/uhabits/core/tasks/SingleThreadTaskRunnerTest.kt b/uhabits-core/src/commonTest/kotlin/org/isoron/uhabits/core/tasks/SingleThreadTaskRunnerTest.kt index 97cb93b3..03757a8c 100644 --- a/uhabits-core/src/commonTest/kotlin/org/isoron/uhabits/core/tasks/SingleThreadTaskRunnerTest.kt +++ b/uhabits-core/src/commonTest/kotlin/org/isoron/uhabits/core/tasks/SingleThreadTaskRunnerTest.kt @@ -19,8 +19,8 @@ package org.isoron.uhabits.core.tasks import dev.mokkery.mock -import dev.mokkery.verify import dev.mokkery.verify.VerifyMode.Companion.order +import dev.mokkery.verifySuspend import org.isoron.uhabits.core.BaseUnitTest import kotlin.test.BeforeTest import kotlin.test.Test @@ -38,7 +38,7 @@ class SingleThreadTaskRunnerTest : BaseUnitTest() { @Test fun test() { runner.execute(task) - verify(order) { + verifySuspend(order) { task.onAttached(runner) task.onPreExecute() task.doInBackground() diff --git a/uhabits-core/src/jsMain/kotlin/org/isoron/platform/io/JsZipReader.kt b/uhabits-core/src/jsMain/kotlin/org/isoron/platform/io/ZipReader.kt similarity index 100% rename from uhabits-core/src/jsMain/kotlin/org/isoron/platform/io/JsZipReader.kt rename to uhabits-core/src/jsMain/kotlin/org/isoron/platform/io/ZipReader.kt diff --git a/uhabits-core/src/jsMain/kotlin/org/isoron/platform/io/JsZipWriter.kt b/uhabits-core/src/jsMain/kotlin/org/isoron/platform/io/ZipWriter.kt similarity index 100% rename from uhabits-core/src/jsMain/kotlin/org/isoron/platform/io/JsZipWriter.kt rename to uhabits-core/src/jsMain/kotlin/org/isoron/platform/io/ZipWriter.kt