mirror of https://github.com/tasks/tasks
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
406 lines
15 KiB
Java
406 lines
15 KiB
Java
package ru.otdelit.astrid.opencrx;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import android.app.Activity;
|
|
import android.util.Log;
|
|
import android.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.widget.AdapterView;
|
|
import android.widget.ArrayAdapter;
|
|
import android.widget.AutoCompleteTextView;
|
|
import android.widget.Spinner;
|
|
import android.widget.TextView;
|
|
import android.widget.AdapterView.OnItemClickListener;
|
|
|
|
import com.timsu.astrid.R;
|
|
import com.todoroo.andlib.data.TodorooCursor;
|
|
import com.todoroo.andlib.data.Property.LongProperty;
|
|
import com.todoroo.andlib.data.Property.StringProperty;
|
|
import com.todoroo.andlib.service.Autowired;
|
|
import com.todoroo.andlib.service.DependencyInjectionService;
|
|
import com.todoroo.andlib.sql.Query;
|
|
import com.todoroo.andlib.utility.DateUtilities;
|
|
import com.todoroo.astrid.activity.TaskEditActivity.TaskEditControlSet;
|
|
import com.todoroo.astrid.dao.StoreObjectDao;
|
|
import com.todoroo.astrid.dao.StoreObjectDao.StoreObjectCriteria;
|
|
import com.todoroo.astrid.data.Metadata;
|
|
import com.todoroo.astrid.data.StoreObject;
|
|
import com.todoroo.astrid.data.Task;
|
|
import com.todoroo.astrid.data.MetadataApiDao.MetadataCriteria;
|
|
import com.todoroo.astrid.service.MetadataService;
|
|
|
|
/**
|
|
* Control Set for managing contact/creator assignments in OpenCRX
|
|
*
|
|
* @author Andrey Marchenko <igendou@gmail.com>
|
|
*
|
|
*/
|
|
public class OpencrxControlSet implements TaskEditControlSet {
|
|
|
|
/**
|
|
* Class that represents OpenCRX ActivityCreator. Duplicates some functionality of OpenCRX plugin.
|
|
*
|
|
*/
|
|
@SuppressWarnings("unused")
|
|
private static class OpencrxActivityCreator {
|
|
/** type*/
|
|
public static final String TYPE = "opencrx-creator"; //$NON-NLS-1$
|
|
|
|
/** hashed creator id in opencrx */
|
|
public static final LongProperty REMOTE_ID = new LongProperty(StoreObject.TABLE,
|
|
StoreObject.ITEM.name);
|
|
|
|
/** creator name */
|
|
public static final StringProperty NAME = new StringProperty(StoreObject.TABLE,
|
|
StoreObject.VALUE1.name);
|
|
|
|
/**
|
|
* String ID in OpenCRX system (ActivityCreator)
|
|
*/
|
|
public static final StringProperty CRX_ID = new StringProperty(StoreObject.TABLE,
|
|
StoreObject.VALUE3.name);
|
|
|
|
// data class-part
|
|
private final long id;
|
|
private final String name;
|
|
|
|
private final String crxId;
|
|
|
|
public OpencrxActivityCreator (StoreObject creatorData) {
|
|
this(creatorData.getValue(REMOTE_ID),creatorData.getValue(NAME),
|
|
creatorData.containsValue(CRX_ID) ? creatorData.getValue(CRX_ID) : ""); //$NON-NLS-1$
|
|
}
|
|
|
|
public OpencrxActivityCreator(long id, String name, String crxId) {
|
|
this.id = id;
|
|
this.name = name;
|
|
this.crxId = crxId;
|
|
}
|
|
public long getId() {
|
|
return id;
|
|
}
|
|
|
|
public String getName() {
|
|
return name;
|
|
}
|
|
|
|
public String getCrxId() {
|
|
return crxId;
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
return name;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Class that represents OpenCRX Contact. Duplicates some functionality of OpenCRX plugin.
|
|
*
|
|
*/
|
|
@SuppressWarnings("unused")
|
|
private static class OpencrxContact {
|
|
public static final String TYPE = "opencrx-contacts"; //$NON-NLS-1$
|
|
|
|
/** hash contact id in opencrx */
|
|
public static final LongProperty REMOTE_ID = new LongProperty(StoreObject.TABLE,
|
|
StoreObject.ITEM.name);
|
|
|
|
/** contact first name */
|
|
public static final StringProperty FIRST_NAME = new StringProperty(StoreObject.TABLE,
|
|
StoreObject.VALUE1.name);
|
|
|
|
/** contact last name */
|
|
public static final StringProperty LAST_NAME = new StringProperty(StoreObject.TABLE,
|
|
StoreObject.VALUE2.name);
|
|
|
|
/** id in OpenCRX as string */
|
|
public static final StringProperty CRX_ID = new StringProperty(StoreObject.TABLE,
|
|
StoreObject.VALUE3.name);
|
|
|
|
private final long id;
|
|
|
|
private final String email;
|
|
|
|
private final String firstname;
|
|
|
|
private final String lastname;
|
|
|
|
private final String crxId;
|
|
|
|
public OpencrxContact(long id, String email, String firstname,
|
|
String lastname, String crxId) {
|
|
this.id = id;
|
|
this.email = email;
|
|
this.firstname = firstname;
|
|
this.lastname = lastname;
|
|
this.crxId = crxId;
|
|
}
|
|
|
|
public OpencrxContact(StoreObject userData){
|
|
this(userData.getValue(REMOTE_ID), "", userData.getValue(FIRST_NAME), userData.getValue(LAST_NAME), userData.getValue(CRX_ID) ); //$NON-NLS-1$
|
|
}
|
|
|
|
public String getEmail() {
|
|
return email;
|
|
}
|
|
public String getFirstname() {
|
|
return firstname;
|
|
}
|
|
public String getLastname() {
|
|
return lastname;
|
|
}
|
|
public String getCrxId() {
|
|
return crxId;
|
|
}
|
|
public long getId() {
|
|
return id;
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
String displayString = ""; //$NON-NLS-1$
|
|
boolean hasFirstname = false;
|
|
boolean hasLastname = false;
|
|
if (firstname != null && firstname.length() > 0) {
|
|
displayString += firstname;
|
|
hasFirstname = true;
|
|
}
|
|
if (lastname != null && lastname.length() > 0)
|
|
hasLastname = true;
|
|
if (hasFirstname && hasLastname)
|
|
displayString += " "; //$NON-NLS-1$
|
|
if (hasLastname)
|
|
displayString += lastname;
|
|
|
|
if (!hasFirstname && !hasLastname && email != null
|
|
&& email.length() > 0)
|
|
displayString += email;
|
|
return displayString;
|
|
}
|
|
}
|
|
|
|
|
|
// --- instance variables
|
|
|
|
private final Activity activity;
|
|
|
|
private final Spinner assignedToSelector;
|
|
private final Spinner creatorSelector;
|
|
|
|
private final AutoCompleteTextView assignedToTextInput;
|
|
private final AutoCompleteTextView creatorTextInput;
|
|
|
|
private ArrayList<OpencrxContact> users = null;
|
|
private ArrayList<OpencrxActivityCreator> dashboards = null;
|
|
|
|
@Autowired
|
|
private MetadataService metadataService;
|
|
|
|
@Autowired
|
|
private StoreObjectDao storeObjectDao;
|
|
|
|
@SuppressWarnings("unused")
|
|
public OpencrxControlSet(final Activity activity, ViewGroup parent) {
|
|
DependencyInjectionService.getInstance().inject(this);
|
|
|
|
this.activity = activity;
|
|
|
|
View view = LayoutInflater.from(activity).inflate(R.layout.opencrx_control, parent, true);
|
|
|
|
this.assignedToSelector = (Spinner) activity.findViewById(R.id.opencrx_TEA_task_assign);
|
|
TextView emptyView = new TextView(activity);
|
|
emptyView.setText(activity.getText(R.string.opencrx_no_creator));
|
|
assignedToSelector.setEmptyView(emptyView);
|
|
|
|
this.creatorSelector = (Spinner) activity.findViewById(R.id.opencrx_TEA_dashboard_assign);
|
|
|
|
this.assignedToTextInput = (AutoCompleteTextView) activity.findViewById(R.id.opencrx_TEA_contact_textinput);
|
|
this.creatorTextInput = (AutoCompleteTextView) activity.findViewById(R.id.opencrx_TEA_creator_textinput);
|
|
|
|
}
|
|
|
|
@Override
|
|
public void readFromTask(Task task) {
|
|
|
|
|
|
Metadata metadata = getTaskMetadata(task.getId());
|
|
if(metadata == null)
|
|
metadata = OpencrxCoreUtils.INSTANCE.newMetadata();
|
|
|
|
// Fill the dashboard-spinner and set the current dashboard
|
|
long dashboardId = OpencrxCoreUtils.INSTANCE.getDefaultCreator();
|
|
if(metadata.containsNonNullValue(OpencrxCoreUtils.ACTIVITY_CREATOR_ID))
|
|
dashboardId = metadata.getValue(OpencrxCoreUtils.ACTIVITY_CREATOR_ID);
|
|
|
|
StoreObject[] dashboardsData = readStoreObjects(OpencrxActivityCreator.TYPE);
|
|
dashboards = new ArrayList<OpencrxActivityCreator>(dashboardsData.length);
|
|
int dashboardSpinnerIndex = -1;
|
|
|
|
for (int i=0;i<dashboardsData.length;i++) {
|
|
OpencrxActivityCreator dashboard = new OpencrxActivityCreator(dashboardsData[i]);
|
|
dashboards.add(dashboard);
|
|
if(dashboard.getId() == dashboardId) {
|
|
dashboardSpinnerIndex = i;
|
|
}
|
|
}
|
|
|
|
//dashboard to not sync as first spinner-entry
|
|
dashboards.add(0, new OpencrxActivityCreator(OpencrxCoreUtils.CREATOR_NO_SYNC, activity.getString(R.string.opencrx_no_creator), "")); //$NON-NLS-1$
|
|
|
|
ArrayAdapter<OpencrxActivityCreator> dashAdapter = new ArrayAdapter<OpencrxActivityCreator>(activity,
|
|
android.R.layout.simple_spinner_item, dashboards);
|
|
dashAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
|
creatorSelector.setAdapter(dashAdapter);
|
|
creatorSelector.setSelection(dashboardSpinnerIndex+1);
|
|
|
|
ArrayAdapter<OpencrxActivityCreator> creatorAdapterTextInput = new ArrayAdapter<OpencrxActivityCreator>(activity,
|
|
android.R.layout.simple_spinner_item, dashboards);
|
|
creatorTextInput.setAdapter(creatorAdapterTextInput);
|
|
creatorTextInput.setOnItemClickListener(new OnItemClickListener() {
|
|
|
|
@Override
|
|
public void onItemClick(AdapterView<?> adapter, View view, int position,
|
|
long id) {
|
|
OpencrxActivityCreator creatorInput = (OpencrxActivityCreator) adapter.getItemAtPosition(position);
|
|
|
|
if (creatorInput == null) return;
|
|
|
|
int selectedIndex = creatorSelector.getSelectedItemPosition();
|
|
|
|
for (int i = 0; i < creatorSelector.getAdapter().getCount(); ++i){
|
|
OpencrxActivityCreator current = (OpencrxActivityCreator) creatorSelector.getAdapter().getItem(i);
|
|
if (current != null && current.getId() == creatorInput.getId()){
|
|
selectedIndex = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
creatorSelector.setSelection(selectedIndex);
|
|
}
|
|
});
|
|
|
|
// Assigned user
|
|
long responsibleId = OpencrxCoreUtils.INSTANCE.getDefaultAssignedUser();
|
|
if (metadata.containsNonNullValue(OpencrxCoreUtils.ACTIVITY_ASSIGNED_TO_ID)){
|
|
responsibleId = metadata.getValue(OpencrxCoreUtils.ACTIVITY_ASSIGNED_TO_ID);
|
|
}
|
|
|
|
StoreObject[] usersData = readStoreObjects(OpencrxContact.TYPE);
|
|
this.users = new ArrayList<OpencrxContact>();
|
|
for (StoreObject user : usersData){
|
|
this.users.add(new OpencrxContact(user));
|
|
}
|
|
|
|
ArrayAdapter<OpencrxContact> usersAdapter = new ArrayAdapter<OpencrxContact>(activity,
|
|
android.R.layout.simple_spinner_item, this.users);
|
|
usersAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
|
assignedToSelector.setAdapter(usersAdapter);
|
|
|
|
int responsibleSpinnerIndex = 0;
|
|
|
|
for (int i = 0; i < this.users.size() ; i++) {
|
|
if (this.users.get(i).getId() == responsibleId ) {
|
|
responsibleSpinnerIndex = i;
|
|
break;
|
|
}
|
|
}
|
|
assignedToSelector.setSelection(responsibleSpinnerIndex);
|
|
|
|
ArrayAdapter<OpencrxContact> contactAdapterTextInput = new ArrayAdapter<OpencrxContact>(activity,
|
|
android.R.layout.simple_spinner_item, this.users);
|
|
|
|
assignedToTextInput.setAdapter(contactAdapterTextInput);
|
|
assignedToTextInput.setOnItemClickListener(new OnItemClickListener() {
|
|
|
|
@Override
|
|
public void onItemClick(AdapterView<?> adapter, View view, int position,
|
|
long id) {
|
|
|
|
OpencrxContact userInput = (OpencrxContact) adapter.getItemAtPosition(position);
|
|
|
|
if (userInput == null) return;
|
|
|
|
int selectedIndex = assignedToSelector.getSelectedItemPosition();
|
|
|
|
for (int i = 0; i < assignedToSelector.getAdapter().getCount(); ++i){
|
|
OpencrxContact current = (OpencrxContact) assignedToSelector.getAdapter().getItem(i);
|
|
if (current != null && current.getId() == userInput.getId()){
|
|
selectedIndex = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
assignedToSelector.setSelection(selectedIndex);
|
|
|
|
}
|
|
});
|
|
}
|
|
|
|
@Override
|
|
public String writeToModel(Task task) {
|
|
Metadata metadata = getTaskMetadata(task.getId());
|
|
try {
|
|
if (metadata == null) {
|
|
metadata = OpencrxCoreUtils.INSTANCE.newMetadata();
|
|
}
|
|
|
|
OpencrxActivityCreator dashboard = (OpencrxActivityCreator) creatorSelector.getSelectedItem();
|
|
metadata.setValue(OpencrxCoreUtils.ACTIVITY_CREATOR_ID, dashboard.getId());
|
|
|
|
OpencrxContact responsibleUser = (OpencrxContact) assignedToSelector.getSelectedItem();
|
|
|
|
if(responsibleUser == null)
|
|
metadata.setValue(OpencrxCoreUtils.ACTIVITY_ASSIGNED_TO_ID, 0L);
|
|
else
|
|
metadata.setValue(OpencrxCoreUtils.ACTIVITY_ASSIGNED_TO_ID, responsibleUser.getId());
|
|
|
|
if(metadata.getSetValues().size() > 0) {
|
|
metadataService.save(metadata);
|
|
task.setValue(Task.MODIFICATION_DATE, DateUtilities.now());
|
|
}
|
|
} catch (Exception e) {
|
|
Log.e("opencrx-error", "Error Saving Metadata", e); //$NON-NLS-1$ //$NON-NLS-2$
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Reads metadata out of a task
|
|
* @return null if no metadata found
|
|
*/
|
|
private Metadata getTaskMetadata(long taskId) {
|
|
TodorooCursor<Metadata> cursor = metadataService.query(Query.select(Metadata.PROPERTIES).where(
|
|
MetadataCriteria.byTaskAndwithKey(taskId, OpencrxCoreUtils.OPENCRX_ACTIVITY_METADATA_KEY))
|
|
);
|
|
try {
|
|
if(cursor.getCount() == 0)
|
|
return null;
|
|
cursor.moveToFirst();
|
|
return new Metadata(cursor);
|
|
} finally {
|
|
cursor.close();
|
|
}
|
|
}
|
|
|
|
private StoreObject[] readStoreObjects(String type) {
|
|
StoreObject[] ret;
|
|
TodorooCursor<StoreObject> cursor = storeObjectDao.query(Query.select(StoreObject.PROPERTIES).
|
|
where(StoreObjectCriteria.byType(type)));
|
|
try {
|
|
ret = new StoreObject[cursor.getCount()];
|
|
for(int i = 0; i < ret.length; i++) {
|
|
cursor.moveToNext();
|
|
StoreObject dashboard = new StoreObject(cursor);
|
|
ret[i] = dashboard;
|
|
}
|
|
} finally {
|
|
cursor.close();
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
} |