summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Taylor <tomtaylor@google.com>2014-10-27 16:12:26 -0700
committerTom Taylor <tomtaylor@google.com>2014-10-27 16:12:26 -0700
commitfc883c83173544a002ad5f63371a607475397f58 (patch)
tree898f4e8ed9ba85e2951213c4080c4434018b757d
parent563c3666bb53da98a98befe70d193a378317a8bd (diff)
downloadMms-fc883c83173544a002ad5f63371a607475397f58.tar.gz
Messaging app needs to use mms_config appropriate for each SIM
Bug 18018147 The sprout Messaging app only loads a single mms_config, even when there are two sims. We didn't fix this in klp-sprout because we didn't have specific mms_configs for the mcc/mnc's we were launching in. Hence, the app would use the default mms_config values. In L we made the mms service load individual mms_config's for each sim and provided a way to get the config values based on the subscription id. Since we're making the old Messaging app available in L-mr1 for AOSP, we need to fix the app to use config values based on the subId. In addition, we need to fix all the references to getLine1Info to get the appropriate number based on the subscription id. Change-Id: Ib7ffab8faa24f307e9f4877ab5292e23f9587dd3
-rwxr-xr-xres/layout/sub_select_item.xml2
-rw-r--r--res/values/arrays.xml1
-rw-r--r--src/com/android/mms/LogTag.java9
-rw-r--r--src/com/android/mms/MmsApp.java1
-rwxr-xr-xsrc/com/android/mms/MmsConfig.java511
-rw-r--r--src/com/android/mms/data/Contact.java50
-rw-r--r--src/com/android/mms/data/ContactList.java30
-rwxr-xr-xsrc/com/android/mms/data/Conversation.java54
-rwxr-xr-xsrc/com/android/mms/data/WorkingMessage.java204
-rw-r--r--src/com/android/mms/model/CarrierContentRestriction.java11
-rw-r--r--src/com/android/mms/model/ImageModel.java6
-rw-r--r--src/com/android/mms/model/MediaModel.java7
-rwxr-xr-xsrc/com/android/mms/model/SlideshowModel.java10
-rw-r--r--src/com/android/mms/transaction/HttpUtils.java84
-rw-r--r--src/com/android/mms/transaction/MessagingNotification.java32
-rwxr-xr-xsrc/com/android/mms/transaction/MmsMessageSender.java2
-rw-r--r--src/com/android/mms/transaction/NotificationTransaction.java12
-rw-r--r--src/com/android/mms/transaction/PushReceiver.java18
-rwxr-xr-xsrc/com/android/mms/transaction/ReadRecTransaction.java2
-rwxr-xr-xsrc/com/android/mms/transaction/RetrieveTransaction.java9
-rw-r--r--src/com/android/mms/transaction/RetryScheduler.java7
-rwxr-xr-xsrc/com/android/mms/transaction/SendTransaction.java2
-rw-r--r--src/com/android/mms/transaction/SmsReceiverService.java6
-rwxr-xr-xsrc/com/android/mms/transaction/SmsSingleRecipientSender.java10
-rwxr-xr-xsrc/com/android/mms/transaction/Transaction.java6
-rw-r--r--src/com/android/mms/transaction/TransactionService.java11
-rw-r--r--src/com/android/mms/ui/AttachmentTypeSelectorAdapter.java7
-rw-r--r--src/com/android/mms/ui/ComposeMessageActivity.java201
-rw-r--r--src/com/android/mms/ui/ConversationList.java10
-rw-r--r--src/com/android/mms/ui/DeliveryReportActivity.java19
-rw-r--r--src/com/android/mms/ui/DeliveryReportAdapter.java2
-rw-r--r--src/com/android/mms/ui/DeliveryReportItem.java4
-rw-r--r--src/com/android/mms/ui/DeliveryReportListItem.java4
-rwxr-xr-xsrc/com/android/mms/ui/MessageItem.java7
-rwxr-xr-xsrc/com/android/mms/ui/MessageListAdapter.java4
-rw-r--r--src/com/android/mms/ui/MessageListItem.java7
-rw-r--r--src/com/android/mms/ui/MessageUtils.java49
-rw-r--r--src/com/android/mms/ui/MessagingPreferenceActivity.java34
-rw-r--r--src/com/android/mms/ui/RecipientsEditor.java29
-rw-r--r--src/com/android/mms/ui/SearchActivity.java4
-rw-r--r--src/com/android/mms/ui/SlideEditorActivity.java9
-rw-r--r--src/com/android/mms/util/DownloadManager.java8
-rw-r--r--tests/src/com/android/mms/RecyclerTest.java5
-rw-r--r--tests/src/com/android/mms/ui/ComposeMessageActivityTests.java17
-rw-r--r--tests/src/com/android/mms/ui/SmsTest.java7
-rw-r--r--tests/src/com/android/mms/util/VerifyRecipientUnitTests.java7
46 files changed, 751 insertions, 780 deletions
diff --git a/res/layout/sub_select_item.xml b/res/layout/sub_select_item.xml
index 0f83343a..1e4c7b15 100755
--- a/res/layout/sub_select_item.xml
+++ b/res/layout/sub_select_item.xml
@@ -21,7 +21,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
>
- <com.android.internal.widget.SubscriptionView
+ <com.android.mms.ui.SubscriptionView
android:id="@+id/subItem"
android:layout_width="0dp"
android:layout_height="match_parent"
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 0a1bd94a..8feafdcf 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -21,5 +21,6 @@
no subject string was delivered. -->
<string-array name="empty_subject_strings">
<item>no subject</item>
+ <item>nosubject</item>
</string-array>
</resources>
diff --git a/src/com/android/mms/LogTag.java b/src/com/android/mms/LogTag.java
index 23212fe2..99fe3473 100644
--- a/src/com/android/mms/LogTag.java
+++ b/src/com/android/mms/LogTag.java
@@ -90,7 +90,7 @@ public class LogTag {
Log.e(TAG, logFormat(format, args));
}
- public static void dumpInternalTables(final Context context) {
+ public static void dumpInternalTables(final Context context, final int subId) {
if (!ALLOW_DUMP_IN_LOGS) {
return;
}
@@ -98,7 +98,7 @@ public class LogTag {
public void run() {
RecipientIdCache.canonicalTableDump();
RecipientIdCache.dump();
- Conversation.dumpThreadsTable(context);
+ Conversation.dumpThreadsTable(context, subId);
Conversation.dump();
Conversation.dumpSmsTable(context);
Contact.dump();
@@ -106,11 +106,12 @@ public class LogTag {
}).start();
}
- public static void warnPossibleRecipientMismatch(final String msg, final Activity activity) {
+ public static void warnPossibleRecipientMismatch(final String msg, final Activity activity,
+ final int subId) {
Log.e(TAG, "WARNING!!!! " + msg, new RuntimeException());
if (SHOW_SEVERE_WARNING_DIALOG) {
- dumpInternalTables(activity);
+ dumpInternalTables(activity, subId);
activity.runOnUiThread(new Runnable() {
public void run() {
new AlertDialog.Builder(activity)
diff --git a/src/com/android/mms/MmsApp.java b/src/com/android/mms/MmsApp.java
index 990e49ab..6510004d 100644
--- a/src/com/android/mms/MmsApp.java
+++ b/src/com/android/mms/MmsApp.java
@@ -90,7 +90,6 @@ public class MmsApp extends Application {
mPduLoaderManager = new PduLoaderManager(context);
mThumbnailManager = new ThumbnailManager(context);
- MmsConfig.init(this);
Contact.init(this);
DraftCache.init(this);
Conversation.init(this);
diff --git a/src/com/android/mms/MmsConfig.java b/src/com/android/mms/MmsConfig.java
index 9f1f6c20..3750d751 100755
--- a/src/com/android/mms/MmsConfig.java
+++ b/src/com/android/mms/MmsConfig.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 The Android Open Source Project
+ * Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,204 +16,125 @@
package com.android.mms;
-import java.io.IOException;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
import android.content.Context;
-import android.content.Intent;
import android.content.SharedPreferences;
-import android.content.res.XmlResourceParser;
+import android.os.Bundle;
import android.preference.PreferenceManager;
import android.provider.Telephony;
+import android.telephony.SmsManager;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
import android.text.TextUtils;
+import android.util.Base64;
import android.util.Log;
-import com.android.internal.telephony.TelephonyProperties;
-import com.android.mms.ui.MessageUtils;
-import com.android.mms.ui.MessagingPreferenceActivity;
+import java.io.UnsupportedEncodingException;
+import java.util.HashMap;
public class MmsConfig {
private static final String TAG = LogTag.TAG;
- private static final boolean DEBUG = true;
- private static final boolean LOCAL_LOGV = false;
-
- private static final String DEFAULT_HTTP_KEY_X_WAP_PROFILE = "x-wap-profile";
- private static final String DEFAULT_USER_AGENT = "Android-Mms/2.0";
-
- private static String sMmsAppPackage;
-
- private static final String SMS_PROMO_DISMISSED_KEY = "sms_promo_dismissed_key";
- private static final int MAX_IMAGE_HEIGHT = 480;
- private static final int MAX_IMAGE_WIDTH = 640;
- private static final int MAX_TEXT_LENGTH = 2000;
-
- /**
- * Whether to hide MMS functionality from the user (i.e. SMS only).
- */
- private static boolean mTransIdEnabled = false;
- private static int mMmsEnabled = 1; // default to true
- private static int mMaxMessageSize = 300 * 1024; // default to 300k max size
- private static String mUserAgent = DEFAULT_USER_AGENT;
- private static String mUaProfTagName = DEFAULT_HTTP_KEY_X_WAP_PROFILE;
- private static String mUaProfUrl = null;
- private static String mHttpParams = null;
- private static String mHttpParamsLine1Key = null;
- private static String mEmailGateway = null;
- private static int mMaxImageHeight = MAX_IMAGE_HEIGHT; // default value
- private static int mMaxImageWidth = MAX_IMAGE_WIDTH; // default value
- private static int mRecipientLimit = Integer.MAX_VALUE; // default value
- private static int mDefaultSMSMessagesPerThread = 10000; // default value
- private static int mDefaultMMSMessagesPerThread = 1000; // default value
- private static int mMinMessageCountPerThread = 2; // default value
- private static int mMaxMessageCountPerThread = 20000; // default value
- private static int mHttpSocketTimeout = 60*1000; // default to 1 min
- private static int mMinimumSlideElementDuration = 7; // default to 7 sec
- private static boolean mNotifyWapMMSC = false;
- private static boolean mAllowAttachAudio = true;
-
- // If mEnableMultipartSMS is true, long sms messages are always sent as multi-part sms
- // messages, with no checked limit on the number of segments.
- // If mEnableMultipartSMS is false, then as soon as the user types a message longer
- // than a single segment (i.e. 140 chars), then the message will turn into and be sent
- // as an mms message. This feature exists for carriers that don't support multi-part sms's.
- private static boolean mEnableMultipartSMS = true;
-
- // If mEnableMultipartSMS is true and mSmsToMmsTextThreshold > 1, then multi-part SMS messages
- // will be converted into a single mms message. For example, if the mms_config.xml file
- // specifies <int name="smsToMmsTextThreshold">4</int>, then on the 5th sms segment, the
- // message will be converted to an mms.
- private static int mSmsToMmsTextThreshold = -1;
-
- private static boolean mEnableSlideDuration = true;
- private static boolean mEnableMMSReadReports = true; // key: "enableMMSReadReports"
- private static boolean mEnableSMSDeliveryReports = true; // key: "enableSMSDeliveryReports"
- private static boolean mEnableMMSDeliveryReports = true; // key: "enableMMSDeliveryReports"
- private static int mMaxTextLength = -1;
+ final static HashMap<Integer, Bundle> mConfigValues = new HashMap<Integer, Bundle>();
// This is the max amount of storage multiplied by mMaxMessageSize that we
// allow of unsent messages before blocking the user from sending any more
// MMS's.
private static int mMaxSizeScaleForPendingMmsAllowed = 4; // default value
+ private static int mDefaultSMSMessagesPerThread = 200; // default value
+ private static int mDefaultMMSMessagesPerThread = 20; // default value
+ private static int mMinMessageCountPerThread = 2; // default value
+ private static int mMaxMessageCountPerThread = 5000; // default value
+ private static boolean mEnableSlideDuration = true;
+ private static int mMinimumSlideElementDuration = 7; // default to 7 sec
- // Email gateway alias support, including the master switch and different rules
- private static boolean mAliasEnabled = false;
- private static int mAliasRuleMinChars = 2;
- private static int mAliasRuleMaxChars = 48;
-
- private static int mMaxSubjectLength = 40; // maximum number of characters allowed for mms
- // subject
-
- // If mEnableGroupMms is true, a message with multiple recipients, regardless of contents,
- // will be sent as a single MMS message with multiple "TO" fields set for each recipient.
- // If mEnableGroupMms is false, the group MMS setting/preference will be hidden in the settings
- // activity.
- private static boolean mEnableGroupMms = true;
-
- public static void init(Context context) {
- if (LOCAL_LOGV) {
- Log.v(TAG, "MmsConfig.init()");
- }
- // Always put the mnc/mcc in the log so we can tell which mms_config.xml was loaded.
- Log.v(TAG, "mnc/mcc: " +
- android.os.SystemProperties.get(TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC));
-
- sMmsAppPackage = context.getApplicationContext().getPackageName();
-
- loadMmsSettings(context);
- }
-
- public static boolean isSmsEnabled(Context context) {
- String defaultSmsApplication = Telephony.Sms.getDefaultSmsPackage(context);
-
- if (defaultSmsApplication != null && defaultSmsApplication.equals(sMmsAppPackage)) {
- return true;
- }
- return false;
- }
-
- public static boolean isSmsPromoDismissed(Context context) {
- SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
- return preferences.getBoolean(SMS_PROMO_DISMISSED_KEY, false);
- }
-
- public static void setSmsPromoDismissed(Context context) {
- SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
- SharedPreferences.Editor editor = preferences.edit();
- editor.putBoolean(SMS_PROMO_DISMISSED_KEY, true);
- editor.apply();
- }
+ private static String sMmsAppPackage;
- public static Intent getRequestDefaultSmsAppActivity() {
- final Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
- intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, sMmsAppPackage);
- return intent;
- }
+ private static final String SMS_PROMO_DISMISSED_KEY = "sms_promo_dismissed_key";
- public static int getSmsToMmsTextThreshold() {
- return mSmsToMmsTextThreshold;
- }
+ /*
+ * Macro names
+ */
+ // The raw phone number from TelephonyManager.getLine1Number
+ public static final String MACRO_LINE1 = "LINE1";
+ // The phone number without country code
+ public static final String MACRO_LINE1NOCOUNTRYCODE = "LINE1NOCOUNTRYCODE";
+ // NAI (Network Access Identifier), used by Sprint for authentication
+ public static final String MACRO_NAI = "NAI";
- public static boolean getMmsEnabled() {
- return mMmsEnabled == 1 ? true : false;
- }
- public static int getMaxMessageSize() {
- if (LOCAL_LOGV) {
- Log.v(TAG, "MmsConfig.getMaxMessageSize(): " + mMaxMessageSize);
- }
- return mMaxMessageSize;
+ public static long getLong(int subId, final String valueName) {
+ Bundle bundle = getBundle(subId);
+ return bundle != null ? bundle.getLong(valueName) : 0L;
}
- /**
- * This function returns the value of "enabledTransID" present in mms_config file.
- * In case of single segment wap push message, this "enabledTransID" indicates whether
- * TransactionID should be appended to URI or not.
- */
- public static boolean getTransIdEnabled() {
- return mTransIdEnabled;
+ public static long getLong(final String valueName) {
+ return getLong(SubscriptionManager.getDefaultSmsSubId(), valueName);
}
- public static String getUserAgent() {
- return mUserAgent;
+ public static int getInt(int subId, final String valueName) {
+ Bundle bundle = getBundle(subId);
+ return bundle != null ? bundle.getInt(valueName) : 0;
}
- public static String getUaProfTagName() {
- return mUaProfTagName;
+ public static int getInt(final String valueName) {
+ return getInt(SubscriptionManager.getDefaultSmsSubId(), valueName);
}
- public static String getUaProfUrl() {
- return mUaProfUrl;
+ public static String getString(int subId, final String valueName) {
+ Bundle bundle = getBundle(subId);
+ return bundle != null ? bundle.getString(valueName) : null;
}
- public static String getHttpParams() {
- return mHttpParams;
+ public static String getString(final String valueName) {
+ return getString(SubscriptionManager.getDefaultSmsSubId(), valueName);
}
- public static String getHttpParamsLine1Key() {
- return mHttpParamsLine1Key;
+ public static boolean getBoolean(int subId, final String valueName) {
+ Bundle bundle = getBundle(subId);
+ return bundle != null ? bundle.getBoolean(valueName) : false;
}
- public static String getEmailGateway() {
- return mEmailGateway;
+ public static boolean getBoolean(final String valueName) {
+ return getBoolean(SubscriptionManager.getDefaultSmsSubId(), valueName);
}
- public static int getMaxImageHeight() {
- return mMaxImageHeight;
- }
+ private static Bundle getBundle(int subId) {
+ final boolean validSubId = SubscriptionManager.isUsableSubIdValue(subId);
+ if (!validSubId) {
+ subId = SubscriptionManager.getDefaultSmsSubId();
+ }
- public static int getMaxImageWidth() {
- return mMaxImageWidth;
+ Bundle bundle = mConfigValues.get(subId);
+ if (bundle != null) {
+// Log.v(TAG, "getBundle CACHED subId: " + subId + " " + bundleToString(bundle));
+ return bundle;
+ }
+ SmsManager smsManager = SmsManager.getSmsManagerForSubscriber(subId);
+ bundle = smsManager.getCarrierConfigValues();
+ if (bundle != null && validSubId) {
+ mConfigValues.put(subId, bundle);
+ }
+// Log.v(TAG, "getBundle subId: " + subId + " " + bundleToString(bundle));
+ return bundle;
+ }
+
+ private static String bundleToString(final Bundle bundle) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("Bundle: {");
+ if (bundle == null) {
+ sb.append("null");
+ } else {
+ for (String key : bundle.keySet()) {
+ sb.append(" " + key + " -> " + bundle.get(key) + ";");
+ }
+ }
+ sb.append(" }");
+ return sb.toString();
}
- public static int getRecipientLimit() {
- return mRecipientLimit;
- }
- public static int getMaxTextLimit() {
- return mMaxTextLength > -1 ? mMaxTextLength : MAX_TEXT_LENGTH;
+ public static int getMaxSizeScaleForPendingMmsAllowed() {
+ return mMaxSizeScaleForPendingMmsAllowed;
}
public static int getDefaultSMSMessagesPerThread() {
@@ -229,230 +150,106 @@ public class MmsConfig {
}
public static int getMaxMessageCountPerThread() {
- // We bumped the defaultSMSMessagesPerThread in various mms_config.xml's without
- // bumping the corresponding maxMessageCountPerThread. Return a reasonable value if
- // the value appears out of date.
- if (mMaxMessageCountPerThread < mDefaultMMSMessagesPerThread ||
- mDefaultMMSMessagesPerThread < mDefaultSMSMessagesPerThread) {
- return 2 * Math.max(mDefaultMMSMessagesPerThread, mDefaultSMSMessagesPerThread);
- }
return mMaxMessageCountPerThread;
}
- public static int getHttpSocketTimeout() {
- return mHttpSocketTimeout;
- }
-
- public static int getMinimumSlideElementDuration() {
- return mMinimumSlideElementDuration;
- }
-
- public static boolean getMultipartSmsEnabled() {
- return mEnableMultipartSMS;
- }
-
- public static boolean getSlideDurationEnabled() {
- return mEnableSlideDuration;
- }
+ public static boolean isSmsEnabled() {
+ String defaultSmsApplication =
+ Telephony.Sms.getDefaultSmsPackage(MmsApp.getApplication().getApplicationContext());
- public static boolean getMMSReadReportsEnabled() {
- return mEnableMMSReadReports;
- }
-
- public static boolean getSMSDeliveryReportsEnabled() {
- return mEnableSMSDeliveryReports;
- }
-
- public static boolean getMMSDeliveryReportsEnabled() {
- return mEnableMMSDeliveryReports;
- }
-
- public static boolean getNotifyWapMMSC() {
- return mNotifyWapMMSC;
+ if (defaultSmsApplication != null && defaultSmsApplication.equals(getMmsAppPackageName())) {
+ return true;
+ }
+ return false;
}
- public static int getMaxSizeScaleForPendingMmsAllowed() {
- return mMaxSizeScaleForPendingMmsAllowed;
+ private static String getMmsAppPackageName() {
+ if (sMmsAppPackage == null) {
+ sMmsAppPackage = MmsApp.getApplication().getApplicationContext().getPackageName();
+ }
+ return sMmsAppPackage;
}
- public static boolean isAliasEnabled() {
- return mAliasEnabled;
+ public static boolean isSmsPromoDismissed() {
+ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(
+ MmsApp.getApplication().getApplicationContext());
+ return preferences.getBoolean(SMS_PROMO_DISMISSED_KEY, false);
}
- public static int getAliasMinChars() {
- return mAliasRuleMinChars;
+ public static void setSmsPromoDismissed() {
+ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(
+ MmsApp.getApplication().getApplicationContext());
+ SharedPreferences.Editor editor = preferences.edit();
+ editor.putBoolean(SMS_PROMO_DISMISSED_KEY, true);
+ editor.apply();
}
- public static int getAliasMaxChars() {
- return mAliasRuleMaxChars;
+ public static boolean getSlideDurationEnabled() {
+ return mEnableSlideDuration;
}
- public static boolean getAllowAttachAudio() {
- return mAllowAttachAudio;
+ public static int getMinimumSlideElementDuration() {
+ return mMinimumSlideElementDuration;
}
- public static int getMaxSubjectLength() {
- return mMaxSubjectLength;
+ public static String getHttpParamMacro(String macro, int subId) {
+ if (MACRO_LINE1.equals(macro)) {
+ return getLine1(subId);
+ } else if (MACRO_LINE1NOCOUNTRYCODE.equals(macro)) {
+ return getLine1NoCountryCode(subId);
+ } else if (MACRO_NAI.equals(macro)) {
+ return getNai(subId);
+ }
+ return null;
}
- public static boolean getGroupMmsEnabled() {
- return mEnableGroupMms;
+ /**
+ * @return the phone number
+ */
+ private static String getLine1(int subId) {
+ final TelephonyManager telephonyManager =
+ (TelephonyManager) MmsApp.getApplication().getApplicationContext().getSystemService(
+ Context.TELEPHONY_SERVICE);
+ return telephonyManager.getLine1NumberForSubscriber(subId);
}
- public static final void beginDocument(XmlPullParser parser, String firstElementName) throws XmlPullParserException, IOException
- {
- int type;
- while ((type=parser.next()) != parser.START_TAG
- && type != parser.END_DOCUMENT) {
- ;
- }
-
- if (type != parser.START_TAG) {
- throw new XmlPullParserException("No start tag found");
- }
-
- if (!parser.getName().equals(firstElementName)) {
- throw new XmlPullParserException("Unexpected start tag: found " + parser.getName() +
- ", expected " + firstElementName);
- }
+ private static String getLine1NoCountryCode(int subId) {
+ final TelephonyManager telephonyManager =
+ (TelephonyManager) MmsApp.getApplication().getApplicationContext().getSystemService(
+ Context.TELEPHONY_SERVICE);
+ // TODO - strip country code
+ return telephonyManager.getLine1NumberForSubscriber(subId);
}
- public static final void nextElement(XmlPullParser parser) throws XmlPullParserException, IOException
- {
- int type;
- while ((type=parser.next()) != parser.START_TAG
- && type != parser.END_DOCUMENT) {
- ;
+ /**
+ * @return the NAI (Network Access Identifier) from SystemProperties
+ */
+ private static String getNai(int subId) {
+ final TelephonyManager telephonyManager =
+ (TelephonyManager) MmsApp.getApplication().getApplicationContext().getSystemService(
+ Context.TELEPHONY_SERVICE);
+ String nai = telephonyManager.getNai(SubscriptionManager.getSlotId(subId));
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "MmsConfig.getNai: nai=" + nai);
}
- }
- private static void loadMmsSettings(Context context) {
- XmlResourceParser parser = context.getResources().getXml(R.xml.mms_config);
-
- try {
- beginDocument(parser, "mms_config");
-
- while (true) {
- nextElement(parser);
- String tag = parser.getName();
- if (tag == null) {
- break;
- }
- String name = parser.getAttributeName(0);
- String value = parser.getAttributeValue(0);
- String text = null;
- if (parser.next() == XmlPullParser.TEXT) {
- text = parser.getText();
- }
-
- if (DEBUG) {
- Log.v(TAG, "tag: " + tag + " value: " + value + " - " +
- text);
- }
- if ("name".equalsIgnoreCase(name)) {
- if ("bool".equals(tag)) {
- // bool config tags go here
- if ("enabledMMS".equalsIgnoreCase(value)) {
- mMmsEnabled = "true".equalsIgnoreCase(text) ? 1 : 0;
- } else if ("enabledTransID".equalsIgnoreCase(value)) {
- mTransIdEnabled = "true".equalsIgnoreCase(text);
- } else if ("enabledNotifyWapMMSC".equalsIgnoreCase(value)) {
- mNotifyWapMMSC = "true".equalsIgnoreCase(text);
- } else if ("aliasEnabled".equalsIgnoreCase(value)) {
- mAliasEnabled = "true".equalsIgnoreCase(text);
- } else if ("allowAttachAudio".equalsIgnoreCase(value)) {
- mAllowAttachAudio = "true".equalsIgnoreCase(text);
- } else if ("enableMultipartSMS".equalsIgnoreCase(value)) {
- mEnableMultipartSMS = "true".equalsIgnoreCase(text);
- } else if ("enableSlideDuration".equalsIgnoreCase(value)) {
- mEnableSlideDuration = "true".equalsIgnoreCase(text);
- } else if ("enableMMSReadReports".equalsIgnoreCase(value)) {
- mEnableMMSReadReports = "true".equalsIgnoreCase(text);
- } else if ("enableSMSDeliveryReports".equalsIgnoreCase(value)) {
- mEnableSMSDeliveryReports = "true".equalsIgnoreCase(text);
- } else if ("enableMMSDeliveryReports".equalsIgnoreCase(value)) {
- mEnableMMSDeliveryReports = "true".equalsIgnoreCase(text);
- } else if ("enableGroupMms".equalsIgnoreCase(value)) {
- mEnableGroupMms = "true".equalsIgnoreCase(text);
- }
- } else if ("int".equals(tag)) {
- // int config tags go here
- if ("maxMessageSize".equalsIgnoreCase(value)) {
- mMaxMessageSize = Integer.parseInt(text);
- } else if ("maxImageHeight".equalsIgnoreCase(value)) {
- mMaxImageHeight = Integer.parseInt(text);
- } else if ("maxImageWidth".equalsIgnoreCase(value)) {
- mMaxImageWidth = Integer.parseInt(text);
- } else if ("defaultSMSMessagesPerThread".equalsIgnoreCase(value)) {
- mDefaultSMSMessagesPerThread = Integer.parseInt(text);
- } else if ("defaultMMSMessagesPerThread".equalsIgnoreCase(value)) {
- mDefaultMMSMessagesPerThread = Integer.parseInt(text);
- } else if ("minMessageCountPerThread".equalsIgnoreCase(value)) {
- mMinMessageCountPerThread = Integer.parseInt(text);
- } else if ("maxMessageCountPerThread".equalsIgnoreCase(value)) {
- mMaxMessageCountPerThread = Integer.parseInt(text);
- } else if ("recipientLimit".equalsIgnoreCase(value)) {
- mRecipientLimit = Integer.parseInt(text);
- if (mRecipientLimit < 0) {
- mRecipientLimit = Integer.MAX_VALUE;
- }
- } else if ("httpSocketTimeout".equalsIgnoreCase(value)) {
- mHttpSocketTimeout = Integer.parseInt(text);
- } else if ("minimumSlideElementDuration".equalsIgnoreCase(value)) {
- mMinimumSlideElementDuration = Integer.parseInt(text);
- } else if ("maxSizeScaleForPendingMmsAllowed".equalsIgnoreCase(value)) {
- mMaxSizeScaleForPendingMmsAllowed = Integer.parseInt(text);
- } else if ("aliasMinChars".equalsIgnoreCase(value)) {
- mAliasRuleMinChars = Integer.parseInt(text);
- } else if ("aliasMaxChars".equalsIgnoreCase(value)) {
- mAliasRuleMaxChars = Integer.parseInt(text);
- } else if ("smsToMmsTextThreshold".equalsIgnoreCase(value)) {
- mSmsToMmsTextThreshold = Integer.parseInt(text);
- } else if ("maxMessageTextSize".equalsIgnoreCase(value)) {
- mMaxTextLength = Integer.parseInt(text);
- } else if ("maxSubjectLength".equalsIgnoreCase(value)) {
- mMaxSubjectLength = Integer.parseInt(text);
- }
- } else if ("string".equals(tag)) {
- // string config tags go here
- if ("userAgent".equalsIgnoreCase(value)) {
- mUserAgent = text;
- } else if ("uaProfTagName".equalsIgnoreCase(value)) {
- mUaProfTagName = text;
- } else if ("uaProfUrl".equalsIgnoreCase(value)) {
- mUaProfUrl = text;
- } else if ("httpParams".equalsIgnoreCase(value)) {
- mHttpParams = text;
- } else if ("httpParamsLine1Key".equalsIgnoreCase(value)) {
- mHttpParamsLine1Key = text;
- } else if ("emailGatewayNumber".equalsIgnoreCase(value)) {
- mEmailGateway = text;
- }
- }
- }
+ if (!TextUtils.isEmpty(nai)) {
+ String naiSuffix = getString(subId, SmsManager.MMS_CONFIG_NAI_SUFFIX);
+ if (!TextUtils.isEmpty(naiSuffix)) {
+ nai = nai + naiSuffix;
+ }
+ byte[] encoded = null;
+ try {
+ encoded = Base64.encode(nai.getBytes("UTF-8"), Base64.NO_WRAP);
+ } catch (UnsupportedEncodingException e) {
+ encoded = Base64.encode(nai.getBytes(), Base64.NO_WRAP);
+ }
+ try {
+ nai = new String(encoded, "UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ nai = new String(encoded);
}
- } catch (XmlPullParserException e) {
- Log.e(TAG, "loadMmsSettings caught ", e);
- } catch (NumberFormatException e) {
- Log.e(TAG, "loadMmsSettings caught ", e);
- } catch (IOException e) {
- Log.e(TAG, "loadMmsSettings caught ", e);
- } finally {
- parser.close();
- }
-
- String errorStr = null;
-
- if (getMmsEnabled() && mUaProfUrl == null) {
- errorStr = "uaProfUrl";
- }
-
- if (errorStr != null) {
- String err =
- String.format("MmsConfig.loadMmsSettings mms_config.xml missing %s setting",
- errorStr);
- Log.e(TAG, err);
}
+ return nai;
}
-
}
diff --git a/src/com/android/mms/data/Contact.java b/src/com/android/mms/data/Contact.java
index f98315a7..02be9c2e 100644
--- a/src/com/android/mms/data/Contact.java
+++ b/src/com/android/mms/data/Contact.java
@@ -158,16 +158,16 @@ public class Contact {
Log.d(tag, sb.toString());
}
- public static Contact get(String number, boolean canBlock) {
- return sContactCache.get(number, canBlock);
+ public static Contact get(String number, boolean canBlock, int subId) {
+ return sContactCache.get(number, canBlock, subId);
}
- public static Contact getMe(boolean canBlock) {
- return sContactCache.getMe(canBlock);
+ public static Contact getMe(boolean canBlock, int subId) {
+ return sContactCache.getMe(canBlock, subId);
}
- public void removeFromCache() {
- sContactCache.remove(this);
+ public void removeFromCache(int subId) {
+ sContactCache.remove(this, subId);
}
public static List<Contact> getByPhoneUris(Parcelable[] uris) {
@@ -224,9 +224,9 @@ public class Contact {
}
}
- public synchronized void reload() {
+ public synchronized void reload(int subId) {
mIsStale = true;
- sContactCache.get(mNumber, false);
+ sContactCache.get(mNumber, false, subId);
}
public synchronized String getNumber() {
@@ -537,15 +537,15 @@ public class Contact {
mTaskQueue.push(r);
}
- public Contact getMe(boolean canBlock) {
- return get(SELF_ITEM_KEY, true, canBlock);
+ public Contact getMe(boolean canBlock, int subId) {
+ return get(SELF_ITEM_KEY, true, canBlock, subId);
}
- public Contact get(String number, boolean canBlock) {
- return get(number, false, canBlock);
+ public Contact get(String number, boolean canBlock, int subId) {
+ return get(number, false, canBlock, subId);
}
- private Contact get(String number, boolean isMe, boolean canBlock) {
+ private Contact get(String number, boolean isMe, boolean canBlock, final int subId) {
if (Log.isLoggable(LogTag.CONTACT, Log.DEBUG)) {
logWithTrace(TAG, "get(%s, %s, %s)", number, isMe, canBlock);
}
@@ -559,7 +559,7 @@ public class Contact {
// Always return a Contact object, if if we don't have an actual contact
// in the contacts db.
- Contact contact = internalGet(number, isMe);
+ Contact contact = internalGet(number, isMe, subId);
Runnable r = null;
synchronized (contact) {
@@ -587,7 +587,7 @@ public class Contact {
r = new Runnable() {
@Override
public void run() {
- updateContact(c);
+ updateContact(c, subId);
}
};
@@ -723,12 +723,12 @@ public class Contact {
return false;
}
- private void updateContact(final Contact c) {
+ private void updateContact(final Contact c, int subId) {
if (c == null) {
return;
}
- Contact entry = getContactInfo(c);
+ Contact entry = getContactInfo(c, subId);
synchronized (c) {
if (contactChanged(c, entry)) {
if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
@@ -783,12 +783,12 @@ public class Contact {
/**
* Returns the caller info in Contact.
*/
- private Contact getContactInfo(Contact c) {
+ private Contact getContactInfo(Contact c, int subId) {
if (c.mIsMe) {
return getContactInfoForSelf();
} else if (Mms.isEmailAddress(c.mNumber)) {
return getContactInfoForEmailAddress(c.mNumber);
- } else if (isAlphaNumber(c.mNumber)) {
+ } else if (isAlphaNumber(c.mNumber, subId)) {
// first try to look it up in the email field
Contact contact = getContactInfoForEmailAddress(c.mNumber);
if (contact.existsInDatabase()) {
@@ -817,7 +817,7 @@ public class Contact {
// "#4#5#6#" -> true [it is considered to be the address "#4#5#6#"]
// "AB12" -> true [2 digits, it is considered to be the address "AB12"]
// "12" -> true [2 digits, it is considered to be the address "12"]
- private boolean isAlphaNumber(String number) {
+ private boolean isAlphaNumber(String number, int subId) {
// TODO: PhoneNumberUtils.isWellFormedSmsAddress() only check if the number is a valid
// GSM SMS address. If the address contains a dialable char, it considers it a well
// formed SMS addr. CDMA doesn't work that way and has a different parser for SMS
@@ -826,7 +826,7 @@ public class Contact {
// The example "T-Mobile" will exit here because there are no numbers.
return true; // we're not an sms address, consider it an alpha number
}
- if (MessageUtils.isAlias(number)) {
+ if (MessageUtils.isAlias(number, subId)) {
return true;
}
number = PhoneNumberUtils.extractNetworkPortion(number);
@@ -1102,12 +1102,12 @@ public class Contact {
static final int STATIC_KEY_BUFFER_MAXIMUM_LENGTH = 5;
static CharBuffer sStaticKeyBuffer = CharBuffer.allocate(STATIC_KEY_BUFFER_MAXIMUM_LENGTH);
- private Contact internalGet(String numberOrEmail, boolean isMe) {
+ private Contact internalGet(String numberOrEmail, boolean isMe, int subId) {
synchronized (ContactsCache.this) {
// See if we can find "number" in the hashtable.
// If so, just return the result.
final boolean isNotRegularPhoneNumber = isMe || Mms.isEmailAddress(numberOrEmail) ||
- MessageUtils.isAlias(numberOrEmail);
+ MessageUtils.isAlias(numberOrEmail, subId);
final String key = isNotRegularPhoneNumber ?
numberOrEmail : key(numberOrEmail, sStaticKeyBuffer);
@@ -1154,12 +1154,12 @@ public class Contact {
}
// Remove a contact from the ContactsCache based on the number or email address
- private void remove(Contact contact) {
+ private void remove(Contact contact, int subId) {
synchronized (ContactsCache.this) {
String number = contact.getNumber();
final boolean isNotRegularPhoneNumber = contact.isMe() ||
Mms.isEmailAddress(number) ||
- MessageUtils.isAlias(number);
+ MessageUtils.isAlias(number, subId);
final String key = isNotRegularPhoneNumber ?
number : key(number, sStaticKeyBuffer);
ArrayList<Contact> candidates = mContactsHash.get(key);
diff --git a/src/com/android/mms/data/ContactList.java b/src/com/android/mms/data/ContactList.java
index 01c2598d..964c397b 100644
--- a/src/com/android/mms/data/ContactList.java
+++ b/src/com/android/mms/data/ContactList.java
@@ -14,11 +14,11 @@ import com.android.mms.ui.MessageUtils;
public class ContactList extends ArrayList<Contact> {
private static final long serialVersionUID = 1L;
- public static ContactList getByNumbers(Iterable<String> numbers, boolean canBlock) {
+ public static ContactList getByNumbers(Iterable<String> numbers, boolean canBlock, int subId) {
ContactList list = new ContactList();
for (String number : numbers) {
if (!TextUtils.isEmpty(number)) {
- list.add(Contact.get(number, canBlock));
+ list.add(Contact.get(number, canBlock, subId));
}
}
return list;
@@ -26,11 +26,12 @@ public class ContactList extends ArrayList<Contact> {
public static ContactList getByNumbers(String semiSepNumbers,
boolean canBlock,
- boolean replaceNumber) {
+ boolean replaceNumber,
+ int subId) {
ContactList list = new ContactList();
for (String number : semiSepNumbers.split(";")) {
if (!TextUtils.isEmpty(number)) {
- Contact contact = Contact.get(number, canBlock);
+ Contact contact = Contact.get(number, canBlock, subId);
if (replaceNumber) {
contact.setNumber(number);
}
@@ -46,14 +47,15 @@ public class ContactList extends ArrayList<Contact> {
* for the numbers don't belong to any contact.
*
* @param uris phone URI to create the ContactList
+ * @param subId subscription for contact
*/
- public static ContactList blockingGetByUris(Parcelable[] uris) {
+ public static ContactList blockingGetByUris(Parcelable[] uris, int subId) {
ContactList list = new ContactList();
if (uris != null && uris.length > 0) {
for (Parcelable p : uris) {
Uri uri = (Uri) p;
if ("tel".equals(uri.getScheme())) {
- Contact contact = Contact.get(uri.getSchemeSpecificPart(), true);
+ Contact contact = Contact.get(uri.getSchemeSpecificPart(), true, subId);
list.add(contact);
}
}
@@ -69,11 +71,11 @@ public class ContactList extends ArrayList<Contact> {
* Returns a ContactList for the corresponding recipient ids passed in. This method will
* create the contact if it doesn't exist, and would inject the recipient id into the contact.
*/
- public static ContactList getByIds(String spaceSepIds, boolean canBlock) {
+ public static ContactList getByIds(String spaceSepIds, boolean canBlock, int subId) {
ContactList list = new ContactList();
for (RecipientIdCache.Entry entry : RecipientIdCache.getAddresses(spaceSepIds)) {
if (entry != null && !TextUtils.isEmpty(entry.number)) {
- Contact contact = Contact.get(entry.number, canBlock);
+ Contact contact = Contact.get(entry.number, canBlock, subId);
contact.setRecipientId(entry.id);
list.add(contact);
}
@@ -107,8 +109,8 @@ public class ContactList extends ArrayList<Contact> {
return TextUtils.join(separator, nans);
}
- public String serialize() {
- return TextUtils.join(";", getNumbers());
+ public String serialize(int subId) {
+ return TextUtils.join(";", getNumbers(subId));
}
public boolean containsEmail() {
@@ -120,11 +122,11 @@ public class ContactList extends ArrayList<Contact> {
return false;
}
- public String[] getNumbers() {
- return getNumbers(false /* don't scrub for MMS address */);
+ public String[] getNumbers(int subId) {
+ return getNumbers(false /* don't scrub for MMS address */, subId);
}
- public String[] getNumbers(boolean scrubForMmsAddress) {
+ public String[] getNumbers(boolean scrubForMmsAddress, int subId) {
List<String> numbers = new ArrayList<String>();
String number;
for (Contact c : this) {
@@ -135,7 +137,7 @@ public class ContactList extends ArrayList<Contact> {
// could be null if it's not a valid MMS address. We don't want to send
// a message to an invalid number, as the network may do its own stripping,
// and end up sending the message to a different number!
- number = MessageUtils.parseMmsAddress(number);
+ number = MessageUtils.parseMmsAddress(number, subId);
}
// Don't add duplicate numbers. This can happen if a contact name has a comma.
diff --git a/src/com/android/mms/data/Conversation.java b/src/com/android/mms/data/Conversation.java
index c18d5131..a88f42d0 100755
--- a/src/com/android/mms/data/Conversation.java
+++ b/src/com/android/mms/data/Conversation.java
@@ -24,6 +24,7 @@ import android.provider.Telephony.Sms.Conversations;
import android.provider.Telephony.Threads;
import android.provider.Telephony.ThreadsColumns;
import android.telephony.PhoneNumberUtils;
+import android.telephony.SubscriptionManager;
import android.text.TextUtils;
import android.util.Log;
@@ -163,9 +164,11 @@ public class Conversation {
* Find the conversation matching the provided recipient set.
* When called with an empty recipient list, equivalent to {@link #createNew}.
*/
- public static Conversation get(Context context, ContactList recipients, boolean allowQuery) {
+ public static Conversation get(Context context, ContactList recipients, boolean allowQuery,
+ int subId) {
if (DEBUG) {
- Log.v(TAG, "Conversation get by recipients: " + recipients.serialize());
+ Log.v(TAG, "Conversation get by recipients: " +
+ recipients.serialize(SubscriptionManager.getDefaultSmsSubId()));
}
// If there are no recipients in the list, make a new conversation.
if (recipients.size() < 1) {
@@ -176,7 +179,7 @@ public class Conversation {
if (conv != null)
return conv;
- long threadId = getOrCreateThreadId(context, recipients);
+ long threadId = getOrCreateThreadId(context, recipients, subId);
conv = new Conversation(context, threadId, allowQuery);
Log.d(TAG, "Conversation.get: created new conversation " + /*conv.toString()*/ "xxxxxxx");
@@ -203,7 +206,7 @@ public class Conversation {
* {@value sms:+12124797990}.
* When called with a null Uri, equivalent to {@link #createNew}.
*/
- public static Conversation get(Context context, Uri uri, boolean allowQuery) {
+ public static Conversation get(Context context, Uri uri, boolean allowQuery, int subId) {
if (DEBUG) {
Log.v(TAG, "Conversation get by uri: " + uri);
}
@@ -229,14 +232,14 @@ public class Conversation {
String recipients = PhoneNumberUtils.replaceUnicodeDigits(getRecipients(uri))
.replace(',', ';');
return get(context, ContactList.getByNumbers(recipients,
- allowQuery /* don't block */, true /* replace number */), allowQuery);
+ allowQuery /* don't block */, true /* replace number */, subId), allowQuery, subId);
}
/**
* Returns true if the recipient in the uri matches the recipient list in this
* conversation.
*/
- public boolean sameRecipient(Uri uri, Context context) {
+ public boolean sameRecipient(Uri uri, Context context, int subId) {
int size = mRecipients.size();
if (size > 1) {
return false;
@@ -247,7 +250,7 @@ public class Conversation {
ContactList incomingRecipient = null;
if (uri.getPathSegments().size() >= 2) {
// it's a thread id for a conversation
- Conversation otherConv = get(context, uri, false);
+ Conversation otherConv = get(context, uri, false, subId);
if (otherConv == null) {
return false;
}
@@ -255,7 +258,7 @@ public class Conversation {
} else {
String recipient = getRecipients(uri);
incomingRecipient = ContactList.getByNumbers(recipient,
- false /* don't block */, false /* don't replace number */);
+ false /* don't block */, false /* don't replace number */, subId);
}
if (DEBUG) Log.v(TAG, "sameRecipient incomingRecipient: " + incomingRecipient +
" mRecipients: " + mRecipients);
@@ -463,12 +466,12 @@ public class Conversation {
*
* @return The thread ID of this conversation in the database
*/
- public synchronized long ensureThreadId() {
+ public synchronized long ensureThreadId(int subId) {
if (DEBUG || DELETEDEBUG) {
LogTag.debug("ensureThreadId before: " + mThreadId);
}
if (mThreadId <= 0) {
- mThreadId = getOrCreateThreadId(mContext, mRecipients);
+ mThreadId = getOrCreateThreadId(mContext, mRecipients, subId);
}
if (DEBUG || DELETEDEBUG) {
LogTag.debug("ensureThreadId after: " + mThreadId);
@@ -604,11 +607,11 @@ public class Conversation {
mIsChecked = isChecked;
}
- private static long getOrCreateThreadId(Context context, ContactList list) {
+ private static long getOrCreateThreadId(Context context, ContactList list, int subId) {
HashSet<String> recipients = new HashSet<String>();
Contact cacheContact = null;
for (Contact c : list) {
- cacheContact = Contact.get(c.getNumber(), false);
+ cacheContact = Contact.get(c.getNumber(), false, subId);
if (cacheContact != null) {
recipients.add(cacheContact.getNumber());
} else {
@@ -696,7 +699,8 @@ public class Conversation {
@Override
public synchronized String toString() {
- return String.format("[%s] (tid %d)", mRecipients.serialize(), mThreadId);
+ return String.format("[%s] (tid %d)",
+ mRecipients.serialize(SubscriptionManager.getDefaultSmsSubId()), mThreadId);
}
/**
@@ -924,7 +928,8 @@ public class Conversation {
// Fill in as much of the conversation as we can before doing the slow stuff of looking
// up the contacts associated with this conversation.
String recipientIds = c.getString(RECIPIENT_IDS);
- ContactList recipients = ContactList.getByIds(recipientIds, allowQuery);
+ ContactList recipients = ContactList.getByIds(recipientIds, allowQuery,
+ SubscriptionManager.getDefaultSmsSubId());
synchronized (conv) {
conv.mRecipients = recipients;
}
@@ -1305,7 +1310,7 @@ public class Conversation {
Cache.dumpCache();
}
- public static void dumpThreadsTable(Context context) {
+ public static void dumpThreadsTable(Context context, int subId) {
LogTag.debug("**** Dump of threads table ****");
Cursor c = context.getContentResolver().query(sAllThreadsUri,
ALL_THREADS_PROJECTION, null, null, "date ASC");
@@ -1322,8 +1327,9 @@ public class Conversation {
" " + ThreadsColumns.HAS_ATTACHMENT + " : " + c.getInt(HAS_ATTACHMENT) +
" " + ThreadsColumns.RECIPIENT_IDS + " : " + c.getString(RECIPIENT_IDS));
- ContactList recipients = ContactList.getByIds(c.getString(RECIPIENT_IDS), false);
- Log.d(TAG, "----recipients: " + recipients.serialize());
+ ContactList recipients = ContactList.getByIds(c.getString(RECIPIENT_IDS), false,
+ subId);
+ Log.d(TAG, "----recipients: " + recipients.serialize(subId));
}
} finally {
c.close();
@@ -1391,10 +1397,10 @@ public class Conversation {
* @return the verified number or email of the recipient
*/
public static String verifySingleRecipient(final Context context,
- final long threadId, final String recipientStr) {
+ final long threadId, final String recipientStr, int subId) {
if (threadId <= 0) {
LogTag.error("verifySingleRecipient threadId is ZERO, recipient: " + recipientStr);
- LogTag.dumpInternalTables(context);
+ LogTag.dumpInternalTables(context, subId);
return recipientStr;
}
Cursor c = context.getContentResolver().query(sAllThreadsUri, ALL_THREADS_PROJECTION,
@@ -1402,7 +1408,7 @@ public class Conversation {
if (c == null) {
LogTag.error("verifySingleRecipient threadId: " + threadId +
" resulted in NULL cursor , recipient: " + recipientStr);
- LogTag.dumpInternalTables(context);
+ LogTag.dumpInternalTables(context, subId);
return recipientStr;
}
String address = recipientStr;
@@ -1411,7 +1417,7 @@ public class Conversation {
if (!c.moveToFirst()) {
LogTag.error("verifySingleRecipient threadId: " + threadId +
" can't moveToFirst , recipient: " + recipientStr);
- LogTag.dumpInternalTables(context);
+ LogTag.dumpInternalTables(context, subId);
return recipientStr;
}
recipientIds = c.getString(RECIPIENT_IDS);
@@ -1434,7 +1440,7 @@ public class Conversation {
LogTag.error("verifySingleRecipient threadId: " + threadId +
" getSingleNumberFromCanonicalAddresses returned empty number for: " +
ids[0] + " recipientIds: " + recipientIds);
- LogTag.dumpInternalTables(context);
+ LogTag.dumpInternalTables(context, subId);
return recipientStr;
}
if (PhoneNumberUtils.compareLoosely(recipientStr, address)) {
@@ -1450,9 +1456,9 @@ public class Conversation {
if (context instanceof Activity) {
LogTag.warnPossibleRecipientMismatch("verifySingleRecipient for threadId: " +
threadId + " original recipient: " + recipientStr +
- " recipient from DB: " + address, (Activity)context);
+ " recipient from DB: " + address, (Activity)context, subId);
}
- LogTag.dumpInternalTables(context);
+ LogTag.dumpInternalTables(context, subId);
if (Log.isLoggable(LogTag.THREAD_CACHE, Log.VERBOSE)) {
LogTag.debug("verifySingleRecipient for threadId: " +
threadId + " original recipient: " + recipientStr +
diff --git a/src/com/android/mms/data/WorkingMessage.java b/src/com/android/mms/data/WorkingMessage.java
index 62052116..b7581afd 100755
--- a/src/com/android/mms/data/WorkingMessage.java
+++ b/src/com/android/mms/data/WorkingMessage.java
@@ -40,6 +40,7 @@ import android.provider.Telephony.Mms;
import android.provider.Telephony.MmsSms;
import android.provider.Telephony.MmsSms.PendingMessages;
import android.provider.Telephony.Sms;
+import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.text.TextUtils;
import android.util.Log;
@@ -69,6 +70,7 @@ import com.android.mms.util.DraftCache;
import com.android.mms.util.Recycler;
import com.android.mms.util.ThumbnailManager;
import com.android.mms.widget.MmsWidgetProvider;
+
import com.google.android.mms.ContentType;
import com.google.android.mms.MmsException;
import com.google.android.mms.pdu.EncodedStringValue;
@@ -145,9 +147,6 @@ public class WorkingMessage {
private volatile boolean mHasMmsDraft;
private volatile boolean mHasSmsDraft;
- // Cached value of mms enabled flag
- private static boolean sMmsEnabled = MmsConfig.getMmsEnabled();
-
// Our callback interface
private final MessageStatusListener mStatusListener;
private List<String> mWorkingRecipients;
@@ -223,7 +222,7 @@ public class WorkingMessage {
* Create a new WorkingMessage from the specified data URI, which typically
* contains an MMS message.
*/
- public static WorkingMessage load(ComposeMessageActivity activity, Uri uri) {
+ public static WorkingMessage load(ComposeMessageActivity activity, Uri uri, int subId) {
// If the message is not already in the draft box, move it there.
if (!uri.toString().startsWith(Mms.Draft.CONTENT_URI.toString())) {
PduPersister persister = PduPersister.getPduPersister(activity);
@@ -239,7 +238,7 @@ public class WorkingMessage {
}
WorkingMessage msg = new WorkingMessage(activity);
- if (msg.loadFromUri(uri)) {
+ if (msg.loadFromUri(uri, subId)) {
msg.mHasMmsDraft = true;
return msg;
}
@@ -247,13 +246,13 @@ public class WorkingMessage {
return null;
}
- private void correctAttachmentState(boolean showToast) {
+ private void correctAttachmentState(boolean showToast, int subId) {
int slideCount = mSlideshow.size();
// If we get an empty slideshow, tear down all MMS
// state and discard the unnecessary message Uri.
if (slideCount == 0) {
- removeAttachment(false);
+ removeAttachment(false, subId);
} else if (slideCount > 1) {
mAttachmentType = SLIDESHOW;
} else {
@@ -267,10 +266,10 @@ public class WorkingMessage {
}
}
- updateState(HAS_ATTACHMENT, hasAttachment(), showToast);
+ updateState(HAS_ATTACHMENT, hasAttachment(), showToast, subId);
}
- private boolean loadFromUri(Uri uri) {
+ private boolean loadFromUri(Uri uri, int subId) {
if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) LogTag.debug("loadFromUri %s", uri);
try {
mSlideshow = SlideshowModel.createFromMessageUri(mActivity, uri);
@@ -283,7 +282,7 @@ public class WorkingMessage {
// Make sure all our state is as expected.
syncTextFromSlideshow();
- correctAttachmentState(false);
+ correctAttachmentState(false, subId);
return true;
}
@@ -294,7 +293,8 @@ public class WorkingMessage {
*/
public static WorkingMessage loadDraft(ComposeMessageActivity activity,
final Conversation conv,
- final Runnable onDraftLoaded) {
+ final Runnable onDraftLoaded,
+ final int subId) {
if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) LogTag.debug("loadDraft %s", conv);
final WorkingMessage msg = createEmpty(activity);
@@ -321,7 +321,7 @@ public class WorkingMessage {
StringBuilder sb = new StringBuilder();
Uri uri = readDraftMmsMessage(msg.mActivity, conv, sb);
if (uri != null) {
- if (msg.loadFromUri(uri)) {
+ if (msg.loadFromUri(uri, subId)) {
// If there was an MMS message, readDraftMmsMessage
// will put the subject in our supplied StringBuilder.
subject = sb.toString();
@@ -341,7 +341,7 @@ public class WorkingMessage {
if (result.second != null) {
msg.mHasMmsDraft = true;
if (!TextUtils.isEmpty(result.second)) {
- msg.setSubject(result.second, false);
+ msg.setSubject(result.second, false, subId);
}
}
if (onDraftLoaded != null) {
@@ -375,7 +375,7 @@ public class WorkingMessage {
return mText != null && TextUtils.getTrimmedLength(mText) > 0;
}
- public void removeAttachment(boolean notify) {
+ public void removeAttachment(boolean notify, int subId) {
removeThumbnailsFromCache(mSlideshow);
mAttachmentType = TEXT;
mSlideshow = null;
@@ -384,7 +384,7 @@ public class WorkingMessage {
mMessageUri = null;
}
// mark this message as no longer having an attachment
- updateState(HAS_ATTACHMENT, false, notify);
+ updateState(HAS_ATTACHMENT, false, notify, subId);
if (notify) {
// Tell ComposeMessageActivity (or other listener) that the attachment has changed.
// In the case of ComposeMessageActivity, it will remove its attachment panel because
@@ -426,7 +426,7 @@ public class WorkingMessage {
* @param append true if we should add the attachment to a new slide
* @return An error code such as {@link UNKNOWN_ERROR} or {@link OK} if successful
*/
- public int setAttachment(int type, Uri dataUri, boolean append) {
+ public int setAttachment(int type, Uri dataUri, boolean append, int subId) {
if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
LogTag.debug("setAttachment type=%d uri %s", type, dataUri);
}
@@ -459,7 +459,8 @@ public class WorkingMessage {
if (result == OK) {
mAttachmentType = type;
}
- correctAttachmentState(true); // this can remove the slideshow if there are no attachments
+ // this can remove the slideshow if there are no attachments
+ correctAttachmentState(true, subId);
if (mSlideshow != null && type == IMAGE) {
// Prime the image's cache; helps A LOT when the image is coming from the network
@@ -487,13 +488,14 @@ public class WorkingMessage {
*/
int smsSegmentCount = params[0];
- if (!MmsConfig.getMultipartSmsEnabled()) {
+ if (!MmsConfig.getBoolean(SmsManager.MMS_CONFIG_MULTIPART_SMS_ENABLED)) {
// The provider doesn't support multi-part sms's so as soon as the user types
// an sms longer than one segment, we have to turn the message into an mms.
- setLengthRequiresMms(smsSegmentCount > 1, false);
+ setLengthRequiresMms(smsSegmentCount > 1, false, subId);
} else {
- int threshold = MmsConfig.getSmsToMmsTextThreshold();
- setLengthRequiresMms(threshold > 0 && smsSegmentCount > threshold, false);
+ int threshold =
+ MmsConfig.getInt(SmsManager.MMS_CONFIG_SMS_TO_MMS_TEXT_LENGTH_THRESHOLD);
+ setLengthRequiresMms(threshold > 0 && smsSegmentCount > threshold, false, subId);
}
}
return result;
@@ -689,9 +691,9 @@ public class WorkingMessage {
* MMS when the user adds a subject. An empty subject will be removed
* before saving to disk or sending, however.
*/
- public void setSubject(CharSequence s, boolean notify) {
+ public void setSubject(CharSequence s, boolean notify, int subId) {
mSubject = s;
- updateState(HAS_SUBJECT, (s != null), notify);
+ updateState(HAS_SUBJECT, (s != null), notify, subId);
}
/**
@@ -753,9 +755,9 @@ public class WorkingMessage {
/**
* Removes the subject if it is empty, possibly converting back to SMS.
*/
- private void removeSubjectIfEmpty(boolean notify) {
+ private void removeSubjectIfEmpty(boolean notify, int subId) {
if (!hasSubject()) {
- setSubject(null, notify);
+ setSubject(null, notify, subId);
}
}
@@ -763,10 +765,10 @@ public class WorkingMessage {
* Gets internal message state ready for storage. Should be called any
* time the message is about to be sent or written to disk.
*/
- private void prepareForSave(boolean notify) {
+ private void prepareForSave(boolean notify, int subId) {
// Make sure our working set of recipients is resolved
// to first-class Contact objects before we save.
- syncWorkingRecipients();
+ syncWorkingRecipients(subId);
if (hasMmsContentToSave()) {
ensureSlideshow();
@@ -777,36 +779,36 @@ public class WorkingMessage {
/**
* Resolve the temporary working set of recipients to a ContactList.
*/
- public void syncWorkingRecipients() {
+ public void syncWorkingRecipients(int subId) {
if (mWorkingRecipients != null) {
- ContactList recipients = ContactList.getByNumbers(mWorkingRecipients, false);
+ ContactList recipients = ContactList.getByNumbers(mWorkingRecipients, false, subId);
mConversation.setRecipients(recipients); // resets the threadId to zero
- setHasMultipleRecipients(recipients.size() > 1, true);
+ setHasMultipleRecipients(recipients.size() > 1, true, subId);
mWorkingRecipients = null;
}
}
- public String getWorkingRecipients() {
+ public String getWorkingRecipients(int subId) {
// this function is used for DEBUG only
if (mWorkingRecipients == null) {
return null;
}
- ContactList recipients = ContactList.getByNumbers(mWorkingRecipients, false);
- return recipients.serialize();
+ ContactList recipients = ContactList.getByNumbers(mWorkingRecipients, false, subId);
+ return recipients.serialize(subId);
}
// Call when we've returned from adding an attachment. We're no longer forcing the message
// into a Mms message. At this point we either have the goods to make the message a Mms
// or we don't. No longer fake it.
- public void removeFakeMmsForDraft() {
- updateState(FORCE_MMS, false, false);
+ public void removeFakeMmsForDraft(int subId) {
+ updateState(FORCE_MMS, false, false, subId);
}
/**
* Force the message to be saved as MMS and return the Uri of the message.
* Typically used when handing a message off to another activity.
*/
- public Uri saveAsMms(boolean notify) {
+ public Uri saveAsMms(boolean notify, int subId) {
if (DEBUG) LogTag.debug("saveAsMms mConversation=%s", mConversation);
// If we have discarded the message, just bail out.
@@ -820,27 +822,27 @@ public class WorkingMessage {
// the message seem non-empty (and thus not discarded). This bit
// is sticky until the last other MMS bit is removed, at which
// point the message will fall back to SMS.
- updateState(FORCE_MMS, true, notify);
+ updateState(FORCE_MMS, true, notify, subId);
// Collect our state to be written to disk.
- prepareForSave(true /* notify */);
+ prepareForSave(true /* notify */, subId);
try {
// Make sure we are saving to the correct thread ID.
DraftCache.getInstance().setSavingDraft(true);
if (!mConversation.getRecipients().isEmpty()) {
- mConversation.ensureThreadId();
+ mConversation.ensureThreadId(subId);
}
mConversation.setDraftState(true);
PduPersister persister = PduPersister.getPduPersister(mActivity);
- SendReq sendReq = makeSendReq(mConversation, mSubject);
+ SendReq sendReq = makeSendReq(mConversation, mSubject, subId);
// If we don't already have a Uri lying around, make a new one. If we do
// have one already, make sure it is synced to disk.
if (mMessageUri == null) {
mMessageUri = createDraftMmsMessage(persister, sendReq, mSlideshow, null,
- mActivity, null);
+ mActivity, null, subId);
} else {
updateDraftMmsMessage(mMessageUri, persister, mSlideshow, sendReq, null);
}
@@ -855,7 +857,7 @@ public class WorkingMessage {
* Save this message as a draft in the conversation previously specified
* to {@link setConversation}.
*/
- public void saveDraft(final boolean isStopping) {
+ public void saveDraft(final boolean isStopping, int subId) {
// If we have discarded the message, just bail out.
if (mDiscarded) {
LogTag.warn("saveDraft mDiscarded: true mConversation: " + mConversation +
@@ -873,11 +875,11 @@ public class WorkingMessage {
}
// Get ready to write to disk. But don't notify message status when saving draft
- prepareForSave(false /* notify */);
+ prepareForSave(false /* notify */, subId);
if (requiresMms()) {
if (hasMmsContentToSave()) {
- asyncUpdateDraftMmsMessage(mConversation, isStopping);
+ asyncUpdateDraftMmsMessage(mConversation, isStopping, subId);
mHasMmsDraft = true;
}
} else {
@@ -890,7 +892,7 @@ public class WorkingMessage {
// and takes that thread id (because it's the next thread id to be assigned), the
// new message will be merged with the draft message thread, causing confusion!
if (!TextUtils.isEmpty(content)) {
- asyncUpdateDraftSmsMessage(mConversation, content, isStopping);
+ asyncUpdateDraftSmsMessage(mConversation, content, isStopping, subId);
mHasSmsDraft = true;
} else {
// When there's no associated text message, we have to handle the case where there
@@ -963,17 +965,17 @@ public class WorkingMessage {
* has given it a Bundle to reinflate
* @param bundle The Bundle passed in to onCreate
*/
- public void readStateFromBundle(Bundle bundle) {
+ public void readStateFromBundle(Bundle bundle, int subId) {
if (bundle == null) {
return;
}
String subject = bundle.getString("subject");
- setSubject(subject, false);
+ setSubject(subject, false, subId);
Uri uri = (Uri)bundle.getParcelable("msg_uri");
if (uri != null) {
- loadFromUri(uri);
+ loadFromUri(uri, subId);
return;
} else {
String body = bundle.getString("sms_body");
@@ -1027,15 +1029,15 @@ public class WorkingMessage {
/**
* Set the conversation associated with this message.
*/
- public void setConversation(Conversation conv) {
+ public void setConversation(Conversation conv, int subId) {
if (DEBUG) LogTag.debug("setConversation %s -> %s", mConversation, conv);
mConversation = conv;
// Convert to MMS if there are any email addresses in the recipient list.
ContactList contactList = conv.getRecipients();
- setHasEmail(contactList.containsEmail(), false);
- setHasMultipleRecipients(contactList.size() > 1, false);
+ setHasEmail(contactList.containsEmail(), false, subId);
+ setHasMultipleRecipients(contactList.size() > 1, false, subId);
}
public Conversation getConversation() {
@@ -1046,11 +1048,11 @@ public class WorkingMessage {
* Hint whether or not this message will be delivered to an
* an email address.
*/
- public void setHasEmail(boolean hasEmail, boolean notify) {
- if (MmsConfig.getEmailGateway() != null) {
- updateState(RECIPIENTS_REQUIRE_MMS, false, notify);
+ public void setHasEmail(boolean hasEmail, boolean notify, int subId) {
+ if (MmsConfig.getString(SmsManager.MMS_CONFIG_EMAIL_GATEWAY_NUMBER) != null) {
+ updateState(RECIPIENTS_REQUIRE_MMS, false, notify, subId);
} else {
- updateState(RECIPIENTS_REQUIRE_MMS, hasEmail, notify);
+ updateState(RECIPIENTS_REQUIRE_MMS, hasEmail, notify, subId);
}
}
/**
@@ -1060,11 +1062,12 @@ public class WorkingMessage {
* whether the message is sent as an mms, but the other factors (such as, "has a picture
* attachment") still hold true.
*/
- public void setHasMultipleRecipients(boolean hasMultipleRecipients, boolean notify) {
+ public void setHasMultipleRecipients(boolean hasMultipleRecipients, boolean notify,
+ int subId) {
updateState(MULTIPLE_RECIPIENTS,
hasMultipleRecipients &&
- MessagingPreferenceActivity.getIsGroupMmsEnabled(mActivity),
- notify);
+ MessagingPreferenceActivity.getIsGroupMmsEnabled(mActivity, subId),
+ notify, subId);
}
/**
@@ -1096,8 +1099,8 @@ public class WorkingMessage {
* @param: mmsRequired is the value for the LENGTH_REQUIRES_MMS bit.
* @param: notify Whether or not to notify the user.
*/
- public void setLengthRequiresMms(boolean mmsRequired, boolean notify) {
- updateState(LENGTH_REQUIRES_MMS, mmsRequired, notify);
+ public void setLengthRequiresMms(boolean mmsRequired, boolean notify, int subId) {
+ updateState(LENGTH_REQUIRES_MMS, mmsRequired, notify, subId);
}
private static String stateString(int state) {
@@ -1129,8 +1132,8 @@ public class WorkingMessage {
* @param on If true, set it; if false, clear it
* @param notify Whether or not to notify the user
*/
- private void updateState(int state, boolean on, boolean notify) {
- if (!sMmsEnabled) {
+ private void updateState(int state, boolean on, boolean notify, int subId) {
+ if (!MmsConfig.getBoolean(subId, SmsManager.MMS_CONFIG_MMS_ENABLED)) {
// If Mms isn't enabled, the rest of the Messaging UI should not be using any
// feature that would cause us to to turn on any Mms flag and show the
// "Converting to multimedia..." message.
@@ -1181,19 +1184,19 @@ public class WorkingMessage {
LogTag.debug("send origThreadId: " + origThreadId);
}
- removeSubjectIfEmpty(true /* notify */);
+ removeSubjectIfEmpty(true /* notify */, subId);
// Get ready to write to disk.
- prepareForSave(true /* notify */);
+ prepareForSave(true /* notify */, subId);
// We need the recipient list for both SMS and MMS.
final Conversation conv = mConversation;
String msgTxt = mText.toString();
- if (requiresMms() || addressContainsEmailToMms(conv, msgTxt)) {
+ if (requiresMms() || addressContainsEmailToMms(conv, msgTxt, subId)) {
// uaProfUrl setting in mms_config.xml must be present to send an MMS.
// However, SMS service will still work in the absence of a uaProfUrl address.
- if (MmsConfig.getUaProfUrl() == null) {
+ if (MmsConfig.getString(subId, SmsManager.MMS_CONFIG_UA_PROF_TAG_NAME) == null) {
String err = "WorkingMessage.send MMS sending failure. mms_config.xml is " +
"missing uaProfUrl setting. uaProfUrl is required for MMS service, " +
"but can be absent for SMS.";
@@ -1221,14 +1224,14 @@ public class WorkingMessage {
new Thread(new Runnable() {
@Override
public void run() {
- final SendReq sendReq = makeSendReq(conv, subject);
+ final SendReq sendReq = makeSendReq(conv, subject, subId);
// Make sure the text in slide 0 is no longer holding onto a reference to
// the text in the message text box.
slideshow.prepareForSend();
sendMmsWorker(conv, mmsUri, persister, slideshow, sendReq, textOnly, subId);
- updateSendStats(conv);
+ updateSendStats(conv, subId);
}
}, "WorkingMessage.send MMS").start();
} else {
@@ -1239,7 +1242,7 @@ public class WorkingMessage {
public void run() {
preSendSmsWorker(conv, msgText, recipientsInUI, subId);
- updateSendStats(conv);
+ updateSendStats(conv, subId);
}
}, "WorkingMessage.send SMS").start();
}
@@ -1252,24 +1255,24 @@ public class WorkingMessage {
}
// Be sure to only call this on a background thread.
- private void updateSendStats(final Conversation conv) {
- String[] dests = conv.getRecipients().getNumbers();
+ private void updateSendStats(final Conversation conv, int subId) {
+ String[] dests = conv.getRecipients().getNumbers(subId);
final ArrayList<String> phoneNumbers = new ArrayList<String>(Arrays.asList(dests));
DataUsageStatUpdater updater = new DataUsageStatUpdater(mActivity);
updater.updateWithPhoneNumber(phoneNumbers);
}
- private boolean addressContainsEmailToMms(Conversation conv, String text) {
- if (MmsConfig.getEmailGateway() != null) {
- String[] dests = conv.getRecipients().getNumbers();
+ private boolean addressContainsEmailToMms(Conversation conv, String text, int subId) {
+ if (MmsConfig.getString(SmsManager.MMS_CONFIG_EMAIL_GATEWAY_NUMBER) != null) {
+ String[] dests = conv.getRecipients().getNumbers(subId);
int length = dests.length;
for (int i = 0; i < length; i++) {
- if (Mms.isEmailAddress(dests[i]) || MessageUtils.isAlias(dests[i])) {
+ if (Mms.isEmailAddress(dests[i]) || MessageUtils.isAlias(dests[i], subId)) {
String mtext = dests[i] + " " + text;
int[] params = SmsMessage.calculateLength(mtext, false);
if (params[0] > 1) {
- updateState(RECIPIENTS_REQUIRE_MMS, true, true);
+ updateState(RECIPIENTS_REQUIRE_MMS, true, true, subId);
ensureSlideshow();
syncTextToSlideshow();
return true;
@@ -1282,7 +1285,8 @@ public class WorkingMessage {
// Message sending stuff
- private void preSendSmsWorker(Conversation conv, String msgText, String recipientsInUI, int subId) {
+ private void preSendSmsWorker(Conversation conv, String msgText, String recipientsInUI,
+ int subId) {
// If user tries to send the message, it's a signal the inputted text is what they wanted.
UserHappinessSignals.userAcceptedImeText(mActivity);
@@ -1291,9 +1295,9 @@ public class WorkingMessage {
long origThreadId = conv.getThreadId();
// Make sure we are still using the correct thread ID for our recipient set.
- long threadId = conv.ensureThreadId();
+ long threadId = conv.ensureThreadId(subId);
- String semiSepRecipients = conv.getRecipients().serialize();
+ String semiSepRecipients = conv.getRecipients().serialize(subId);
// recipientsInUI can be empty when the user types in a number and hits send
if (LogTag.SEVERE_WARNING && ((origThreadId != 0 && origThreadId != threadId) ||
@@ -1310,7 +1314,7 @@ public class WorkingMessage {
semiSepRecipients + "\"";
// Just interrupt the process of sending message if recipient mismatch
- LogTag.warnPossibleRecipientMismatch(msg, mActivity);
+ LogTag.warnPossibleRecipientMismatch(msg, mActivity, subId);
}else {
// just do a regular send. We're already on a non-ui thread so no need to fire
// off another thread to do this work.
@@ -1354,7 +1358,7 @@ public class WorkingMessage {
// Make sure we are still using the correct thread ID for our
// recipient set.
- threadId = conv.ensureThreadId();
+ threadId = conv.ensureThreadId(subId);
if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
LogTag.debug("sendMmsWorker: update draft MMS message " + mmsUri +
@@ -1362,12 +1366,14 @@ public class WorkingMessage {
}
// One last check to verify the address of the recipient.
- String[] dests = conv.getRecipients().getNumbers(true /* scrub for MMS address */);
+ String[] dests = conv.getRecipients().getNumbers(true /* scrub for MMS address */,
+ subId);
if (dests.length == 1) {
// verify the single address matches what's in the database. If we get a different
// address back, jam the new value back into the SendReq.
String newAddress =
- Conversation.verifySingleRecipient(mActivity, conv.getThreadId(), dests[0]);
+ Conversation.verifySingleRecipient(mActivity, conv.getThreadId(), dests[0],
+ subId);
if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
LogTag.debug("sendMmsWorker: newAddress " + newAddress +
@@ -1410,7 +1416,7 @@ public class WorkingMessage {
Mms.Outbox.CONTENT_URI, MMS_OUTBOX_PROJECTION, null, null, null);
if (cursor != null) {
long maxMessageSize = MmsConfig.getMaxSizeScaleForPendingMmsAllowed() *
- MmsConfig.getMaxMessageSize();
+ MmsConfig.getInt(subId, SmsManager.MMS_CONFIG_MAX_MESSAGE_SIZE);
long totalPendingSize = 0;
while (cursor.moveToNext()) {
totalPendingSize += cursor.getLong(MMS_MESSAGE_SIZE_INDEX);
@@ -1432,7 +1438,7 @@ public class WorkingMessage {
if (newMessage) {
// Create a new MMS message if one hasn't been made yet.
mmsUri = createDraftMmsMessage(persister, sendReq, slideshow, mmsUri,
- mActivity, null);
+ mActivity, null, subId);
} else {
// Otherwise, sync the MMS message in progress to disk.
updateDraftMmsMessage(mmsUri, persister, slideshow, sendReq, null);
@@ -1558,8 +1564,9 @@ public class WorkingMessage {
* makeSendReq should always return a non-null SendReq, whether the dest addresses are
* valid or not.
*/
- private static SendReq makeSendReq(Conversation conv, CharSequence subject) {
- String[] dests = conv.getRecipients().getNumbers(true /* scrub for MMS address */);
+ private static SendReq makeSendReq(Conversation conv, CharSequence subject, int subId) {
+ String[] dests = conv.getRecipients().getNumbers(true /* scrub for MMS address */,
+ subId);
SendReq req = new SendReq();
EncodedStringValue[] encodedNumbers = EncodedStringValue.encodeStrings(dests);
@@ -1578,7 +1585,7 @@ public class WorkingMessage {
private static Uri createDraftMmsMessage(PduPersister persister, SendReq sendReq,
SlideshowModel slideshow, Uri preUri, Context context,
- HashMap<Uri, InputStream> preOpenedFiles) {
+ HashMap<Uri, InputStream> preOpenedFiles, int subId) {
if (slideshow == null) {
return null;
}
@@ -1586,7 +1593,7 @@ public class WorkingMessage {
PduBody pb = slideshow.toPduBody();
sendReq.setBody(pb);
Uri res = persister.persist(sendReq, preUri == null ? Mms.Draft.CONTENT_URI : preUri,
- true, MessagingPreferenceActivity.getIsGroupMmsEnabled(context),
+ true, MessagingPreferenceActivity.getIsGroupMmsEnabled(context, subId),
preOpenedFiles);
slideshow.sync(pb);
return res;
@@ -1595,7 +1602,8 @@ public class WorkingMessage {
}
}
- private void asyncUpdateDraftMmsMessage(final Conversation conv, final boolean isStopping) {
+ private void asyncUpdateDraftMmsMessage(final Conversation conv, final boolean isStopping,
+ final int subId) {
if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
LogTag.debug("asyncUpdateDraftMmsMessage conv=%s mMessageUri=%s", conv, mMessageUri);
}
@@ -1609,16 +1617,16 @@ public class WorkingMessage {
DraftCache.getInstance().setSavingDraft(true);
final PduPersister persister = PduPersister.getPduPersister(mActivity);
- final SendReq sendReq = makeSendReq(conv, mSubject);
+ final SendReq sendReq = makeSendReq(conv, mSubject, subId);
if (mMessageUri == null) {
mMessageUri = createDraftMmsMessage(persister, sendReq, mSlideshow, null,
- mActivity, preOpenedFiles);
+ mActivity, preOpenedFiles, subId);
} else {
updateDraftMmsMessage(mMessageUri, persister, mSlideshow, sendReq,
preOpenedFiles);
}
- ensureThreadIdIfNeeded(conv, isStopping);
+ ensureThreadIdIfNeeded(conv, isStopping, subId);
conv.setDraftState(true);
if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
LogTag.debug("asyncUpdateDraftMmsMessage conv: " + conv +
@@ -1739,7 +1747,7 @@ public class WorkingMessage {
}
private void asyncUpdateDraftSmsMessage(final Conversation conv, final String contents,
- final boolean isStopping) {
+ final boolean isStopping, final int subId) {
new Thread(new Runnable() {
@Override
public void run() {
@@ -1751,7 +1759,7 @@ public class WorkingMessage {
}
return;
}
- ensureThreadIdIfNeeded(conv, isStopping);
+ ensureThreadIdIfNeeded(conv, isStopping, subId);
conv.setDraftState(true);
updateDraftSmsMessage(conv, contents);
} finally {
@@ -1824,8 +1832,10 @@ public class WorkingMessage {
* one.
* @param conv The conversation we are in.
* @param isStopping Whether we are saving the draft in CMA'a onStop
+ * @param subId subscription id
*/
- private void ensureThreadIdIfNeeded(final Conversation conv, final boolean isStopping) {
+ private void ensureThreadIdIfNeeded(final Conversation conv, final boolean isStopping,
+ int subId) {
if (isStopping && conv.getMessageCount() == 0) {
// We need to save the drafts in an unorphaned thread id. When the user goes
// back to ConversationList while we're saving a draft from CMA's.onStop,
@@ -1836,7 +1846,7 @@ public class WorkingMessage {
conv.clearThreadId(); // force us to get the updated thread id
}
if (!conv.getRecipients().isEmpty()) {
- conv.ensureThreadId();
+ conv.ensureThreadId(subId);
}
}
}
diff --git a/src/com/android/mms/model/CarrierContentRestriction.java b/src/com/android/mms/model/CarrierContentRestriction.java
index 2d167451..b17afef0 100644
--- a/src/com/android/mms/model/CarrierContentRestriction.java
+++ b/src/com/android/mms/model/CarrierContentRestriction.java
@@ -19,6 +19,7 @@ package com.android.mms.model;
import java.util.ArrayList;
import android.content.ContentResolver;
+import android.telephony.SmsManager;
import android.util.Log;
import com.android.mms.ContentRestrictionException;
@@ -27,6 +28,7 @@ import com.android.mms.LogTag;
import com.android.mms.MmsConfig;
import com.android.mms.ResolutionException;
import com.android.mms.UnsupportContentTypeException;
+
import com.google.android.mms.ContentType;
public class CarrierContentRestriction implements ContentRestriction {
@@ -49,7 +51,8 @@ public class CarrierContentRestriction implements ContentRestriction {
if (DEBUG) {
Log.d(LogTag.APP, "CarrierContentRestriction.checkMessageSize messageSize: " +
messageSize + " increaseSize: " + increaseSize +
- " MmsConfig.getMaxMessageSize: " + MmsConfig.getMaxMessageSize());
+ " MmsConfig.getMaxMessageSize: " +
+ MmsConfig.getInt(SmsManager.MMS_CONFIG_MAX_MESSAGE_SIZE));
}
if ( (messageSize < 0) || (increaseSize < 0) ) {
throw new ContentRestrictionException("Negative message size"
@@ -57,13 +60,15 @@ public class CarrierContentRestriction implements ContentRestriction {
}
int newSize = messageSize + increaseSize;
- if ( (newSize < 0) || (newSize > MmsConfig.getMaxMessageSize()) ) {
+ if ( (newSize < 0) ||
+ (newSize > MmsConfig.getInt(SmsManager.MMS_CONFIG_MAX_MESSAGE_SIZE)) ) {
throw new ExceedMessageSizeException("Exceed message size limitation");
}
}
public void checkResolution(int width, int height) throws ContentRestrictionException {
- if ( (width > MmsConfig.getMaxImageWidth()) || (height > MmsConfig.getMaxImageHeight()) ) {
+ if ( (width > MmsConfig.getInt(SmsManager.MMS_CONFIG_MAX_IMAGE_WIDTH) ||
+ (height > MmsConfig.getInt(SmsManager.MMS_CONFIG_MAX_IMAGE_HEIGHT))) ) {
throw new ResolutionException("content resolution exceeds restriction.");
}
}
diff --git a/src/com/android/mms/model/ImageModel.java b/src/com/android/mms/model/ImageModel.java
index 3dcc649c..ac713adf 100644
--- a/src/com/android/mms/model/ImageModel.java
+++ b/src/com/android/mms/model/ImageModel.java
@@ -29,6 +29,7 @@ import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
+import android.telephony.SmsManager;
import android.text.TextUtils;
import android.util.Log;
@@ -42,6 +43,7 @@ import com.android.mms.ui.UriImage;
import com.android.mms.util.ItemLoadedCallback;
import com.android.mms.util.ItemLoadedFuture;
import com.android.mms.util.ThumbnailManager;
+
import com.google.android.mms.MmsException;
import com.google.android.mms.pdu.PduPart;
import com.google.android.mms.pdu.PduPersister;
@@ -186,8 +188,8 @@ public class ImageModel extends RegionMediaModel {
protected void resizeMedia(int byteLimit, long messageId) throws MmsException {
UriImage image = new UriImage(mContext, getUri());
- int widthLimit = MmsConfig.getMaxImageWidth();
- int heightLimit = MmsConfig.getMaxImageHeight();
+ int widthLimit = MmsConfig.getInt(SmsManager.MMS_CONFIG_MAX_IMAGE_WIDTH);
+ int heightLimit = MmsConfig.getInt(SmsManager.MMS_CONFIG_MAX_IMAGE_HEIGHT);
int size = getMediaSize();
// In mms_config.xml, the max width has always been declared larger than the max height.
// Swap the width and height limits if necessary so we scale the picture as little as
diff --git a/src/com/android/mms/model/MediaModel.java b/src/com/android/mms/model/MediaModel.java
index 3993b0ea..b2cb222c 100644
--- a/src/com/android/mms/model/MediaModel.java
+++ b/src/com/android/mms/model/MediaModel.java
@@ -30,10 +30,12 @@ import android.content.Context;
import android.content.Intent;
import android.media.MediaMetadataRetriever;
import android.net.Uri;
+import android.telephony.SmsManager;
import android.util.Log;
import com.android.mms.LogTag;
import com.android.mms.MmsConfig;
+
import com.google.android.mms.MmsException;
// TODO: remove dependency for SDK build
@@ -241,9 +243,10 @@ public abstract class MediaModel extends Model implements EventListener {
// does below, but that turns out to be very slow. We'll deal with a zero size
// when we resize the media.
- if (isVideo() && mSize > MmsConfig.getMaxMessageSize()) {
+ final int maxMessageSize = MmsConfig.getInt(SmsManager.MMS_CONFIG_MAX_MESSAGE_SIZE);
+ if (isVideo() && mSize > maxMessageSize) {
Log.w(TAG, "initMediaSize: Video size: f.getChannel().size(): " + mSize +
- " larger than max message size: " + MmsConfig.getMaxMessageSize());
+ " larger than max message size: " + maxMessageSize);
}
} else {
while (-1 != input.read()) {
diff --git a/src/com/android/mms/model/SlideshowModel.java b/src/com/android/mms/model/SlideshowModel.java
index 15259d35..dc512046 100755
--- a/src/com/android/mms/model/SlideshowModel.java
+++ b/src/com/android/mms/model/SlideshowModel.java
@@ -43,6 +43,7 @@ import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.net.Uri;
+import android.telephony.SmsManager;
import android.text.TextUtils;
import android.util.Log;
@@ -52,6 +53,7 @@ import com.android.mms.LogTag;
import com.android.mms.MmsConfig;
import com.android.mms.dom.smil.parser.SmilXmlSerializer;
import com.android.mms.layout.LayoutManager;
+
import com.google.android.mms.ContentType;
import com.google.android.mms.MmsException;
import com.google.android.mms.pdu.GenericPdu;
@@ -60,6 +62,7 @@ import com.google.android.mms.pdu.PduBody;
import com.google.android.mms.pdu.PduHeaders;
import com.google.android.mms.pdu.PduPart;
import com.google.android.mms.pdu.PduPersister;
+
import com.android.mms.UnsupportContentTypeException;
public class SlideshowModel extends Model
@@ -678,13 +681,14 @@ public class SlideshowModel extends Model
}
}
}
+ final int maxMessageSize = MmsConfig.getInt(SmsManager.MMS_CONFIG_MAX_MESSAGE_SIZE);
if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
Log.v(TAG, "finalResize: original message size: " + getCurrentMessageSize() +
- " getMaxMessageSize: " + MmsConfig.getMaxMessageSize() +
+ " getMaxMessageSize: " + maxMessageSize +
" fixedSizeTotal: " + fixedSizeTotal);
}
if (resizableCnt > 0) {
- int remainingSize = MmsConfig.getMaxMessageSize() - fixedSizeTotal - SLIDESHOW_SLOP;
+ int remainingSize = maxMessageSize - fixedSizeTotal - SLIDESHOW_SLOP;
if (remainingSize <= 0) {
throw new ExceedMessageSizeException("No room for pictures");
}
@@ -709,7 +713,7 @@ public class SlideshowModel extends Model
Log.v(TAG, "finalResize: new message size: " + totalSize);
}
- if (totalSize > MmsConfig.getMaxMessageSize()) {
+ if (totalSize > maxMessageSize) {
throw new ExceedMessageSizeException("After compressing pictures, message too big");
}
setCurrentMessageSize(totalSize);
diff --git a/src/com/android/mms/transaction/HttpUtils.java b/src/com/android/mms/transaction/HttpUtils.java
index b6c878c7..4f601cd5 100644
--- a/src/com/android/mms/transaction/HttpUtils.java
+++ b/src/com/android/mms/transaction/HttpUtils.java
@@ -23,6 +23,8 @@ import java.net.SocketException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Locale;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
@@ -38,9 +40,8 @@ import org.apache.http.params.HttpProtocolParams;
import android.content.Context;
import android.net.http.AndroidHttpClient;
-import android.telephony.TelephonyManager;
+import android.telephony.SmsManager;
import android.text.TextUtils;
-import android.util.Config;
import android.util.Log;
import com.android.mms.LogTag;
@@ -50,7 +51,6 @@ public class HttpUtils {
private static final String TAG = LogTag.TRANSACTION;
private static final boolean DEBUG = false;
- private static final boolean LOCAL_LOGV = DEBUG ? Config.LOGD : Config.LOGV;
public static final int HTTP_POST_METHOD = 1;
public static final int HTTP_GET_METHOD = 2;
@@ -93,7 +93,7 @@ public class HttpUtils {
*/
protected static byte[] httpConnection(Context context, long token,
String url, byte[] pdu, int method, boolean isProxySet,
- String proxyHost, int proxyPort) throws IOException {
+ String proxyHost, int proxyPort, int subId) throws IOException {
if (url == null) {
throw new IllegalArgumentException("URL must not be null.");
}
@@ -121,7 +121,7 @@ public class HttpUtils {
hostUrl.getHost(), hostUrl.getPort(),
HttpHost.DEFAULT_SCHEME_NAME);
- client = createHttpClient(context);
+ client = createHttpClient(context, subId);
HttpRequest req = null;
switch(method) {
case HTTP_POST_METHOD:
@@ -155,8 +155,10 @@ public class HttpUtils {
// Set necessary HTTP headers for MMS transmission.
req.addHeader(HDR_KEY_ACCEPT, HDR_VALUE_ACCEPT);
{
- String xWapProfileTagName = MmsConfig.getUaProfTagName();
- String xWapProfileUrl = MmsConfig.getUaProfUrl();
+ String xWapProfileTagName =
+ MmsConfig.getString(subId, SmsManager.MMS_CONFIG_UA_PROF_TAG_NAME);
+ String xWapProfileUrl =
+ MmsConfig.getString(subId, SmsManager.MMS_CONFIG_UA_PROF_URL);
if (xWapProfileUrl != null) {
if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {
@@ -171,26 +173,19 @@ public class HttpUtils {
// Separate each pair by the first occurrence of ':' to obtain a name and
// value. Replace the occurrence of the string returned by
// MmsConfig.getHttpParamsLine1Key() with the users telephone number inside
- // the value.
- String extraHttpParams = MmsConfig.getHttpParams();
+ // the value. And replace the occurrence of the string returned by
+ // MmsConfig.getHttpParamsNaiKey() with the users NAI(Network Access Identifier)
+ // inside the value.
+ String extraHttpParams = MmsConfig.getString(subId, SmsManager.MMS_CONFIG_HTTP_PARAMS);
if (extraHttpParams != null) {
- String line1Number = ((TelephonyManager)context
- .getSystemService(Context.TELEPHONY_SERVICE))
- .getLine1Number();
- String line1Key = MmsConfig.getHttpParamsLine1Key();
+ // Parse the parameter list
String paramList[] = extraHttpParams.split("\\|");
-
for (String paramPair : paramList) {
String splitPair[] = paramPair.split(":", 2);
-
if (splitPair.length == 2) {
- String name = splitPair[0].trim();
- String value = splitPair[1].trim();
-
- if (line1Key != null) {
- value = value.replace(line1Key, line1Number);
- }
+ final String name = splitPair[0].trim();
+ final String value = resolveMacro(splitPair[1].trim(), subId);
if (!TextUtils.isEmpty(name) && !TextUtils.isEmpty(value)) {
req.addHeader(name, value);
}
@@ -224,7 +219,8 @@ public class HttpUtils {
}
if (entity.isChunked()) {
Log.v(TAG, "httpConnection: transfer encoding is chunked");
- int bytesTobeRead = MmsConfig.getMaxMessageSize();
+ int bytesTobeRead =
+ MmsConfig.getInt(subId, SmsManager.MMS_CONFIG_MAX_MESSAGE_SIZE);
byte[] tempBody = new byte[bytesTobeRead];
DataInputStream dis = new DataInputStream(entity.getContent());
try {
@@ -298,14 +294,14 @@ public class HttpUtils {
throw e;
}
- private static AndroidHttpClient createHttpClient(Context context) {
- String userAgent = MmsConfig.getUserAgent();
+ private static AndroidHttpClient createHttpClient(Context context, int subId) {
+ String userAgent = MmsConfig.getString(subId, SmsManager.MMS_CONFIG_USER_AGENT);
AndroidHttpClient client = AndroidHttpClient.newInstance(userAgent, context);
HttpParams params = client.getParams();
HttpProtocolParams.setContentCharset(params, "UTF-8");
// set the socket timeout
- int soTimeout = MmsConfig.getHttpSocketTimeout();
+ int soTimeout = MmsConfig.getInt(SmsManager.MMS_CONFIG_HTTP_SOCKET_TIMEOUT);
if (Log.isLoggable(LogTag.TRANSACTION, Log.DEBUG)) {
Log.d(TAG, "[HttpUtils] createHttpClient w/ socket timeout " + soTimeout + " ms, "
@@ -370,4 +366,42 @@ public class HttpUtils {
}
}
}
+
+ private static final Pattern MACRO_P = Pattern.compile("##(\\S+)##");
+ /**
+ * Resolve the macro in HTTP param value text
+ * For example, "something##LINE1##something" is resolved to "something9139531419something"
+ *
+ * @param value The HTTP param value possibly containing macros
+ * @return The HTTP param with macro resolved to real value
+ */
+ private static String resolveMacro(String value, int subId) {
+ if (TextUtils.isEmpty(value)) {
+ return value;
+ }
+ final Matcher matcher = MACRO_P.matcher(value);
+ int nextStart = 0;
+ StringBuilder replaced = null;
+ while (matcher.find()) {
+ if (replaced == null) {
+ replaced = new StringBuilder();
+ }
+ final int matchedStart = matcher.start();
+ if (matchedStart > nextStart) {
+ replaced.append(value.substring(nextStart, matchedStart));
+ }
+ final String macro = matcher.group(1);
+ final String macroValue = MmsConfig.getHttpParamMacro(macro, subId);
+ if (macroValue != null) {
+ replaced.append(macroValue);
+ } else {
+ Log.w(TAG, "HttpUtils: invalid macro " + macro);
+ }
+ nextStart = matcher.end();
+ }
+ if (replaced != null && nextStart < value.length()) {
+ replaced.append(value.substring(nextStart));
+ }
+ return replaced == null ? value : replaced.toString();
+ }
}
diff --git a/src/com/android/mms/transaction/MessagingNotification.java b/src/com/android/mms/transaction/MessagingNotification.java
index 8651d0ca..dfa6cc63 100644
--- a/src/com/android/mms/transaction/MessagingNotification.java
+++ b/src/com/android/mms/transaction/MessagingNotification.java
@@ -104,11 +104,11 @@ public class MessagingNotification {
// This must be consistent with the column constants below.
private static final String[] MMS_STATUS_PROJECTION = new String[] {
- Mms.THREAD_ID, Mms.DATE, Mms._ID, Mms.SUBJECT, Mms.SUBJECT_CHARSET };
+ Mms.THREAD_ID, Mms.DATE, Mms._ID, Mms.SUBJECT, Mms.SUBJECT_CHARSET, Mms.SUB_ID };
// This must be consistent with the column constants below.
private static final String[] SMS_STATUS_PROJECTION = new String[] {
- Sms.THREAD_ID, Sms.DATE, Sms.ADDRESS, Sms.SUBJECT, Sms.BODY };
+ Sms.THREAD_ID, Sms.DATE, Sms.ADDRESS, Sms.SUBJECT, Sms.BODY, Sms.SUB_ID };
// These must be consistent with MMS_STATUS_PROJECTION and
// SMS_STATUS_PROJECTION.
@@ -119,6 +119,7 @@ public class MessagingNotification {
private static final int COLUMN_SUBJECT = 3;
private static final int COLUMN_SUBJECT_CS = 4;
private static final int COLUMN_SMS_BODY = 4;
+ private static final int COLUMN_SUB_ID = 5;
private static final String[] SMS_THREAD_ID_PROJECTION = new String[] { Sms.THREAD_ID };
private static final String[] MMS_THREAD_ID_PROJECTION = new String[] { Mms.THREAD_ID };
@@ -252,7 +253,7 @@ public class MessagingNotification {
Contact.logWithTrace(TAG, "blockingUpdateNewMessageIndicator: newMsgThreadId: " +
newMsgThreadId);
}
- final boolean isDefaultSmsApp = MmsConfig.isSmsEnabled(context);
+ final boolean isDefaultSmsApp = MmsConfig.isSmsEnabled();
if (!isDefaultSmsApp) {
cancelNotification(context, NOTIFICATION_ID);
if (DEBUG || Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
@@ -594,8 +595,9 @@ public class MessagingNotification {
Uri msgUri = Mms.CONTENT_URI.buildUpon().appendPath(
Long.toString(msgId)).build();
String address = AddressUtils.getFrom(context, msgUri);
+ int subId = cursor.getInt(COLUMN_SUB_ID);
- Contact contact = Contact.get(address, false);
+ Contact contact = Contact.get(address, false, subId);
if (contact.getSendToVoicemail()) {
// don't notify, skip this one
continue;
@@ -647,7 +649,8 @@ public class MessagingNotification {
timeMillis,
attachedPicture,
contact,
- attachmentType);
+ attachmentType,
+ subId);
notificationSet.add(info);
@@ -707,8 +710,9 @@ public class MessagingNotification {
String address = cursor.getString(COLUMN_SMS_ADDRESS);
long timeMillis = 3000;
+ int subId = cursor.getInt(COLUMN_SUB_ID);
- Contact contact = Contact.get(address, false);
+ Contact contact = Contact.get(address, false, subId);
String name = contact.getNameAndNumber();
return new MmsSmsDeliveryInfo(context.getString(R.string.delivery_toast_body, name),
@@ -733,8 +737,9 @@ public class MessagingNotification {
try {
while (cursor.moveToNext()) {
String address = cursor.getString(COLUMN_SMS_ADDRESS);
+ int subId = cursor.getInt(COLUMN_SUB_ID);
- Contact contact = Contact.get(address, false);
+ Contact contact = Contact.get(address, false, subId);
if (contact.getSendToVoicemail()) {
// don't notify, skip this one
continue;
@@ -754,7 +759,7 @@ public class MessagingNotification {
NotificationInfo info = getNewMessageNotificationInfo(context, true /* isSms */,
address, message, null /* subject */,
threadId, timeMillis, null /* attachmentBitmap */,
- contact, WorkingMessage.TEXT);
+ contact, WorkingMessage.TEXT, subId);
notificationSet.add(info);
@@ -776,18 +781,19 @@ public class MessagingNotification {
long timeMillis,
Bitmap attachmentBitmap,
Contact contact,
- int attachmentType) {
+ int attachmentType,
+ int subId) {
Intent clickIntent = ComposeMessageActivity.createIntent(context, threadId);
clickIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_SINGLE_TOP
| Intent.FLAG_ACTIVITY_CLEAR_TOP);
String senderInfo = buildTickerMessage(
- context, address, null, null).toString();
+ context, address, null, null, subId).toString();
String senderInfoName = senderInfo.substring(
0, senderInfo.length() - 2);
CharSequence ticker = buildTickerMessage(
- context, address, subject, message);
+ context, address, subject, message, subId);
return new NotificationInfo(isSms,
clickIntent, message, subject, ticker, timeMillis,
@@ -1073,8 +1079,8 @@ public class MessagingNotification {
}
protected static CharSequence buildTickerMessage(
- Context context, String address, String subject, String body) {
- String displayAddress = Contact.get(address, true).getName();
+ Context context, String address, String subject, String body, int subId) {
+ String displayAddress = Contact.get(address, true, subId).getName();
StringBuilder buf = new StringBuilder(
displayAddress == null
diff --git a/src/com/android/mms/transaction/MmsMessageSender.java b/src/com/android/mms/transaction/MmsMessageSender.java
index 19dfd440..c2b2c2f6 100755
--- a/src/com/android/mms/transaction/MmsMessageSender.java
+++ b/src/com/android/mms/transaction/MmsMessageSender.java
@@ -170,7 +170,7 @@ public class MmsMessageSender implements MessageSender {
readRec.setDate(System.currentTimeMillis() / 1000);
Uri uri = PduPersister.getPduPersister(context).persist(readRec, Mms.Outbox.CONTENT_URI, true,
- MessagingPreferenceActivity.getIsGroupMmsEnabled(context), null);
+ MessagingPreferenceActivity.getIsGroupMmsEnabled(context, subId), null);
updateSubIdForSend(context, uri, subId);
context.startService(new Intent(context, TransactionService.class));
} catch (InvalidHeaderValueException e) {
diff --git a/src/com/android/mms/transaction/NotificationTransaction.java b/src/com/android/mms/transaction/NotificationTransaction.java
index bfa9db95..d245a482 100644
--- a/src/com/android/mms/transaction/NotificationTransaction.java
+++ b/src/com/android/mms/transaction/NotificationTransaction.java
@@ -35,6 +35,7 @@ import android.net.ConnectivityManager;
import android.provider.Telephony.Mms;
import android.provider.Telephony.Threads;
import android.provider.Telephony.Mms.Inbox;
+import android.telephony.SmsManager;
import android.telephony.TelephonyManager;
import android.util.Log;
@@ -118,7 +119,7 @@ public class NotificationTransaction extends Transaction implements Runnable {
// persist() to create a thread for the notificationInd because it causes UI jank.
mUri = PduPersister.getPduPersister(context).persist(
ind, Inbox.CONTENT_URI, !allowAutoDownload(context, subId),
- MessagingPreferenceActivity.getIsGroupMmsEnabled(context), null);
+ MessagingPreferenceActivity.getIsGroupMmsEnabled(context, subId), null);
} catch (MmsException e) {
Log.e(TAG, "Failed to save NotificationInd in constructor.", e);
throw new IllegalArgumentException();
@@ -160,12 +161,12 @@ public class NotificationTransaction extends Transaction implements Runnable {
int status = STATUS_DEFERRED;
// Don't try to download when data is suspended, as it will fail, so defer download
if (!autoDownload) {
- downloadManager.markState(mUri, DownloadManager.STATE_UNSTARTED);
+ downloadManager.markState(mUri, DownloadManager.STATE_UNSTARTED, mSubId);
sendNotifyRespInd(status);
return;
}
- downloadManager.markState(mUri, DownloadManager.STATE_DOWNLOADING);
+ downloadManager.markState(mUri, DownloadManager.STATE_DOWNLOADING, mSubId);
if (LOCAL_LOGV) {
Log.v(TAG, "Content-Location: " + mContentLocation);
@@ -191,7 +192,8 @@ public class NotificationTransaction extends Transaction implements Runnable {
// Save the received PDU (must be a M-RETRIEVE.CONF).
PduPersister p = PduPersister.getPduPersister(mContext);
Uri uri = p.persist(pdu, Inbox.CONTENT_URI, true,
- MessagingPreferenceActivity.getIsGroupMmsEnabled(mContext), null);
+ MessagingPreferenceActivity.getIsGroupMmsEnabled(mContext, mSubId),
+ null);
// Use local time instead of PDU time
ContentValues values = new ContentValues(2);
@@ -262,7 +264,7 @@ public class NotificationTransaction extends Transaction implements Runnable {
status);
// Pack M-NotifyResp.ind and send it
- if(MmsConfig.getNotifyWapMMSC()) {
+ if(MmsConfig.getBoolean(mSubId, SmsManager.MMS_CONFIG_NOTIFY_WAP_MMSC_ENABLED)) {
sendPdu(new PduComposer(mContext, notifyRespInd).make(), mContentLocation);
} else {
sendPdu(new PduComposer(mContext, notifyRespInd).make());
diff --git a/src/com/android/mms/transaction/PushReceiver.java b/src/com/android/mms/transaction/PushReceiver.java
index 434bd35c..2c29d73b 100644
--- a/src/com/android/mms/transaction/PushReceiver.java
+++ b/src/com/android/mms/transaction/PushReceiver.java
@@ -36,6 +36,7 @@ import android.os.PowerManager;
import android.provider.Telephony.Mms;
import android.provider.Telephony.Mms.Inbox;
import android.provider.Telephony.MmsSms.PendingMessages;
+import android.telephony.SmsManager;
import android.telephony.SubscriptionManager;
import android.util.Log;
@@ -88,6 +89,8 @@ public class PushReceiver extends BroadcastReceiver {
ContentResolver cr = mContext.getContentResolver();
int type = pdu.getMessageType();
long threadId = -1;
+ final int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY,
+ SubscriptionManager.getDefaultSmsSubId());
try {
switch (type) {
@@ -101,7 +104,8 @@ public class PushReceiver extends BroadcastReceiver {
}
Uri uri = p.persist(pdu, Inbox.CONTENT_URI, true,
- MessagingPreferenceActivity.getIsGroupMmsEnabled(mContext), null);
+ MessagingPreferenceActivity.getIsGroupMmsEnabled(mContext, subId),
+ null);
// Update thread ID for ReadOrigInd & DeliveryInd.
ContentValues values = new ContentValues(1);
values.put(Mms.THREAD_ID, threadId);
@@ -111,7 +115,8 @@ public class PushReceiver extends BroadcastReceiver {
case MESSAGE_TYPE_NOTIFICATION_IND: {
NotificationInd nInd = (NotificationInd) pdu;
- if (MmsConfig.getTransIdEnabled()) {
+ if (MmsConfig.getBoolean(subId,
+ SmsManager.MMS_CONFIG_APPEND_TRANSACTION_ID)) {
byte [] contentLocation = nInd.getContentLocation();
if ('=' == contentLocation[contentLocation.length - 1]) {
byte [] transactionId = nInd.getTransactionId();
@@ -129,16 +134,14 @@ public class PushReceiver extends BroadcastReceiver {
// Save the pdu. If we can start downloading the real pdu immediately,
// don't allow persist() to create a thread for the notificationInd
// because it causes UI jank.
- int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY,
- SubscriptionManager.INVALID_SUB_ID);
if (!SubscriptionManager.isValidSubId(subId)) {
Log.e(TAG, "subId is invalid");
break;
}
Uri uri = p.persist(pdu, Inbox.CONTENT_URI,
!NotificationTransaction.allowAutoDownload(mContext, subId),
- MessagingPreferenceActivity.getIsGroupMmsEnabled(mContext),
- null);
+ MessagingPreferenceActivity.getIsGroupMmsEnabled(mContext,
+ subId), null);
// TODO remove updating subId of Mms after refactor
ContentValues values = new ContentValues();
values.put(Mms.SUB_ID, subId);
@@ -177,7 +180,8 @@ public class PushReceiver extends BroadcastReceiver {
pendingCursor.close();
}
}
- DownloadManager.getInstance().markState(uri, DownloadManager.STATE_DOWNLOADING);
+ DownloadManager.getInstance().markState(uri,
+ DownloadManager.STATE_DOWNLOADING, subId);
// Start service to finish the notification transaction.
Intent svc = new Intent(mContext, TransactionService.class);
svc.putExtra(TransactionBundle.URI, uri.toString());
diff --git a/src/com/android/mms/transaction/ReadRecTransaction.java b/src/com/android/mms/transaction/ReadRecTransaction.java
index d884e7e4..3b72727a 100755
--- a/src/com/android/mms/transaction/ReadRecTransaction.java
+++ b/src/com/android/mms/transaction/ReadRecTransaction.java
@@ -83,7 +83,7 @@ public class ReadRecTransaction extends Transaction implements Runnable{
ReadRecInd readRecInd = (ReadRecInd) persister.load(mReadReportURI);
// insert the 'from' address per spec
- String lineNumber = MessageUtils.getLocalNumber();
+ String lineNumber = MessageUtils.getLocalNumber(mSubId);
readRecInd.setFrom(new EncodedStringValue(lineNumber));
// Pack M-read-rec.ind and send it
diff --git a/src/com/android/mms/transaction/RetrieveTransaction.java b/src/com/android/mms/transaction/RetrieveTransaction.java
index 888b7f19..e2753b14 100755
--- a/src/com/android/mms/transaction/RetrieveTransaction.java
+++ b/src/com/android/mms/transaction/RetrieveTransaction.java
@@ -26,6 +26,7 @@ import android.database.sqlite.SqliteWrapper;
import android.net.Uri;
import android.provider.Telephony.Mms;
import android.provider.Telephony.Mms.Inbox;
+import android.telephony.SmsManager;
import android.text.TextUtils;
import android.util.Log;
@@ -132,7 +133,7 @@ public class RetrieveTransaction extends Transaction implements Runnable {
try {
// Change the downloading state of the M-Notification.ind.
DownloadManager.getInstance().markState(
- mUri, DownloadManager.STATE_DOWNLOADING);
+ mUri, DownloadManager.STATE_DOWNLOADING, mSubId);
// Send GET request to MMSC and retrieve the response data.
byte[] resp = getPdu(mContentLocation);
@@ -153,7 +154,7 @@ public class RetrieveTransaction extends Transaction implements Runnable {
// Store M-Retrieve.conf into Inbox
PduPersister persister = PduPersister.getPduPersister(mContext);
msgUri = persister.persist(retrieveConf, Inbox.CONTENT_URI, true,
- MessagingPreferenceActivity.getIsGroupMmsEnabled(mContext), null);
+ MessagingPreferenceActivity.getIsGroupMmsEnabled(mContext, mSubId), null);
// Use local time instead of PDU time
ContentValues values = new ContentValues(2);
@@ -279,11 +280,11 @@ public class RetrieveTransaction extends Transaction implements Runnable {
PduHeaders.CURRENT_MMS_VERSION, tranId);
// insert the 'from' address per spec
- String lineNumber = MessageUtils.getLocalNumber();
+ String lineNumber = MessageUtils.getLocalNumber(mSubId);
acknowledgeInd.setFrom(new EncodedStringValue(lineNumber));
// Pack M-Acknowledge.ind and send it
- if(MmsConfig.getNotifyWapMMSC()) {
+ if(MmsConfig.getBoolean(mSubId, SmsManager.MMS_CONFIG_NOTIFY_WAP_MMSC_ENABLED)) {
sendPdu(new PduComposer(mContext, acknowledgeInd).make(), mContentLocation);
} else {
sendPdu(new PduComposer(mContext, acknowledgeInd).make());
diff --git a/src/com/android/mms/transaction/RetryScheduler.java b/src/com/android/mms/transaction/RetryScheduler.java
index bbe9ed90..edd16cc0 100644
--- a/src/com/android/mms/transaction/RetryScheduler.java
+++ b/src/com/android/mms/transaction/RetryScheduler.java
@@ -120,6 +120,9 @@ public class RetryScheduler implements Observer {
int retryIndex = cursor.getInt(cursor.getColumnIndexOrThrow(
PendingMessages.RETRY_INDEX)) + 1; // Count this time.
+ int subId = cursor.getInt(cursor.getColumnIndexOrThrow(
+ PendingMessages.SUB_ID));
+
// TODO Should exactly understand what was happened.
int errorType = MmsSms.ERR_TYPE_GENERIC;
@@ -181,7 +184,7 @@ public class RetryScheduler implements Observer {
if (isRetryDownloading) {
// Downloading process is transiently failed.
DownloadManager.getInstance().markState(
- uri, DownloadManager.STATE_TRANSIENT_FAILURE);
+ uri, DownloadManager.STATE_TRANSIENT_FAILURE, subId);
}
} else {
errorType = MmsSms.ERR_TYPE_GENERIC_PERMANENT;
@@ -206,7 +209,7 @@ public class RetryScheduler implements Observer {
}
DownloadManager.getInstance().markState(
- uri, DownloadManager.STATE_PERMANENT_FAILURE);
+ uri, DownloadManager.STATE_PERMANENT_FAILURE, subId);
} else {
// Mark the failed message as unread.
ContentValues readValues = new ContentValues(1);
diff --git a/src/com/android/mms/transaction/SendTransaction.java b/src/com/android/mms/transaction/SendTransaction.java
index da2fb1ab..d4568529 100755
--- a/src/com/android/mms/transaction/SendTransaction.java
+++ b/src/com/android/mms/transaction/SendTransaction.java
@@ -103,7 +103,7 @@ public class SendTransaction extends Transaction implements Runnable {
mSendReqURI, values, null, null);
// fix bug 2100169: insert the 'from' address per spec
- String lineNumber = MessageUtils.getLocalNumber();
+ String lineNumber = MessageUtils.getLocalNumber(mSubId);
if (!TextUtils.isEmpty(lineNumber)) {
sendReq.setFrom(new EncodedStringValue(lineNumber));
}
diff --git a/src/com/android/mms/transaction/SmsReceiverService.java b/src/com/android/mms/transaction/SmsReceiverService.java
index 81519c71..0f6c11b2 100644
--- a/src/com/android/mms/transaction/SmsReceiverService.java
+++ b/src/com/android/mms/transaction/SmsReceiverService.java
@@ -201,7 +201,7 @@ public class SmsReceiverService extends Service {
if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {
Log.v(TAG, "handleMessage serviceId: " + serviceId + " intent: " + intent);
}
- if (intent != null && MmsConfig.isSmsEnabled(getApplicationContext())) {
+ if (intent != null && MmsConfig.isSmsEnabled()) {
String action = intent.getAction();
int error = intent.getIntExtra("errorCode", 0);
@@ -622,8 +622,9 @@ public class SmsReceiverService extends Service {
// case 7: address = "#4#5#6#"; break;
// }
+ int subId = sms.getSubId();
if (!TextUtils.isEmpty(address)) {
- Contact cacheContact = Contact.get(address,true);
+ Contact cacheContact = Contact.get(address, true, subId);
if (cacheContact != null) {
address = cacheContact.getNumber();
}
@@ -632,7 +633,6 @@ public class SmsReceiverService extends Service {
values.put(Sms.ADDRESS, address);
}
- int subId = sms.getSubId();
if (!SubscriptionManager.isValidSubId(subId)) {
Log.e(TAG, "subId in storeMessage() is invalid!");
return null;
diff --git a/src/com/android/mms/transaction/SmsSingleRecipientSender.java b/src/com/android/mms/transaction/SmsSingleRecipientSender.java
index 7d9330d6..f2fa4ef3 100755
--- a/src/com/android/mms/transaction/SmsSingleRecipientSender.java
+++ b/src/com/android/mms/transaction/SmsSingleRecipientSender.java
@@ -51,11 +51,13 @@ public class SmsSingleRecipientSender extends SmsMessageSender {
}
SmsManager smsManager = SmsManager.getSmsManagerForSubscriber(mSubId);
ArrayList<String> messages = null;
- if ((MmsConfig.getEmailGateway() != null) &&
- (Mms.isEmailAddress(mDest) || MessageUtils.isAlias(mDest))) {
+ final String emailGateway =
+ MmsConfig.getString(mSubId, SmsManager.MMS_CONFIG_EMAIL_GATEWAY_NUMBER);
+ if ((emailGateway != null) &&
+ (Mms.isEmailAddress(mDest) || MessageUtils.isAlias(mDest, mSubId))) {
String msgText;
msgText = mDest + " " + mMessageText;
- mDest = MmsConfig.getEmailGateway();
+ mDest = emailGateway;
messages = smsManager.divideMessage(msgText);
} else {
messages = smsManager.divideMessage(mMessageText);
@@ -63,7 +65,7 @@ public class SmsSingleRecipientSender extends SmsMessageSender {
// (e.g. "801 555 1212" -> "8015551212")
// (e.g. "+8211-123-4567" -> "+82111234567")
mDest = PhoneNumberUtils.stripSeparators(mDest);
- mDest = Conversation.verifySingleRecipient(mContext, mThreadId, mDest);
+ mDest = Conversation.verifySingleRecipient(mContext, mThreadId, mDest, mSubId);
}
int messageCount = messages.size();
diff --git a/src/com/android/mms/transaction/Transaction.java b/src/com/android/mms/transaction/Transaction.java
index c001de61..8588e1e9 100755
--- a/src/com/android/mms/transaction/Transaction.java
+++ b/src/com/android/mms/transaction/Transaction.java
@@ -183,7 +183,8 @@ public abstract class Transaction extends Observable {
pdu, HttpUtils.HTTP_POST_METHOD,
mTransactionSettings.isProxySet(),
mTransactionSettings.getProxyAddress(),
- mTransactionSettings.getProxyPort());
+ mTransactionSettings.getProxyPort(),
+ mSubId);
}
/**
@@ -202,7 +203,8 @@ public abstract class Transaction extends Observable {
url, null, HttpUtils.HTTP_GET_METHOD,
mTransactionSettings.isProxySet(),
mTransactionSettings.getProxyAddress(),
- mTransactionSettings.getProxyPort());
+ mTransactionSettings.getProxyPort(),
+ mSubId);
}
/**
diff --git a/src/com/android/mms/transaction/TransactionService.java b/src/com/android/mms/transaction/TransactionService.java
index 3d26e7b4..4eac8480 100644
--- a/src/com/android/mms/transaction/TransactionService.java
+++ b/src/com/android/mms/transaction/TransactionService.java
@@ -207,7 +207,7 @@ public class TransactionService extends Service implements Observer {
public void onNewIntent(Intent intent, int serviceId) {
mConnMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
if (mConnMgr == null || !SubStatusResolver.isMobileDataEnabledOnAnySub(getApplicationContext())
- || !MmsConfig.isSmsEnabled(getApplicationContext())) {
+ || !MmsConfig.isSmsEnabled()) {
endMmsConnectivity(mMmsDatasubId);
stopSelf(serviceId);
return;
@@ -971,13 +971,16 @@ public class TransactionService extends Service implements Observer {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY,
- SubscriptionManager.INVALID_SUB_ID);
+ SubscriptionManager.getDefaultSmsSubId());
if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {
- Log.w(TAG, "ConnectivityBroadcastReceiver.onReceive() action: " + action);
+ Log.w(TAG, "ConnectivityBroadcastReceiver.onReceive() action: " + action +
+ " subId: " + subId);
}
-
if (!action.equals(ConnectivityManager.CONNECTIVITY_ACTION)
|| !SubscriptionManager.isValidSubId(subId)) {
+ if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {
+ Log.v(TAG, "onReceive: bailing because of non-valid subId: " + subId);
+ }
return;
}
diff --git a/src/com/android/mms/ui/AttachmentTypeSelectorAdapter.java b/src/com/android/mms/ui/AttachmentTypeSelectorAdapter.java
index 5831d6f9..48448754 100644
--- a/src/com/android/mms/ui/AttachmentTypeSelectorAdapter.java
+++ b/src/com/android/mms/ui/AttachmentTypeSelectorAdapter.java
@@ -21,6 +21,7 @@ import java.util.ArrayList;
import java.util.List;
import android.content.Context;
+import android.telephony.SmsManager;
import com.android.mms.MmsConfig;
import com.android.mms.R;
@@ -43,7 +44,7 @@ public class AttachmentTypeSelectorAdapter extends IconListAdapter {
public AttachmentTypeSelectorAdapter(Context context, int mode) {
super(context, getData(mode, context));
}
-
+
public int buttonToCommand(int whichButton) {
AttachmentListItem item = (AttachmentListItem)getItem(whichButton);
return item.getCommand();
@@ -63,7 +64,7 @@ public class AttachmentTypeSelectorAdapter extends IconListAdapter {
addItem(data, context.getString(R.string.attach_record_video),
R.drawable.ic_attach_capture_video_holo_light, RECORD_VIDEO);
- if (MmsConfig.getAllowAttachAudio()) {
+ if (MmsConfig.getBoolean(SmsManager.MMS_CONFIG_ALLOW_ATTACH_AUDIO)) {
addItem(data, context.getString(R.string.attach_sound),
R.drawable.ic_attach_audio_holo_light, ADD_SOUND);
}
@@ -84,7 +85,7 @@ public class AttachmentTypeSelectorAdapter extends IconListAdapter {
AttachmentListItem temp = new AttachmentListItem(title, resource, command);
data.add(temp);
}
-
+
public static class AttachmentListItem extends IconListAdapter.IconListItem {
private int mCommand;
diff --git a/src/com/android/mms/ui/ComposeMessageActivity.java b/src/com/android/mms/ui/ComposeMessageActivity.java
index de24b45b..6fe4d5ad 100644
--- a/src/com/android/mms/ui/ComposeMessageActivity.java
+++ b/src/com/android/mms/ui/ComposeMessageActivity.java
@@ -34,10 +34,8 @@ import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
-import java.util.Map;
import java.util.regex.Pattern;
import android.app.ActionBar;
@@ -53,7 +51,6 @@ import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
-import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.IntentFilter;
@@ -63,7 +60,6 @@ import android.database.Cursor;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SqliteWrapper;
import android.drm.DrmStore;
-import android.graphics.drawable.Drawable;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.AsyncTask;
@@ -86,6 +82,7 @@ import android.provider.Settings;
import android.provider.Telephony.Mms;
import android.provider.Telephony.Sms;
import android.telephony.PhoneNumberUtils;
+import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.telephony.TelephonyManager;
import android.telephony.SubInfoRecord;
@@ -116,13 +113,10 @@ import android.webkit.MimeTypeMap;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ImageButton;
-import android.widget.ImageView;
import android.widget.ListView;
-import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
-import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.telephony.TelephonyProperties;
import com.android.mms.LogTag;
@@ -351,7 +345,7 @@ public class ComposeMessageActivity extends Activity
private final static String RECIPIENTS = "recipients";
private AlertDialog mSubSelectDialog;
- private int mSelectedSubId;
+ private int mSelectedSubId = SubscriptionManager.getDefaultSmsSubId();
private List<SubInfoRecord> mSubListInfo = new ArrayList<SubInfoRecord>();
private List<SubInfoRecord> mEmptySubListInfo = new ArrayList<SubInfoRecord>();
private SubChooseAdapter mSubAdapter;
@@ -455,7 +449,7 @@ public class ComposeMessageActivity extends Activity
@Override
public void run() {
// This runnable gets run in a background thread.
- mTempMmsUri = mWorkingMessage.saveAsMms(false);
+ mTempMmsUri = mWorkingMessage.saveAsMms(false, mSelectedSubId);
}
}, new Runnable() {
@Override
@@ -501,7 +495,7 @@ public class ComposeMessageActivity extends Activity
break;
case AttachmentEditor.MSG_REMOVE_ATTACHMENT:
- mWorkingMessage.removeAttachment(true);
+ mWorkingMessage.removeAttachment(true, mSelectedSubId);
break;
default:
@@ -528,7 +522,7 @@ public class ComposeMessageActivity extends Activity
@Override
public void run() {
// This runnable gets run in a background thread.
- mTempMmsUri = mWorkingMessage.saveAsMms(false);
+ mTempMmsUri = mWorkingMessage.saveAsMms(false, mSelectedSubId);
}
}, new Runnable() {
@Override
@@ -607,7 +601,7 @@ public class ComposeMessageActivity extends Activity
// When the subject editor is empty, press "DEL" to hide the input field.
if ((keyCode == KeyEvent.KEYCODE_DEL) && (mSubjectTextEditor.length() == 0)) {
showSubjectEditor(false);
- mWorkingMessage.setSubject(null, true);
+ mWorkingMessage.setSubject(null, true, mSelectedSubId);
return true;
}
return false;
@@ -668,13 +662,15 @@ public class ComposeMessageActivity extends Activity
int msgCount = params[0];
int remainingInCurrentMessage = params[2];
- if (!MmsConfig.getMultipartSmsEnabled()) {
+ if (!MmsConfig.getBoolean(mSelectedSubId, SmsManager.MMS_CONFIG_MULTIPART_SMS_ENABLED)) {
// The provider doesn't support multi-part sms's so as soon as the user types
// an sms longer than one segment, we have to turn the message into an mms.
- mWorkingMessage.setLengthRequiresMms(msgCount > 1, true);
+ mWorkingMessage.setLengthRequiresMms(msgCount > 1, true, mSelectedSubId);
} else {
- int threshold = MmsConfig.getSmsToMmsTextThreshold();
- mWorkingMessage.setLengthRequiresMms(threshold > 0 && msgCount > threshold, true);
+ int threshold = MmsConfig.getInt(mSelectedSubId,
+ SmsManager.MMS_CONFIG_SMS_TO_MMS_TEXT_LENGTH_THRESHOLD);
+ mWorkingMessage.setLengthRequiresMms(threshold > 0 && msgCount > threshold, true,
+ mSelectedSubId);
}
// Show the counter only if:
@@ -792,10 +788,10 @@ public class ComposeMessageActivity extends Activity
}
boolean isMms = mWorkingMessage.requiresMms();
- if (mRecipientsEditor.hasInvalidRecipient(isMms)) {
- if (mRecipientsEditor.hasValidRecipient(isMms)) {
+ if (mRecipientsEditor.hasInvalidRecipient(isMms, mSelectedSubId)) {
+ if (mRecipientsEditor.hasValidRecipient(isMms, mSelectedSubId)) {
String title = getResourcesString(R.string.has_invalid_recipient,
- mRecipientsEditor.formatInvalidNumbers(isMms));
+ mRecipientsEditor.formatInvalidNumbers(isMms, mSelectedSubId));
new AlertDialog.Builder(this)
.setTitle(title)
.setMessage(R.string.invalid_recipient_message)
@@ -813,8 +809,9 @@ public class ComposeMessageActivity extends Activity
} else {
// The recipients editor is still open. Make sure we use what's showing there
// as the destination.
- ContactList contacts = mRecipientsEditor.constructContactsFromInput(false);
- mDebugRecipients = contacts.serialize();
+ ContactList contacts = mRecipientsEditor.constructContactsFromInput(false,
+ mSelectedSubId);
+ mDebugRecipients = contacts.serialize(mSelectedSubId);
sendMessage(true);
}
}
@@ -857,8 +854,8 @@ public class ComposeMessageActivity extends Activity
mWorkingMessage.setWorkingRecipients(numbers);
boolean multiRecipients = numbers != null && numbers.size() > 1;
mMsgListAdapter.setIsGroupConversation(multiRecipients);
- mWorkingMessage.setHasMultipleRecipients(multiRecipients, true);
- mWorkingMessage.setHasEmail(mRecipientsEditor.containsEmail(), true);
+ mWorkingMessage.setHasMultipleRecipients(multiRecipients, true, mSelectedSubId);
+ mWorkingMessage.setHasEmail(mRecipientsEditor.containsEmail(), true, mSelectedSubId);
checkForTooManyRecipients();
@@ -870,7 +867,8 @@ public class ComposeMessageActivity extends Activity
continue;
if (c == ',') {
- ContactList contacts = mRecipientsEditor.constructContactsFromInput(false);
+ ContactList contacts = mRecipientsEditor.constructContactsFromInput(false,
+ mSelectedSubId);
updateTitle(contacts);
}
@@ -883,7 +881,8 @@ public class ComposeMessageActivity extends Activity
};
private void checkForTooManyRecipients() {
- final int recipientLimit = MmsConfig.getRecipientLimit();
+ final int recipientLimit =
+ MmsConfig.getInt(mSelectedSubId, SmsManager.MMS_CONFIG_RECIPIENT_LIMIT);
if (recipientLimit != Integer.MAX_VALUE) {
final int recipientCount = recipientCount();
boolean tooMany = recipientCount > recipientLimit;
@@ -1115,7 +1114,7 @@ public class ComposeMessageActivity extends Activity
}
private Uri getContactUriForPhoneNumber(String phoneNumber) {
- Contact contact = Contact.get(phoneNumber, false);
+ Contact contact = Contact.get(phoneNumber, false, mSelectedSubId);
if (contact.existsInDatabase()) {
return contact.getUri();
}
@@ -1271,7 +1270,8 @@ public class ComposeMessageActivity extends Activity
private void editMmsMessageItem(MessageItem msgItem) {
// Load the selected message in as the working message.
- WorkingMessage newWorkingMessage = WorkingMessage.load(this, msgItem.mMessageUri);
+ WorkingMessage newWorkingMessage = WorkingMessage.load(this, msgItem.mMessageUri,
+ mSelectedSubId);
if (newWorkingMessage == null) {
return;
}
@@ -1280,14 +1280,14 @@ public class ComposeMessageActivity extends Activity
mWorkingMessage.discard();
mWorkingMessage = newWorkingMessage;
- mWorkingMessage.setConversation(mConversation);
+ mWorkingMessage.setConversation(mConversation, mSelectedSubId);
drawTopPanel(false);
// WorkingMessage.load() above only loads the slideshow. Set the
// subject here because we already know what it is and avoid doing
// another DB lookup in load() just to get it.
- mWorkingMessage.setSubject(msgItem.mSubject, false);
+ mWorkingMessage.setSubject(msgItem.mSubject, false, mSelectedSubId);
if (mWorkingMessage.hasSubject()) {
showSubjectEditor(true);
@@ -1326,7 +1326,8 @@ public class ComposeMessageActivity extends Activity
// Copy the parts of the message here.
mTempMmsUri = persister.persist(sendReq, Mms.Draft.CONTENT_URI, true,
MessagingPreferenceActivity
- .getIsGroupMmsEnabled(ComposeMessageActivity.this), null);
+ .getIsGroupMmsEnabled(ComposeMessageActivity.this,
+ mSelectedSubId), null);
mTempThreadId = MessagingNotification.getThreadId(
ComposeMessageActivity.this, mTempMmsUri);
} catch (MmsException e) {
@@ -1849,7 +1850,7 @@ public class ComposeMessageActivity extends Activity
break;
}
}
- mDebugRecipients = list.serialize();
+ mDebugRecipients = list.serialize(mSelectedSubId);
ActionBar actionBar = getActionBar();
actionBar.setTitle(title);
@@ -1913,7 +1914,7 @@ public class ComposeMessageActivity extends Activity
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
RecipientsEditor editor = (RecipientsEditor) v;
- ContactList contacts = editor.constructContactsFromInput(false);
+ ContactList contacts = editor.constructContactsFromInput(false, mSelectedSubId);
updateTitle(contacts);
}
}
@@ -1950,7 +1951,7 @@ public class ComposeMessageActivity extends Activity
@Override
protected void onCreate(Bundle savedInstanceState) {
- mIsSmsEnabled = MmsConfig.isSmsEnabled(this);
+ mIsSmsEnabled = MmsConfig.isSmsEnabled();
super.onCreate(savedInstanceState);
resetConfiguration(getResources().getConfiguration());
@@ -1987,7 +1988,8 @@ public class ComposeMessageActivity extends Activity
}
mSubjectTextEditor = (EditText)findViewById(R.id.subject);
mSubjectTextEditor.setFilters(new InputFilter[] {
- new LengthFilter(MmsConfig.getMaxSubjectLength())});
+ new LengthFilter(MmsConfig.getInt(mSelectedSubId,
+ SmsManager.MMS_CONFIG_SUBJECT_MAX_LENGTH))});
}
mSubjectTextEditor.setOnKeyListener(show ? mSubjectKeyListener : null);
@@ -2019,7 +2021,7 @@ public class ComposeMessageActivity extends Activity
if (LogTag.SEVERE_WARNING && originalThreadId != 0 &&
originalThreadId == mConversation.getThreadId()) {
LogTag.warnPossibleRecipientMismatch("ComposeMessageActivity.initialize: " +
- " threadId didn't change from: " + originalThreadId, this);
+ " threadId didn't change from: " + originalThreadId, this, mSelectedSubId);
}
log("savedInstanceState = " + savedInstanceState +
@@ -2049,7 +2051,7 @@ public class ComposeMessageActivity extends Activity
}
// Let the working message know what conversation it belongs to
- mWorkingMessage.setConversation(mConversation);
+ mWorkingMessage.setConversation(mConversation, mSelectedSubId);
// Show the recipients editor if we don't have a valid thread. Hide it otherwise.
if (mConversation.getThreadId() <= 0) {
@@ -2113,7 +2115,7 @@ public class ComposeMessageActivity extends Activity
// We've got a draft. Make sure the working recipients are synched
// to the conversation so when we compare conversations later in this function,
// the compare will work.
- mWorkingMessage.syncWorkingRecipients();
+ mWorkingMessage.syncWorkingRecipients(mSelectedSubId);
}
// Get the "real" conversation based on the intentUri. The intentUri might specify
// the conversation by a phone number or by a thread id. We'll typically get a threadId
@@ -2124,7 +2126,7 @@ public class ComposeMessageActivity extends Activity
// the database and the corresponding entry made in the threads table. The code should
// use the real conversation as soon as it can rather than finding out the threadId
// when sending with "ensureThreadId".
- conversation = Conversation.get(this, intentUri, false);
+ conversation = Conversation.get(this, intentUri, false, mSelectedSubId);
}
if (LogTag.VERBOSE || Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
@@ -2146,7 +2148,7 @@ public class ComposeMessageActivity extends Activity
log("onNewIntent: same conversation");
if (mConversation.getThreadId() == 0) {
mConversation = conversation;
- mWorkingMessage.setConversation(mConversation);
+ mWorkingMessage.setConversation(mConversation, mSelectedSubId);
updateThreadIdIfRunning();
invalidateOptionsMenu();
}
@@ -2166,7 +2168,7 @@ public class ComposeMessageActivity extends Activity
LogTag.warnPossibleRecipientMismatch(
"ComposeMessageActivity: mWorkingMessage.mConversation=" +
mWorkingMessage.getConversation() + ", mConversation=" +
- mConversation + ", MISMATCH!", this);
+ mConversation + ", MISMATCH!", this, mSelectedSubId);
}
}
@@ -2204,7 +2206,7 @@ public class ComposeMessageActivity extends Activity
@Override
protected void onStart() {
super.onStart();
- boolean isSmsEnabled = MmsConfig.isSmsEnabled(this);
+ boolean isSmsEnabled = MmsConfig.isSmsEnabled();
if (isSmsEnabled != mIsSmsEnabled) {
mIsSmsEnabled = isSmsEnabled;
invalidateOptionsMenu();
@@ -2261,7 +2263,7 @@ public class ComposeMessageActivity extends Activity
// Update the fasttrack info in case any of the recipients' contact info changed
// while we were paused. This can happen, for example, if a user changes or adds
// an avatar associated with a contact.
- mWorkingMessage.syncWorkingRecipients();
+ mWorkingMessage.syncWorkingRecipients(mSelectedSubId);
if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
log("update title, mConversation=" + mConversation.toString());
@@ -2326,7 +2328,7 @@ public class ComposeMessageActivity extends Activity
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
- outState.putString(RECIPIENTS, getRecipients().serialize());
+ outState.putString(RECIPIENTS, getRecipients().serialize(mSelectedSubId));
mWorkingMessage.writeStateToBundle(outState);
@@ -2360,7 +2362,8 @@ public class ComposeMessageActivity extends Activity
@Override
public void run() {
ContactList recipients = isRecipientsEditorVisible() ?
- mRecipientsEditor.constructContactsFromInput(false) : getRecipients();
+ mRecipientsEditor.constructContactsFromInput(false, mSelectedSubId) :
+ getRecipients();
updateTitle(recipients);
}
}, 100);
@@ -2569,7 +2572,8 @@ public class ComposeMessageActivity extends Activity
}
if (isRecipientsEditorVisible() &&
- !mRecipientsEditor.hasValidRecipient(mWorkingMessage.requiresMms())) {
+ !mRecipientsEditor.hasValidRecipient(mWorkingMessage.requiresMms(),
+ mSelectedSubId)) {
MessageUtils.showDiscardDraftConfirmDialog(this, new DiscardDraftListener());
return;
}
@@ -2752,7 +2756,8 @@ public class ComposeMessageActivity extends Activity
}
}
- if (MmsConfig.getMmsEnabled() && mIsSmsEnabled) {
+ if (MmsConfig.getBoolean(mSelectedSubId, SmsManager.MMS_CONFIG_MMS_ENABLED) &&
+ mIsSmsEnabled) {
if (!isSubjectEditorVisible()) {
menu.add(0, MENU_ADD_SUBJECT, 0, R.string.add_subject).setIcon(
R.drawable.ic_menu_edit);
@@ -2823,7 +2828,7 @@ public class ComposeMessageActivity extends Activity
switch (item.getItemId()) {
case MENU_ADD_SUBJECT:
showSubjectEditor(true);
- mWorkingMessage.setSubject("", true);
+ mWorkingMessage.setSubject("", true, mSelectedSubId);
updateSendButtonState();
mSubjectTextEditor.requestFocus();
break;
@@ -2889,7 +2894,7 @@ public class ComposeMessageActivity extends Activity
case MENU_DEBUG_DUMP:
mWorkingMessage.dump();
Conversation.dump();
- LogTag.dumpInternalTables(this);
+ LogTag.dumpInternalTables(this, mSelectedSubId);
break;
}
@@ -2963,7 +2968,8 @@ public class ComposeMessageActivity extends Activity
public static long computeAttachmentSizeLimit(SlideshowModel slideShow, int currentSlideSize) {
// Computer attachment size limit. Subtract 1K for some text.
- long sizeLimit = MmsConfig.getMaxMessageSize() - SlideshowModel.SLIDESHOW_SLOP;
+ long sizeLimit = MmsConfig.getInt(SmsManager.MMS_CONFIG_MAX_MESSAGE_SIZE) -
+ SlideshowModel.SLIDESHOW_SLOP;
if (slideShow != null) {
sizeLimit -= slideShow.getCurrentMessageSize();
@@ -3008,7 +3014,7 @@ public class ComposeMessageActivity extends Activity
if (mWorkingMessage.isFakeMmsForDraft()) {
// We no longer have to fake the fact we're an Mms. At this point we are or we aren't,
// based on attachments and other Mms attrs.
- mWorkingMessage.removeFakeMmsForDraft();
+ mWorkingMessage.removeFakeMmsForDraft(mSelectedSubId);
}
if (requestCode == REQUEST_CODE_PICK) {
@@ -3031,9 +3037,9 @@ public class ComposeMessageActivity extends Activity
mAddContactIntent.getStringExtra(ContactsContract.Intents.Insert.PHONE);
}
if (address != null) {
- Contact contact = Contact.get(address, false);
+ Contact contact = Contact.get(address, false, mSelectedSubId);
if (contact != null) {
- contact.reload();
+ contact.reload(mSelectedSubId);
}
}
}
@@ -3047,10 +3053,11 @@ public class ComposeMessageActivity extends Activity
switch (requestCode) {
case REQUEST_CODE_CREATE_SLIDESHOW:
if (data != null) {
- WorkingMessage newMessage = WorkingMessage.load(this, data.getData());
+ WorkingMessage newMessage = WorkingMessage.load(this, data.getData(),
+ mSelectedSubId);
if (newMessage != null) {
mWorkingMessage = newMessage;
- mWorkingMessage.setConversation(mConversation);
+ mWorkingMessage.setConversation(mConversation, mSelectedSubId);
updateThreadIdIfRunning();
drawTopPanel(false);
updateSendButtonState();
@@ -3084,12 +3091,12 @@ public class ComposeMessageActivity extends Activity
// Remove the old captured video's thumbnail from the cache
MmsApp.getApplication().getThumbnailManager().removeThumbnail(videoUri);
- addVideoAsync(videoUri, false); // can handle null videoUri
+ addVideoAsync(videoUri, false, mSelectedSubId); // can handle null videoUri
break;
case REQUEST_CODE_ATTACH_VIDEO:
if (data != null) {
- addVideoAsync(data.getData(), false);
+ addVideoAsync(data.getData(), false, mSelectedSubId);
}
break;
@@ -3098,13 +3105,13 @@ public class ComposeMessageActivity extends Activity
if (Settings.System.DEFAULT_RINGTONE_URI.equals(uri)) {
break;
}
- addAudio(uri);
+ addAudio(uri, mSelectedSubId);
break;
}
case REQUEST_CODE_RECORD_SOUND:
if (data != null) {
- addAudio(data.getData());
+ addAudio(data.getData(), mSelectedSubId);
}
break;
@@ -3135,7 +3142,8 @@ public class ComposeMessageActivity extends Activity
final int recipientCount = uris != null ? uris.length : 0;
- final int recipientLimit = MmsConfig.getRecipientLimit();
+ final int recipientLimit =
+ MmsConfig.getInt(recipientCount, SmsManager.MMS_CONFIG_RECIPIENT_LIMIT);
if (recipientLimit != Integer.MAX_VALUE && recipientCount > recipientLimit) {
new AlertDialog.Builder(this)
.setMessage(getString(R.string.too_many_recipients, recipientCount, recipientLimit))
@@ -3166,7 +3174,7 @@ public class ComposeMessageActivity extends Activity
public void run() {
final ContactList list;
try {
- list = ContactList.blockingGetByUris(uris);
+ list = ContactList.blockingGetByUris(uris, mSelectedSubId);
} finally {
handler.removeCallbacks(showProgress);
progressDialog.dismiss();
@@ -3198,14 +3206,15 @@ public class ComposeMessageActivity extends Activity
PduPersister persister = PduPersister.getPduPersister(context);
int result;
- Uri messageUri = mWorkingMessage.saveAsMms(true);
+ Uri messageUri = mWorkingMessage.saveAsMms(true, mSelectedSubId);
if (messageUri == null) {
result = WorkingMessage.UNKNOWN_ERROR;
} else {
try {
Uri dataUri = persister.persistPart(part,
ContentUris.parseId(messageUri), null);
- result = mWorkingMessage.setAttachment(WorkingMessage.IMAGE, dataUri, append);
+ result = mWorkingMessage.setAttachment(WorkingMessage.IMAGE, dataUri, append,
+ mSelectedSubId);
if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
log("ResizeImageResultCallback: dataUri=" + dataUri);
}
@@ -3271,7 +3280,8 @@ public class ComposeMessageActivity extends Activity
log("addImage: append=" + append + ", uri=" + uri);
}
- int result = mWorkingMessage.setAttachment(WorkingMessage.IMAGE, uri, append);
+ int result = mWorkingMessage.setAttachment(WorkingMessage.IMAGE, uri, append,
+ mSelectedSubId);
if (result == WorkingMessage.IMAGE_TOO_LARGE ||
result == WorkingMessage.MESSAGE_SIZE_EXCEEDED) {
@@ -3285,24 +3295,24 @@ public class ComposeMessageActivity extends Activity
handleAddAttachmentError(result, R.string.type_picture);
}
- private void addVideoAsync(final Uri uri, final boolean append) {
+ private void addVideoAsync(final Uri uri, final boolean append, final int subId) {
getAsyncDialog().runAsync(new Runnable() {
@Override
public void run() {
- addVideo(uri, append);
+ addVideo(uri, append, subId);
}
}, null, R.string.adding_attachments_title);
}
- private void addVideo(Uri uri, boolean append) {
+ private void addVideo(Uri uri, boolean append, int subId) {
if (uri != null) {
- int result = mWorkingMessage.setAttachment(WorkingMessage.VIDEO, uri, append);
+ int result = mWorkingMessage.setAttachment(WorkingMessage.VIDEO, uri, append, subId);
handleAddAttachmentError(result, R.string.type_video);
}
}
- private void addAudio(Uri uri) {
- int result = mWorkingMessage.setAttachment(WorkingMessage.AUDIO, uri, false);
+ private void addAudio(Uri uri, int subId) {
+ int result = mWorkingMessage.setAttachment(WorkingMessage.AUDIO, uri, false, subId);
handleAddAttachmentError(result, R.string.type_audio);
}
@@ -3329,8 +3339,8 @@ public class ComposeMessageActivity extends Activity
}
if (uri != null) {
- mWorkingMessage = WorkingMessage.load(this, uri);
- mWorkingMessage.setSubject(intent.getStringExtra("subject"), false);
+ mWorkingMessage = WorkingMessage.load(this, uri, mSelectedSubId);
+ mWorkingMessage.setSubject(intent.getStringExtra("subject"), false, mSelectedSubId);
} else {
mWorkingMessage.setText(intent.getStringExtra("sms_body"));
}
@@ -3415,7 +3425,7 @@ public class ComposeMessageActivity extends Activity
addImage(uri, append);
} else if (type.startsWith("video/") ||
(wildcard && uri.toString().startsWith(mVideoUri))) {
- addVideo(uri, append);
+ addVideo(uri, append, mSelectedSubId);
}
}
}
@@ -3492,7 +3502,7 @@ public class ComposeMessageActivity extends Activity
intent.addCategory("android.intent.category.DEFAULT");
intent.setType(Phone.CONTENT_TYPE);
// We have to wait for the constructing complete.
- ContactList contacts = mRecipientsEditor.constructContactsFromInput(true);
+ ContactList contacts = mRecipientsEditor.constructContactsFromInput(true, mSelectedSubId);
int urisCount = 0;
Uri[] uris = new Uri[contacts.size()];
urisCount = 0;
@@ -3578,7 +3588,7 @@ public class ComposeMessageActivity extends Activity
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
- mWorkingMessage.setSubject(s, true);
+ mWorkingMessage.setSubject(s, true, mSelectedSubId);
updateSendButtonState();
}
@@ -3627,8 +3637,11 @@ public class ComposeMessageActivity extends Activity
mTextEditor = (EditText) findViewById(R.id.embedded_text_editor);
mTextEditor.setOnEditorActionListener(this);
mTextEditor.addTextChangedListener(mTextEditorWatcher);
- mTextEditor.setFilters(new InputFilter[] {
- new LengthFilter(MmsConfig.getMaxTextLimit())});
+ final int maxLengthText = MmsConfig.getInt(mSelectedSubId,
+ SmsManager.MMS_CONFIG_MESSAGE_TEXT_MAX_SIZE);
+ if (maxLengthText > 0) {
+ mTextEditor.setFilters(new InputFilter[] {new LengthFilter(maxLengthText)});
+ }
mTextCounter = (TextView) findViewById(R.id.text_counter);
mSendButtonMms = (TextView) findViewById(R.id.send_button_mms);
@@ -3774,11 +3787,12 @@ public class ComposeMessageActivity extends Activity
drawBottomPanel();
updateSendButtonState();
}
- });
+ },
+ mSelectedSubId);
// WorkingMessage.loadDraft() can return a new WorkingMessage object that doesn't
// have its conversation set. Make sure it is set.
- mWorkingMessage.setConversation(mConversation);
+ mWorkingMessage.setConversation(mConversation, mSelectedSubId);
return true;
}
@@ -3804,7 +3818,7 @@ public class ComposeMessageActivity extends Activity
return;
}
- mWorkingMessage.saveDraft(isStopping);
+ mWorkingMessage.saveDraft(isStopping, mSelectedSubId);
if (mToastForDraftSave) {
Toast.makeText(this, R.string.message_saved_as_draft,
@@ -3816,7 +3830,8 @@ public class ComposeMessageActivity extends Activity
int recipientCount = recipientCount();
return recipientCount > 0 &&
- recipientCount <= MmsConfig.getRecipientLimit() &&
+ recipientCount <=
+ MmsConfig.getInt(mSelectedSubId, SmsManager.MMS_CONFIG_RECIPIENT_LIMIT) &&
mIsSmsEnabled &&
(mWorkingMessage.hasAttachment() || mWorkingMessage.hasText() ||
mWorkingMessage.hasSubject());
@@ -3864,15 +3879,16 @@ public class ComposeMessageActivity extends Activity
if (!mSendingMessage) {
if (LogTag.SEVERE_WARNING) {
- String sendingRecipients = mConversation.getRecipients().serialize();
+ String sendingRecipients = mConversation.getRecipients().serialize(mSelectedSubId);
if (!sendingRecipients.equals(mDebugRecipients)) {
- String workingRecipients = mWorkingMessage.getWorkingRecipients();
+ String workingRecipients = mWorkingMessage.getWorkingRecipients(mSelectedSubId);
if (!mDebugRecipients.equals(workingRecipients)) {
LogTag.warnPossibleRecipientMismatch("ComposeMessageActivity.sendMessage" +
" recipients in window: \"" +
mDebugRecipients + "\" differ from recipients from conv: \"" +
sendingRecipients + "\" and working recipients: " +
- workingRecipients, this);
+ workingRecipients, this,
+ mSelectedSubId);
}
}
sanityCheckConversation();
@@ -3922,7 +3938,7 @@ public class ComposeMessageActivity extends Activity
mWorkingMessage.clearConversation(mConversation, false);
mWorkingMessage = WorkingMessage.createEmpty(this);
- mWorkingMessage.setConversation(mConversation);
+ mWorkingMessage.setConversation(mConversation, mSelectedSubId);
hideRecipientEditor();
drawBottomPanel();
@@ -3996,7 +4012,8 @@ public class ComposeMessageActivity extends Activity
if (LogTag.VERBOSE) log("get mConversation by recipients " + recipients);
mConversation = Conversation.get(this,
ContactList.getByNumbers(recipients,
- false /* don't block */, true /* replace number */), false);
+ false /* don't block */, true /* replace number */, mSelectedSubId),
+ false, mSelectedSubId);
addRecipientsListeners();
mSendDiscreetMode = bundle.getBoolean(KEY_EXIT_ON_SENT, false);
mForwardMessageMode = bundle.getBoolean(KEY_FORWARDED_MESSAGE, false);
@@ -4004,7 +4021,7 @@ public class ComposeMessageActivity extends Activity
if (mSendDiscreetMode) {
mMsgListView.setVisibility(View.INVISIBLE);
}
- mWorkingMessage.readStateFromBundle(bundle);
+ mWorkingMessage.readStateFromBundle(bundle, mSelectedSubId);
return;
}
@@ -4019,7 +4036,7 @@ public class ComposeMessageActivity extends Activity
if (intentData != null) {
// try to get a conversation based on the data URI passed to our intent.
if (LogTag.VERBOSE) log("get mConversation by intentData " + intentData);
- mConversation = Conversation.get(this, intentData, false);
+ mConversation = Conversation.get(this, intentData, false, mSelectedSubId);
mWorkingMessage.setText(getBody(intentData));
} else {
// special intent extra parameter to specify the address
@@ -4027,7 +4044,8 @@ public class ComposeMessageActivity extends Activity
if (!TextUtils.isEmpty(address)) {
if (LogTag.VERBOSE) log("get mConversation by address " + address);
mConversation = Conversation.get(this, ContactList.getByNumbers(address,
- false /* don't block */, true /* replace number */), false);
+ false /* don't block */, true /* replace number */, mSelectedSubId),
+ false, mSelectedSubId);
} else {
if (LogTag.VERBOSE) log("create new conversation");
mConversation = Conversation.createNew(this);
@@ -4045,7 +4063,7 @@ public class ComposeMessageActivity extends Activity
if (intent.hasExtra("sms_body")) {
mWorkingMessage.setText(intent.getStringExtra("sms_body"));
}
- mWorkingMessage.setSubject(intent.getStringExtra("subject"), false);
+ mWorkingMessage.setSubject(intent.getStringExtra("subject"), false, mSelectedSubId);
}
private void initFocus() {
@@ -4376,7 +4394,7 @@ public class ComposeMessageActivity extends Activity
// when we init all Conversations below.
if (recipients != null) {
for (Contact contact : recipients) {
- contact.removeFromCache();
+ contact.removeFromCache(mSelectedSubId);
}
}
@@ -4399,7 +4417,8 @@ public class ComposeMessageActivity extends Activity
@Override
public void run() {
ContactList recipients = isRecipientsEditorVisible() ?
- mRecipientsEditor.constructContactsFromInput(false) : getRecipients();
+ mRecipientsEditor.constructContactsFromInput(false, mSelectedSubId) :
+ getRecipients();
if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
log("[CMA] onUpdate contact updated: " + updated);
log("[CMA] onUpdate recipients: " + recipients);
diff --git a/src/com/android/mms/ui/ConversationList.java b/src/com/android/mms/ui/ConversationList.java
index 316f42ed..80d337a4 100644
--- a/src/com/android/mms/ui/ConversationList.java
+++ b/src/com/android/mms/ui/ConversationList.java
@@ -47,6 +47,7 @@ import android.provider.ContactsContract.Contacts;
import android.provider.Telephony;
import android.provider.Telephony.Mms;
import android.provider.Telephony.Threads;
+import android.telephony.SubscriptionManager;
import android.util.Log;
import android.view.ActionMode;
import android.view.ContextMenu;
@@ -81,6 +82,7 @@ import com.android.mms.transaction.SmsRejectedReceiver;
import com.android.mms.util.DraftCache;
import com.android.mms.util.Recycler;
import com.android.mms.widget.MmsWidgetProvider;
+
import com.google.android.mms.pdu.PduHeaders;
import java.util.ArrayList;
@@ -200,7 +202,7 @@ public class ConversationList extends ListActivity implements DraftCache.OnDraft
@Override
protected void onResume() {
super.onResume();
- boolean isSmsEnabled = MmsConfig.isSmsEnabled(this);
+ boolean isSmsEnabled = MmsConfig.isSmsEnabled();
if (isSmsEnabled != mIsSmsEnabled) {
mIsSmsEnabled = isSmsEnabled;
invalidateOptionsMenu();
@@ -215,7 +217,7 @@ public class ConversationList extends ListActivity implements DraftCache.OnDraft
}
// Show or hide the SMS promo banner
- if (mIsSmsEnabled || MmsConfig.isSmsPromoDismissed(this)) {
+ if (mIsSmsEnabled || MmsConfig.isSmsPromoDismissed()) {
mSmsPromoBannerView.setVisibility(View.GONE);
} else {
initSmsPromoBanner();
@@ -561,7 +563,7 @@ public class ConversationList extends ListActivity implements DraftCache.OnDraft
startActivityIfNeeded(intent, -1);
break;
case R.id.action_debug_dump:
- LogTag.dumpInternalTables(this);
+ LogTag.dumpInternalTables(this, SubscriptionManager.getDefaultSmsSubId());
break;
case R.id.action_cell_broadcasts:
Intent cellBroadcastIntent = new Intent(Intent.ACTION_MAIN);
@@ -957,7 +959,7 @@ public class ConversationList extends ListActivity implements DraftCache.OnDraft
if (conv != null) {
ContactList recipients = conv.getRecipients();
for (Contact contact : recipients) {
- contact.removeFromCache();
+ contact.removeFromCache(SubscriptionManager.getDefaultSmsSubId());
}
}
}
diff --git a/src/com/android/mms/ui/DeliveryReportActivity.java b/src/com/android/mms/ui/DeliveryReportActivity.java
index a08b4c95..18ba1809 100644
--- a/src/com/android/mms/ui/DeliveryReportActivity.java
+++ b/src/com/android/mms/ui/DeliveryReportActivity.java
@@ -33,6 +33,7 @@ import android.os.Bundle;
import android.provider.Telephony.Mms;
import android.provider.Telephony.Sms;
import android.telephony.PhoneNumberUtils;
+import android.telephony.SubscriptionManager;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
@@ -70,14 +71,16 @@ public class DeliveryReportActivity extends ListActivity {
static final String[] MMS_REPORT_STATUS_PROJECTION = new String[] {
Mms.Addr.ADDRESS, //0
"delivery_status", //1
- "read_status" //2
+ "read_status", //2
+ Mms.SUB_ID //3
};
static final String[] SMS_REPORT_STATUS_PROJECTION = new String[] {
Sms.ADDRESS, //0
Sms.STATUS, //1
Sms.DATE_SENT, //2
- Sms.TYPE //3
+ Sms.SUB_ID, //3
+ Sms.TYPE //4
};
// These indices must sync up with the projections above.
@@ -87,7 +90,8 @@ public class DeliveryReportActivity extends ListActivity {
static final int COLUMN_DELIVERY_STATUS = 1;
static final int COLUMN_READ_STATUS = 2;
static final int COLUMN_DATE_SENT = 2;
- static final int COLUMN_MESSAGE_TYPE = 3;
+ static final int COLUMN_SUB_ID = 3;
+ static final int COLUMN_MESSAGE_TYPE = 4;
private long mMessageId;
private String mMessageType;
@@ -117,7 +121,8 @@ public class DeliveryReportActivity extends ListActivity {
List<DeliveryReportItem> items = getReportItems();
if (items == null) {
items = new ArrayList<DeliveryReportItem>(1);
- items.add(new DeliveryReportItem("", getString(R.string.status_none), null));
+ items.add(new DeliveryReportItem("", getString(R.string.status_none), null,
+ SubscriptionManager.DEFAULT_SUB_ID));
Log.w(LOG_TAG, "cursor == null");
}
setListAdapter(new DeliveryReportAdapter(this, items));
@@ -190,6 +195,7 @@ public class DeliveryReportActivity extends ListActivity {
// date_sent column (see MessageStatusReceiver).
String deliveryDateString = null;
long deliveryDate = c.getLong(COLUMN_DATE_SENT);
+ int subId = c.getInt(COLUMN_SUB_ID);
int messageType = c.getInt(COLUMN_MESSAGE_TYPE);
if (messageType == Sms.MESSAGE_TYPE_SENT && deliveryDate > 0) {
deliveryDateString = getString(R.string.delivered_label) +
@@ -201,7 +207,7 @@ public class DeliveryReportActivity extends ListActivity {
getString(R.string.recipient_label) + c.getString(COLUMN_RECIPIENT),
getString(R.string.status_label) +
getSmsStatusText(c.getInt(COLUMN_DELIVERY_STATUS)),
- deliveryDateString));
+ deliveryDateString, subId));
}
return items;
} finally {
@@ -284,7 +290,8 @@ public class DeliveryReportActivity extends ListActivity {
String statusText = getString(R.string.status_label) +
getMmsReportStatusText(reportReq, reportStatus);
items.add(new DeliveryReportItem(getString(R.string.recipient_label) +
- reportReq.getRecipient(), statusText, null));
+ reportReq.getRecipient(), statusText, null,
+ SubscriptionManager.DEFAULT_SUB_ID));
}
return items;
}
diff --git a/src/com/android/mms/ui/DeliveryReportAdapter.java b/src/com/android/mms/ui/DeliveryReportAdapter.java
index ef5fc34a..3ae90dab 100644
--- a/src/com/android/mms/ui/DeliveryReportAdapter.java
+++ b/src/com/android/mms/ui/DeliveryReportAdapter.java
@@ -54,7 +54,7 @@ public class DeliveryReportAdapter extends ArrayAdapter<DeliveryReportItem> {
}
}
- listItem.bind(item.recipient, item.status, item.deliveryDate);
+ listItem.bind(item.recipient, item.status, item.deliveryDate, item.subId);
return listItem;
}
diff --git a/src/com/android/mms/ui/DeliveryReportItem.java b/src/com/android/mms/ui/DeliveryReportItem.java
index e288b86d..cb04f489 100644
--- a/src/com/android/mms/ui/DeliveryReportItem.java
+++ b/src/com/android/mms/ui/DeliveryReportItem.java
@@ -25,10 +25,12 @@ public class DeliveryReportItem {
String recipient;
String status;
String deliveryDate;
+ int subId;
- public DeliveryReportItem(String recipient, String status, String deliveryDate) {
+ public DeliveryReportItem(String recipient, String status, String deliveryDate, int subId) {
this.recipient = recipient;
this.status = status;
this.deliveryDate = deliveryDate;
+ this.subId = subId;
}
}
diff --git a/src/com/android/mms/ui/DeliveryReportListItem.java b/src/com/android/mms/ui/DeliveryReportListItem.java
index 46a9fd97..4eed2306 100644
--- a/src/com/android/mms/ui/DeliveryReportListItem.java
+++ b/src/com/android/mms/ui/DeliveryReportListItem.java
@@ -56,10 +56,10 @@ public class DeliveryReportListItem extends LinearLayout {
super(context, attrs);
}
- public final void bind(String recipient, String status, String deliveryDate) {
+ public final void bind(String recipient, String status, String deliveryDate, int subId) {
// Recipient
if (!TextUtils.isEmpty(recipient)) {
- mRecipientView.setText(Contact.get(recipient, false).getName());
+ mRecipientView.setText(Contact.get(recipient, false, subId).getName());
} else {
mRecipientView.setText("");
}
diff --git a/src/com/android/mms/ui/MessageItem.java b/src/com/android/mms/ui/MessageItem.java
index 275f975f..88dbf997 100755
--- a/src/com/android/mms/ui/MessageItem.java
+++ b/src/com/android/mms/ui/MessageItem.java
@@ -141,6 +141,7 @@ public class MessageItem {
// Set contact and message body
mBoxId = cursor.getInt(columnsMap.mColumnSmsType);
mAddress = cursor.getString(columnsMap.mColumnSmsAddress);
+ mSubId = cursor.getInt(columnsMap.mColumnSmsSubId);
if (Sms.isOutgoingFolder(mBoxId)) {
String meString = context.getString(
R.string.messagelist_sender_self);
@@ -148,7 +149,7 @@ public class MessageItem {
mContact = meString;
} else {
// For incoming messages, the ADDRESS field contains the sender.
- mContact = Contact.get(mAddress, false).getName();
+ mContact = Contact.get(mAddress, false, mSubId).getName();
}
mBody = cursor.getString(columnsMap.mColumnSmsBody);
@@ -161,7 +162,6 @@ public class MessageItem {
mLocked = cursor.getInt(columnsMap.mColumnSmsLocked) != 0;
mErrorCode = cursor.getInt(columnsMap.mColumnSmsErrorCode);
- mSubId = cursor.getInt(columnsMap.mColumnSmsSubId);
} else if ("mms".equals(type)) {
mMessageUri = ContentUris.withAppendedId(Mms.CONTENT_URI, mMsgId);
@@ -212,7 +212,8 @@ public class MessageItem {
// notification system uses.
mAddress = AddressUtils.getFrom(mContext, messageUri);
}
- mContact = TextUtils.isEmpty(mAddress) ? "" : Contact.get(mAddress, false).getName();
+ mContact = TextUtils.isEmpty(mAddress) ? "" :
+ Contact.get(mAddress, false, mSubId).getName();
}
public boolean isMms() {
diff --git a/src/com/android/mms/ui/MessageListAdapter.java b/src/com/android/mms/ui/MessageListAdapter.java
index 4c93f99a..32ca4a90 100755
--- a/src/com/android/mms/ui/MessageListAdapter.java
+++ b/src/com/android/mms/ui/MessageListAdapter.java
@@ -29,6 +29,7 @@ import android.provider.Telephony.MmsSms.PendingMessages;
import android.provider.Telephony.Sms;
import android.provider.Telephony.Sms.Conversations;
import android.provider.Telephony.TextBasedSmsColumns;
+import android.text.TextUtils;
import android.util.Log;
import android.util.LruCache;
import android.view.LayoutInflater;
@@ -312,7 +313,8 @@ public class MessageListAdapter extends CursorAdapter {
if (cursor.moveToFirst()) {
do {
long id = cursor.getLong(mRowIDColumn);
- if (id == item.mMsgId) {
+ String type = cursor.getString(mColumnsMap.mColumnMsgType);
+ if (id == item.mMsgId && TextUtils.equals(type, item.mType)) {
return cursor;
}
} while (cursor.moveToNext());
diff --git a/src/com/android/mms/ui/MessageListItem.java b/src/com/android/mms/ui/MessageListItem.java
index b7a10b5e..44c9fc90 100644
--- a/src/com/android/mms/ui/MessageListItem.java
+++ b/src/com/android/mms/ui/MessageListItem.java
@@ -38,6 +38,7 @@ import android.provider.ContactsContract.Profile;
import android.provider.Telephony.Sms;
import android.provider.Telephony.Mms;
import android.telephony.PhoneNumberUtils;
+import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.text.Html;
import android.text.Spannable;
@@ -272,7 +273,8 @@ public class MessageListItem extends LinearLayout implements
intent.putExtra(PhoneConstants.SUBSCRIPTION_KEY, subId);
mContext.startService(intent);
DownloadManager.getInstance().markState(
- mMessageItem.mMessageUri, DownloadManager.STATE_PRE_DOWNLOADING);
+ mMessageItem.mMessageUri, DownloadManager.STATE_PRE_DOWNLOADING,
+ subId);
}
});
break;
@@ -304,7 +306,8 @@ public class MessageListItem extends LinearLayout implements
private void updateAvatarView(String addr, boolean isSelf) {
Drawable avatarDrawable;
if (isSelf || !TextUtils.isEmpty(addr)) {
- Contact contact = isSelf ? Contact.getMe(false) : Contact.get(addr, false);
+ Contact contact = isSelf ? Contact.getMe(false, mMessageItem.mSubId) :
+ Contact.get(addr, false, mMessageItem.mSubId);
avatarDrawable = contact.getAvatar(mContext, sDefaultContactImage);
if (isSelf) {
diff --git a/src/com/android/mms/ui/MessageUtils.java b/src/com/android/mms/ui/MessageUtils.java
index cd126ce7..2ea77b95 100644
--- a/src/com/android/mms/ui/MessageUtils.java
+++ b/src/com/android/mms/ui/MessageUtils.java
@@ -21,6 +21,7 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -44,6 +45,7 @@ import android.os.Handler;
import android.provider.MediaStore;
import android.provider.Telephony.Mms;
import android.provider.Telephony.Sms;
+import android.telephony.SmsManager;
import android.telephony.SubInfoRecord;
import android.telephony.SubscriptionManager;
import android.telephony.PhoneNumberUtils;
@@ -68,6 +70,7 @@ import com.android.mms.model.SlideModel;
import com.android.mms.model.SlideshowModel;
import com.android.mms.transaction.MmsMessageSender;
import com.android.mms.util.AddressUtils;
+
import com.google.android.mms.ContentType;
import com.google.android.mms.MmsException;
import com.google.android.mms.pdu.CharacterSets;
@@ -90,7 +93,6 @@ public class MessageUtils {
}
private static final String TAG = LogTag.TAG;
- private static String sLocalNumber;
private static String[] sNoSubjectStrings;
// Cache of both groups of space-separated ids to their full
@@ -661,8 +663,8 @@ public class MessageUtils {
final PduPart part;
try {
UriImage image = new UriImage(context, imageUri);
- int widthLimit = MmsConfig.getMaxImageWidth();
- int heightLimit = MmsConfig.getMaxImageHeight();
+ int widthLimit = MmsConfig.getInt(SmsManager.MMS_CONFIG_MAX_IMAGE_WIDTH);
+ int heightLimit = MmsConfig.getInt(SmsManager.MMS_CONFIG_MAX_IMAGE_HEIGHT);
// In mms_config.xml, the max width has always been declared larger than the max
// height. Swap the width and height limits if necessary so we scale the picture
// as little as possible.
@@ -675,7 +677,8 @@ public class MessageUtils {
part = image.getResizedImageAsPart(
widthLimit,
heightLimit,
- MmsConfig.getMaxMessageSize() - MESSAGE_OVERHEAD);
+ MmsConfig.getInt(SmsManager.MMS_CONFIG_MAX_MESSAGE_SIZE) -
+ MESSAGE_OVERHEAD);
} finally {
// Cancel pending show of the progress toast if necessary.
handler.removeCallbacks(showProgress);
@@ -700,14 +703,15 @@ public class MessageUtils {
.show();
}
- public static String getLocalNumber() {
- if (null == sLocalNumber) {
- sLocalNumber = MmsApp.getApplication().getTelephonyManager().getLine1Number();
+ public static String getLocalNumber(int subId) {
+ final boolean validSubId = SubscriptionManager.isUsableSubIdValue(subId);
+ if (!validSubId) {
+ subId = SubscriptionManager.getDefaultSmsSubId();
}
- return sLocalNumber;
+ return MmsApp.getApplication().getTelephonyManager().getLine1NumberForSubscriber(subId);
}
- public static boolean isLocalNumber(String number) {
+ public static boolean isLocalNumber(String number, int subId) {
if (number == null) {
return false;
}
@@ -720,7 +724,17 @@ public class MessageUtils {
return false;
}
- return PhoneNumberUtils.compare(number, getLocalNumber());
+ return PhoneNumberUtils.compare(number, getLocalNumber(subId));
+ }
+
+ public static boolean simHasNumber() {
+ List<SubInfoRecord> subList = SubscriptionManager.getActiveSubInfoList();
+ for (SubInfoRecord sub : subList) {
+ if (!TextUtils.isEmpty(sub.number)) {
+ return true;
+ }
+ }
+ return false;
}
public static void handleReadReport(final Context context,
@@ -947,14 +961,15 @@ public class MessageUtils {
// An alias (or commonly called "nickname") is:
// Nickname must begin with a letter.
// Only letters a-z, numbers 0-9, or . are allowed in Nickname field.
- public static boolean isAlias(String string) {
- if (!MmsConfig.isAliasEnabled()) {
+ public static boolean isAlias(String string, int subId) {
+ if (!MmsConfig.getBoolean(subId, SmsManager.MMS_CONFIG_ALIAS_ENABLED)) {
return false;
}
int len = string == null ? 0 : string.length();
- if (len < MmsConfig.getAliasMinChars() || len > MmsConfig.getAliasMaxChars()) {
+ if (len < MmsConfig.getInt(subId, SmsManager.MMS_CONFIG_ALIAS_MIN_CHARS) ||
+ len > MmsConfig.getInt(subId, SmsManager.MMS_CONFIG_ALIAS_MAX_CHARS)) {
return false;
}
@@ -1004,8 +1019,8 @@ public class MessageUtils {
/**
* Returns true if the address passed in is a valid MMS address.
*/
- public static boolean isValidMmsAddress(String address) {
- String retVal = parseMmsAddress(address);
+ public static boolean isValidMmsAddress(String address, int subId) {
+ String retVal = parseMmsAddress(address, subId);
return (retVal != null);
}
@@ -1015,7 +1030,7 @@ public class MessageUtils {
* - if the address can be parsed into a valid MMS phone number, return the parsed number.
* - if the address is a compliant alias address, leave it as is.
*/
- public static String parseMmsAddress(String address) {
+ public static String parseMmsAddress(String address, int subId) {
// if it's a valid Email address, use that.
if (Mms.isEmailAddress(address)) {
return address;
@@ -1028,7 +1043,7 @@ public class MessageUtils {
}
// if it's an alias compliant address, use that.
- if (isAlias(address)) {
+ if (isAlias(address, subId)) {
return address;
}
diff --git a/src/com/android/mms/ui/MessagingPreferenceActivity.java b/src/com/android/mms/ui/MessagingPreferenceActivity.java
index bf2052d4..993c01ef 100644
--- a/src/com/android/mms/ui/MessagingPreferenceActivity.java
+++ b/src/com/android/mms/ui/MessagingPreferenceActivity.java
@@ -40,6 +40,7 @@ import android.preference.PreferenceScreen;
import android.preference.RingtonePreference;
import android.provider.SearchRecentSuggestions;
import android.provider.Telephony;
+import android.telephony.SmsManager;
import android.telephony.SubInfoRecord;
import android.telephony.SubscriptionManager;
import android.text.TextUtils;
@@ -127,7 +128,7 @@ public class MessagingPreferenceActivity extends PreferenceActivity
@Override
protected void onResume() {
super.onResume();
- boolean isSmsEnabled = MmsConfig.isSmsEnabled(this);
+ boolean isSmsEnabled = MmsConfig.isSmsEnabled();
if (isSmsEnabled != mIsSmsEnabled) {
mIsSmsEnabled = isSmsEnabled;
invalidateOptionsMenu();
@@ -229,6 +230,19 @@ public class MessagingPreferenceActivity extends PreferenceActivity
return subInfoRecords != null ? subInfoRecords.size() : 0;
}
+ private static boolean isAnySubscriptionValueSet(String configValue) {
+ List<SubInfoRecord> subInfoRecords = SubscriptionManager.getActiveSubInfoList();
+ if (subInfoRecords == null) {
+ return false;
+ }
+ for (final SubInfoRecord subInfo : subInfoRecords) {
+ if (MmsConfig.getBoolean(subInfo.subId, configValue)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
private void restoreDefaultPreferences() {
PreferenceManager.getDefaultSharedPreferences(this).edit().clear().apply();
setPreferenceScreen(null);
@@ -251,28 +265,28 @@ public class MessagingPreferenceActivity extends PreferenceActivity
mSmsPrefCategory.removePreference(mManageSimPref);
}
- if (!MmsConfig.getSMSDeliveryReportsEnabled()) {
+ if (!isAnySubscriptionValueSet(SmsManager.MMS_CONFIG_SMS_DELIVERY_REPORT_ENABLED)) {
mSmsPrefCategory.removePreference(mSmsDeliveryReportPref);
if (!isHasActivatedSub) {
getPreferenceScreen().removePreference(mSmsPrefCategory);
}
}
- if (!MmsConfig.getMmsEnabled()) {
+ if (!isAnySubscriptionValueSet(SmsManager.MMS_CONFIG_MMS_ENABLED)) {
// No Mms, remove all the mms-related preferences
getPreferenceScreen().removePreference(mMmsPrefCategory);
mStoragePrefCategory.removePreference(findPreference("pref_key_mms_delete_limit"));
} else {
- if (!MmsConfig.getMMSDeliveryReportsEnabled()) {
+ if (!MmsConfig.getBoolean(SmsManager.MMS_CONFIG_MMS_DELIVERY_REPORT_ENABLED)) {
mMmsPrefCategory.removePreference(mMmsDeliveryReportPref);
}
- if (!MmsConfig.getMMSReadReportsEnabled()) {
+ if (!MmsConfig.getBoolean(SmsManager.MMS_CONFIG_MMS_READ_REPORT_ENABLED)) {
mMmsPrefCategory.removePreference(mMmsReadReportPref);
}
// If the phone's SIM doesn't know it's own number, disable group mms.
- if (!MmsConfig.getGroupMmsEnabled() ||
- TextUtils.isEmpty(MessageUtils.getLocalNumber())) {
+ if (!MmsConfig.getBoolean(SmsManager.MMS_CONFIG_GROUP_MMS_ENABLED) ||
+ !MessageUtils.simHasNumber()) {
mMmsPrefCategory.removePreference(mMmsGroupMmsPref);
}
}
@@ -482,13 +496,13 @@ public class MessagingPreferenceActivity extends PreferenceActivity
// 1. the feature is enabled in mms_config.xml (currently on by default)
// 2. the feature is enabled in the mms settings page
// 3. the SIM knows its own phone number
- public static boolean getIsGroupMmsEnabled(Context context) {
+ public static boolean getIsGroupMmsEnabled(Context context, int subId) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
boolean groupMmsPrefOn = prefs.getBoolean(
MessagingPreferenceActivity.GROUP_MMS_MODE, true);
- return MmsConfig.getGroupMmsEnabled() &&
+ return MmsConfig.getBoolean(SmsManager.MMS_CONFIG_GROUP_MMS_ENABLED) &&
groupMmsPrefOn &&
- !TextUtils.isEmpty(MessageUtils.getLocalNumber());
+ !TextUtils.isEmpty(MessageUtils.getLocalNumber(subId));
}
private boolean hasActivatedSub() {
diff --git a/src/com/android/mms/ui/RecipientsEditor.java b/src/com/android/mms/ui/RecipientsEditor.java
index 4de2118a..820d94ba 100644
--- a/src/com/android/mms/ui/RecipientsEditor.java
+++ b/src/com/android/mms/ui/RecipientsEditor.java
@@ -23,6 +23,8 @@ import java.util.List;
import android.content.Context;
import android.provider.Telephony.Mms;
import android.telephony.PhoneNumberUtils;
+import android.telephony.SmsManager;
+import android.telephony.SubscriptionManager;
import android.text.Annotation;
import android.text.Editable;
import android.text.Layout;
@@ -163,20 +165,20 @@ public class RecipientsEditor extends RecipientEditTextView {
return mTokenizer.getNumbers();
}
- public ContactList constructContactsFromInput(boolean blocking) {
+ public ContactList constructContactsFromInput(boolean blocking, int subId) {
List<String> numbers = mTokenizer.getNumbers();
ContactList list = new ContactList();
for (String number : numbers) {
- Contact contact = Contact.get(number, blocking);
+ Contact contact = Contact.get(number, blocking, subId);
contact.setNumber(number);
list.add(contact);
}
return list;
}
- private boolean isValidAddress(String number, boolean isMms) {
+ private boolean isValidAddress(String number, boolean isMms, int subId) {
if (isMms) {
- return MessageUtils.isValidMmsAddress(number);
+ return MessageUtils.isValidMmsAddress(number, subId);
} else {
// TODO: PhoneNumberUtils.isWellFormedSmsAddress() only check if the number is a valid
// GSM SMS address. If the address contains a dialable char, it considers it a well
@@ -187,20 +189,20 @@ public class RecipientsEditor extends RecipientEditTextView {
}
}
- public boolean hasValidRecipient(boolean isMms) {
+ public boolean hasValidRecipient(boolean isMms, int subId) {
for (String number : mTokenizer.getNumbers()) {
- if (isValidAddress(number, isMms))
+ if (isValidAddress(number, isMms, subId))
return true;
}
return false;
}
- public boolean hasInvalidRecipient(boolean isMms) {
+ public boolean hasInvalidRecipient(boolean isMms, int subId) {
for (String number : mTokenizer.getNumbers()) {
- if (!isValidAddress(number, isMms)) {
- if (MmsConfig.getEmailGateway() == null) {
+ if (!isValidAddress(number, isMms, subId)) {
+ if (MmsConfig.getString(SmsManager.MMS_CONFIG_EMAIL_GATEWAY_NUMBER) == null) {
return true;
- } else if (!MessageUtils.isAlias(number)) {
+ } else if (!MessageUtils.isAlias(number, subId)) {
return true;
}
}
@@ -208,10 +210,10 @@ public class RecipientsEditor extends RecipientEditTextView {
return false;
}
- public String formatInvalidNumbers(boolean isMms) {
+ public String formatInvalidNumbers(boolean isMms, int subId) {
StringBuilder sb = new StringBuilder();
for (String number : mTokenizer.getNumbers()) {
- if (!isValidAddress(number, isMms)) {
+ if (!isValidAddress(number, isMms, subId)) {
if (sb.length() != 0) {
sb.append(", ");
}
@@ -323,7 +325,8 @@ public class RecipientsEditor extends RecipientEditTextView {
if (end != start) {
String number = getNumberAt(getText(), start, end, getContext());
- Contact c = Contact.get(number, false);
+ Contact c = Contact.get(number, false,
+ SubscriptionManager.getDefaultSmsSubId());
return new RecipientContextMenuInfo(c);
}
}
diff --git a/src/com/android/mms/ui/SearchActivity.java b/src/com/android/mms/ui/SearchActivity.java
index e7fe0dd6..23e77f6e 100644
--- a/src/com/android/mms/ui/SearchActivity.java
+++ b/src/com/android/mms/ui/SearchActivity.java
@@ -33,6 +33,7 @@ import android.net.Uri;
import android.os.Bundle;
import android.provider.SearchRecentSuggestions;
import android.provider.Telephony;
+import android.telephony.SubscriptionManager;
import android.text.SpannableString;
import android.text.TextPaint;
import android.text.style.StyleSpan;
@@ -316,7 +317,8 @@ public class SearchActivity extends ListActivity
final TextViewSnippet snippet = (TextViewSnippet)(view.findViewById(R.id.subtitle));
String address = cursor.getString(addressPos);
- Contact contact = address != null ? Contact.get(address, false) : null;
+ Contact contact = address != null ? Contact.get(address, false,
+ SubscriptionManager.getDefaultSmsSubId()) : null;
String titleString = contact != null ? contact.getNameAndNumber() : "";
title.setText(titleString);
diff --git a/src/com/android/mms/ui/SlideEditorActivity.java b/src/com/android/mms/ui/SlideEditorActivity.java
index b9f71823..5d3e2991 100644
--- a/src/com/android/mms/ui/SlideEditorActivity.java
+++ b/src/com/android/mms/ui/SlideEditorActivity.java
@@ -29,6 +29,7 @@ import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.provider.Settings;
+import android.telephony.SmsManager;
import android.text.InputFilter;
import android.text.InputFilter.LengthFilter;
import android.text.TextUtils;
@@ -151,8 +152,10 @@ public class SlideEditorActivity extends Activity {
mRemoveSlide.setOnClickListener(mOnRemoveSlide);
mTextEditor = (EditText) findViewById(R.id.text_message);
- mTextEditor.setFilters(new InputFilter[] {
- new LengthFilter(MmsConfig.getMaxTextLimit())});
+ final int maxTextLength = MmsConfig.getInt(SmsManager.MMS_CONFIG_MESSAGE_TEXT_MAX_SIZE);
+ if (maxTextLength > 0) {
+ mTextEditor.setFilters(new InputFilter[] {new LengthFilter(maxTextLength)});
+ }
mDone = (Button) findViewById(R.id.done_button);
mDone.setOnClickListener(mDoneClickListener);
@@ -378,7 +381,7 @@ public class SlideEditorActivity extends Activity {
menu.add(0, MENU_DEL_AUDIO, 0, R.string.remove_music).setIcon(
R.drawable.ic_menu_remove_sound);
} else if (!slide.hasVideo()) {
- if (MmsConfig.getAllowAttachAudio()) {
+ if (MmsConfig.getBoolean(SmsManager.MMS_CONFIG_ALLOW_ATTACH_AUDIO)) {
SubMenu subMenu = menu.addSubMenu(0, MENU_SUB_AUDIO, 0, R.string.add_music)
.setIcon(R.drawable.ic_menu_add_sound);
subMenu.add(0, MENU_ADD_AUDIO, 0, R.string.attach_sound);
diff --git a/src/com/android/mms/util/DownloadManager.java b/src/com/android/mms/util/DownloadManager.java
index 34c391ea..c1446ccd 100644
--- a/src/com/android/mms/util/DownloadManager.java
+++ b/src/com/android/mms/util/DownloadManager.java
@@ -186,7 +186,7 @@ public class DownloadManager {
return "true".equals(roaming);
}
- public void markState(final Uri uri, int state) {
+ public void markState(final Uri uri, int state, final int subId) {
// Notify user if the message has expired.
try {
NotificationInd nInd = (NotificationInd) PduPersister.getPduPersister(mContext)
@@ -212,7 +212,7 @@ public class DownloadManager {
mHandler.post(new Runnable() {
public void run() {
try {
- Toast.makeText(mContext, getMessage(uri),
+ Toast.makeText(mContext, getMessage(uri, subId),
Toast.LENGTH_LONG).show();
} catch (MmsException e) {
Log.e(TAG, e.getMessage(), e);
@@ -244,7 +244,7 @@ public class DownloadManager {
});
}
- private String getMessage(Uri uri) throws MmsException {
+ private String getMessage(Uri uri, int subId) throws MmsException {
NotificationInd ind = (NotificationInd) PduPersister
.getPduPersister(mContext).load(uri);
@@ -254,7 +254,7 @@ public class DownloadManager {
v = ind.getFrom();
String from = (v != null)
- ? Contact.get(v.getString(), false).getName()
+ ? Contact.get(v.getString(), false, subId).getName()
: mContext.getString(R.string.unknown_sender);
return mContext.getString(R.string.dl_failure_notification, subject, from);
diff --git a/tests/src/com/android/mms/RecyclerTest.java b/tests/src/com/android/mms/RecyclerTest.java
index 2446a26a..e3d79568 100644
--- a/tests/src/com/android/mms/RecyclerTest.java
+++ b/tests/src/com/android/mms/RecyclerTest.java
@@ -22,10 +22,10 @@ import java.util.Random;
import com.android.mms.data.Contact;
import com.android.mms.util.Recycler;
+
import android.provider.Telephony.Sms;
import android.provider.Telephony.Threads;
import android.provider.Telephony.Sms.Inbox;
-
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
@@ -35,6 +35,7 @@ import android.database.sqlite.SQLiteException;
import android.database.sqlite.SqliteWrapper;
import android.net.Uri;
import android.provider.Telephony.Sms.Conversations;
+import android.telephony.SubscriptionManager;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.LargeTest;
import android.util.Log;
@@ -159,7 +160,7 @@ public class RecyclerTest extends AndroidTestCase {
// Make sure we've got a thread id so after the insert we'll be able to delete
// excess messages.
Long threadId = 0L;
- Contact cacheContact = Contact.get(address,true);
+ Contact cacheContact = Contact.get(address, true, SubscriptionManager.DEFAULT_SUB_ID);
if (cacheContact != null) {
address = cacheContact.getNumber();
}
diff --git a/tests/src/com/android/mms/ui/ComposeMessageActivityTests.java b/tests/src/com/android/mms/ui/ComposeMessageActivityTests.java
index ca2fd51a..96c79ba6 100644
--- a/tests/src/com/android/mms/ui/ComposeMessageActivityTests.java
+++ b/tests/src/com/android/mms/ui/ComposeMessageActivityTests.java
@@ -26,6 +26,7 @@ import com.android.mms.ui.MessageListAdapter.ColumnsMap;
import android.content.Context;
import android.database.Cursor;
+import android.telephony.SubscriptionManager;
import android.test.ActivityInstrumentationTestCase2;
import android.test.suitebuilder.annotation.MediumTest;
import android.test.suitebuilder.annotation.SmallTest;
@@ -194,19 +195,23 @@ public class ComposeMessageActivityTests
// the threads directly to the mms provider's threads table.
@LargeTest
public void testCreateManyThreads() {
+ final int subId = SubscriptionManager.getDefaultSmsSubId();
for (int i = 0; i < 10; i++) {
String phoneNum = String.format("424-123-%04d", i);
- ContactList contactList = ContactList.getByNumbers(phoneNum, false, false);
- Conversation conv = Conversation.get(mActivity, contactList, false);
-
- WorkingMessage workingMsg = WorkingMessage.loadDraft(mActivity, conv, null);
- workingMsg.setConversation(conv);
+ ContactList contactList = ContactList.getByNumbers(phoneNum, false, false,
+ SubscriptionManager.DEFAULT_SUB_ID);
+ Conversation conv = Conversation.get(mActivity, contactList, false,
+ SubscriptionManager.DEFAULT_SUB_ID);
+
+ WorkingMessage workingMsg = WorkingMessage.loadDraft(mActivity, conv, null,
+ SubscriptionManager.DEFAULT_SUB_ID);
+ workingMsg.setConversation(conv, subId);
workingMsg.setText("This is test #" + i + " thread id: " + conv.getThreadId());
// Log.i(TAG, "[testCreateManyThreads] workingMsg: ");
// workingMsg.dump();
- workingMsg.saveDraft(false);
+ workingMsg.saveDraft(false, subId);
}
}
}
diff --git a/tests/src/com/android/mms/ui/SmsTest.java b/tests/src/com/android/mms/ui/SmsTest.java
index 89c04c13..56be37ab 100644
--- a/tests/src/com/android/mms/ui/SmsTest.java
+++ b/tests/src/com/android/mms/ui/SmsTest.java
@@ -26,6 +26,7 @@ import com.android.mms.SmsTestRunner;
import android.database.Cursor;
import android.content.Context;
+import android.telephony.SubscriptionManager;
import android.test.ActivityInstrumentationTestCase2;
import android.view.View;
import android.view.ViewStub;
@@ -93,7 +94,7 @@ public class SmsTest
if (mInst.mRecipient != null) {
mRecipient = mInst.mRecipient;
} else {
- mRecipient = getLocalNumber();
+ mRecipient = getLocalNumber(SubscriptionManager.getDefaultSmsSubId());
}
if (mInst.mReceiveTimer > 0) {
mReceiveTimer = mInst.mReceiveTimer;
@@ -208,8 +209,8 @@ public class SmsTest
/**
* @return the local number for this test device
*/
- protected String getLocalNumber() {
- return MessageUtils.getLocalNumber();
+ protected String getLocalNumber(int subId) {
+ return MessageUtils.getLocalNumber(subId);
}
/**
diff --git a/tests/src/com/android/mms/util/VerifyRecipientUnitTests.java b/tests/src/com/android/mms/util/VerifyRecipientUnitTests.java
index 53343b39..1c3c1791 100644
--- a/tests/src/com/android/mms/util/VerifyRecipientUnitTests.java
+++ b/tests/src/com/android/mms/util/VerifyRecipientUnitTests.java
@@ -18,6 +18,7 @@ package com.android.mms.util;
import android.content.Context;
import android.provider.Telephony.Threads;
+import android.telephony.SubscriptionManager;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
@@ -50,11 +51,13 @@ public class VerifyRecipientUnitTests extends AndroidTestCase {
*/
public void testVerifyRecipients() {
assertEquals("Numbers aren't equal",
- Conversation.verifySingleRecipient(getContext(), mThreadId1, "(415) 232-4567"),
+ Conversation.verifySingleRecipient(getContext(), mThreadId1, "(415) 232-4567",
+ SubscriptionManager.DEFAULT_SUB_ID),
"(415) 232-4567");
assertEquals("Numbers aren't equal",
- Conversation.verifySingleRecipient(getContext(), mThreadId1, " 232-4567"),
+ Conversation.verifySingleRecipient(getContext(), mThreadId1, " 232-4567",
+ SubscriptionManager.DEFAULT_SUB_ID),
"232-4567");
}
}