package com.evancharlton.mileage.views.intervals; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Map; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.ListActivity; import android.app.NotificationManager; import android.content.ContentUris; import android.content.DialogInterface; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ContextMenu.ContextMenuInfo; import android.widget.AdapterView; import android.widget.ListView; import android.widget.SimpleCursorAdapter; import android.widget.TextView; import android.widget.AdapterView.AdapterContextMenuInfo; import com.evancharlton.mileage.HelpDialog; import com.evancharlton.mileage.PreferencesProvider; import com.evancharlton.mileage.R; import com.evancharlton.mileage.models.ServiceInterval; import com.evancharlton.mileage.models.Vehicle; public class ServiceIntervalsView extends ListActivity { private static final int MENU_ADD = Menu.FIRST; private static final int MENU_DELETE = Menu.FIRST + 1; private static final int MENU_EDIT = Menu.FIRST + 2; private static final String DELETE_ID = "delete_id"; private long m_deleteId = -1; private AlertDialog m_deleteDialog; private AlertDialog m_deleteExpiredDialog; private Map<Long, String> m_vehicleTitles = new HashMap<Long, String>(); private PreferencesProvider m_prefs; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.intervals); setTitle(R.string.service_intervals); m_prefs = PreferencesProvider.getInstance(this); getListView().setOnCreateContextMenuListener(this); Cursor vehicleCursor = managedQuery(Vehicle.CONTENT_URI, Vehicle.getProjection(), null, null, Vehicle.DEFAULT_SORT_ORDER); vehicleCursor.moveToFirst(); while (vehicleCursor.isAfterLast() == false) { m_vehicleTitles.put(vehicleCursor.getLong(vehicleCursor.getColumnIndex(Vehicle._ID)), vehicleCursor.getString(vehicleCursor.getColumnIndex(Vehicle.TITLE))); vehicleCursor.moveToNext(); } Cursor c = managedQuery(ServiceInterval.CONTENT_URI, ServiceInterval.getProjection(), null, null, ServiceInterval.DEFAULT_SORT_ORDER); SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.intervals_row, c, new String[] { ServiceInterval.DESCRIPTION, ServiceInterval.VEHICLE_ID, ServiceInterval.DISTANCE, ServiceInterval.DURATION }, new int[] { R.id.description, R.id.vehicle, R.id.distance, R.id.duration }); adapter.setViewBinder(m_viewBinder); setListAdapter(adapter); m_deleteDialog = new AlertDialog.Builder(this).create(); m_deleteDialog.setMessage(getString(R.string.confirm_delete)); m_deleteDialog.setCancelable(false); m_deleteDialog.setButton(getString(android.R.string.yes), m_deleteListener); m_deleteDialog.setButton2(getString(android.R.string.no), m_deleteListener); m_deleteExpiredDialog = new AlertDialog.Builder(this).create(); m_deleteExpiredDialog.setCancelable(false); m_deleteExpiredDialog.setButton(getString(android.R.string.yes), m_deleteExpiredListener); m_deleteExpiredDialog.setButton2(getString(android.R.string.no), m_deleteExpiredListener); m_deleteExpiredDialog.setButton3(getString(R.string.service_interval_remind), m_deleteExpiredListener); // see if we came here from a notification Intent i = getIntent(); Bundle extras = i.getExtras(); if (extras != null) { long id = extras.getLong(ServiceInterval._ID, -1L); if (id >= 0) { try { ServiceInterval si = new ServiceInterval(id); Vehicle v = new Vehicle(si.getVehicleId()); m_deleteId = id; m_deleteExpiredDialog.setTitle(si.getDescription()); m_deleteExpiredDialog.setMessage(getString(R.string.service_interval_confirm_delete_expired, v.getTitle())); m_deleteExpiredDialog.show(); NotificationManager notificationMgr = (NotificationManager) this.getSystemService(Activity.NOTIFICATION_SERVICE); if (notificationMgr != null) { notificationMgr.cancel((int) id); } } catch (IllegalArgumentException e) { e.printStackTrace(); } } } Bundle data = (Bundle) getLastNonConfigurationInstance(); if (data != null) { m_deleteId = data.getLong(DELETE_ID, -1); } } @Override public Object onRetainNonConfigurationInstance() { Bundle data = new Bundle(); data.putLong(DELETE_ID, m_deleteId); return data; } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(Menu.NONE, MENU_ADD, 0, R.string.add_service_interval).setShortcut('1', 'a').setIcon(R.drawable.ic_menu_add); HelpDialog.injectHelp(menu, 'h'); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case MENU_ADD: Intent i = new Intent(); i.setClass(ServiceIntervalsView.this, AddServiceIntervalView.class); startActivity(i); break; case HelpDialog.MENU_HELP: HelpDialog.create(this, R.string.help_title_service_intervals, R.string.help_service_intervals); break; } return super.onOptionsItemSelected(item); } @Override protected void onListItemClick(ListView lv, View v, int position, long id) { Uri uri = ContentUris.withAppendedId(ServiceInterval.CONTENT_URI, id); Intent intent = new Intent(); intent.setData(uri); intent.setClass(ServiceIntervalsView.this, EditServiceIntervalView.class); startActivity(intent); } public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo info) { menu.setHeaderTitle(R.string.operations); menu.add(Menu.NONE, MENU_EDIT, Menu.NONE, R.string.edit); menu.add(Menu.NONE, MENU_DELETE, Menu.NONE, R.string.delete); } public boolean onContextItemSelected(MenuItem item) { AdapterView.AdapterContextMenuInfo info = null; try { info = (AdapterContextMenuInfo) item.getMenuInfo(); long id = getListAdapter().getItemId(info.position); switch (item.getItemId()) { case MENU_DELETE: m_deleteId = id; m_deleteDialog.show(); return true; case MENU_EDIT: onListItemClick(getListView(), info.targetView, info.position, id); return true; } } catch (ClassCastException e) { // fail gracefully? } return super.onContextItemSelected(item); } private void delete() { ServiceInterval si = new ServiceInterval(m_deleteId); si.cancelAlarm(this); Uri uri = ContentUris.withAppendedId(ServiceInterval.CONTENT_URI, m_deleteId); getContentResolver().delete(uri, null, null); } private void procrastinate() { ServiceInterval interval = new ServiceInterval(m_deleteId); Calendar cal = Calendar.getInstance(); cal.add(Calendar.DAY_OF_MONTH, 1); long now = cal.getTimeInMillis(); long duration = now - interval.getCreateDate().getTimeInMillis(); interval.setDuration(duration); interval.save(); interval.scheduleAlarm(ServiceIntervalsView.this); finish(); } private DialogInterface.OnClickListener m_deleteListener = new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); if (which == Dialog.BUTTON1) { delete(); } } }; private DialogInterface.OnClickListener m_deleteExpiredListener = new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); if (which == Dialog.BUTTON1) { delete(); } else if (which == Dialog.BUTTON3) { procrastinate(); } } }; private SimpleCursorAdapter.ViewBinder m_viewBinder = new SimpleCursorAdapter.ViewBinder() { public boolean setViewValue(View view, Cursor cursor, int index) { String colName = cursor.getColumnName(index); TextView textView = (TextView) view; String text = null; if (colName.equals(ServiceInterval.VEHICLE_ID)) { text = String.format("%s @ ", m_vehicleTitles.get(cursor.getLong(index))); } else if (colName.equals(ServiceInterval.DURATION)) { long time = cursor.getLong(cursor.getColumnIndex(ServiceInterval.CREATE_DATE)); time += cursor.getLong(index); Date d = new Date(time); text = String.format("%s", m_prefs.format(d)); } else if (colName.equals(ServiceInterval.DISTANCE)) { double odometer = cursor.getDouble(cursor.getColumnIndex(ServiceInterval.CREATE_ODOMETER)); odometer += cursor.getDouble(index);; text = String.format("%s %s | ", m_prefs.shortFormat(odometer), m_prefs.getCalculator().getDistanceUnitsAbbr().trim()); } if (text != null) { textView.setText(text); return true; } return false; } }; }