Fix issue #3258849: Grab thumbnail when exiting an app via back

Also issue #3281400: Rotating a retained instance fragment leaks the fragment manager

And turn off fragment debug logging.

Change-Id: Ibdd7db82bb35618021bcba421ba92ced7cd691c2
diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java
index 8e33011..ba7692d 100644
--- a/services/java/com/android/server/WindowManagerService.java
+++ b/services/java/com/android/server/WindowManagerService.java
@@ -4908,7 +4908,7 @@
         SystemProperties.set(StrictMode.VISUAL_PROPERTY, value);
     }
 
-    public Bitmap screenshotApplications(int maxWidth, int maxHeight) {
+    public Bitmap screenshotApplications(IBinder appToken, int maxWidth, int maxHeight) {
         if (!checkCallingPermission(android.Manifest.permission.READ_FRAME_BUFFER,
                 "screenshotApplications()")) {
             throw new SecurityException("Requires READ_FRAME_BUFFER permission");
@@ -4916,6 +4916,8 @@
 
         Bitmap rawss;
 
+        int maxLayer = 0;
+        boolean foundApp;
         final Rect frame = new Rect();
 
         float scale;
@@ -4939,6 +4941,13 @@
                 if (ws.mLayer >= aboveAppLayer) {
                     break;
                 }
+                if (appToken != null && (ws.mAppToken == null
+                        || ws.mAppToken.token != appToken)) {
+                    continue;
+                }
+                if (maxLayer < ws.mAnimLayer) {
+                    maxLayer = ws.mAnimLayer;
+                }
                 final Rect wf = ws.mFrame;
                 final Rect cr = ws.mContentInsets;
                 int left = wf.left + cr.left;
@@ -4978,7 +4987,7 @@
                 dh = tmp;
                 rot = (rot == Surface.ROTATION_90) ? Surface.ROTATION_270 : Surface.ROTATION_90;
             }
-            rawss = Surface.screenshot(dw, dh);
+            rawss = Surface.screenshot(dw, dh, 0, maxLayer);
         }
 
         Bitmap bm = Bitmap.createBitmap(sw, sh, rawss.getConfig());
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 44029cd..a26fe5f 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -3808,8 +3808,14 @@
                 r.haveState = true;
                 if (thumbnail != null) {
                     r.thumbnail = thumbnail;
+                    if (r.task != null) {
+                        r.task.lastThumbnail = r.thumbnail;
+                    }
                 }
                 r.description = description;
+                if (r.task != null) {
+                    r.task.lastDescription = r.description;
+                }
                 r.stopped = true;
                 r.state = ActivityState.STOPPED;
                 if (!r.finishing) {
@@ -4826,9 +4832,10 @@
                 throw new SecurityException(msg);
             }
 
-            final boolean canReadFb = checkCallingPermission(
-                    android.Manifest.permission.READ_FRAME_BUFFER)
-                    == PackageManager.PERMISSION_GRANTED;
+            final boolean canReadFb = (flags&ActivityManager.TASKS_GET_THUMBNAILS) != 0
+                    && checkCallingPermission(
+                            android.Manifest.permission.READ_FRAME_BUFFER)
+                            == PackageManager.PERMISSION_GRANTED;
 
             int pos = mMainStack.mHistory.size()-1;
             ActivityRecord next =
@@ -4878,7 +4885,7 @@
                         if (top.thumbnail != null) {
                             ci.thumbnail = top.thumbnail;
                         } else if (top.state == ActivityState.RESUMED) {
-                            ci.thumbnail = top.stack.screenshotActivities();
+                            ci.thumbnail = top.stack.screenshotActivities(top);
                         }
                     }
                     ci.description = topDescription;
@@ -4949,8 +4956,15 @@
             enforceCallingPermission(android.Manifest.permission.GET_TASKS,
                     "getRecentTasks()");
 
+            final boolean canReadFb = (flags&ActivityManager.TASKS_GET_THUMBNAILS) != 0
+                    && checkCallingPermission(
+                            android.Manifest.permission.READ_FRAME_BUFFER)
+                            == PackageManager.PERMISSION_GRANTED;
+            
             IPackageManager pm = AppGlobals.getPackageManager();
             
+            ActivityRecord resumed = mMainStack.mResumedActivity;
+            
             final int N = mRecentTasks.size();
             ArrayList<ActivityManager.RecentTaskInfo> res
                     = new ArrayList<ActivityManager.RecentTaskInfo>(
@@ -4968,6 +4982,15 @@
                             tr.intent != null ? tr.intent : tr.affinityIntent);
                     rti.origActivity = tr.origActivity;
                     
+                    if (canReadFb) {
+                        if (resumed != null && resumed.task == tr) {
+                            rti.thumbnail = resumed.stack.screenshotActivities(resumed);
+                        } else {
+                            rti.thumbnail = tr.lastThumbnail;
+                        }
+                    }
+                    rti.description = tr.lastDescription;
+                    
                     if ((flags&ActivityManager.RECENT_IGNORE_UNAVAILABLE) != 0) {
                         // Check whether this activity is currently available.
                         try {
diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java
index d92695c..920bbc9 100644
--- a/services/java/com/android/server/am/ActivityStack.java
+++ b/services/java/com/android/server/am/ActivityStack.java
@@ -650,7 +650,7 @@
         }
     }
     
-    public final Bitmap screenshotActivities() {
+    public final Bitmap screenshotActivities(ActivityRecord who) {
         Resources res = mService.mContext.getResources();
         int w = mThumbnailWidth;
         int h = mThumbnailHeight;
@@ -662,7 +662,7 @@
         }
 
         if (w > 0) {
-            //return mService.mWindowManager.screenshotApplications(w, h);
+            //return mService.mWindowManager.screenshotApplications(who, w, h);
         }
         return null;
     }
@@ -686,7 +686,10 @@
         mLastPausedActivity = prev;
         prev.state = ActivityState.PAUSING;
         prev.task.touchActiveTime();
-        prev.thumbnail = screenshotActivities();
+        prev.thumbnail = screenshotActivities(prev);
+        if (prev.task != null) {
+            prev.task.lastThumbnail = prev.thumbnail;
+        }
 
         mService.updateCpuStats();
         
diff --git a/services/java/com/android/server/am/TaskRecord.java b/services/java/com/android/server/am/TaskRecord.java
index 09d9c3b6..86cec42 100644
--- a/services/java/com/android/server/am/TaskRecord.java
+++ b/services/java/com/android/server/am/TaskRecord.java
@@ -19,7 +19,7 @@
 import android.content.ComponentName;
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
-import android.os.SystemClock;
+import android.graphics.Bitmap;
 
 import java.io.PrintWriter;
 
@@ -34,6 +34,8 @@
     long lastActiveTime;    // Last time this task was active, including sleep.
     boolean rootWasReset;   // True if the intent at the root of the task had
                             // the FLAG_ACTIVITY_RESET_TASK_IF_NEEDED flag.
+    Bitmap lastThumbnail;   // Last thumbnail captured for this task.
+    CharSequence lastDescription; // Last description captured for this task.
 
     String stringName;      // caching of toString() result.