package moontime.droid;
import java.util.List;
import moontime.MoonEvent;
import moontime.droid.entity.Reminder;
import moontime.droid.service.MoontimeService;
import moontime.droid.store.GlobalPreferences;
import roboguice.activity.RoboListActivity;
import roboguice.inject.InjectView;
import android.app.Dialog;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import com.google.inject.Inject;
import com.google.inject.internal.Lists;
public class ReminderActivity extends RoboListActivity {
@Inject
protected MoontimeService _moontimeService;
@Inject
protected GlobalPreferences _globalPreferences;
@InjectView(R.id.switchLists)
protected Button _switchListsButton;
private MoonEvent _nextMoonEvent;
private List<Reminder> _reminders = Lists.newArrayList();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.reminder_layout);
setListAdapter(new ArrayAdapter<Reminder>(this, android.R.layout.simple_list_item_multiple_choice, _reminders));
getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
_nextMoonEvent = _moontimeService.getNextMoonEvent();
updateListAdapter();
registerForContextMenu(getListView());
}
@Override
protected void onResume() {
updateTitle();
super.onResume();
}
private void updateTitle() {
setTitle(_nextMoonEvent.getType().getDisplayName() + " Reminders");
}
private void updateListAdapter() {
updateTitle();
_switchListsButton.setText("Switch to " + _nextMoonEvent.getType().opposite().getDisplayName());
_reminders.clear();
_reminders.addAll(_globalPreferences.getReminders(_nextMoonEvent, true));
getListAdapter().notifyDataSetChanged();
for (int i = 0; i < _reminders.size(); i++) {
getListView().setItemChecked(i, _reminders.get(i).isChecked());
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.reminders_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.clearChecks:
for (int i = 0; i < getListAdapter().getCount(); i++) {
getListView().setItemChecked(i, false);
}
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
menu.setHeaderTitle(getListAdapter().getItem(info.position).getText());
for (ReminderContextMenu reminderMenu : ReminderContextMenu.values()) {
menu.add(Menu.NONE, reminderMenu.ordinal(), reminderMenu.ordinal(), reminderMenu.getDisplayName());
}
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
int menuItemIndex = item.getItemId();
ReminderContextMenu reminderMenu = ReminderContextMenu.values()[menuItemIndex];
reminderMenu.execute(this, info.position);
return true;
}
public void switchLists(View view) {
saveChecks();
_nextMoonEvent = new MoonEvent(_nextMoonEvent.getType().opposite(), _nextMoonEvent.getDate());
updateListAdapter();
}
public void newReminder(View view) {
newReminder(view, null, -1);
}
protected void newReminder(View view, final Reminder existingReminder, final int existingReminderIndex) {
final Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.new_reminder_dialog);
if (existingReminder == null) {
dialog.setTitle("Create Reminder");
} else {
dialog.setTitle("Edit Reminder");
}
dialog.setOwnerActivity(this);
Button submitButton = (Button) dialog.findViewById(R.id.Submit);
Button cancelButton = (Button) dialog.findViewById(R.id.Cancel);
final EditText reminderText = (EditText) dialog.findViewById(R.id.newReminderText);
if (existingReminder != null) {
reminderText.setText(existingReminder.getText());
}
submitButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String text = reminderText.getText().toString();
if (existingReminder != null) {
_reminders.get(existingReminderIndex).setText(text);
_globalPreferences.saveReminders(_nextMoonEvent, _reminders);
getListAdapter().notifyDataSetChanged();
} else {
Reminder reminder = new Reminder(text);
_reminders.add(reminder);
_globalPreferences.saveReminders(_nextMoonEvent, _reminders);
ReminderActivity.this.getListAdapter().notifyDataSetChanged();
}
dialog.dismiss();
}
});
cancelButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.show();
}
@SuppressWarnings("unchecked")
@Override
public ArrayAdapter<Reminder> getListAdapter() {
return (ArrayAdapter<Reminder>) super.getListAdapter();
}
@Override
protected void onPause() {
saveChecks();
super.onPause();
}
private void saveChecks() {
for (int i = 0; i < _reminders.size(); i++) {
_reminders.get(i).setChecked(getListView().isItemChecked(i));
}
_globalPreferences.saveReminders(_nextMoonEvent, _reminders);
}
private static enum ReminderContextMenu {
EDIT("Edit") {
@Override
public void execute(ReminderActivity activity, int reminderIndex) {
activity.newReminder(null, activity._reminders.get(reminderIndex), reminderIndex);
}
},
DELETE("Delete") {
@Override
public void execute(ReminderActivity activity, int reminderIndex) {
activity._reminders.remove(reminderIndex);
activity._globalPreferences.saveReminders(activity._nextMoonEvent, activity._reminders);
activity.getListAdapter().notifyDataSetChanged();
}
},
MOVE_UP("Move Up") {
@Override
public void execute(ReminderActivity activity, int reminderIndex) {
if (reminderIndex > 0) {
moveReminderPostion(activity, reminderIndex, reminderIndex - 1);
}
}
},
MOVE_DOWN("Move Down") {
@Override
public void execute(ReminderActivity activity, int reminderIndex) {
if (reminderIndex < activity.getListAdapter().getCount() - 1) {
moveReminderPostion(activity, reminderIndex, reminderIndex + 1);
}
}
};
private final String _displayName;
private ReminderContextMenu(String displayName) {
_displayName = displayName;
}
public String getDisplayName() {
return _displayName;
}
public abstract void execute(ReminderActivity activity, int reminderIndex);
private static void moveReminderPostion(ReminderActivity activity, int reminderIndex, int toIndex) {
Reminder reminder = activity._reminders.remove(reminderIndex);
activity._reminders.add(toIndex, reminder);
activity._globalPreferences.saveReminders(activity._nextMoonEvent, activity._reminders);
activity.getListAdapter().notifyDataSetChanged();
}
}
}