1d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd/*
2d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Copyright (C) 2015 The Android Open Source Project
3d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *
4d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Licensed under the Apache License, Version 2.0 (the "License");
5d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * you may not use this file except in compliance with the License.
6d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * You may obtain a copy of the License at
7d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *
8d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *      http://www.apache.org/licenses/LICENSE-2.0
9d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *
10d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Unless required by applicable law or agreed to in writing, software
11d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * distributed under the License is distributed on an "AS IS" BASIS,
12d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * See the License for the specific language governing permissions and
14d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * limitations under the License.
15d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */
16d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
17d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpackage com.android.messaging.sms;
18d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
19d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.os.Bundle;
20d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.support.v7.mms.CarrierConfigValuesLoader;
21d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.telephony.SubscriptionInfo;
22d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
23d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.Factory;
24d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.ParticipantData;
25d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.Assert;
26d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.LogUtil;
27d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.OsUtil;
28d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.PhoneUtils;
29d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.SafeAsyncTask;
30d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.google.common.collect.Maps;
31d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
32d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport java.util.List;
33d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport java.util.Map;
34d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport java.util.Set;
35d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
36d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd/**
37d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * MMS configuration.
38d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *
39d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * This is now a wrapper around the BugleCarrierConfigValuesLoader, which does
40d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * the actual loading and stores the values in a Bundle. This class provides getter
41d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * methods for values used in the app, which is easier to use than the raw loader
42d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * class.
43d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */
44d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpublic class MmsConfig {
45d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final String TAG = LogUtil.BUGLE_TAG;
46d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
47d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int DEFAULT_MAX_TEXT_LENGTH = 2000;
48d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
49d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /*
50d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Key types
51d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
52d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final String KEY_TYPE_INT = "int";
53d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final String KEY_TYPE_BOOL = "bool";
54d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final String KEY_TYPE_STRING = "string";
55d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
56d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final Map<String, String> sKeyTypeMap = Maps.newHashMap();
57d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    static {
58d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_ENABLED_MMS, KEY_TYPE_BOOL);
59d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_ENABLED_TRANS_ID, KEY_TYPE_BOOL);
60d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_ENABLED_NOTIFY_WAP_MMSC, KEY_TYPE_BOOL);
61d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_ALIAS_ENABLED, KEY_TYPE_BOOL);
62d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_ALLOW_ATTACH_AUDIO, KEY_TYPE_BOOL);
63d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_ENABLE_MULTIPART_SMS, KEY_TYPE_BOOL);
64d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_ENABLE_SMS_DELIVERY_REPORTS,
65d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                KEY_TYPE_BOOL);
66d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_ENABLE_GROUP_MMS, KEY_TYPE_BOOL);
67d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_SUPPORT_MMS_CONTENT_DISPOSITION,
68d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                KEY_TYPE_BOOL);
69d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_CELL_BROADCAST_APP_LINKS, KEY_TYPE_BOOL);
70d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_SEND_MULTIPART_SMS_AS_SEPARATE_MESSAGES,
71d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                KEY_TYPE_BOOL);
72d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_ENABLE_MMS_READ_REPORTS, KEY_TYPE_BOOL);
73d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_ENABLE_MMS_DELIVERY_REPORTS,
74d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                KEY_TYPE_BOOL);
75d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_SUPPORT_HTTP_CHARSET_HEADER,
76d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                KEY_TYPE_BOOL);
77d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_MAX_MESSAGE_SIZE, KEY_TYPE_INT);
78d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_MAX_IMAGE_HEIGHT, KEY_TYPE_INT);
79d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_MAX_IMAGE_WIDTH, KEY_TYPE_INT);
80d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_RECIPIENT_LIMIT, KEY_TYPE_INT);
81d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_HTTP_SOCKET_TIMEOUT, KEY_TYPE_INT);
82d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_ALIAS_MIN_CHARS, KEY_TYPE_INT);
83d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_ALIAS_MAX_CHARS, KEY_TYPE_INT);
84d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_SMS_TO_MMS_TEXT_THRESHOLD, KEY_TYPE_INT);
85d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_SMS_TO_MMS_TEXT_LENGTH_THRESHOLD,
86d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                KEY_TYPE_INT);
87d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_MAX_MESSAGE_TEXT_SIZE, KEY_TYPE_INT);
88d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_MAX_SUBJECT_LENGTH, KEY_TYPE_INT);
89d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_UA_PROF_TAG_NAME, KEY_TYPE_STRING);
90d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_HTTP_PARAMS, KEY_TYPE_STRING);
91d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_EMAIL_GATEWAY_NUMBER, KEY_TYPE_STRING);
92d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sKeyTypeMap.put(CarrierConfigValuesLoader.CONFIG_NAI_SUFFIX, KEY_TYPE_STRING);
93d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
94d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
95d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    // A map that stores all MmsConfigs, one per active subscription. For pre-LMSim, this will
96d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    // contain just one entry with the default self sub id; for LMSim and above, this will contain
97d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    // all active sub ids but the default subscription id - the default subscription id will be
98d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    // resolved to an active sub id during runtime.
99d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final Map<Integer, MmsConfig> sSubIdToMmsConfigMap = Maps.newHashMap();
100d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    // The fallback values
101d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final MmsConfig sFallback =
102d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            new MmsConfig(ParticipantData.DEFAULT_SELF_SUB_ID, new Bundle());
103d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
104d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    // Per-subscription configuration values.
105d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private final Bundle mValues;
106d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private final int mSubId;
107d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
108d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
109d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Retrieves the MmsConfig instance associated with the given {@code subId}
110d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
111d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static MmsConfig get(final int subId) {
112d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final int realSubId = PhoneUtils.getDefault().getEffectiveSubId(subId);
113d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        synchronized (sSubIdToMmsConfigMap) {
114d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final MmsConfig mmsConfig = sSubIdToMmsConfigMap.get(realSubId);
115d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (mmsConfig == null) {
116d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                // The subId is no longer valid. Fall back to the default config.
117d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                LogUtil.e(LogUtil.BUGLE_TAG, "Get mms config failed: invalid subId. subId=" + subId
118d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        + ", real subId=" + realSubId
119d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        + ", map=" + sSubIdToMmsConfigMap.keySet());
120d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                return sFallback;
121d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
122d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return mmsConfig;
123d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
124d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
125d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
126d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private MmsConfig(final int subId, final Bundle values) {
127d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mSubId = subId;
128d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mValues = values;
129d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
130d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
131d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
132d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Same as load() but doing it using an async thread from SafeAsyncTask thread pool.
133d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
134d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static void loadAsync() {
135d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        SafeAsyncTask.executeOnThreadPool(new Runnable() {
136d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            @Override
137d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            public void run() {
138d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                load();
139d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
140d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        });
141d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
142d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
143d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
144d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Reload the device and per-subscription settings.
145d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
146d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static synchronized void load() {
147d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final BugleCarrierConfigValuesLoader loader = Factory.get().getCarrierConfigValuesLoader();
148d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        // Rebuild the entire MmsConfig map.
149d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sSubIdToMmsConfigMap.clear();
150d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        loader.reset();
151d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (OsUtil.isAtLeastL_MR1()) {
152d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final List<SubscriptionInfo> subInfoRecords =
153d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    PhoneUtils.getDefault().toLMr1().getActiveSubscriptionInfoList();
154d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (subInfoRecords == null) {
155d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                LogUtil.w(TAG, "Loading mms config failed: no active SIM");
156d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                return;
157d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
158d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            for (SubscriptionInfo subInfoRecord : subInfoRecords) {
159d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                final int subId = subInfoRecord.getSubscriptionId();
160d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                final Bundle values = loader.get(subId);
161d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                addMmsConfig(new MmsConfig(subId, values));
162d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
163d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        } else {
164d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final Bundle values = loader.get(ParticipantData.DEFAULT_SELF_SUB_ID);
165d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            addMmsConfig(new MmsConfig(ParticipantData.DEFAULT_SELF_SUB_ID, values));
166d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
167d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
168d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
169d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static void addMmsConfig(MmsConfig mmsConfig) {
170d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        Assert.isTrue(OsUtil.isAtLeastL_MR1() !=
171d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                (mmsConfig.mSubId == ParticipantData.DEFAULT_SELF_SUB_ID));
172d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        sSubIdToMmsConfigMap.put(mmsConfig.mSubId, mmsConfig);
173d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
174d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
175d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public int getSmsToMmsTextThreshold() {
176d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mValues.getInt(CarrierConfigValuesLoader.CONFIG_SMS_TO_MMS_TEXT_THRESHOLD,
177d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                CarrierConfigValuesLoader.CONFIG_SMS_TO_MMS_TEXT_THRESHOLD_DEFAULT);
178d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
179d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
180d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public int getSmsToMmsTextLengthThreshold() {
181d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mValues.getInt(CarrierConfigValuesLoader.CONFIG_SMS_TO_MMS_TEXT_LENGTH_THRESHOLD,
182d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                CarrierConfigValuesLoader.CONFIG_SMS_TO_MMS_TEXT_LENGTH_THRESHOLD_DEFAULT);
183d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
184d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
185d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public int getMaxMessageSize() {
186d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mValues.getInt(CarrierConfigValuesLoader.CONFIG_MAX_MESSAGE_SIZE,
187d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                CarrierConfigValuesLoader.CONFIG_MAX_MESSAGE_SIZE_DEFAULT);
188d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
189d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
190d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
191d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Return the largest MaxMessageSize for any subid
192d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
193d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static int getMaxMaxMessageSize() {
194d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        int maxMax = 0;
195d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        for (MmsConfig config : sSubIdToMmsConfigMap.values()) {
196d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            maxMax = Math.max(maxMax, config.getMaxMessageSize());
197d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
198d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return maxMax > 0 ? maxMax : sFallback.getMaxMessageSize();
199d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
200d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
201d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean getTransIdEnabled() {
202d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mValues.getBoolean(CarrierConfigValuesLoader.CONFIG_ENABLED_TRANS_ID,
203d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                CarrierConfigValuesLoader.CONFIG_ENABLED_TRANS_ID_DEFAULT);
204d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
205d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
206d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public String getEmailGateway() {
207d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mValues.getString(CarrierConfigValuesLoader.CONFIG_EMAIL_GATEWAY_NUMBER,
208d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                CarrierConfigValuesLoader.CONFIG_EMAIL_GATEWAY_NUMBER_DEFAULT);
209d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
210d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
211d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public int getMaxImageHeight() {
212d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mValues.getInt(CarrierConfigValuesLoader.CONFIG_MAX_IMAGE_HEIGHT,
213d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                CarrierConfigValuesLoader.CONFIG_MAX_IMAGE_HEIGHT_DEFAULT);
214d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
215d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
216d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public int getMaxImageWidth() {
217d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mValues.getInt(CarrierConfigValuesLoader.CONFIG_MAX_IMAGE_WIDTH,
218d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                CarrierConfigValuesLoader.CONFIG_MAX_IMAGE_WIDTH_DEFAULT);
219d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
220d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
221d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public int getRecipientLimit() {
222d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final int limit = mValues.getInt(CarrierConfigValuesLoader.CONFIG_RECIPIENT_LIMIT,
223d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                CarrierConfigValuesLoader.CONFIG_RECIPIENT_LIMIT_DEFAULT);
224d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return limit < 0 ? Integer.MAX_VALUE : limit;
225d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
226d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
227d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public int getMaxTextLimit() {
228d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final int max = mValues.getInt(CarrierConfigValuesLoader.CONFIG_MAX_MESSAGE_TEXT_SIZE,
229d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                CarrierConfigValuesLoader.CONFIG_MAX_MESSAGE_TEXT_SIZE_DEFAULT);
230d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return max > -1 ? max : DEFAULT_MAX_TEXT_LENGTH;
231d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
232d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
233d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean getMultipartSmsEnabled() {
234d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mValues.getBoolean(CarrierConfigValuesLoader.CONFIG_ENABLE_MULTIPART_SMS,
235d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                CarrierConfigValuesLoader.CONFIG_ENABLE_MULTIPART_SMS_DEFAULT);
236d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
237d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
238d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean getSendMultipartSmsAsSeparateMessages() {
239d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mValues.getBoolean(
240d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                CarrierConfigValuesLoader.CONFIG_SEND_MULTIPART_SMS_AS_SEPARATE_MESSAGES,
241d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                CarrierConfigValuesLoader.CONFIG_SEND_MULTIPART_SMS_AS_SEPARATE_MESSAGES_DEFAULT);
242d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
243d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
244d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean getSMSDeliveryReportsEnabled() {
245d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mValues.getBoolean(CarrierConfigValuesLoader.CONFIG_ENABLE_SMS_DELIVERY_REPORTS,
246d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                CarrierConfigValuesLoader.CONFIG_ENABLE_SMS_DELIVERY_REPORTS_DEFAULT);
247d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
248d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
249d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean getNotifyWapMMSC() {
250d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mValues.getBoolean(CarrierConfigValuesLoader.CONFIG_ENABLED_NOTIFY_WAP_MMSC,
251d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                CarrierConfigValuesLoader.CONFIG_ENABLED_NOTIFY_WAP_MMSC_DEFAULT);
252d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
253d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
254d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean isAliasEnabled() {
255d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mValues.getBoolean(CarrierConfigValuesLoader.CONFIG_ALIAS_ENABLED,
256d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                CarrierConfigValuesLoader.CONFIG_ALIAS_ENABLED_DEFAULT);
257d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
258d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
259d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public int getAliasMinChars() {
260d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mValues.getInt(CarrierConfigValuesLoader.CONFIG_ALIAS_MIN_CHARS,
261d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                CarrierConfigValuesLoader.CONFIG_ALIAS_MIN_CHARS_DEFAULT);
262d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
263d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
264d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public int getAliasMaxChars() {
265d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mValues.getInt(CarrierConfigValuesLoader.CONFIG_ALIAS_MAX_CHARS,
266d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                CarrierConfigValuesLoader.CONFIG_ALIAS_MAX_CHARS_DEFAULT);
267d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
268d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
269d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean getAllowAttachAudio() {
270d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mValues.getBoolean(CarrierConfigValuesLoader.CONFIG_ALLOW_ATTACH_AUDIO,
271d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                CarrierConfigValuesLoader.CONFIG_ALLOW_ATTACH_AUDIO_DEFAULT);
272d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
273d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
274d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public int getMaxSubjectLength() {
275d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mValues.getInt(CarrierConfigValuesLoader.CONFIG_MAX_SUBJECT_LENGTH,
276d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                CarrierConfigValuesLoader.CONFIG_MAX_SUBJECT_LENGTH_DEFAULT);
277d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
278d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
279d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean getGroupMmsEnabled() {
280d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mValues.getBoolean(CarrierConfigValuesLoader.CONFIG_ENABLE_GROUP_MMS,
281d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                CarrierConfigValuesLoader.CONFIG_ENABLE_GROUP_MMS_DEFAULT);
282d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
283d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
284d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean getSupportMmsContentDisposition() {
285d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mValues.getBoolean(CarrierConfigValuesLoader.CONFIG_SUPPORT_MMS_CONTENT_DISPOSITION,
286d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                CarrierConfigValuesLoader.CONFIG_SUPPORT_MMS_CONTENT_DISPOSITION_DEFAULT);
287d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
288d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
289d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean getShowCellBroadcast() {
290d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mValues.getBoolean(CarrierConfigValuesLoader.CONFIG_CELL_BROADCAST_APP_LINKS,
291d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                CarrierConfigValuesLoader.CONFIG_CELL_BROADCAST_APP_LINKS_DEFAULT);
292d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
293d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
294d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public Object getValue(final String key) {
295d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mValues.get(key);
296d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
297d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
298d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public Set<String> keySet() {
299d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mValues.keySet();
300d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
301d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
302d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static String getKeyType(final String key) {
303d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return sKeyTypeMap.get(key);
304d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
305d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
306d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void update(final String type, final String key, final String value) {
307d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        BugleCarrierConfigValuesLoader.update(mValues, type, key, value);
308d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
309d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd}
310