diff options
-rw-r--r-- | res/xml-mcc302-mnc610/mms_config.xml | 3 | ||||
-rwxr-xr-x | src/com/android/mms/service/MmsConfig.java | 1 | ||||
-rw-r--r-- | src/com/android/mms/service/MmsHttpClient.java | 57 | ||||
-rw-r--r-- | src/com/android/mms/service/MmsNetworkManager.java | 53 | ||||
-rw-r--r-- | src/com/android/mms/service/MmsRequest.java | 2 | ||||
-rw-r--r-- | src/com/android/mms/service/MmsService.java | 123 | ||||
-rw-r--r-- | src/com/android/mms/service/SendRequest.java | 4 |
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); + } } /** |