Merge change 20317

* changes:
  Bubble up SMS send fail error code to the app.
diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java
index 0a354c0..405db83 100644
--- a/core/java/android/app/WallpaperManager.java
+++ b/core/java/android/app/WallpaperManager.java
@@ -88,7 +88,7 @@
     }
 
     /**
-     * Like {@link #peekWallpaper}, but always returns a valid Drawable.  If
+     * Like {@link #peek}, but always returns a valid Drawable.  If
      * no wallpaper is set, the system default wallpaper is returned.
      *
      * @return Returns a Drawable object that will draw the wallpaper.
diff --git a/core/java/android/view/MotionEvent.java b/core/java/android/view/MotionEvent.java
index a109db5..e8bfa6a 100644
--- a/core/java/android/view/MotionEvent.java
+++ b/core/java/android/view/MotionEvent.java
@@ -185,7 +185,12 @@
      */
     static public final int NUM_SAMPLE_DATA = 4;
     
-    static private final int BASE_AVAIL_POINTERS = 2;
+    /**
+     * Number of possible pointers.
+     * @hide
+     */
+    static public final int BASE_AVAIL_POINTERS = 5;
+    
     static private final int BASE_AVAIL_SAMPLES = 8;
     
     static private final int MAX_RECYCLED = 10;
@@ -290,8 +295,19 @@
         ev.mNumPointers = pointers;
         ev.mNumSamples = 1;
         
