summaryrefslogtreecommitdiffstats
path: root/src/com/android/messaging/sms/MmsConfig.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/messaging/sms/MmsConfig.java')
-rwxr-xr-xsrc/com/android/messaging/sms/MmsConfig.java309
1 files changed, 309 insertions, 0 deletions
diff --git a/src/com/android/messaging/sms/MmsConfig.java b/src/com/android/messaging/sms/MmsConfig.java
new file mode 100755
index 0000000..f13d785
--- /dev/null
+++ b/src/com/android/messaging/sms/MmsConfig.java
@@ -0,0 +1,309 @@
+/*
+ * Copyright (C) 2015 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.messaging.sms;
+
+import android.os.Bundle;
+import android.support.v7.mms.CarrierConfigValuesLoader;
+import android.telephony.SubscriptionInfo;
+
+import com.android.messaging.Factory;
+import com.android.messaging.datamodel.data.ParticipantData;
+import com.android.messaging.util.Assert;
+import com.android.messaging.util.LogUtil;
+import com.android.messaging.util.OsUtil;
+import com.android.messaging.util.PhoneUtils;
+import com.android.messaging.util.SafeAsyncTask;
+import com.google.common.collect.Maps;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * MMS configuration.
+ *
+ * This is now a wrapper around the BugleCarrierConfigValuesLoader, which does
+ * the actual loading and stores the values in a Bundle. This class provides getter
+ * methods for values used in the app, which is easier to use than the raw loader
+ * class.
+ */
+public class MmsConfig {
+ private static final String TAG = LogUtil.BUGLE_TAG;
+
+ private static final int DEFAULT_MAX_TEXT_LENGTH = 2000;
+
+ /*
+ * Key types
+ */
+ public static final String KEY_TYPE_INT = "int";
+ public static final String KEY_TYPE_BOOL = "bool";
+ public static final String KEY_TYPE_STRING = "string";
+
+ private static final Map<String, String> sKeyTypeMap = Maps.newHashMap();
+ static {
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_ENABLED_MMS, KEY_TYPE_BOOL);
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_ENABLED_TRANS_ID, KEY_TYPE_BOOL);
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_ENABLED_NOTIFY_WAP_MMSC, KEY_TYPE_BOOL);
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_ALIAS_ENABLED, KEY_TYPE_BOOL);
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_ALLOW_ATTACH_AUDIO, KEY_TYPE_BOOL);
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_ENABLE_MULTIPART_SMS, KEY_TYPE_BOOL);
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_ENABLE_SMS_DELIVERY_REPORTS,
+ KEY_TYPE_BOOL);
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_ENABLE_GROUP_MMS, KEY_TYPE_BOOL);
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_SUPPORT_MMS_CONTENT_DISPOSITION,
+ KEY_TYPE_BOOL);
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_CELL_BROADCAST_APP_LINKS, KEY_TYPE_BOOL);
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_SEND_MULTIPART_SMS_AS_SEPARATE_MESSAGES,
+ KEY_TYPE_BOOL);
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_ENABLE_MMS_READ_REPORTS, KEY_TYPE_BOOL);
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_ENABLE_MMS_DELIVERY_REPORTS,
+ KEY_TYPE_BOOL);
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_SUPPORT_HTTP_CHARSET_HEADER,
+ KEY_TYPE_BOOL);
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_MAX_MESSAGE_SIZE, KEY_TYPE_INT);
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_MAX_IMAGE_HEIGHT, KEY_TYPE_INT);
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_MAX_IMAGE_WIDTH, KEY_TYPE_INT);
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_RECIPIENT_LIMIT, KEY_TYPE_INT);
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_HTTP_SOCKET_TIMEOUT, KEY_TYPE_INT);
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_ALIAS_MIN_CHARS, KEY_TYPE_INT);
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_ALIAS_MAX_CHARS, KEY_TYPE_INT);
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_SMS_TO_MMS_TEXT_THRESHOLD, KEY_TYPE_INT);
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_SMS_TO_MMS_TEXT_LENGTH_THRESHOLD,
+ KEY_TYPE_INT);
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_MAX_MESSAGE_TEXT_SIZE, KEY_TYPE_INT);
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_MAX_SUBJECT_LENGTH, KEY_TYPE_INT);
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_UA_PROF_TAG_NAME, KEY_TYPE_STRING);
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_HTTP_PARAMS, KEY_TYPE_STRING);
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_EMAIL_GATEWAY_NUMBER, KEY_TYPE_STRING);
+ sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_NAI_SUFFIX, KEY_TYPE_STRING);
+ }
+
+ // A map that stores all MmsConfigs, one per active subscription. For pre-LMSim, this will
+ // contain just one entry with the default self sub id; for LMSim and above, this will contain
+ // all active sub ids but the default subscription id - the default subscription id will be
+ // resolved to an active sub id during runtime.
+ private static final Map<Integer, MmsConfig> sSubIdToMmsConfigMap = Maps.newHashMap();
+ // The fallback values
+ private static final MmsConfig sFallback =
+ new MmsConfig(ParticipantData.DEFAULT_SELF_SUB_ID, new Bundle());
+
+ // Per-subscription configuration values.
+ private final Bundle mValues;
+ private final int mSubId;
+
+ /**
+ * Retrieves the MmsConfig instance associated with the given {@code subId}
+ */
+ public static MmsConfig get(final int subId) {
+ final int realSubId = PhoneUtils.getDefault().getEffectiveSubId(subId);
+ synchronized (sSubIdToMmsConfigMap) {
+ final MmsConfig mmsConfig = sSubIdToMmsConfigMap.get(realSubId);
+ if (mmsConfig == null) {
+ // The subId is no longer valid. Fall back to the default config.
+ LogUtil.e(LogUtil.BUGLE_TAG, "Get mms config failed: invalid subId. subId=" + subId
+ + ", real subId=" + realSubId
+ + ", map=" + sSubIdToMmsConfigMap.keySet());
+ return sFallback;
+ }
+ return mmsConfig;
+ }
+ }
+
+ private MmsConfig(final int subId, final Bundle values) {
+ mSubId = subId;
+ mValues = values;
+ }
+
+ /**
+ * Same as load() but doing it using an async thread from SafeAsyncTask thread pool.
+ */
+ public static void loadAsync() {
+ SafeAsyncTask.executeOnThreadPool(new Runnable() {
+ @Override
+ public void run() {
+ load();
+ }
+ });
+ }
+
+ /**
+ * Reload the device and per-subscription settings.
+ */
+ public static synchronized void load() {
+ final BugleCarrierConfigValuesLoader loader = Factory.get().getCarrierConfigValuesLoader();
+ // Rebuild the entire MmsConfig map.
+ sSubIdToMmsConfigMap.clear();
+ loader.reset();
+ if (OsUtil.isAtLeastL_MR1()) {
+ final List<SubscriptionInfo> subInfoRecords =
+ PhoneUtils.getDefault().toLMr1().getActiveSubscriptionInfoList();
+ if (subInfoRecords == null) {
+ LogUtil.w(TAG, "Loading mms config failed: no active SIM");
+ return;
+ }
+ for (SubscriptionInfo subInfoRecord : subInfoRecords) {
+ final int subId = subInfoRecord.getSubscriptionId();
+ final Bundle values = loader.get(subId);
+ addMmsConfig(new MmsConfig(subId, values));
+ }
+ } else {
+ final Bundle values = loader.get(ParticipantData.DEFAULT_SELF_SUB_ID);
+ addMmsConfig(new MmsConfig(ParticipantData.DEFAULT_SELF_SUB_ID, values));
+ }
+ }
+
+ private static void addMmsConfig(MmsConfig mmsConfig) {
+ Assert.isTrue(OsUtil.isAtLeastL_MR1() !=
+ (mmsConfig.mSubId == ParticipantData.DEFAULT_SELF_SUB_ID));
+ sSubIdToMmsConfigMap.put(mmsConfig.mSubId, mmsConfig);
+ }
+
+ public int getSmsToMmsTextThreshold() {
+ return mValues.getInt(CarrierConfigValuesLoader.CONFIG_SMS_TO_MMS_TEXT_THRESHOLD,
+ CarrierConfigValuesLoader.CONFIG_SMS_TO_MMS_TEXT_THRESHOLD_DEFAULT);
+ }
+
+ public int getSmsToMmsTextLengthThreshold() {
+ return mValues.getInt(CarrierConfigValuesLoader.CONFIG_SMS_TO_MMS_TEXT_LENGTH_THRESHOLD,
+ CarrierConfigValuesLoader.CONFIG_SMS_TO_MMS_TEXT_LENGTH_THRESHOLD_DEFAULT);
+ }
+
+ public int getMaxMessageSize() {
+ return mValues.getInt(CarrierConfigValuesLoader.CONFIG_MAX_MESSAGE_SIZE,
+ CarrierConfigValuesLoader.CONFIG_MAX_MESSAGE_SIZE_DEFAULT);
+ }
+
+ /**
+ * Return the largest MaxMessageSize for any subid
+ */
+ public static int getMaxMaxMessageSize() {
+ int maxMax = 0;
+ for (MmsConfig config : sSubIdToMmsConfigMap.values()) {
+ maxMax = Math.max(maxMax, config.getMaxMessageSize());
+ }
+ return maxMax > 0 ? maxMax : sFallback.getMaxMessageSize();
+ }
+
+ public boolean getTransIdEnabled() {
+ return mValues.getBoolean(CarrierConfigValuesLoader.CONFIG_ENABLED_TRANS_ID,
+ CarrierConfigValuesLoader.CONFIG_ENABLED_TRANS_ID_DEFAULT);
+ }
+
+ public String getEmailGateway() {
+ return mValues.getString(CarrierConfigValuesLoader.CONFIG_EMAIL_GATEWAY_NUMBER,
+ CarrierConfigValuesLoader.CONFIG_EMAIL_GATEWAY_NUMBER_DEFAULT);
+ }
+
+ public int getMaxImageHeight() {
+ return mValues.getInt(CarrierConfigValuesLoader.CONFIG_MAX_IMAGE_HEIGHT,
+ CarrierConfigValuesLoader.CONFIG_MAX_IMAGE_HEIGHT_DEFAULT);
+ }
+
+ public int getMaxImageWidth() {
+ return mValues.getInt(CarrierConfigValuesLoader.CONFIG_MAX_IMAGE_WIDTH,
+ CarrierConfigValuesLoader.CONFIG_MAX_IMAGE_WIDTH_DEFAULT);
+ }
+
+ public int getRecipientLimit() {
+ final int limit = mValues.getInt(CarrierConfigValuesLoader.CONFIG_RECIPIENT_LIMIT,
+ CarrierConfigValuesLoader.CONFIG_RECIPIENT_LIMIT_DEFAULT);
+ return limit < 0 ? Integer.MAX_VALUE : limit;
+ }
+
+ public int getMaxTextLimit() {
+ final int max = mValues.getInt(CarrierConfigValuesLoader.CONFIG_MAX_MESSAGE_TEXT_SIZE,
+ CarrierConfigValuesLoader.CONFIG_MAX_MESSAGE_TEXT_SIZE_DEFAULT);
+ return max > -1 ? max : DEFAULT_MAX_TEXT_LENGTH;
+ }
+
+ public boolean getMultipartSmsEnabled() {
+ return mValues.getBoolean(CarrierConfigValuesLoader.CONFIG_ENABLE_MULTIPART_SMS,
+ CarrierConfigValuesLoader.CONFIG_ENABLE_MULTIPART_SMS_DEFAULT);
+ }
+
+ public boolean getSendMultipartSmsAsSeparateMessages() {
+ return mValues.getBoolean(
+ CarrierConfigValuesLoader.CONFIG_SEND_MULTIPART_SMS_AS_SEPARATE_MESSAGES,
+ CarrierConfigValuesLoader.CONFIG_SEND_MULTIPART_SMS_AS_SEPARATE_MESSAGES_DEFAULT);
+ }
+
+ public boolean getSMSDeliveryReportsEnabled() {
+ return mValues.getBoolean(CarrierConfigValuesLoader.CONFIG_ENABLE_SMS_DELIVERY_REPORTS,
+ CarrierConfigValuesLoader.CONFIG_ENABLE_SMS_DELIVERY_REPORTS_DEFAULT);
+ }
+
+ public boolean getNotifyWapMMSC() {
+ return mValues.getBoolean(CarrierConfigValuesLoader.CONFIG_ENABLED_NOTIFY_WAP_MMSC,
+ CarrierConfigValuesLoader.CONFIG_ENABLED_NOTIFY_WAP_MMSC_DEFAULT);
+ }
+
+ public boolean isAliasEnabled() {
+ return mValues.getBoolean(CarrierConfigValuesLoader.CONFIG_ALIAS_ENABLED,
+ CarrierConfigValuesLoader.CONFIG_ALIAS_ENABLED_DEFAULT);
+ }
+
+ public int getAliasMinChars() {
+ return mValues.getInt(CarrierConfigValuesLoader.CONFIG_ALIAS_MIN_CHARS,
+ CarrierConfigValuesLoader.CONFIG_ALIAS_MIN_CHARS_DEFAULT);
+ }
+
+ public int getAliasMaxChars() {
+ return mValues.getInt(CarrierConfigValuesLoader.CONFIG_ALIAS_MAX_CHARS,
+ CarrierConfigValuesLoader.CONFIG_ALIAS_MAX_CHARS_DEFAULT);
+ }
+
+ public boolean getAllowAttachAudio() {
+ return mValues.getBoolean(CarrierConfigValuesLoader.CONFIG_ALLOW_ATTACH_AUDIO,
+ CarrierConfigValuesLoader.CONFIG_ALLOW_ATTACH_AUDIO_DEFAULT);
+ }
+
+ public int getMaxSubjectLength() {
+ return mValues.getInt(CarrierConfigValuesLoader.CONFIG_MAX_SUBJECT_LENGTH,
+ CarrierConfigValuesLoader.CONFIG_MAX_SUBJECT_LENGTH_DEFAULT);
+ }
+
+ public boolean getGroupMmsEnabled() {
+ return mValues.getBoolean(CarrierConfigValuesLoader.CONFIG_ENABLE_GROUP_MMS,
+ CarrierConfigValuesLoader.CONFIG_ENABLE_GROUP_MMS_DEFAULT);
+ }
+
+ public boolean getSupportMmsContentDisposition() {
+ return mValues.getBoolean(CarrierConfigValuesLoader.CONFIG_SUPPORT_MMS_CONTENT_DISPOSITION,
+ CarrierConfigValuesLoader.CONFIG_SUPPORT_MMS_CONTENT_DISPOSITION_DEFAULT);
+ }
+
+ public boolean getShowCellBroadcast() {
+ return mValues.getBoolean(CarrierConfigValuesLoader.CONFIG_CELL_BROADCAST_APP_LINKS,
+ CarrierConfigValuesLoader.CONFIG_CELL_BROADCAST_APP_LINKS_DEFAULT);
+ }
+
+ public Object getValue(final String key) {
+ return mValues.get(key);
+ }
+
+ public Set<String> keySet() {
+ return mValues.keySet();
+ }
+
+ public static String getKeyType(final String key) {
+ return sKeyTypeMap.get(key);
+ }
+
+ public void update(final String type, final String key, final String value) {
+ BugleCarrierConfigValuesLoader.update(mValues, type, key, value);
+ }
+}