summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCraig Mautner <cmautner@google.com>2013-05-15 11:40:05 -0700
committerCraig Mautner <cmautner@google.com>2013-05-15 12:40:10 -0700
commit76ea2246781a899659ce4e24f3b75d17d2f0745d (patch)
treefaa2da34b62a25be6ebd08d91a1fc7906829bae1
parent121e521fa1f12979eaeba9bdc5711fcecff6577d (diff)
downloadframeworks_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
-rw-r--r--services/java/com/android/server/am/ActivityManagerService.java2
-rw-r--r--services/java/com/android/server/am/ActivityStackSupervisor.java53
-rw-r--r--services/java/com/android/server/wm/WindowManagerService.java11
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);