diff options
author | Dianne Hackborn <hackbod@google.com> | 2010-12-13 16:28:46 -0800 |
---|---|---|
committer | Dianne Hackborn <hackbod@google.com> | 2010-12-13 20:41:17 -0800 |
commit | d2835935d2df8be70d1b37d3ef3b2fe0155b3422 (patch) | |
tree | 77bbfae9a915bee48067b25774efe9cfdb9375e4 /services | |
parent | 32f4ab457d9f79251413357b75b7a233068a892c (diff) | |
download | frameworks_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')
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. |