Better handling of trim/benchmark results.

Request benchmarking of devices once per week during normal fstrim
maintenance window.  Tunable parameter gives us the ability to change
frequency through global setting.

Track individual benchmark and trim results for each volume, and
use scrubbed volume identifier (based on adoptiong age) when logging
stats to drop box.  Track last benchmark and trim time for each
volume separately.

Bug: 21831325
Change-Id: I53b3ed788f7820c2e5bceb2840339f5b4aada3f0
diff --git a/core/java/android/os/storage/DiskInfo.java b/core/java/android/os/storage/DiskInfo.java
index 397d87e..9114107 100644
--- a/core/java/android/os/storage/DiskInfo.java
+++ b/core/java/android/os/storage/DiskInfo.java
@@ -54,6 +54,7 @@
     public String label;
     /** Hacky; don't rely on this count */
     public int volumeCount;
+    public String sysPath;
 
     public DiskInfo(String id, int flags) {
         this.id = Preconditions.checkNotNull(id);
@@ -66,6 +67,7 @@
         size = parcel.readLong();
         label = parcel.readString();
         volumeCount = parcel.readInt();
+        sysPath = parcel.readString();
     }
 
     public @NonNull String getId() {
@@ -139,6 +141,8 @@
         pw.printPair("flags", DebugUtils.flagsToString(getClass(), "FLAG_", flags));
         pw.printPair("size", size);
         pw.printPair("label", label);
+        pw.println();
+        pw.printPair("sysPath", sysPath);
         pw.decreaseIndent();
         pw.println();
     }
@@ -193,5 +197,6 @@
         parcel.writeLong(size);
         parcel.writeString(label);
         parcel.writeInt(volumeCount);
+        parcel.writeString(sysPath);
     }
 }
diff --git a/core/java/android/os/storage/VolumeRecord.java b/core/java/android/os/storage/VolumeRecord.java
index cb16305..7b20223 100644
--- a/core/java/android/os/storage/VolumeRecord.java
+++ b/core/java/android/os/storage/VolumeRecord.java
@@ -19,6 +19,7 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.util.DebugUtils;
+import android.util.TimeUtils;
 
 import com.android.internal.util.IndentingPrintWriter;
 import com.android.internal.util.Preconditions;
@@ -42,6 +43,9 @@
     public String partGuid;
     public String nickname;
     public int userFlags;
+    public long createdMillis;
+    public long lastTrimMillis;
+    public long lastBenchMillis;
 
     public VolumeRecord(int type, String fsUuid) {
         this.type = type;
@@ -54,6 +58,9 @@
         partGuid = parcel.readString();
         nickname = parcel.readString();
         userFlags = parcel.readInt();
+        createdMillis = parcel.readLong();
+        lastTrimMillis = parcel.readLong();
+        lastBenchMillis = parcel.readLong();
     }
 
     public int getType() {
@@ -86,6 +93,10 @@
         pw.printPair("nickname", nickname);
         pw.printPair("userFlags",
                 DebugUtils.flagsToString(VolumeRecord.class, "USER_FLAG_", userFlags));
+        pw.println();
+        pw.printPair("createdMillis", TimeUtils.formatForLogging(createdMillis));
+        pw.printPair("lastTrimMillis", TimeUtils.formatForLogging(lastTrimMillis));
+        pw.printPair("lastBenchMillis", TimeUtils.formatForLogging(lastBenchMillis));
         pw.decreaseIndent();
         pw.println();
     }
@@ -140,5 +151,8 @@
         parcel.writeString(partGuid);
         parcel.writeString(nickname);
         parcel.writeInt(userFlags);
+        parcel.writeLong(createdMillis);
+        parcel.writeLong(lastTrimMillis);
+        parcel.writeLong(lastBenchMillis);
     }
 }
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index e5afdde..4e13758 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -6324,6 +6324,9 @@
        /** Timeout in milliseconds to wait for NTP server. {@hide} */
        public static final String NTP_TIMEOUT = "ntp_timeout";
 
+       /** {@hide} */
+       public static final String STORAGE_BENCHMARK_INTERVAL = "storage_benchmark_interval";
+
        /**
         * Whether the package manager should send package verification broadcasts for verifiers to
         * review apps prior to installation.
diff --git a/core/java/android/util/TimeUtils.java b/core/java/android/util/TimeUtils.java
index 353388d..c1eb80d 100644
--- a/core/java/android/util/TimeUtils.java
+++ b/core/java/android/util/TimeUtils.java
@@ -28,6 +28,7 @@
 
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Collection;
@@ -54,6 +55,8 @@
     private static ArrayList<TimeZone> sLastUniqueZoneOffsets = null;
     private static String sLastUniqueCountry = null;
 
+    /** {@hide} */
+    private static SimpleDateFormat sLoggingFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
     /**
      * Tries to return a time zone that would have had the specified offset
@@ -441,4 +444,13 @@
             return Long.toString(millis);
         }
     }
+
+    /** {@hide} */
+    public static String formatForLogging(long millis) {
+        if (millis <= 0) {
+            return "unknown";
+        } else {
+            return sLoggingFormat.format(new Date(millis));
+        }
+    }
 }