diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/EditPeopleControlSet.java b/astrid/plugin-src/com/todoroo/astrid/actfm/EditPeopleControlSet.java index 570aeccf6..48318fc3b 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/EditPeopleControlSet.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/EditPeopleControlSet.java @@ -110,6 +110,8 @@ public class EditPeopleControlSet extends PopupControlSet { private AssignedToUser taskRabbitUser = null; + private boolean loadedUI = false; + private final List listeners = new LinkedList(); public interface AssignedChangedListener { @@ -223,23 +225,30 @@ public class EditPeopleControlSet extends PopupControlSet { final String tag = metadata.getValue(TagService.TAG); TagData tagData = tagDataService.getTag(tag, TagData.MEMBER_COUNT, TagData.MEMBERS, TagData.USER); if(tagData != null && tagData.getValue(TagData.MEMBER_COUNT) > 0) { - addMembersFromTagData(tagData, tag, sharedPeople, collaborators); + try { + addMembersFromTagData(tagData, tag, sharedPeople, collaborators); + } catch (JSONException e) { + exceptionService.reportError("json-reading-data", e); + } } else { nonSharedTags.add((Metadata) metadata.clone()); } } if (includeTag != null && tags.getCount() == 0) { - addMembersFromTagData(includeTag, null, sharedPeople, collaborators); + try { + addMembersFromTagData(includeTag, null, sharedPeople, collaborators); + } catch (JSONException e) { + exceptionService.reportError("json-reading-data", e); + } } if(collaborators.size() > 0) buildCollaborators(collaborators); buildAssignedToSpinner(task, sharedPeople); - } catch (JSONException e) { - exceptionService.reportError("json-reading-data", e); } finally { tags.close(); + loadedUI = true; } } }).start(); @@ -269,7 +278,7 @@ public class EditPeopleControlSet extends PopupControlSet { } @SuppressWarnings("nls") - private void buildCollaborators(final ArrayList sharedPeople) throws JSONException { + private void buildCollaborators(final ArrayList sharedPeople) { activity.runOnUiThread(new Runnable() { @Override @@ -318,94 +327,98 @@ public class EditPeopleControlSet extends PopupControlSet { } @SuppressWarnings("nls") - private void buildAssignedToSpinner(Task t, ArrayList sharedPeople) throws JSONException { + private void buildAssignedToSpinner(Task t, ArrayList sharedPeople) { HashSet userIds = new HashSet(); HashSet emails = new HashSet(); HashMap names = new HashMap(); - if(t.getValue(Task.USER_ID) > 0) { - JSONObject user = new JSONObject(t.getValue(Task.USER)); - sharedPeople.add(0, user); - } + int assignedIndex = 0; + try { + if(t.getValue(Task.USER_ID) > 0) { + JSONObject user = new JSONObject(t.getValue(Task.USER)); + sharedPeople.add(0, user); + } - JSONObject myself = new JSONObject(); - myself.put("id", Task.USER_ID_SELF); - sharedPeople.add(0, myself); + JSONObject myself = new JSONObject(); + myself.put("id", Task.USER_ID_SELF); + sharedPeople.add(0, myself); - boolean hasTags = t.getTransitory("tags") != null && - ((HashSet)t.getTransitory("tags")).size() > 0; - if (actFmPreferenceService.isLoggedIn() && hasTags) { - JSONObject unassigned = new JSONObject(); - unassigned.put("id", Task.USER_ID_UNASSIGNED); - sharedPeople.add(1, unassigned); - } + boolean hasTags = t.getTransitory("tags") != null && + ((HashSet)t.getTransitory("tags")).size() > 0; + if (actFmPreferenceService.isLoggedIn() && hasTags) { + JSONObject unassigned = new JSONObject(); + unassigned.put("id", Task.USER_ID_UNASSIGNED); + sharedPeople.add(1, unassigned); + } - // de-duplicate by user id and/or email - listValues.clear(); - for(int i = 0; i < sharedPeople.size(); i++) { - JSONObject person = sharedPeople.get(i); - if(person == null) - continue; - long id = person.optLong("id", -2); - if(id == ActFmPreferenceService.userId() || (id >= -1 && 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(id == 0) - name = activity.getString(R.string.actfm_EPA_assign_me); - if (id == -1) - name = activity.getString(R.string.actfm_EPA_unassigned); - - AssignedToUser atu = new AssignedToUser(name, person); - listValues.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)) { - if(!TextUtils.isEmpty("email")) - atu.label = email; - else - listValues.remove(atu); - } else - names.put(name, atu); - } + // de-duplicate by user id and/or email + listValues.clear(); + for(int i = 0; i < sharedPeople.size(); i++) { + JSONObject person = sharedPeople.get(i); + if(person == null) + continue; + long id = person.optLong("id", -2); + if(id == ActFmPreferenceService.userId() || (id >= -1 && userIds.contains(id))) + continue; + userIds.add(id); - String assignedStr = t.getValue(Task.USER); - int assignedIndex = 0; - if (!TextUtils.isEmpty(assignedStr)) { - JSONObject assigned = new JSONObject(assignedStr); - long assignedId = assigned.optLong("id", -2); - String assignedEmail = assigned.optString("email"); - for (int i = 0; i < listValues.size(); i++) { - JSONObject user = listValues.get(i).user; - if (user != null) { - if (user.optLong("id") == assignedId || - (user.optString("email").equals(assignedEmail) && - !(TextUtils.isEmpty(assignedEmail)))) - assignedIndex = i; + String email = person.optString("email"); + if(!TextUtils.isEmpty(email) && emails.contains(email)) + continue; + emails.add(email); + + String name = person.optString("name"); + if(id == 0) + name = activity.getString(R.string.actfm_EPA_assign_me); + if (id == -1) + name = activity.getString(R.string.actfm_EPA_unassigned); + + AssignedToUser atu = new AssignedToUser(name, person); + listValues.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)) { + if(!TextUtils.isEmpty("email")) + atu.label = email; + else + listValues.remove(atu); + } else + names.put(name, atu); + } + + String assignedStr = t.getValue(Task.USER); + if (!TextUtils.isEmpty(assignedStr)) { + JSONObject assigned = new JSONObject(assignedStr); + long assignedId = assigned.optLong("id", -2); + String assignedEmail = assigned.optString("email"); + for (int i = 0; i < listValues.size(); i++) { + JSONObject user = listValues.get(i).user; + if (user != null) { + if (user.optLong("id") == assignedId || + (user.optString("email").equals(assignedEmail) && + !(TextUtils.isEmpty(assignedEmail)))) + assignedIndex = i; + } } } - } - for (AssignedChangedListener l : listeners) { - if (l.shouldShowTaskRabbit()) { - taskRabbitUser = new AssignedToUser(activity.getString(R.string.actfm_EPA_task_rabbit), new JSONObject().put("default_picture", R.drawable.task_rabbit_image)); - listValues.add(taskRabbitUser); - if(l.didPostToTaskRabbit()){ - assignedIndex = listValues.size()-1; + for (AssignedChangedListener l : listeners) { + if (l.shouldShowTaskRabbit()) { + taskRabbitUser = new AssignedToUser(activity.getString(R.string.actfm_EPA_task_rabbit), new JSONObject().put("default_picture", R.drawable.task_rabbit_image)); + listValues.add(taskRabbitUser); + if(l.didPostToTaskRabbit()){ + assignedIndex = listValues.size()-1; + } } } + } catch (JSONException e) { + exceptionService.reportError("json-reading-data", e); } selected = assignedIndex; @@ -543,6 +556,10 @@ public class EditPeopleControlSet extends PopupControlSet { // 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 @@ -562,6 +579,8 @@ public class EditPeopleControlSet extends PopupControlSet { 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(taskRabbitUser)) { //don't want to ever set the user as the task rabbit user diff --git a/astrid/src/com/todoroo/astrid/activity/TaskEditFragment.java b/astrid/src/com/todoroo/astrid/activity/TaskEditFragment.java index ce0680d6b..e95ed9f4c 100755 --- a/astrid/src/com/todoroo/astrid/activity/TaskEditFragment.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskEditFragment.java @@ -859,7 +859,7 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener { public boolean onKeyDown(int keyCode) { if (keyCode == KeyEvent.KEYCODE_BACK) { - if (title.getText().length() == 0) + if (title.getText().length() == 0 || !peopleControlSet.hasLoadedUI()) discardButtonClick(); else saveButtonClick();