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.
856 lines
35 KiB
Java
856 lines
35 KiB
Java
/**
|
|
* Copyright (c) 2012 Todoroo Inc
|
|
*
|
|
* See the file "LICENSE" for the full license governing this code.
|
|
*/
|
|
package com.todoroo.astrid.actfm;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import java.util.HashSet;
|
|
|
|
import org.json.JSONArray;
|
|
import org.json.JSONException;
|
|
import org.json.JSONObject;
|
|
|
|
import android.app.Activity;
|
|
import android.content.Context;
|
|
import android.content.DialogInterface;
|
|
import android.content.Intent;
|
|
import android.content.res.Resources;
|
|
import android.database.Cursor;
|
|
import android.graphics.Color;
|
|
import android.net.Uri;
|
|
import android.provider.ContactsContract;
|
|
import android.support.v4.app.Fragment;
|
|
import android.text.TextUtils;
|
|
import android.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.view.View.OnClickListener;
|
|
import android.view.ViewGroup;
|
|
import android.view.WindowManager;
|
|
import android.widget.AdapterView;
|
|
import android.widget.AdapterView.OnItemClickListener;
|
|
import android.widget.ArrayAdapter;
|
|
import android.widget.CheckedTextView;
|
|
import android.widget.EditText;
|
|
import android.widget.ImageView;
|
|
import android.widget.ListView;
|
|
import android.widget.TextView;
|
|
|
|
import com.commonsware.cwac.merge.MergeAdapter;
|
|
import com.timsu.astrid.R;
|
|
import com.todoroo.andlib.data.TodorooCursor;
|
|
import com.todoroo.andlib.service.Autowired;
|
|
import com.todoroo.andlib.service.DependencyInjectionService;
|
|
import com.todoroo.andlib.service.ExceptionService;
|
|
import com.todoroo.andlib.sql.Criterion;
|
|
import com.todoroo.andlib.sql.Order;
|
|
import com.todoroo.andlib.sql.Query;
|
|
import com.todoroo.andlib.utility.DialogUtilities;
|
|
import com.todoroo.andlib.utility.Preferences;
|
|
import com.todoroo.astrid.actfm.sync.ActFmPreferenceService;
|
|
import com.todoroo.astrid.actfm.sync.ActFmSyncService;
|
|
import com.todoroo.astrid.activity.TaskEditFragment;
|
|
import com.todoroo.astrid.core.PluginServices;
|
|
import com.todoroo.astrid.dao.UserDao;
|
|
import com.todoroo.astrid.data.TagData;
|
|
import com.todoroo.astrid.data.TagMetadata;
|
|
import com.todoroo.astrid.data.Task;
|
|
import com.todoroo.astrid.data.User;
|
|
import com.todoroo.astrid.helper.AsyncImageView;
|
|
import com.todoroo.astrid.service.AstridDependencyInjector;
|
|
import com.todoroo.astrid.service.MetadataService;
|
|
import com.todoroo.astrid.service.StatisticsConstants;
|
|
import com.todoroo.astrid.service.StatisticsService;
|
|
import com.todoroo.astrid.service.TagDataService;
|
|
import com.todoroo.astrid.service.TaskService;
|
|
import com.todoroo.astrid.service.ThemeService;
|
|
import com.todoroo.astrid.service.abtesting.ABChooser;
|
|
import com.todoroo.astrid.tags.TagMemberMetadata;
|
|
import com.todoroo.astrid.tags.TagService;
|
|
import com.todoroo.astrid.ui.PeopleContainer;
|
|
import com.todoroo.astrid.ui.PeopleContainer.ParseSharedException;
|
|
import com.todoroo.astrid.ui.PopupControlSet;
|
|
import com.todoroo.astrid.utility.ResourceDrawableCache;
|
|
|
|
public class EditPeopleControlSet extends PopupControlSet {
|
|
|
|
public static final String EXTRA_TASK_ID = "task"; //$NON-NLS-1$
|
|
|
|
private static final String CONTACT_CHOOSER_USER = "the_contact_user"; //$NON-NLS-1$
|
|
|
|
private Task task;
|
|
|
|
@Autowired ActFmPreferenceService actFmPreferenceService;
|
|
|
|
@Autowired ActFmSyncService actFmSyncService;
|
|
|
|
@Autowired TaskService taskService;
|
|
|
|
@Autowired UserDao userDao;
|
|
|
|
@Autowired MetadataService metadataService;
|
|
|
|
@Autowired ExceptionService exceptionService;
|
|
|
|
@Autowired TagDataService tagDataService;
|
|
|
|
@Autowired ABChooser abChooser;
|
|
|
|
private final Fragment fragment;
|
|
|
|
private final ListView assignedList;
|
|
|
|
private final TextView assignedDisplay;
|
|
|
|
private final EditText assignedCustom;
|
|
|
|
private final View assignedClear;
|
|
|
|
private final ImageView image;
|
|
|
|
private final int loginRequestCode;
|
|
|
|
private boolean assignedToMe = false;
|
|
|
|
private AssignedToUser contactPickerUser = null;
|
|
|
|
private boolean loadedUI = false;
|
|
|
|
private boolean dontClearAssignedCustom = false;
|
|
|
|
private final Resources resources;
|
|
|
|
private int selected = 0; // remember last selected state
|
|
|
|
static {
|
|
AstridDependencyInjector.initialize();
|
|
}
|
|
|
|
// --- UI initialization
|
|
|
|
public EditPeopleControlSet(Activity activity, Fragment fragment, int viewLayout, int displayViewLayout, int title, int loginRequestCode) {
|
|
super(activity, viewLayout, displayViewLayout, title);
|
|
DependencyInjectionService.getInstance().inject(this);
|
|
this.resources = activity.getResources();
|
|
this.loginRequestCode = loginRequestCode;
|
|
this.fragment = fragment;
|
|
|
|
assignedCustom = (EditText) getView().findViewById(R.id.assigned_custom);
|
|
assignedList = (ListView) getView().findViewById(R.id.assigned_list);
|
|
assignedList.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
|
|
assignedList.setItemsCanFocus(false);
|
|
assignedClear = getView().findViewById(R.id.assigned_clear);
|
|
|
|
assignedDisplay = (TextView) getDisplayView().findViewById(R.id.display_row_edit);
|
|
image = (ImageView) getDisplayView().findViewById(R.id.display_row_icon);
|
|
setUpListeners();
|
|
}
|
|
|
|
@Override
|
|
protected void setupOkButton(View v) {
|
|
//
|
|
}
|
|
|
|
@Override
|
|
public void readFromTask(Task sourceTask) {
|
|
setTask(sourceTask);
|
|
if (!dontClearAssignedCustom)
|
|
assignedCustom.setText(""); //$NON-NLS-1$
|
|
dontClearAssignedCustom = false;
|
|
setUpData(task, null);
|
|
}
|
|
|
|
public void setTask(Task task) {
|
|
this.task = task;
|
|
}
|
|
|
|
public void setUpData(final Task task, final TagData includeTag) {
|
|
new Thread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
ArrayList<JSONObject> sharedPeople = new ArrayList<JSONObject>();
|
|
TodorooCursor<TagData> tags = TagService.getInstance().getTagDataForTask(task.getId(), TagData.NAME, TagData.MEMBER_COUNT, TagData.MEMBERS, TagData.USER);
|
|
try {
|
|
TagData tagData = new TagData();
|
|
for(tags.moveToFirst(); !tags.isAfterLast(); tags.moveToNext()) {
|
|
tagData.readFromCursor(tags);
|
|
addMembersFromTagData(tagData, sharedPeople);
|
|
}
|
|
|
|
if (includeTag != null && tags.getCount() == 0) {
|
|
addMembersFromTagData(includeTag, sharedPeople);
|
|
}
|
|
|
|
buildAssignedToSpinner(task, sharedPeople);
|
|
} finally {
|
|
tags.close();
|
|
loadedUI = true;
|
|
}
|
|
}
|
|
}).start();
|
|
}
|
|
|
|
private static void addMembersFromTagData(TagData tagData, ArrayList<JSONObject> sharedPeople) {
|
|
try {
|
|
JSONArray members = new JSONArray(tagData.getValue(TagData.MEMBERS));
|
|
for (int i = 0; i < members.length(); i++) {
|
|
JSONObject user = members.getJSONObject(i);
|
|
sharedPeople.add(user);
|
|
}
|
|
if(!TextUtils.isEmpty(tagData.getValue(TagData.USER))) {
|
|
JSONObject user = new JSONObject(tagData.getValue(TagData.USER));
|
|
sharedPeople.add(user);
|
|
}
|
|
} catch (JSONException e) {
|
|
TodorooCursor<User> users = PluginServices.getUserDao().query(Query.select(User.PROPERTIES).where(Criterion.or(User.UUID.in(
|
|
Query.select(TagMemberMetadata.USER_UUID).from(TagMetadata.TABLE).where(TagMetadata.TAG_UUID.eq(tagData.getUuid()))), User.UUID.eq(tagData.getValue(TagData.USER_ID)))));
|
|
User user = new User();
|
|
for (users.moveToFirst(); !users.isAfterLast(); users.moveToNext()) {
|
|
user.clear();
|
|
user.readFromCursor(users);
|
|
JSONObject userJson = new JSONObject();
|
|
try {
|
|
ActFmSyncService.JsonHelper.jsonFromUser(userJson, user);
|
|
sharedPeople.add(userJson);
|
|
} catch (JSONException e2) {
|
|
//
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public static class AssignedToUser {
|
|
public String label;
|
|
public JSONObject user;
|
|
|
|
public AssignedToUser(String label, JSONObject user) {
|
|
super();
|
|
this.label = label;
|
|
this.user = user;
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
return label;
|
|
}
|
|
}
|
|
|
|
@SuppressWarnings("nls")
|
|
private void buildAssignedToSpinner(Task t, ArrayList<JSONObject> sharedWith) {
|
|
HashSet<String> userIds = new HashSet<String>();
|
|
HashSet<String> emails = new HashSet<String>();
|
|
HashMap<String, AssignedToUser> names = new HashMap<String, AssignedToUser>();
|
|
|
|
ArrayList<AssignedToUser> coreUsers = new ArrayList<AssignedToUser>();
|
|
ArrayList<AssignedToUser> listUsers = new ArrayList<AssignedToUser>();
|
|
ArrayList<AssignedToUser> astridUsers = new ArrayList<AssignedToUser>();
|
|
|
|
int assignedIndex = 0;
|
|
try {
|
|
ArrayList<JSONObject> coreUsersJson = new ArrayList<JSONObject>();
|
|
JSONObject myself = new JSONObject();
|
|
myself.put("id", Task.USER_ID_SELF);
|
|
myself.put("picture", ActFmPreferenceService.thisUser().optString("picture"));
|
|
coreUsersJson.add(myself);
|
|
|
|
boolean hasTags = t.getTransitory("tags") != null &&
|
|
((HashSet<String>)t.getTransitory("tags")).size() > 0;
|
|
boolean addUnassigned = actFmPreferenceService.isLoggedIn() && hasTags;
|
|
if (addUnassigned) {
|
|
JSONObject unassigned = new JSONObject();
|
|
unassigned.put("id", Task.USER_ID_UNASSIGNED);
|
|
unassigned.put("default_picture", R.drawable.icn_anyone);
|
|
coreUsersJson.add(unassigned);
|
|
}
|
|
|
|
if(Task.isRealUserId(t.getValue(Task.USER_ID))) {
|
|
try {
|
|
JSONObject user = new JSONObject(t.getValue(Task.USER));
|
|
coreUsersJson.add(0, user);
|
|
} catch (JSONException e) {
|
|
User user = userDao.fetch(t.getValue(Task.USER_ID), User.PROPERTIES);
|
|
if (user != null) {
|
|
try {
|
|
JSONObject assignedUser = new JSONObject();
|
|
ActFmSyncService.JsonHelper.jsonFromUser(assignedUser, user);
|
|
coreUsersJson.add(0, assignedUser);
|
|
} catch (JSONException e2) {
|
|
//
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
ArrayList<JSONObject> astridFriends = getAstridFriends();
|
|
|
|
// de-duplicate by user id and/or email
|
|
coreUsers = convertJsonUsersToAssignedUsers(coreUsersJson, userIds, emails, names);
|
|
listUsers = convertJsonUsersToAssignedUsers(sharedWith, userIds, emails, names);
|
|
astridUsers = convertJsonUsersToAssignedUsers(astridFriends, userIds, emails, names);
|
|
|
|
contactPickerUser = new AssignedToUser(activity.getString(R.string.actfm_EPA_choose_contact),
|
|
new JSONObject().put("default_picture", R.drawable.icn_friends)
|
|
.put(CONTACT_CHOOSER_USER, true));
|
|
int contactsIndex = addUnassigned ? 2 : 1;
|
|
boolean addContactPicker = Preferences.getBoolean(R.string.p_use_contact_picker, true) && contactPickerAvailable();
|
|
if (addContactPicker)
|
|
coreUsers.add(contactsIndex, contactPickerUser);
|
|
|
|
if (assignedIndex == 0) {
|
|
assignedIndex = findAssignedIndex(t, coreUsers, listUsers, astridUsers);
|
|
}
|
|
|
|
} catch (JSONException e) {
|
|
exceptionService.reportError("json-reading-data", e);
|
|
}
|
|
|
|
selected = assignedIndex;
|
|
|
|
final MergeAdapter mergeAdapter = new MergeAdapter();
|
|
AssignedUserAdapter coreUserAdapter = new AssignedUserAdapter(activity, coreUsers, 0);
|
|
AssignedUserAdapter listUserAdapter = new AssignedUserAdapter(activity, listUsers, coreUserAdapter.getCount() + 1);
|
|
int offsetForAstridUsers = listUserAdapter.getCount() > 0 ? 2 : 1;
|
|
AssignedUserAdapter astridUserAdapter = new AssignedUserAdapter(activity, astridUsers, coreUserAdapter.getCount() + listUserAdapter.getCount() + offsetForAstridUsers);
|
|
|
|
LayoutInflater inflater = activity.getLayoutInflater();
|
|
TextView header1 = (TextView) inflater.inflate(R.layout.list_header, null);
|
|
header1.setText(R.string.actfm_EPA_assign_header_members);
|
|
TextView header2 = (TextView) inflater.inflate(R.layout.list_header, null);
|
|
header2.setText(R.string.actfm_EPA_assign_header_friends);
|
|
|
|
mergeAdapter.addAdapter(coreUserAdapter);
|
|
if (listUserAdapter.getCount() > 0) {
|
|
mergeAdapter.addView(header1);
|
|
mergeAdapter.addAdapter(listUserAdapter);
|
|
}
|
|
if (astridUserAdapter.getCount() > 0) {
|
|
mergeAdapter.addView(header2);
|
|
mergeAdapter.addAdapter(astridUserAdapter);
|
|
}
|
|
|
|
activity.runOnUiThread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
assignedList.setAdapter(mergeAdapter);
|
|
assignedList.setItemChecked(selected, true);
|
|
refreshDisplayView();
|
|
}
|
|
});
|
|
}
|
|
|
|
private String getLongOrStringId(JSONObject obj, String defaultValue) {
|
|
try {
|
|
long value = obj.getLong("id"); //$NON-NLS-1$
|
|
return Long.toString(value);
|
|
} catch (JSONException e) {
|
|
String value = obj.optString("id"); //$NON-NLS-1$
|
|
if (TextUtils.isEmpty(value))
|
|
value = defaultValue;
|
|
return value;
|
|
}
|
|
}
|
|
|
|
@SuppressWarnings("nls")
|
|
private ArrayList<AssignedToUser> convertJsonUsersToAssignedUsers(ArrayList<JSONObject> jsonUsers,
|
|
HashSet<String> userIds, HashSet<String> emails, HashMap<String, AssignedToUser> names) {
|
|
ArrayList<AssignedToUser> users = new ArrayList<AssignedToUser>();
|
|
for(int i = 0; i < jsonUsers.size(); i++) {
|
|
JSONObject person = jsonUsers.get(i);
|
|
if(person == null)
|
|
continue;
|
|
String id = getLongOrStringId(person, Task.USER_ID_EMAIL);
|
|
if(ActFmPreferenceService.userId().equals(id) || ((Task.USER_ID_UNASSIGNED.equals(id) || Task.isRealUserId(id)) && userIds.contains(id)))
|
|
continue;
|
|
userIds.add(id);
|
|
|
|
String email = person.optString("email");
|
|
if(!TextUtils.isEmpty(email) && emails.contains(email))
|
|
continue;
|
|
emails.add(email);
|
|
|
|
String name = person.optString("name");
|
|
if (Task.USER_ID_SELF.equals(id))
|
|
name = activity.getString(R.string.actfm_EPA_assign_me);
|
|
if (Task.USER_ID_UNASSIGNED.equals(id))
|
|
name = activity.getString(R.string.actfm_EPA_unassigned);
|
|
|
|
AssignedToUser atu = new AssignedToUser(name, person);
|
|
users.add(atu);
|
|
if(names.containsKey(name)) {
|
|
AssignedToUser user = names.get(name);
|
|
if(user != null && user.user.has("email")) {
|
|
user.label += " (" + user.user.optString("email") + ")";
|
|
names.put(name, null);
|
|
}
|
|
if(!TextUtils.isEmpty(email))
|
|
atu.label += " (" + email + ")";
|
|
} else if(TextUtils.isEmpty(name) || "null".equals(name)) {
|
|
if(!TextUtils.isEmpty(email))
|
|
atu.label = email;
|
|
else
|
|
users.remove(atu);
|
|
} else
|
|
names.put(name, atu);
|
|
}
|
|
return users;
|
|
}
|
|
|
|
@SuppressWarnings("nls")
|
|
private int findAssignedIndex(Task t, ArrayList<AssignedToUser>... userLists) {
|
|
String assignedStr = t.getValue(Task.USER);
|
|
String assignedId = Task.USER_ID_IGNORE;
|
|
String assignedEmail = t.getValue(Task.USER_ID);
|
|
try {
|
|
JSONObject assigned = new JSONObject(assignedStr);
|
|
assignedId = getLongOrStringId(assigned, Task.USER_ID_EMAIL);
|
|
assignedEmail = assigned.optString("email");
|
|
} catch (JSONException e) {
|
|
User assignedUser = userDao.fetch(t.getValue(Task.USER_ID), User.PROPERTIES);
|
|
JSONObject assigned = new JSONObject();
|
|
try {
|
|
if (assignedUser != null) {
|
|
ActFmSyncService.JsonHelper.jsonFromUser(assigned, assignedUser);
|
|
try {
|
|
assignedId = assigned.getString("id");
|
|
} catch (JSONException e2) {
|
|
assignedId = getLongOrStringId(assigned, Task.USER_ID_EMAIL);
|
|
}
|
|
assignedEmail = assigned.optString("email");
|
|
} else if (!t.getValue(Task.USER_ID).contains("@")) {
|
|
assignedId = t.getValue(Task.USER_ID);
|
|
}
|
|
} catch (JSONException e2) {
|
|
//
|
|
}
|
|
}
|
|
|
|
int index = 0;
|
|
for (ArrayList<AssignedToUser> userList : userLists) {
|
|
for (int i = 0; i < userList.size(); i++) {
|
|
JSONObject user = userList.get(i).user;
|
|
if (user != null) {
|
|
if (user.optBoolean(CONTACT_CHOOSER_USER))
|
|
continue;
|
|
if (getLongOrStringId(user, Task.USER_ID_EMAIL).equals(assignedId) ||
|
|
(user.optString("email").equals(assignedEmail) &&
|
|
!(TextUtils.isEmpty(assignedEmail))))
|
|
return index;
|
|
}
|
|
index++;
|
|
}
|
|
index++; // Add one for headers separating user lists
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
private ArrayList<JSONObject> getAstridFriends() {
|
|
ArrayList<JSONObject> astridFriends = new ArrayList<JSONObject>();
|
|
TodorooCursor<User> users = userDao.query(Query.select(User.PROPERTIES)
|
|
.orderBy(Order.asc(User.FIRST_NAME), Order.asc(User.LAST_NAME), Order.asc(User.NAME), Order.asc(User.EMAIL)));
|
|
try {
|
|
User user = new User();
|
|
for (users.moveToFirst(); !users.isAfterLast(); users.moveToNext()) {
|
|
user.readFromCursor(users);
|
|
JSONObject userJson = new JSONObject();
|
|
try {
|
|
ActFmSyncService.JsonHelper.jsonFromUser(userJson, user);
|
|
astridFriends.add(userJson);
|
|
} catch (JSONException e) {
|
|
// Ignored
|
|
}
|
|
}
|
|
} finally {
|
|
users.close();
|
|
}
|
|
return astridFriends;
|
|
}
|
|
|
|
|
|
|
|
private class AssignedUserAdapter extends ArrayAdapter<AssignedToUser> {
|
|
|
|
private final int positionOffset;
|
|
|
|
public AssignedUserAdapter(Context context, ArrayList<AssignedToUser> people, int positionOffset) {
|
|
super(context, R.layout.assigned_adapter_row, people);
|
|
this.positionOffset = positionOffset;
|
|
}
|
|
|
|
@SuppressWarnings("nls")
|
|
@Override
|
|
public View getView(int position, View convertView, ViewGroup parent) {
|
|
if(convertView == null)
|
|
convertView = activity.getLayoutInflater().inflate(R.layout.assigned_adapter_row, parent, false);
|
|
CheckedTextView ctv = (CheckedTextView) convertView.findViewById(android.R.id.text1);
|
|
super.getView(position, ctv, parent);
|
|
if (assignedList.getCheckedItemPosition() == position + positionOffset) {
|
|
ctv.setChecked(true);
|
|
} else {
|
|
ctv.setChecked(false);
|
|
}
|
|
AsyncImageView image = (AsyncImageView) convertView.findViewById(R.id.person_image);
|
|
image.setDefaultImageDrawable(ResourceDrawableCache.getImageDrawableFromId(resources, R.drawable.icn_default_person_image));
|
|
image.setUrl(getItem(position).user.optString("picture"));
|
|
if (getItem(position).user.optInt("default_picture", 0) > 0) {
|
|
image.setDefaultImageResource(getItem(position).user.optInt("default_picture"));
|
|
}
|
|
return convertView;
|
|
}
|
|
}
|
|
|
|
public void assignToMe() {
|
|
if (assignedList != null && assignedList.getChildAt(0) != null) {
|
|
assignedList.performItemClick(assignedList.getChildAt(0), 0, 0);
|
|
refreshDisplayView();
|
|
}
|
|
}
|
|
|
|
private void setUpListeners() {
|
|
|
|
assignedList.setOnItemClickListener(new OnItemClickListener() {
|
|
@Override
|
|
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
|
|
long id) {
|
|
AssignedToUser user = (AssignedToUser) assignedList.getAdapter().getItem(position);
|
|
|
|
if (user.user.has(CONTACT_CHOOSER_USER)) {
|
|
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
|
|
fragment.startActivityForResult(intent, TaskEditFragment.REQUEST_CODE_CONTACT);
|
|
return;
|
|
}
|
|
|
|
assignedDisplay.setText(user.toString());
|
|
assignedCustom.setText(""); //$NON-NLS-1$
|
|
selected = position;
|
|
refreshDisplayView();
|
|
DialogUtilities.dismissDialog(activity, dialog);
|
|
}
|
|
|
|
});
|
|
|
|
assignedClear.setOnClickListener(new OnClickListener() {
|
|
@Override
|
|
public void onClick(View v) {
|
|
assignedCustom.setText(""); //$NON-NLS-1$
|
|
selected = 0;
|
|
assignedList.setItemChecked(selected, true);
|
|
}
|
|
});
|
|
|
|
// sharedWithContainer.setOnAddNewPerson(new OnAddNewPersonListener() {
|
|
// @Override
|
|
// public void textChanged(String text) {
|
|
// getSharedWithView().findViewById(R.id.share_additional).setVisibility(View.VISIBLE);
|
|
// if(text.indexOf('@') > -1) {
|
|
//// getSharedWithView().findViewById(R.id.tag_label).setVisibility(View.VISIBLE);
|
|
//// getSharedWithView().findViewById(R.id.tag_name).setVisibility(View.VISIBLE);
|
|
// }
|
|
// }
|
|
// });
|
|
//
|
|
// sharedWithRow.setOnClickListener(new View.OnClickListener() {
|
|
// @Override
|
|
// public void onClick(View v) {
|
|
// sharedWithDialog.show();
|
|
// }
|
|
// });
|
|
}
|
|
|
|
private boolean contactPickerAvailable() {
|
|
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
|
|
return activity.getPackageManager().queryIntentActivities(intent, 0).size() > 0;
|
|
}
|
|
|
|
// --- events
|
|
|
|
@Override
|
|
protected void readFromTaskOnInitialize() {
|
|
// Nothing, we don't lazy load this control set yet
|
|
}
|
|
|
|
@Override
|
|
public String writeToModel(Task t) {
|
|
if (initialized && dialog != null)
|
|
dialog.dismiss();
|
|
// do nothing else, we use a separate method
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
protected String writeToModelAfterInitialized(Task t) {
|
|
// Nothing, we don't lazy load this control set yet
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
protected void afterInflate() {
|
|
// Nothing, we don't lazy load this control set yet
|
|
}
|
|
|
|
public boolean hasLoadedUI() {
|
|
return loadedUI;
|
|
}
|
|
|
|
/**
|
|
* Save sharing settings
|
|
* @param toast toast to show after saving is finished
|
|
* @return false if login is required & save should be halted
|
|
*/
|
|
@SuppressWarnings("nls")
|
|
public boolean saveSharingSettings(String toast) {
|
|
if(task == null)
|
|
return false;
|
|
|
|
boolean dirty = false;
|
|
try {
|
|
JSONObject userJson = null;
|
|
TextView assignedView = null;
|
|
if(!TextUtils.isEmpty(assignedCustom.getText())) {
|
|
userJson = PeopleContainer.createUserJson(assignedCustom);
|
|
assignedView = assignedCustom;
|
|
} else {
|
|
if (!loadedUI || assignedList.getCheckedItemPosition() == ListView.INVALID_POSITION)
|
|
return true;
|
|
AssignedToUser item = (AssignedToUser) assignedList.getAdapter().getItem(assignedList.getCheckedItemPosition());
|
|
if (item != null) {
|
|
if (item.equals(contactPickerUser)) { //don't want to ever set the user as the fake contact picker user
|
|
return true;
|
|
}
|
|
userJson = item.user;
|
|
}
|
|
}
|
|
|
|
if (userJson != null) {
|
|
String email = userJson.optString("email");
|
|
if (!TextUtils.isEmpty(email) && email.indexOf('@') == -1)
|
|
throw new ParseSharedException(assignedView,
|
|
activity.getString(R.string.actfm_EPA_invalid_email, userJson.optString("email")));
|
|
}
|
|
|
|
if(userJson == null || Task.USER_ID_SELF.equals(getLongOrStringId(userJson, Task.USER_ID_EMAIL))) {
|
|
dirty = Task.USER_ID_SELF.equals(task.getValue(Task.USER_ID)) ? dirty : true;
|
|
task.setValue(Task.USER_ID, Task.USER_ID_SELF);
|
|
task.setValue(Task.USER, "");
|
|
assignedToMe = true;
|
|
} else if(Task.USER_ID_UNASSIGNED.equals(getLongOrStringId(userJson, Task.USER_ID_SELF))) {
|
|
dirty = Task.USER_ID_UNASSIGNED.equals(task.getValue(Task.USER_ID)) ? dirty : true;
|
|
task.setValue(Task.USER_ID, Task.USER_ID_UNASSIGNED);
|
|
task.setValue(Task.USER, "");
|
|
} else {
|
|
String taskUserId = Task.USER_ID_EMAIL;
|
|
String taskUserEmail = "";
|
|
try {
|
|
@SuppressWarnings("deprecation") // For backwards compatibility
|
|
JSONObject taskUser = new JSONObject(task.getValue(Task.USER));
|
|
taskUserId = getLongOrStringId(taskUser, Task.USER_ID_EMAIL);
|
|
taskUserEmail = taskUser.optString("email");
|
|
} catch (JSONException e) {
|
|
// sad times
|
|
taskUserId = task.getValue(Task.USER_ID);
|
|
if (Task.userIdIsEmail(taskUserId))
|
|
taskUserEmail = taskUserId;
|
|
}
|
|
String userId = getLongOrStringId(userJson, Task.USER_ID_EMAIL);
|
|
String userEmail = userJson.optString("email");
|
|
|
|
boolean match = userId.equals(taskUserId);
|
|
match = match || (userEmail.equals(taskUserEmail) && !TextUtils.isEmpty(userEmail));
|
|
|
|
dirty = match ? dirty : true;
|
|
String willAssignToId = getLongOrStringId(userJson, Task.USER_ID_EMAIL);
|
|
task.setValue(Task.USER_ID, willAssignToId);
|
|
if (Task.USER_ID_EMAIL.equals(task.getValue(Task.USER_ID)))
|
|
task.setValue(Task.USER_ID, userEmail);
|
|
task.setValue(Task.USER, "");
|
|
}
|
|
|
|
if(dirty && !actFmPreferenceService.isLoggedIn()) {
|
|
DialogInterface.OnClickListener okListener = new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface d, int which) {
|
|
fragment.startActivityForResult(new Intent(activity, ActFmLoginActivity.class),
|
|
loginRequestCode);
|
|
}
|
|
};
|
|
|
|
DialogInterface.OnClickListener cancelListener = new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface d, int which) {
|
|
makePrivateTask();
|
|
task.setValue(Task.USER_ID, Task.USER_ID_SELF);
|
|
}
|
|
};
|
|
DialogUtilities.okCancelCustomDialog(activity, activity.getString(R.string.actfm_EPA_login_button),
|
|
activity.getString(R.string.actfm_EPA_login_to_share), R.string.actfm_EPA_login_button,
|
|
R.string.actfm_EPA_dont_share_button, android.R.drawable.ic_dialog_alert,
|
|
okListener, cancelListener);
|
|
|
|
return false;
|
|
}
|
|
|
|
task.putTransitory(TaskService.TRANS_ASSIGNED, true);
|
|
|
|
if (assignedView == assignedCustom)
|
|
StatisticsService.reportEvent(StatisticsConstants.TASK_ASSIGNED_EMAIL);
|
|
else if (task.getValue(Task.USER_ID) != Task.USER_ID_SELF)
|
|
StatisticsService.reportEvent(StatisticsConstants.TASK_ASSIGNED_PICKER);
|
|
|
|
return true;
|
|
} catch (ParseSharedException e) {
|
|
if(e.view != null) {
|
|
e.view.setTextColor(Color.RED);
|
|
e.view.requestFocus();
|
|
}
|
|
DialogUtilities.okDialog(activity, e.message, null);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private void makePrivateTask() {
|
|
assignToMe();
|
|
}
|
|
|
|
/**
|
|
* Warning - only valid after a call to saveSharingSettings
|
|
* @return
|
|
*/
|
|
public boolean isAssignedToMe() {
|
|
return assignedToMe;
|
|
}
|
|
|
|
/**
|
|
* Check if task will be assigned to current user when save setting is called
|
|
*/
|
|
public boolean willBeAssignedToMe() {
|
|
JSONObject userJson = null;
|
|
if(!TextUtils.isEmpty(assignedCustom.getText())) {
|
|
userJson = PeopleContainer.createUserJson(assignedCustom);
|
|
} else {
|
|
if (!hasLoadedUI() || assignedList.getCheckedItemPosition() == ListView.INVALID_POSITION) {
|
|
if (task != null)
|
|
return task.getValue(Task.USER_ID) == Task.USER_ID_SELF;
|
|
else
|
|
return true;
|
|
}
|
|
AssignedToUser item = (AssignedToUser) assignedList.getAdapter().getItem(assignedList.getCheckedItemPosition());
|
|
if (item != null)
|
|
userJson = item.user;
|
|
}
|
|
|
|
if(userJson == null || Task.USER_ID_SELF.equals(getLongOrStringId(userJson, Task.USER_ID_EMAIL))) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public String getAssignedToString() {
|
|
return assignedDisplay.getText().toString();
|
|
}
|
|
|
|
/** Resume save
|
|
* @param data */
|
|
public void onActivityResult(int requestCode, int resultCode, Intent data) {
|
|
if(requestCode == loginRequestCode && resultCode == Activity.RESULT_OK) {
|
|
// clear user values & reset them to trigger a save
|
|
task.clearValue(Task.USER_ID);
|
|
task.clearValue(Task.USER);
|
|
} else if (requestCode == loginRequestCode) {
|
|
makePrivateTask();
|
|
} else if (requestCode == TaskEditFragment.REQUEST_CODE_CONTACT && resultCode == Activity.RESULT_OK) {
|
|
Uri contactData = data.getData();
|
|
String contactId = contactData.getLastPathSegment();
|
|
String[] args = { contactId };
|
|
String[] projection = { ContactsContract.CommonDataKinds.Email.DATA };
|
|
String selection = ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?"; //$NON-NLS-1$
|
|
Cursor emailCursor = activity.managedQuery(ContactsContract.CommonDataKinds.Email.CONTENT_URI, projection, selection, args, null);
|
|
if (emailCursor.getCount() > 0) {
|
|
emailCursor.moveToFirst();
|
|
int emailIndex = emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA);
|
|
String email = emailCursor.getString(emailIndex);
|
|
if (!TextUtils.isEmpty(email)) {
|
|
String[] nameProjection = { ContactsContract.Contacts.DISPLAY_NAME };
|
|
Cursor nameCursor = activity.managedQuery(contactData, nameProjection, null, null, null);
|
|
if (nameCursor.getCount() > 0) {
|
|
nameCursor.moveToFirst();
|
|
int nameIndex = nameCursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
|
|
String name = nameCursor.getString(nameIndex);
|
|
if (!TextUtils.isEmpty(name)) {
|
|
StringBuilder fullName = new StringBuilder();
|
|
fullName.append(name).append(" <").append(email).append('>'); //$NON-NLS-1$
|
|
email = fullName.toString();
|
|
}
|
|
}
|
|
assignedCustom.setText(email);
|
|
dontClearAssignedCustom = true;
|
|
refreshDisplayView();
|
|
if (dialog != null)
|
|
dialog.dismiss();
|
|
} else {
|
|
DialogUtilities.okDialog(activity, activity.getString(R.string.TEA_contact_error), null);
|
|
}
|
|
} else {
|
|
DialogUtilities.okDialog(activity, activity.getString(R.string.TEA_contact_error), null);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void refreshDisplayView() {
|
|
String displayString;
|
|
boolean unassigned = false;
|
|
if (!TextUtils.isEmpty(assignedCustom.getText())) {
|
|
displayString = activity.getString(R.string.TEA_assigned_to, assignedCustom.getText());
|
|
} else {
|
|
AssignedToUser user = (AssignedToUser) assignedList.getAdapter().getItem(assignedList.getCheckedItemPosition());
|
|
if (user == null)
|
|
user = (AssignedToUser) assignedList.getAdapter().getItem(0);
|
|
|
|
String id = getLongOrStringId(user.user, Task.USER_ID_IGNORE);
|
|
if (Task.USER_ID_UNASSIGNED.equals(id)) {
|
|
unassigned = true;
|
|
displayString = activity.getString(R.string.actfm_EPA_unassigned);
|
|
} else {
|
|
String userString = user.toString();
|
|
if (Task.USER_ID_SELF.equals(id))
|
|
userString = userString.toLowerCase();
|
|
displayString = activity.getString(R.string.TEA_assigned_to, userString);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
assignedDisplay.setTextColor(unassigned ? unsetColor : themeColor);
|
|
assignedDisplay.setText(displayString);
|
|
if (unassigned)
|
|
image.setImageResource(R.drawable.tea_icn_assign_gray);
|
|
else
|
|
image.setImageResource(ThemeService.getTaskEditDrawable(R.drawable.tea_icn_assign, R.drawable.tea_icn_assign_lightblue));
|
|
}
|
|
|
|
@Override
|
|
protected boolean onOkClick() {
|
|
if (!TextUtils.isEmpty(assignedCustom.getText())) {
|
|
JSONObject assigned = PeopleContainer.createUserJson(assignedCustom);
|
|
String email = assigned.optString("email"); //$NON-NLS-1$
|
|
if (!TextUtils.isEmpty(email) && email.indexOf('@') == -1) {
|
|
assignedCustom.requestFocus();
|
|
DialogUtilities.okDialog(activity, activity.getString(R.string.actfm_EPA_invalid_email,
|
|
assigned.optString("email")), null); //$NON-NLS-1$
|
|
return false;
|
|
}
|
|
}
|
|
return super.onOkClick();
|
|
}
|
|
|
|
@Override
|
|
protected void additionalDialogSetup() {
|
|
super.additionalDialogSetup();
|
|
dialog.getWindow()
|
|
.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN
|
|
| WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
|
|
}
|
|
}
|