|
|
/*
|
|
|
* Copyright © 2013 – 2015 Ricki Hirner (bitfire web engineering).
|
|
|
* All rights reserved. This program and the accompanying materials
|
|
|
* are made available under the terms of the GNU Public License v3.0
|
|
|
* which accompanies this distribution, and is available at
|
|
|
* http://www.gnu.org/licenses/gpl.html
|
|
|
*/
|
|
|
|
|
|
package at.bitfire.davdroid.resource;
|
|
|
|
|
|
import android.content.ContentProviderOperation;
|
|
|
import android.content.ContentValues;
|
|
|
import android.os.RemoteException;
|
|
|
import android.provider.CalendarContract.Events;
|
|
|
import android.support.annotation.NonNull;
|
|
|
|
|
|
import org.dmfs.provider.tasks.TaskContract.Tasks;
|
|
|
|
|
|
import java.io.FileNotFoundException;
|
|
|
import java.io.IOException;
|
|
|
import java.text.ParseException;
|
|
|
|
|
|
import at.bitfire.ical4android.AndroidTask;
|
|
|
import at.bitfire.ical4android.AndroidTaskFactory;
|
|
|
import at.bitfire.ical4android.AndroidTaskList;
|
|
|
import at.bitfire.ical4android.CalendarStorageException;
|
|
|
import at.bitfire.ical4android.Task;
|
|
|
import at.bitfire.vcard4android.ContactsStorageException;
|
|
|
import lombok.Getter;
|
|
|
import lombok.Setter;
|
|
|
|
|
|
public class LocalTask extends AndroidTask implements LocalResource {
|
|
|
@Getter
|
|
|
protected String uuid;
|
|
|
|
|
|
static final String COLUMN_ETAG = Tasks.SYNC1,
|
|
|
COLUMN_UID = Tasks.SYNC2,
|
|
|
COLUMN_SEQUENCE = Tasks.SYNC3;
|
|
|
|
|
|
@Getter protected String fileName;
|
|
|
@Getter @Setter protected String eTag;
|
|
|
|
|
|
public LocalTask(@NonNull AndroidTaskList taskList, Task task, String fileName, String eTag) {
|
|
|
super(taskList, task);
|
|
|
this.fileName = fileName;
|
|
|
this.eTag = eTag;
|
|
|
}
|
|
|
|
|
|
protected LocalTask(@NonNull AndroidTaskList taskList, long id, ContentValues baseInfo) {
|
|
|
super(taskList, id);
|
|
|
if (baseInfo != null) {
|
|
|
fileName = baseInfo.getAsString(Events._SYNC_ID);
|
|
|
eTag = baseInfo.getAsString(COLUMN_ETAG);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public String getContent() throws IOException, ContactsStorageException {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public boolean isLocalOnly() {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
/* process LocalTask-specific fields */
|
|
|
|
|
|
@Override
|
|
|
protected void populateTask(ContentValues values) throws FileNotFoundException, RemoteException, ParseException {
|
|
|
super.populateTask(values);
|
|
|
|
|
|
fileName = values.getAsString(Events._SYNC_ID);
|
|
|
eTag = values.getAsString(COLUMN_ETAG);
|
|
|
task.uid = values.getAsString(COLUMN_UID);
|
|
|
|
|
|
task.sequence = values.getAsInteger(COLUMN_SEQUENCE);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
protected void buildTask(ContentProviderOperation.Builder builder, boolean update) {
|
|
|
super.buildTask(builder, update);
|
|
|
builder .withValue(Tasks._SYNC_ID, fileName)
|
|
|
.withValue(COLUMN_UID, task.uid)
|
|
|
.withValue(COLUMN_SEQUENCE, task.sequence)
|
|
|
.withValue(COLUMN_ETAG, eTag);
|
|
|
}
|
|
|
|
|
|
|
|
|
/* custom queries */
|
|
|
|
|
|
public void updateFileNameAndUID(String uid) throws CalendarStorageException {
|
|
|
try {
|
|
|
String newFileName = uid + ".ics";
|
|
|
|
|
|
ContentValues values = new ContentValues(2);
|
|
|
values.put(Tasks._SYNC_ID, newFileName);
|
|
|
values.put(COLUMN_UID, uid);
|
|
|
taskList.provider.client.update(taskSyncURI(), values, null, null);
|
|
|
|
|
|
fileName = newFileName;
|
|
|
if (task != null)
|
|
|
task.uid = uid;
|
|
|
|
|
|
} catch (RemoteException e) {
|
|
|
throw new CalendarStorageException("Couldn't update UID", e);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void clearDirty(String eTag) throws CalendarStorageException {
|
|
|
try {
|
|
|
ContentValues values = new ContentValues(2);
|
|
|
values.put(Tasks._DIRTY, 0);
|
|
|
values.put(COLUMN_ETAG, eTag);
|
|
|
if (task != null)
|
|
|
values.put(COLUMN_SEQUENCE, task.sequence);
|
|
|
taskList.provider.client.update(taskSyncURI(), values, null, null);
|
|
|
|
|
|
this.eTag = eTag;
|
|
|
} catch (RemoteException e) {
|
|
|
throw new CalendarStorageException("Couldn't update _DIRTY/ETag/SEQUENCE", e);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
static class Factory implements AndroidTaskFactory {
|
|
|
static final Factory INSTANCE = new Factory();
|
|
|
|
|
|
@Override
|
|
|
public LocalTask newInstance(AndroidTaskList taskList, long id, ContentValues baseInfo) {
|
|
|
return new LocalTask(taskList, id, baseInfo);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public LocalTask newInstance(AndroidTaskList taskList, Task task) {
|
|
|
return new LocalTask(taskList, task, null, null);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public LocalTask[] newArray(int size) {
|
|
|
return new LocalTask[size];
|
|
|
}
|
|
|
}
|
|
|
}
|