bug #2519304: more verbose logs for sending a MMS. Capture the payload size and mmsc...
[0xdroid:packages_apps_mms.git] / src / com / android / mms / MmsConfig.java
1 /*
2  * Copyright (C) 2009 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package com.android.mms;
18
19 import java.io.IOException;
20
21 import org.xmlpull.v1.XmlPullParser;
22 import org.xmlpull.v1.XmlPullParserException;
23
24 import android.content.Context;
25 import android.content.res.XmlResourceParser;
26 import android.util.Config;
27 import android.util.Log;
28
29 import com.android.internal.util.XmlUtils;
30
31 public class MmsConfig {
32     private static final String TAG = "MmsConfig";
33     private static final boolean DEBUG = false;
34     private static final boolean LOCAL_LOGV = DEBUG ? Config.LOGD : Config.LOGV;
35
36     private static final String DEFAULT_HTTP_KEY_X_WAP_PROFILE = "x-wap-profile";
37     private static final String DEFAULT_USER_AGENT = "Android-Mms/2.0";
38
39     private static final int MAX_IMAGE_HEIGHT = 480;
40     private static final int MAX_IMAGE_WIDTH = 640;
41
42     /**
43      * Whether to hide MMS functionality from the user (i.e. SMS only).
44      */
45     private static boolean mTransIdEnabled = false;
46     private static int mMmsEnabled = 1;                         // default to true
47     private static int mMaxMessageSize = 300 * 1024;            // default to 300k max size
48     private static String mUserAgent = DEFAULT_USER_AGENT;
49     private static String mUaProfTagName = DEFAULT_HTTP_KEY_X_WAP_PROFILE;
50     private static String mUaProfUrl = null;
51     private static String mHttpParams = null;
52     private static String mHttpParamsLine1Key = null;
53     private static String mEmailGateway = null;
54     private static int mMaxImageHeight = MAX_IMAGE_HEIGHT;      // default value
55     private static int mMaxImageWidth = MAX_IMAGE_WIDTH;        // default value
56     private static int mRecipientLimit = Integer.MAX_VALUE;     // default value
57     private static int mDefaultSMSMessagesPerThread = 200;      // default value
58     private static int mDefaultMMSMessagesPerThread = 20;       // default value
59     private static int mMinMessageCountPerThread = 2;           // default value
60     private static int mMaxMessageCountPerThread = 5000;        // default value
61     private static int mSmsToMmsTextThreshold = 4;              // default value
62     private static int mHttpSocketTimeout = 60*1000;            // default to 1 min
63     private static int mMinimumSlideElementDuration = 7;        // default to 7 sec
64     private static boolean mNotifyWapMMSC = false;
65     private static boolean mAllowAttachAudio = true;
66
67     // This is the max amount of storage multiplied by mMaxMessageSize that we
68     // allow of unsent messages before blocking the user from sending any more
69     // MMS's. 
70     private static int mMaxSizeScaleForPendingMmsAllowed = 4;       // default value
71
72     // Email gateway alias support, including the master switch and different rules
73     private static boolean mAliasEnabled = false;
74     private static int mAliasRuleMinChars = 2;
75     private static int mAliasRuleMaxChars = 48;
76
77     public static void init(Context context) {
78         if (LOCAL_LOGV) {
79             Log.v(TAG, "MmsConfig.init()");
80         }
81
82         loadMmsSettings(context);
83     }
84
85     public static boolean getMmsEnabled() {
86         return mMmsEnabled == 1 ? true : false;
87     }
88
89     public static int getMaxMessageSize() {
90         return mMaxMessageSize;
91     }
92
93     /**
94      * This function returns the value of "enabledTransID" present in mms_config file.
95      * In case of single segment wap push message, this "enabledTransID" indicates whether
96      * TransactionID should be appended to URI or not.
97      */
98     public static boolean getTransIdEnabled() {
99         return mTransIdEnabled;
100     }
101
102     public static String getUserAgent() {
103         return mUserAgent;
104     }
105
106     public static String getUaProfTagName() {
107         return mUaProfTagName;
108     }
109
110     public static String getUaProfUrl() {
111         return mUaProfUrl;
112     }
113
114     public static String getHttpParams() {
115         return mHttpParams;
116     }
117
118     public static String getHttpParamsLine1Key() {
119         return mHttpParamsLine1Key;
120     }
121
122     public static String getEmailGateway() {
123         return mEmailGateway;
124     }
125
126     public static int getMaxImageHeight() {
127         return mMaxImageHeight;
128     }
129
130     public static int getMaxImageWidth() {
131         return mMaxImageWidth;
132     }
133
134     public static int getRecipientLimit() {
135         return mRecipientLimit;
136     }
137
138     public static int getDefaultSMSMessagesPerThread() {
139         return mDefaultSMSMessagesPerThread;
140     }
141
142     public static int getDefaultMMSMessagesPerThread() {
143         return mDefaultMMSMessagesPerThread;
144     }
145
146     public static int getMinMessageCountPerThread() {
147         return mMinMessageCountPerThread;
148     }
149
150     public static int getMaxMessageCountPerThread() {
151         return mMaxMessageCountPerThread;
152     }
153
154     public static int getSmsToMmsTextThreshold() {
155         return mSmsToMmsTextThreshold;
156     }
157
158     public static int getHttpSocketTimeout() {
159         return mHttpSocketTimeout;
160     }
161
162     public static int getMinimumSlideElementDuration() {
163         return mMinimumSlideElementDuration;
164     }
165
166     public static boolean getNotifyWapMMSC() {
167         return mNotifyWapMMSC;
168     }
169
170     public static int getMaxSizeScaleForPendingMmsAllowed() {
171         return mMaxSizeScaleForPendingMmsAllowed;
172     }
173
174     public static boolean isAliasEnabled() {
175         return mAliasEnabled;
176     }
177
178     public static int getAliasMinChars() {
179         return mAliasRuleMinChars;
180     }
181
182     public static int getAliasMaxChars() {
183         return mAliasRuleMaxChars;
184     }
185
186     public static boolean getAllowAttachAudio() {
187         return mAllowAttachAudio;
188     }
189
190     private static void loadMmsSettings(Context context) {
191         XmlResourceParser parser = context.getResources().getXml(R.xml.mms_config);
192
193         try {
194             XmlUtils.beginDocument(parser, "mms_config");
195
196             while (true) {
197                 XmlUtils.nextElement(parser);
198                 String tag = parser.getName();
199                 if (tag == null) {
200                     break;
201                 }
202                 String name = parser.getAttributeName(0);
203                 String value = parser.getAttributeValue(0);
204                 String text = null;
205                 if (parser.next() == XmlPullParser.TEXT) {
206                     text = parser.getText();
207                 }
208
209                 if (DEBUG) {
210                     Log.v(TAG, "tag: " + tag + " value: " + value);
211                 }
212                 if ("name".equalsIgnoreCase(name)) {
213                     if ("bool".equals(tag)) {
214                         // bool config tags go here
215                         if ("enabledMMS".equalsIgnoreCase(value)) {
216                             mMmsEnabled = "true".equalsIgnoreCase(text) ? 1 : 0;
217                         } else if ("enabledTransID".equalsIgnoreCase(value)) {
218                             mTransIdEnabled = "true".equalsIgnoreCase(text);
219                         } else if ("enabledNotifyWapMMSC".equalsIgnoreCase(value)) {
220                             mNotifyWapMMSC = "true".equalsIgnoreCase(text);
221                         } else if ("aliasEnabled".equalsIgnoreCase(value)) {
222                             mAliasEnabled = "true".equalsIgnoreCase(text);
223                         } else if ("allowAttachAudio".equalsIgnoreCase(value)) {
224                             mAllowAttachAudio = "true".equalsIgnoreCase(text);
225                         }
226                     } else if ("int".equals(tag)) {
227                         // int config tags go here
228                         if ("maxMessageSize".equalsIgnoreCase(value)) {
229                             mMaxMessageSize = Integer.parseInt(text);
230                             if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
231                                 Log.d(LogTag.APP, "MmsConfig: MAX MESSAGE SIZE is " +
232                                         mMaxMessageSize);
233                             }
234                         } else if ("maxImageHeight".equalsIgnoreCase(value)) {
235                             mMaxImageHeight = Integer.parseInt(text);
236                         } else if ("maxImageWidth".equalsIgnoreCase(value)) {
237                             mMaxImageWidth = Integer.parseInt(text);
238                         } else if ("defaultSMSMessagesPerThread".equalsIgnoreCase(value)) {
239                             mDefaultSMSMessagesPerThread = Integer.parseInt(text);
240                         } else if ("defaultMMSMessagesPerThread".equalsIgnoreCase(value)) {
241                             mDefaultMMSMessagesPerThread = Integer.parseInt(text);
242                         } else if ("minMessageCountPerThread".equalsIgnoreCase(value)) {
243                             mMinMessageCountPerThread = Integer.parseInt(text);
244                         } else if ("maxMessageCountPerThread".equalsIgnoreCase(value)) {
245                             mMaxMessageCountPerThread = Integer.parseInt(text);
246                         } else if ("smsToMmsTextThreshold".equalsIgnoreCase(value)) {
247                             mSmsToMmsTextThreshold = Integer.parseInt(text);
248                         } else if ("recipientLimit".equalsIgnoreCase(value)) {
249                             mRecipientLimit = Integer.parseInt(text);
250                             if (mRecipientLimit < 0) {
251                                 mRecipientLimit = Integer.MAX_VALUE;
252                             }
253                         } else if ("httpSocketTimeout".equalsIgnoreCase(value)) {
254                             mHttpSocketTimeout = Integer.parseInt(text);
255                         } else if ("minimumSlideElementDuration".equalsIgnoreCase(value)) {
256                             mMinimumSlideElementDuration = Integer.parseInt(text);
257                         } else if ("maxSizeScaleForPendingMmsAllowed".equalsIgnoreCase(value)) {
258                             mMaxSizeScaleForPendingMmsAllowed = Integer.parseInt(text);
259                         } else if ("aliasMinChars".equalsIgnoreCase(value)) {
260                             mAliasRuleMinChars = Integer.parseInt(text);
261                         } else if ("aliasMaxChars".equalsIgnoreCase(value)) {
262                             mAliasRuleMaxChars = Integer.parseInt(text);
263                         }
264                     } else if ("string".equals(tag)) {
265                         // string config tags go here
266                         if ("userAgent".equalsIgnoreCase(value)) {
267                             mUserAgent = text;
268                         } else if ("uaProfTagName".equalsIgnoreCase(value)) {
269                             mUaProfTagName = text;
270                         } else if ("uaProfUrl".equalsIgnoreCase(value)) {
271                             mUaProfUrl = text;
272                         } else if ("httpParams".equalsIgnoreCase(value)) {
273                             mHttpParams = text;
274                         } else if ("httpParamsLine1Key".equalsIgnoreCase(value)) {
275                             mHttpParamsLine1Key = text;
276                         } else if ("emailGatewayNumber".equalsIgnoreCase(value)) {
277                             mEmailGateway = text;
278                         }
279                     }
280                 }
281             }
282         } catch (XmlPullParserException e) {
283             Log.e(TAG, "loadMmsSettings caught ", e);
284         } catch (NumberFormatException e) {
285             Log.e(TAG, "loadMmsSettings caught ", e);
286         } catch (IOException e) {
287             Log.e(TAG, "loadMmsSettings caught ", e);
288         } finally {
289             parser.close();
290         }
291
292         String errorStr = null;
293
294         if (getMmsEnabled() && mUaProfUrl == null) {
295             errorStr = "uaProfUrl";
296         }
297
298         if (errorStr != null) {
299             String err =
300                 String.format("MmsConfig.loadMmsSettings mms_config.xml missing %s setting",
301                         errorStr);
302             Log.e(TAG, err);
303             throw new ContentRestrictionException(err);
304         }
305     }
306
307 }