Merge "Further MemoryTracker robustness:" into jb-ub-gel-agar
diff --git a/src/com/android/launcher3/MemoryDumpActivity.java b/src/com/android/launcher3/MemoryDumpActivity.java
index 447f0dd..d79be80 100644
--- a/src/com/android/launcher3/MemoryDumpActivity.java
+++ b/src/com/android/launcher3/MemoryDumpActivity.java
@@ -28,6 +28,7 @@
 
 import java.io.*;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
@@ -85,7 +86,9 @@
         final ArrayList<String> paths = new ArrayList<String>();
         final int myPid = android.os.Process.myPid();
 
-        for (int pid : tracker.getTrackedProcesses()) {
+        final int[] pids_orig = tracker.getTrackedProcesses();
+        final int[] pids_copy = Arrays.copyOf(pids_orig, pids_orig.length);
+        for (int pid : pids_copy) {
             MemoryTracker.ProcessMemInfo info = tracker.getMemInfo(pid);
             if (info != null) {
                 body.append("pid ").append(pid).append(":")
diff --git a/src/com/android/launcher3/MemoryTracker.java b/src/com/android/launcher3/MemoryTracker.java
index 87a73f3..d3bb77c 100644
--- a/src/com/android/launcher3/MemoryTracker.java
+++ b/src/com/android/launcher3/MemoryTracker.java
@@ -26,6 +26,7 @@
 import android.util.LongSparseArray;
 
 import java.util.ArrayList;
+import java.util.List;
 
 public class MemoryTracker extends Service {
     public static final String TAG = MemoryTracker.class.getSimpleName();
@@ -47,10 +48,10 @@
             //= new Meminfo[(int) (30 * 60 / (UPDATE_RATE / 1000))]; // 30 minutes
         public long max = 1;
         public int head = 0;
-        public ProcessMemInfo(int pid, String name) {
+        public ProcessMemInfo(int pid, String name, long start) {
             this.pid = pid;
             this.name = name;
-            this.startTime = System.currentTimeMillis();
+            this.startTime = start;
         }
         public long getUptime() {
             return System.currentTimeMillis() - startTime;
@@ -99,7 +100,7 @@
         return mPidsArray;
     }
 
-    public void startTrackingProcess(int pid, String name) {
+    public void startTrackingProcess(int pid, String name, long start) {
         synchronized (mLock) {
             final Long lpid = new Long(pid);
 
@@ -114,7 +115,7 @@
                 mPidsArray[i] = p;
                 sb.append(p); sb.append(" ");
             }
-            mData.put(pid, new ProcessMemInfo(pid, name));
+            mData.put(pid, new ProcessMemInfo(pid, name, start));
             Log.v(TAG, sb.toString());
         }
     }
@@ -149,6 +150,22 @@
     @Override
     public void onCreate() {
         mAm = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
+
+        // catch up in case we crashed but other processes are still running
+        List<ActivityManager.RunningServiceInfo> svcs = mAm.getRunningServices(256);
+        for (ActivityManager.RunningServiceInfo svc : svcs) {
+            if (svc.service.getPackageName().equals(getPackageName())) {
+                startTrackingProcess(svc.pid, svc.process, System.currentTimeMillis() - (SystemClock.elapsedRealtime() - svc.activeSince));
+            }
+        }
+
+        List<ActivityManager.RunningAppProcessInfo> procs = mAm.getRunningAppProcesses();
+        for (ActivityManager.RunningAppProcessInfo proc : procs) {
+            final String pname = proc.processName;
+            if (pname.startsWith(getPackageName())) {
+                startTrackingProcess(proc.pid, pname, System.currentTimeMillis());
+            }
+        }
     }
 
     @Override
@@ -164,7 +181,8 @@
             if (ACTION_START_TRACKING.equals(intent.getAction())) {
                 final int pid = intent.getIntExtra("pid", -1);
                 final String name = intent.getStringExtra("name");
-                startTrackingProcess(pid, name);
+                final long start = intent.getLongExtra("start", System.currentTimeMillis());
+                startTrackingProcess(pid, name, start);
             }
         }
 
diff --git a/src/com/android/launcher3/WeightWatcher.java b/src/com/android/launcher3/WeightWatcher.java
index 2eac063..70b8afe 100644
--- a/src/com/android/launcher3/WeightWatcher.java
+++ b/src/com/android/launcher3/WeightWatcher.java
@@ -213,7 +213,11 @@
         public void update() {
             //Log.v("WeightWatcher.ProcessWatcher",
             //        "MSG_UPDATE pss=" + mMemInfo.currentPss);
-            mText.setText("(" + mMemInfo.name + "/" + mPid + ") up " + getUptimeString()
+            mText.setText("(" + mPid
+                          + (mPid == android.os.Process.myPid()
+                                ? "/A"  // app
+                                : "/S") // service
+                          + ") up " + getUptimeString()
                           + " P=" + mMemInfo.currentPss
                           + " U=" + mMemInfo.currentUss
                           );