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