summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2010-12-13 16:28:46 -0800
committerDianne Hackborn <hackbod@google.com>2010-12-13 20:41:17 -0800
commitd2835935d2df8be70d1b37d3ef3b2fe0155b3422 (patch)
tree77bbfae9a915bee48067b25774efe9cfdb9375e4 /services
parent32f4ab457d9f79251413357b75b7a233068a892c (diff)
downloadframeworks_base-d2835935d2df8be70d1b37d3ef3b2fe0155b3422.zip
frameworks_base-d2835935d2df8be70d1b37d3ef3b2fe0155b3422.tar.gz
frameworks_base-d2835935d2df8be70d1b37d3ef3b2fe0155b3422.tar.bz2
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
Diffstat (limited to 'services')
-rw-r--r--services/java/com/android/server/WindowManagerService.java13
-rw-r--r--services/java/com/android/server/am/ActivityManagerService.java31
-rw-r--r--services/java/com/android/server/am/ActivityStack.java9
-rw-r--r--services/java/com/android/server/am/TaskRecord.java4
4 files changed, 47 insertions, 10 deletions
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 @@ public class WindowManagerService extends IWindowManager.Stub
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 @@ public class WindowManagerService extends IWindowManager.Stub
Bitmap rawss;
+ int maxLayer = 0;
+ boolean foundApp;
final Rect frame = new Rect();
float scale;
@@ -4939,6 +4941,13 @@ public class WindowManagerService extends IWindowManager.Stub
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 @@ public class WindowManagerService extends IWindowManager.Stub
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 @@ public final class ActivityManagerService extends ActivityManagerNative
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 @@ public final class ActivityManagerService extends ActivityManagerNative
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 @@ public final class ActivityManagerService extends ActivityManagerNative
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 @@ public final class ActivityManagerService extends ActivityManagerNative
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 @@ public final class ActivityManagerService extends ActivityManagerNative
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 class ActivityStack {
}
}
- 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 @@ public class ActivityStack {
}
if (w > 0) {
- //return mService.mWindowManager.screenshotApplications(w, h);
+ //return mService.mWindowManager.screenshotApplications(who, w, h);
}
return null;
}
@@ -686,7 +686,10 @@ public class ActivityStack {
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 @@ package com.android.server.am;
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 @@ class TaskRecord {
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.