/** * ORcycle, Copyright 2014, 2015, PSU Transportation, Technology, and People Lab. * * @author Robin Murray <robin5@pdx.edu> (code) * @author Miguel Figliozzi <figliozzi@pdx.edu> and ORcycle team (general app * design and features, report questionnaires and new ORcycle features) * * For more information on the project, go to * http://www.pdx.edu/transportation-lab/orcycle and http://www.pdx.edu/transportation-lab/app-development * * Updated/modified for Oregon pilot study and app deployment. * * ORcycle is free software: you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or any later version. * ORcycle is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU General Public License for more details. * You should have received a copy of the GNU General Public License along with * ORcycle. If not, see <http://www.gnu.org/licenses/>. * */ package edu.pdx.cecs.orcycle; import java.util.ArrayList; import android.app.Activity; import android.content.Intent; import android.database.Cursor; import android.database.SQLException; import android.graphics.Color; import android.os.Bundle; import android.util.Log; import android.view.ActionMode; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.CursorAdapter; import android.widget.ListView; public class SavedRemindersActivity extends Activity { private final class ReminderClickListener implements AdapterView.OnItemClickListener { public void onItemClick(AdapterView<?> parent, View v, int pos, long reminderId) { Log.v(MODULE_TAG, "onItemClick (id = " + String.valueOf(reminderId) + ", pos = " + String.valueOf(pos) + ")"); try { if (mActionModeNote == null) { transitionToEditReminderActivity(reminderId); } else { // highlight if (remindersToDelete.indexOf(reminderId) > -1) { remindersToDelete.remove(reminderId); v.setBackgroundColor(Color.parseColor("#80ffffff")); } else { remindersToDelete.add(reminderId); v.setBackgroundColor(Color.parseColor("#ff33b5e5")); } // Toast.makeText(this, "Selected: " + noteIdArray, // Toast.LENGTH_SHORT).show(); if (remindersToDelete.size() == 0) { mnuDelete.setEnabled(false); } else { mnuDelete.setEnabled(true); } mActionModeNote.setTitle(remindersToDelete.size() + " Selected"); } } catch(Exception ex) { Log.e(MODULE_TAG, ex.getMessage()); } } } private static final String MODULE_TAG = "RemindersActivity"; ListView lvReminders; ActionMode mActionModeNote; ArrayList<Long> remindersToDelete = new ArrayList<Long>(); private MenuItem mnuDelete; private MenuItem mnuAdd; private Cursor reminders; private SavedRemindersAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { setContentView(R.layout.activity_saved_reminders); Log.v(MODULE_TAG, "Cycle: RemindersActivity onCreateView"); //setHasOptionsMenu(true); lvReminders = (ListView) findViewById(R.id.lvReminders); populateRemindersList(lvReminders); remindersToDelete.clear(); } catch(Exception ex) { Log.e(MODULE_TAG, ex.getMessage()); } } private final ActionMode.Callback mActionModeCallbackNote = new ActionMode.Callback() { // Called when the action mode is created; startActionMode() was called @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { try { // Inflate a menu resource providing context menu items MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.saved_reminders_context_menu, menu); } catch(Exception ex) { Log.e(MODULE_TAG, ex.getMessage()); } return true; } // Called each time the action mode is shown. Always called after // onCreateActionMode, but // may be called multiple times if the mode is invalidated. @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { try { mnuDelete = menu.getItem(0); mnuDelete.setEnabled(false); mnuAdd = menu.getItem(1); mnuAdd.setEnabled(true); mode.setTitle(remindersToDelete.size() + " Selected"); } catch(Exception ex) { Log.e(MODULE_TAG, ex.getMessage()); } return false; // Return false if nothing is done } // Called when the user selects a contextual menu item @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { try { switch (item.getItemId()) { case R.id.action_delete_reminders: deleteReminders(); mode.finish(); // Action picked, so close the CAB return true; case R.id.action_cancel_delete_reminders: mode.finish(); return true; default: return false; } } catch(Exception ex) { Log.e(MODULE_TAG, ex.getMessage()); } return false; } // Called when the user exits the action mode @Override public void onDestroyActionMode(ActionMode mode) { try { int numListViewItems = lvReminders.getChildCount(); mActionModeNote = null; remindersToDelete.clear(); // Reset all list items to their normal color for (int i = 0; i < numListViewItems; i++) { lvReminders.getChildAt(i).setBackgroundColor(Color.parseColor("#80ffffff")); } } catch(Exception ex) { Log.e(MODULE_TAG, ex.getMessage()); } } }; void populateRemindersList(ListView lv) { // Get list from the real phone database. W00t! final DbAdapter mDb = new DbAdapter(this); mDb.openReadOnly(); try { reminders = mDb.fetchAllReminders(); String[] from = new String[] { DbAdapter.K_REMINDER_DAYS, DbAdapter.K_REMINDER_HOURS, DbAdapter.K_REMINDER_MINUTES, DbAdapter.K_REMINDER_ENABLED }; int[] to = new int[] { 0, 0, 0, 0 }; adapter = new SavedRemindersAdapter(this, R.layout.saved_reminders_list_item, reminders, from, to, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); lv.setAdapter(adapter); } catch (SQLException ex) { Log.e(MODULE_TAG, ex.getMessage()); // Do nothing, for now! } catch(Exception ex) { Log.e(MODULE_TAG, ex.getMessage()); } mDb.close(); lv.setOnItemClickListener(new ReminderClickListener()); registerForContextMenu(lv); } private void deleteReminders() { try { for (int i = 0; i < remindersToDelete.size(); i++) { deleteReminder(remindersToDelete.get(i)); } } catch(Exception ex) { Log.e(MODULE_TAG, ex.getMessage()); } } private void deleteReminder(long reminderId) { Reminder.cancel(this, reminderId); DbAdapter mDbHelper = new DbAdapter(this); mDbHelper.open(); try { if (!mDbHelper.deleteReminder(reminderId)) { Log.e(MODULE_TAG, "Could not delete reminder(" + String.valueOf(reminderId) + ")"); } } finally { mDbHelper.close(); } lvReminders.invalidate(); populateRemindersList(lvReminders); } // show edit button and hidden delete button @Override public void onResume() { super.onResume(); try { Log.v(MODULE_TAG, "Cycle: RemindersActivity onResume"); lvReminders.invalidate(); populateRemindersList(lvReminders); } catch(Exception ex) { Log.e(MODULE_TAG, ex.getMessage()); } } @Override public void onPause() { super.onPause(); try { Log.v(MODULE_TAG, "Cycle: RemindersActivity onPause"); } catch(Exception ex) { Log.e(MODULE_TAG, ex.getMessage()); } } @Override public void onDestroy() { super.onDestroy(); try { Log.v(MODULE_TAG, "Cycle: RemindersActivity onDestroy"); } catch(Exception ex) { Log.e(MODULE_TAG, ex.getMessage()); } } /* Creates the menu items */ @Override public boolean onCreateOptionsMenu(Menu menu) { try { // Inflate the menu items for use in the action bar getMenuInflater().inflate(R.menu.saved_reminders, menu); } catch(Exception ex) { Log.e(MODULE_TAG, ex.getMessage()); } return super.onCreateOptionsMenu(menu); } /* Handles item selections */ @Override public boolean onOptionsItemSelected(MenuItem item) { try { // Handle presses on the action bar items switch (item.getItemId()) { case R.id.action_edit_saved_reminders: // edit if (mActionModeNote != null) { return false; } // Start the CAB using the ActionMode.Callback defined above mActionModeNote = startActionMode(mActionModeCallbackNote); return true; case R.id.action_add_reminder: transitionToEditReminderActivity(-1); return true; case R.id.action_done_reminder: transitionToTabsConfigActivity(); return true; default: return super.onOptionsItemSelected(item); } } catch(Exception ex) { Log.e(MODULE_TAG, ex.getMessage()); } return false; } @Override public void onBackPressed() { try { transitionToTabsConfigActivity(); } catch(Exception ex) { Log.e(MODULE_TAG, ex.getMessage()); } } /** * Setup transition to the TabsConfigActivity */ private void transitionToTabsConfigActivity() { Intent intent = new Intent(this, TabsConfig.class); intent.putExtra(TabsConfig.EXTRA_SHOW_FRAGMENT, TabsConfig.FRAG_INDEX_SETTINGS); startActivity(intent); finish(); overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right); } /** * Setup transition to the TabsConfigActivity */ private void transitionToEditReminderActivity(long reminderId) { Intent intent = new Intent(this, EditReminderActivity.class); if (reminderId > 0) { intent.putExtra(EditReminderActivity.EXTRA_REMINDER_ID, reminderId); } startActivity(intent); //finish(); overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right); } }