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.transaction; 1972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 20f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport static android.provider.Telephony.Sms.Intents.WAP_PUSH_RECEIVED_ACTION; 21f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport static com.google.android.mms.pdu.PduHeaders.MESSAGE_TYPE_DELIVERY_IND; 22f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport static com.google.android.mms.pdu.PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND; 23f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport static com.google.android.mms.pdu.PduHeaders.MESSAGE_TYPE_READ_ORIG_IND; 2472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.BroadcastReceiver; 2572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.ContentResolver; 2672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.ContentValues; 2772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.Context; 2872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.Intent; 2972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.database.Cursor; 3072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.database.DatabaseUtils; 31d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport android.database.sqlite.SqliteWrapper; 3272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.net.Uri; 3372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.os.AsyncTask; 3472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.os.PowerManager; 35f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport android.provider.Telephony.Mms; 36f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport android.provider.Telephony.Mms.Inbox; 3772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.util.Log; 3872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 39d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.android.mms.MmsConfig; 409889006f9d29d0509c1c036987ce028de43ac96eTom Taylorimport com.android.mms.ui.MessagingPreferenceActivity; 41d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.google.android.mms.ContentType; 42d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.google.android.mms.MmsException; 43d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.google.android.mms.pdu.DeliveryInd; 44d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.google.android.mms.pdu.GenericPdu; 45d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.google.android.mms.pdu.NotificationInd; 46d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.google.android.mms.pdu.PduHeaders; 47d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.google.android.mms.pdu.PduParser; 48d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.google.android.mms.pdu.PduPersister; 49d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.google.android.mms.pdu.ReadOrigInd; 50d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chen 5172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/** 5272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Receives Intent.WAP_PUSH_RECEIVED_ACTION intents and starts the 5372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * TransactionService by passing the push-data to it. 5472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */ 5572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpublic class PushReceiver extends BroadcastReceiver { 5672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static final String TAG = "PushReceiver"; 5772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static final boolean DEBUG = false; 58150c4179995cc0a75f934ef194372f9295957ca2Joe Onorato private static final boolean LOCAL_LOGV = false; 5972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 60836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project private class ReceivePushTask extends AsyncTask<Intent,Void,Void> { 6172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private Context mContext; 6272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public ReceivePushTask(Context context) { 6372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mContext = context; 6472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 6572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 6672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project @Override 6772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project protected Void doInBackground(Intent... intents) { 6872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Intent intent = intents[0]; 696be18bedb5b87dbbcdb54f37d5a0945bd0f71377Tom Taylor 7072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Get raw PDU push-data from the message and parse it 7172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project byte[] pushData = intent.getByteArrayExtra("data"); 7272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project PduParser parser = new PduParser(pushData); 7372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project GenericPdu pdu = parser.parse(); 7472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 7572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (null == pdu) { 7672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.e(TAG, "Invalid PUSH data"); 7772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return null; 7872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 7972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 8072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project PduPersister p = PduPersister.getPduPersister(mContext); 8172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project ContentResolver cr = mContext.getContentResolver(); 8272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int type = pdu.getMessageType(); 8372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project long threadId = -1; 8472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 8572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 8672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project switch (type) { 8772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case MESSAGE_TYPE_DELIVERY_IND: 8872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case MESSAGE_TYPE_READ_ORIG_IND: { 8972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project threadId = findThreadId(mContext, pdu, type); 9072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (threadId == -1) { 9172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // The associated SendReq isn't found, therefore skip 9272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // processing this PDU. 9372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project break; 9472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 9572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 969889006f9d29d0509c1c036987ce028de43ac96eTom Taylor Uri uri = p.persist(pdu, Inbox.CONTENT_URI, true, 97469db72fcf219fd4c60bc9b01c728bdc3e866d40Tom Taylor MessagingPreferenceActivity.getIsGroupMmsEnabled(mContext), null); 9872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Update thread ID for ReadOrigInd & DeliveryInd. 9972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project ContentValues values = new ContentValues(1); 10072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project values.put(Mms.THREAD_ID, threadId); 10172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project SqliteWrapper.update(mContext, cr, uri, values, null, null); 10272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project break; 10372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 10472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case MESSAGE_TYPE_NOTIFICATION_IND: { 10572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project NotificationInd nInd = (NotificationInd) pdu; 1063b9acf897f4bdd4d76cbcf10d7bd2728c941c7d5Christian Gustafsson 1073b9acf897f4bdd4d76cbcf10d7bd2728c941c7d5Christian Gustafsson if (MmsConfig.getTransIdEnabled()) { 1083b9acf897f4bdd4d76cbcf10d7bd2728c941c7d5Christian Gustafsson byte [] contentLocation = nInd.getContentLocation(); 1093b9acf897f4bdd4d76cbcf10d7bd2728c941c7d5Christian Gustafsson if ('=' == contentLocation[contentLocation.length - 1]) { 1103b9acf897f4bdd4d76cbcf10d7bd2728c941c7d5Christian Gustafsson byte [] transactionId = nInd.getTransactionId(); 1113b9acf897f4bdd4d76cbcf10d7bd2728c941c7d5Christian Gustafsson byte [] contentLocationWithId = new byte [contentLocation.length 1123b9acf897f4bdd4d76cbcf10d7bd2728c941c7d5Christian Gustafsson + transactionId.length]; 1133b9acf897f4bdd4d76cbcf10d7bd2728c941c7d5Christian Gustafsson System.arraycopy(contentLocation, 0, contentLocationWithId, 1143b9acf897f4bdd4d76cbcf10d7bd2728c941c7d5Christian Gustafsson 0, contentLocation.length); 1153b9acf897f4bdd4d76cbcf10d7bd2728c941c7d5Christian Gustafsson System.arraycopy(transactionId, 0, contentLocationWithId, 1163b9acf897f4bdd4d76cbcf10d7bd2728c941c7d5Christian Gustafsson contentLocation.length, transactionId.length); 1173b9acf897f4bdd4d76cbcf10d7bd2728c941c7d5Christian Gustafsson nInd.setContentLocation(contentLocationWithId); 1183b9acf897f4bdd4d76cbcf10d7bd2728c941c7d5Christian Gustafsson } 1193b9acf897f4bdd4d76cbcf10d7bd2728c941c7d5Christian Gustafsson } 1203b9acf897f4bdd4d76cbcf10d7bd2728c941c7d5Christian Gustafsson 12172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (!isDuplicateNotification(mContext, nInd)) { 122ca239ab55759fae4b16823329d5f03a52829ff4dTom Taylor // Save the pdu. If we can start downloading the real pdu immediately, 123ca239ab55759fae4b16823329d5f03a52829ff4dTom Taylor // don't allow persist() to create a thread for the notificationInd 124ca239ab55759fae4b16823329d5f03a52829ff4dTom Taylor // because it causes UI jank. 125ca239ab55759fae4b16823329d5f03a52829ff4dTom Taylor Uri uri = p.persist(pdu, Inbox.CONTENT_URI, 1269889006f9d29d0509c1c036987ce028de43ac96eTom Taylor !NotificationTransaction.allowAutoDownload(), 127469db72fcf219fd4c60bc9b01c728bdc3e866d40Tom Taylor MessagingPreferenceActivity.getIsGroupMmsEnabled(mContext), 128469db72fcf219fd4c60bc9b01c728bdc3e866d40Tom Taylor null); 129ca239ab55759fae4b16823329d5f03a52829ff4dTom Taylor 13072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Start service to finish the notification transaction. 13172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Intent svc = new Intent(mContext, TransactionService.class); 13272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project svc.putExtra(TransactionBundle.URI, uri.toString()); 13372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project svc.putExtra(TransactionBundle.TRANSACTION_TYPE, 13472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Transaction.NOTIFICATION_TRANSACTION); 13572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mContext.startService(svc); 13672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (LOCAL_LOGV) { 13772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.v(TAG, "Skip downloading duplicate message: " 13872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project + new String(nInd.getContentLocation())); 13972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 14072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project break; 14172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 14272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project default: 14372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.e(TAG, "Received unrecognized PDU."); 14472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 14572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } catch (MmsException e) { 14672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.e(TAG, "Failed to save the data from PUSH: type=" + type, e); 14772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } catch (RuntimeException e) { 14872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.e(TAG, "Unexpected RuntimeException.", e); 14972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 15072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 15172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (LOCAL_LOGV) { 15272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.v(TAG, "PUSH Intent processed."); 15372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 15472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 15572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return null; 15672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 15772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 1586be18bedb5b87dbbcdb54f37d5a0945bd0f71377Tom Taylor 15972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project @Override 16072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void onReceive(Context context, Intent intent) { 16172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (intent.getAction().equals(WAP_PUSH_RECEIVED_ACTION) 16272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project && ContentType.MMS_MESSAGE.equals(intent.getType())) { 16372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (LOCAL_LOGV) { 16472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.v(TAG, "Received PUSH Intent: " + intent); 16572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 1666be18bedb5b87dbbcdb54f37d5a0945bd0f71377Tom Taylor 167836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project // Hold a wake lock for 5 seconds, enough to give any 168836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project // services we start time to take their own wake locks. 169836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); 170836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 171836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project "MMS PushReceiver"); 172836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project wl.acquire(5000); 17372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project new ReceivePushTask(context).execute(intent); 17472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 17572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 17672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 17772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static long findThreadId(Context context, GenericPdu pdu, int type) { 17872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String messageId; 17972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 18072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (type == MESSAGE_TYPE_DELIVERY_IND) { 18172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project messageId = new String(((DeliveryInd) pdu).getMessageId()); 18272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 18372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project messageId = new String(((ReadOrigInd) pdu).getMessageId()); 18472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 18572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 18672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project StringBuilder sb = new StringBuilder('('); 18772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project sb.append(Mms.MESSAGE_ID); 18872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project sb.append('='); 18972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project sb.append(DatabaseUtils.sqlEscapeString(messageId)); 19072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project sb.append(" AND "); 19172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project sb.append(Mms.MESSAGE_TYPE); 19272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project sb.append('='); 19372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project sb.append(PduHeaders.MESSAGE_TYPE_SEND_REQ); 19472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // TODO ContentResolver.query() appends closing ')' to the selection argument 19572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // sb.append(')'); 19672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 19772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Cursor cursor = SqliteWrapper.query(context, context.getContentResolver(), 19872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Mms.CONTENT_URI, new String[] { Mms.THREAD_ID }, 19972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project sb.toString(), null, null); 20072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (cursor != null) { 20172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 20272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if ((cursor.getCount() == 1) && cursor.moveToFirst()) { 20372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return cursor.getLong(0); 20472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 20572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } finally { 20672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project cursor.close(); 20772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 20872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 20972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 21072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return -1; 21172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 21272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 21372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static boolean isDuplicateNotification( 21472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Context context, NotificationInd nInd) { 21572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project byte[] rawLocation = nInd.getContentLocation(); 21672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (rawLocation != null) { 21772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String location = new String(rawLocation); 21872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String selection = Mms.CONTENT_LOCATION + " = ?"; 21972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String[] selectionArgs = new String[] { location }; 22072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Cursor cursor = SqliteWrapper.query( 22172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project context, context.getContentResolver(), 22272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Mms.CONTENT_URI, new String[] { Mms._ID }, 22372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project selection, selectionArgs, null); 22472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (cursor != null) { 22572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 22672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (cursor.getCount() > 0) { 22772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // We already received the same notification before. 22872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return true; 22972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 23072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } finally { 23172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project cursor.close(); 23272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 23372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 23472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 23572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return false; 23672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 23772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project} 238