Merge "Track MemFree from cat proc/meminfo"
diff --git a/libraries/collectors-helper/memory/src/com/android/helpers/FreeMemHelper.java b/libraries/collectors-helper/memory/src/com/android/helpers/FreeMemHelper.java
index 5992dad..b2f1f8c 100644
--- a/libraries/collectors-helper/memory/src/com/android/helpers/FreeMemHelper.java
+++ b/libraries/collectors-helper/memory/src/com/android/helpers/FreeMemHelper.java
@@ -50,6 +50,7 @@
     private static final String PROC_MEMINFO = "cat /proc/meminfo";
     private static final String LINE_SEPARATOR = "\\n";
     private static final String MEM_AVAILABLE_PATTERN = "^MemAvailable.*";
+    private static final String MEM_FREE_PATTERN = "^MemFree.*";
     private static final Pattern CACHE_PROC_START_PATTERN = Pattern.compile(".*: Cached$");
     private static final Pattern PID_PATTERN = Pattern.compile("^.*pid(?<processid> [0-9]*).*$");
     private static final String DUMPSYS_PROCESS = "dumpsys meminfo %s";
@@ -57,6 +58,7 @@
     private static final String PROCESS_ID = "processid";
     public static final String MEM_AVAILABLE_CACHE_PROC_DIRTY = "MemAvailable_CacheProcDirty_bytes";
     public static final String PROC_MEMINFO_MEM_AVAILABLE= "proc_meminfo_memavailable_bytes";
+    public static final String PROC_MEMINFO_MEM_FREE= "proc_meminfo_memfree_bytes";
     public static final String DUMPSYS_CACHED_PROC_MEMORY= "dumpsys_cached_procs_memory_bytes";
 
     private UiDevice mUiDevice;
@@ -77,27 +79,35 @@
         String memInfo;
         try {
             memInfo = mUiDevice.executeShellCommand(PROC_MEMINFO);
+            Log.i(TAG, "cat proc/meminfo :" + memInfo);
         } catch (IOException ioe) {
             Log.e(TAG, "Failed to read " + PROC_MEMINFO + ".", ioe);
             return null;
         }
 
         Pattern memAvailablePattern = Pattern.compile(MEM_AVAILABLE_PATTERN, Pattern.MULTILINE);
+        Pattern memFreePattern = Pattern.compile(MEM_FREE_PATTERN, Pattern.MULTILINE);
         Matcher memAvailableMatcher = memAvailablePattern.matcher(memInfo);
+        Matcher memFreeMatcher = memFreePattern.matcher(memInfo);
 
         String[] memAvailable = null;
-        if (memAvailableMatcher.find()) {
+        String[] memFree = null;
+        if (memAvailableMatcher.find() && memFreeMatcher.find()) {
             memAvailable = memAvailableMatcher.group(0).split(SEPARATOR);
+            memFree = memFreeMatcher.group(0).split(SEPARATOR);
         }
 
-        if (memAvailable == null) {
-            Log.e(TAG, "MemAvailable is null.");
+        if (memAvailable == null || memFree == null) {
+            Log.e(TAG, "MemAvailable or MemFree is null.");
             return null;
         }
         Map<String, Long> results = new HashMap<>();
         long memAvailableProc = Long.parseLong(memAvailable[1]);
         results.put(PROC_MEMINFO_MEM_AVAILABLE, (memAvailableProc * 1024));
 
+        long memFreeProc = Long.parseLong(memFree[1]);
+        results.put(PROC_MEMINFO_MEM_FREE, (memFreeProc * 1024));
+
         long cacheProcDirty = memAvailableProc;
         byte[] dumpsysMemInfoBytes = MetricUtility.executeCommandBlocking(DUMPSYS_MEMIFNO,
                 InstrumentationRegistry.getInstrumentation());
diff --git a/libraries/collectors-helper/memory/test/src/com/android/helpers/tests/FreeMemHelperTest.java b/libraries/collectors-helper/memory/test/src/com/android/helpers/tests/FreeMemHelperTest.java
index 283ab36..9770908 100644
--- a/libraries/collectors-helper/memory/test/src/com/android/helpers/tests/FreeMemHelperTest.java
+++ b/libraries/collectors-helper/memory/test/src/com/android/helpers/tests/FreeMemHelperTest.java
@@ -54,6 +54,7 @@
         assertTrue(freeMemMetrics.containsKey(FreeMemHelper.DUMPSYS_CACHED_PROC_MEMORY));
         assertTrue(freeMemMetrics.get(FreeMemHelper.MEM_AVAILABLE_CACHE_PROC_DIRTY) > 0);
         assertTrue(freeMemMetrics.get(FreeMemHelper.PROC_MEMINFO_MEM_AVAILABLE) > 0);
+        assertTrue(freeMemMetrics.get(FreeMemHelper.PROC_MEMINFO_MEM_FREE) > 0);
         assertTrue(freeMemMetrics.get(FreeMemHelper.DUMPSYS_CACHED_PROC_MEMORY) > 0);
     }
 }