-        System.arraycopy(inPointerIds, 0, ev.mPointerIdentifiers, 0, pointers);
-        System.arraycopy(inData, 0, ev.mDataSamples, 0, pointers * NUM_SAMPLE_DATA);
+        int[] pointerIdentifiers = ev.mPointerIdentifiers;
+        if (pointerIdentifiers.length < pointers) {
+            ev.mPointerIdentifiers = pointerIdentifiers = new int[pointers];
+        }
+        System.arraycopy(inPointerIds, 0, pointerIdentifiers, 0, pointers);
+        
+        final int ND = pointers * NUM_SAMPLE_DATA;
+        float[] dataSamples = ev.mDataSamples;
+        if (dataSamples.length < ND) {
+            ev.mDataSamples = dataSamples = new float[ND];
+        }
+        System.arraycopy(inData, 0, dataSamples, 0, ND);
+        
         ev.mTimeSamples[0] = eventTime;
 
         if (DEBUG_POINTERS) {
diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp
index 09a0d70..723fd4b 100644
--- a/core/jni/android_util_Process.cpp
+++ b/core/jni/android_util_Process.cpp
@@ -251,10 +251,27 @@
     }
 
     while ((de = readdir(d))) {
+        int t_pid;
+        int t_pri;
+
         if (de->d_name[0] == '.')
             continue;
+        t_pid = atoi(de->d_name);
 
-        if (add_pid_to_cgroup(atoi(de->d_name), grp)) {
+        if (!t_pid) {
+            LOGE("Error getting pid for '%s'\n", de->d_name);
+            continue;
+        }
+
+        t_pri = getpriority(PRIO_PROCESS, t_pid);
+
+        if (grp == ANDROID_TGROUP_DEFAULT &&
+            t_pri >= ANDROID_PRIORITY_BACKGROUND) {
+            // This task wants to stay at background
+            continue;
+        }
+     
+        if (add_pid_to_cgroup(t_pid, grp)) {
             // If the thread exited on us, ignore it and keep going
             if (errno != ESRCH && errno != ENOENT) {
                 signalExceptionForGroupError(env, clazz, errno);
diff --git a/services/java/com/android/server/ProcessStats.java b/services/java/com/android/server/ProcessStats.java
index 58f8980..af80e20 100644
--- a/services/java/com/android/server/ProcessStats.java
+++ b/services/java/com/android/server/ProcessStats.java
@@ -46,18 +46,23 @@
         PROC_SPACE_TERM,
         PROC_SPACE_TERM,
         PROC_SPACE_TERM,
+        PROC_SPACE_TERM|PROC_OUT_LONG,                  // 9: minor faults
         PROC_SPACE_TERM,
-        PROC_SPACE_TERM,
-        PROC_SPACE_TERM,
+        PROC_SPACE_TERM|PROC_OUT_LONG,                  // 11: major faults
         PROC_SPACE_TERM,
         PROC_SPACE_TERM|PROC_OUT_LONG,                  // 13: utime
         PROC_SPACE_TERM|PROC_OUT_LONG                   // 14: stime
     };
 
+    static final int PROCESS_STAT_MINOR_FAULTS = 0;
+    static final int PROCESS_STAT_MAJOR_FAULTS = 1;
+    static final int PROCESS_STAT_UTIME = 2;
+    static final int PROCESS_STAT_STIME = 3;
+    
     /** Stores user time and system time in 100ths of a second. */
-    private final long[] mProcessStatsData = new long[2];
+    private final long[] mProcessStatsData = new long[4];
     /** Stores user time and system time in 100ths of a second. */
-    private final long[] mSinglePidStatsData = new long[2];
+    private final long[] mSinglePidStatsData = new long[4];
 
     private static final int[] PROCESS_FULL_STATS_FORMAT = new int[] {
         PROC_SPACE_TERM,
@@ -151,6 +156,11 @@
         public int rel_utime;
         public int rel_stime;
 
+        public long base_minfaults;
+        public long base_majfaults;
+        public int rel_minfaults;
+        public int rel_majfaults;
+        
         public boolean active;
         public boolean added;
         public boolean removed;
@@ -313,12 +323,16 @@
                     continue;
                 }
                 
-                final long utime = procStats[0];
-                final long stime = procStats[1];
+                final long minfaults = procStats[PROCESS_STAT_MINOR_FAULTS];
+                final long majfaults = procStats[PROCESS_STAT_MAJOR_FAULTS];
+                final long utime = procStats[PROCESS_STAT_UTIME];
+                final long stime = procStats[PROCESS_STAT_STIME];
 
                 if (utime == st.base_utime && stime == st.base_stime) {
                     st.rel_utime = 0;
                     st.rel_stime = 0;
+                    st.rel_minfaults = 0;
+                    st.rel_majfaults = 0;
                     if (st.active) {
                         st.active = false;
                     }
@@ -342,6 +356,10 @@
                 st.rel_stime = (int)(stime - st.base_stime);
                 st.base_utime = utime;
                 st.base_stime = stime;
+                st.rel_minfaults = (int)(minfaults - st.base_minfaults);
+                st.rel_majfaults = (int)(majfaults - st.base_majfaults);
+                st.base_minfaults = minfaults;
+                st.base_majfaults = majfaults;
                 //Log.i("Load", "Stats changed " + name + " pid=" + st.pid
                 //      + " name=" + st.name + " utime=" + utime
                 //      + " stime=" + stime);
@@ -364,11 +382,13 @@
                         procStats, null)) {
                     st.baseName = parentPid < 0
                             ? procStatsString[0] : Integer.toString(pid);
-                    st.base_utime = procStats[1];
-                    st.base_stime = procStats[2];
+                    st.base_utime = 0; //procStats[1];
+                    st.base_stime = 0; //procStats[2];
+                    st.base_minfaults = st.base_majfaults = 0;
                 } else {
                     st.baseName = "<unknown>";
                     st.base_utime = st.base_stime = 0;
+                    st.base_minfaults = st.base_majfaults = 0;
                 }
 
                 if (parentPid < 0) {
@@ -386,6 +406,8 @@
                 //Log.i("Load", "New process: " + st.pid + " " + st.name);
                 st.rel_utime = 0;
                 st.rel_stime = 0;
+                st.rel_minfaults = 0;
+                st.rel_majfaults = 0;
                 st.added = true;
                 if (!first) {
                     workingProcs.add(st);
@@ -396,6 +418,8 @@
             // This process has gone away!
             st.rel_utime = 0;
             st.rel_stime = 0;
+            st.rel_minfaults = 0;
+            st.rel_majfaults = 0;
             st.removed = true;
             workingProcs.add(st);
             allProcs.remove(curStatsIndex);
@@ -412,6 +436,8 @@
             final Stats st = allProcs.get(curStatsIndex);
             st.rel_utime = 0;
             st.rel_stime = 0;
+            st.rel_minfaults = 0;
+            st.rel_majfaults = 0;
             st.removed = true;
             workingProcs.add(st);
             allProcs.remove(curStatsIndex);
@@ -427,7 +453,8 @@
         final long[] statsData = mSinglePidStatsData;
         if (Process.readProcFile(statFile, PROCESS_STATS_FORMAT,
                 null, statsData, null)) {
-            long time = statsData[0] + statsData[1];
+            long time = statsData[PROCESS_STAT_UTIME]
+                    + statsData[PROCESS_STAT_STIME];
             return time;
         }
         return 0;
@@ -497,33 +524,35 @@
         pw.print(now-mCurrentSampleTime);
         pw.println("ms ago:");
         
-        final int totalTime = mRelUserTime + mRelSystemTime + mRelIoWaitTime + mRelIrqTime + 
-                mRelSoftIrqTime + mRelIdleTime;
+        final int totalTime = mRelUserTime + mRelSystemTime + mRelIoWaitTime
+                + mRelIrqTime + mRelSoftIrqTime + mRelIdleTime;
         
         int N = mWorkingProcs.size();
         for (int i=0; i<N; i++) {
             Stats st = mWorkingProcs.get(i);
             printProcessCPU(pw, st.added ? " +" : (st.removed ? " -": "  "),
-                    st.name, totalTime, st.rel_utime, st.rel_stime, 0, 0, 0);
+                    st.name, totalTime, st.rel_utime, st.rel_stime, 0, 0, 0,
+                    st.rel_minfaults, st.rel_majfaults);
             if (!st.removed && st.workingThreads != null) {
                 int M = st.workingThreads.size();
                 for (int j=0; j<M; j++) {
                     Stats tst = st.workingThreads.get(j);
                     printProcessCPU(pw,
                             tst.added ? "   +" : (tst.removed ? "   -": "    "),
-                            tst.name, totalTime, tst.rel_utime, tst.rel_stime, 0, 0, 0);
+                            tst.name, totalTime, tst.rel_utime, tst.rel_stime,
+                            0, 0, 0, 0, 0);
                 }
             }
         }
         
-        printProcessCPU(pw, "", "TOTAL", totalTime, mRelUserTime, mRelSystemTime, mRelIoWaitTime,
-                mRelIrqTime, mRelSoftIrqTime);
+        printProcessCPU(pw, "", "TOTAL", totalTime, mRelUserTime, mRelSystemTime,
+                mRelIoWaitTime, mRelIrqTime, mRelSoftIrqTime, 0, 0);
         
         return sw.toString();
     }
     
     private void printProcessCPU(PrintWriter pw, String prefix, String label, int totalTime, 
-            int user, int system, int iowait, int irq, int softIrq) {
+            int user, int system, int iowait, int irq, int softIrq, int minFaults, int majFaults) {
         pw.print(prefix);
         pw.print(label);
         pw.print(": ");
@@ -549,6 +578,19 @@
             pw.print((softIrq*100)/totalTime);
             pw.print("% softirq");
         }
+        if (minFaults > 0 || majFaults > 0) {
+            pw.print(" / faults:");
+            if (minFaults > 0) {
+                pw.print(" ");
+                pw.print(minFaults);
+                pw.print(" minor");
+            }
+            if (majFaults > 0) {
+                pw.print(" ");
+                pw.print(majFaults);
+                pw.print(" major");
+            }
+        }
         pw.println();
     }