Report storage and multi-user info.

Indicate how many storage devices are detected, and how many users
are supported.

Change-Id: I3b2290de84a225159a33fbd2d591f9930c7fa920
diff --git a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoActivity.java b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoActivity.java
index 934e67d..e18e626 100644
--- a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoActivity.java
+++ b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoActivity.java
@@ -27,7 +27,6 @@
 import java.util.Locale;
 import java.util.concurrent.CountDownLatch;
 
-
 /**
  * Collect device information on target device.
  */
diff --git a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoConstants.java b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoConstants.java
index c06c21e..4a0ea66 100644
--- a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoConstants.java
+++ b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoConstants.java
@@ -60,4 +60,6 @@
     public static final String BUILD_VERSION = "buildVersion";
     public static final String BUILD_TAGS = "build_tags";
     public static final String SERIAL_NUMBER = "deviceID";
+    public static final String STORAGE_DEVICES = "storage_devices";
+    public static final String MULTI_USER = "multi_user";
 }
diff --git a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoInstrument.java b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoInstrument.java
index 49e96a0..29b29bf 100644
--- a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoInstrument.java
+++ b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoInstrument.java
@@ -25,6 +25,8 @@
 import android.content.res.Configuration;
 import android.os.Build;
 import android.os.Bundle;
+import android.os.Environment;
+import android.os.UserManager;
 import android.telephony.TelephonyManager;
 import android.util.DisplayMetrics;
 import android.util.Log;
@@ -33,6 +35,8 @@
 
 import java.io.IOException;
 import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -135,6 +139,12 @@
         String sysLibraries = getSystemLibraries();
         addResult(SYS_LIBRARIES, sysLibraries);
 
+        // Storage devices
+        addResult(STORAGE_DEVICES, getStorageDevices());
+
+        // Multi-user support
+        addResult(MULTI_USER, getMultiUserInfo());
+
         finish(Activity.RESULT_OK, mResults);
     }
 
@@ -343,4 +353,42 @@
 
         return builder.toString();
     }
+
+    private String getStorageDevices() {
+        int count = 0;
+        count = Math.max(count, getContext().getExternalCacheDirs().length);
+        count = Math.max(count, getContext().getExternalFilesDirs(null).length);
+        count = Math.max(
+                count, getContext().getExternalFilesDirs(Environment.DIRECTORY_PICTURES).length);
+        count = Math.max(count, getContext().getObbDirs().length);
+
+        final String result;
+        if (Environment.isExternalStorageEmulated()) {
+            if (count == 1) {
+                return "1 emulated";
+            } else {
+                return "1 emulated, " + (count - 1) + " physical media";
+            }
+        } else {
+            return count + " physical media";
+        }
+    }
+
+    private String getMultiUserInfo() {
+        try {
+            final Method method = UserManager.class.getMethod("getMaxSupportedUsers");
+            final Integer maxUsers = (Integer) method.invoke(null);
+            if (maxUsers == 1) {
+                return "single user";
+            } else {
+                return maxUsers + " users supported";
+            }
+        } catch (ClassCastException e) {
+        } catch (NoSuchMethodException e) {
+        } catch (InvocationTargetException e) {
+        } catch (IllegalAccessException e) {
+        }
+
+        return "unknown";
+    }
 }
diff --git a/tools/tradefed-host/res/report/cts_result.xsd b/tools/tradefed-host/res/report/cts_result.xsd
index 3f7f384..ce606e9 100644
--- a/tools/tradefed-host/res/report/cts_result.xsd
+++ b/tools/tradefed-host/res/report/cts_result.xsd
@@ -78,6 +78,8 @@
         <xs:attribute name="partitions" type="xs:string"/>
         <xs:attribute name="build_abi" type="xs:string"/>
         <xs:attribute name="build_abi2" type="xs:string"/>
+        <xs:attribute name="storage_devices" type="xs:string"/>
+        <xs:attribute name="multi_user" type="xs:string"/>
       </xs:complexType>
     </xs:element>
     <xs:element name="FeatureInfo" type="featureInfoType"/>
diff --git a/tools/tradefed-host/res/report/cts_result.xsl b/tools/tradefed-host/res/report/cts_result.xsl
index dfddc09..b6fb699 100644
--- a/tools/tradefed-host/res/report/cts_result.xsl
+++ b/tools/tradefed-host/res/report/cts_result.xsl
@@ -298,6 +298,18 @@
                                             </pre>
                                         </TD>
                                     </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Storage devices</TD>
+                                        <TD>
+                                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@storage_devices"/>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Multi-user support</TD>
+                                        <TD>
+                                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@multi_user"/>
+                                        </TD>
+                                    </TR>
                                 </TABLE>
                             </TD>
                         </TR>