diff options
author | Deepak Kundra <deepakkundra@gmail.com> | 2016-05-19 14:55:51 +0530 |
---|---|---|
committer | Steve Kondik <steve@cyngn.com> | 2016-08-28 20:43:40 -0700 |
commit | 2a2a21e1aed9de23a9e5f54f1cc193883c38e7f6 (patch) | |
tree | 5f2f9e4b689231d3d8586f4547e78531a5289b1d /src/com | |
parent | 4b60318904ed413d1c0cb2d6ea6715f65ba4a33f (diff) | |
download | android_packages_apps_Messaging-2a2a21e1aed9de23a9e5f54f1cc193883c38e7f6.tar.gz android_packages_apps_Messaging-2a2a21e1aed9de23a9e5f54f1cc193883c38e7f6.tar.bz2 android_packages_apps_Messaging-2a2a21e1aed9de23a9e5f54f1cc193883c38e7f6.zip |
[SMS] Replace message content for protocol 0x41-0x47
SMS replacing feature is missing on 13.0
Added support for this.
Issue-Id: FEIJ-401
Change-Id: I33d07a4accd6f95263199d87c192b7f33d3b2a96
Diffstat (limited to 'src/com')
5 files changed, 89 insertions, 10 deletions
diff --git a/src/com/android/messaging/datamodel/action/ReceiveSmsMessageAction.java b/src/com/android/messaging/datamodel/action/ReceiveSmsMessageAction.java index b8c97b9..b1800be 100644 --- a/src/com/android/messaging/datamodel/action/ReceiveSmsMessageAction.java +++ b/src/com/android/messaging/datamodel/action/ReceiveSmsMessageAction.java @@ -17,7 +17,9 @@ package com.android.messaging.datamodel.action; import android.content.ContentValues; +import android.content.ContentUris; import android.content.Context; +import android.database.Cursor; import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; @@ -44,12 +46,14 @@ public class ReceiveSmsMessageAction extends Action implements Parcelable { private static final String TAG = LogUtil.BUGLE_DATAMODEL_TAG; private static final String KEY_MESSAGE_VALUES = "message_values"; + private static final String KEY_MESSAGE_REPLACEABLE = "message_replaceable"; /** * Create a message received from a particular number in a particular conversation */ - public ReceiveSmsMessageAction(final ContentValues messageValues) { + public ReceiveSmsMessageAction(final ContentValues messageValues, final boolean isReplaceable) { actionParameters.putParcelable(KEY_MESSAGE_VALUES, messageValues); + actionParameters.putBoolean(KEY_MESSAGE_REPLACEABLE, isReplaceable); } @Override @@ -57,6 +61,7 @@ public class ReceiveSmsMessageAction extends Action implements Parcelable { final Context context = Factory.get().getApplicationContext(); final ContentValues messageValues = actionParameters.getParcelable(KEY_MESSAGE_VALUES); final DatabaseWrapper db = DataModel.get().getDatabase(); + boolean mReplaceable = actionParameters.getBoolean(KEY_MESSAGE_REPLACEABLE); // Get the SIM subscription ID Integer subId = messageValues.getAsInteger(Sms.SUBSCRIPTION_ID); @@ -109,8 +114,62 @@ public class ReceiveSmsMessageAction extends Action implements Parcelable { messageValues.put(Sms.Inbox.SEEN, 1); // Insert into telephony - final Uri messageUri = context.getContentResolver().insert(Sms.Inbox.CONTENT_URI, - messageValues); + Uri messageUri = null; + LogUtil.d("MessageReplaceFeature", "SMS Message Replaceable : " + mReplaceable); + if (mReplaceable) { + // This must match the column IDs below. + String[] REPLACE_PROJECTION = new String[]{ + Sms._ID, + Sms.ADDRESS, + Sms.PROTOCOL + }; + int REPLACE_COLUMN_ID = 0; + String selection; + String[] selectionArgs; + selection = Sms.ADDRESS + " = ? AND " + + Sms.PROTOCOL + " = ? AND " + + Sms.SUBSCRIPTION_ID + " = ? "; + selectionArgs = new String[]{ + messageValues.getAsString(Sms.ADDRESS), + messageValues.getAsString(Sms.PROTOCOL), + messageValues.getAsString(Sms.SUBSCRIPTION_ID) + }; + + Cursor cursor = context.getContentResolver().query(Sms.Inbox.CONTENT_URI, + REPLACE_PROJECTION, selection, selectionArgs, null); + if (cursor != null && cursor.getCount() > 0) { + LogUtil.d("MessageReplaceFeature", "cursor != null " + cursor.getCount()); + if (cursor.getCount() > 1) { + //Same protocol should never have more than 1 message stored, LOG ERROR + LogUtil.wtf("MessageReplaceFeature", "MessageReplaceFeature : WTF count = " + + cursor.getCount()); + } + + try { + if (cursor.moveToFirst()) { + long messageId = cursor.getLong(REPLACE_COLUMN_ID); + messageUri = ContentUris.withAppendedId( + Sms.CONTENT_URI, messageId); + LogUtil.d("MessageReplaceFeature", "sms messageUri : " + + messageUri.toString()); + context.getContentResolver().update(messageUri, + messageValues, null, null); + } + } finally { + cursor.close(); + } + } else { + //Either cursor is NULL or count == 0 + if(cursor != null) cursor.close(); + LogUtil.d("MessageReplaceFeature", "MessageReplaceFeature : Add NEW Msg"); + mReplaceable = false; + } + } + + if (!mReplaceable) { + messageUri = context.getContentResolver().insert(Sms.Inbox.CONTENT_URI, + messageValues); + } if (messageUri != null) { if (LogUtil.isLoggable(TAG, LogUtil.DEBUG)) { diff --git a/src/com/android/messaging/receiver/SmsReceiver.java b/src/com/android/messaging/receiver/SmsReceiver.java index db9b4bb..7a5ee48 100644 --- a/src/com/android/messaging/receiver/SmsReceiver.java +++ b/src/com/android/messaging/receiver/SmsReceiver.java @@ -199,11 +199,13 @@ public final class SmsReceiver extends BroadcastReceiver { public static void deliverSmsMessages(final Context context, final int subId, final int errorCode, final android.telephony.SmsMessage[] messages) { + final android.telephony.SmsMessage sms = messages[0]; + boolean isReplaceable = sms.isReplace(); + LogUtil.d("SmsReceiver.deliverSmsMessages", "Is SMS Message Replaceable : " + + isReplaceable); final ContentValues messageValues = MmsUtils.parseReceivedSmsMessage(context, messages, errorCode); - LogUtil.v(TAG, "SmsReceiver.deliverSmsMessages"); - final long nowInMillis = System.currentTimeMillis(); final long receivedTimestampMs = MmsUtils.getMessageDate(messages[0], nowInMillis); @@ -218,9 +220,11 @@ public final class SmsReceiver extends BroadcastReceiver { if (messages[0].getMessageClass() == android.telephony.SmsMessage.MessageClass.CLASS_0 || DebugUtils.debugClassZeroSmsEnabled()) { - Factory.get().getUIIntents().launchClassZeroActivity(context, messageValues); + Factory.get().getUIIntents().launchClassZeroActivity(context, messageValues, + isReplaceable); } else { - final ReceiveSmsMessageAction action = new ReceiveSmsMessageAction(messageValues); + final ReceiveSmsMessageAction action = new ReceiveSmsMessageAction(messageValues, + isReplaceable); action.start(); } } diff --git a/src/com/android/messaging/ui/ClassZeroActivity.java b/src/com/android/messaging/ui/ClassZeroActivity.java index ccb15a0..209ec25 100644 --- a/src/com/android/messaging/ui/ClassZeroActivity.java +++ b/src/com/android/messaging/ui/ClassZeroActivity.java @@ -80,6 +80,12 @@ public class ClassZeroActivity extends Activity { private boolean queueMsgFromIntent(final Intent msgIntent) { final ContentValues messageValues = msgIntent.getParcelableExtra(UIIntents.UI_INTENT_EXTRA_MESSAGE_VALUES); + final boolean isReplaceable = + msgIntent.getBooleanExtra(UIIntents.UI_INTENT_EXTRA_MESSAGE_REPLACEABLE, false); + messageValues.put(UIIntents.UI_INTENT_EXTRA_MESSAGE_REPLACEABLE, isReplaceable); + if (VERBOSE) { + Log.d(TAG, "queueMsgFromIntent isReplaceable = " + isReplaceable); + } // that takes the format argument is a hidden API right now. final String message = messageValues.getAsString(Sms.BODY); if (TextUtils.isEmpty(message)) { @@ -107,7 +113,11 @@ public class ClassZeroActivity extends Activity { private void saveMessage() { mMessageValues.put(Sms.Inbox.READ, mRead ? Integer.valueOf(1) : Integer.valueOf(0)); - final ReceiveSmsMessageAction action = new ReceiveSmsMessageAction(mMessageValues); + final boolean isReplaceable = + mMessageValues.getAsBoolean(UIIntents.UI_INTENT_EXTRA_MESSAGE_REPLACEABLE); + mMessageValues.remove(UIIntents.UI_INTENT_EXTRA_MESSAGE_REPLACEABLE); + final ReceiveSmsMessageAction action = new ReceiveSmsMessageAction(mMessageValues, + isReplaceable); action.start(); } diff --git a/src/com/android/messaging/ui/UIIntents.java b/src/com/android/messaging/ui/UIIntents.java index e5f8a52..c8fde48 100644 --- a/src/com/android/messaging/ui/UIIntents.java +++ b/src/com/android/messaging/ui/UIIntents.java @@ -57,6 +57,9 @@ public abstract class UIIntents { // Sending class zero message to its activity public static final String UI_INTENT_EXTRA_MESSAGE_VALUES = "message_values"; + // Sending class zero message to its activity and notifying if it should be replaced + public static final String UI_INTENT_EXTRA_MESSAGE_REPLACEABLE = "message_replaceable"; + // For the widget to go to the ConversationList from the Conversation. public static final String UI_INTENT_EXTRA_GOTO_CONVERSATION_LIST = "goto_conv_list"; @@ -198,7 +201,8 @@ public abstract class UIIntents { /** * Launch an activity to show a class zero message */ - public abstract void launchClassZeroActivity(Context context, ContentValues messageValues); + public abstract void launchClassZeroActivity(Context context, ContentValues messageValues, + boolean isReplaceable); /** * Launch an activity to let the user forward a message diff --git a/src/com/android/messaging/ui/UIIntentsImpl.java b/src/com/android/messaging/ui/UIIntentsImpl.java index b7db719..8f1b74e 100644 --- a/src/com/android/messaging/ui/UIIntentsImpl.java +++ b/src/com/android/messaging/ui/UIIntentsImpl.java @@ -263,9 +263,11 @@ public class UIIntentsImpl extends UIIntents { } @Override - public void launchClassZeroActivity(final Context context, final ContentValues messageValues) { + public void launchClassZeroActivity(final Context context, final ContentValues messageValues, + boolean isReplaceable) { final Intent classZeroIntent = new Intent(context, ClassZeroActivity.class) .putExtra(UI_INTENT_EXTRA_MESSAGE_VALUES, messageValues) + .putExtra(UI_INTENT_EXTRA_MESSAGE_REPLACEABLE, isReplaceable) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); context.startActivity(classZeroIntent); } |