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