172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/*
272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Copyright (C) 2007-2008 Esmertec AG.
372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Copyright (C) 2007-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 android.app.Activity;
2172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.app.AlertDialog;
224da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liuimport android.content.ContentResolver;
234da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liuimport android.content.ContentUris;
244da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liuimport android.content.ContentValues;
2572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.DialogInterface;
2672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.DialogInterface.OnClickListener;
274da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liuimport android.database.Cursor;
284da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liuimport android.net.Uri;
2972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.os.Bundle;
304da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liuimport android.os.Handler;
314da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liuimport android.os.Message;
324da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liuimport android.os.SystemClock;
33f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport android.provider.Telephony.Sms;
34f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport android.provider.Telephony.Sms.Inbox;
354da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liuimport android.telephony.SmsMessage;
36044856d87b39a0ffb581ad946968da4598198f15Satish Roddomimport android.text.TextUtils;
374da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liuimport android.util.Log;
3872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.Window;
3972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
4072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.R;
4143bcf48daea4e763811dffa75f62c2b4a3a39310Yong Liuimport com.android.mms.transaction.MessagingNotification;
4272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
43fd644551e8506266aad2b76463b51b44154ed62fTom Taylorimport android.database.sqlite.SqliteWrapper;
444da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu
4572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/**
464da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu * Display a class-zero SMS message to the user. Wait for the user to dismiss
474da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu * it.
4872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */
4972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpublic class ClassZeroActivity extends Activity {
50044856d87b39a0ffb581ad946968da4598198f15Satish Roddom    private static final String BUFFER = "         ";
51044856d87b39a0ffb581ad946968da4598198f15Satish Roddom    private static final int BUFFER_OFFSET = BUFFER.length() * 2;
524da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    private static final String TAG = "display_00";
534da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    private static final int ON_AUTO_SAVE = 1;
544da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    private static final String[] REPLACE_PROJECTION = new String[] { Sms._ID,
554da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu            Sms.ADDRESS, Sms.PROTOCOL };
564da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    private static final int REPLACE_COLUMN_ID = 0;
574da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu
584da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    /** Default timer to dismiss the dialog. */
594da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    private static final long DEFAULT_TIMER = 5 * 60 * 1000;
604da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu
614da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    /** To remember the exact time when the timer should fire. */
624da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    private static final String TIMER_FIRE = "timer_fire";
634da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu
644da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    private SmsMessage mMessage = null;
654da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu
664da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    /** Is the message read. */
674da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    private boolean mRead = false;
684da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu
694da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    /** The timer to dismiss the dialog automatically. */
704da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    private long mTimerSet = 0;
714da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    private AlertDialog mDialog = null;
724da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu
734da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    private Handler mHandler = new Handler() {
744da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        @Override
754da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        public void handleMessage(Message msg) {
764da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu            // Do not handle an invalid message.
774da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu            if (msg.what == ON_AUTO_SAVE) {
784da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu                mRead = false;
794da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu                mDialog.dismiss();
804da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu                saveMessage();
814da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu                finish();
824da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu            }
834da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        }
844da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    };
854da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu
864da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    private void saveMessage() {
8743bcf48daea4e763811dffa75f62c2b4a3a39310Yong Liu        Uri messageUri = null;
884da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        if (mMessage.isReplace()) {
8943bcf48daea4e763811dffa75f62c2b4a3a39310Yong Liu            messageUri = replaceMessage(mMessage);
904da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        } else {
9143bcf48daea4e763811dffa75f62c2b4a3a39310Yong Liu            messageUri = storeMessage(mMessage);
9243bcf48daea4e763811dffa75f62c2b4a3a39310Yong Liu        }
9343bcf48daea4e763811dffa75f62c2b4a3a39310Yong Liu        if (!mRead && messageUri != null) {
94c8d727902ff6976c45285a12aab176545a7848bbTodor Kalaydjiev            MessagingNotification.nonBlockingUpdateNewMessageIndicator(
95c8d727902ff6976c45285a12aab176545a7848bbTodor Kalaydjiev                    this,
96c8d727902ff6976c45285a12aab176545a7848bbTodor Kalaydjiev                    MessagingNotification.THREAD_ALL,   // always notify on class-zero msgs
97c8d727902ff6976c45285a12aab176545a7848bbTodor Kalaydjiev                    false);
984da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        }
994da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    }
1004da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu
10172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
10272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void onCreate(Bundle icicle) {
10372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super.onCreate(icicle);
10472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        requestWindowFeature(Window.FEATURE_NO_TITLE);
10572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        getWindow().setBackgroundDrawableResource(
10672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                R.drawable.class_zero_background);
10772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
1084da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        byte[] pdu = getIntent().getByteArrayExtra("pdu");
1092b04a715ca8aba549ead0bc2b45f650386962c15Jake Hamby        String format = getIntent().getStringExtra("format");
1102b04a715ca8aba549ead0bc2b45f650386962c15Jake Hamby        mMessage = SmsMessage.createFromPdu(pdu, format);
1114da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        CharSequence messageChars = mMessage.getMessageBody();
112044856d87b39a0ffb581ad946968da4598198f15Satish Roddom        String message = messageChars.toString();
113044856d87b39a0ffb581ad946968da4598198f15Satish Roddom        if (TextUtils.isEmpty(message)) {
114044856d87b39a0ffb581ad946968da4598198f15Satish Roddom            finish();
115044856d87b39a0ffb581ad946968da4598198f15Satish Roddom            return;
116044856d87b39a0ffb581ad946968da4598198f15Satish Roddom        }
117044856d87b39a0ffb581ad946968da4598198f15Satish Roddom        // TODO: The following line adds an emptry string before and after a message.
118044856d87b39a0ffb581ad946968da4598198f15Satish Roddom        // This is not the correct way to layout a message. This is more of a hack
119044856d87b39a0ffb581ad946968da4598198f15Satish Roddom        // to work-around a bug in AlertDialog. This needs to be fixed later when
120044856d87b39a0ffb581ad946968da4598198f15Satish Roddom        // Android fixes the bug in AlertDialog.
121044856d87b39a0ffb581ad946968da4598198f15Satish Roddom        if (message.length() < BUFFER_OFFSET) messageChars = BUFFER + message + BUFFER;
1224da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        long now = SystemClock.uptimeMillis();
1234da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        mDialog = new AlertDialog.Builder(this).setMessage(messageChars)
1244da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu                .setPositiveButton(R.string.save, mSaveListener)
1254da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu                .setNegativeButton(android.R.string.cancel, mCancelListener)
1264da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu                .setCancelable(false).show();
1274da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        mTimerSet = now + DEFAULT_TIMER;
1284da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        if (icicle != null) {
1294da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu            mTimerSet = icicle.getLong(TIMER_FIRE, mTimerSet);
1304da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        }
13143bcf48daea4e763811dffa75f62c2b4a3a39310Yong Liu    }
13243bcf48daea4e763811dffa75f62c2b4a3a39310Yong Liu
13343bcf48daea4e763811dffa75f62c2b4a3a39310Yong Liu    @Override
13443bcf48daea4e763811dffa75f62c2b4a3a39310Yong Liu    protected void onStart() {
13543bcf48daea4e763811dffa75f62c2b4a3a39310Yong Liu        super.onStart();
13643bcf48daea4e763811dffa75f62c2b4a3a39310Yong Liu        long now = SystemClock.uptimeMillis();
1374da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        if (mTimerSet <= now) {
1384da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu            // Save the message if the timer already expired.
1394da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu            mHandler.sendEmptyMessage(ON_AUTO_SAVE);
1404da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        } else {
1414da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu            mHandler.sendEmptyMessageAtTime(ON_AUTO_SAVE, mTimerSet);
142150c4179995cc0a75f934ef194372f9295957ca2Joe Onorato            if (false) {
14343bcf48daea4e763811dffa75f62c2b4a3a39310Yong Liu                Log.d(TAG, "onRestart time = " + Long.toString(mTimerSet) + " "
1444da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu                        + this.toString());
1454da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu            }
1464da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        }
1474da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    }
14872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
1494da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    @Override
1504da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    protected void onSaveInstanceState(Bundle outState) {
1514da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        super.onSaveInstanceState(outState);
1524da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        outState.putLong(TIMER_FIRE, mTimerSet);
153150c4179995cc0a75f934ef194372f9295957ca2Joe Onorato        if (false) {
1544da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu            Log.d(TAG, "onSaveInstanceState time = " + Long.toString(mTimerSet)
1554da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu                    + " " + this.toString());
1564da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        }
1574da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    }
1584da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu
1594da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    @Override
1604da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    protected void onStop() {
1614da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        super.onStop();
1624da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        mHandler.removeMessages(ON_AUTO_SAVE);
163150c4179995cc0a75f934ef194372f9295957ca2Joe Onorato        if (false) {
16443bcf48daea4e763811dffa75f62c2b4a3a39310Yong Liu            Log.d(TAG, "onStop time = " + Long.toString(mTimerSet)
16543bcf48daea4e763811dffa75f62c2b4a3a39310Yong Liu                    + " " + this.toString());
1664da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        }
16772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
16872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
1694da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    private final OnClickListener mCancelListener = new OnClickListener() {
17072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        public void onClick(DialogInterface dialog, int whichButton) {
171c4a34a0ccd414e2bba937e8abd105a0383afff35Tom Taylor            dialog.dismiss();
1724da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu            finish();
17372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
17472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    };
1754da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu
1764da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    private final OnClickListener mSaveListener = new OnClickListener() {
1774da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        public void onClick(DialogInterface dialog, int whichButton) {
1784da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu            mRead = true;
1794da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu            saveMessage();
180c4a34a0ccd414e2bba937e8abd105a0383afff35Tom Taylor            dialog.dismiss();
1814da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu            finish();
1824da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        }
1834da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    };
1844da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu
1854da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    private ContentValues extractContentValues(SmsMessage sms) {
1864da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        // Store the message in the content provider.
1874da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        ContentValues values = new ContentValues();
1884da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu
1894da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        values.put(Inbox.ADDRESS, sms.getDisplayOriginatingAddress());
1904da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu
1914da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        // Use now for the timestamp to avoid confusion with clock
1924da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        // drift between the handset and the SMSC.
1934da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        values.put(Inbox.DATE, new Long(System.currentTimeMillis()));
1944da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        values.put(Inbox.PROTOCOL, sms.getProtocolIdentifier());
1954da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        values.put(Inbox.READ, Integer.valueOf(mRead ? 1 : 0));
196627007213deb59ef938c80353c8f3598b01478b3Wei Huang        values.put(Inbox.SEEN, Integer.valueOf(mRead ? 1 : 0));
1974da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu
1984da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        if (sms.getPseudoSubject().length() > 0) {
1994da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu            values.put(Inbox.SUBJECT, sms.getPseudoSubject());
2004da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        }
2014da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        values.put(Inbox.REPLY_PATH_PRESENT, sms.isReplyPathPresent() ? 1 : 0);
2024da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        values.put(Inbox.SERVICE_CENTER, sms.getServiceCenterAddress());
2034da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        return values;
2044da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    }
2054da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu
2064da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    private Uri replaceMessage(SmsMessage sms) {
2074da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        ContentValues values = extractContentValues(sms);
2084da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu
2094da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        values.put(Inbox.BODY, sms.getMessageBody());
2104da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu
2114da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        ContentResolver resolver = getContentResolver();
2124da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        String originatingAddress = sms.getOriginatingAddress();
2134da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        int protocolIdentifier = sms.getProtocolIdentifier();
2144da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        String selection = Sms.ADDRESS + " = ? AND " + Sms.PROTOCOL + " = ?";
2154da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        String[] selectionArgs = new String[] { originatingAddress,
2164da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu                Integer.toString(protocolIdentifier) };
2174da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu
2184da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        Cursor cursor = SqliteWrapper.query(this, resolver, Inbox.CONTENT_URI,
2194da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu                REPLACE_PROJECTION, selection, selectionArgs, null);
2204da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu
2214da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        try {
2224da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu            if (cursor.moveToFirst()) {
2234da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu                long messageId = cursor.getLong(REPLACE_COLUMN_ID);
2244da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu                Uri messageUri = ContentUris.withAppendedId(
2254da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu                        Sms.CONTENT_URI, messageId);
2264da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu
2274da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu                SqliteWrapper.update(this, resolver, messageUri, values,
2284da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu                        null, null);
2294da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu                return messageUri;
2304da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu            }
2314da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        } finally {
2324da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu            cursor.close();
2334da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        }
2344da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        return storeMessage(sms);
2354da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    }
2364da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu
2374da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    private Uri storeMessage(SmsMessage sms) {
2384da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        // Store the message in the content provider.
2394da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        ContentValues values = extractContentValues(sms);
2404da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        values.put(Inbox.BODY, sms.getDisplayMessageBody());
2414da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        ContentResolver resolver = getContentResolver();
242150c4179995cc0a75f934ef194372f9295957ca2Joe Onorato        if (false) {
24343bcf48daea4e763811dffa75f62c2b4a3a39310Yong Liu            Log.d(TAG, "storeMessage " + this.toString());
24443bcf48daea4e763811dffa75f62c2b4a3a39310Yong Liu        }
2454da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu        return SqliteWrapper.insert(this, resolver, Inbox.CONTENT_URI, values);
2464da6513065fbcfbf7fee9a18176ce62d2f62c825Yong Liu    }
24772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project}
248