Merge \"Adds a screenshot wallpaper method to WallpaperManagerService.\" into nyc-mr1-dev

am: b4d4ce31ab

Change-Id: I4737e4d758335240614d2d2b51c11b8c739160fc
This commit is contained in:
Zak Cohen
2016-07-13 10:22:02 +00:00
committed by android-build-merger
3 changed files with 55 additions and 6 deletions

View File

@@ -305,6 +305,11 @@ interface IWindowManager
*/
boolean isRotationFrozen();
/**
* Screenshot the current wallpaper layer, including the whole screen.
*/
Bitmap screenshotWallpaper();
/**
* Used only for assist -- request a screenshot of the current application.
*/

View File

@@ -6162,6 +6162,21 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
@Override
public Bitmap screenshotWallpaper() {
if (!checkCallingPermission(Manifest.permission.READ_FRAME_BUFFER,
"screenshotWallpaper()")) {
throw new SecurityException("Requires READ_FRAME_BUFFER permission");
}
try {
Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "screenshotWallpaper");
return screenshotApplicationsInner(null, Display.DEFAULT_DISPLAY, -1, -1, true, 1f,
Bitmap.Config.ARGB_8888, true);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
}
}
/**
* Takes a snapshot of the screen. In landscape mode this grabs the whole screen.
* In portrait mode, it grabs the upper region of the screen based on the vertical dimension
@@ -6178,7 +6193,7 @@ public class WindowManagerService extends IWindowManager.Stub
@Override
public void run() {
Bitmap bm = screenshotApplicationsInner(null, Display.DEFAULT_DISPLAY, -1, -1,
true, 1f, Bitmap.Config.ARGB_8888);
true, 1f, Bitmap.Config.ARGB_8888, false);
try {
receiver.send(bm);
} catch (RemoteException e) {
@@ -6208,14 +6223,27 @@ public class WindowManagerService extends IWindowManager.Stub
try {
Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "screenshotApplications");
return screenshotApplicationsInner(appToken, displayId, width, height, false,
frameScale, Bitmap.Config.RGB_565);
frameScale, Bitmap.Config.RGB_565, false);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
}
}
/**
* Takes a snapshot of the screen. In landscape mode this grabs the whole screen.
* In portrait mode, it grabs the full screenshot.
*
* @param displayId the Display to take a screenshot of.
* @param width the width of the target bitmap
* @param height the height of the target bitmap
* @param includeFullDisplay true if the screen should not be cropped before capture
* @param frameScale the scale to apply to the frame, only used when width = -1 and height = -1
* @param config of the output bitmap
* @param wallpaperOnly true if only the wallpaper layer should be included in the screenshot
*/
Bitmap screenshotApplicationsInner(IBinder appToken, int displayId, int width, int height,
boolean includeFullDisplay, float frameScale, Bitmap.Config config) {
boolean includeFullDisplay, float frameScale, Bitmap.Config config,
boolean wallpaperOnly) {
final DisplayContent displayContent;
synchronized(mWindowMap) {
displayContent = getDisplayContentLocked(displayId);
@@ -6242,7 +6270,7 @@ public class WindowManagerService extends IWindowManager.Stub
boolean screenshotReady;
int minLayer;
if (appToken == null) {
if (appToken == null && !wallpaperOnly) {
screenshotReady = true;
minLayer = 0;
} else {
@@ -6282,11 +6310,20 @@ public class WindowManagerService extends IWindowManager.Stub
if (ws.mLayer >= aboveAppLayer) {
continue;
}
if (wallpaperOnly && !ws.mIsWallpaper) {
continue;
}
if (ws.mIsImWindow) {
if (!includeImeInScreenshot) {
continue;
}
} else if (ws.mIsWallpaper) {
// If this is the wallpaper layer and we're only looking for the wallpaper layer
// then the target window state is this one.
if (wallpaperOnly) {
appWin = ws;
}
if (appWin == null) {
// We have not ran across the target window yet, so it is probably
// behind the wallpaper. This can happen when the keyguard is up and
@@ -6334,8 +6371,10 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
if (ws.mAppToken != null && ws.mAppToken.token == appToken &&
ws.isDisplayedLw() && winAnim.getShown()) {
final boolean foundTargetWs =
(ws.mAppToken != null && ws.mAppToken.token == appToken)
|| (appWin != null && wallpaperOnly);
if (foundTargetWs && ws.isDisplayedLw() && winAnim.getShown()) {
screenshotReady = true;
}

View File

@@ -590,4 +590,9 @@ public class IWindowManagerImpl implements IWindowManager {
@Override
public void removeWallpaperInputConsumer() throws RemoteException {}
@Override
public Bitmap screenshotWallpaper() throws RemoteException {
return null;
}
}