ConversationList.java revision 20b79e068c8aebff46f24fd3803cf7697df4eac4
172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/*
272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Copyright (C) 2008 Esmertec AG.
372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *
572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * you may not use this file except in compliance with the License.
772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * You may obtain a copy of the License at
872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *
972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
1072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *
1172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * See the License for the specific language governing permissions and
1572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * limitations under the License.
1672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */
1772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
1872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpackage com.android.mms.ui;
1972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
2072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.R;
211d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrickimport com.android.mms.data.Contact;
2270c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrickimport com.android.mms.data.Conversation;
2372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.transaction.MessagingNotification;
2472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.util.ContactInfoCache;
2507e7775d5a792334b89436bf5479bfd5abeeb8c4Ficus Kirkpatrickimport com.android.mms.util.DraftCache;
2607e7775d5a792334b89436bf5479bfd5abeeb8c4Ficus Kirkpatrick
2772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.google.android.mms.pdu.PduHeaders;
2872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.google.android.mms.util.SqliteWrapper;
2972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
3072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.app.AlertDialog;
3172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.app.ListActivity;
3272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.AsyncQueryHandler;
3372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.ContentResolver;
3472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.ContentUris;
3572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.DialogInterface;
3672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.Intent;
3772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.DialogInterface.OnClickListener;
3872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.res.Configuration;
3972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.database.Cursor;
4072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.database.sqlite.SQLiteException;
4172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.net.Uri;
4272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.os.Bundle;
4372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.provider.Contacts;
4472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.provider.Contacts.People;
457d3e1caa6000b0bbab0716b1815c2c7177d67948Tom Taylorimport android.provider.Contacts.Intents.Insert;
4620b79e068c8aebff46f24fd3803cf7697df4eac4Ficus Kirkpatrickimport android.provider.Telephony.Mms;
4772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.util.Config;
4872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.util.Log;
4972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.ContextMenu;
5072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.KeyEvent;
5172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.LayoutInflater;
5272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.Menu;
5372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.MenuItem;
5472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.View;
5572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.Window;
5672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.ContextMenu.ContextMenuInfo;
5772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.View.OnCreateContextMenuListener;
5872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.View.OnKeyListener;
5972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.AdapterView;
6072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.ListView;
6172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
6272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/**
6372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * This activity provides a list view of existing conversations.
6472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */
65b530437ceaad97151be691067191f48e1e93b87eFicus Kirkpatrickpublic class ConversationList extends ListActivity
66b530437ceaad97151be691067191f48e1e93b87eFicus Kirkpatrick            implements DraftCache.OnDraftChangedListener {
6772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final String TAG = "ConversationList";
6872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final boolean DEBUG = false;
6972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final boolean LOCAL_LOGV = Config.LOGV && DEBUG;
7072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
7172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final int THREAD_LIST_QUERY_TOKEN = 1701;
7272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
7372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final int DELETE_CONVERSATION_TOKEN = 1801;
7472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
7572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    // IDs of the main menu items.
76cb5481d8b2a15ba206520b76a48bca140bc9efdcTom Taylor    public static final int MENU_COMPOSE_NEW          = 0;
77cb5481d8b2a15ba206520b76a48bca140bc9efdcTom Taylor    public static final int MENU_SEARCH               = 1;
78cb5481d8b2a15ba206520b76a48bca140bc9efdcTom Taylor    public static final int MENU_DELETE_ALL           = 3;
79cb5481d8b2a15ba206520b76a48bca140bc9efdcTom Taylor    public static final int MENU_PREFERENCES          = 4;
8072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
8172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    // IDs of the context menu items for the list of conversations.
8248da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor    public static final int MENU_DELETE               = 0;
8348da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor    public static final int MENU_VIEW                 = 1;
8448da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor    public static final int MENU_VIEW_CONTACT         = 2;
8548da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor    public static final int MENU_ADD_TO_CONTACTS      = 3;
86cb5481d8b2a15ba206520b76a48bca140bc9efdcTom Taylor
8772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private ThreadListQueryHandler mQueryHandler;
8872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private ConversationListAdapter mListAdapter;
8972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private CharSequence mTitle;
9072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
9172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
9272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * An interface that's passed down to ListAdapters to use
9372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * for looking up the names of contact numbers.
9472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
9572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public static interface CachingNameStore {
9672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Returns comma-separated list of contact's display names
9772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // given a semicolon-delimited string of canonical phone
9872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // numbers.
9972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        public String getContactNames(String addresses);
100cb5481d8b2a15ba206520b76a48bca140bc9efdcTom Taylor
101cb5481d8b2a15ba206520b76a48bca140bc9efdcTom Taylor        public void invalidateCache();
10272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
10372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
10472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
10572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void onCreate(Bundle savedInstanceState) {
10672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super.onCreate(savedInstanceState);
10772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
10872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
10972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        setContentView(R.layout.conversation_list_screen);
11072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
11172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mQueryHandler = new ThreadListQueryHandler(getContentResolver());
11272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
11372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        ListView listView = getListView();
11472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        LayoutInflater inflater = LayoutInflater.from(this);
11572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        ConversationHeaderView headerView = (ConversationHeaderView)
11672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                inflater.inflate(R.layout.conversation_header, listView, false);
11772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        headerView.bind(getString(R.string.new_message),
11872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                getString(R.string.create_new_message));
11972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        listView.addHeaderView(headerView, null, true);
12072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
12172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        listView.setOnCreateContextMenuListener(mConvListOnCreateContextMenuListener);
12272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        listView.setOnKeyListener(mThreadListKeyListener);
12372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
12459cd1f499645badf8df9e2820b29d28fc1835e79Ficus Kirkpatrick        initListAdapter();
12559cd1f499645badf8df9e2820b29d28fc1835e79Ficus Kirkpatrick
12672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        handleCreationIntent(getIntent());
12772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
12872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
12959cd1f499645badf8df9e2820b29d28fc1835e79Ficus Kirkpatrick    private void initListAdapter() {
1301d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick        mListAdapter = new ConversationListAdapter(this, null);
13159cd1f499645badf8df9e2820b29d28fc1835e79Ficus Kirkpatrick        setListAdapter(mListAdapter);
13259cd1f499645badf8df9e2820b29d28fc1835e79Ficus Kirkpatrick    }
13359cd1f499645badf8df9e2820b29d28fc1835e79Ficus Kirkpatrick
13472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    static public boolean isFailedToDeliver(Intent intent) {
13572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return (intent != null) && intent.getBooleanExtra("undelivered_flag", false);
13672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
13772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
13872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
13972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void onNewIntent(Intent intent) {
14072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Handle intents that occur after the activity has already been created.
14172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        handleCreationIntent(intent);
14272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
14372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
14472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void handleCreationIntent(Intent intent) {
14572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Handle intents that occur upon creation of the activity.
14672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        initNormalQueryArgs();
147591d17e9a51bb9f829d6860dc7aa0bad25062cd5The Android Open Source Project   }
14872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
14972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
15072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void onResume() {
15172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super.onResume();
15272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
153b530437ceaad97151be691067191f48e1e93b87eFicus Kirkpatrick        DraftCache.getInstance().addOnDraftChangedListener(this);
154b530437ceaad97151be691067191f48e1e93b87eFicus Kirkpatrick
15570c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick        Conversation.cleanup(this);
15672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
157598ca14f5d7d26d6d5125d8fe0d07e50f066ff98Ficus Kirkpatrick        // Make sure the draft cache is up to date.
158598ca14f5d7d26d6d5125d8fe0d07e50f066ff98Ficus Kirkpatrick        DraftCache.getInstance().refresh();
159598ca14f5d7d26d6d5125d8fe0d07e50f066ff98Ficus Kirkpatrick
16072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        startAsyncQuery();
16172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
1621d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick        Contact.invalidateCache();
16372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
16472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
16572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
16672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void onPause() {
16772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super.onPause();
16872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
169b530437ceaad97151be691067191f48e1e93b87eFicus Kirkpatrick        DraftCache.getInstance().removeOnDraftChangedListener(this);
17072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
17172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
17272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
17372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void onStop() {
17472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super.onStop();
17572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
17659cd1f499645badf8df9e2820b29d28fc1835e79Ficus Kirkpatrick        mListAdapter.changeCursor(null);
17772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
17872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
179b530437ceaad97151be691067191f48e1e93b87eFicus Kirkpatrick    public void onDraftChanged(long threadId, boolean hasDraft) {
18059cd1f499645badf8df9e2820b29d28fc1835e79Ficus Kirkpatrick        // Run notifyDataSetChanged() on the main thread.
18159cd1f499645badf8df9e2820b29d28fc1835e79Ficus Kirkpatrick        mQueryHandler.post(new Runnable() {
18259cd1f499645badf8df9e2820b29d28fc1835e79Ficus Kirkpatrick            public void run() {
18359cd1f499645badf8df9e2820b29d28fc1835e79Ficus Kirkpatrick                mListAdapter.notifyDataSetChanged();
18459cd1f499645badf8df9e2820b29d28fc1835e79Ficus Kirkpatrick            }
18559cd1f499645badf8df9e2820b29d28fc1835e79Ficus Kirkpatrick        });
186b530437ceaad97151be691067191f48e1e93b87eFicus Kirkpatrick    }
187b530437ceaad97151be691067191f48e1e93b87eFicus Kirkpatrick
18872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void initNormalQueryArgs() {
18972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mTitle = getString(R.string.app_label);
19072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
19172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
19272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void startAsyncQuery() {
19372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        try {
19472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            setTitle(getString(R.string.refreshing));
19572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            setProgressBarIndeterminateVisibility(true);
19672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
19770c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick            Conversation.startQueryForAll(mQueryHandler, THREAD_LIST_QUERY_TOKEN);
19872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } catch (SQLiteException e) {
19972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            SqliteWrapper.checkSQLiteException(this, e);
20072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
20172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
20272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
20372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
20472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean onPrepareOptionsMenu(Menu menu) {
20572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        menu.clear();
20672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
20772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        menu.add(0, MENU_COMPOSE_NEW, 0, R.string.menu_compose_new).setIcon(
20872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                com.android.internal.R.drawable.ic_menu_compose);
20972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Removed search as part of b/1205708
21072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        //menu.add(0, MENU_SEARCH, 0, R.string.menu_search).setIcon(
21172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        //        R.drawable.ic_menu_search).setAlphabeticShortcut(SearchManager.MENU_KEY);
21270c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick        if (mListAdapter.getCount() > 0) {
21372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            menu.add(0, MENU_DELETE_ALL, 0, R.string.menu_delete_all).setIcon(
21472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    android.R.drawable.ic_menu_delete);
21572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
21672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
21772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        menu.add(0, MENU_PREFERENCES, 0, R.string.menu_preferences).setIcon(
21872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                android.R.drawable.ic_menu_preferences);
21972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
22072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return true;
22172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
22272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
22372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
22472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
22572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        switch(item.getItemId()) {
22672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case MENU_COMPOSE_NEW:
22772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                createNewMessage();
22872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                break;
22972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case MENU_SEARCH:
23072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                onSearchRequested();
23172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                break;
23272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case MENU_DELETE_ALL:
23372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                confirmDeleteDialog(new DeleteThreadListener(-1L), true);
23472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                break;
23572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case MENU_PREFERENCES: {
23672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                Intent intent = new Intent(this, MessagingPreferenceActivity.class);
23772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                startActivityIfNeeded(intent, -1);
23872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                break;
23972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
24072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            default:
24172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                return true;
24272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
24372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return false;
24472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
24572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
24672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
24772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void onListItemClick(ListView l, View v, int position, long id) {
24872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (LOCAL_LOGV) {
24972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Log.v(TAG, "onListItemClick: position=" + position + ", id=" + id);
25072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
25172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
25272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (position == 0) {
25372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            createNewMessage();
25472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (v instanceof ConversationHeaderView) {
25572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            ConversationHeaderView headerView = (ConversationHeaderView) v;
25672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            ConversationHeader ch = headerView.getConversationHeader();
257ab6141d9c98f1a6024fac52fe3c897076d8549c0Ficus Kirkpatrick            openThread(ch.getThreadId());
25872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
25972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
26072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
26172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void createNewMessage() {
26272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Intent intent = new Intent(this, ComposeMessageActivity.class);
26372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        startActivity(intent);
26472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
26572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
266ab6141d9c98f1a6024fac52fe3c897076d8549c0Ficus Kirkpatrick    private void openThread(long threadId) {
26772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Intent intent = new Intent(this, ComposeMessageActivity.class);
26872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        intent.putExtra("thread_id", threadId);
26972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        startActivity(intent);
27072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
27172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
27272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void viewContact(String address) {
27372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // address must be a single recipient
27472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        ContactInfoCache cache = ContactInfoCache.getInstance();
27566dde9460badebf8e740275cabde9cca256006ebFicus Kirkpatrick        ContactInfoCache.CacheEntry info = cache.getContactInfo(address);
2765d2d0046ada7b53205e537d8675d32a8785e8d1dThe Android Open Source Project        if (info != null && info.person_id > 0) {
27772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Uri uri = ContentUris.withAppendedId(People.CONTENT_URI, info.person_id);
27872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Intent intent = new Intent(Intent.ACTION_VIEW, uri);
27972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            startActivity(intent);
28072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
28172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
28272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
2837d3e1caa6000b0bbab0716b1815c2c7177d67948Tom Taylor    public static Intent createAddContactIntent(String address) {
2847d3e1caa6000b0bbab0716b1815c2c7177d67948Tom Taylor        // address must be a single recipient
2851bb6975b0a9a5a4b38aef689305b1e7eb5b61b08Tom Taylor        Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
2861bb6975b0a9a5a4b38aef689305b1e7eb5b61b08Tom Taylor        intent.setType(Contacts.People.CONTENT_ITEM_TYPE);
28720b79e068c8aebff46f24fd3803cf7697df4eac4Ficus Kirkpatrick        if (Mms.isEmailAddress(address)) {
2887d3e1caa6000b0bbab0716b1815c2c7177d67948Tom Taylor            intent.putExtra(Insert.EMAIL, address);
28920b79e068c8aebff46f24fd3803cf7697df4eac4Ficus Kirkpatrick        } else {
29020b79e068c8aebff46f24fd3803cf7697df4eac4Ficus Kirkpatrick            intent.putExtra(Insert.PHONE, address);
2917d3e1caa6000b0bbab0716b1815c2c7177d67948Tom Taylor        }
29219be5b3fbe66749f6bc030c9776936b0602ed62fTom Taylor
2937d3e1caa6000b0bbab0716b1815c2c7177d67948Tom Taylor        return intent;
2947d3e1caa6000b0bbab0716b1815c2c7177d67948Tom Taylor    }
2957d3e1caa6000b0bbab0716b1815c2c7177d67948Tom Taylor
29672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private final OnCreateContextMenuListener mConvListOnCreateContextMenuListener =
29772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        new OnCreateContextMenuListener() {
29872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        public void onCreateContextMenu(ContextMenu menu, View v,
29972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                ContextMenuInfo menuInfo) {
30059cd1f499645badf8df9e2820b29d28fc1835e79Ficus Kirkpatrick            Cursor cursor = mListAdapter.getCursor();
30170c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick            Conversation conv = Conversation.from(ConversationList.this, cursor);
30270c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick
30370c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick            String address = MessageUtils.getRecipientsByIds(
30470c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick                    ConversationList.this, conv.getRecipientIds(), true);
30570c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick            // The Recipient IDs column is separated with semicolons for some reason.
30670c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick            // We should fix this in the content provider rework.
30770c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick            ContactInfoCache cache = ContactInfoCache.getInstance();
30870c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick            CharSequence from = cache.getContactName(address).replace(';', ',');
30970c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick            menu.setHeaderTitle(from);
31070c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick
31170c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick            AdapterView.AdapterContextMenuInfo info =
31270c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick                (AdapterView.AdapterContextMenuInfo) menuInfo;
31370c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick            if (info.position > 0) {
31470c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick                menu.add(0, MENU_VIEW, 0, R.string.menu_view);
31570c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick
31670c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick                // Only show if there's a single recipient
31770c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick                String recipient = getAddress(conv);
31870c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick                if (!recipient.contains(";")) {
31970c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick                    // do we have this recipient in contacts?
32070c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick                    ContactInfoCache.CacheEntry entry = cache.getContactInfo(recipient);
32170c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick
32270c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick                    if (entry != null && entry.person_id > 0) {
32370c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick                        menu.add(0, MENU_VIEW_CONTACT, 0, R.string.menu_view_contact);
32470c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick                    } else {
32570c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick                        menu.add(0, MENU_ADD_TO_CONTACTS, 0, R.string.menu_add_to_contacts);
32672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    }
32772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                }
32870c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick                menu.add(0, MENU_DELETE, 0, R.string.menu_delete);
32972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
33072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
33172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    };
33272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
33372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
33472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean onContextItemSelected(MenuItem item) {
33559cd1f499645badf8df9e2820b29d28fc1835e79Ficus Kirkpatrick        Cursor cursor = mListAdapter.getCursor();
33670c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick        Conversation conv = Conversation.from(ConversationList.this, cursor);
33770c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick        long threadId = conv.getThreadId();
33872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        switch (item.getItemId()) {
33972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case MENU_DELETE: {
34072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                DeleteThreadListener l = new DeleteThreadListener(threadId);
34172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                confirmDeleteDialog(l, false);
34272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                break;
34372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
34472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case MENU_VIEW: {
345ab6141d9c98f1a6024fac52fe3c897076d8549c0Ficus Kirkpatrick                openThread(threadId);
34672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                break;
34772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
34872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case MENU_VIEW_CONTACT: {
34970c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick                String address = getAddress(conv);
35072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                viewContact(address);
35172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                break;
35272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
3537d3e1caa6000b0bbab0716b1815c2c7177d67948Tom Taylor            case MENU_ADD_TO_CONTACTS: {
35470c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick                String address = getAddress(conv);
3557d3e1caa6000b0bbab0716b1815c2c7177d67948Tom Taylor                startActivity(createAddContactIntent(address));
3567d3e1caa6000b0bbab0716b1815c2c7177d67948Tom Taylor                break;
3577d3e1caa6000b0bbab0716b1815c2c7177d67948Tom Taylor            }
35872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            default:
35972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                break;
36072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
36172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
36272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return super.onContextItemSelected(item);
36372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
36472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
36570c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick    private String getAddress(Conversation conv) {
36670c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick        return MessageUtils.getRecipientsByIds(this, conv.getRecipientIds(), true);
36772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
36872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
36972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void onConfigurationChanged(Configuration newConfig) {
37072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // We override this method to avoid restarting the entire
37172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // activity when the keyboard is opened (declared in
37272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // AndroidManifest.xml).  Because the only translatable text
37372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // in this activity is "New Message", which has the full width
37472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // of phone to work with, localization shouldn't be a problem:
37572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // no abbreviated alternate words should be needed even in
37672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // 'wide' languages like German or Russian.
37772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
37872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super.onConfigurationChanged(newConfig);
37972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (DEBUG) Log.v(TAG, "onConfigurationChanged: " + newConfig);
38072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
38172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
38272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void confirmDeleteDialog(OnClickListener listener, boolean deleteAll) {
38372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        AlertDialog.Builder builder = new AlertDialog.Builder(this);
38472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        builder.setTitle(R.string.confirm_dialog_title);
38572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        builder.setIcon(android.R.drawable.ic_dialog_alert);
38672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        builder.setCancelable(true);
38772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        builder.setPositiveButton(R.string.yes, listener);
38872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        builder.setNegativeButton(R.string.no, null);
38972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        builder.setMessage(deleteAll
39072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                ? R.string.confirm_delete_all_conversations
39172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                : R.string.confirm_delete_conversation);
39272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
39372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        builder.show();
39472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
39572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
39672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private final OnKeyListener mThreadListKeyListener = new OnKeyListener() {
39772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        public boolean onKey(View v, int keyCode, KeyEvent event) {
39872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (event.getAction() == KeyEvent.ACTION_DOWN) {
39972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                switch (keyCode) {
40072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    case KeyEvent.KEYCODE_DEL: {
40172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        long id = getListView().getSelectedItemId();
40272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        if (id > 0) {
40372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                            DeleteThreadListener l = new DeleteThreadListener(
40472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                    id);
40572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                            confirmDeleteDialog(l, false);
40672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        }
40772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        return true;
40872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    }
40972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                }
41072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
41172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return false;
41272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
41372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    };
41472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
41572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private class DeleteThreadListener implements OnClickListener {
41672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        private final long mThreadId;
41772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
41872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        public DeleteThreadListener(long threadId) {
41972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mThreadId = threadId;
42072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
42172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
42272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        public void onClick(DialogInterface dialog, int whichButton) {
42372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            MessageUtils.handleReadReport(ConversationList.this, mThreadId,
42472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    PduHeaders.READ_STATUS__DELETED_WITHOUT_BEING_READ, new Runnable() {
42572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                public void run() {
42670c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick                    int token = DELETE_CONVERSATION_TOKEN;
42770c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick                    if (mThreadId == -1) {
42870c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick                        Conversation.startDeleteAll(mQueryHandler, token);
42970c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick                    } else {
43070c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick                        Conversation.startDelete(mQueryHandler, token, mThreadId);
43170c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick                    }
43272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                }
43372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            });
43472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
43572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
43672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
43772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private final class ThreadListQueryHandler extends AsyncQueryHandler {
43872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        public ThreadListQueryHandler(ContentResolver contentResolver) {
43972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            super(contentResolver);
44072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
44172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
44272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        @Override
44372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
44459cd1f499645badf8df9e2820b29d28fc1835e79Ficus Kirkpatrick            switch (token) {
44559cd1f499645badf8df9e2820b29d28fc1835e79Ficus Kirkpatrick            case THREAD_LIST_QUERY_TOKEN:
44659cd1f499645badf8df9e2820b29d28fc1835e79Ficus Kirkpatrick                mListAdapter.changeCursor(cursor);
44759cd1f499645badf8df9e2820b29d28fc1835e79Ficus Kirkpatrick                setTitle(mTitle);
44859cd1f499645badf8df9e2820b29d28fc1835e79Ficus Kirkpatrick                setProgressBarIndeterminateVisibility(false);
44959cd1f499645badf8df9e2820b29d28fc1835e79Ficus Kirkpatrick                break;
45059cd1f499645badf8df9e2820b29d28fc1835e79Ficus Kirkpatrick            default:
45159cd1f499645badf8df9e2820b29d28fc1835e79Ficus Kirkpatrick                Log.e(TAG, "onQueryComplete called with unknown token " + token);
45272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
45372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
45472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
45572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        @Override
45672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        protected void onDeleteComplete(int token, Object cookie, int result) {
45772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            switch (token) {
45872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case DELETE_CONVERSATION_TOKEN:
45972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                // Update the notification for new messages since they
46072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                // may be deleted.
46172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                MessagingNotification.updateNewMessageIndicator(ConversationList.this);
46272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                // Update the notification for failed messages since they
46372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                // may be deleted.
46472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                MessagingNotification.updateSendFailedNotification(ConversationList.this);
46572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
46672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                // Make sure the list reflects the delete
46772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                startAsyncQuery();
46872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
46972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                onContentChanged();
47072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                break;
47172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
47272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
47372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
47472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project}
475