mirror of https://github.com/tasks/tasks
Use non-blocking daos in xml importer
parent
e65a855b02
commit
91a99429ae
@ -1,343 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2012 Todoroo Inc
|
|
||||||
*
|
|
||||||
* See the file "LICENSE" for the full license governing this code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.todoroo.astrid.backup;
|
|
||||||
|
|
||||||
import static org.tasks.data.Place.newPlace;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.app.ProgressDialog;
|
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.os.Handler;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
import com.todoroo.andlib.utility.DialogUtilities;
|
|
||||||
import com.todoroo.astrid.dao.TaskDaoBlocking;
|
|
||||||
import com.todoroo.astrid.data.Task;
|
|
||||||
import com.todoroo.astrid.service.TaskMover;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import javax.inject.Inject;
|
|
||||||
import org.tasks.LocalBroadcastManager;
|
|
||||||
import org.tasks.R;
|
|
||||||
import org.tasks.analytics.Firebase;
|
|
||||||
import org.tasks.backup.XmlReader;
|
|
||||||
import org.tasks.data.Alarm;
|
|
||||||
import org.tasks.data.AlarmDaoBlocking;
|
|
||||||
import org.tasks.data.Geofence;
|
|
||||||
import org.tasks.data.GoogleTask;
|
|
||||||
import org.tasks.data.GoogleTaskDaoBlocking;
|
|
||||||
import org.tasks.data.LocationDaoBlocking;
|
|
||||||
import org.tasks.data.Place;
|
|
||||||
import org.tasks.data.Tag;
|
|
||||||
import org.tasks.data.TagDaoBlocking;
|
|
||||||
import org.tasks.data.TagData;
|
|
||||||
import org.tasks.data.TagDataDaoBlocking;
|
|
||||||
import org.tasks.data.UserActivity;
|
|
||||||
import org.tasks.data.UserActivityDaoBlocking;
|
|
||||||
import org.tasks.dialogs.DialogBuilder;
|
|
||||||
import org.xmlpull.v1.XmlPullParser;
|
|
||||||
import org.xmlpull.v1.XmlPullParserException;
|
|
||||||
import org.xmlpull.v1.XmlPullParserFactory;
|
|
||||||
import timber.log.Timber;
|
|
||||||
|
|
||||||
public class TasksXmlImporter {
|
|
||||||
|
|
||||||
private static final String FORMAT2 = "2"; // $NON-NLS-1$
|
|
||||||
private static final String FORMAT3 = "3"; // $NON-NLS-1$
|
|
||||||
private final TagDataDaoBlocking tagDataDao;
|
|
||||||
private final UserActivityDaoBlocking userActivityDao;
|
|
||||||
private final DialogBuilder dialogBuilder;
|
|
||||||
private final TaskDaoBlocking taskDao;
|
|
||||||
private final LocalBroadcastManager localBroadcastManager;
|
|
||||||
private final AlarmDaoBlocking alarmDao;
|
|
||||||
private final TagDaoBlocking tagDao;
|
|
||||||
private final GoogleTaskDaoBlocking googleTaskDao;
|
|
||||||
private final TaskMover taskMover;
|
|
||||||
private final Firebase firebase;
|
|
||||||
private final LocationDaoBlocking locationDao;
|
|
||||||
private Activity activity;
|
|
||||||
private Handler handler;
|
|
||||||
private int taskCount;
|
|
||||||
private int importCount = 0;
|
|
||||||
private int skipCount = 0;
|
|
||||||
private int errorCount = 0;
|
|
||||||
private ProgressDialog progressDialog;
|
|
||||||
private Uri input;
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
public TasksXmlImporter(
|
|
||||||
TagDataDaoBlocking tagDataDao,
|
|
||||||
UserActivityDaoBlocking userActivityDao,
|
|
||||||
DialogBuilder dialogBuilder,
|
|
||||||
TaskDaoBlocking taskDao,
|
|
||||||
LocationDaoBlocking locationDao,
|
|
||||||
LocalBroadcastManager localBroadcastManager,
|
|
||||||
AlarmDaoBlocking alarmDao,
|
|
||||||
TagDaoBlocking tagDao,
|
|
||||||
GoogleTaskDaoBlocking googleTaskDao,
|
|
||||||
TaskMover taskMover,
|
|
||||||
Firebase firebase) {
|
|
||||||
this.tagDataDao = tagDataDao;
|
|
||||||
this.userActivityDao = userActivityDao;
|
|
||||||
this.dialogBuilder = dialogBuilder;
|
|
||||||
this.taskDao = taskDao;
|
|
||||||
this.locationDao = locationDao;
|
|
||||||
this.localBroadcastManager = localBroadcastManager;
|
|
||||||
this.alarmDao = alarmDao;
|
|
||||||
this.tagDao = tagDao;
|
|
||||||
this.googleTaskDao = googleTaskDao;
|
|
||||||
this.taskMover = taskMover;
|
|
||||||
this.firebase = firebase;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setProgressMessage(final String message) {
|
|
||||||
handler.post(() -> progressDialog.setMessage(message));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void importTasks(Activity activity, Uri input, ProgressDialog progressDialog) {
|
|
||||||
this.activity = activity;
|
|
||||||
this.input = input;
|
|
||||||
this.progressDialog = progressDialog;
|
|
||||||
|
|
||||||
handler = new Handler();
|
|
||||||
|
|
||||||
new Thread(
|
|
||||||
() -> {
|
|
||||||
try {
|
|
||||||
performImport();
|
|
||||||
taskMover.migrateLocalTasks();
|
|
||||||
//noinspection unchecked
|
|
||||||
firebase.logEvent(R.string.event_xml_import);
|
|
||||||
} catch (IOException | XmlPullParserException e) {
|
|
||||||
firebase.reportException(e);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.start();
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- importers
|
|
||||||
|
|
||||||
// =============================================================== FORMAT2
|
|
||||||
|
|
||||||
private void performImport() throws IOException, XmlPullParserException {
|
|
||||||
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
|
|
||||||
XmlPullParser xpp = factory.newPullParser();
|
|
||||||
InputStream inputStream = activity.getContentResolver().openInputStream(input);
|
|
||||||
InputStreamReader reader = new InputStreamReader(inputStream);
|
|
||||||
xpp.setInput(reader);
|
|
||||||
|
|
||||||
try {
|
|
||||||
while (xpp.next() != XmlPullParser.END_DOCUMENT) {
|
|
||||||
String tag = xpp.getName();
|
|
||||||
if (xpp.getEventType() == XmlPullParser.END_TAG) {
|
|
||||||
// Ignore end tags
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (tag != null) {
|
|
||||||
// Process <astrid ... >
|
|
||||||
if (tag.equals(BackupConstants.ASTRID_TAG)) {
|
|
||||||
String format = xpp.getAttributeValue(null, BackupConstants.ASTRID_ATTR_FORMAT);
|
|
||||||
if (TextUtils.equals(format, FORMAT2)) {
|
|
||||||
new Format2TaskImporter(xpp);
|
|
||||||
} else if (TextUtils.equals(format, FORMAT3)) {
|
|
||||||
new Format3TaskImporter(xpp);
|
|
||||||
} else {
|
|
||||||
throw new UnsupportedOperationException(
|
|
||||||
"Did not know how to import tasks with xml format '" + format + "'");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
reader.close();
|
|
||||||
inputStream.close();
|
|
||||||
localBroadcastManager.broadcastRefresh();
|
|
||||||
handler.post(
|
|
||||||
() -> {
|
|
||||||
if (progressDialog.isShowing()) {
|
|
||||||
DialogUtilities.dismissDialog(activity, progressDialog);
|
|
||||||
showSummary();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void showSummary() {
|
|
||||||
Resources r = activity.getResources();
|
|
||||||
dialogBuilder
|
|
||||||
.newDialog(R.string.import_summary_title)
|
|
||||||
.setMessage(
|
|
||||||
activity.getString(
|
|
||||||
R.string.import_summary_message,
|
|
||||||
"",
|
|
||||||
r.getQuantityString(R.plurals.Ntasks, taskCount, taskCount),
|
|
||||||
r.getQuantityString(R.plurals.Ntasks, importCount, importCount),
|
|
||||||
r.getQuantityString(R.plurals.Ntasks, skipCount, skipCount),
|
|
||||||
r.getQuantityString(R.plurals.Ntasks, errorCount, errorCount)))
|
|
||||||
.setPositiveButton(android.R.string.ok, (dialog, id) -> dialog.dismiss())
|
|
||||||
.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
// =============================================================== FORMAT3
|
|
||||||
|
|
||||||
private class Format2TaskImporter {
|
|
||||||
|
|
||||||
XmlPullParser xpp;
|
|
||||||
Task currentTask;
|
|
||||||
|
|
||||||
Format2TaskImporter() {}
|
|
||||||
|
|
||||||
Format2TaskImporter(XmlPullParser xpp) throws XmlPullParserException, IOException {
|
|
||||||
this.xpp = xpp;
|
|
||||||
|
|
||||||
while (xpp.next() != XmlPullParser.END_DOCUMENT) {
|
|
||||||
String tag = xpp.getName();
|
|
||||||
if (tag == null || xpp.getEventType() == XmlPullParser.END_TAG) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
switch (tag) {
|
|
||||||
case BackupConstants.TASK_TAG:
|
|
||||||
parseTask();
|
|
||||||
break;
|
|
||||||
case BackupConstants.COMMENT_TAG:
|
|
||||||
parseComment();
|
|
||||||
break;
|
|
||||||
case BackupConstants.METADATA_TAG:
|
|
||||||
parseMetadata(2);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
errorCount++;
|
|
||||||
Timber.e(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void parseTask() {
|
|
||||||
taskCount++;
|
|
||||||
setProgressMessage(activity.getString(R.string.import_progress_read, taskCount));
|
|
||||||
|
|
||||||
currentTask = new Task(new XmlReader(xpp));
|
|
||||||
|
|
||||||
Task existingTask = taskDao.fetch(currentTask.getUuid());
|
|
||||||
|
|
||||||
if (existingTask == null) {
|
|
||||||
taskDao.createNew(currentTask);
|
|
||||||
importCount++;
|
|
||||||
} else {
|
|
||||||
skipCount++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Imports a comment from the XML we're reading. taken from EditNoteActivity.addComment() */
|
|
||||||
void parseComment() {
|
|
||||||
if (!currentTask.isSaved()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
UserActivity userActivity = new UserActivity(new XmlReader(xpp));
|
|
||||||
userActivityDao.createNew(userActivity);
|
|
||||||
}
|
|
||||||
|
|
||||||
void parseMetadata(int format) {
|
|
||||||
if (!currentTask.isSaved()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
XmlReader xml = new XmlReader(xpp);
|
|
||||||
String key = xml.readString("key");
|
|
||||||
if ("alarm".equals(key)) {
|
|
||||||
Alarm alarm = new Alarm();
|
|
||||||
alarm.setTask(currentTask.getId());
|
|
||||||
alarm.setTime(xml.readLong("value"));
|
|
||||||
alarmDao.insert(alarm);
|
|
||||||
} else if ("geofence".equals(key)) {
|
|
||||||
Place place = newPlace();
|
|
||||||
place.setName(xml.readString("value"));
|
|
||||||
place.setLatitude(xml.readDouble("value2"));
|
|
||||||
place.setLongitude(xml.readDouble("value3"));
|
|
||||||
locationDao.insert(place);
|
|
||||||
Geofence geofence = new Geofence();
|
|
||||||
geofence.setTask(currentTask.getId());
|
|
||||||
geofence.setPlace(place.getUid());
|
|
||||||
geofence.setRadius(xml.readInteger("value4"));
|
|
||||||
geofence.setArrival(true);
|
|
||||||
locationDao.insert(geofence);
|
|
||||||
} else if ("tags-tag".equals(key)) {
|
|
||||||
String name = xml.readString("value");
|
|
||||||
String tagUid = xml.readString("value2");
|
|
||||||
if (tagDao.getTagByTaskAndTagUid(currentTask.getId(), tagUid) == null) {
|
|
||||||
tagDao.insert(new Tag(currentTask, name, tagUid));
|
|
||||||
}
|
|
||||||
// Construct the TagData from Metadata
|
|
||||||
// Fix for failed backup, Version before 4.6.10
|
|
||||||
if (format == 2) {
|
|
||||||
TagData tagData = tagDataDao.getByUuid(tagUid);
|
|
||||||
if (tagData == null) {
|
|
||||||
tagData = new TagData();
|
|
||||||
tagData.setRemoteId(tagUid);
|
|
||||||
tagData.setName(name);
|
|
||||||
tagDataDao.createNew(tagData);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if ("gtasks".equals(key)) {
|
|
||||||
GoogleTask googleTask = new GoogleTask();
|
|
||||||
googleTask.setTask(currentTask.getId());
|
|
||||||
googleTask.setRemoteId(xml.readString("value"));
|
|
||||||
googleTask.setListId(xml.readString("value2"));
|
|
||||||
googleTask.setParent(xml.readLong("value3"));
|
|
||||||
googleTask.setOrder(xml.readLong("value5"));
|
|
||||||
googleTask.setRemoteOrder(xml.readLong("value6"));
|
|
||||||
googleTask.setLastSync(xml.readLong("value7"));
|
|
||||||
googleTask.setDeleted(xml.readLong("deleted"));
|
|
||||||
googleTaskDao.insert(googleTask);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class Format3TaskImporter extends Format2TaskImporter {
|
|
||||||
|
|
||||||
Format3TaskImporter(XmlPullParser xpp) throws XmlPullParserException, IOException {
|
|
||||||
this.xpp = xpp;
|
|
||||||
while (xpp.next() != XmlPullParser.END_DOCUMENT) {
|
|
||||||
String tag = xpp.getName();
|
|
||||||
if (tag == null || xpp.getEventType() == XmlPullParser.END_TAG) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
switch (tag) {
|
|
||||||
case BackupConstants.TASK_TAG:
|
|
||||||
parseTask();
|
|
||||||
break;
|
|
||||||
case BackupConstants.METADATA_TAG:
|
|
||||||
parseMetadata(3);
|
|
||||||
break;
|
|
||||||
case BackupConstants.COMMENT_TAG:
|
|
||||||
parseComment();
|
|
||||||
break;
|
|
||||||
case BackupConstants.TAGDATA_TAG:
|
|
||||||
parseTagdata();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
errorCount++;
|
|
||||||
Timber.e(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void parseTagdata() {
|
|
||||||
TagData tagData = new TagData(new XmlReader(xpp));
|
|
||||||
if (tagDataDao.getByUuid(tagData.getRemoteId()) == null) {
|
|
||||||
tagDataDao.createNew(tagData);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,276 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 Todoroo Inc
|
||||||
|
*
|
||||||
|
* See the file "LICENSE" for the full license governing this code.
|
||||||
|
*/
|
||||||
|
package com.todoroo.astrid.backup
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.app.ProgressDialog
|
||||||
|
import android.content.DialogInterface
|
||||||
|
import android.net.Uri
|
||||||
|
import android.os.Handler
|
||||||
|
import android.text.TextUtils
|
||||||
|
import com.todoroo.andlib.utility.DialogUtilities
|
||||||
|
import com.todoroo.astrid.dao.TaskDao
|
||||||
|
import com.todoroo.astrid.data.Task
|
||||||
|
import com.todoroo.astrid.service.TaskMover
|
||||||
|
import org.tasks.LocalBroadcastManager
|
||||||
|
import org.tasks.R
|
||||||
|
import org.tasks.analytics.Firebase
|
||||||
|
import org.tasks.backup.XmlReader
|
||||||
|
import org.tasks.data.*
|
||||||
|
import org.tasks.data.Place.Companion.newPlace
|
||||||
|
import org.tasks.dialogs.DialogBuilder
|
||||||
|
import org.xmlpull.v1.XmlPullParser
|
||||||
|
import org.xmlpull.v1.XmlPullParserException
|
||||||
|
import org.xmlpull.v1.XmlPullParserFactory
|
||||||
|
import timber.log.Timber
|
||||||
|
import java.io.IOException
|
||||||
|
import java.io.InputStreamReader
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class TasksXmlImporter @Inject constructor(
|
||||||
|
private val tagDataDao: TagDataDao,
|
||||||
|
private val userActivityDao: UserActivityDao,
|
||||||
|
private val dialogBuilder: DialogBuilder,
|
||||||
|
private val taskDao: TaskDao,
|
||||||
|
private val locationDao: LocationDao,
|
||||||
|
private val localBroadcastManager: LocalBroadcastManager,
|
||||||
|
private val alarmDao: AlarmDao,
|
||||||
|
private val tagDao: TagDao,
|
||||||
|
private val googleTaskDao: GoogleTaskDao,
|
||||||
|
private val taskMover: TaskMover,
|
||||||
|
private val firebase: Firebase) {
|
||||||
|
|
||||||
|
private var activity: Activity? = null
|
||||||
|
private var handler: Handler? = null
|
||||||
|
private var taskCount = 0
|
||||||
|
private var importCount = 0
|
||||||
|
private var skipCount = 0
|
||||||
|
private var errorCount = 0
|
||||||
|
private var progressDialog: ProgressDialog? = null
|
||||||
|
private var input: Uri? = null
|
||||||
|
|
||||||
|
private fun setProgressMessage(message: String) {
|
||||||
|
handler!!.post { progressDialog!!.setMessage(message) }
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun importTasks(activity: Activity?, input: Uri?, progressDialog: ProgressDialog?) {
|
||||||
|
this.activity = activity
|
||||||
|
this.input = input
|
||||||
|
this.progressDialog = progressDialog
|
||||||
|
try {
|
||||||
|
performImport()
|
||||||
|
taskMover.migrateLocalTasks()
|
||||||
|
firebase.logEvent(R.string.event_xml_import)
|
||||||
|
} catch (e: IOException) {
|
||||||
|
firebase.reportException(e)
|
||||||
|
} catch (e: XmlPullParserException) {
|
||||||
|
firebase.reportException(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- importers
|
||||||
|
// =============================================================== FORMAT2
|
||||||
|
@Throws(IOException::class, XmlPullParserException::class)
|
||||||
|
private suspend fun performImport() {
|
||||||
|
val factory = XmlPullParserFactory.newInstance()
|
||||||
|
val xpp = factory.newPullParser()
|
||||||
|
val inputStream = activity!!.contentResolver.openInputStream(input!!)
|
||||||
|
val reader = InputStreamReader(inputStream)
|
||||||
|
xpp.setInput(reader)
|
||||||
|
try {
|
||||||
|
while (xpp.next() != XmlPullParser.END_DOCUMENT) {
|
||||||
|
val tag = xpp.name
|
||||||
|
if (xpp.eventType == XmlPullParser.END_TAG) {
|
||||||
|
// Ignore end tags
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (tag != null) {
|
||||||
|
// Process <astrid ... >
|
||||||
|
if (tag == BackupConstants.ASTRID_TAG) {
|
||||||
|
val format = xpp.getAttributeValue(null, BackupConstants.ASTRID_ATTR_FORMAT)
|
||||||
|
when {
|
||||||
|
TextUtils.equals(format, FORMAT2) -> Format2TaskImporter(xpp).process()
|
||||||
|
TextUtils.equals(format, FORMAT3) -> Format3TaskImporter(xpp).process()
|
||||||
|
else -> throw UnsupportedOperationException(
|
||||||
|
"Did not know how to import tasks with xml format '$format'")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
reader.close()
|
||||||
|
inputStream!!.close()
|
||||||
|
localBroadcastManager.broadcastRefresh()
|
||||||
|
handler!!.post {
|
||||||
|
if (progressDialog!!.isShowing) {
|
||||||
|
DialogUtilities.dismissDialog(activity, progressDialog)
|
||||||
|
showSummary()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun showSummary() {
|
||||||
|
val r = activity!!.resources
|
||||||
|
dialogBuilder
|
||||||
|
.newDialog(R.string.import_summary_title)
|
||||||
|
.setMessage(
|
||||||
|
activity!!.getString(
|
||||||
|
R.string.import_summary_message,
|
||||||
|
"",
|
||||||
|
r.getQuantityString(R.plurals.Ntasks, taskCount, taskCount),
|
||||||
|
r.getQuantityString(R.plurals.Ntasks, importCount, importCount),
|
||||||
|
r.getQuantityString(R.plurals.Ntasks, skipCount, skipCount),
|
||||||
|
r.getQuantityString(R.plurals.Ntasks, errorCount, errorCount)))
|
||||||
|
.setPositiveButton(android.R.string.ok) { dialog: DialogInterface, id: Int -> dialog.dismiss() }
|
||||||
|
.show()
|
||||||
|
}
|
||||||
|
|
||||||
|
// =============================================================== FORMAT3
|
||||||
|
private open inner class Format2TaskImporter {
|
||||||
|
var xpp: XmlPullParser? = null
|
||||||
|
var currentTask: Task? = null
|
||||||
|
|
||||||
|
internal constructor()
|
||||||
|
|
||||||
|
internal constructor(xpp: XmlPullParser) {
|
||||||
|
this.xpp = xpp
|
||||||
|
}
|
||||||
|
|
||||||
|
open suspend fun process() {
|
||||||
|
while (xpp?.next() != XmlPullParser.END_DOCUMENT) {
|
||||||
|
val tag = xpp?.name
|
||||||
|
if (tag == null || xpp?.eventType == XmlPullParser.END_TAG) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
when (tag) {
|
||||||
|
BackupConstants.TASK_TAG -> parseTask()
|
||||||
|
BackupConstants.COMMENT_TAG -> parseComment()
|
||||||
|
BackupConstants.METADATA_TAG -> parseMetadata(2)
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
errorCount++
|
||||||
|
Timber.e(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun parseTask() {
|
||||||
|
taskCount++
|
||||||
|
setProgressMessage(activity!!.getString(R.string.import_progress_read, taskCount))
|
||||||
|
currentTask = Task(XmlReader(xpp))
|
||||||
|
val existingTask = taskDao.fetch(currentTask!!.uuid)
|
||||||
|
if (existingTask == null) {
|
||||||
|
taskDao.createNew(currentTask!!)
|
||||||
|
importCount++
|
||||||
|
} else {
|
||||||
|
skipCount++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Imports a comment from the XML we're reading. taken from EditNoteActivity.addComment() */
|
||||||
|
suspend fun parseComment() {
|
||||||
|
if (!currentTask!!.isSaved) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
val userActivity = UserActivity(XmlReader(xpp))
|
||||||
|
userActivityDao.createNew(userActivity)
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun parseMetadata(format: Int) {
|
||||||
|
if (!currentTask!!.isSaved) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
val xml = XmlReader(xpp)
|
||||||
|
val key = xml.readString("key")
|
||||||
|
if ("alarm" == key) {
|
||||||
|
val alarm = Alarm()
|
||||||
|
alarm.task = currentTask!!.id
|
||||||
|
alarm.time = xml.readLong("value")
|
||||||
|
alarmDao.insert(alarm)
|
||||||
|
} else if ("geofence" == key) {
|
||||||
|
val place = newPlace()
|
||||||
|
place.name = xml.readString("value")
|
||||||
|
place.latitude = xml.readDouble("value2")
|
||||||
|
place.longitude = xml.readDouble("value3")
|
||||||
|
locationDao.insert(place)
|
||||||
|
val geofence = Geofence()
|
||||||
|
geofence.task = currentTask!!.id
|
||||||
|
geofence.place = place.uid
|
||||||
|
geofence.radius = xml.readInteger("value4")
|
||||||
|
geofence.isArrival = true
|
||||||
|
locationDao.insert(geofence)
|
||||||
|
} else if ("tags-tag" == key) {
|
||||||
|
val name = xml.readString("value")
|
||||||
|
val tagUid = xml.readString("value2")
|
||||||
|
if (tagDao.getTagByTaskAndTagUid(currentTask!!.id, tagUid) == null) {
|
||||||
|
tagDao.insert(Tag(currentTask!!, name, tagUid))
|
||||||
|
}
|
||||||
|
// Construct the TagData from Metadata
|
||||||
|
// Fix for failed backup, Version before 4.6.10
|
||||||
|
if (format == 2) {
|
||||||
|
var tagData = tagDataDao.getByUuid(tagUid)
|
||||||
|
if (tagData == null) {
|
||||||
|
tagData = TagData()
|
||||||
|
tagData.remoteId = tagUid
|
||||||
|
tagData.name = name
|
||||||
|
tagDataDao.createNew(tagData)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if ("gtasks" == key) {
|
||||||
|
val googleTask = GoogleTask()
|
||||||
|
googleTask.task = currentTask!!.id
|
||||||
|
googleTask.remoteId = xml.readString("value")
|
||||||
|
googleTask.listId = xml.readString("value2")
|
||||||
|
googleTask.parent = xml.readLong("value3")
|
||||||
|
googleTask.order = xml.readLong("value5")
|
||||||
|
googleTask.remoteOrder = xml.readLong("value6")
|
||||||
|
googleTask.lastSync = xml.readLong("value7")
|
||||||
|
googleTask.deleted = xml.readLong("deleted")
|
||||||
|
googleTaskDao.insert(googleTask)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private inner class Format3TaskImporter internal constructor(xpp: XmlPullParser) : Format2TaskImporter() {
|
||||||
|
private suspend fun parseTagdata() {
|
||||||
|
val tagData = TagData(XmlReader(xpp))
|
||||||
|
if (tagDataDao.getByUuid(tagData.remoteId!!) == null) {
|
||||||
|
tagDataDao.createNew(tagData)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
init {
|
||||||
|
this.xpp = xpp
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun process() {
|
||||||
|
while (xpp?.next() != XmlPullParser.END_DOCUMENT) {
|
||||||
|
val tag = xpp?.name
|
||||||
|
if (tag == null || xpp?.eventType == XmlPullParser.END_TAG) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
when (tag) {
|
||||||
|
BackupConstants.TASK_TAG -> parseTask()
|
||||||
|
BackupConstants.METADATA_TAG -> parseMetadata(3)
|
||||||
|
BackupConstants.COMMENT_TAG -> parseComment()
|
||||||
|
BackupConstants.TAGDATA_TAG -> parseTagdata()
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
errorCount++
|
||||||
|
Timber.e(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val FORMAT2 = "2" // $NON-NLS-1$
|
||||||
|
private const val FORMAT3 = "3" // $NON-NLS-1$
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue