Use Java 8 date format in analytics.settings

Java 11 changed the default format for Date serialization which
affected files produced by Gson. Gson can deserialize dates in both
Java 8 and Java 9 formats, but only when run on Java 9+.

analytics.settings file is read by all versions of Android Studio. If
Java 9 format is used, this will break previous versions - some will
fail to start while others will start but analytics will not work.

With the fix applied, the older, Java 8 date format is used even on
Java 9+.

(cherry picked from commit d246e071a894e57e5a8be99fe21c263a7e8cf9a5)

Fixes: 156291868
Fixes: 165343136
Test: AnalyticsSettingsTest.useJava8DateFormat
Change-Id: I65b95a08a4ba3a7e73c755fb24e7aa74f9c60d91
diff --git a/shared/src/main/java/com/android/tools/analytics/AnalyticsSettings.kt b/shared/src/main/java/com/android/tools/analytics/AnalyticsSettings.kt
index b4c73c2..19b784d 100644
--- a/shared/src/main/java/com/android/tools/analytics/AnalyticsSettings.kt
+++ b/shared/src/main/java/com/android/tools/analytics/AnalyticsSettings.kt
@@ -448,7 +448,10 @@
             channel.truncate(0)
             val outputStream = Channels.newOutputStream(channel)
             val writer = OutputStreamWriter(outputStream)
-            gson.toJson(this, writer)
+
+            // Write out using pre-Java9 date format to let older releases read the file correctly.
+            val datePatternJava8 = "MMM d, y h:mm:ss a"
+            GsonBuilder().setDateFormat(datePatternJava8).create().toJson(this, writer)
             writer.flush()
             outputStream.flush()
           }
diff --git a/shared/src/test/java/com/android/tools/analytics/AnalyticsSettingsTest.kt b/shared/src/test/java/com/android/tools/analytics/AnalyticsSettingsTest.kt
index 097f5cf..45146e5 100644
--- a/shared/src/test/java/com/android/tools/analytics/AnalyticsSettingsTest.kt
+++ b/shared/src/test/java/com/android/tools/analytics/AnalyticsSettingsTest.kt
@@ -19,6 +19,7 @@
 import com.android.utils.DateProvider
 import com.android.utils.ILogger
 import com.google.common.base.Charsets
+import com.google.gson.GsonBuilder
 import com.google.protobuf.ByteString
 import org.junit.Assert.assertArrayEquals
 import org.junit.Assert.assertEquals
@@ -34,6 +35,7 @@
 import java.io.IOException
 import java.math.BigInteger
 import java.nio.file.Files
+import java.nio.file.Paths
 import java.util.Arrays
 import java.util.Date
 import java.util.UUID
@@ -585,4 +587,25 @@
       EnvironmentFakes.setSystemEnvironment()
     }
   }
+
+  @Test
+  fun useJava8DateFormat() {
+    EnvironmentFakes.setCustomAndroidSdkHomeEnvironment(testConfigDir.root.toString())
+    try {
+      AnalyticsSettings.setInstanceForTest(AnalyticsSettingsData().apply {
+        userId = "db3dd15b-053a-4066-ac93-04c50585edc2"
+        optedIn = true
+        lastSentimentAnswerDate = Date(115, 4, 17, 14, 23, 45)
+      })
+      AnalyticsSettings.saveSettings()
+      val analysticsSettingsContents =
+        String(Files.readAllBytes(Paths.get(testConfigDir.root.toString(), "analytics.settings")), Charsets.UTF_8)
+      val lastSentimentAnswerDate =
+        GsonBuilder().create().fromJson(analysticsSettingsContents, Map::class.java)["lastSentimentAnswerDate"]
+      assertEquals("May 17, 2015 2:23:45 PM", lastSentimentAnswerDate)
+    }
+    finally {
+      EnvironmentFakes.setSystemEnvironment()
+    }
+  }
 }