diff options
author | Craig Mautner <cmautner@google.com> | 2013-05-15 11:40:05 -0700 |
---|---|---|
committer | Craig Mautner <cmautner@google.com> | 2013-05-15 12:40:10 -0700 |
commit | 76ea2246781a899659ce4e24f3b75d17d2f0745d (patch) | |
tree | faa2da34b62a25be6ebd08d91a1fc7906829bae1 | |
parent | 121e521fa1f12979eaeba9bdc5711fcecff6577d (diff) | |
download | frameworks_base-76ea2246781a899659ce4e24f3b75d17d2f0745d.zip frameworks_base-76ea2246781a899659ce4e24f3b75d17d2f0745d.tar.gz frameworks_base-76ea2246781a899659ce4e24f3b75d17d2f0745d.tar.bz2 |
Limit screenshots to specified activity and stack.
The screenshots were capturing the entire screen. Now they are limited
to the stack containing the activity.
Add debug for stack states.
Change-Id: I6d47cd37091bfdfd94e7abe89826b7ba8cb69b51
3 files changed, 48 insertions, 18 deletions
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index 14481f6..d19fbfa 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -218,7 +218,7 @@ public final class ActivityManagerService extends ActivityManagerNative static final boolean DEBUG_POWER_QUICK = DEBUG_POWER || false; static final boolean DEBUG_MU = localLOGV || false; static final boolean DEBUG_IMMERSIVE = localLOGV || false; - static final boolean DEBUG_STACK = localLOGV || false; + static final boolean DEBUG_STACK = localLOGV || true; static final boolean VALIDATE_TOKENS = true; static final boolean SHOW_ACTIVITY_START_TIME = true; diff --git a/services/java/com/android/server/am/ActivityStackSupervisor.java b/services/java/com/android/server/am/ActivityStackSupervisor.java index d743ab6..a6ab6f4 100644 --- a/services/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/java/com/android/server/am/ActivityStackSupervisor.java @@ -216,20 +216,17 @@ public class ActivityStackSupervisor { } } - boolean isFocusedStack(ActivityStack stack) { - return getFocusedStack() == stack; - } - boolean isFrontStack(ActivityStack stack) { - if (stack.mCurrentUser != mCurrentUser) { - return false; - } - return !(stack.isHomeStack() ^ getFocusedStack().isHomeStack()); + return (stack.mCurrentUser == mCurrentUser) && + !(stack.isHomeStack() ^ getFocusedStack().isHomeStack()); } void moveHomeStack(boolean toFront) { final boolean homeInFront = isFrontStack(mHomeStack); if (homeInFront ^ toFront) { + if (DEBUG_STACK) Slog.d(TAG, "moveHomeTask: mStackState old=" + + stackStateToString(mStackState) + " new=" + stackStateToString(homeInFront ? + STACK_STATE_HOME_TO_BACK : STACK_STATE_HOME_TO_FRONT)); mStackState = homeInFront ? STACK_STATE_HOME_TO_BACK : STACK_STATE_HOME_TO_FRONT; } } @@ -382,9 +379,15 @@ public class ActivityStackSupervisor { // TODO: Not sure if this should check if all Paused are complete too. switch (mStackState) { case STACK_STATE_HOME_TO_BACK: + if (DEBUG_STACK) Slog.d(TAG, "allResumedActivitiesComplete: mStackState old=" + + stackStateToString(STACK_STATE_HOME_TO_BACK) + " new=" + + stackStateToString(STACK_STATE_HOME_IN_BACK)); mStackState = STACK_STATE_HOME_IN_BACK; break; case STACK_STATE_HOME_TO_FRONT: + if (DEBUG_STACK) Slog.d(TAG, "allResumedActivitiesComplete: mStackState old=" + + stackStateToString(STACK_STATE_HOME_TO_FRONT) + " new=" + + stackStateToString(STACK_STATE_HOME_IN_FRONT)); mStackState = STACK_STATE_HOME_IN_FRONT; break; } @@ -478,7 +481,6 @@ public class ActivityStackSupervisor { ActivityRecord getTasksLocked(int maxNum, IThumbnailReceiver receiver, PendingThumbnailsRecord pending, List<RunningTaskInfo> list) { ActivityRecord r = null; - final int numStacks = mStacks.size(); for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { final ActivityStack stack = mStacks.get(stackNdx); final ActivityRecord ar = @@ -588,16 +590,14 @@ public class ActivityStackSupervisor { if (mService.mHeavyWeightProcess != null && (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid || !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) { - int realCallingPid = callingPid; int realCallingUid = callingUid; if (caller != null) { ProcessRecord callerApp = mService.getRecordForAppLocked(caller); if (callerApp != null) { - realCallingPid = callerApp.pid; realCallingUid = callerApp.info.uid; } else { Slog.w(TAG, "Unable to find app for caller " + caller - + " (pid=" + realCallingPid + ") when starting: " + + " (pid=" + callingPid + ") when starting: " + intent.toString()); ActivityOptions.abort(options); return ActivityManager.START_PERMISSION_DENIED; @@ -716,7 +716,6 @@ public class ActivityStackSupervisor { throw new IllegalArgumentException("intents are length different than resolvedTypes"); } - ActivityRecord[] outActivity = new ActivityRecord[1]; int callingPid; if (callingUid >= 0) { @@ -730,7 +729,7 @@ public class ActivityStackSupervisor { final long origId = Binder.clearCallingIdentity(); try { synchronized (mService) { - + ActivityRecord[] outActivity = new ActivityRecord[1]; for (int i=0; i<intents.length; i++) { Intent intent = intents[i]; if (intent == null) { @@ -1184,11 +1183,19 @@ public class ActivityStackSupervisor { } if (!r.isApplicationActivity() || (r.task != null && !r.task.isApplicationTask())) { if (mStackState != STACK_STATE_HOME_IN_FRONT) { + if (DEBUG_STACK) Slog.d(TAG, "setFocusedStack: mStackState old=" + + stackStateToString(mStackState) + " new=" + + stackStateToString(STACK_STATE_HOME_TO_FRONT) + + " Callers=" + Debug.getCallers(3)); mStackState = STACK_STATE_HOME_TO_FRONT; } } else { mFocusedStack = r.task.stack; if (mStackState != STACK_STATE_HOME_IN_BACK) { + if (DEBUG_STACK) Slog.d(TAG, "setFocusedStack: mStackState old=" + + stackStateToString(mStackState) + " new=" + + stackStateToString(STACK_STATE_HOME_TO_BACK) + + " Callers=" + Debug.getCallers(3)); mStackState = STACK_STATE_HOME_TO_BACK; } } @@ -1994,6 +2001,8 @@ public class ActivityStackSupervisor { mUserStates.delete(userId); } else { mFocusedStack = null; + if (DEBUG_STACK) Slog.d(TAG, "switchUserLocked: mStackState=" + + stackStateToString(STACK_STATE_HOME_IN_FRONT)); mStackState = STACK_STATE_HOME_IN_FRONT; } @@ -2077,9 +2086,20 @@ public class ActivityStackSupervisor { } } + private static String stackStateToString(int stackState) { + switch (stackState) { + case STACK_STATE_HOME_IN_FRONT: return "STACK_STATE_HOME_IN_FRONT"; + case STACK_STATE_HOME_TO_BACK: return "STACK_STATE_HOME_TO_BACK"; + case STACK_STATE_HOME_IN_BACK: return "STACK_STATE_HOME_IN_BACK"; + case STACK_STATE_HOME_TO_FRONT: return "STACK_STATE_HOME_TO_FRONT"; + default: return "Unknown stackState=" + stackState; + } + } + public void dump(PrintWriter pw, String prefix) { pw.print(prefix); pw.print("mDismissKeyguardOnNextActivity:"); pw.println(mDismissKeyguardOnNextActivity); + pw.print(prefix); pw.print("mStackState="); pw.println(stackStateToString(mStackState)); } ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) { @@ -2088,6 +2108,7 @@ public class ActivityStackSupervisor { boolean dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll, boolean dumpClient, String dumpPackage) { + pw.print(" mStackState="); pw.println(stackStateToString(mStackState)); final int numStacks = mStacks.size(); for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { final ActivityStack stack = mStacks.get(stackNdx); @@ -2143,7 +2164,7 @@ public class ActivityStackSupervisor { return true; } - static final void dumpHistoryList(FileDescriptor fd, PrintWriter pw, List<ActivityRecord> list, + static void dumpHistoryList(FileDescriptor fd, PrintWriter pw, List<ActivityRecord> list, String prefix, String label, boolean complete, boolean brief, boolean client, String dumpPackage) { TaskRecord lastTask = null; @@ -2285,6 +2306,8 @@ public class ActivityStackSupervisor { void restore() { ActivityStackSupervisor supervisor = ActivityStackSupervisor.this; supervisor.mFocusedStack = mSavedFocusedStack; + if (DEBUG_STACK) Slog.d(TAG, "UserState.restore: mStackState old=" + + stackStateToString(mSavedStackState)); supervisor.mStackState = mSavedStackState; } } diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index 4e7c215..a6713a2 100644 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -5508,6 +5508,7 @@ public class WindowManagerService extends IWindowManager.Stub boolean including = false; appWin = null; final WindowList windows = displayContent.getWindowList(); + final Rect stackBounds = new Rect(); for (int i = windows.size() - 1; i >= 0; i--) { WindowState ws = windows.get(i); if (!ws.mHasSurface) { @@ -5530,6 +5531,7 @@ public class WindowManagerService extends IWindowManager.Stub continue; } appWin = ws; + stackBounds.set(ws.getStackBounds()); } } @@ -5555,6 +5557,7 @@ public class WindowManagerService extends IWindowManager.Stub int right = wf.right - cr.right; int bottom = wf.bottom - cr.bottom; frame.union(left, top, right, bottom); + frame.intersect(stackBounds); } if (ws.mAppToken != null && ws.mAppToken.token == appToken && @@ -5598,9 +5601,11 @@ public class WindowManagerService extends IWindowManager.Stub // Constrain thumbnail to smaller of screen width or height. Assumes aspect // of thumbnail is the same as the screen (in landscape) or square. + scale = Math.max(width / (float) fw, height / (float) fh); + /* float targetWidthScale = width / (float) fw; float targetHeightScale = height / (float) fh; - if (dw <= dh) { + if (fw <= fh) { scale = targetWidthScale; // If aspect of thumbnail is the same as the screen (in landscape), // select the slightly larger value so we fill the entire bitmap @@ -5615,6 +5620,7 @@ public class WindowManagerService extends IWindowManager.Stub scale = targetWidthScale; } } + */ // The screen shot will contain the entire screen. dw = (int)(dw*scale); @@ -5649,9 +5655,10 @@ public class WindowManagerService extends IWindowManager.Stub } Bitmap bm = Bitmap.createBitmap(width, height, rawss.getConfig()); + frame.scale(scale); Matrix matrix = new Matrix(); ScreenRotationAnimation.createRotationMatrix(rot, dw, dh, matrix); - matrix.postTranslate(-FloatMath.ceil(frame.left*scale), -FloatMath.ceil(frame.top*scale)); + matrix.postTranslate(-FloatMath.ceil(frame.left), -FloatMath.ceil(frame.top)); Canvas canvas = new Canvas(bm); canvas.drawColor(0xFF000000); canvas.drawBitmap(rawss, matrix, null); |