public void run() { Xlog.d(MmsApp.TXN_TAG, "NotificationTransaction: run()"); DownloadManager downloadManager = DownloadManager.getInstance(); // boolean autoDownload = downloadManager.isAuto(); // boolean dataSuspended = (MmsApp.getApplication().getTelephonyManager().getDataState() == // TelephonyManager.DATA_SUSPENDED); boolean autoDownload = false; boolean dataSuspended = false; // add for gemini if (FeatureOption.MTK_GEMINI_SUPPORT) { autoDownload = downloadManager.isAuto(mSimId); int datastate = MmsApp.getApplication() .getTelephonyManager() .getDataStateGemini(SIMInfo.getSlotById(mContext, mSimId)); dataSuspended = (datastate == TelephonyManager.DATA_SUSPENDED || datastate == TelephonyManager.DATA_DISCONNECTED); } else { autoDownload = downloadManager.isAuto(); dataSuspended = (MmsApp.getApplication().getTelephonyManager().getDataState() == TelephonyManager.DATA_SUSPENDED); } try { if (LOCAL_LOGV) { Log.v(TAG, "Notification transaction launched: " + this); } // By default, we set status to STATUS_DEFERRED because we // should response MMSC with STATUS_DEFERRED when we cannot // download a MM immediately. int status = STATUS_DEFERRED; // Check expiry state Date CurrentDate = new Date(System.currentTimeMillis()); Date ExpiryDate = new Date(mNotificationInd.getExpiry() * 1000); Xlog.d( MmsApp.TXN_TAG, "expiry time=" + ExpiryDate.toLocaleString() + "\t current=" + CurrentDate.toLocaleString()); // MTK_OP01_PROTECT_START /* String optr = SystemProperties.get("ro.operator.optr"); if (optr.equals("OP01")) { // Check Message size int msgSize = 0; Cursor cursor = SqliteWrapper.query(mContext, mContext.getContentResolver(), mUri, new String[] {Mms.MESSAGE_SIZE}, null, null, null); if (cursor != null && cursor.getCount() == 1 && cursor.moveToFirst()) { try{ msgSize = cursor.getInt(0); Xlog.v(MmsApp.TXN_TAG, "msg Size = " + msgSize); }finally{ cursor.close(); } } String netWorkType = null; int slotId = -1; if (FeatureOption.MTK_GEMINI_SUPPORT) { // convert sim id to slot id slotId = SIMInfo.getSlotById(mContext, mSimId); netWorkType = SystemProperties.get(slotId == 0 ? TelephonyProperties.PROPERTY_CS_NETWORK_TYPE : TelephonyProperties.PROPERTY_CS_NETWORK_TYPE_2); } else { netWorkType = SystemProperties.get(TelephonyProperties.PROPERTY_CS_NETWORK_TYPE); } boolean bTDNetwork = Integer.parseInt(netWorkType) > 2 ? true : false; if ((!bTDNetwork && MmsConfig.getReceiveMmsLimitFor2G() < msgSize/1024) || (bTDNetwork && MmsConfig.getReceiveMmsLimitForTD() < msgSize/1024)) { Xlog.v(MmsApp.TXN_TAG, "Message size exceed limitation, rejected."); status = STATUS_REJECTED; sendNotifyRespInd(status); return; } } */ // MTK_OP01_PROTECT_END // Don't try to download when data is suspended, as it will fail, so defer download if (!autoDownload || dataSuspended) { Xlog.d( MmsApp.TXN_TAG, "Not autoDownload! autoDonwload=" + autoDownload + ", dataSuspended=" + dataSuspended); if (FeatureOption.MTK_GEMINI_SUPPORT) { downloadManager.markState(mUri, DownloadManager.STATE_UNSTARTED, mSimId); } else { downloadManager.markState(mUri, DownloadManager.STATE_UNSTARTED); } sendNotifyRespInd(status); return; } if (FeatureOption.MTK_GEMINI_SUPPORT) { downloadManager.markState(mUri, DownloadManager.STATE_DOWNLOADING, mSimId); } else { downloadManager.markState(mUri, DownloadManager.STATE_DOWNLOADING); } if (LOCAL_LOGV) { Log.v(TAG, "Content-Location: " + mContentLocation); } byte[] retrieveConfData = null; // We should catch exceptions here to response MMSC // with STATUS_DEFERRED. try { Xlog.d(MmsApp.TXN_TAG, "NotificationTransaction: before getpdu"); retrieveConfData = getPdu(mContentLocation); Xlog.d(MmsApp.TXN_TAG, "NotificationTransaction: after getpdu"); } catch (IOException e) { mTransactionState.setState(FAILED); } if (retrieveConfData != null) { GenericPdu pdu = new PduParser(retrieveConfData).parse(); if ((pdu == null) || (pdu.getMessageType() != MESSAGE_TYPE_RETRIEVE_CONF)) { Log.e(TAG, "Invalid M-RETRIEVE.CONF PDU."); mTransactionState.setState(FAILED); status = STATUS_UNRECOGNIZED; } else { // Save the received PDU (must be a M-RETRIEVE.CONF). PduPersister p = PduPersister.getPduPersister(mContext); Uri uri = p.persist(pdu, Inbox.CONTENT_URI); Xlog.d(MmsApp.TXN_TAG, "PDU Saved, Uri=" + uri + "\nDelete Notify Ind, Uri=" + mUri); // add for gemini if (FeatureOption.MTK_GEMINI_SUPPORT) { ContentResolver cr = mContext.getContentResolver(); ContentValues values = new ContentValues(1); values.put(Mms.SIM_ID, mSimId); SqliteWrapper.update(mContext, cr, uri, values, null, null); } // set message size int messageSize = retrieveConfData.length; ContentValues sizeValue = new ContentValues(); sizeValue.put(Mms.MESSAGE_SIZE, messageSize); SqliteWrapper.update(mContext, mContext.getContentResolver(), uri, sizeValue, null, null); // We have successfully downloaded the new MM. Delete the // M-NotifyResp.ind from Inbox. String notifId = mUri.getLastPathSegment(); String msgId = uri.getLastPathSegment(); if (!notifId.equals(msgId)) { SqliteWrapper.delete(mContext, mContext.getContentResolver(), mUri, null, null); } // Notify observers with newly received MM. mUri = uri; status = STATUS_RETRIEVED; } } else { Xlog.e(MmsApp.TXN_TAG, "retrieveConfData is null"); mTransactionState.setState(FAILED); status = STATUS_UNRECOGNIZED; } // Check the status and update the result state of this Transaction. switch (status) { case STATUS_RETRIEVED: mTransactionState.setState(SUCCESS); break; case STATUS_DEFERRED: // STATUS_DEFERRED, may be a failed immediate retrieval. if (mTransactionState.getState() == INITIALIZED) { mTransactionState.setState(SUCCESS); } break; } // if the status is STATUS_UNRECOGNIZED, this happened when we don't get mms pdu from server, // this may be a server problem or network problem. // our policy is will retry later, so we must response a deferred status not this one. // otherwise the server may delete this mms, and when we retry it, it's another mms created by // server to // inform us that the old mms is not exist yet. if (status == STATUS_UNRECOGNIZED) { status = STATUS_DEFERRED; } sendNotifyRespInd(status); // Make sure this thread isn't over the limits in message count. Recycler.getMmsRecycler().deleteOldMessagesInSameThreadAsMessage(mContext, mUri); } catch (Throwable t) { Log.e(TAG, Log.getStackTraceString(t)); if (null != mUri) { Recycler.getMmsRecycler().deleteOldMessagesInSameThreadAsMessage(mContext, mUri); } } finally { mTransactionState.setContentUri(mUri); if (!autoDownload /*|| dataSuspended*/ /*comment this case for 81452*/) { // Always mark the transaction successful for deferred // download since any error here doesn't make sense. mTransactionState.setState(SUCCESS); } if (mTransactionState.getState() != SUCCESS) { mTransactionState.setState(FAILED); Xlog.w(MmsApp.TXN_TAG, "NotificationTransaction failed."); } notifyObservers(); } }
public void run() { DownloadManager downloadManager = DownloadManager.getInstance(); boolean autoDownload = downloadManager.isAuto(); boolean dataSuspended = (TelephonyManager.getDefault().getDataState() == TelephonyManager.DATA_SUSPENDED); try { if (LOCAL_LOGV) { Log.v(TAG, "Notification transaction launched: " + this); } // By default, we set status to STATUS_DEFERRED because we // should response MMSC with STATUS_DEFERRED when we cannot // download a MM immediately. int status = STATUS_DEFERRED; // Don't try to download when data is suspended, as it will fail, so defer download if (!autoDownload || dataSuspended) { downloadManager.markState(mUri, DownloadManager.STATE_UNSTARTED); sendNotifyRespInd(status); return; } downloadManager.markState(mUri, DownloadManager.STATE_DOWNLOADING); if (LOCAL_LOGV) { Log.v(TAG, "Content-Location: " + mContentLocation); } byte[] retrieveConfData = null; // We should catch exceptions here to response MMSC // with STATUS_DEFERRED. try { retrieveConfData = getPdu(mContentLocation); } catch (IOException e) { mTransactionState.setState(FAILED); } if (retrieveConfData != null) { GenericPdu pdu = new PduParser(retrieveConfData).parse(); if ((pdu == null) || (pdu.getMessageType() != MESSAGE_TYPE_RETRIEVE_CONF)) { Log.e(TAG, "Invalid M-RETRIEVE.CONF PDU."); mTransactionState.setState(FAILED); status = STATUS_UNRECOGNIZED; } else { // Save the received PDU (must be a M-RETRIEVE.CONF). PduPersister p = PduPersister.getPduPersister(mContext); Uri uri = p.persist(pdu, Inbox.CONTENT_URI); // We have successfully downloaded the new MM. Delete the // M-NotifyResp.ind from Inbox. SqliteWrapper.delete(mContext, mContext.getContentResolver(), mUri, null, null); // Notify observers with newly received MM. mUri = uri; status = STATUS_RETRIEVED; } } if (LOCAL_LOGV) { Log.v(TAG, "status=0x" + Integer.toHexString(status)); } // Check the status and update the result state of this Transaction. switch (status) { case STATUS_RETRIEVED: mTransactionState.setState(SUCCESS); break; case STATUS_DEFERRED: // STATUS_DEFERRED, may be a failed immediate retrieval. if (mTransactionState.getState() == INITIALIZED) { mTransactionState.setState(SUCCESS); } break; } sendNotifyRespInd(status); // Make sure this thread isn't over the limits in message count. Recycler.getMmsRecycler().deleteOldMessagesInSameThreadAsMessage(mContext, mUri); } catch (Throwable t) { Log.e(TAG, Log.getStackTraceString(t)); } finally { mTransactionState.setContentUri(mUri); if (!autoDownload || dataSuspended) { // Always mark the transaction successful for deferred // download since any error here doesn't make sense. mTransactionState.setState(SUCCESS); } if (mTransactionState.getState() != SUCCESS) { mTransactionState.setState(FAILED); Log.e(TAG, "NotificationTransaction failed."); } notifyObservers(); } }
private Uri storeMessage(Context context, SmsMessage[] msgs, int error) { SmsMessage sms = msgs[0]; // Store the message in the content provider. ContentValues values = extractContentValues(sms); values.put(Sms.ERROR_CODE, error); int pduCount = msgs.length; if (pduCount == 1) { // There is only one part, so grab the body directly. values.put(Inbox.BODY, replaceFormFeeds(sms.getDisplayMessageBody())); } else { // Build up the body from the parts. StringBuilder body = new StringBuilder(); for (int i = 0; i < pduCount; i++) { sms = msgs[i]; if (sms.mWrappedSmsMessage != null) { body.append(sms.getDisplayMessageBody()); } } values.put(Inbox.BODY, replaceFormFeeds(body.toString())); } // Make sure we've got a thread id so after the insert we'll be able to delete // excess messages. Long threadId = values.getAsLong(Sms.THREAD_ID); String address = values.getAsString(Sms.ADDRESS); // Code for debugging and easy injection of short codes, non email addresses, etc. // See Contact.isAlphaNumber() for further comments and results. // switch (count++ % 8) { // case 0: address = "AB12"; break; // case 1: address = "12"; break; // case 2: address = "Jello123"; break; // case 3: address = "T-Mobile"; break; // case 4: address = "Mobile1"; break; // case 5: address = "Dogs77"; break; // case 6: address = "****1"; break; // case 7: address = "#4#5#6#"; break; // } if (!TextUtils.isEmpty(address)) { Contact cacheContact = Contact.get(address, true); if (cacheContact != null) { address = cacheContact.getNumber(); } } else { address = getString(R.string.unknown_sender); values.put(Sms.ADDRESS, address); } if (((threadId == null) || (threadId == 0)) && (address != null)) { threadId = Conversation.getOrCreateThreadId(context, address); values.put(Sms.THREAD_ID, threadId); } ContentResolver resolver = context.getContentResolver(); Uri insertedUri = SqliteWrapper.insert(context, resolver, Inbox.CONTENT_URI, values); // Now make sure we're not over the limit in stored messages Recycler.getSmsRecycler().deleteOldMessagesByThreadId(context, threadId); MmsWidgetProvider.notifyDatasetChanged(context); return insertedUri; }