summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--res/xml-mcc302-mnc610/mms_config.xml3
-rwxr-xr-xsrc/com/android/mms/service/MmsConfig.java1
-rw-r--r--src/com/android/mms/service/MmsHttpClient.java57
-rw-r--r--src/com/android/mms/service/MmsNetworkManager.java53
-rw-r--r--src/com/android/mms/service/MmsRequest.java2
-rw-r--r--src/com/android/mms/service/MmsService.java123
-rw-r--r--src/com/android/mms/service/SendRequest.java4
7 files changed, 70 insertions, 173 deletions
diff --git a/res/xml-mcc302-mnc610/mms_config.xml b/res/xml-mcc302-mnc610/mms_config.xml
index cc94b7f..576b5c1 100644
--- a/res/xml-mcc302-mnc610/mms_config.xml
+++ b/res/xml-mcc302-mnc610/mms_config.xml
@@ -49,4 +49,7 @@
<!-- Disable SMS to MMS conversion for multiple recipient SMS -->
<bool name="enableGroupMms">false</bool>
+
+ <!-- Disable the link to the cell broadcast -->
+ <bool name="config_cellBroadcastAppLinks">false</bool>
</mms_config>
diff --git a/src/com/android/mms/service/MmsConfig.java b/src/com/android/mms/service/MmsConfig.java
index 4eea339..c5505aa 100755
--- a/src/com/android/mms/service/MmsConfig.java
+++ b/src/com/android/mms/service/MmsConfig.java
@@ -515,6 +515,7 @@ public class MmsConfig {
} else if (MACRO_NAI.equals(macro)) {
return getNai(context, mBase.getSubId());
}
+ Log.e(MmsService.TAG, "MmsConfig: invalid macro " + macro);
return null;
}
diff --git a/src/com/android/mms/service/MmsHttpClient.java b/src/com/android/mms/service/MmsHttpClient.java
index 1099b64..10b8aa2 100644
--- a/src/com/android/mms/service/MmsHttpClient.java
+++ b/src/com/android/mms/service/MmsHttpClient.java
@@ -17,15 +17,11 @@
package com.android.mms.service;
import android.content.Context;
+import android.net.Network;
import android.text.TextUtils;
import android.util.Log;
import com.android.mms.service.exception.MmsHttpException;
-import com.android.okhttp.ConnectionPool;
-import com.android.okhttp.HostResolver;
-import com.android.okhttp.HttpHandler;
-import com.android.okhttp.HttpsHandler;
-import com.android.okhttp.OkHttpClient;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
@@ -44,7 +40,6 @@ import java.util.Locale;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import javax.net.SocketFactory;
/**
* MMS HTTP client for sending and downloading MMS messages
@@ -68,24 +63,17 @@ public class MmsHttpClient {
"application/vnd.wap.mms-message";
private final Context mContext;
- private final SocketFactory mSocketFactory;
- private final HostResolver mHostResolver;
- private final ConnectionPool mConnectionPool;
+ private final Network mNetwork;
/**
* Constructor
*
* @param context The Context object
- * @param socketFactory The socket factory for creating an OKHttp client
- * @param hostResolver The host name resolver for creating an OKHttp client
- * @param connectionPool The connection pool for creating an OKHttp client
+ * @param network The Network for creating an OKHttp client
*/
- public MmsHttpClient(Context context, SocketFactory socketFactory, HostResolver hostResolver,
- ConnectionPool connectionPool) {
+ public MmsHttpClient(Context context, Network network) {
mContext = context;
- mSocketFactory = socketFactory;
- mHostResolver = hostResolver;
- mConnectionPool = connectionPool;
+ mNetwork = network;
}
/**
@@ -111,13 +99,13 @@ public class MmsHttpClient {
checkMethod(method);
HttpURLConnection connection = null;
try {
- Proxy proxy = null;
+ Proxy proxy = Proxy.NO_PROXY;
if (isProxySet) {
proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));
}
final URL url = new URL(urlString);
// Now get the connection
- connection = openConnection(url, proxy);
+ connection = (HttpURLConnection) mNetwork.openConnection(url, proxy);
connection.setDoInput(true);
connection.setConnectTimeout(mmsConfig.getHttpSocketTimeout());
// ------- COMMON HEADERS ---------
@@ -210,35 +198,6 @@ public class MmsHttpClient {
}
}
- /**
- * Open an HTTP connection
- *
- * TODO: The following code is borrowed from android.net.Network.openConnection
- * Once that method supports proxy, we should use that instead
- * Also we should remove the associated HostResolver and ConnectionPool from
- * MmsNetworkManager
- *
- * @param url The URL to connect to
- * @param proxy The proxy to use
- * @return The opened HttpURLConnection
- * @throws MalformedURLException If URL is malformed
- */
- private HttpURLConnection openConnection(URL url, Proxy proxy) throws MalformedURLException {
- final String protocol = url.getProtocol();
- OkHttpClient okHttpClient;
- if (protocol.equals("http")) {
- okHttpClient = HttpHandler.createHttpOkHttpClient(proxy);
- } else if (protocol.equals("https")) {
- okHttpClient = HttpsHandler.createHttpsOkHttpClient(proxy);
- } else {
- throw new MalformedURLException("Invalid URL or unrecognized protocol " + protocol);
- }
- return okHttpClient.setSocketFactory(mSocketFactory)
- .setHostResolver(mHostResolver)
- .setConnectionPool(mConnectionPool)
- .open(url);
- }
-
private static void logHttpHeaders(Map<String, List<String>> headers) {
final StringBuilder sb = new StringBuilder();
if (headers != null) {
@@ -345,8 +304,6 @@ public class MmsHttpClient {
final String macroValue = mmsConfig.getHttpParamMacro(context, macro);
if (macroValue != null) {
replaced.append(macroValue);
- } else {
- Log.w(MmsService.TAG, "HTTP: invalid macro " + macro);
}
nextStart = matcher.end();
}
diff --git a/src/com/android/mms/service/MmsNetworkManager.java b/src/com/android/mms/service/MmsNetworkManager.java
index 2f61232..c8aa904 100644
--- a/src/com/android/mms/service/MmsNetworkManager.java
+++ b/src/com/android/mms/service/MmsNetworkManager.java
@@ -20,23 +20,17 @@ import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
-import android.net.NetworkRequest;
import android.net.NetworkInfo;
+import android.net.NetworkRequest;
import android.os.SystemClock;
-import android.provider.Settings;
import android.util.Log;
import com.android.mms.service.exception.MmsNetworkException;
-import com.android.okhttp.ConnectionPool;
-import com.android.okhttp.HostResolver;
-
-import java.net.InetAddress;
-import java.net.UnknownHostException;
/**
* Manages the MMS network connectivity
*/
-public class MmsNetworkManager implements HostResolver {
+public class MmsNetworkManager {
// Timeout used to call ConnectivityManager.requestNetwork
private static final int NETWORK_REQUEST_TIMEOUT_MILLIS = 60 * 1000;
// Wait timeout for this class, a little bit longer than the above timeout
@@ -44,14 +38,6 @@ public class MmsNetworkManager implements HostResolver {
private static final int NETWORK_ACQUIRE_TIMEOUT_MILLIS =
NETWORK_REQUEST_TIMEOUT_MILLIS + (5 * 1000);
- // Borrowed from {@link android.net.Network}
- private static final boolean httpKeepAlive =
- Boolean.parseBoolean(System.getProperty("http.keepAlive", "true"));
- private static final int httpMaxConnections =
- httpKeepAlive ? Integer.parseInt(System.getProperty("http.maxConnections", "5")) : 0;
- private static final long httpKeepAliveDurationMs =
- Long.parseLong(System.getProperty("http.keepAliveDuration", "300000")); // 5 minutes.
-
private final Context mContext;
// The requested MMS {@link android.net.Network} we are holding
@@ -68,9 +54,6 @@ public class MmsNetworkManager implements HostResolver {
private volatile ConnectivityManager mConnectivityManager;
- // The OkHttp's ConnectionPool used by the HTTP client associated with this network manager
- private ConnectionPool mConnectionPool;
-
// The MMS HTTP client for this network
private MmsHttpClient mMmsHttpClient;
@@ -83,7 +66,6 @@ public class MmsNetworkManager implements HostResolver {
mNetwork = null;
mMmsRequestCount = 0;
mConnectivityManager = null;
- mConnectionPool = null;
mMmsHttpClient = null;
mSubId = subId;
mNetworkRequest = new NetworkRequest.Builder()
@@ -206,27 +188,9 @@ public class MmsNetworkManager implements HostResolver {
mNetworkCallback = null;
mNetwork = null;
mMmsRequestCount = 0;
- // Currently we follow what android.net.Network does with ConnectionPool,
- // which is per Network object. So if Network changes, we should clear
- // out the ConnectionPool and thus the MmsHttpClient (since it is linked
- // to a specific ConnectionPool).
- mConnectionPool = null;
mMmsHttpClient = null;
}
- private static final InetAddress[] EMPTY_ADDRESS_ARRAY = new InetAddress[0];
- @Override
- public InetAddress[] getAllByName(String host) throws UnknownHostException {
- Network network = null;
- synchronized (this) {
- if (mNetwork == null) {
- return EMPTY_ADDRESS_ARRAY;
- }
- network = mNetwork;
- }
- return network.getAllByName(host);
- }
-
private ConnectivityManager getConnectivityManager() {
if (mConnectivityManager == null) {
mConnectivityManager = (ConnectivityManager) mContext.getSystemService(
@@ -235,13 +199,6 @@ public class MmsNetworkManager implements HostResolver {
return mConnectivityManager;
}
- private ConnectionPool getOrCreateConnectionPoolLocked() {
- if (mConnectionPool == null) {
- mConnectionPool = new ConnectionPool(httpMaxConnections, httpKeepAliveDurationMs);
- }
- return mConnectionPool;
- }
-
/**
* Get an MmsHttpClient for the current network
*
@@ -252,11 +209,7 @@ public class MmsNetworkManager implements HostResolver {
if (mMmsHttpClient == null) {
if (mNetwork != null) {
// Create new MmsHttpClient for the current Network
- mMmsHttpClient = new MmsHttpClient(
- mContext,
- mNetwork.getSocketFactory(),
- MmsNetworkManager.this,
- getOrCreateConnectionPoolLocked());
+ mMmsHttpClient = new MmsHttpClient(mContext, mNetwork);
}
}
return mMmsHttpClient;
diff --git a/src/com/android/mms/service/MmsRequest.java b/src/com/android/mms/service/MmsRequest.java
index 27cb968..f43f1b4 100644
--- a/src/com/android/mms/service/MmsRequest.java
+++ b/src/com/android/mms/service/MmsRequest.java
@@ -22,11 +22,9 @@ import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
-import android.provider.Settings;
import android.service.carrier.CarrierMessagingService;
import android.service.carrier.ICarrierMessagingCallback;
import android.telephony.SmsManager;
-import android.telephony.TelephonyManager;
import android.util.Log;
import com.android.mms.service.exception.ApnException;
diff --git a/src/com/android/mms/service/MmsService.java b/src/com/android/mms/service/MmsService.java
index 17c4a34..dd01f30 100644
--- a/src/com/android/mms/service/MmsService.java
+++ b/src/com/android/mms/service/MmsService.java
@@ -29,11 +29,7 @@ import android.database.sqlite.SQLiteException;
import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
-import android.os.Handler;
-import android.os.HandlerThread;
import android.os.IBinder;
-import android.os.Looper;
-import android.os.Message;
import android.os.ParcelFileDescriptor;
import android.os.Process;
import android.os.RemoteException;
@@ -88,6 +84,9 @@ public class MmsService extends Service implements MmsRequest.RequestManager {
// specific size limit should not be used (as it could be lower on some carriers).
private static final int MAX_MMS_FILE_SIZE = 8 * 1024 * 1024;
+ // The default number of threads allowed to run MMS requests in each queue
+ public static final int THREAD_POOL_SIZE = 4;
+
// Pending requests that are waiting for the SIM to be available
// If a different SIM is currently used by previous requests, the following
// requests will stay in this queue until that SIM finishes its current requests in
@@ -98,7 +97,8 @@ public class MmsService extends Service implements MmsRequest.RequestManager {
// TODO: persist this in case MmsService crashes
private final Queue<MmsRequest> mPendingSimRequestQueue = new ArrayDeque<>();
- private final ExecutorService mExecutor = Executors.newCachedThreadPool();
+ // Thread pool for transferring PDU with MMS apps
+ private final ExecutorService mPduTransferExecutor = Executors.newCachedThreadPool();
// A cache of MmsNetworkManager for SIMs
private final SparseArray<MmsNetworkManager> mNetworkManagerCache = new SparseArray<>();
@@ -108,33 +108,10 @@ public class MmsService extends Service implements MmsRequest.RequestManager {
// The current running MmsRequest count.
private int mRunningRequestCount;
- /**
- * A thread-based request queue for executing the MMS requests in serial order
- */
- private class RequestQueue extends Handler {
- public RequestQueue(Looper looper) {
- super(looper);
- }
-
- @Override
- public void handleMessage(Message msg) {
- final MmsRequest request = (MmsRequest) msg.obj;
- if (request != null) {
- try {
- request.execute(MmsService.this, getNetworkManager(request.getSubId()));
- } finally {
- synchronized (MmsService.this) {
- mRunningRequestCount--;
- if (mRunningRequestCount <= 0) {
- movePendingSimRequestsToRunningSynchronized();
- }
- }
- }
- } else {
- Log.e(TAG, "RequestQueue: handling empty request");
- }
- }
- }
+ // Running request queues, one thread pool per queue
+ // 0: send queue
+ // 1: download queue
+ private final ExecutorService[] mRunningRequestExecutors = new ExecutorService[2];
private MmsNetworkManager getNetworkManager(int subId) {
synchronized (mNetworkManagerCache) {
@@ -395,31 +372,6 @@ public class MmsService extends Service implements MmsRequest.RequestManager {
}
};
- // Running request queues, one thread per queue
- // 0: send queue
- // 1: download queue
- private final RequestQueue[] mRunningRequestQueues = new RequestQueue[2];
-
- /**
- * Lazy start the request queue threads
- *
- * @param queueIndex index of the queue to start
- */
- private void startRequestQueueIfNeeded(int queueIndex) {
- if (queueIndex < 0 || queueIndex >= mRunningRequestQueues.length) {
- Log.e(TAG, "Start request queue if needed: invalid queue " + queueIndex);
- return;
- }
- synchronized (this) {
- if (mRunningRequestQueues[queueIndex] == null) {
- final HandlerThread thread =
- new HandlerThread("MmsService RequestQueue " + queueIndex);
- thread.start();
- mRunningRequestQueues[queueIndex] = new RequestQueue(thread.getLooper());
- }
- }
- }
-
@Override
public void addSimRequest(MmsRequest request) {
if (request == null) {
@@ -448,17 +400,32 @@ public class MmsService extends Service implements MmsRequest.RequestManager {
}
}
- private void addToRunningRequestQueueSynchronized(MmsRequest request) {
+ private void addToRunningRequestQueueSynchronized(final MmsRequest request) {
Log.d(TAG, "Add request to running queue for subId " + request.getSubId());
// Update current state of running requests
- mCurrentSubId = request.getSubId();
+ final int queue = request.getQueueType();
+ if (queue < 0 || queue >= mRunningRequestExecutors.length) {
+ Log.e(TAG, "Invalid request queue index for running request");
+ return;
+ }
mRunningRequestCount++;
+ mCurrentSubId = request.getSubId();
// Send to the corresponding request queue for execution
- final int queue = request.getQueueType();
- startRequestQueueIfNeeded(queue);
- final Message message = Message.obtain();
- message.obj = request;
- mRunningRequestQueues[queue].sendMessage(message);
+ mRunningRequestExecutors[queue].execute(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ request.execute(MmsService.this, getNetworkManager(request.getSubId()));
+ } finally {
+ synchronized (MmsService.this) {
+ mRunningRequestCount--;
+ if (mRunningRequestCount <= 0) {
+ movePendingSimRequestsToRunningSynchronized();
+ }
+ }
+ }
+ }
+ });
}
private void movePendingSimRequestsToRunningSynchronized() {
@@ -499,12 +466,24 @@ public class MmsService extends Service implements MmsRequest.RequestManager {
// Load mms_config
MmsConfigManager.getInstance().init(this);
// Initialize running request state
+ for (int i = 0; i < mRunningRequestExecutors.length; i++) {
+ mRunningRequestExecutors[i] = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
+ }
synchronized (this) {
mCurrentSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
mRunningRequestCount = 0;
}
}
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ Log.d(TAG, "onDestroy");
+ for (ExecutorService executor : mRunningRequestExecutors) {
+ executor.shutdown();
+ }
+ }
+
private Uri importSms(String address, int type, String text, long timestampMillis,
boolean seen, boolean read, String creator) {
Uri insertUri = null;
@@ -809,6 +788,9 @@ public class MmsService extends Service implements MmsRequest.RequestManager {
* @return pdu bytes if succeeded else null
*/
public byte[] readPduFromContentUri(final Uri contentUri, final int maxSize) {
+ if (contentUri == null) {
+ return null;
+ }
Callable<byte[]> copyPduToArray = new Callable<byte[]>() {
public byte[] call() {
ParcelFileDescriptor.AutoCloseInputStream inStream = null;
@@ -843,10 +825,9 @@ public class MmsService extends Service implements MmsRequest.RequestManager {
}
};
- Future<byte[]> pendingResult = mExecutor.submit(copyPduToArray);
+ Future<byte[]> pendingResult = mPduTransferExecutor.submit(copyPduToArray);
try {
- byte[] pdu = pendingResult.get(TASK_TIMEOUT_MS, TimeUnit.MILLISECONDS);
- return pdu;
+ return pendingResult.get(TASK_TIMEOUT_MS, TimeUnit.MILLISECONDS);
} catch (Exception e) {
// Typically a timeout occurred - cancel task
pendingResult.cancel(true);
@@ -861,6 +842,9 @@ public class MmsService extends Service implements MmsRequest.RequestManager {
* @return true if all bytes successfully written else false
*/
public boolean writePduToContentUri(final Uri contentUri, final byte[] pdu) {
+ if (contentUri == null || pdu == null) {
+ return false;
+ }
Callable<Boolean> copyDownloadedPduToOutput = new Callable<Boolean>() {
public Boolean call() {
ParcelFileDescriptor.AutoCloseOutputStream outStream = null;
@@ -883,10 +867,9 @@ public class MmsService extends Service implements MmsRequest.RequestManager {
}
};
- Future<Boolean> pendingResult = mExecutor.submit(copyDownloadedPduToOutput);
+ Future<Boolean> pendingResult = mPduTransferExecutor.submit(copyDownloadedPduToOutput);
try {
- Boolean succeeded = pendingResult.get(TASK_TIMEOUT_MS, TimeUnit.MILLISECONDS);
- return succeeded == Boolean.TRUE;
+ return pendingResult.get(TASK_TIMEOUT_MS, TimeUnit.MILLISECONDS);
} catch (Exception e) {
// Typically a timeout occurred - cancel task
pendingResult.cancel(true);
diff --git a/src/com/android/mms/service/SendRequest.java b/src/com/android/mms/service/SendRequest.java
index 8ec0538..70d19b1 100644
--- a/src/com/android/mms/service/SendRequest.java
+++ b/src/com/android/mms/service/SendRequest.java
@@ -230,7 +230,9 @@ public class SendRequest extends MmsRequest {
@Override
protected void revokeUriPermission(Context context) {
- context.revokeUriPermission(mPduUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ if (mPduUri != null) {
+ context.revokeUriPermission(mPduUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ }
}
/**