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
206d0646916bac17a1ee627a0aa15d3345ff9b5479Tom Taylorimport android.app.ActionBar;
2172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.app.Activity;
2272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.app.AlertDialog;
2372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.AsyncQueryHandler;
246cc9ffec5ce3fb72b5049a2e1dfd1ed0b802a2c4Arun Ravindranimport android.content.BroadcastReceiver;
2572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.ContentResolver;
266cc9ffec5ce3fb72b5049a2e1dfd1ed0b802a2c4Arun Ravindranimport android.content.Context;
2772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.DialogInterface;
2872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.DialogInterface.OnClickListener;
29d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport android.content.Intent;
306cc9ffec5ce3fb72b5049a2e1dfd1ed0b802a2c4Arun Ravindranimport android.content.IntentFilter;
3172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.database.ContentObserver;
3272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.database.Cursor;
3372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.database.sqlite.SQLiteException;
34d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport android.database.sqlite.SqliteWrapper;
3572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.net.Uri;
3672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.os.Bundle;
3772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.os.Handler;
38f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport android.provider.Telephony.Sms;
3937321876549776417f035118f157d9531f73de6bWink Savilleimport android.telephony.SmsManager;
4072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.util.Log;
4172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.ContextMenu;
4272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.Menu;
4372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.MenuItem;
4472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.View;
4572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.Window;
4672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.AdapterView;
4772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.ListView;
4872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.TextView;
4972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
506cc9ffec5ce3fb72b5049a2e1dfd1ed0b802a2c4Arun Ravindranimport com.android.internal.telephony.IccCardConstants;
516cc9ffec5ce3fb72b5049a2e1dfd1ed0b802a2c4Arun Ravindranimport com.android.internal.telephony.TelephonyIntents;
52ab845dee6565a8dfc384186bc8f2e801a2b087e1Ye Wenimport com.android.mms.LogTag;
53d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.android.mms.R;
54d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.android.mms.transaction.MessagingNotification;
55d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chen
5672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/**
5737321876549776417f035118f157d9531f73de6bWink Saville * Displays a list of the SMS messages stored on the ICC.
5872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */
5972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpublic class ManageSimMessages extends Activity
6072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        implements View.OnCreateContextMenuListener {
6137321876549776417f035118f157d9531f73de6bWink Saville    private static final Uri ICC_URI = Uri.parse("content://sms/icc");
62ab845dee6565a8dfc384186bc8f2e801a2b087e1Ye Wen    private static final String TAG = LogTag.TAG;
6372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final int MENU_COPY_TO_PHONE_MEMORY = 0;
6472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final int MENU_DELETE_FROM_SIM = 1;
6572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final int MENU_VIEW = 2;
6672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final int OPTION_MENU_DELETE_ALL = 0;
6772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
6872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final int SHOW_LIST = 0;
6972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final int SHOW_EMPTY = 1;
7072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final int SHOW_BUSY = 2;
7172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private int mState;
7272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
7372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
7472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private ContentResolver mContentResolver;
7572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private Cursor mCursor = null;
7672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private ListView mSimList;
7772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private TextView mMessage;
7872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private MessageListAdapter mListAdapter = null;
7972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private AsyncQueryHandler mQueryHandler = null;
8072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
8172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public static final int SIM_FULL_NOTIFICATION_ID = 234;
8272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
836cc9ffec5ce3fb72b5049a2e1dfd1ed0b802a2c4Arun Ravindran    protected BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
846cc9ffec5ce3fb72b5049a2e1dfd1ed0b802a2c4Arun Ravindran        public void onReceive(Context context, Intent intent) {
856cc9ffec5ce3fb72b5049a2e1dfd1ed0b802a2c4Arun Ravindran            if (TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(intent.getAction())) {
866cc9ffec5ce3fb72b5049a2e1dfd1ed0b802a2c4Arun Ravindran                String stateExtra = intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE);
876cc9ffec5ce3fb72b5049a2e1dfd1ed0b802a2c4Arun Ravindran                if (stateExtra != null
886cc9ffec5ce3fb72b5049a2e1dfd1ed0b802a2c4Arun Ravindran                        && ((IccCardConstants.INTENT_VALUE_ICC_ABSENT.equals(stateExtra)
896cc9ffec5ce3fb72b5049a2e1dfd1ed0b802a2c4Arun Ravindran                        || IccCardConstants.INTENT_VALUE_ICC_UNKNOWN.equals(stateExtra)))) {
906cc9ffec5ce3fb72b5049a2e1dfd1ed0b802a2c4Arun Ravindran                    updateState(SHOW_EMPTY);
916cc9ffec5ce3fb72b5049a2e1dfd1ed0b802a2c4Arun Ravindran                }
926cc9ffec5ce3fb72b5049a2e1dfd1ed0b802a2c4Arun Ravindran            }
936cc9ffec5ce3fb72b5049a2e1dfd1ed0b802a2c4Arun Ravindran        }
946cc9ffec5ce3fb72b5049a2e1dfd1ed0b802a2c4Arun Ravindran    };
956cc9ffec5ce3fb72b5049a2e1dfd1ed0b802a2c4Arun Ravindran
9672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private final ContentObserver simChangeObserver =
9772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            new ContentObserver(new Handler()) {
9872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        @Override
9972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        public void onChange(boolean selfUpdate) {
10072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            refreshMessageList();
10172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
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 icicle) {
10672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super.onCreate(icicle);
10772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
10872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
10972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mContentResolver = getContentResolver();
11072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mQueryHandler = new QueryHandler(mContentResolver, this);
11172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        setContentView(R.layout.sim_list);
11272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mSimList = (ListView) findViewById(R.id.messages);
11372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mMessage = (TextView) findViewById(R.id.empty_message);
11472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
1156d0646916bac17a1ee627a0aa15d3345ff9b5479Tom Taylor        ActionBar actionBar = getActionBar();
1166d0646916bac17a1ee627a0aa15d3345ff9b5479Tom Taylor        actionBar.setDisplayHomeAsUpEnabled(true);
1176d0646916bac17a1ee627a0aa15d3345ff9b5479Tom Taylor
11872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        init();
11972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
12072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
12172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
12272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void onNewIntent(Intent intent) {
12372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        setIntent(intent);
12472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
12572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        init();
12672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
12772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
12872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void init() {
12972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        MessagingNotification.cancelNotification(getApplicationContext(),
13072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                SIM_FULL_NOTIFICATION_ID);
13172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
13272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        updateState(SHOW_BUSY);
13372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        startQuery();
13472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
13572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
13672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private class QueryHandler extends AsyncQueryHandler {
13772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        private final ManageSimMessages mParent;
13872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
13972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        public QueryHandler(
14072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                ContentResolver contentResolver, ManageSimMessages parent) {
14172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            super(contentResolver);
14272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mParent = parent;
14372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
14472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
14572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        @Override
14672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        protected void onQueryComplete(
14772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                int token, Object cookie, Cursor cursor) {
14872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mCursor = cursor;
14972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (mCursor != null) {
15072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                if (!mCursor.moveToFirst()) {
15172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    // Let user know the SIM is empty
15272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    updateState(SHOW_EMPTY);
15372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                } else if (mListAdapter == null) {
154f1ab045ff991e1ec3e4161d213627b8629971c0eTom Taylor                    // Note that the MessageListAdapter doesn't support auto-requeries. If we
155f1ab045ff991e1ec3e4161d213627b8629971c0eTom Taylor                    // want to respond to changes we'd need to add a line like:
156f1ab045ff991e1ec3e4161d213627b8629971c0eTom Taylor                    //   mListAdapter.setOnDataSetChangedListener(mDataSetChangedListener);
157f1ab045ff991e1ec3e4161d213627b8629971c0eTom Taylor                    // See ComposeMessageActivity for an example.
15872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    mListAdapter = new MessageListAdapter(
159f1ab045ff991e1ec3e4161d213627b8629971c0eTom Taylor                            mParent, mCursor, mSimList, false, null);
16072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    mSimList.setAdapter(mListAdapter);
16172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    mSimList.setOnCreateContextMenuListener(mParent);
16272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    updateState(SHOW_LIST);
16372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                } else {
16472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    mListAdapter.changeCursor(mCursor);
16572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    updateState(SHOW_LIST);
16672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                }
16772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                startManagingCursor(mCursor);
168408675a7ccd78345d68bd7d1d3b56b7d40b96d11Tom Taylor            } else {
169408675a7ccd78345d68bd7d1d3b56b7d40b96d11Tom Taylor                // Let user know the SIM is empty
170408675a7ccd78345d68bd7d1d3b56b7d40b96d11Tom Taylor                updateState(SHOW_EMPTY);
17172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
1724e268daeda88400462b6cf56a30bf7547442e158Suresh Koleti            // Show option menu when query complete.
1734e268daeda88400462b6cf56a30bf7547442e158Suresh Koleti            invalidateOptionsMenu();
17472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
17572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
17672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
17772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void startQuery() {
17872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        try {
17937321876549776417f035118f157d9531f73de6bWink Saville            mQueryHandler.startQuery(0, null, ICC_URI, null, null, null, null);
18072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } catch (SQLiteException e) {
18172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            SqliteWrapper.checkSQLiteException(this, e);
18272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
18372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
18472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
18572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void refreshMessageList() {
18672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        updateState(SHOW_BUSY);
18772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (mCursor != null) {
18872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            stopManagingCursor(mCursor);
18972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mCursor.close();
19072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
19172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        startQuery();
19272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
19372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
19472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
19572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void onCreateContextMenu(
19672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            ContextMenu menu, View v,
19772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            ContextMenu.ContextMenuInfo menuInfo) {
19872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        menu.add(0, MENU_COPY_TO_PHONE_MEMORY, 0,
19972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                 R.string.sim_copy_to_phone_memory);
20072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        menu.add(0, MENU_DELETE_FROM_SIM, 0, R.string.sim_delete);
20172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
20272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // TODO: Enable this once viewMessage is written.
20372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // menu.add(0, MENU_VIEW, 0, R.string.sim_view);
20472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
20572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
20672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
20772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean onContextItemSelected(MenuItem item) {
20872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        AdapterView.AdapterContextMenuInfo info;
20972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        try {
21072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project             info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
21172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } catch (ClassCastException exception) {
21272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Log.e(TAG, "Bad menuInfo.", exception);
21372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return false;
21472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
21572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
2162f56791329cefc49ce79663b8d3aff50594cc1f3The Android Open Source Project        final Cursor cursor = (Cursor) mListAdapter.getItem(info.position);
21772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
21872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        switch (item.getItemId()) {
21972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case MENU_COPY_TO_PHONE_MEMORY:
22072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                copyToPhoneMemory(cursor);
22172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                return true;
22272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case MENU_DELETE_FROM_SIM:
2232f56791329cefc49ce79663b8d3aff50594cc1f3The Android Open Source Project                confirmDeleteDialog(new OnClickListener() {
2242f56791329cefc49ce79663b8d3aff50594cc1f3The Android Open Source Project                    public void onClick(DialogInterface dialog, int which) {
2252f56791329cefc49ce79663b8d3aff50594cc1f3The Android Open Source Project                        updateState(SHOW_BUSY);
2262f56791329cefc49ce79663b8d3aff50594cc1f3The Android Open Source Project                        deleteFromSim(cursor);
227c4a34a0ccd414e2bba937e8abd105a0383afff35Tom Taylor                        dialog.dismiss();
2282f56791329cefc49ce79663b8d3aff50594cc1f3The Android Open Source Project                    }
2292f56791329cefc49ce79663b8d3aff50594cc1f3The Android Open Source Project                }, R.string.confirm_delete_SIM_message);
23072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                return true;
23172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case MENU_VIEW:
23272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                viewMessage(cursor);
23372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                return true;
23472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
23572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return super.onContextItemSelected(item);
23672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
23772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
23872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
23972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void onResume() {
24072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super.onResume();
24172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        registerSimChangeObserver();
24272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
24372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
24472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
24572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void onPause() {
24672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super.onPause();
2476cc9ffec5ce3fb72b5049a2e1dfd1ed0b802a2c4Arun Ravindran        unregisterReceiver(mBroadcastReceiver);
24872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mContentResolver.unregisterContentObserver(simChangeObserver);
24972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
25072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
25172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void registerSimChangeObserver() {
25272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mContentResolver.registerContentObserver(
25337321876549776417f035118f157d9531f73de6bWink Saville                ICC_URI, true, simChangeObserver);
2546cc9ffec5ce3fb72b5049a2e1dfd1ed0b802a2c4Arun Ravindran        final IntentFilter intentFilter =
2556cc9ffec5ce3fb72b5049a2e1dfd1ed0b802a2c4Arun Ravindran                new IntentFilter(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
2566cc9ffec5ce3fb72b5049a2e1dfd1ed0b802a2c4Arun Ravindran        registerReceiver(mBroadcastReceiver, intentFilter);
25772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
25872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
25972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void copyToPhoneMemory(Cursor cursor) {
26072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        String address = cursor.getString(
26172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                cursor.getColumnIndexOrThrow("address"));
26272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        String body = cursor.getString(cursor.getColumnIndexOrThrow("body"));
26372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Long date = cursor.getLong(cursor.getColumnIndexOrThrow("date"));
26472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
26572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        try {
26672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (isIncomingMessage(cursor)) {
267627007213deb59ef938c80353c8f3598b01478b3Wei Huang                Sms.Inbox.addMessage(mContentResolver, address, body, null, date, true /* read */);
26872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } else {
26972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                Sms.Sent.addMessage(mContentResolver, address, body, null, date);
27072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
27172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } catch (SQLiteException e) {
27272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            SqliteWrapper.checkSQLiteException(this, e);
27372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
27472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
27572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
27672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private boolean isIncomingMessage(Cursor cursor) {
27772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        int messageStatus = cursor.getInt(
27872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                cursor.getColumnIndexOrThrow("status"));
27972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
28037321876549776417f035118f157d9531f73de6bWink Saville        return (messageStatus == SmsManager.STATUS_ON_ICC_READ) ||
28137321876549776417f035118f157d9531f73de6bWink Saville               (messageStatus == SmsManager.STATUS_ON_ICC_UNREAD);
28272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
28372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
28472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void deleteFromSim(Cursor cursor) {
28572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        String messageIndexString =
28637321876549776417f035118f157d9531f73de6bWink Saville                cursor.getString(cursor.getColumnIndexOrThrow("index_on_icc"));
28737321876549776417f035118f157d9531f73de6bWink Saville        Uri simUri = ICC_URI.buildUpon().appendPath(messageIndexString).build();
28872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
28972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        SqliteWrapper.delete(this, mContentResolver, simUri, null, null);
29072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
29172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
29272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void deleteAllFromSim() {
29372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Cursor cursor = (Cursor) mListAdapter.getCursor();
29472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
29572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (cursor != null) {
29672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (cursor.moveToFirst()) {
29772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                int count = cursor.getCount();
29872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
29972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                for (int i = 0; i < count; ++i) {
30072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    deleteFromSim(cursor);
30172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    cursor.moveToNext();
30272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                }
30372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
30472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
30572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
30672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
30772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
30872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean onPrepareOptionsMenu(Menu menu) {
30972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        menu.clear();
31072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
31169d8b665c2af926031b0b13b0deb63ec17a41ea0Roger Chen        if (mState == SHOW_LIST && (null != mCursor) && (mCursor.getCount() > 0)) {
31272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            menu.add(0, OPTION_MENU_DELETE_ALL, 0, R.string.menu_delete_messages).setIcon(
31372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    android.R.drawable.ic_menu_delete);
31472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
31572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
31672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return true;
31772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
31872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
31972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
32072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
32172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        switch (item.getItemId()) {
32272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case OPTION_MENU_DELETE_ALL:
32372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                confirmDeleteDialog(new OnClickListener() {
32472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    public void onClick(DialogInterface dialog, int which) {
32572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        updateState(SHOW_BUSY);
32672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        deleteAllFromSim();
327c4a34a0ccd414e2bba937e8abd105a0383afff35Tom Taylor                        dialog.dismiss();
32872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    }
3292f56791329cefc49ce79663b8d3aff50594cc1f3The Android Open Source Project                }, R.string.confirm_delete_all_SIM_messages);
33072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                break;
3316d0646916bac17a1ee627a0aa15d3345ff9b5479Tom Taylor
3326d0646916bac17a1ee627a0aa15d3345ff9b5479Tom Taylor            case android.R.id.home:
3336d0646916bac17a1ee627a0aa15d3345ff9b5479Tom Taylor                // The user clicked on the Messaging icon in the action bar. Take them back from
3346d0646916bac17a1ee627a0aa15d3345ff9b5479Tom Taylor                // wherever they came from
3356d0646916bac17a1ee627a0aa15d3345ff9b5479Tom Taylor                finish();
3366d0646916bac17a1ee627a0aa15d3345ff9b5479Tom Taylor                break;
33772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
33872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
33972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return true;
34072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
34172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
3422f56791329cefc49ce79663b8d3aff50594cc1f3The Android Open Source Project    private void confirmDeleteDialog(OnClickListener listener, int messageId) {
34372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        AlertDialog.Builder builder = new AlertDialog.Builder(this);
34472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        builder.setTitle(R.string.confirm_dialog_title);
3457ad0a61f99867ac19cabd31b0d8db2ef4c234d24Björn Lundén        builder.setIconAttribute(android.R.attr.alertDialogIcon);
34672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        builder.setCancelable(true);
34772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        builder.setPositiveButton(R.string.yes, listener);
34872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        builder.setNegativeButton(R.string.no, null);
3492f56791329cefc49ce79663b8d3aff50594cc1f3The Android Open Source Project        builder.setMessage(messageId);
35072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
35172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        builder.show();
35272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
35372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
35472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void updateState(int state) {
35572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (mState == state) {
35672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return;
35772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
35872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
35972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mState = state;
36072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        switch (state) {
36172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case SHOW_LIST:
36272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mSimList.setVisibility(View.VISIBLE);
36372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mMessage.setVisibility(View.GONE);
36472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                setTitle(getString(R.string.sim_manage_messages_title));
36572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                setProgressBarIndeterminateVisibility(false);
366507ace2ef4dd5cd30801b03778c95864ea45835aPawan Kumar Nimmagadda                mSimList.requestFocus();
36772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                break;
36872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case SHOW_EMPTY:
36972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mSimList.setVisibility(View.GONE);
37072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mMessage.setVisibility(View.VISIBLE);
37172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                setTitle(getString(R.string.sim_manage_messages_title));
37272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                setProgressBarIndeterminateVisibility(false);
37372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                break;
37472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case SHOW_BUSY:
37572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mSimList.setVisibility(View.GONE);
37672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mMessage.setVisibility(View.GONE);
37772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                setTitle(getString(R.string.refreshing));
37872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                setProgressBarIndeterminateVisibility(true);
37972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                break;
38072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            default:
38172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                Log.e(TAG, "Invalid State");
38272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
38372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
38472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
38572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void viewMessage(Cursor cursor) {
38672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // TODO: Add this.
38772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
38872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project}
38937321876549776417f035118f157d9531f73de6bWink Saville
390