Use non-blocking daos in json exporter

pull/1052/head
Alex Baker 5 years ago
parent 5b8256d65e
commit 39077910b7

@ -7,10 +7,11 @@ package org.tasks.jobs
import android.net.Uri import android.net.Uri
import androidx.test.InstrumentationRegistry import androidx.test.InstrumentationRegistry
import com.todoroo.astrid.dao.TaskDaoBlocking import com.todoroo.astrid.dao.TaskDao
import com.todoroo.astrid.data.Task import com.todoroo.astrid.data.Task
import dagger.hilt.android.testing.HiltAndroidTest import dagger.hilt.android.testing.HiltAndroidTest
import dagger.hilt.android.testing.UninstallModules import dagger.hilt.android.testing.UninstallModules
import kotlinx.coroutines.runBlocking
import org.junit.After import org.junit.After
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue import org.junit.Assert.assertTrue
@ -30,12 +31,12 @@ import javax.inject.Inject
@HiltAndroidTest @HiltAndroidTest
class BackupServiceTests : InjectingTestCase() { class BackupServiceTests : InjectingTestCase() {
@Inject lateinit var jsonExporter: TasksJsonExporter @Inject lateinit var jsonExporter: TasksJsonExporter
@Inject lateinit var taskDao: TaskDaoBlocking @Inject lateinit var taskDao: TaskDao
@Inject lateinit var preferences: Preferences @Inject lateinit var preferences: Preferences
private lateinit var temporaryDirectory: File private lateinit var temporaryDirectory: File
@Before @Before
override fun setUp() { override fun setUp() = runBlocking {
super.setUp() super.setUp()
temporaryDirectory = try { temporaryDirectory = try {
File.createTempFile("backup", System.nanoTime().toString()) File.createTempFile("backup", System.nanoTime().toString())
@ -67,7 +68,7 @@ class BackupServiceTests : InjectingTestCase() {
} }
@Test @Test
fun testBackup() { fun testBackup() = runBlocking {
assertEquals(0, temporaryDirectory.list()!!.size) assertEquals(0, temporaryDirectory.list()!!.size)
jsonExporter.exportTasks(InstrumentationRegistry.getTargetContext(), ExportType.EXPORT_TYPE_SERVICE, null) jsonExporter.exportTasks(InstrumentationRegistry.getTargetContext(), ExportType.EXPORT_TYPE_SERVICE, null)

@ -12,7 +12,7 @@ import com.google.gson.Gson
import com.google.gson.GsonBuilder import com.google.gson.GsonBuilder
import com.todoroo.andlib.utility.DialogUtilities import com.todoroo.andlib.utility.DialogUtilities
import com.todoroo.astrid.backup.BackupConstants import com.todoroo.astrid.backup.BackupConstants
import com.todoroo.astrid.dao.TaskDaoBlocking import com.todoroo.astrid.dao.TaskDao
import com.todoroo.astrid.data.Task import com.todoroo.astrid.data.Task
import org.tasks.BuildConfig import org.tasks.BuildConfig
import org.tasks.R import org.tasks.R
@ -32,20 +32,20 @@ import java.util.*
import javax.inject.Inject import javax.inject.Inject
class TasksJsonExporter @Inject constructor( class TasksJsonExporter @Inject constructor(
private val tagDataDao: TagDataDaoBlocking, private val tagDataDao: TagDataDao,
private val taskDao: TaskDaoBlocking, private val taskDao: TaskDao,
private val userActivityDao: UserActivityDaoBlocking, private val userActivityDao: UserActivityDao,
private val preferences: Preferences, private val preferences: Preferences,
private val alarmDao: AlarmDaoBlocking, private val alarmDao: AlarmDao,
private val locationDao: LocationDaoBlocking, private val locationDao: LocationDao,
private val tagDao: TagDaoBlocking, private val tagDao: TagDao,
private val googleTaskDao: GoogleTaskDaoBlocking, private val googleTaskDao: GoogleTaskDao,
private val filterDao: FilterDaoBlocking, private val filterDao: FilterDao,
private val googleTaskListDao: GoogleTaskListDaoBlocking, private val googleTaskListDao: GoogleTaskListDao,
private val taskAttachmentDao: TaskAttachmentDaoBlocking, private val taskAttachmentDao: TaskAttachmentDao,
private val caldavDao: CaldavDaoBlocking, private val caldavDao: CaldavDao,
private val workManager: WorkManager, private val workManager: WorkManager,
private val taskListMetadataDao: TaskListMetadataDaoBlocking) { private val taskListMetadataDao: TaskListMetadataDao) {
private var context: Context? = null private var context: Context? = null
private var exportCount = 0 private var exportCount = 0
@ -59,19 +59,19 @@ class TasksJsonExporter @Inject constructor(
progressDialog?.progress = taskNumber progressDialog?.progress = taskNumber
} }
fun exportTasks(context: Context?, exportType: ExportType, progressDialog: ProgressDialog?) { suspend fun exportTasks(context: Context?, exportType: ExportType, progressDialog: ProgressDialog?) {
this.context = context this.context = context
exportCount = 0 exportCount = 0
this.progressDialog = progressDialog this.progressDialog = progressDialog
if (exportType == ExportType.EXPORT_TYPE_MANUAL) { if (exportType == ExportType.EXPORT_TYPE_MANUAL) {
handler = Handler() handler = Handler()
Thread(Runnable { runBackup(exportType) }).start() runBackup(exportType)
} else { } else {
runBackup(exportType) runBackup(exportType)
} }
} }
private fun runBackup(exportType: ExportType) { private suspend fun runBackup(exportType: ExportType) {
try { try {
val filename = getFileName(exportType) val filename = getFileName(exportType)
val tasks = taskDao.getAll() val tasks = taskDao.getAll()
@ -109,7 +109,7 @@ class TasksJsonExporter @Inject constructor(
} }
@Throws(IOException::class) @Throws(IOException::class)
private fun doTasksExport(os: OutputStream?, tasks: List<Task>) { private suspend fun doTasksExport(os: OutputStream?, tasks: List<Task>) {
val taskBackups: MutableList<TaskBackup> = ArrayList() val taskBackups: MutableList<TaskBackup> = ArrayList()
for (task in tasks) { for (task in tasks) {
setProgress(taskBackups.size, tasks.size) setProgress(taskBackups.size, tasks.size)

@ -1,37 +0,0 @@
package org.tasks.dialogs;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.fragment.app.DialogFragment;
import dagger.hilt.android.AndroidEntryPoint;
import javax.inject.Inject;
import org.tasks.backup.TasksJsonExporter;
@AndroidEntryPoint
public class ExportTasksDialog extends DialogFragment {
@Inject DialogBuilder dialogBuilder;
@Inject TasksJsonExporter tasksJsonExporter;
public static ExportTasksDialog newExportTasksDialog() {
return new ExportTasksDialog();
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
ProgressDialog progressDialog = dialogBuilder.newProgressDialog();
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setProgress(0);
progressDialog.setCancelable(false);
progressDialog.setIndeterminate(false);
progressDialog.show();
setCancelable(false);
tasksJsonExporter.exportTasks(
getActivity(), TasksJsonExporter.ExportType.EXPORT_TYPE_MANUAL, progressDialog);
return progressDialog;
}
}

@ -0,0 +1,39 @@
package org.tasks.dialogs
import android.app.Dialog
import android.app.ProgressDialog
import android.os.Bundle
import androidx.fragment.app.DialogFragment
import androidx.lifecycle.lifecycleScope
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.launch
import org.tasks.backup.TasksJsonExporter
import javax.inject.Inject
@AndroidEntryPoint
class ExportTasksDialog : DialogFragment() {
@Inject lateinit var dialogBuilder: DialogBuilder
@Inject lateinit var tasksJsonExporter: TasksJsonExporter
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val progressDialog = dialogBuilder.newProgressDialog()
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL)
progressDialog.progress = 0
progressDialog.setCancelable(false)
progressDialog.isIndeterminate = false
progressDialog.show()
isCancelable = false
lifecycleScope.launch(NonCancellable) {
tasksJsonExporter.exportTasks(
activity, TasksJsonExporter.ExportType.EXPORT_TYPE_MANUAL, progressDialog)
}
return progressDialog
}
companion object {
fun newExportTasksDialog(): ExportTasksDialog {
return ExportTasksDialog()
}
}
}

@ -32,7 +32,7 @@ class BackupWork @WorkerInject constructor(
override fun scheduleNext() = workManager.scheduleBackup() override fun scheduleNext() = workManager.scheduleBackup()
private fun startBackup(context: Context?) { private suspend fun startBackup(context: Context?) {
try { try {
deleteOldLocalBackups() deleteOldLocalBackups()
} catch (e: Exception) { } catch (e: Exception) {

Loading…
Cancel
Save