Merge "Specify a timeout for the connection handshake" into jb-mr1.1-dev
diff --git a/emailcommon/src/com/android/emailcommon/utility/EmailClientConnectionManager.java b/emailcommon/src/com/android/emailcommon/utility/EmailClientConnectionManager.java
index 15d1cca..55ae014 100644
--- a/emailcommon/src/com/android/emailcommon/utility/EmailClientConnectionManager.java
+++ b/emailcommon/src/com/android/emailcommon/utility/EmailClientConnectionManager.java
@@ -99,7 +99,7 @@
             KeyManager keyManager =
                     KeyChainKeyManager.fromAlias(context, hostAuth.mClientCertAlias);
             SSLCertificateSocketFactory underlying = SSLUtils.getSSLSocketFactory(
-                    hostAuth.shouldTrustAllServerCerts());
+                    hostAuth.shouldTrustAllServerCerts(), 0 /* no timeout */);
             underlying.setKeyManagers(new KeyManager[] { keyManager });
             registry.register(
                     new Scheme(schemeName, new SSLSocketFactory(underlying), hostAuth.mPort));
diff --git a/emailcommon/src/com/android/emailcommon/utility/SSLUtils.java b/emailcommon/src/com/android/emailcommon/utility/SSLUtils.java
index b21c68f..85b77c1 100644
--- a/emailcommon/src/com/android/emailcommon/utility/SSLUtils.java
+++ b/emailcommon/src/com/android/emailcommon/utility/SSLUtils.java
@@ -47,19 +47,20 @@
      * Optionally bypass all SSL certificate checks.
      *
      * @param insecure if true, bypass all SSL certificate checks
+     * @param timeout the timeout value in milliseconds or {@code 0} for an infinite timeout.
      */
     public synchronized static SSLCertificateSocketFactory getSSLSocketFactory(
-            boolean insecure) {
+            boolean insecure, int timeout) {
         if (insecure) {
             if (sInsecureFactory == null) {
                 sInsecureFactory = (SSLCertificateSocketFactory)
-                        SSLCertificateSocketFactory.getInsecure(0, null);
+                        SSLCertificateSocketFactory.getInsecure(timeout, null);
             }
             return sInsecureFactory;
         } else {
             if (sSecureFactory == null) {
                 sSecureFactory = (SSLCertificateSocketFactory)
-                        SSLCertificateSocketFactory.getDefault(0, null);
+                        SSLCertificateSocketFactory.getDefault(timeout, null);
             }
             return sSecureFactory;
         }
@@ -70,7 +71,7 @@
      * Apache HTTP stack.
      */
     public static SSLSocketFactory getHttpSocketFactory(boolean insecure, KeyManager keyManager) {
-        SSLCertificateSocketFactory underlying = getSSLSocketFactory(insecure);
+        SSLCertificateSocketFactory underlying = getSSLSocketFactory(insecure, 0 /* no timeout */);
         if (keyManager != null) {
             underlying.setKeyManagers(new KeyManager[] { keyManager });
         }
diff --git a/src/com/android/email/mail/transport/MailTransport.java b/src/com/android/email/mail/transport/MailTransport.java
index 751be50..3f4d7bc 100644
--- a/src/com/android/email/mail/transport/MailTransport.java
+++ b/src/com/android/email/mail/transport/MailTransport.java
@@ -167,7 +167,8 @@
         try {
             SocketAddress socketAddress = new InetSocketAddress(getHost(), getPort());
             if (canTrySslSecurity()) {
-                mSocket = SSLUtils.getSSLSocketFactory(canTrustAllCertificates()).createSocket();
+                mSocket = SSLUtils.getSSLSocketFactory(
+                        canTrustAllCertificates(), SOCKET_CONNECT_TIMEOUT).createSocket();
             } else {
                 mSocket = new Socket();
             }
@@ -203,8 +204,9 @@
     @Override
     public void reopenTls() throws MessagingException {
         try {
-            mSocket = SSLUtils.getSSLSocketFactory(canTrustAllCertificates())
-                    .createSocket(mSocket, getHost(), getPort(), true);
+            mSocket =
+                    SSLUtils.getSSLSocketFactory(canTrustAllCertificates(), SOCKET_CONNECT_TIMEOUT)
+                            .createSocket(mSocket, getHost(), getPort(), true);
             mSocket.setSoTimeout(SOCKET_READ_TIMEOUT);
             mIn = new BufferedInputStream(mSocket.getInputStream(), 1024);
             mOut = new BufferedOutputStream(mSocket.getOutputStream(), 512);
@@ -281,20 +283,34 @@
      */
     @Override
     public void close() {
+        if (Email.DEBUG) {
+            Log.d(Logging.LOG_TAG, "*** " + mDebugLabel + " close " +
+                    getHost() + ":" + String.valueOf(getPort()));
+        }
+
         try {
             mIn.close();
         } catch (Exception e) {
             // May fail if the connection is already closed.
+            if (Email.DEBUG) {
+                Log.d(Logging.LOG_TAG, e.toString());
+            }
         }
         try {
             mOut.close();
         } catch (Exception e) {
             // May fail if the connection is already closed.
+            if (Email.DEBUG) {
+                Log.d(Logging.LOG_TAG, e.toString());
+            }
         }
         try {
             mSocket.close();
         } catch (Exception e) {
             // May fail if the connection is already closed.
+            if (Email.DEBUG) {
+                Log.d(Logging.LOG_TAG, e.toString());
+            }
         }
         mIn = null;
         mOut = null;