Don't access task edit fragment views when saving

pull/384/head
Alex Baker 9 years ago
parent d646131d2a
commit 1efee9fc2e

@ -27,7 +27,7 @@ android {
buildToolsVersion "23.0.2"
defaultConfig {
versionCode 388
versionCode 389
versionName "4.8.4"
minSdkVersion 14
targetSdkVersion 23

@ -93,8 +93,6 @@ public class RepeatControlSet extends TaskEditControlFragment {
//private final CheckBox enabled;
private boolean doRepeat = false;
private Button value;
private Spinner interval;
private Spinner type;
private Spinner repeatUntil;
@Inject DialogBuilder dialogBuilder;
@ -107,7 +105,8 @@ public class RepeatControlSet extends TaskEditControlFragment {
private ArrayAdapter<String> repeatUntilAdapter;
private final List<String> repeatUntilOptions = new ArrayList<>();
private LinearLayout daysOfWeekContainer;
private final CompoundButton[] daysOfWeek = new CompoundButton[7];
private final Weekday[] weekdays = new Weekday[7];
private final boolean[] isChecked = new boolean[7];
private String recurrence;
private int repeatValue;
@ -132,14 +131,25 @@ public class RepeatControlSet extends TaskEditControlFragment {
dialogView = inflater.inflate(R.layout.control_set_repeat, null);
value = (Button) dialogView.findViewById(R.id.repeatValue);
interval = (Spinner) dialogView.findViewById(R.id.repeatInterval);
Spinner interval = (Spinner) dialogView.findViewById(R.id.repeatInterval);
interval.setAdapter(new ArrayAdapter<String>(context, android.R.layout.simple_spinner_item, getResources().getStringArray(R.array.repeat_interval)) {{
setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
}});
type = (Spinner) dialogView.findViewById(R.id.repeatType);
Spinner type = (Spinner) dialogView.findViewById(R.id.repeatType);
type.setAdapter(new ArrayAdapter<String>(context, android.R.layout.simple_spinner_item, getResources().getStringArray(R.array.repeat_type)) {{
setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
}});
type.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
repeatAfterCompletion = position == TYPE_COMPLETION_DATE;
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
daysOfWeekContainer = (LinearLayout) dialogView.findViewById(R.id.repeatDayOfWeekContainer);
repeatUntil = (Spinner) dialogView.findViewById(R.id.repeat_until);
repeatUntilAdapter = new ArrayAdapter<>(context, android.R.layout.simple_spinner_item, repeatUntilOptions);
@ -149,12 +159,20 @@ public class RepeatControlSet extends TaskEditControlFragment {
DateFormatSymbols dfs = new DateFormatSymbols();
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek());
CompoundButton[] daysOfWeek = new CompoundButton[7];
for(int i = 0; i < 7; i++) {
final int index = i;
CheckBox checkBox = (CheckBox) daysOfWeekContainer.getChildAt(i);
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
RepeatControlSet.this.isChecked[index] = isChecked;
}
});
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
checkBox.setTag(Weekday.values()[dayOfWeek - 1]);
checkBox.setText(dfs.getShortWeekdays()[dayOfWeek].substring(0, 1));
daysOfWeek[i] = checkBox;
weekdays[i] = Weekday.values()[dayOfWeek - 1];
calendar.add(Calendar.DATE, 1);
}
@ -207,7 +225,52 @@ public class RepeatControlSet extends TaskEditControlFragment {
daysOfWeekContainer.setVisibility(View.GONE);
type.setSelection(repeatAfterCompletion ? TYPE_COMPLETION_DATE : TYPE_DUE_DATE);
applyRecurrence();
doRepeat = !Strings.isNullOrEmpty(recurrence);
if (doRepeat) {
// read recurrence rule
try {
RRule rrule = new RRule(recurrence);
setRepeatValue(rrule.getInterval());
for(WeekdayNum day : rrule.getByDay()) {
for(int i = 0; i < 7; i++) {
if (weekdays[i].equals(day.wday)) {
daysOfWeek[i].setChecked(true);
}
}
}
switch(rrule.getFreq()) {
case DAILY:
intervalValue = INTERVAL_DAYS;
break;
case WEEKLY:
intervalValue = INTERVAL_WEEKS;
break;
case MONTHLY:
intervalValue = INTERVAL_MONTHS;
break;
case HOURLY:
intervalValue = INTERVAL_HOURS;
break;
case MINUTELY:
intervalValue = INTERVAL_MINUTES;
break;
case YEARLY:
intervalValue = INTERVAL_YEARS;
break;
default:
Timber.e(new Exception("Unhandled rrule frequency: " + recurrence), "repeat-unhandled-rule");
}
interval.setSelection(intervalValue);
} catch (Exception e) {
// invalid RRULE
recurrence = ""; //$NON-NLS-1$
Timber.e(e, e.getMessage());
}
}
refreshDisplayView();
return view;
}
@ -302,64 +365,13 @@ public class RepeatControlSet extends TaskEditControlFragment {
private String getRecurrenceValue() {
String result = getRecurrence();
if (type.getSelectedItemPosition() == TYPE_COMPLETION_DATE && !TextUtils.isEmpty(result)) {
if (repeatAfterCompletion && !TextUtils.isEmpty(result)) {
result += ";FROM=COMPLETION"; //$NON-NLS-1$
}
return result;
}
private void applyRecurrence() {
doRepeat = !Strings.isNullOrEmpty(recurrence);
if (!doRepeat) {
return;
}
// read recurrence rule
try {
RRule rrule = new RRule(recurrence);
setRepeatValue(rrule.getInterval());
for(WeekdayNum day : rrule.getByDay()) {
for(int i = 0; i < 7; i++) {
if (daysOfWeek[i].getTag().equals(day.wday)) {
daysOfWeek[i].setChecked(true);
}
}
}
switch(rrule.getFreq()) {
case DAILY:
intervalValue = INTERVAL_DAYS;
break;
case WEEKLY:
intervalValue = INTERVAL_WEEKS;
break;
case MONTHLY:
intervalValue = INTERVAL_MONTHS;
break;
case HOURLY:
intervalValue = INTERVAL_HOURS;
break;
case MINUTELY:
intervalValue = INTERVAL_MINUTES;
break;
case YEARLY:
intervalValue = INTERVAL_YEARS;
break;
default:
Timber.e(new Exception("Unhandled rrule frequency: " + recurrence), "repeat-unhandled-rule");
}
interval.setSelection(intervalValue);
} catch (Exception e) {
// invalid RRULE
recurrence = ""; //$NON-NLS-1$
Timber.e(e, e.getMessage());
}
}
private String getRecurrence() {
String result;
if(!doRepeat) {
@ -367,7 +379,7 @@ public class RepeatControlSet extends TaskEditControlFragment {
} else {
RRule rrule = new RRule();
rrule.setInterval(repeatValue);
switch(interval.getSelectedItemPosition()) {
switch(intervalValue) {
case INTERVAL_DAYS:
rrule.setFreq(Frequency.DAILY);
break;
@ -375,9 +387,9 @@ public class RepeatControlSet extends TaskEditControlFragment {
rrule.setFreq(Frequency.WEEKLY);
ArrayList<WeekdayNum> days = new ArrayList<>();
for (CompoundButton dayOfWeek : daysOfWeek) {
if (dayOfWeek.isChecked()) {
days.add(new WeekdayNum(0, (Weekday) dayOfWeek.getTag()));
for (int i = 0 ; i < isChecked.length ; i++) {
if (isChecked[i]) {
days.add(new WeekdayNum(0, weekdays[i]));
}
}
rrule.setByDay(days);

@ -48,7 +48,6 @@ import org.tasks.ui.TaskEditControlFragment;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import javax.inject.Inject;
@ -86,11 +85,11 @@ public final class TagsControlSet extends TaskEditControlFragment {
private ListView selectedTags;
private View dialogView;
private AlertDialog dialog;
private ArrayList<String> tagList;
private String buildTagString() {
StringBuilder builder = new StringBuilder();
List<String> tagList = getTagList();
Collections.sort(tagList);
for (String tag : tagList) {
if (tag.trim().length() == 0) {
@ -109,11 +108,10 @@ public final class TagsControlSet extends TaskEditControlFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = super.onCreateView(inflater, container, savedInstanceState);
ArrayList<String> selected;
if (savedInstanceState != null) {
selected = savedInstanceState.getStringArrayList(EXTRA_TAGS);
tagList = savedInstanceState.getStringArrayList(EXTRA_TAGS);
} else {
selected = tagService.getTagNames(taskId);
tagList = tagService.getTagNames(taskId);
}
allTagNames = newArrayList(ImmutableSet.copyOf(transform(tagService.getTagList(), new Function<TagData, String>() {
@Override
@ -126,7 +124,7 @@ public final class TagsControlSet extends TaskEditControlFragment {
selectedTags = (ListView) dialogView.findViewById(R.id.existingTags);
selectedTags.setAdapter(new ArrayAdapter<>(getActivity(), R.layout.simple_list_item_multiple_choice_themed, allTagNames));
addTag("");
for (String tag : selected) {
for (String tag : tagList) {
setTagSelected(tag);
}
refreshDisplayView();
@ -137,7 +135,7 @@ public final class TagsControlSet extends TaskEditControlFragment {
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putStringArrayList(EXTRA_TAGS, getTagList());
outState.putStringArrayList(EXTRA_TAGS, tagList);
}
@Override
@ -172,6 +170,7 @@ public final class TagsControlSet extends TaskEditControlFragment {
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
tagList = getTagList();
refreshDisplayView();
}
})
@ -338,7 +337,7 @@ public final class TagsControlSet extends TaskEditControlFragment {
}
private Set<TagData> getSelectedTags(final boolean createMissingTags) {
return newHashSet(transform(getTagList(), new Function<String, TagData>() {
return newHashSet(transform(tagList, new Function<String, TagData>() {
@Override
public TagData apply(String tagName) {
TagData tagData = tagDataDao.getTagByName(tagName, TagData.PROPERTIES);

@ -31,6 +31,7 @@ import javax.inject.Inject;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
import butterknife.OnTextChanged;
/**
* Control set for mapping a Property to an EditText
@ -89,8 +90,8 @@ public class EditTitleControlSet extends TaskEditControlFragment {
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(EXTRA_COMPLETE, completeBox.isChecked());
outState.putString(EXTRA_TITLE, getTitle());
outState.putBoolean(EXTRA_COMPLETE, isComplete);
outState.putString(EXTRA_TITLE, title);
outState.putBoolean(EXTRA_REPEATING, isRepeating);
outState.putInt(EXTRA_PRIORITY, importanceValue);
}
@ -111,6 +112,11 @@ public class EditTitleControlSet extends TaskEditControlFragment {
}
}
@OnTextChanged(R.id.title)
void onTextChanged(CharSequence text) {
this.title = text.toString().trim();
}
public void setPriority(int priority) {
importanceValue = priority;
updateCompleteBox();
@ -122,9 +128,9 @@ public class EditTitleControlSet extends TaskEditControlFragment {
}
private void updateCompleteBox() {
boolean checked = completeBox.isChecked();
isComplete = completeBox.isChecked();
if (checked) {
if (isComplete) {
completeBox.setImageDrawable(checkBoxes.getCompletedCheckbox(importanceValue));
} else if (isRepeating) {
completeBox.setImageDrawable(checkBoxes.getRepeatingCheckBox(importanceValue));
@ -132,7 +138,7 @@ public class EditTitleControlSet extends TaskEditControlFragment {
completeBox.setImageDrawable(checkBoxes.getCheckBox(importanceValue));
}
if (checked) {
if (isComplete) {
editText.setPaintFlags(editText.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
} else {
editText.setPaintFlags(editText.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG);
@ -156,8 +162,8 @@ public class EditTitleControlSet extends TaskEditControlFragment {
@Override
public boolean hasChanges(Task original) {
return !getTitle().equals(original.getTitle()) ||
completeBox.isChecked() != original.isCompleted();
return !title.equals(original.getTitle()) ||
isComplete != original.isCompleted();
}
@Override
@ -172,20 +178,14 @@ public class EditTitleControlSet extends TaskEditControlFragment {
@Override
public void apply(Task task) {
String title = getTitle();
task.setTitle(Strings.isNullOrEmpty(title)
? getString(R.string.no_title)
: title);
boolean newState = completeBox.isChecked();
if (newState != task.isCompleted()) {
taskService.setComplete(task, newState);
if (isComplete != task.isCompleted()) {
taskService.setComplete(task, isComplete);
}
}
private String getTitle() {
return editText.getText().toString().trim();
}
public void hideKeyboard() {
AndroidUtilities.hideSoftInputForViews(getActivity(), editText);
}

@ -72,6 +72,7 @@ public class HideUntilControlSet extends TaskEditControlFragment implements OnIt
private int selection;
private long existingDate = EXISTING_TIME_UNSET;
private final List<HideUntilValue> spinnerItems = new ArrayList<>();
private HideUntilValue selectedValue;
@OnClick(R.id.clear)
void clearHideUntil(View view) {
@ -191,8 +192,7 @@ public class HideUntilControlSet extends TaskEditControlFragment implements OnIt
}
private long getHideUntil(Task task) {
HideUntilValue selectedItem = (HideUntilValue) spinner.getSelectedItem();
return task.createHideUntil(selectedItem.setting, selectedItem.date);
return task.createHideUntil(selectedValue.setting, selectedValue.date);
}
@Override
@ -300,8 +300,8 @@ public class HideUntilControlSet extends TaskEditControlFragment implements OnIt
// --- setting up values
private void refreshDisplayView() {
HideUntilValue value = adapter.getItem(selection);
if (value.setting == Task.HIDE_UNTIL_NONE) {
selectedValue = adapter.getItem(selection);
if (selectedValue.setting == Task.HIDE_UNTIL_NONE) {
spinner.setAlpha(0.5f);
clearButton.setVisibility(View.GONE);
} else {

@ -7,6 +7,7 @@ package com.todoroo.astrid.ui;
import android.content.Context;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
@ -23,7 +24,7 @@ import org.tasks.R;
public class RandomReminderControlSet {
private final Spinner periodSpinner;
private int selectedIndex;
private final int[] hours;
public RandomReminderControlSet(Context context, View parentView, long reminderPeriod) {
@ -36,6 +37,18 @@ public class RandomReminderControlSet {
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
periodSpinner.setAdapter(adapter);
periodSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
selectedIndex = position;
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
// create hour array
String[] hourStrings = context.getResources().getStringArray(R.array.TEA_reminder_random_hours);
hours = new int[hourStrings.length];
@ -53,7 +66,7 @@ public class RandomReminderControlSet {
}
public long getReminderPeriod() {
int hourValue = hours[periodSpinner.getSelectedItemPosition()];
int hourValue = hours[selectedIndex];
return hourValue * DateUtilities.ONE_HOUR;
}
}

@ -91,12 +91,20 @@ public class ReminderControlSet extends TaskEditControlFragment {
private long taskId;
private int flags;
private long randomReminder;
private int ringMode;
private RandomReminderControlSet randomControlSet;
private boolean whenDue;
private boolean whenOverdue;
private List<String> spinnerOptions = new ArrayList<>();
private ArrayAdapter<String> remindAdapter;
private Set<Long> alarms = new LinkedHashSet<>();
private Set<Geofence> geofences = new LinkedHashSet<>();
@OnItemSelected(R.id.reminder_alarm)
void ringModeSelected(int position) {
ringMode = position;
}
@Nullable
@Override
@ -217,8 +225,8 @@ public class ReminderControlSet extends TaskEditControlFragment {
public boolean hasChanges(Task original) {
return getFlags() != original.getReminderFlags() ||
getRandomReminderPeriod() != original.getReminderPeriod() ||
!newHashSet(currentAlarms()).equals(getAlarms()) ||
!newHashSet(geofenceService.getGeofences(taskId)).equals(getGeofences());
!newHashSet(currentAlarms()).equals(alarms) ||
!newHashSet(geofenceService.getGeofences(taskId)).equals(geofences);
}
@Override
@ -227,10 +235,10 @@ public class ReminderControlSet extends TaskEditControlFragment {
task.setReminderPeriod(getRandomReminderPeriod());
if(alarmService.synchronizeAlarms(task.getId(), getAlarms())) {
if(alarmService.synchronizeAlarms(task.getId(), alarms)) {
task.setModificationDate(DateUtilities.now());
}
if (geofenceService.synchronizeGeofences(task.getId(), getGeofences())) {
if (geofenceService.synchronizeGeofences(task.getId(), geofences)) {
task.setModificationDate(DateUtilities.now());
}
}
@ -242,8 +250,8 @@ public class ReminderControlSet extends TaskEditControlFragment {
outState.putLong(EXTRA_TASK_ID, taskId);
outState.putInt(EXTRA_FLAGS, getFlags());
outState.putLong(EXTRA_RANDOM_REMINDER, getRandomReminderPeriod());
outState.putLongArray(EXTRA_ALARMS, Longs.toArray(getAlarms()));
outState.putParcelableArrayList(EXTRA_GEOFENCES, newArrayList(getGeofences()));
outState.putLongArray(EXTRA_ALARMS, Longs.toArray(alarms));
outState.putParcelableArrayList(EXTRA_GEOFENCES, newArrayList(geofences));
}
@Override
@ -261,30 +269,14 @@ public class ReminderControlSet extends TaskEditControlFragment {
}
}
private Set<Long> getAlarms() {
Set<Long> alarms = new LinkedHashSet<>();
for (int i = 0 ; i < alertContainer.getChildCount() ; i++) {
Object tag = alertContainer.getChildAt(i).getTag();
if (tag instanceof Long) {
alarms.add((Long) tag);
}
}
return alarms;
}
private Set<Geofence> getGeofences() {
Set<Geofence> geofences = new LinkedHashSet<>();
for (int i = 0 ; i < alertContainer.getChildCount() ; i++) {
Object tag = alertContainer.getChildAt(i).getTag();
if (tag instanceof Geofence) {
geofences.add((Geofence) tag);
}
}
return geofences;
}
public void addAlarmRow(final Long timestamp) {
addAlarmRow(getLongDateStringWithTime(context, timestamp), timestamp, null);
addAlarmRow(getLongDateStringWithTime(context, timestamp), new OnClickListener() {
@Override
public void onClick(View v) {
alarms.remove(timestamp);
}
});
alarms.add(timestamp);
}
public void pickLocation() {
@ -295,12 +287,13 @@ public class ReminderControlSet extends TaskEditControlFragment {
}
public void addGeolocationReminder(final Geofence geofence) {
View alertItem = addAlarmRow(geofence.getName(), null, new OnClickListener() {
addAlarmRow(geofence.getName(), new OnClickListener() {
@Override
public void onClick(View v) {
geofences.remove(geofence);
}
});
alertItem.setTag(geofence);
geofences.add(geofence);
}
private int getFlags() {
@ -313,9 +306,9 @@ public class ReminderControlSet extends TaskEditControlFragment {
}
value &= ~(Task.NOTIFY_MODE_FIVE | Task.NOTIFY_MODE_NONSTOP);
if(mode.getSelectedItemPosition() == 2) {
if(ringMode == 2) {
value |= Task.NOTIFY_MODE_NONSTOP;
} else if(mode.getSelectedItemPosition() == 1) {
} else if(ringMode == 1) {
value |= Task.NOTIFY_MODE_FIVE;
}
@ -332,15 +325,14 @@ public class ReminderControlSet extends TaskEditControlFragment {
}}, REQUEST_NEW_ALARM);
}
private View addAlarmRow(String text, Long timestamp, final OnClickListener onRemove) {
private View addAlarmRow(String text, final OnClickListener onRemove) {
final View alertItem = getActivity().getLayoutInflater().inflate(R.layout.alarm_edit_row, null);
alertContainer.addView(alertItem);
addAlarmRow(alertItem, text, timestamp, onRemove);
addAlarmRow(alertItem, text, onRemove);
return alertItem;
}
private void addAlarmRow(final View alertItem, String text, Long timestamp, final View.OnClickListener onRemove) {
alertItem.setTag(timestamp);
private void addAlarmRow(final View alertItem, String text, final View.OnClickListener onRemove) {
TextView display = (TextView) alertItem.findViewById(R.id.alarm_string);
display.setText(text);
alertItem.findViewById(R.id.clear).setOnClickListener(new OnClickListener() {
@ -378,7 +370,7 @@ public class ReminderControlSet extends TaskEditControlFragment {
private void addDue() {
whenDue = true;
addAlarmRow(getString(R.string.when_due), null, new OnClickListener() {
addAlarmRow(getString(R.string.when_due), new OnClickListener() {
@Override
public void onClick(View v) {
whenDue = false;
@ -388,7 +380,7 @@ public class ReminderControlSet extends TaskEditControlFragment {
private void addOverdue() {
whenOverdue = true;
addAlarmRow(getString(R.string.when_overdue), null, new OnClickListener() {
addAlarmRow(getString(R.string.when_overdue), new OnClickListener() {
@Override
public void onClick(View v) {
whenOverdue = false;
@ -397,7 +389,7 @@ public class ReminderControlSet extends TaskEditControlFragment {
}
private void addRandomReminder(long reminderPeriod) {
View alarmRow = addAlarmRow(getString(R.string.randomly_once), null, new OnClickListener() {
View alarmRow = addAlarmRow(getString(R.string.randomly_once), new OnClickListener() {
@Override
public void onClick(View v) {
randomControlSet = null;

@ -1,7 +1,6 @@
package org.tasks.ui;
import android.app.Activity;
import android.content.Context;
import android.content.res.ColorStateList;
import android.os.Bundle;
import android.support.annotation.Nullable;
@ -49,7 +48,8 @@ public class PriorityControlSet extends TaskEditControlFragment {
@OnClick({R.id.priority_high, R.id.priority_medium, R.id.priority_low, R.id.priority_none})
void onImportanceChanged(CompoundButton button) {
callback.onPriorityChange(getPriority());
priority = getPriority();
callback.onPriorityChange(priority);
}
@Nullable
@ -75,6 +75,13 @@ public class PriorityControlSet extends TaskEditControlFragment {
return view;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(EXTRA_PRIORITY, priority);
}
@Override
protected int getLayout() {
return R.layout.control_set_priority;
@ -97,12 +104,12 @@ public class PriorityControlSet extends TaskEditControlFragment {
@Override
public void apply(Task task) {
task.setImportance(getPriority());
task.setImportance(priority);
}
@Override
public boolean hasChanges(Task original) {
return original.getImportance() != getPriority();
return original.getImportance() != priority;
}
private void tintRadioButton(AppCompatRadioButton radioButton, int priority) {

Loading…
Cancel
Save