[packages/apps/Bluetooth] DO NOT MERGE Fix SMS delivered successfully but stuck SENDING issue

Receive and handle ACTION_MESSAGE_SENT intent for SMS type
message to move it to SENT folder when pushMessage request
from MCE  is processed and SMS delivered successfully.

Bug: 22343270
CRs-Fixed: 903561
Change-Id: I9dafffc737a34233ede2d10e22cd969f520a12cf
(cherry picked from commit abb54d6d3614cd86a6349303400b9cf2f83af4c7)
This commit is contained in:
Firefly
2015-12-29 13:37:08 -08:00
committed by cjp
parent 50da24f211
commit 46c8fcdf7d

View File

@ -71,6 +71,7 @@ import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.telephony.TelephonyManager;
import android.text.format.DateUtils;
import android.util.EventLog;
import android.util.Log;
import android.util.Xml;
import android.os.Looper;
@ -1738,7 +1739,20 @@ public class BluetoothMapContentObserver {
return;
}
if (action.equals(ACTION_MESSAGE_DELIVERY)) {
if (action.equals(ACTION_MESSAGE_SENT)) {
int result = intent.getIntExtra(EXTRA_MESSAGE_SENT_RESULT, Activity.RESULT_CANCELED);
msgInfo.partsSent++;
if(result != Activity.RESULT_OK) {
// If just one of the parts in the message fails, we need to send the entire message again
msgInfo.failedSent = true;
}
if(D) Log.d(TAG, "onReceive: msgInfo.partsSent = " + msgInfo.partsSent
+ ", msgInfo.parts = " + msgInfo.parts + " result = " + result);
if (msgInfo.partsSent == msgInfo.parts) {
actionMessageSent(context, intent, msgInfo);
}
} else if (action.equals(ACTION_MESSAGE_DELIVERY)) {
long timestamp = intent.getLongExtra(EXTRA_MESSAGE_SENT_TIMESTAMP, 0);
int status = -1;
if(msgInfo.timestamp == timestamp) {
@ -1764,6 +1778,67 @@ public class BluetoothMapContentObserver {
}
}
private void actionMessageSent(Context context, Intent intent, PushMsgInfo msgInfo) {
/* As the MESSAGE_SENT intent is forwarded from the MAP service, we use the intent
* to carry the result, as getResult() will not return the correct value.
*/
boolean delete = false;
if(D) Log.d(TAG,"actionMessageSent(): msgInfo.failedSent = " + msgInfo.failedSent);
msgInfo.sendInProgress = false;
if (msgInfo.failedSent == false) {
if(D) Log.d(TAG, "actionMessageSent: result OK");
if (msgInfo.transparent == 0) {
if (!Sms.moveMessageToFolder(context, msgInfo.uri,
Sms.MESSAGE_TYPE_SENT, 0)) {
Log.w(TAG, "Failed to move " + msgInfo.uri + " to SENT");
}
} else {
delete = true;
}
Event evt = new Event(EVENT_TYPE_SENDING_SUCCESS, msgInfo.id,
folderSms[Sms.MESSAGE_TYPE_SENT], null, mSmsType);
sendEvent(evt);
} else {
if (msgInfo.retry == 1) {
/* Notify failure, but keep message in outbox for resending */
msgInfo.resend = true;
msgInfo.partsSent = 0; // Reset counter for the retry
msgInfo.failedSent = false;
Event evt = new Event(EVENT_TYPE_SENDING_FAILURE, msgInfo.id,
folderSms[Sms.MESSAGE_TYPE_OUTBOX], null, mSmsType);
sendEvent(evt);
} else {
if (msgInfo.transparent == 0) {
if (!Sms.moveMessageToFolder(context, msgInfo.uri,
Sms.MESSAGE_TYPE_FAILED, 0)) {
Log.w(TAG, "Failed to move " + msgInfo.uri + " to FAILED");
}
} else {
delete = true;
}
Event evt = new Event(EVENT_TYPE_SENDING_FAILURE, msgInfo.id,
folderSms[Sms.MESSAGE_TYPE_FAILED], null, mSmsType);
sendEvent(evt);
}
}
if (delete == true) {
/* Delete from Observer message list to avoid delete notifications */
synchronized(mMsgListSms) {
mMsgListSms.remove(msgInfo.id);
}
/* Delete from DB */
mResolver.delete(msgInfo.uri, null, null);
}
}
private void actionMessageDelivery(Context context, Intent intent, PushMsgInfo msgInfo) {
Uri messageUri = intent.getData();
msgInfo.sendInProgress = false;
@ -1809,6 +1884,7 @@ public class BluetoothMapContentObserver {
if (context.checkCallingOrSelfPermission(android.Manifest.permission.WRITE_SMS)
!= PackageManager.PERMISSION_GRANTED) {
Log.w(TAG, "actionMessageSentDisconnected: Not allowed to delete SMS/MMS messages");
EventLog.writeEvent(0x534e4554, "b/22343270", Binder.getCallingUid(), "");
return;
}