/**
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.ui;
import java.util.Date;
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.ImageView;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
import com.timsu.astrid.R;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.ThemeService;
import com.todoroo.astrid.ui.DateAndTimeDialog.DateAndTimeDialogListener;
/**
* Control set for specifying when a task should be hidden
*
* @author Tim Su <tim@todoroo.com>
*
*/
public class HideUntilControlSet extends PopupControlSet implements OnItemSelectedListener {
private static final int SPECIFIC_DATE = -1;
private static final int EXISTING_TIME_UNSET = -2;
//private final CheckBox enabled;
private Spinner spinner;
private int previousSetting = Task.HIDE_UNTIL_NONE;
private final int title;
private int selection;
private final ImageView image;
private long existingDate = EXISTING_TIME_UNSET;
public HideUntilControlSet(Activity activity, int viewLayout, int displayViewLayout, int title) {
super(activity, viewLayout, displayViewLayout, title);
this.title = title;
image = (ImageView) getDisplayView().findViewById(R.id.display_row_icon);
}
private ArrayAdapter<HideUntilValue> adapter;
/**
* Container class for urgencies
*
* @author Tim Su <tim@todoroo.com>
*
*/
private class HideUntilValue {
public String label;
public int setting;
public long date;
public HideUntilValue(String label, int setting) {
this(label, setting, 0);
}
public HideUntilValue(String label, int setting, long date) {
this.label = label;
this.setting = setting;
this.date = date;
}
@Override
public String toString() {
return label;
}
}
private HideUntilValue[] createHideUntilList(long specificDate) {
// set up base values
String[] labels = activity.getResources().getStringArray(R.array.TEA_hideUntil);
HideUntilValue[] values = new HideUntilValue[labels.length];
values[0] = new HideUntilValue(labels[0], Task.HIDE_UNTIL_NONE);
values[1] = new HideUntilValue(labels[1], Task.HIDE_UNTIL_DUE);
values[2] = new HideUntilValue(labels[2], Task.HIDE_UNTIL_DUE_TIME);
values[3] = new HideUntilValue(labels[3], Task.HIDE_UNTIL_DAY_BEFORE);
values[4] = new HideUntilValue(labels[4], Task.HIDE_UNTIL_WEEK_BEFORE);
values[5] = new HideUntilValue(labels[5], Task.HIDE_UNTIL_SPECIFIC_DAY, -1);
if(specificDate > 0) {
HideUntilValue[] updated = new HideUntilValue[values.length + 1];
for(int i = 0; i < values.length; i++)
updated[i+1] = values[i];
Date hideUntilAsDate = new Date(specificDate);
if(hideUntilAsDate.getHours() == 0 && hideUntilAsDate.getMinutes() == 0 && hideUntilAsDate.getSeconds() == 0) {
updated[0] = new HideUntilValue(DateUtilities.getDateString(activity, new Date(specificDate)),
Task.HIDE_UNTIL_SPECIFIC_DAY, specificDate);
existingDate = specificDate;
} else {
updated[0] = new HideUntilValue(DateUtilities.getDateStringWithTime(activity, new Date(specificDate)),
Task.HIDE_UNTIL_SPECIFIC_DAY_TIME, specificDate);
existingDate = specificDate;
}
values = updated;
}
return values;
}
// --- listening for events
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
// if specific date selected, show dialog
// ... at conclusion of dialog, update our list
HideUntilValue item = adapter.getItem(position);
if(item.date == SPECIFIC_DATE) {
customDate = new Date(existingDate == EXISTING_TIME_UNSET ? DateUtilities.now() : existingDate);
customDate.setSeconds(0);
final DateAndTimeDialog dateAndTimeDialog = new DateAndTimeDialog(activity, customDate.getTime());
dateAndTimeDialog.show();
dateAndTimeDialog.setDateAndTimeDialogListener(new DateAndTimeDialogListener() {
@Override
public void onDateAndTimeSelected(long date) {
if (date > 0) {
customDate = new Date(date);
if (!dateAndTimeDialog.hasTime()) {
customDate.setHours(0);
customDate.setMinutes(0);
customDate.setSeconds(0);
}
customDateFinished();
}
}
@Override
public void onDateAndTimeCancelled() {
// user canceled, restore previous choice
spinner.setSelection(previousSetting);
refreshDisplayView();
}
});
spinner.setSelection(previousSetting);
} else {
previousSetting = position;
}
selection = spinner.getSelectedItemPosition();
refreshDisplayView();
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// ignore
}
Date customDate;
private void customDateFinished() {
HideUntilValue[] list = createHideUntilList(customDate.getTime());
adapter = new ArrayAdapter<HideUntilValue>(
activity, android.R.layout.simple_spinner_item,
list);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setSelection(0);
refreshDisplayView();
}
// --- setting up values
public void setDefaults() {
int setting = Preferences.getIntegerFromString(R.string.p_default_hideUntil_key,
Task.HIDE_UNTIL_NONE);
selection = setting;
if (spinner != null)
spinner.setSelection(selection);
refreshDisplayView();
}
@Override
protected OnClickListener getDisplayClickListener() {
return new OnClickListener() {
@Override
public void onClick(View v) {
if (spinner == null) // Force load
getView();
spinner.performClick();
}
};
}
@Override
protected void refreshDisplayView() {
TextView auxDisplay = (TextView) getDisplayView().findViewById(R.id.display_row_edit);
HideUntilValue value = adapter.getItem(selection);
if (value.setting == Task.HIDE_UNTIL_NONE) {
auxDisplay.setText(R.string.TEA_hideUntil_label);
auxDisplay.setTextColor(unsetColor);
image.setImageResource(R.drawable.tea_icn_hide_gray);
} else {
String display = value.toString();
if (value.setting != Task.HIDE_UNTIL_SPECIFIC_DAY && value.setting != Task.HIDE_UNTIL_SPECIFIC_DAY_TIME)
display = display.toLowerCase();
auxDisplay.setText(activity.getString(R.string.TEA_hideUntil_display, display));
auxDisplay.setTextColor(themeColor);
image.setImageResource(ThemeService.getTaskEditDrawable(R.drawable.tea_icn_hide, R.drawable.tea_icn_hide_lightblue));
}
}
@Override
protected void afterInflate() {
this.spinner = (Spinner) getView().findViewById(R.id.hideUntil);
this.spinner.setOnItemSelectedListener(this);
this.spinner.setPromptId(title);
((LinearLayout) getDisplayView()).addView(getView()); // hack to make listeners work
}
@Override
public void readFromTask(Task task) {
long date = task.getValue(Task.HIDE_UNTIL);
Date dueDay = new Date(task.getValue(Task.DUE_DATE)/1000L*1000L);
dueDay.setHours(0);
dueDay.setMinutes(0);
dueDay.setSeconds(0);
// For the hide until due case, we need the time component
long dueTime = task.getValue(Task.DUE_DATE)/1000L*1000L;
if(date == 0) {
selection = 0;
date = 0;
} else if(date == dueDay.getTime()) {
selection = 1;
date = 0;
} else if (date == dueTime){
selection = 2;
date = 0;
} else if(date + DateUtilities.ONE_DAY == dueDay.getTime()) {
selection = 3;
date = 0;
} else if(date + DateUtilities.ONE_WEEK == dueDay.getTime()) {
selection = 4;
date = 0;
}
HideUntilValue[] list = createHideUntilList(date);
adapter = new ArrayAdapter<HideUntilValue>(
activity, android.R.layout.simple_spinner_item, list);
super.readFromTask(task);
}
@Override
protected void readFromTaskOnInitialize() {
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setSelection(selection);
refreshDisplayView();
}
@Override
protected String writeToModelAfterInitialized(Task task) {
if(adapter == null || spinner == null)
return null;
HideUntilValue item = adapter.getItem(spinner.getSelectedItemPosition());
if(item == null)
return null;
long value = task.createHideUntil(item.setting, item.date);
task.setValue(Task.HIDE_UNTIL, value);
if (value != 0)
return activity.getString(R.string.TEA_hideUntil_message, DateAndTimePicker.getDisplayString(activity, value, false, false, false));
return null;
}
}