Make sure SyncManager keeps running in various edge cases

* Have Welcome start the service (in case the app has been reloaded)
* Have SyncManager.ping start the service if there's no instance of
  SyncManager

Change-Id: I8bed2843a3e065d2db29fad67dfb0bb3a5d0ff5e
diff --git a/src/com/android/exchange/MailboxAlarmReceiver.java b/src/com/android/exchange/MailboxAlarmReceiver.java
index 137d6a5..cc4e2f4 100644
--- a/src/com/android/exchange/MailboxAlarmReceiver.java
+++ b/src/com/android/exchange/MailboxAlarmReceiver.java
@@ -33,7 +33,7 @@
         if (SyncManager.INSTANCE != null) {
             SyncManager.INSTANCE.log("Alarm received for: " + SyncManager.alarmOwner(mid));
         }
-        SyncManager.ping(mid);
+        SyncManager.ping(context, mid);
     }
 }
 
diff --git a/src/com/android/exchange/SyncManager.java b/src/com/android/exchange/SyncManager.java
index 36b4c6a..2b31747 100644
--- a/src/com/android/exchange/SyncManager.java
+++ b/src/com/android/exchange/SyncManager.java
@@ -667,6 +667,14 @@
         }
     }
 
+    protected void alwaysLog(String str) {
+        if (!Eas.USER_LOG) {
+            Log.d(TAG, str);
+        } else {
+            log(str);
+        }
+    }
+
     /**
      * EAS requires a unique device id, so that sync is possible from a variety of different
      * devices (e.g. the syncKey is specific to a device)  If we're on an emulator or some other
@@ -711,9 +719,9 @@
     @Override
     public void onCreate() {
         if (INSTANCE != null) {
-            Log.d(TAG, "onCreate called on running SyncManager");
+            alwaysLog("onCreate called on running SyncManager");
         } else {
-            Log.d(TAG, "!!! EAS SyncManager, onCreate");
+            alwaysLog("!!! EAS SyncManager, onCreate");
             INSTANCE = this;
             try {
                 sDeviceId = getDeviceId();
@@ -733,10 +741,10 @@
 
     @Override
     public int onStartCommand(Intent intent, int flags, int startId) {
-        Log.d(TAG, "!!! EAS SyncManager, onStartCommand");
+        alwaysLog("!!! EAS SyncManager, onStartCommand");
         maybeStartSyncManagerThread();
         if (sServiceThread == null) {
-            Log.d(TAG, "!!! EAS SyncManager, stopping self");
+            alwaysLog("!!! EAS SyncManager, stopping self");
             stopSelf();
         }
         return Service.START_REDELIVER_INTENT;
@@ -744,7 +752,7 @@
 
     @Override
     public void onDestroy() {
-        Log.d(TAG, "!!! EAS SyncManager, onDestroy");
+        alwaysLog("!!! EAS SyncManager, onDestroy");
     }
 
     void maybeStartSyncManagerThread() {
@@ -980,9 +988,11 @@
         INSTANCE.releaseWakeLock(id);
     }
 
-    static public void ping(long id) {
+    static public void ping(Context context, long id) {
         if (id < 0) {
             kick("ping SyncManager");
+        } else if (INSTANCE == null) {
+            context.startService(new Intent(context, SyncManager.class));
         } else {
             AbstractSyncService service = INSTANCE.mServiceMap.get(id);
             if (service != null) {