/**
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.ui;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
import com.timsu.astrid.R;
import com.todoroo.astrid.alarms.AlarmControlSet;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.ThemeService;
/**
* Control set dealing with reminder settings
*
* @author Tim Su <tim@todoroo.com>
*
*/
public class ReminderControlSet extends PopupControlSet {
private CheckBox during, after;
private Spinner mode;
private TextView modeDisplay;
private LinearLayout remindersBody;
private final List<View> extraViews;
private final TextView label;
private final ImageView image;
private RandomReminderControlSet randomControlSet;
private AlarmControlSet alarmControl;
public ReminderControlSet(Activity activity, int viewLayout, int displayViewLayout) {
super(activity, viewLayout, displayViewLayout, R.string.TEA_reminders_group_label);
extraViews = new ArrayList<View>();
label = (TextView) getDisplayView().findViewById(R.id.display_row_edit);
image = (ImageView) getDisplayView().findViewById(R.id.display_row_icon);
}
public void addViewToBody(View v) {
if (remindersBody != null)
remindersBody.addView(v, 0);
else
extraViews.add(v);
}
public void setValue(int flags) {
during.setChecked((flags & Task.NOTIFY_AT_DEADLINE) > 0);
after.setChecked((flags &
Task.NOTIFY_AFTER_DEADLINE) > 0);
if((flags & Task.NOTIFY_MODE_NONSTOP) > 0)
mode.setSelection(2);
else if((flags & Task.NOTIFY_MODE_FIVE) > 0)
mode.setSelection(1);
else
mode.setSelection(0);
}
public int getValue() {
int value = 0;
if(during.isChecked())
value |= Task.NOTIFY_AT_DEADLINE;
if(after.isChecked())
value |= Task.NOTIFY_AFTER_DEADLINE;
value &= ~(Task.NOTIFY_MODE_FIVE | Task.NOTIFY_MODE_NONSTOP);
if(mode.getSelectedItemPosition() == 2)
value |= Task.NOTIFY_MODE_NONSTOP;
else if(mode.getSelectedItemPosition() == 1)
value |= Task.NOTIFY_MODE_FIVE;
return value;
}
@Override
protected void afterInflate() {
during = (CheckBox) getView().findViewById(R.id.reminder_due);
after = (CheckBox) getView().findViewById(R.id.reminder_overdue);
modeDisplay = (TextView) getView().findViewById(R.id.reminder_alarm_display);
mode = (Spinner) getView().findViewById(R.id.reminder_alarm);
View modeContainer = getView().findViewById(R.id.reminder_alarm_container);
modeContainer.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mode.performClick();
}
});
randomControlSet = new RandomReminderControlSet(activity, getView(), -1);
alarmControl = new AlarmControlSet(activity, R.layout.control_set_alarms);
alarmControl.readFromTask(model);
remindersBody = (LinearLayout) getView().findViewById(R.id.reminders_body);
remindersBody.addView(alarmControl.getView());
while (extraViews.size() > 0) {
addViewToBody(extraViews.remove(0));
}
String[] list = new String[] {
activity.getString(R.string.TEA_reminder_mode_once),
activity.getString(R.string.TEA_reminder_mode_five),
activity.getString(R.string.TEA_reminder_mode_nonstop),
};
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(
activity, android.R.layout.simple_spinner_item, list);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mode.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
modeDisplay.setText(adapter.getItem(position));
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// TODO Auto-generated method stub
}
});
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
mode.setAdapter(adapter);
}
});
}
@Override
protected void readFromTaskOnInitialize() {
setValue(model.getValue(Task.REMINDER_FLAGS));
// Calls to get view will force other control sets to load
randomControlSet.readFromTask(model);
randomControlSet.readFromTaskOnInitialize();
}
@Override
protected String writeToModelAfterInitialized(Task task) {
task.setValue(Task.REMINDER_FLAGS, getValue());
randomControlSet.writeToModel(task);
alarmControl.writeToModel(task);
return null;
}
@Override
protected void refreshDisplayView() {
int reminderCount = 0;
StringBuilder reminderString = new StringBuilder();
// Has random reminder?
if ((randomControlSet != null && randomControlSet.hasRandomReminder()) || (randomControlSet == null && model.getValue(Task.REMINDER_PERIOD) > 0)) {
reminderString.append(activity.getString(R.string.TEA_reminder_randomly_short));
reminderCount++;
}
int value;
if (initialized)
value = getValue();
else
value = model.getValue(Task.REMINDER_FLAGS);
boolean appendedWhen = false;
if ((value & Task.NOTIFY_AT_DEADLINE) > 0) {
if (reminderCount > 0)
reminderString.append(" & "); //$NON-NLS-1$
reminderString.append(activity.getString(R.string.TEA_reminder_when)).append(" "); //$NON-NLS-1$
reminderString.append(activity.getString(R.string.TEA_reminder_due_short));
reminderCount++;
appendedWhen = true;
}
if ((value & Task.NOTIFY_AFTER_DEADLINE) > 0 && reminderCount < 2) {
if (reminderCount > 0)
reminderString.append(" & "); //$NON-NLS-1$
if (!appendedWhen)
reminderString.append(activity.getString(R.string.TEA_reminder_when)).append(" "); //$NON-NLS-1$
reminderString.append(activity.getString(R.string.TEA_reminder_overdue_short));
reminderCount++;
}
if (reminderCount > 0) {
String toDisplay;
if (reminderCount == 1) {
toDisplay = activity.getString(R.string.TEA_reminder_display_one, reminderString.toString());
} else {
toDisplay = activity.getString(R.string.TEA_reminder_display_multiple, reminderString.toString());
}
label.setText(toDisplay);
label.setTextColor(themeColor);
image.setImageResource(ThemeService.getTaskEditDrawable(R.drawable.tea_icn_reminder, R.drawable.tea_icn_reminder_lightblue));
} else {
label.setText(R.string.TEA_reminders_group_label);
label.setTextColor(unsetColor);
image.setImageResource(R.drawable.tea_icn_reminder_gray);
}
}
}