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