Update SubscriptionManager API by replacing 'id' & 'idx' with 'index'.
am: ecfdf63e6f

Change-Id: Ifa2d16b078a183f36f8d95217d16e4e9bb3bbdaf
diff --git a/src/com/android/mms/service/MmsNetworkManager.java b/src/com/android/mms/service/MmsNetworkManager.java
index c2e2f6a..a37d31c 100644
--- a/src/com/android/mms/service/MmsNetworkManager.java
+++ b/src/com/android/mms/service/MmsNetworkManager.java
@@ -22,6 +22,8 @@
 import android.net.NetworkCapabilities;
 import android.net.NetworkInfo;
 import android.net.NetworkRequest;
+import android.os.Handler;
+import android.os.Looper;
 import android.os.SystemClock;
 
 import com.android.mms.service.exception.MmsNetworkException;
@@ -37,6 +39,9 @@
     // to make sure we don't bail prematurely
     private static final int NETWORK_ACQUIRE_TIMEOUT_MILLIS =
             NETWORK_REQUEST_TIMEOUT_MILLIS + (5 * 1000);
+    // Waiting time used before releasing a network prematurely. This allows the MMS download
+    // acknowledgement messages to be sent using the same network that was used to download the data
+    private static final int NETWORK_RELEASE_TIMEOUT_MILLIS = 5 * 1000;
 
     private final Context mContext;
 
@@ -57,6 +62,12 @@
     // The MMS HTTP client for this network
     private MmsHttpClient mMmsHttpClient;
 
+    // The handler used for delayed release of the network
+    private final Handler mReleaseHandler;
+
+    // The task that does the delayed releasing of the network.
+    private final Runnable mNetworkReleaseTask;
+
     // The SIM ID which we use to connect
     private final int mSubId;
 
@@ -103,11 +114,23 @@
         mConnectivityManager = null;
         mMmsHttpClient = null;
         mSubId = subId;
+        mReleaseHandler = new Handler(Looper.getMainLooper());
         mNetworkRequest = new NetworkRequest.Builder()
                 .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
                 .addCapability(NetworkCapabilities.NET_CAPABILITY_MMS)
                 .setNetworkSpecifier(Integer.toString(mSubId))
                 .build();
+
+        mNetworkReleaseTask = new Runnable() {
+            @Override
+            public void run() {
+                synchronized (this) {
+                    if (mMmsRequestCount < 1) {
+                        releaseRequestLocked(mNetworkCallback);
+                    }
+                }
+            }
+        };
     }
 
     /**
@@ -118,6 +141,8 @@
      */
     public void acquireNetwork(final String requestId) throws MmsNetworkException {
         synchronized (this) {
+            // Since we are acquiring the network, remove the network release task if exists.
+            mReleaseHandler.removeCallbacks(mNetworkReleaseTask);
             mMmsRequestCount += 1;
             if (mNetwork != null) {
                 // Already available
@@ -155,14 +180,25 @@
      * Release the MMS network when nobody is holding on to it.
      *
      * @param requestId request ID for logging
+     * @param shouldDelayRelease whether the release should be delayed for 5 seconds, the regular
+     *                           use case is to delay this for DownloadRequests to use the network
+     *                           for sending an acknowledgement on the same network
      */
-    public void releaseNetwork(final String requestId) {
+    public void releaseNetwork(final String requestId, final boolean shouldDelayRelease) {
         synchronized (this) {
             if (mMmsRequestCount > 0) {
                 mMmsRequestCount -= 1;
                 LogUtil.d(requestId, "MmsNetworkManager: release, count=" + mMmsRequestCount);
                 if (mMmsRequestCount < 1) {
-                    releaseRequestLocked(mNetworkCallback);
+                    if (shouldDelayRelease) {
+                        // remove previously posted task and post a delayed task on the release
+                        // handler to release the network
+                        mReleaseHandler.removeCallbacks(mNetworkReleaseTask);
+                        mReleaseHandler.postDelayed(mNetworkReleaseTask,
+                                NETWORK_RELEASE_TIMEOUT_MILLIS);
+                    } else {
+                        releaseRequestLocked(mNetworkCallback);
+                    }
                 }
             }
         }
diff --git a/src/com/android/mms/service/MmsRequest.java b/src/com/android/mms/service/MmsRequest.java
index 4eeac08..ec8b334 100644
--- a/src/com/android/mms/service/MmsRequest.java
+++ b/src/com/android/mms/service/MmsRequest.java
@@ -173,7 +173,7 @@
                         // Success
                         break;
                     } finally {
-                        networkManager.releaseNetwork(requestId);
+                        networkManager.releaseNetwork(requestId, this instanceof DownloadRequest);
                     }
                 } catch (ApnException e) {
                     LogUtil.e(requestId, "APN failure", e);