From 0577a5d865e6c74d4e376e7ace8a68f286e54145 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Thu, 10 Nov 2011 16:35:14 -0800 Subject: [PATCH] New edit page in its entirety --- astrid/AndroidManifest.xml | 17 +- .../astrid/actfm/ActFmPreferences.java | 17 + .../astrid/actfm/EditPeopleControlSet.java | 151 +++++--- .../todoroo/astrid/actfm/TagViewActivity.java | 6 +- .../astrid/actfm/sync/ActFmInvoker.java | 11 +- .../astrid/alarms/AlarmControlSet.java | 15 +- .../astrid/core/CustomFilterActivity.java | 2 +- .../astrid/core/LinkActionExposer.java | 2 +- .../todoroo/astrid/gcal/GCalControlSet.java | 150 +++++--- .../astrid/opencrx/OpencrxControlSet.java | 24 +- .../producteev/ProducteevControlSet.java | 27 +- .../astrid/repeats/RepeatControlSet.java | 75 ++-- .../todoroo/astrid/tags/TagsControlSet.java | 200 ++++++----- .../astrid/timers/TimerActionControlSet.java | 81 +++++ .../astrid/timers/TimerControlSet.java | 40 ++- .../todoroo/astrid/timers/TimerPlugin.java | 1 + astrid/res/drawable/edit_title_background.xml | 14 + astrid/res/drawable/footer_editbutton.xml | 23 ++ .../res/drawable/footer_editbutton_normal.png | Bin 0 -> 871 bytes .../drawable/footer_editbutton_pressed.png | Bin 0 -> 881 bytes astrid/res/drawable/icn_edit_calendar.png | Bin 0 -> 1213 bytes astrid/res/drawable/icn_edit_hide.png | Bin 0 -> 1690 bytes astrid/res/drawable/icn_edit_lists.png | Bin 0 -> 331 bytes astrid/res/drawable/icn_edit_notes.png | Bin 0 -> 712 bytes astrid/res/drawable/icn_edit_priority.png | Bin 0 -> 940 bytes astrid/res/drawable/icn_edit_reminders.png | Bin 0 -> 4312 bytes astrid/res/drawable/icn_edit_repeats.png | Bin 0 -> 3225 bytes astrid/res/drawable/icn_edit_share.png | Bin 0 -> 850 bytes astrid/res/drawable/icn_edit_timer.png | Bin 0 -> 2278 bytes astrid/res/drawable/icn_edit_when.png | Bin 0 -> 353 bytes astrid/res/drawable/icn_edit_who.png | Bin 0 -> 416 bytes astrid/res/drawable/icn_timer_start.png | Bin 0 -> 2559 bytes astrid/res/drawable/icn_timer_stop.png | Bin 0 -> 2123 bytes .../importance_background_selected.xml | 13 + astrid/res/drawable/importance_title_1.xml | 8 + astrid/res/drawable/importance_title_2.xml | 8 + astrid/res/drawable/importance_title_3.xml | 8 + astrid/res/drawable/importance_title_4.xml | 8 + astrid/res/drawable/importance_title_5.xml | 8 + astrid/res/drawable/importance_title_6.xml | 8 + astrid/res/layout/alarm_control.xml | 23 -- astrid/res/layout/control_set_alarms.xml | 35 ++ astrid/res/layout/control_set_assigned.xml | 35 ++ .../layout/control_set_assigned_display.xml | 39 ++ .../res/layout/control_set_collaborators.xml | 108 ++++++ .../control_set_collaborators_display.xml | 39 ++ astrid/res/layout/control_set_gcal.xml | 29 ++ .../res/layout/control_set_gcal_display.xml | 42 +++ astrid/res/layout/control_set_hide.xml | 11 + .../res/layout/control_set_hide_display.xml | 40 +++ astrid/res/layout/control_set_importance.xml | 36 ++ astrid/res/layout/control_set_notes.xml | 37 ++ .../res/layout/control_set_notes_display.xml | 40 +++ ...rx_control.xml => control_set_opencrx.xml} | 12 +- .../layout/control_set_opencrx_display.xml | 27 ++ ...control.xml => control_set_producteev.xml} | 14 +- .../layout/control_set_producteev_display.xml | 35 ++ astrid/res/layout/control_set_reminders.xml | 65 ++++ .../layout/control_set_reminders_display.xml | 39 ++ ...eat_control.xml => control_set_repeat.xml} | 17 +- .../res/layout/control_set_repeat_display.xml | 39 ++ astrid/res/layout/control_set_tags.xml | 28 ++ .../res/layout/control_set_tags_display.xml | 40 +++ ...mer_control.xml => control_set_timers.xml} | 14 +- .../control_set_timers_extras_display.xml | 39 ++ astrid/res/layout/control_set_title.xml | 48 +++ astrid/res/layout/control_set_urgency.xml | 27 ++ astrid/res/layout/gcal_control.xml | 48 --- .../res/layout/popup_control_set_activity.xml | 17 + astrid/res/layout/tag_edit_row.xml | 9 +- astrid/res/layout/task_edit_activity.xml | 2 +- astrid/res/layout/task_edit_activity_new.xml | 137 +++++++ astrid/res/layout/task_edit_arrow.xml | 7 + astrid/res/layout/task_edit_when_controls.xml | 23 ++ astrid/res/values-ca/strings.xml | 6 +- astrid/res/values-cs/strings.xml | 6 +- astrid/res/values-da/strings.xml | 6 +- astrid/res/values-de/strings.xml | 6 +- astrid/res/values-es/strings.xml | 6 +- astrid/res/values-fr/strings.xml | 6 +- astrid/res/values-he/strings.xml | 6 +- astrid/res/values-it/strings.xml | 6 +- astrid/res/values-ja/strings.xml | 6 +- astrid/res/values-ko/strings.xml | 4 +- astrid/res/values-nb/strings.xml | 6 +- astrid/res/values-nl/strings.xml | 6 +- astrid/res/values-pl/strings.xml | 6 +- astrid/res/values-pt/strings.xml | 6 +- astrid/res/values-ru/strings.xml | 4 +- astrid/res/values-sv/strings.xml | 6 +- astrid/res/values-th/strings.xml | 6 +- astrid/res/values-zh-rCN/strings.xml | 6 +- astrid/res/values-zh-rTW/strings.xml | 6 +- astrid/res/values/attrs.xml | 3 +- astrid/res/values/cwac_touchlist_attrs.xml | 2 +- astrid/res/values/keys-opencrx.xml | 2 +- astrid/res/values/keys.xml | 4 + astrid/res/values/strings-actfm.xml | 13 +- astrid/res/values/strings-core.xml | 18 +- astrid/res/values/strings-defaults.xml | 6 +- astrid/res/values/strings-gcal.xml | 5 +- astrid/res/values/strings-opencrx.xml | 4 +- astrid/res/values/strings-producteev.xml | 5 +- astrid/res/values/strings-reminders.xml | 3 + astrid/res/values/strings-repeat.xml | 4 + astrid/res/values/strings-tags.xml | 7 +- astrid/res/values/strings-timers.xml | 5 +- astrid/res/values/styles.xml | 43 ++- astrid/res/xml/preferences.xml | 7 +- astrid/res/xml/preferences_actfm.xml | 4 + .../astrid/activity/EditPreferences.java | 7 +- .../astrid/activity/TaskEditActivity.java | 336 ++++++++++-------- .../todoroo/astrid/adapter/TaskAdapter.java | 37 +- .../astrid/helper/TaskEditControlSet.java | 40 +++ .../todoroo/astrid/service/ThemeService.java | 18 +- .../astrid/ui/EditNotesControlSet.java | 38 ++ .../todoroo/astrid/ui/EditTextControlSet.java | 9 +- .../astrid/ui/EditTitleControlSet.java | 27 ++ .../astrid/ui/HideUntilControlSet.java | 48 ++- .../astrid/ui/ImportanceControlSet.java | 66 +++- .../todoroo/astrid/ui/PopupControlSet.java | 73 ++++ .../astrid/ui/RandomReminderControlSet.java | 11 +- .../todoroo/astrid/ui/ReminderControlSet.java | 33 +- .../astrid/ui/TimeDurationControlSet.java | 4 +- .../todoroo/astrid/ui/UrgencyControlSet.java | 34 +- 125 files changed, 2485 insertions(+), 659 deletions(-) create mode 100644 astrid/plugin-src/com/todoroo/astrid/timers/TimerActionControlSet.java create mode 100644 astrid/res/drawable/edit_title_background.xml create mode 100644 astrid/res/drawable/footer_editbutton.xml create mode 100644 astrid/res/drawable/footer_editbutton_normal.png create mode 100644 astrid/res/drawable/footer_editbutton_pressed.png create mode 100644 astrid/res/drawable/icn_edit_calendar.png create mode 100644 astrid/res/drawable/icn_edit_hide.png create mode 100644 astrid/res/drawable/icn_edit_lists.png create mode 100644 astrid/res/drawable/icn_edit_notes.png create mode 100644 astrid/res/drawable/icn_edit_priority.png create mode 100644 astrid/res/drawable/icn_edit_reminders.png create mode 100644 astrid/res/drawable/icn_edit_repeats.png create mode 100644 astrid/res/drawable/icn_edit_share.png create mode 100644 astrid/res/drawable/icn_edit_timer.png create mode 100644 astrid/res/drawable/icn_edit_when.png create mode 100644 astrid/res/drawable/icn_edit_who.png create mode 100644 astrid/res/drawable/icn_timer_start.png create mode 100644 astrid/res/drawable/icn_timer_stop.png create mode 100644 astrid/res/drawable/importance_background_selected.xml create mode 100644 astrid/res/drawable/importance_title_1.xml create mode 100644 astrid/res/drawable/importance_title_2.xml create mode 100644 astrid/res/drawable/importance_title_3.xml create mode 100644 astrid/res/drawable/importance_title_4.xml create mode 100644 astrid/res/drawable/importance_title_5.xml create mode 100644 astrid/res/drawable/importance_title_6.xml delete mode 100644 astrid/res/layout/alarm_control.xml create mode 100644 astrid/res/layout/control_set_alarms.xml create mode 100644 astrid/res/layout/control_set_assigned.xml create mode 100644 astrid/res/layout/control_set_assigned_display.xml create mode 100644 astrid/res/layout/control_set_collaborators.xml create mode 100644 astrid/res/layout/control_set_collaborators_display.xml create mode 100644 astrid/res/layout/control_set_gcal.xml create mode 100644 astrid/res/layout/control_set_gcal_display.xml create mode 100644 astrid/res/layout/control_set_hide.xml create mode 100644 astrid/res/layout/control_set_hide_display.xml create mode 100644 astrid/res/layout/control_set_importance.xml create mode 100644 astrid/res/layout/control_set_notes.xml create mode 100644 astrid/res/layout/control_set_notes_display.xml rename astrid/res/layout/{opencrx_control.xml => control_set_opencrx.xml} (84%) create mode 100644 astrid/res/layout/control_set_opencrx_display.xml rename astrid/res/layout/{producteev_control.xml => control_set_producteev.xml} (77%) create mode 100644 astrid/res/layout/control_set_producteev_display.xml create mode 100644 astrid/res/layout/control_set_reminders.xml create mode 100644 astrid/res/layout/control_set_reminders_display.xml rename astrid/res/layout/{repeat_control.xml => control_set_repeat.xml} (76%) create mode 100644 astrid/res/layout/control_set_repeat_display.xml create mode 100644 astrid/res/layout/control_set_tags.xml create mode 100644 astrid/res/layout/control_set_tags_display.xml rename astrid/res/layout/{timer_control.xml => control_set_timers.xml} (66%) create mode 100644 astrid/res/layout/control_set_timers_extras_display.xml create mode 100644 astrid/res/layout/control_set_title.xml create mode 100644 astrid/res/layout/control_set_urgency.xml delete mode 100644 astrid/res/layout/gcal_control.xml create mode 100644 astrid/res/layout/popup_control_set_activity.xml create mode 100644 astrid/res/layout/task_edit_activity_new.xml create mode 100644 astrid/res/layout/task_edit_arrow.xml create mode 100644 astrid/res/layout/task_edit_when_controls.xml create mode 100644 astrid/src/com/todoroo/astrid/helper/TaskEditControlSet.java create mode 100644 astrid/src/com/todoroo/astrid/ui/EditNotesControlSet.java create mode 100644 astrid/src/com/todoroo/astrid/ui/EditTitleControlSet.java create mode 100644 astrid/src/com/todoroo/astrid/ui/PopupControlSet.java diff --git a/astrid/AndroidManifest.xml b/astrid/AndroidManifest.xml index bd80f9555..1722bc8e8 100644 --- a/astrid/AndroidManifest.xml +++ b/astrid/AndroidManifest.xml @@ -81,7 +81,8 @@ + android:windowSoftInputMode="stateHidden" + android:screenOrientation="portrait"> @@ -145,7 +146,7 @@ - + @@ -348,13 +349,13 @@ android:windowSoftInputMode="stateHidden"/> - + @@ -500,22 +501,22 @@ - + - + diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmPreferences.java b/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmPreferences.java index 4cc89bcc9..c44221bfc 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmPreferences.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmPreferences.java @@ -1,5 +1,8 @@ package com.todoroo.astrid.actfm; +import android.content.res.Resources; +import android.preference.Preference; + import com.timsu.astrid.R; import com.todoroo.andlib.service.Autowired; import com.todoroo.astrid.actfm.sync.ActFmPreferenceService; @@ -45,4 +48,18 @@ public class ActFmPreferences extends SyncProviderPreferences { new ActFmBackgroundService().scheduleService(); } + @Override + public void updatePreferences(Preference preference, Object value) { + final Resources r = getResources(); + + if (r.getString(R.string.actfm_https_key).equals(preference.getKey())) { + if ((Boolean)value) + preference.setSummary(R.string.actfm_https_enabled); + else + preference.setSummary(R.string.actfm_https_disabled); + } else { + super.updatePreferences(preference, value); + } + } + } \ No newline at end of file diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/EditPeopleControlSet.java b/astrid/plugin-src/com/todoroo/astrid/actfm/EditPeopleControlSet.java index 42dc548b5..6a4494487 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/EditPeopleControlSet.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/EditPeopleControlSet.java @@ -12,19 +12,22 @@ import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; import android.app.ProgressDialog; import android.content.Intent; import android.graphics.Color; import android.text.TextUtils; +import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; -import android.widget.AdapterView.OnItemSelectedListener; +import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.EditText; import android.widget.LinearLayout; -import android.widget.Spinner; +import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; @@ -39,7 +42,6 @@ import com.todoroo.astrid.actfm.sync.ActFmInvoker; import com.todoroo.astrid.actfm.sync.ActFmPreferenceService; import com.todoroo.astrid.actfm.sync.ActFmSyncService; import com.todoroo.astrid.actfm.sync.ActFmSyncService.JsonHelper; -import com.todoroo.astrid.activity.TaskEditActivity.TaskEditControlSet; import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; import com.todoroo.astrid.data.Metadata; @@ -54,9 +56,10 @@ import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.tags.TagService; import com.todoroo.astrid.ui.PeopleContainer; import com.todoroo.astrid.ui.PeopleContainer.OnAddNewPersonListener; +import com.todoroo.astrid.ui.PopupControlSet; import com.todoroo.astrid.utility.Flags; -public class EditPeopleControlSet implements TaskEditControlSet { +public class EditPeopleControlSet extends PopupControlSet { public static final String EXTRA_TASK_ID = "task"; //$NON-NLS-1$ @@ -82,13 +85,19 @@ public class EditPeopleControlSet implements TaskEditControlSet { private final CheckBox cbTwitter; - private final Spinner assignedSpinner; + private final View sharedWithRow; - private final EditText assignedCustom; + private final View sharedWithView; + + private final Dialog sharedWithDialog; - private final ArrayList spinnerValues = new ArrayList(); + private final ListView assignedList; - private final Activity activity; + private final TextView assignedDisplay; + + private final EditText assignedCustom; + + private final ArrayList listValues = new ArrayList(); private String saveToast = null; @@ -100,16 +109,28 @@ public class EditPeopleControlSet implements TaskEditControlSet { // --- UI initialization - public EditPeopleControlSet(Activity activity, int loginRequestCode) { + public EditPeopleControlSet(Activity activity, int viewLayout, int displayViewLayout, int title, int loginRequestCode) { + super(activity, viewLayout, displayViewLayout, title); DependencyInjectionService.getInstance().inject(this); - this.activity = activity; this.loginRequestCode = loginRequestCode; - sharedWithContainer = (PeopleContainer) activity.findViewById(R.id.share_container); - assignedCustom = (EditText) activity.findViewById(R.id.assigned_custom); - assignedSpinner = (Spinner) activity.findViewById(R.id.assigned_spinner); - cbFacebook = (CheckBox) activity.findViewById(R.id.checkbox_facebook); - cbTwitter = (CheckBox) activity.findViewById(R.id.checkbox_twitter); + sharedWithRow = LayoutInflater.from(activity).inflate(R.layout.control_set_collaborators_display, null); + sharedWithView = LayoutInflater.from(activity).inflate(R.layout.control_set_collaborators, null); + sharedWithDialog = new AlertDialog.Builder(this.activity) + .setTitle(R.string.actfm_EPA_collaborators_header) + .setView(getSharedWithView()) + .setPositiveButton(android.R.string.ok, null).create(); + sharedWithDialog.setOwnerActivity(this.activity); + + 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); + + assignedDisplay = (TextView) getDisplayView().findViewById(R.id.assigned_display); + sharedWithContainer = (PeopleContainer) getSharedWithView().findViewById(R.id.share_container); + cbFacebook = (CheckBox) getSharedWithView().findViewById(R.id.checkbox_facebook); + cbTwitter = (CheckBox) getSharedWithView().findViewById(R.id.checkbox_twitter); sharedWithContainer.addPerson(""); //$NON-NLS-1$ setUpListeners(); @@ -121,6 +142,14 @@ public class EditPeopleControlSet implements TaskEditControlSet { setUpData(); } + public View getSharedWithRow() { + return sharedWithRow; + } + + private View getSharedWithView() { + return sharedWithView; + } + @SuppressWarnings("nls") private void setUpData() { try { @@ -197,7 +226,7 @@ public class EditPeopleControlSet implements TaskEditControlSet { @Override public void run() { HashSet userIds = new HashSet(); - LinearLayout collaborators = (LinearLayout) activity.findViewById(R.id.collaborators); + LinearLayout collaborators = (LinearLayout) getSharedWithView().findViewById(R.id.collaborators); for(JSONObject person : sharedPeople) { if(person == null) @@ -256,7 +285,7 @@ public class EditPeopleControlSet implements TaskEditControlSet { sharedPeople.add(0, myself); // de-duplicate by user id and/or email - spinnerValues.clear(); + listValues.clear(); for(int i = 0; i < sharedPeople.size(); i++) { JSONObject person = sharedPeople.get(i); if(person == null) @@ -275,7 +304,7 @@ public class EditPeopleControlSet implements TaskEditControlSet { if(id == 0) name = activity.getString(R.string.actfm_EPA_assign_me); AssignedToUser atu = new AssignedToUser(name, person); - spinnerValues.add(atu); + listValues.add(atu); if(names.containsKey(name)) { AssignedToUser user = names.get(name); if(user != null && user.user.has("email")) { @@ -288,21 +317,19 @@ public class EditPeopleControlSet implements TaskEditControlSet { if(!TextUtils.isEmpty("email")) atu.label = email; else - spinnerValues.remove(atu); + listValues.remove(atu); } else names.put(name, atu); } - spinnerValues.add(new AssignedToUser(activity.getString(R.string.actfm_EPA_assign_custom), null)); - String assignedStr = task.getValue(Task.USER); int assignedIndex = 0; if (!TextUtils.isEmpty(assignedStr)) { JSONObject assigned = new JSONObject(assignedStr); long assignedId = assigned.optLong("id", -1); String assignedEmail = assigned.optString("email"); - for (int i = 0; i < spinnerValues.size(); i++) { - JSONObject user = spinnerValues.get(i).user; + 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; @@ -312,59 +339,59 @@ public class EditPeopleControlSet implements TaskEditControlSet { final int selected = assignedIndex; final ArrayAdapter usersAdapter = new ArrayAdapter(activity, - android.R.layout.simple_spinner_item, spinnerValues); - usersAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + android.R.layout.simple_list_item_single_choice, listValues); activity.runOnUiThread(new Runnable() { @Override public void run() { - assignedSpinner.setAdapter(usersAdapter); - assignedSpinner.setSelection(selected); + assignedList.setAdapter(usersAdapter); + assignedList.setItemChecked(selected, true); + refreshDisplayView(); } }); } private void setUpListeners() { - final View assignedClear = activity.findViewById(R.id.assigned_clear); + final View assignedClear = getView().findViewById(R.id.assigned_clear); - assignedSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { + assignedList.setOnItemClickListener(new OnItemClickListener() { @Override - public void onItemSelected(AdapterView parent, View v, - int index, long id) { - if(index == spinnerValues.size() - 1) { - assignedCustom.setVisibility(View.VISIBLE); - assignedClear.setVisibility(View.VISIBLE); - assignedSpinner.setVisibility(View.GONE); - assignedCustom.requestFocus(); - } - } - @Override - public void onNothingSelected(AdapterView arg0) { - // + public void onItemClick(AdapterView arg0, View arg1, int position, + long id) { + AssignedToUser user = (AssignedToUser) assignedList.getAdapter().getItem(position); + assignedDisplay.setText(user.toString()); + assignedCustom.setText(""); + refreshDisplayView(); + DialogUtilities.dismissDialog(activity, dialog); } + }); assignedClear.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - assignedCustom.setVisibility(View.GONE); - assignedClear.setVisibility(View.GONE); - assignedCustom.setText(""); //$NON-NLS-1$ - assignedSpinner.setVisibility(View.VISIBLE); - assignedSpinner.setSelection(0); + assignedCustom.setText(""); + assignedList.setItemChecked(0, true); } }); sharedWithContainer.setOnAddNewPerson(new OnAddNewPersonListener() { @Override public void textChanged(String text) { - activity.findViewById(R.id.share_additional).setVisibility(View.VISIBLE); + getSharedWithView().findViewById(R.id.share_additional).setVisibility(View.VISIBLE); if(text.indexOf('@') > -1) { - activity.findViewById(R.id.tag_label).setVisibility(View.VISIBLE); - activity.findViewById(R.id.tag_name).setVisibility(View.VISIBLE); + 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(); + } + }); } // --- events @@ -390,11 +417,13 @@ public class EditPeopleControlSet implements TaskEditControlSet { try { JSONObject userJson = null; TextView assignedView = null; - if(assignedCustom.getVisibility() == View.VISIBLE) { + if(!TextUtils.isEmpty(assignedCustom.getText())) { userJson = PeopleContainer.createUserJson(assignedCustom); assignedView = assignedCustom; - } else if(assignedSpinner.getSelectedItem() != null) { - userJson = ((AssignedToUser) assignedSpinner.getSelectedItem()).user; + } else { + AssignedToUser item = (AssignedToUser) assignedList.getAdapter().getItem(assignedList.getCheckedItemPosition()); + if (item != null) + userJson = item.user; } if (userJson != null) { @@ -634,13 +663,13 @@ public class EditPeopleControlSet implements TaskEditControlSet { } } - String message = ((TextView) activity.findViewById(R.id.message)).getText().toString(); - if(!TextUtils.isEmpty(message) && activity.findViewById(R.id.share_additional).getVisibility() == View.VISIBLE) { + String message = ((TextView) getSharedWithView().findViewById(R.id.message)).getText().toString(); + if(!TextUtils.isEmpty(message) && getSharedWithView().findViewById(R.id.share_additional).getVisibility() == View.VISIBLE) { values.add("message"); values.add(message); } - String tag = ((TextView) activity.findViewById(R.id.tag_name)).getText().toString(); + String tag = ((TextView) getSharedWithView().findViewById(R.id.tag_name)).getText().toString(); if(!TextUtils.isEmpty(tag)) { values.add("tag"); values.add(tag); @@ -655,4 +684,16 @@ public class EditPeopleControlSet implements TaskEditControlSet { if(requestCode == loginRequestCode && resultCode == Activity.RESULT_OK) saveSharingSettings(saveToast); } + + @Override + protected void refreshDisplayView() { + if (!TextUtils.isEmpty(assignedCustom.getText())) { + assignedDisplay.setText(assignedCustom.getText()); + } else { + AssignedToUser user = (AssignedToUser) assignedList.getAdapter().getItem(assignedList.getCheckedItemPosition()); + if (user == null) + user = (AssignedToUser) assignedList.getAdapter().getItem(0); + assignedDisplay.setText(user.toString()); + } + } } diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/TagViewActivity.java b/astrid/plugin-src/com/todoroo/astrid/actfm/TagViewActivity.java index e2186d569..799bd4653 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/TagViewActivity.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/TagViewActivity.java @@ -218,6 +218,8 @@ public class TagViewActivity extends TaskListActivity { refreshData(false, false); Preferences.setLong(fetchKey, DateUtilities.now()); } + } else { + ((TextView)taskListView.findViewById(android.R.id.empty)).setText(R.string.TLA_no_items); } setUpMembersGallery(); @@ -281,8 +283,10 @@ public class TagViewActivity extends TaskListActivity { if(!bypassTagShow) tagShowThread.start(); - if(noRemoteId) + if(noRemoteId) { + ((TextView)taskListView.findViewById(android.R.id.empty)).setText(R.string.TLA_no_items); return; + } setUpMembersGallery(); actFmSyncService.fetchTasksForTag(tagData, manual, new Runnable() { diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmInvoker.java b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmInvoker.java index c1d10a6e9..f00ad03e6 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmInvoker.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmInvoker.java @@ -15,16 +15,18 @@ import org.json.JSONObject; import android.util.Log; +import com.timsu.astrid.R; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.RestClient; import com.todoroo.andlib.utility.Pair; +import com.todoroo.andlib.utility.Preferences; @SuppressWarnings("nls") public class ActFmInvoker { /** NOTE: these values are development values & will not work on production */ - private static final String URL = "http://10.0.2.2:3000/api/"; + private static final String URL = "//10.0.0.2:3000/api/"; private static final String APP_ID = "a4732a32859dbcd3e684331acd36432c"; private static final String APP_SECRET = "e389bfc82a0d932332f9a8bd8203735f"; @@ -187,7 +189,12 @@ public class ActFmInvoker { String url = URL; if (method.startsWith("/")) - url = url.replaceAll("/api/", ""); + url = url.replaceFirst("/api/", ""); + if (Preferences.getBoolean(R.string.actfm_https_key, false)) + url = "https:" + url; + else + url = "http:" + url; + StringBuilder requestBuilder = new StringBuilder(url).append(method).append('?'); StringBuilder sigBuilder = new StringBuilder(); for(Pair entry : params) { diff --git a/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmControlSet.java b/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmControlSet.java index ef0eccefe..f1a8d9fcd 100644 --- a/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmControlSet.java +++ b/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmControlSet.java @@ -6,7 +6,6 @@ import java.util.LinkedHashSet; import android.app.Activity; import android.view.LayoutInflater; import android.view.View; -import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageButton; import android.widget.LinearLayout; @@ -15,9 +14,9 @@ import com.timsu.astrid.R; import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.widget.DateControlSet; -import com.todoroo.astrid.activity.TaskEditActivity.TaskEditControlSet; import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Task; +import com.todoroo.astrid.helper.TaskEditControlSet; /** * Control set to manage adding and removing tags @@ -25,19 +24,19 @@ import com.todoroo.astrid.data.Task; * @author Tim Su * */ -public final class AlarmControlSet implements TaskEditControlSet { +public final class AlarmControlSet extends TaskEditControlSet { // --- instance variables private final LinearLayout alertsContainer; private final Activity activity; - public AlarmControlSet(Activity activity, ViewGroup parent) { - View v = LayoutInflater.from(activity).inflate(R.layout.alarm_control, parent, true); - + public AlarmControlSet(Activity activity, int layout) { + //View v = LayoutInflater.from(activity).inflate(R.layout.alarm_control, parent, true); + super(activity, layout); this.activity = activity; - this.alertsContainer = (LinearLayout) v.findViewById(R.id.alert_container); - v.findViewById(R.id.alarms_add).setOnClickListener(new View.OnClickListener() { + this.alertsContainer = (LinearLayout) getView().findViewById(R.id.alert_container); + getView().findViewById(R.id.alarms_add).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { addAlarm(new Date()); diff --git a/astrid/plugin-src/com/todoroo/astrid/core/CustomFilterActivity.java b/astrid/plugin-src/com/todoroo/astrid/core/CustomFilterActivity.java index 08d7eeef6..0f9e48230 100644 --- a/astrid/plugin-src/com/todoroo/astrid/core/CustomFilterActivity.java +++ b/astrid/plugin-src/com/todoroo/astrid/core/CustomFilterActivity.java @@ -205,7 +205,7 @@ public class CustomFilterActivity extends ListActivity { Integer.toString(Task.IMPORTANCE_NONE), }; String[] entries = new String[] { - "!!!!", "!!!", "!!", "!" + "!!!", "!!", "!", "o" }; ContentValues values = new ContentValues(); values.put(Task.IMPORTANCE.name, "?"); diff --git a/astrid/plugin-src/com/todoroo/astrid/core/LinkActionExposer.java b/astrid/plugin-src/com/todoroo/astrid/core/LinkActionExposer.java index ac2568e99..4f7e76cec 100644 --- a/astrid/plugin-src/com/todoroo/astrid/core/LinkActionExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/core/LinkActionExposer.java @@ -26,7 +26,7 @@ import com.todoroo.astrid.api.TaskDecoration; import com.todoroo.astrid.data.Task; /** - * Exposes {@link TaskDecoration} for timers + * Exposes {@link TaskDecoration} for phone numbers, emails, urls, etc * * @author Tim Su * diff --git a/astrid/plugin-src/com/todoroo/astrid/gcal/GCalControlSet.java b/astrid/plugin-src/com/todoroo/astrid/gcal/GCalControlSet.java index 0d49e07d1..dc8604796 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gcal/GCalControlSet.java +++ b/astrid/plugin-src/com/todoroo/astrid/gcal/GCalControlSet.java @@ -1,5 +1,8 @@ package com.todoroo.astrid.gcal; +import java.util.ArrayList; +import java.util.Collections; + import android.app.Activity; import android.content.ContentResolver; import android.content.ContentValues; @@ -8,16 +11,14 @@ import android.database.Cursor; import android.net.Uri; import android.text.TextUtils; import android.util.Log; -import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; -import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; -import android.widget.Button; -import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.CompoundButton.OnCheckedChangeListener; +import android.widget.LinearLayout; import android.widget.Spinner; +import android.widget.TextView; import android.widget.Toast; import com.timsu.astrid.R; @@ -25,11 +26,11 @@ import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.ExceptionService; import com.todoroo.andlib.utility.Preferences; -import com.todoroo.astrid.activity.TaskEditActivity.TaskEditControlSet; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.gcal.Calendars.CalendarResult; import com.todoroo.astrid.service.StatisticsConstants; import com.todoroo.astrid.service.StatisticsService; +import com.todoroo.astrid.ui.PopupControlSet; /** * Control Set for managing repeats @@ -37,7 +38,7 @@ import com.todoroo.astrid.service.StatisticsService; * @author Tim Su * */ -public class GCalControlSet implements TaskEditControlSet { +public class GCalControlSet extends PopupControlSet { // --- instance variables @@ -50,65 +51,39 @@ public class GCalControlSet implements TaskEditControlSet { private Task myTask; private final CalendarResult calendars; - private final CheckBox addToCalendar; + private boolean hasEvent = false; private final Spinner calendarSelector; - private final Button viewCalendarEvent; - public GCalControlSet(final Activity activity, ViewGroup parent) { + public GCalControlSet(final Activity activity, int viewLayout, int displayViewLayout, int title) { + super(activity, viewLayout, displayViewLayout, title); DependencyInjectionService.getInstance().inject(this); + ((LinearLayout) getDisplayView()).addView(getView()); //hack for spinner this.activity = activity; - LayoutInflater.from(activity).inflate(R.layout.gcal_control, parent, true); - - this.addToCalendar = (CheckBox) activity.findViewById(R.id.add_to_calendar); - this.calendarSelector = (Spinner) activity.findViewById(R.id.calendars); - this.viewCalendarEvent = (Button) activity.findViewById(R.id.view_calendar_event); + this.calendarSelector = (Spinner) getView().findViewById(R.id.calendars); calendars = Calendars.getCalendars(); + ArrayList items = new ArrayList(); + Collections.addAll(items, calendars.calendars); + items.add(0, activity.getString(R.string.gcal_TEA_nocal)); + ArrayAdapter adapter = new ArrayAdapter(activity, - android.R.layout.simple_spinner_item, calendars.calendars); + android.R.layout.simple_spinner_item, items.toArray(new String[items.size()])); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + calendarSelector.setPromptId(title); calendarSelector.setAdapter(adapter); calendarSelector.setSelection(calendars.defaultIndex); - - addToCalendar.setOnCheckedChangeListener(new OnCheckedChangeListener() { + calendarSelector.setOnItemSelectedListener(new OnItemSelectedListener() { @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - calendarSelector.setVisibility(isChecked ? View.VISIBLE : View.GONE); + public void onItemSelected(AdapterView arg0, View arg1, + int arg2, long arg3) { + refreshDisplayView(); } - }); - viewCalendarEvent.setOnClickListener(new OnClickListener() { - @SuppressWarnings("nls") @Override - public void onClick(View v) { - if(calendarUri == null) - return; - - ContentResolver cr = activity.getContentResolver(); - Cursor cursor = cr.query(calendarUri, new String[] { "dtstart", "dtend" }, - null, null, null); - - Intent intent = new Intent(Intent.ACTION_EDIT, calendarUri); - try { - if(cursor == null || cursor.getCount() == 0) { - // event no longer exists, recreate it - calendarUri = null; - writeToModel(myTask); - return; - } - cursor.moveToFirst(); - intent.putExtra("beginTime", cursor.getLong(0)); - intent.putExtra("endTime", cursor.getLong(1)); - } catch (Exception e) { - Log.e("gcal-error", "Error opening calendar", e); //$NON-NLS-1$ //$NON-NLS-2$ - Toast.makeText(activity, R.string.gcal_TEA_error, Toast.LENGTH_LONG); - } finally { - if(cursor != null) - cursor.close(); - } - - activity.startActivity(intent); + public void onNothingSelected(AdapterView arg0) { + //nothing } }); } @@ -131,14 +106,13 @@ public class GCalControlSet implements TaskEditControlSet { return; } - addToCalendar.setVisibility(View.GONE); - calendarSelector.setVisibility(View.GONE); - viewCalendarEvent.setVisibility(View.VISIBLE); + hasEvent = true; } catch (Exception e) { exceptionService.reportError("unable-to-parse-calendar: " + //$NON-NLS-1$ task.getValue(Task.CALENDAR_URI), e); } } + refreshDisplayView(); } @SuppressWarnings("nls") @@ -146,7 +120,7 @@ public class GCalControlSet implements TaskEditControlSet { public String writeToModel(Task task) { boolean gcalCreateEventEnabled = Preferences.getStringValue(R.string.gcal_p_default) != null && !Preferences.getStringValue(R.string.gcal_p_default).equals("-1"); - if ((gcalCreateEventEnabled || addToCalendar.isChecked()) && + if ((gcalCreateEventEnabled || calendarSelector.getSelectedItemPosition() != 0) && calendarUri == null) { StatisticsService.reportEvent(StatisticsConstants.CREATE_CALENDAR_EVENT); @@ -154,13 +128,13 @@ public class GCalControlSet implements TaskEditControlSet { ContentResolver cr = activity.getContentResolver(); ContentValues values = new ContentValues(); - String calendarId = calendars.calendarIds[calendarSelector.getSelectedItemPosition()]; + String calendarId = calendars.calendarIds[calendarSelector.getSelectedItemPosition() - 1]; values.put("calendar_id", calendarId); calendarUri = GCalHelper.createTaskEvent(task, cr, values); task.setValue(Task.CALENDAR_URI, calendarUri.toString()); - if (addToCalendar.isChecked() && addToCalendar.isShown()) { + if (calendarSelector.getSelectedItemPosition() != 0 && !hasEvent) { // pop up the new event Intent intent = new Intent(Intent.ACTION_EDIT, calendarUri); intent.putExtra("beginTime", values.getAsLong("dtstart")); @@ -196,4 +170,64 @@ public class GCalControlSet implements TaskEditControlSet { return null; } + + private void viewCalendarEvent() { + if(calendarUri == null) + return; + + ContentResolver cr = activity.getContentResolver(); + Cursor cursor = cr.query(calendarUri, new String[] { "dtstart", "dtend" }, + null, null, null); + + Intent intent = new Intent(Intent.ACTION_EDIT, calendarUri); + try { + if(cursor == null || cursor.getCount() == 0) { + // event no longer exists, recreate it + calendarUri = null; + writeToModel(myTask); + return; + } + cursor.moveToFirst(); + intent.putExtra("beginTime", cursor.getLong(0)); + intent.putExtra("endTime", cursor.getLong(1)); + } catch (Exception e) { + Log.e("gcal-error", "Error opening calendar", e); //$NON-NLS-1$ //$NON-NLS-2$ + Toast.makeText(activity, R.string.gcal_TEA_error, Toast.LENGTH_LONG); + } finally { + if(cursor != null) + cursor.close(); + } + + activity.startActivity(intent); + } + + @Override + protected void refreshDisplayView() { + TextView t = (TextView) getDisplayView().findViewById(R.id.calendar_display_title); + if (hasEvent) { + t.setText(R.string.gcal_TEA_showCalendar_label); + } else { + t.setText(R.string.gcal_TEA_addToCalendar_label); + TextView calendar = (TextView) getDisplayView().findViewById(R.id.calendar_display_which); + if (calendarSelector.getSelectedItemPosition() != 0) { + calendar.setText((String)calendarSelector.getSelectedItem()); + } else { + calendar.setText(""); + } + } + } + + @Override + protected OnClickListener getDisplayClickListener() { + return new OnClickListener() { + @Override + public void onClick(View v) { + if (!hasEvent) { + calendarSelector.performClick(); + } else { + viewCalendarEvent(); + } + } + }; + } } \ No newline at end of file diff --git a/astrid/plugin-src/com/todoroo/astrid/opencrx/OpencrxControlSet.java b/astrid/plugin-src/com/todoroo/astrid/opencrx/OpencrxControlSet.java index 4a9b6662d..0d508bad9 100644 --- a/astrid/plugin-src/com/todoroo/astrid/opencrx/OpencrxControlSet.java +++ b/astrid/plugin-src/com/todoroo/astrid/opencrx/OpencrxControlSet.java @@ -4,9 +4,7 @@ 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.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; @@ -22,7 +20,6 @@ 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; @@ -30,6 +27,7 @@ import com.todoroo.astrid.data.MetadataApiDao.MetadataCriteria; import com.todoroo.astrid.data.StoreObject; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.service.MetadataService; +import com.todoroo.astrid.ui.PopupControlSet; /** * Control Set for managing contact/creator assignments in OpenCRX @@ -37,7 +35,7 @@ import com.todoroo.astrid.service.MetadataService; * @author Andrey Marchenko * */ -public class OpencrxControlSet implements TaskEditControlSet { +public class OpencrxControlSet extends PopupControlSet { /** * Class that represents OpenCRX ActivityCreator. Duplicates some functionality of OpenCRX plugin. @@ -203,22 +201,23 @@ public class OpencrxControlSet implements TaskEditControlSet { private StoreObjectDao storeObjectDao; @SuppressWarnings("unused") - public OpencrxControlSet(final Activity activity, ViewGroup parent) { + public OpencrxControlSet(final Activity activity, int viewLayout, int displayViewLayout, int title) { + super(activity, viewLayout, displayViewLayout, title); DependencyInjectionService.getInstance().inject(this); this.activity = activity; - View view = LayoutInflater.from(activity).inflate(R.layout.opencrx_control, parent, true); + //View view = LayoutInflater.from(activity).inflate(R.layout.opencrx_control, parent, true); - this.assignedToSelector = (Spinner) activity.findViewById(R.id.opencrx_TEA_task_assign); + this.assignedToSelector = (Spinner) getView().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.creatorSelector = (Spinner) getView().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); + this.assignedToTextInput = (AutoCompleteTextView) getView().findViewById(R.id.opencrx_TEA_contact_textinput); + this.creatorTextInput = (AutoCompleteTextView) getView().findViewById(R.id.opencrx_TEA_creator_textinput); } @@ -403,4 +402,9 @@ public class OpencrxControlSet implements TaskEditControlSet { return ret; } + @Override + protected void refreshDisplayView() { + // Nothing to do + } + } \ No newline at end of file diff --git a/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevControlSet.java b/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevControlSet.java index be7208fc4..14a773a68 100644 --- a/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevControlSet.java +++ b/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevControlSet.java @@ -9,9 +9,7 @@ import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.util.Log; -import android.view.LayoutInflater; import android.view.View; -import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; @@ -26,7 +24,6 @@ import com.todoroo.andlib.service.ExceptionService; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.andlib.utility.Preferences; -import com.todoroo.astrid.activity.TaskEditActivity.TaskEditControlSet; import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.StoreObject; import com.todoroo.astrid.data.Task; @@ -36,6 +33,7 @@ import com.todoroo.astrid.producteev.sync.ProducteevSyncProvider; import com.todoroo.astrid.producteev.sync.ProducteevTask; import com.todoroo.astrid.producteev.sync.ProducteevUser; import com.todoroo.astrid.service.MetadataService; +import com.todoroo.astrid.ui.PopupControlSet; /** * Control Set for managing task/dashboard assignments in Producteev @@ -43,13 +41,13 @@ import com.todoroo.astrid.service.MetadataService; * @author Arne Jans * */ -public class ProducteevControlSet implements TaskEditControlSet { +public class ProducteevControlSet extends PopupControlSet { // --- instance variables private final Activity activity; - private final View view; + //private final View view; private Task myTask; private final Spinner responsibleSelector; private final Spinner dashboardSelector; @@ -62,19 +60,20 @@ public class ProducteevControlSet implements TaskEditControlSet { private int lastDashboardSelection = 0; - public ProducteevControlSet(final Activity activity, ViewGroup parent) { + public ProducteevControlSet(final Activity activity, int layout, int displayViewLayout, int title) { + super(activity, layout, displayViewLayout, title); DependencyInjectionService.getInstance().inject(this); this.activity = activity; - view = LayoutInflater.from(activity).inflate(R.layout.producteev_control, parent, true); + //view = LayoutInflater.from(activity).inflate(R.layout.producteev_control, parent, true); - this.responsibleSelector = (Spinner) activity.findViewById(R.id.producteev_TEA_task_assign); + this.responsibleSelector = (Spinner) getView().findViewById(R.id.producteev_TEA_task_assign); TextView emptyView = new TextView(activity); emptyView.setText(activity.getText(R.string.producteev_no_dashboard)); responsibleSelector.setEmptyView(emptyView); - this.dashboardSelector = (Spinner) activity.findViewById(R.id.producteev_TEA_dashboard_assign); + this.dashboardSelector = (Spinner) getView().findViewById(R.id.producteev_TEA_dashboard_assign); this.dashboardSelector.setOnItemSelectedListener(new OnItemSelectedListener() { @Override @@ -176,7 +175,7 @@ public class ProducteevControlSet implements TaskEditControlSet { int visibility = newUsers == null ? View.GONE : View.VISIBLE; - view.findViewById(R.id.producteev_TEA_task_assign_label).setVisibility(visibility); + getView().findViewById(R.id.producteev_TEA_task_assign_label).setVisibility(visibility); responsibleSelector.setVisibility(visibility); int responsibleSpinnerIndex = 0; @@ -233,7 +232,7 @@ public class ProducteevControlSet implements TaskEditControlSet { || ownerDashboard.getId() == ProducteevUtilities.DASHBOARD_CREATE) { responsibleSelector.setEnabled(false); responsibleSelector.setAdapter(null); - view.findViewById(R.id.producteev_TEA_task_assign_label).setVisibility(View.GONE); + getView().findViewById(R.id.producteev_TEA_task_assign_label).setVisibility(View.GONE); return; } @@ -275,4 +274,10 @@ public class ProducteevControlSet implements TaskEditControlSet { } return null; } + + @Override + protected void refreshDisplayView() { + // TODO Auto-generated method stub + + } } \ No newline at end of file diff --git a/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatControlSet.java b/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatControlSet.java index a84a1a543..7cc807a48 100644 --- a/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatControlSet.java +++ b/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatControlSet.java @@ -6,19 +6,19 @@ import java.util.Calendar; import java.util.Date; import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; import android.text.TextUtils; -import android.view.LayoutInflater; import android.view.View; -import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; -import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.LinearLayout; import android.widget.Spinner; +import android.widget.TextView; import com.google.ical.values.Frequency; import com.google.ical.values.RRule; @@ -28,13 +28,13 @@ import com.timsu.astrid.R; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.ExceptionService; -import com.todoroo.astrid.activity.TaskEditActivity.TaskEditControlSet; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.service.StatisticsConstants; import com.todoroo.astrid.service.StatisticsService; import com.todoroo.astrid.ui.NumberPicker; import com.todoroo.astrid.ui.NumberPickerDialog; import com.todoroo.astrid.ui.NumberPickerDialog.OnNumberPickedListener; +import com.todoroo.astrid.ui.PopupControlSet; /** * Control Set for managing repeats @@ -42,7 +42,7 @@ import com.todoroo.astrid.ui.NumberPickerDialog.OnNumberPickedListener; * @author Tim Su * */ -public class RepeatControlSet implements TaskEditControlSet { +public class RepeatControlSet extends PopupControlSet { // --- spinner constants @@ -59,7 +59,8 @@ public class RepeatControlSet implements TaskEditControlSet { // --- instance variables private final Activity activity; - private final CheckBox enabled; + //private final CheckBox enabled; + private boolean doRepeat = true; private final Button value; private final Spinner interval; private final Spinner type; @@ -75,18 +76,17 @@ public class RepeatControlSet implements TaskEditControlSet { // --- implementation - public RepeatControlSet(final Activity activity, ViewGroup parent) { + public RepeatControlSet(Activity activity, int viewLayout, int displayViewLayout, int title) { + super(activity, viewLayout, displayViewLayout, title); DependencyInjectionService.getInstance().inject(this); this.activity = activity; - LayoutInflater.from(activity).inflate(R.layout.repeat_control, parent, true); - - enabled = (CheckBox) activity.findViewById(R.id.repeatEnabled); - value = (Button) activity.findViewById(R.id.repeatValue); - interval = (Spinner) activity.findViewById(R.id.repeatInterval); - type = (Spinner) activity.findViewById(R.id.repeatType); - repeatContainer = (LinearLayout) activity.findViewById(R.id.repeatContainer); - daysOfWeekContainer = (LinearLayout) activity.findViewById(R.id.repeatDayOfWeekContainer); + + value = (Button) getView().findViewById(R.id.repeatValue); + interval = (Spinner) getView().findViewById(R.id.repeatInterval); + type = (Spinner) getView().findViewById(R.id.repeatType); + repeatContainer = (LinearLayout) getView().findViewById(R.id.repeatContainer); + daysOfWeekContainer = (LinearLayout) getView().findViewById(R.id.repeatDayOfWeekContainer); setRepeatValue(1); // set up days of week @@ -109,12 +109,6 @@ public class RepeatControlSet implements TaskEditControlSet { } // set up listeners - enabled.setOnCheckedChangeListener(new OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - repeatContainer.setVisibility(isChecked ? View.VISIBLE : View.GONE); - } - }); value.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { repeatValueClick(); @@ -233,21 +227,22 @@ public class RepeatControlSet implements TaskEditControlSet { exceptionService.reportError("repeat-parse-exception", e); } } - enabled.setChecked(recurrence.length() > 0); - repeatContainer.setVisibility(enabled.isChecked() ? View.VISIBLE : View.GONE); + doRepeat = recurrence.length() > 0; // read flag if(task.getFlag(Task.FLAGS, Task.FLAG_REPEAT_AFTER_COMPLETION)) type.setSelection(TYPE_COMPLETION_DATE); else type.setSelection(TYPE_DUE_DATE); + + refreshDisplayView(); } @Override public String writeToModel(Task task) { String result; - if(!enabled.isChecked()) + if(!doRepeat) result = ""; //$NON-NLS-1$ else { if(TextUtils.isEmpty(task.getValue(Task.RECURRENCE))) { @@ -300,4 +295,36 @@ public class RepeatControlSet implements TaskEditControlSet { type.setSelection(1); return null; } + + @Override + protected void refreshDisplayView() { + TextView repeatDisplay = (TextView) getDisplayView().findViewById(R.id.repeat_display); + if (doRepeat) { + repeatDisplay.setText(R.string.repeat_enabled); + } else { + repeatDisplay.setText(R.string.repeat_never); + } + } + + @Override + protected AlertDialog.Builder getDialogBuilder(int title, DialogInterface.OnClickListener okListener, DialogInterface.OnCancelListener cancelListener) { + DialogInterface.OnClickListener dontRepeatButton = new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + doRepeat = false; + refreshDisplayView(); + } + }; + + DialogInterface.OnClickListener doRepeatButton = new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + doRepeat = true; + refreshDisplayView(); + } + }; + return super.getDialogBuilder(title, okListener, cancelListener) + .setNegativeButton(R.string.repeat_dont, dontRepeatButton) + .setPositiveButton(android.R.string.ok, doRepeatButton); + } } \ No newline at end of file diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagsControlSet.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagsControlSet.java index 3adc067f6..09a3764f1 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/TagsControlSet.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/TagsControlSet.java @@ -1,7 +1,7 @@ package com.todoroo.astrid.tags; import java.util.ArrayList; -import java.util.Arrays; +import java.util.HashMap; import java.util.LinkedHashSet; import android.app.Activity; @@ -11,27 +11,23 @@ import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.inputmethod.EditorInfo; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.ImageButton; import android.widget.LinearLayout; -import android.widget.Spinner; +import android.widget.ListView; import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; import com.timsu.astrid.R; import com.todoroo.andlib.data.AbstractModel; import com.todoroo.andlib.data.TodorooCursor; -import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.utility.DateUtilities; -import com.todoroo.astrid.activity.TaskEditActivity.TaskEditControlSet; import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Task; -import com.todoroo.astrid.service.TagDataService; import com.todoroo.astrid.tags.TagService.Tag; +import com.todoroo.astrid.ui.PopupControlSet; import com.todoroo.astrid.utility.Flags; /** @@ -40,52 +36,41 @@ import com.todoroo.astrid.utility.Flags; * @author Tim Su * */ -public final class TagsControlSet implements TaskEditControlSet { +public final class TagsControlSet extends PopupControlSet { // --- instance variables - private final Spinner tagSpinner; - @Autowired private TagDataService tagDataService; + //private final Spinner tagSpinner; + //@Autowired private TagDataService tagDataService; private final TagService tagService = TagService.getInstance(); private final Tag[] allTags; - private final LinearLayout tagsContainer; + private final String[] allTagNames; + + private final LinearLayout newTags; + private final ListView selectedTags; + private boolean populated = false; + private final HashMap tagIndices; + + //private final LinearLayout tagsContainer; private final Activity activity; + private final TextView tagsDisplay; - public TagsControlSet(Activity activity, int tagsContainer) { + public TagsControlSet(Activity activity, int viewLayout, int displayViewLayout, int title) { + super(activity, viewLayout, displayViewLayout, title); DependencyInjectionService.getInstance().inject(this); - allTags = getTagArray(); this.activity = activity; - this.tagsContainer = (LinearLayout) activity.findViewById(tagsContainer); - this.tagSpinner = (Spinner) activity.findViewById(R.id.tags_dropdown); + allTags = getTagArray(); + allTagNames = getTagNames(allTags); + tagIndices = buildTagIndices(allTagNames); - if(allTags.length == 0) { - tagSpinner.setVisibility(View.GONE); - } else { - ArrayList dropDownList = new ArrayList(Arrays.asList(allTags)); - dropDownList.add(0, new Tag(activity.getString(R.string.TEA_tag_dropdown), 0, 0)); - ArrayAdapter tagAdapter = new ArrayAdapter(activity, - android.R.layout.simple_spinner_item, - dropDownList); - tagAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - tagSpinner.setAdapter(tagAdapter); - tagSpinner.setSelection(0); - - tagSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView arg0, View arg1, - int position, long arg3) { - if(position == 0 || position > allTags.length) - return; - addTag(allTags[position - 1].tag, true); - tagSpinner.setSelection(0); - } + selectedTags = (ListView) getView().findViewById(R.id.existingTags); + selectedTags.setAdapter(new ArrayAdapter(activity, + android.R.layout.simple_list_item_multiple_choice, allTagNames)); + selectedTags.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); - @Override - public void onNothingSelected(AdapterView arg0) { - // nothing! - } - }); - } + this.newTags = (LinearLayout) getView().findViewById(R.id.newTags); + + tagsDisplay = (TextView) getDisplayView().findViewById(R.id.tags_display); } private Tag[] getTagArray() { @@ -93,45 +78,58 @@ public final class TagsControlSet implements TaskEditControlSet { return tagsList.toArray(new Tag[tagsList.size()]); } - @Override - public void readFromTask(Task task) { - tagsContainer.removeAllViews(); + private HashMap buildTagIndices(String[] tagNames) { + HashMap indices = new HashMap(); + for (int i = 0; i < tagNames.length; i++) { + indices.put(tagNames[i], i); + } + return indices; + } - if(task.getId() != AbstractModel.NO_ID) { - TodorooCursor cursor = tagService.getTags(task.getId()); - try { - for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { - String tag = cursor.get(TagService.TAG); - addTag(tag, true); - } - } finally { - cursor.close(); - } + private String[] getTagNames(Tag[] tags) { + String[] names = new String[tags.length]; + for (int i = 0; i < tags.length; i++) { + names[i] = tags[i].toString(); } - addTag("", false); //$NON-NLS-1$ + return names; } - @Override - public String writeToModel(Task task) { - // this is a case where we're asked to save but the UI was not yet populated - if(tagsContainer.getChildCount() == 0) - return null; + private String buildTagString() { + StringBuilder builder = new StringBuilder(); + LinkedHashSet tags = getTagSet(); + for (String tag : tags) { + if (builder.length() != 0) + builder.append(", "); + builder.append(tag); + } + + if (builder.length() == 0) + builder.append(activity.getString(R.string.TEA_tags_none)); + return builder.toString(); + } + + + private void setTagSelected(String tag) { + int index = tagIndices.get(tag); + selectedTags.setItemChecked(index, true); + } + + private LinkedHashSet getTagSet() { LinkedHashSet tags = new LinkedHashSet(); - for(int i = 0; i < tagsContainer.getChildCount(); i++) { - TextView tagName = (TextView)tagsContainer.getChildAt(i).findViewById(R.id.text1); + for(int i = 0; i < selectedTags.getAdapter().getCount(); i++) { + if (selectedTags.isItemChecked(i)) + tags.add(allTagNames[i]); + } + + for(int i = 0; i < newTags.getChildCount(); i++) { + TextView tagName = (TextView) newTags.getChildAt(i).findViewById(R.id.text1); if(tagName.getText().length() == 0) continue; tags.add(tagName.getText().toString()); } - - if(TagService.getInstance().synchronizeTags(task.getId(), tags)) { - Flags.set(Flags.TAGS_CHANGED); - task.setValue(Task.MODIFICATION_DATE, DateUtilities.now()); - } - - return null; + return tags; } /** Adds a tag to the tag field */ @@ -140,8 +138,8 @@ public final class TagsControlSet implements TaskEditControlSet { // check if already exists TextView lastText = null; - for(int i = 0; i < tagsContainer.getChildCount(); i++) { - View view = tagsContainer.getChildAt(i); + for(int i = 0; i < newTags.getChildCount(); i++) { + View view = newTags.getChildAt(i); lastText = (TextView) view.findViewById(R.id.text1); if(lastText.getText().equals(tagName)) return false; @@ -152,7 +150,7 @@ public final class TagsControlSet implements TaskEditControlSet { tagItem = (View) lastText.getParent(); } else { tagItem = inflater.inflate(R.layout.tag_edit_row, null); - tagsContainer.addView(tagItem); + newTags.addView(tagItem); } if(tagName == null) tagName = ""; //$NON-NLS-1$ @@ -160,10 +158,6 @@ public final class TagsControlSet implements TaskEditControlSet { final AutoCompleteTextView textView = (AutoCompleteTextView)tagItem. findViewById(R.id.text1); textView.setText(tagName); - ArrayAdapter tagsAdapter = - new ArrayAdapter(activity, - android.R.layout.simple_dropdown_item_1line, allTags); - textView.setAdapter(tagsAdapter); textView.addTextChangedListener(new TextWatcher() { @Override @@ -178,7 +172,7 @@ public final class TagsControlSet implements TaskEditControlSet { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { - if(count > 0 && tagsContainer.getChildAt(tagsContainer.getChildCount()-1) == + if(count > 0 && newTags.getChildAt(newTags.getChildCount()-1) == tagItem) addTag("", false); //$NON-NLS-1$ } @@ -204,8 +198,8 @@ public final class TagsControlSet implements TaskEditControlSet { if(lastView == textView && textView.getText().length() == 0) return; - if(tagsContainer.getChildCount() > 1) - tagsContainer.removeView(tagItem); + if(newTags.getChildCount() > 1) + newTags.removeView(tagItem); else textView.setText(""); //$NON-NLS-1$ } @@ -219,10 +213,52 @@ public final class TagsControlSet implements TaskEditControlSet { * @return */ private TextView getLastTextView() { - if(tagsContainer.getChildCount() == 0) + if(newTags.getChildCount() == 0) return null; - View lastItem = tagsContainer.getChildAt(tagsContainer.getChildCount()-1); + View lastItem = newTags.getChildAt(newTags.getChildCount()-1); TextView lastText = (TextView) lastItem.findViewById(R.id.text1); return lastText; } + + @Override + public void readFromTask(Task task) { + newTags.removeAllViews(); + + if(task.getId() != AbstractModel.NO_ID) { + TodorooCursor cursor = tagService.getTags(task.getId()); + try { + for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { + String tag = cursor.get(TagService.TAG); + setTagSelected(tag); + } + } finally { + cursor.close(); + } + } + addTag("", false); + refreshDisplayView(); + populated = true; + } + + @Override + public String writeToModel(Task task) { + // this is a case where we're asked to save but the UI was not yet populated + if(!populated) + return null; + + LinkedHashSet tags = getTagSet(); + + if(TagService.getInstance().synchronizeTags(task.getId(), tags)) { + Flags.set(Flags.TAGS_CHANGED); + task.setValue(Task.MODIFICATION_DATE, DateUtilities.now()); + } + + return null; + } + + @Override + protected void refreshDisplayView() { + tagsDisplay.setText(buildTagString()); + } + } diff --git a/astrid/plugin-src/com/todoroo/astrid/timers/TimerActionControlSet.java b/astrid/plugin-src/com/todoroo/astrid/timers/TimerActionControlSet.java new file mode 100644 index 000000000..9e0b85395 --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/timers/TimerActionControlSet.java @@ -0,0 +1,81 @@ +package com.todoroo.astrid.timers; + +import android.app.Activity; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.Button; + +import com.timsu.astrid.R; +import com.todoroo.astrid.data.Task; +import com.todoroo.astrid.helper.TaskEditControlSet; + +public class TimerActionControlSet extends TaskEditControlSet { + + private final Button timerButton; + private boolean timerActive; + private final Activity activity; + private Task task; + private TimerStoppedListener listener; + + public TimerActionControlSet(Activity activity, View buttonParent) { + super(activity, -1); + this.activity = activity; + timerButton = (Button) buttonParent.findViewById(R.id.timer_button); + timerButton.setOnClickListener(timerListener); + } + + @Override + @SuppressWarnings("hiding") + public void readFromTask(Task task) { + if (task.getValue(Task.TIMER_START) == 0) + timerActive = false; + else + timerActive = true; + this.task = task; + updateDisplay(); + } + + @Override + @SuppressWarnings("hiding") + public String writeToModel(Task task) { + // Nothing to do here + return null; + } + + private final OnClickListener timerListener = new OnClickListener() { + @Override + public void onClick(View v) { + if (timerActive) { + TimerPlugin.updateTimer(activity, task, false); + if (listener != null) + listener.timerStopped(task); + } else { + TimerPlugin.updateTimer(activity, task, true); + } + timerActive = !timerActive; + updateDisplay(); + } + }; + + private void updateDisplay() { + final int drawable; + if(timerActive) { + drawable = R.drawable.icn_timer_stop; + } else { + if (task.getValue(Task.ELAPSED_SECONDS) == 0) + drawable = R.drawable.icn_edit_timer; + else + drawable = R.drawable.icn_timer_start; + } + + timerButton.setBackgroundResource(drawable); + } + + public interface TimerStoppedListener { + public void timerStopped(Task task); + } + + public void setListener(TimerStoppedListener listener) { + this.listener = listener; + } +} diff --git a/astrid/plugin-src/com/todoroo/astrid/timers/TimerControlSet.java b/astrid/plugin-src/com/todoroo/astrid/timers/TimerControlSet.java index d63ac66c3..d41b8cbcb 100644 --- a/astrid/plugin-src/com/todoroo/astrid/timers/TimerControlSet.java +++ b/astrid/plugin-src/com/todoroo/astrid/timers/TimerControlSet.java @@ -1,14 +1,14 @@ package com.todoroo.astrid.timers; import android.app.Activity; -import android.view.LayoutInflater; -import android.view.ViewGroup; +import android.view.View; import com.timsu.astrid.R; import com.todoroo.andlib.data.Property.IntegerProperty; -import com.todoroo.andlib.service.DependencyInjectionService; -import com.todoroo.astrid.activity.TaskEditActivity.TaskEditControlSet; import com.todoroo.astrid.data.Task; +import com.todoroo.astrid.helper.TaskEditControlSet; +import com.todoroo.astrid.timers.TimerActionControlSet.TimerStoppedListener; +import com.todoroo.astrid.ui.PopupControlSet; import com.todoroo.astrid.ui.TimeDurationControlSet; /** @@ -17,22 +17,17 @@ import com.todoroo.astrid.ui.TimeDurationControlSet; * @author Tim Su * */ -public class TimerControlSet implements TaskEditControlSet { - - private final Activity activity; +public class TimerControlSet extends PopupControlSet implements TimerStoppedListener { TaskEditControlSet estimated, elapsed; - public TimerControlSet(final Activity activity, ViewGroup parent) { - DependencyInjectionService.getInstance().inject(this); - - this.activity = activity; - LayoutInflater.from(activity).inflate(R.layout.timer_control, parent, true); + public TimerControlSet(final Activity activity, int viewLayout, int displayViewLayout, int title) { + super(activity, viewLayout, displayViewLayout, title); - estimated = new TimeDurationTaskEditControlSet(Task.ESTIMATED_SECONDS, + estimated = new TimeDurationTaskEditControlSet(activity, getView(), Task.ESTIMATED_SECONDS, R.id.estimatedDuration, 0, R.string.DLG_hour_minutes ); - elapsed = new TimeDurationTaskEditControlSet(Task.ELAPSED_SECONDS, R.id.elapsedDuration, + elapsed = new TimeDurationTaskEditControlSet(activity, getView(), Task.ELAPSED_SECONDS, R.id.elapsedDuration, 0, R.string.DLG_hour_minutes ); } @@ -57,14 +52,15 @@ public class TimerControlSet implements TaskEditControlSet { * @author Tim Su * */ - public class TimeDurationTaskEditControlSet implements TaskEditControlSet { + public class TimeDurationTaskEditControlSet extends TaskEditControlSet { private final TimeDurationControlSet controlSet; private final IntegerProperty property; - public TimeDurationTaskEditControlSet(IntegerProperty property, int timeButtonId, + public TimeDurationTaskEditControlSet(Activity activity, View v, IntegerProperty property, int timeButtonId, int prefixResource, int titleResource) { + super(activity, -1); this.property = property; - this.controlSet = new TimeDurationControlSet(activity, + this.controlSet = new TimeDurationControlSet(activity, v, timeButtonId, prefixResource, titleResource); } @@ -80,4 +76,14 @@ public class TimerControlSet implements TaskEditControlSet { } } + @Override + protected void refreshDisplayView() { + // Nothing to do here yet + } + + @Override + public void timerStopped(Task task) { + elapsed.readFromTask(task); + } + } \ No newline at end of file diff --git a/astrid/plugin-src/com/todoroo/astrid/timers/TimerPlugin.java b/astrid/plugin-src/com/todoroo/astrid/timers/TimerPlugin.java index d10e0e3aa..ba5be6137 100644 --- a/astrid/plugin-src/com/todoroo/astrid/timers/TimerPlugin.java +++ b/astrid/plugin-src/com/todoroo/astrid/timers/TimerPlugin.java @@ -56,6 +56,7 @@ public class TimerPlugin extends BroadcastReceiver { task.setValue(Task.TIMER_START, 0L); task.setValue(Task.ELAPSED_SECONDS, task.getValue(Task.ELAPSED_SECONDS) + newElapsed); + System.err.println("Elapsed: " + task.getValue(Task.ELAPSED_SECONDS)); StatisticsService.reportEvent(StatisticsConstants.TIMER_STOP); } } diff --git a/astrid/res/drawable/edit_title_background.xml b/astrid/res/drawable/edit_title_background.xml new file mode 100644 index 000000000..7307bf3ea --- /dev/null +++ b/astrid/res/drawable/edit_title_background.xml @@ -0,0 +1,14 @@ + + + + + + + diff --git a/astrid/res/drawable/footer_editbutton.xml b/astrid/res/drawable/footer_editbutton.xml new file mode 100644 index 000000000..0449aa4d1 --- /dev/null +++ b/astrid/res/drawable/footer_editbutton.xml @@ -0,0 +1,23 @@ + + + + + + + + + diff --git a/astrid/res/drawable/footer_editbutton_normal.png b/astrid/res/drawable/footer_editbutton_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..969be16380b3b6662bc0a587fb9bf7d87ec39b33 GIT binary patch literal 871 zcmV-t1DO1YP)3ro8h>LWCZfE&A1UqfAH(Y!)B zn|5Vfi9(Y>L@)?Vv|y2HMKE9kiT9=xn5K3Rl8LwQ|H18qbhXcm9E&g*TRTy;$SN$*oh=vYlPKDD84W-{5bs!~~Ov=LI zqReIIWM<|nB?Jc4Xnc~*%BF0ruS>Jp?0uaJcFovdI%HLU&Z;2h^La_0O;Sl<$eO>J zQYaLpq5|s6^g8D0zIRs-0-2SED=XbE+U*V%1codzKHkmP^Jh<0Fe|<6W%P$rePinb zJ+eM}{6ymMIF$n;mY$uJa`}a{TCK@cD%GgfYF@BY>RVR1H$N|lL_&4QHWdS+?wBfT zI&*8KQZIwWU?{sctvBtAv^$Kfz^LfV`JuG?cS=kDn3|eqj|4_YXD*n*{)-;zbQoKK z|LI65>5_nHp=6%~2ql1!PiN`Rdb06QhXP6;4_osv)j zrj4)clmO!^fUr(UC;`KEO2$`!P6>dW5;!^IE1eQBty8j70_>Ck*eQXNvr`gEz_js| zof2St1rXLL2_;}kDC_E2d%Iud{KO?H1B}RzZ@a+^9tx$WL%H49l5-a(s1z_FI&*;x z9tveio%Cb*lQM*XrfW?K`Stj!`*a=pAxjs;^$k&Oso1*^?uk((jhb>anUn z>p)&hrDby3QhVk_DhUke=iYbO*{;jhhj-mz_5!K8WbxQg`oXmQVA_-sh>Yh4(hGhW x3;PSdYcBcWw5TC4u(}_{Qm{J$FxVdf1^}Yg8+qmzC4c|`002ovPDHLkV1mVcgE9aB literal 0 HcmV?d00001 diff --git a/astrid/res/drawable/footer_editbutton_pressed.png b/astrid/res/drawable/footer_editbutton_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..a6e8da2eda9b2c2ef68794639d8b61af7318656c GIT binary patch literal 881 zcmV-%1CIQOP)nvUMx)VSg1`y09b3|>u~JZ#n)|fb-c0zrj$`Zn zV0=Q-ckhX1SxgS-v*h^;^3B^6Yp*hy$z)2N=eg~hQa@#tvDxck#SLLY0)yC?y1DX` zhs_3;+oKGhw2n?)5l*bY;OOR}D6^gSlxh7Xkw^$t0)rDa*Vf>nN2?rLfzx$3N}2>t z6^~c}^EV}{5-=-D?kNGYqNGW{xZ^8B0XV(_;P?u#DFJX#39u;va8C*R2gg^c1PnXA z0x<0ON|u0Oo02F2!|o{=3UHeEJSAZMreswDLl z0OoH>h5~SW1#o+-J)bD zfGJTH)s^=BUlNaxFd1M#e1A`3`wbq5($!JcKfRO2)HIU<21GY!?>BfL$`y4j)VE(s zkh&z6Z8I&P-$4d}=;rMG2BlS==Xq`>lUcC+%A{X!h%=F5VnCn$eDhr5J8#1+Stt}9 zbZ$y5uda>Zt#zr`LvrTwHL)x{2MwI~hOF1c-&~Us)mmG7a$r+N+w!y8mL+|Rb-sR- z>h1>#Vvf{D$JBAwVUj?Ps=hC^(v}1-R%Lj1yA`C`lB>-hVn_X9E|<%ymnC&&86(g) zZWN^3{${M(U#K`2)ysSoXPOxTJu5~ruBaH783*tW_$|Ny<%#x9Vv5G+00000NkvXX Hu0mjfF1nL0 literal 0 HcmV?d00001 diff --git a/astrid/res/drawable/icn_edit_calendar.png b/astrid/res/drawable/icn_edit_calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..90bb03c1071b956bdf62945bef099781fe52c680 GIT binary patch literal 1213 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 literal 0 HcmV?d00001 diff --git a/astrid/res/drawable/icn_edit_lists.png b/astrid/res/drawable/icn_edit_lists.png new file mode 100644 index 0000000000000000000000000000000000000000..623bf276a98432536e16dda592d148e74c3941d2 GIT binary patch literal 331 zcmV-R0kr;!P)k+;Rb-Q)kz1JwOL1SGPZ8>QQ2c!M;d*aL7e!oD(uqR+-)5BN~D{{{58?C&~fV$sbWT4Rkq zzO9u&2lScag3znA37C!IwxVal^g;_Q^k?*xxZb85XqWh$IORa!fie-eT%M;rEws?; zY4vnE^q3H=o)%hY^|X3gJ*^Kh3f=7vz2It~1=`)9zr2jl|A4-3MUO_{N7UU4PysGu dD*e^9oF{3x6lwR6iPr!C002ovPDHLkV1juZi)a7< literal 0 HcmV?d00001 diff --git a/astrid/res/drawable/icn_edit_notes.png b/astrid/res/drawable/icn_edit_notes.png new file mode 100644 index 0000000000000000000000000000000000000000..d022e9e642532c0544ab22d447277f7a22a6e519 GIT binary patch literal 712 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 literal 0 HcmV?d00001 diff --git a/astrid/res/drawable/icn_edit_repeats.png b/astrid/res/drawable/icn_edit_repeats.png new file mode 100644 index 0000000000000000000000000000000000000000..66df80614442266cd2ea65d46e3efe857782a7a5 GIT binary patch literal 3225 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 xATLpf@82UE4`UW|2mIvtoI5@bSk;WT9l>QVpz literal 0 HcmV?d00001 diff --git a/astrid/res/drawable/icn_edit_share.png b/astrid/res/drawable/icn_edit_share.png new file mode 100644 index 0000000000000000000000000000000000000000..378565f74976f48771819037f5aa1f1fc337713e GIT binary patch literal 850 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 literal 0 HcmV?d00001 diff --git a/astrid/res/drawable/icn_edit_who.png b/astrid/res/drawable/icn_edit_who.png new file mode 100644 index 0000000000000000000000000000000000000000..8eed12f038d91008a29644d17f5815a8ca4898ac GIT binary patch literal 416 zcmV;R0bl-!P)H zK~z}7?U=z0gD?z586hJu0wXX&M_>d-$Ohd0wIeV>Mqq@DkP*^Ls1Smx1jljOSo$|4 zp1vICJ55uo-~!MGb<#lx01E(rAOm2K=Bhn`-OFZoKe+27G~{&H-%!U5tS+>~X{&HU z>zly*Z9?Gks)Y-aoYR{7MszoU9b0PvDmr01%r& zEbBB0KXXLc!vPpmyK9JJ>9&1T3g9IX@O#N61!n-J-OdTK^S7F$tybxu%m6$yL7UQC zUe(4xkC~yT7-*9j+QvY80cx*?APLa@73f|Fw3d9K{3&#;1oZ+cdAYw@_vKgs0000< KMNUMnLSTaHt*XBO literal 0 HcmV?d00001 diff --git a/astrid/res/drawable/icn_timer_start.png b/astrid/res/drawable/icn_timer_start.png new file mode 100644 index 0000000000000000000000000000000000000000..0f291063f32fcaad8344e16bcc3552eb6c964226 GIT binary patch literal 2559 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 B{doWY literal 0 HcmV?d00001 diff --git a/astrid/res/drawable/importance_background_selected.xml b/astrid/res/drawable/importance_background_selected.xml new file mode 100644 index 000000000..f2b3b7a79 --- /dev/null +++ b/astrid/res/drawable/importance_background_selected.xml @@ -0,0 +1,13 @@ + + + + + + + diff --git a/astrid/res/drawable/importance_title_1.xml b/astrid/res/drawable/importance_title_1.xml new file mode 100644 index 000000000..9b982e4dc --- /dev/null +++ b/astrid/res/drawable/importance_title_1.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/astrid/res/drawable/importance_title_2.xml b/astrid/res/drawable/importance_title_2.xml new file mode 100644 index 000000000..5cd6bba4f --- /dev/null +++ b/astrid/res/drawable/importance_title_2.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/astrid/res/drawable/importance_title_3.xml b/astrid/res/drawable/importance_title_3.xml new file mode 100644 index 000000000..959017d34 --- /dev/null +++ b/astrid/res/drawable/importance_title_3.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/astrid/res/drawable/importance_title_4.xml b/astrid/res/drawable/importance_title_4.xml new file mode 100644 index 000000000..f11497d0d --- /dev/null +++ b/astrid/res/drawable/importance_title_4.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/astrid/res/drawable/importance_title_5.xml b/astrid/res/drawable/importance_title_5.xml new file mode 100644 index 000000000..aa44a31d7 --- /dev/null +++ b/astrid/res/drawable/importance_title_5.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/astrid/res/drawable/importance_title_6.xml b/astrid/res/drawable/importance_title_6.xml new file mode 100644 index 000000000..099d7e210 --- /dev/null +++ b/astrid/res/drawable/importance_title_6.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/astrid/res/layout/alarm_control.xml b/astrid/res/layout/alarm_control.xml deleted file mode 100644 index ba11307fc..000000000 --- a/astrid/res/layout/alarm_control.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - -