CellBroadcastListActivity.java revision 00b87064abfb9d254fbbf72110643d2e626365e6
150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby/* 250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * Copyright (C) 2011 The Android Open Source Project 350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * 450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * Licensed under the Apache License, Version 2.0 (the "License"); 550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * you may not use this file except in compliance with the License. 650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * You may obtain a copy of the License at 750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * 850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * http://www.apache.org/licenses/LICENSE-2.0 950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * 1050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * Unless required by applicable law or agreed to in writing, software 1150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * distributed under the License is distributed on an "AS IS" BASIS, 1250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * See the License for the specific language governing permissions and 1450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * limitations under the License. 1550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby */ 1650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 1750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambypackage com.android.cellbroadcastreceiver; 1850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 1900b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.app.Activity; 2050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.app.AlertDialog; 2100b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.app.FragmentManager; 2200b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.app.ListFragment; 2300b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.app.LoaderManager; 2450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.app.NotificationManager; 2550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.content.Context; 2650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.content.DialogInterface; 2750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.content.DialogInterface.OnClickListener; 2850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.content.Intent; 2900b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.content.Loader; 3050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.database.Cursor; 3150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.os.Bundle; 3200b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.util.Log; 3350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.view.ContextMenu; 3450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.view.ContextMenu.ContextMenuInfo; 3500b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.view.LayoutInflater; 3650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.view.Menu; 3700b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.view.MenuInflater; 3850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.view.MenuItem; 3950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.view.View; 4050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.view.View.OnCreateContextMenuListener; 4100b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.view.ViewGroup; 4200b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.widget.CursorAdapter; 4350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.widget.ListView; 4450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.widget.TextView; 4550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 4650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby/** 4700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * This activity provides a list view of received cell broadcasts. Most of the work is handled 4800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * in the inner CursorLoaderListFragment class. 4950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby */ 5000b87064abfb9d254fbbf72110643d2e626365e6Jake Hambypublic class CellBroadcastListActivity extends Activity { 5100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // package local for efficient access from inner class 5200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby static final String TAG = "CellBroadcastListActivity"; 5350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 5400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 5500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby protected void onCreate(Bundle savedInstanceState) { 5600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby super.onCreate(savedInstanceState); 5750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 5800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // Dismiss the notification that brought us here (if any). 5900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby ((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)) 6000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby .cancel(CellBroadcastAlertService.NOTIFICATION_ID); 6150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 6200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby FragmentManager fm = getFragmentManager(); 6350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 6400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // Create the list fragment and add it as our sole content. 6500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby if (fm.findFragmentById(android.R.id.content) == null) { 6600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby CursorLoaderListFragment listFragment = new CursorLoaderListFragment(); 6700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby fm.beginTransaction().add(android.R.id.content, listFragment).commit(); 6800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 6900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 7050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 7100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby /** 7200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * List fragment queries SQLite database on worker thread. 7300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby */ 7400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public static class CursorLoaderListFragment extends ListFragment 7500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby implements LoaderManager.LoaderCallbacks<Cursor> { 7650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 7700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // IDs of the main menu items. 7800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby private static final int MENU_DELETE_ALL = 3; 7900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby private static final int MENU_PREFERENCES = 4; 8000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby 8100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // IDs of the context menu items (package local, accessed from inner DeleteThreadListener). 8200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby static final int MENU_DELETE = 0; 8300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby static final int MENU_VIEW = 1; 8400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby 8500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // This is the Adapter being used to display the list's data. 8600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby CursorAdapter mAdapter; 8750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 8800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 8900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public void onCreate(Bundle savedInstanceState) { 9000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby super.onCreate(savedInstanceState); 9150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 9200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // We have a menu item to show in action bar. 9300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby setHasOptionsMenu(true); 9400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby 9500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // Prepare the loader. Either re-connect with an existing one, 9600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // or start a new one. 9700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby getLoaderManager().initLoader(0, null, this); 9850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 9950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 10000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 10100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public View onCreateView(LayoutInflater inflater, ViewGroup container, 10200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby Bundle savedInstanceState) { 10300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby return inflater.inflate(R.layout.cell_broadcast_list_screen, container, false); 10450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 10550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 10600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 10700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public void onActivityCreated(Bundle savedInstanceState) { 10800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby super.onActivityCreated(savedInstanceState); 10950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 11000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // Tell database service to notify us when a new broadcast arrives. 11100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby CellBroadcastDatabaseService.setActiveListFragment(this); 11250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 11300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // Set context menu for long-press. 11400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby ListView listView = getListView(); 11500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby listView.setOnCreateContextMenuListener(mOnCreateContextMenuListener); 11650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 11700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // Create a cursor adapter to display the loaded data. 11800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby mAdapter = new CellBroadcastCursorAdapter(getActivity(), null); 11900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby setListAdapter(mAdapter); 12050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 12100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby 12200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 12300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public void onDestroy() { 12400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby super.onDestroy(); 12500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby CellBroadcastDatabaseService.setActiveListFragment(null); 12650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 12750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 12800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 12900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 13000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby menu.add(0, MENU_DELETE_ALL, 0, R.string.menu_delete_all).setIcon( 13100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby android.R.drawable.ic_menu_delete); 13200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby menu.add(0, MENU_PREFERENCES, 0, R.string.menu_preferences).setIcon( 13300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby android.R.drawable.ic_menu_preferences); 13400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 13550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 13600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 13700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public void onPrepareOptionsMenu(Menu menu) { 13800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby menu.findItem(MENU_DELETE_ALL).setVisible(!mAdapter.isEmpty()); 13900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 14050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 14100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 14200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public void onListItemClick(ListView l, View v, int position, long id) { 14300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby CellBroadcastListItem cbli = (CellBroadcastListItem) v; 14400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby showDialogAndMarkRead(cbli.getMessage()); 14500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 14650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 14700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 14800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public Loader<Cursor> onCreateLoader(int id, Bundle args) { 14900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby return new CellBroadcastCursorLoader(getActivity()); 15050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 15150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 15200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 15300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 15400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // Swap the new cursor in. (The framework will take care of closing the 15500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // old cursor once we return.) 15600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby mAdapter.swapCursor(data); 15700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 15850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 15900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 16000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public void onLoaderReset(Loader<Cursor> loader) { 16100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // This is called when the last Cursor provided to onLoadFinished() 16200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // above is about to be closed. We need to make sure we are no 16300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // longer using it. 16400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby mAdapter.swapCursor(null); 16500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 16650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 16700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby /** 16800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * Callback from CellBroadcastDatabaseService after content changes. 16900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby */ 17000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby void databaseContentChanged() { 17100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby Loader<Cursor> loader = getLoaderManager().getLoader(0); 17200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby if (loader != null) { 17300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby loader.onContentChanged(); 17400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } else { 17500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby Log.w(TAG, "databaseContentChanged() called, but loader is null"); 17600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 17750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 17850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 17900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby private void showDialogAndMarkRead(CellBroadcastMessage cbm) { 18000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // show emergency alerts with the warning icon, but don't play alert tone 18100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby Intent i = new Intent(getActivity(), CellBroadcastAlertDialog.class); 18200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby i.putExtra(CellBroadcastMessage.SMS_CB_MESSAGE_EXTRA, cbm); 18300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby startActivity(i); 18450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 18550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 18600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby private final OnCreateContextMenuListener mOnCreateContextMenuListener = 18700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby new OnCreateContextMenuListener() { 18800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 18900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public void onCreateContextMenu(ContextMenu menu, View v, 19000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby ContextMenuInfo menuInfo) { 19100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby menu.setHeaderTitle(R.string.message_options); 19200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby menu.add(0, MENU_VIEW, 0, R.string.menu_view); 19300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby menu.add(0, MENU_DELETE, 0, R.string.menu_delete); 19400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 19500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby }; 19600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby 19700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 19800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public boolean onContextItemSelected(MenuItem item) { 19900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby Cursor cursor = mAdapter.getCursor(); 20000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby if (cursor != null && cursor.getPosition() >= 0) { 20100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby switch (item.getItemId()) { 20200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby case MENU_DELETE: 20300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // We need to decrement the unread alert count if deleting unread alert 20400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby boolean isUnread = 20500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby (cursor.getInt(CellBroadcastDatabase.COLUMN_MESSAGE_READ) == 0); 20600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby confirmDeleteThread(cursor.getLong(CellBroadcastDatabase.COLUMN_ID), 20700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby isUnread); 20800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby break; 20900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby 21000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby case MENU_VIEW: 21100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby showDialogAndMarkRead(CellBroadcastMessage.createFromCursor(cursor)); 21200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby break; 21300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby 21400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby default: 21500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby break; 21650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 21700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 21800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby return super.onContextItemSelected(item); 21900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 22050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 22100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 22200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public boolean onOptionsItemSelected(MenuItem item) { 22300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby switch(item.getItemId()) { 22400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby case MENU_DELETE_ALL: 22500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby confirmDeleteThread(-1, false); 22650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby break; 22750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 22800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby case MENU_PREFERENCES: 22900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby Intent intent = new Intent(getActivity(), CellBroadcastSettings.class); 23000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby startActivity(intent); 23150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby break; 23250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 23350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby default: 23400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby return true; 23550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 23600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby return false; 23750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 23850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 23900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby /** 24000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * Start the process of putting up a dialog to confirm deleting a broadcast. 24100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * @param rowId the row ID of the broadcast to delete, or -1 to delete all broadcasts 24200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * @param unread true if the alert was not already marked as read 24300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby */ 24400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public void confirmDeleteThread(long rowId, boolean unread) { 24500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby DeleteThreadListener listener = new DeleteThreadListener(rowId, unread); 24600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby confirmDeleteThreadDialog(listener, (rowId == -1), getActivity()); 24700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 24850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 24900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby /** 25000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * Build and show the proper delete broadcast dialog. The UI is slightly different 25100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * depending on whether there are locked messages in the thread(s) and whether we're 25200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * deleting a single broadcast or all broadcasts. 25300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * @param listener gets called when the delete button is pressed 25400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * @param deleteAll whether to show a single thread or all threads UI 25500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * @param context used to load the various UI elements 25600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby */ 25700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public static void confirmDeleteThreadDialog(DeleteThreadListener listener, 25800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby boolean deleteAll, Context context) { 25900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby View contents = View.inflate(context, R.layout.delete_broadcast_dialog_view, null); 26000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby TextView msg = (TextView)contents.findViewById(R.id.message); 26100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby msg.setText(deleteAll 26200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby ? R.string.confirm_delete_all_broadcasts 26300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby : R.string.confirm_delete_broadcast); 26400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby 26500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby AlertDialog.Builder builder = new AlertDialog.Builder(context); 26600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby builder.setTitle(R.string.confirm_dialog_title) 26700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby .setIcon(android.R.drawable.ic_dialog_alert) 26800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby .setCancelable(true) 26900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby .setPositiveButton(R.string.button_delete, listener) 27000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby .setNegativeButton(R.string.button_cancel, null) 27100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby .setView(contents) 27200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby .show(); 27300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 27450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 27500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public class DeleteThreadListener implements OnClickListener { 27600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby private final long mRowId; 27700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby private final boolean mIsUnread; 27850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 27900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public DeleteThreadListener(long rowId, boolean unread) { 28000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby mRowId = rowId; 28100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby mIsUnread = unread; 28200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 28350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 28400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 28500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public void onClick(DialogInterface dialog, int whichButton) { 28650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby // delete from database on a separate service thread 28700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby Intent dbWriteIntent = new Intent(getActivity(), 28850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby CellBroadcastDatabaseService.class); 28900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby if (mRowId != -1) { 29000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby dbWriteIntent.setAction(CellBroadcastDatabaseService.ACTION_DELETE_BROADCAST); 29100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby dbWriteIntent.putExtra(CellBroadcastDatabaseService.DATABASE_ROW_ID_EXTRA, 29200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby mRowId); 29300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby if (mIsUnread) { 29400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // decrement unread alert count after delete 29500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby dbWriteIntent.putExtra( 29600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby CellBroadcastDatabaseService.DECREMENT_UNREAD_ALERT_COUNT, true); 29700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 29800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } else { 29900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby dbWriteIntent.setAction( 30000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby CellBroadcastDatabaseService.ACTION_DELETE_ALL_BROADCASTS); 30100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 30200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby getActivity().startService(dbWriteIntent); 30300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby dialog.dismiss(); 30450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 30550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 30650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 30750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 30800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 30900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby protected void onNewIntent(Intent intent) { 31050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby if (intent == null) { 31150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby return; 31250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 31300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby 31450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby Bundle extras = intent.getExtras(); 31550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby if (extras == null) { 31650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby return; 31750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 31850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 31950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby CellBroadcastMessage cbm = extras.getParcelable(CellBroadcastMessage.SMS_CB_MESSAGE_EXTRA); 32050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby int notificationId = extras.getInt(CellBroadcastAlertService.SMS_CB_NOTIFICATION_ID_EXTRA); 32150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 32250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby // Dismiss the notification that brought us here. 32350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby NotificationManager notificationManager = 32450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); 32550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby notificationManager.cancel(notificationId); 32650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 32700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // launch the dialog activity to show the alert 32800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby Intent i = new Intent(this, CellBroadcastAlertDialog.class); 32900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby i.putExtra(CellBroadcastMessage.SMS_CB_MESSAGE_EXTRA, cbm); 33000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby startActivity(i); 33150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 33250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby} 333