Merge tag 'android-6.0.0_r26' into HEAD

Android 6.0.0 release 26

* tag 'android-6.0.0_r26':
  Catch exception for ConnectivityManager.unregisterNetworkCallback
  Default MMS proxy port to 80 and don't skip if port is invalid
  MMS proxy host dns lookup should happen on mms network

Change-Id: I92a2b7e802fab7dc94fd6bca01ecd5bfbb31f9d0
diff --git a/src/com/android/mms/service/ApnSettings.java b/src/com/android/mms/service/ApnSettings.java
index 9a2b7ca..48383c1 100644
--- a/src/com/android/mms/service/ApnSettings.java
+++ b/src/com/android/mms/service/ApnSettings.java
@@ -113,7 +113,8 @@
             if (cursor != null) {
                 String mmscUrl = null;
                 String proxyAddress = null;
-                int proxyPort = -1;
+                // Default proxy port to 80
+                int proxyPort = 80;
                 while (cursor.moveToNext()) {
                     // Read values from APN settings
                     if (isValidApnType(
@@ -133,12 +134,11 @@
                             proxyAddress = NetworkUtils.trimV4AddrZeros(proxyAddress);
                             final String portString =
                                     trimWithNullCheck(cursor.getString(COLUMN_MMSPORT));
-                            if (portString != null) {
+                            if (!TextUtils.isEmpty(portString)) {
                                 try {
                                     proxyPort = Integer.parseInt(portString);
                                 } catch (NumberFormatException e) {
-                                    LogUtil.e(requestId, "Invalid port " + portString);
-                                    throw new ApnException("Invalid port " + portString);
+                                    LogUtil.e(requestId, "Invalid port " + portString + ", use 80");
                                 }
                             }
                         }
diff --git a/src/com/android/mms/service/MmsHttpClient.java b/src/com/android/mms/service/MmsHttpClient.java
index e09695c..f6d3d1b 100644
--- a/src/com/android/mms/service/MmsHttpClient.java
+++ b/src/com/android/mms/service/MmsHttpClient.java
@@ -109,7 +109,8 @@
         try {
             Proxy proxy = Proxy.NO_PROXY;
             if (isProxySet) {
-                proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));
+                proxy = new Proxy(Proxy.Type.HTTP,
+                        new InetSocketAddress(mNetwork.getByName(proxyHost), proxyPort));
             }
             final URL url = new URL(urlString);
             // Now get the connection
diff --git a/src/com/android/mms/service/MmsNetworkManager.java b/src/com/android/mms/service/MmsNetworkManager.java
index ea2fa90..ed78258 100644
--- a/src/com/android/mms/service/MmsNetworkManager.java
+++ b/src/com/android/mms/service/MmsNetworkManager.java
@@ -185,7 +185,18 @@
     private void releaseRequestLocked(ConnectivityManager.NetworkCallback callback) {
         if (callback != null) {
             final ConnectivityManager connectivityManager = getConnectivityManager();
-            connectivityManager.unregisterNetworkCallback(callback);
+            try {
+                connectivityManager.unregisterNetworkCallback(callback);
+            } catch (IllegalArgumentException e) {
+                // It is possible ConnectivityManager.requestNetwork may fail silently due
+                // to RemoteException. When that happens, we may get an invalid
+                // NetworkCallback, which causes an IllegalArgumentexception when we try to
+                // unregisterNetworkCallback. This exception in turn causes
+                // MmsNetworkManager to skip resetLocked() in the below. Thus MMS service
+                // would get stuck in the bad state until the device restarts. This fix
+                // catches the exception so that state clean up can be executed.
+                LogUtil.w("Unregister network callback exception", e);
+            }
         }
         resetLocked();
     }