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; 26da5c415f6d0999131e93384b5fb90422ada8e4daJake Hambyimport android.content.CursorLoader; 2750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.content.DialogInterface; 2850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.content.DialogInterface.OnClickListener; 2950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.content.Intent; 3000b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.content.Loader; 3150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.database.Cursor; 3250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.os.Bundle; 33da5c415f6d0999131e93384b5fb90422ada8e4daJake Hambyimport android.provider.Telephony; 34da5c415f6d0999131e93384b5fb90422ada8e4daJake Hambyimport android.telephony.CellBroadcastMessage; 3550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.view.ContextMenu; 3650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.view.ContextMenu.ContextMenuInfo; 3700b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.view.LayoutInflater; 3850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.view.Menu; 3900b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.view.MenuInflater; 4050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.view.MenuItem; 4150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.view.View; 4250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.view.View.OnCreateContextMenuListener; 4300b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.view.ViewGroup; 4400b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport android.widget.CursorAdapter; 4550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.widget.ListView; 4650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 4757273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hambyimport java.util.ArrayList; 4857273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby 4950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby/** 5000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * This activity provides a list view of received cell broadcasts. Most of the work is handled 5100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * in the inner CursorLoaderListFragment class. 5250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby */ 5300b87064abfb9d254fbbf72110643d2e626365e6Jake Hambypublic class CellBroadcastListActivity extends Activity { 5450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 5500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 5600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby protected void onCreate(Bundle savedInstanceState) { 5700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby super.onCreate(savedInstanceState); 5850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 5900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // Dismiss the notification that brought us here (if any). 6000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby ((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)) 6100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby .cancel(CellBroadcastAlertService.NOTIFICATION_ID); 6250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 6300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby FragmentManager fm = getFragmentManager(); 6450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 6500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // Create the list fragment and add it as our sole content. 6600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby if (fm.findFragmentById(android.R.id.content) == null) { 6700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby CursorLoaderListFragment listFragment = new CursorLoaderListFragment(); 6800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby fm.beginTransaction().add(android.R.id.content, listFragment).commit(); 6900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 7000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 7150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 7200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby /** 7300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * List fragment queries SQLite database on worker thread. 7400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby */ 7500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public static class CursorLoaderListFragment extends ListFragment 7600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby implements LoaderManager.LoaderCallbacks<Cursor> { 7750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 7800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // IDs of the main menu items. 7900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby private static final int MENU_DELETE_ALL = 3; 8000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby private static final int MENU_PREFERENCES = 4; 8100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby 8200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // IDs of the context menu items (package local, accessed from inner DeleteThreadListener). 8300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby static final int MENU_DELETE = 0; 84a93243d13ef0c0b29d871d483642e39c01db7c26Jake Hamby static final int MENU_VIEW_DETAILS = 1; 8500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby 8600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // This is the Adapter being used to display the list's data. 8700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby CursorAdapter mAdapter; 8850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 8900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 9000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public void onCreate(Bundle savedInstanceState) { 9100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby super.onCreate(savedInstanceState); 9250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 9300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // We have a menu item to show in action bar. 9400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby setHasOptionsMenu(true); 9550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 9650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 9700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 9800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public View onCreateView(LayoutInflater inflater, ViewGroup container, 9900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby Bundle savedInstanceState) { 10000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby return inflater.inflate(R.layout.cell_broadcast_list_screen, container, false); 10150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 10250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 10300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 10400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public void onActivityCreated(Bundle savedInstanceState) { 10500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby super.onActivityCreated(savedInstanceState); 10650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 10700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // Set context menu for long-press. 10800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby ListView listView = getListView(); 10900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby listView.setOnCreateContextMenuListener(mOnCreateContextMenuListener); 11050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 11100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // Create a cursor adapter to display the loaded data. 11200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby mAdapter = new CellBroadcastCursorAdapter(getActivity(), null); 11300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby setListAdapter(mAdapter); 11400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby 115da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby // Prepare the loader. Either re-connect with an existing one, 116da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby // or start a new one. 117da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby getLoaderManager().initLoader(0, null, this); 11850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 11950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 12000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 12100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 12200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby menu.add(0, MENU_DELETE_ALL, 0, R.string.menu_delete_all).setIcon( 12300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby android.R.drawable.ic_menu_delete); 12400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby menu.add(0, MENU_PREFERENCES, 0, R.string.menu_preferences).setIcon( 12500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby android.R.drawable.ic_menu_preferences); 12600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 12750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 12800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 12900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public void onPrepareOptionsMenu(Menu menu) { 13000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby menu.findItem(MENU_DELETE_ALL).setVisible(!mAdapter.isEmpty()); 13100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 13250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 13300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 13400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public void onListItemClick(ListView l, View v, int position, long id) { 13500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby CellBroadcastListItem cbli = (CellBroadcastListItem) v; 13600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby showDialogAndMarkRead(cbli.getMessage()); 13700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 13850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 13900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 14000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public Loader<Cursor> onCreateLoader(int id, Bundle args) { 141da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby return new CursorLoader(getActivity(), CellBroadcastContentProvider.CONTENT_URI, 142da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby Telephony.CellBroadcasts.QUERY_COLUMNS, null, null, 143da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby Telephony.CellBroadcasts.DELIVERY_TIME + " DESC"); 14450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 14550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 14600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 14700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 14800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // Swap the new cursor in. (The framework will take care of closing the 14900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // old cursor once we return.) 15000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby mAdapter.swapCursor(data); 15100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 15250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 15300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 15400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public void onLoaderReset(Loader<Cursor> loader) { 15500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // This is called when the last Cursor provided to onLoadFinished() 15600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // above is about to be closed. We need to make sure we are no 15700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // longer using it. 15800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby mAdapter.swapCursor(null); 15900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 16050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 16100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby private void showDialogAndMarkRead(CellBroadcastMessage cbm) { 16200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby // show emergency alerts with the warning icon, but don't play alert tone 16300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby Intent i = new Intent(getActivity(), CellBroadcastAlertDialog.class); 16457273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby ArrayList<CellBroadcastMessage> messageList = new ArrayList<CellBroadcastMessage>(1); 16557273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby messageList.add(cbm); 16657273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby i.putParcelableArrayListExtra(CellBroadcastMessage.SMS_CB_MESSAGE_EXTRA, messageList); 16700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby startActivity(i); 16850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 16950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 170a93243d13ef0c0b29d871d483642e39c01db7c26Jake Hamby private void showBroadcastDetails(CellBroadcastMessage cbm) { 171a93243d13ef0c0b29d871d483642e39c01db7c26Jake Hamby // show dialog with delivery date/time and alert details 172a93243d13ef0c0b29d871d483642e39c01db7c26Jake Hamby CharSequence details = CellBroadcastResources.getMessageDetails(getActivity(), cbm); 173a93243d13ef0c0b29d871d483642e39c01db7c26Jake Hamby new AlertDialog.Builder(getActivity()) 174a93243d13ef0c0b29d871d483642e39c01db7c26Jake Hamby .setTitle(R.string.view_details_title) 175a93243d13ef0c0b29d871d483642e39c01db7c26Jake Hamby .setMessage(details) 176a93243d13ef0c0b29d871d483642e39c01db7c26Jake Hamby .setCancelable(true) 177a93243d13ef0c0b29d871d483642e39c01db7c26Jake Hamby .show(); 178a93243d13ef0c0b29d871d483642e39c01db7c26Jake Hamby } 179a93243d13ef0c0b29d871d483642e39c01db7c26Jake Hamby 18000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby private final OnCreateContextMenuListener mOnCreateContextMenuListener = 18100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby new OnCreateContextMenuListener() { 18200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 18300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public void onCreateContextMenu(ContextMenu menu, View v, 18400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby ContextMenuInfo menuInfo) { 18500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby menu.setHeaderTitle(R.string.message_options); 186a93243d13ef0c0b29d871d483642e39c01db7c26Jake Hamby menu.add(0, MENU_VIEW_DETAILS, 0, R.string.menu_view_details); 18700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby menu.add(0, MENU_DELETE, 0, R.string.menu_delete); 18800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 18900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby }; 19000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby 19100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 19200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public boolean onContextItemSelected(MenuItem item) { 19300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby Cursor cursor = mAdapter.getCursor(); 19400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby if (cursor != null && cursor.getPosition() >= 0) { 19500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby switch (item.getItemId()) { 19600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby case MENU_DELETE: 197da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby confirmDeleteThread(cursor.getLong(cursor.getColumnIndexOrThrow( 19857273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby Telephony.CellBroadcasts._ID))); 19900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby break; 20000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby 201a93243d13ef0c0b29d871d483642e39c01db7c26Jake Hamby case MENU_VIEW_DETAILS: 202a93243d13ef0c0b29d871d483642e39c01db7c26Jake Hamby showBroadcastDetails(CellBroadcastMessage.createFromCursor(cursor)); 20300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby break; 20400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby 20500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby default: 20600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby break; 20750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 20800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 20900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby return super.onContextItemSelected(item); 21000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 21150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 21200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 21300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public boolean onOptionsItemSelected(MenuItem item) { 21400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby switch(item.getItemId()) { 21500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby case MENU_DELETE_ALL: 21657273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby confirmDeleteThread(-1); 21750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby break; 21850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 21900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby case MENU_PREFERENCES: 22000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby Intent intent = new Intent(getActivity(), CellBroadcastSettings.class); 22100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby startActivity(intent); 22250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby break; 22350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 22450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby default: 22500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby return true; 22650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 22700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby return false; 22850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 22950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 23000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby /** 23100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * Start the process of putting up a dialog to confirm deleting a broadcast. 23200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * @param rowId the row ID of the broadcast to delete, or -1 to delete all broadcasts 23300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby */ 23457273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby public void confirmDeleteThread(long rowId) { 23557273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby DeleteThreadListener listener = new DeleteThreadListener(rowId); 23600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby confirmDeleteThreadDialog(listener, (rowId == -1), getActivity()); 23700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 23850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 23900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby /** 24000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * Build and show the proper delete broadcast dialog. The UI is slightly different 24100b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * depending on whether there are locked messages in the thread(s) and whether we're 24200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * deleting a single broadcast or all broadcasts. 24300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * @param listener gets called when the delete button is pressed 24400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * @param deleteAll whether to show a single thread or all threads UI 24500b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby * @param context used to load the various UI elements 24600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby */ 24700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public static void confirmDeleteThreadDialog(DeleteThreadListener listener, 24800b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby boolean deleteAll, Context context) { 24900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby AlertDialog.Builder builder = new AlertDialog.Builder(context); 2501da698fa2e034f9ed46c1e2dfea4368afb6c0026Björn Lundén builder.setIconAttribute(android.R.attr.alertDialogIcon) 251da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby .setCancelable(true) 252da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby .setPositiveButton(R.string.button_delete, listener) 253da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby .setNegativeButton(R.string.button_cancel, null) 254da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby .setMessage(deleteAll ? R.string.confirm_delete_all_broadcasts 255da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby : R.string.confirm_delete_broadcast) 256da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby .show(); 25700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 25850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 25900b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public class DeleteThreadListener implements OnClickListener { 26000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby private final long mRowId; 26150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 26257273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby public DeleteThreadListener(long rowId) { 26300b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby mRowId = rowId; 26400b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby } 26550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 26600b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby @Override 26700b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby public void onClick(DialogInterface dialog, int whichButton) { 268da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby // delete from database on a background thread 269da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby new CellBroadcastContentProvider.AsyncCellBroadcastTask( 270da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby getActivity().getContentResolver()).execute( 271da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby new CellBroadcastContentProvider.CellBroadcastOperation() { 272da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby @Override 273da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby public boolean execute(CellBroadcastContentProvider provider) { 274da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby if (mRowId != -1) { 27557273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby return provider.deleteBroadcast(mRowId); 276da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby } else { 277da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby return provider.deleteAllBroadcasts(); 278da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby } 279da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby } 280da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby }); 281da5c415f6d0999131e93384b5fb90422ada8e4daJake Hamby 28200b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby dialog.dismiss(); 28350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 28450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 28550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 28650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby} 287