summaryrefslogtreecommitdiffstats
path: root/src/com/android/mms/service/MmsNetworkManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/mms/service/MmsNetworkManager.java')
-rw-r--r--src/com/android/mms/service/MmsNetworkManager.java67
1 files changed, 56 insertions, 11 deletions
diff --git a/src/com/android/mms/service/MmsNetworkManager.java b/src/com/android/mms/service/MmsNetworkManager.java
index cefafc7..a9c5eca 100644
--- a/src/com/android/mms/service/MmsNetworkManager.java
+++ b/src/com/android/mms/service/MmsNetworkManager.java
@@ -16,9 +16,6 @@
package com.android.mms.service;
-import com.android.mms.service.exception.MmsNetworkException;
-import com.android.mms.service.http.NameResolver;
-
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
@@ -28,13 +25,17 @@ 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 NameResolver {
+public class MmsNetworkManager implements HostResolver {
// 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
@@ -42,6 +43,14 @@ public class MmsNetworkManager implements NameResolver {
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 Context mContext;
// The requested MMS {@link android.net.Network} we are holding
// We need this when we unbind from it. This is also used to indicate if the
@@ -60,7 +69,13 @@ public class MmsNetworkManager implements NameResolver {
// The callback to register when we request MMS network
private ConnectivityManager.NetworkCallback mNetworkCallback;
- private ConnectivityManager mConnectivityManager;
+ 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;
// TODO: we need to re-architect this when we support MSIM, like maybe one manager for each SIM?
public MmsNetworkManager(Context context) {
@@ -69,12 +84,8 @@ public class MmsNetworkManager implements NameResolver {
mNetwork = null;
mMmsRequestCount = 0;
mConnectivityManager = null;
- }
-
- public Network getNetwork() {
- synchronized (this) {
- return mNetwork;
- }
+ mConnectionPool = null;
+ mMmsHttpClient = null;
}
/**
@@ -201,6 +212,12 @@ public class MmsNetworkManager implements NameResolver {
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;
}
@Override
@@ -225,4 +242,32 @@ public class MmsNetworkManager implements NameResolver {
return Settings.System.getInt(mContext.getContentResolver(),
Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
}
+
+ private ConnectionPool getOrCreateConnectionPoolLocked() {
+ if (mConnectionPool == null) {
+ mConnectionPool = new ConnectionPool(httpMaxConnections, httpKeepAliveDurationMs);
+ }
+ return mConnectionPool;
+ }
+
+ /**
+ * Get an MmsHttpClient for the current network
+ *
+ * @return The MmsHttpClient instance
+ */
+ public MmsHttpClient getOrCreateHttpClient() {
+ synchronized (this) {
+ if (mMmsHttpClient == null) {
+ if (mNetwork != null) {
+ // Create new MmsHttpClient for the current Network
+ mMmsHttpClient = new MmsHttpClient(
+ mContext,
+ mNetwork.getSocketFactory(),
+ MmsNetworkManager.this,
+ getOrCreateConnectionPoolLocked());
+ }
+ }
+ return mMmsHttpClient;
+ }
+ }
}