Merge change 20784

* changes:
  Use 5 minute ping time when connected via mobile (prevent NAT timeout)
diff --git a/src/com/android/exchange/EasSyncService.java b/src/com/android/exchange/EasSyncService.java
index 41db42c..ba86aaf 100644
--- a/src/com/android/exchange/EasSyncService.java
+++ b/src/com/android/exchange/EasSyncService.java
@@ -61,6 +61,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.database.Cursor;
+import android.net.ConnectivityManager;
 import android.os.RemoteException;
 import android.util.Log;
 
@@ -98,7 +99,13 @@
     static private final int COMMAND_TIMEOUT = 20*SECONDS;
     static private final int PING_COMMAND_TIMEOUT = 20*MINUTES;
 
+    // For mobile, we use a 5 minute timeout (less a few seconds)
+    static private final String PING_HEARTBEAT_MOBILE = "295";
+    // For wifi, we use a 15 minute timeout
+    static private final String PING_HEARTBEAT_WIFI = "900";
+
     // Fallbacks (in minutes) for ping loop failures
+    static private final int MAX_PING_FAILURES = 2;
     static private final int PING_FALLBACK_INBOX = 5;
     static private final int PING_FALLBACK_PIM = 30;
 
@@ -122,6 +129,7 @@
     String[] mBindArguments = new String[2];
     InputStream mPendingPartInputStream = null;
     HttpPost mPendingPost = null;
+    int mNetworkType;
 
     public EasSyncService(Context _context, Mailbox _mailbox) {
         super(_context, _mailbox);
@@ -409,6 +417,7 @@
      */
     public void runAccountMailbox() throws IOException, EasParserException {
         // Initialize exit status to success
+        mNetworkType = waitForConnectivity();
         mExitStatus = EmailServiceStatus.SUCCESS;
         try {
             try {
@@ -543,7 +552,7 @@
             } catch (RemoteException e1) {
                 // Don't care if this fails
             }
-            throw new IOException();
+            throw e;
         }
     }
 
@@ -644,7 +653,7 @@
                                 Integer failures = pingFailureMap.get(mailboxId);
                                 if (failures == null) {
                                     pingFailureMap.put(mailboxId, 1);
-                                } else if (failures > 4) {
+                                } else if (failures > MAX_PING_FAILURES) {
                                     // Change all push/ping boxes (except account) to 5 minute sync
                                     pushFallback(mailboxId);
                                     return;
@@ -656,7 +665,12 @@
 
                         if (canPushCount++ == 0) {
                             // Initialize the Ping command
-                            s.start(Tags.PING_PING).data(Tags.PING_HEARTBEAT_INTERVAL, "900")
+                            String pingHeartbeat = PING_HEARTBEAT_MOBILE;
+                            if (mNetworkType == ConnectivityManager.TYPE_WIFI) {
+                                pingHeartbeat = PING_HEARTBEAT_WIFI;
+                            }
+                            s.start(Tags.PING_PING)
+                                .data(Tags.PING_HEARTBEAT_INTERVAL, pingHeartbeat)
                                 .start(Tags.PING_FOLDERS);
                         }
                         // When we're ready for Calendar/Contacts, we will check folder type