Add a listener when task snapshots change
Since we start recents before we take the snapshot, we need to add
a mechanism to inform recents about task snapshots changes.
We add a new method to TaskStackChangedListener,
onTaskSnapshotChanged, which gets called whenever a task snapshot
changes. Then, SystemUI registers such a listener and updates the
task thumbnail view for the specific task.
Test: Open app, press recents, make sure thumbnail is up-to-date
Bug: 31339431
Change-Id: I01e81b9cd11886da734da671c68d5732aa51009f
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index 21ae853..5824c32 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -31,7 +31,6 @@
import android.app.ITaskStackListener;
import android.app.IUiAutomationConnection;
import android.app.IUidObserver;
-
import android.app.IUserSwitchObserver;
import android.app.Notification;
import android.app.PendingIntent;
diff --git a/core/java/android/app/ITaskStackListener.aidl b/core/java/android/app/ITaskStackListener.aidl
index ef997c9..6deedb6 100644
--- a/core/java/android/app/ITaskStackListener.aidl
+++ b/core/java/android/app/ITaskStackListener.aidl
@@ -102,4 +102,9 @@
* been locked.
*/
void onTaskProfileLocked(int taskId, int userId);
+
+ /**
+ * Called when a task snapshot got updated.
+ */
+ void onTaskSnapshotChanged(int taskId, in ActivityManager.TaskSnapshot snapshot);
}
diff --git a/core/java/android/app/TaskStackListener.java b/core/java/android/app/TaskStackListener.java
index ad5e69b..fd766bf 100644
--- a/core/java/android/app/TaskStackListener.java
+++ b/core/java/android/app/TaskStackListener.java
@@ -16,6 +16,7 @@
package android.app;
+import android.app.ActivityManager.TaskSnapshot;
import android.content.ComponentName;
import android.os.RemoteException;
@@ -78,4 +79,9 @@
@Override
public void onTaskProfileLocked(int taskId, int userId) {
}
+
+ @Override
+ public void onTaskSnapshotChanged(int taskId, TaskSnapshot snapshot)
+ throws RemoteException {
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
index 7547bc3..eccec9b 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
@@ -23,6 +23,7 @@
import static android.view.View.MeasureSpec;
import android.app.ActivityManager;
+import android.app.ActivityManager.TaskSnapshot;
import android.app.ActivityOptions;
import android.content.ActivityNotFoundException;
import android.content.Context;
@@ -60,6 +61,7 @@
import com.android.systemui.recents.events.component.ScreenPinningRequestEvent;
import com.android.systemui.recents.events.ui.DraggingInRecentsEndedEvent;
import com.android.systemui.recents.events.ui.DraggingInRecentsEvent;
+import com.android.systemui.recents.events.ui.TaskSnapshotChangedEvent;
import com.android.systemui.recents.misc.DozeTrigger;
import com.android.systemui.recents.misc.ForegroundThread;
import com.android.systemui.recents.misc.SystemServicesProxy;
@@ -131,6 +133,11 @@
loader.loadTasks(mContext, plan, launchOpts);
}
}
+
+ @Override
+ public void onTaskSnapshotChanged(int taskId, TaskSnapshot snapshot) {
+ EventBus.getDefault().send(new TaskSnapshotChangedEvent(taskId, snapshot));
+ }
}
protected static RecentsTaskLoadPlan sInstanceLoadPlan;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/events/ui/TaskSnapshotChangedEvent.java b/packages/SystemUI/src/com/android/systemui/recents/events/ui/TaskSnapshotChangedEvent.java
new file mode 100644
index 0000000..07c3b3d
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/recents/events/ui/TaskSnapshotChangedEvent.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.recents.events.ui;
+
+import android.app.ActivityManager.TaskSnapshot;
+
+import com.android.systemui.recents.events.EventBus;
+
+/**
+ * Sent when a task snapshot has changed.
+ */
+public class TaskSnapshotChangedEvent extends EventBus.Event {
+
+ public final int taskId;
+ public final TaskSnapshot taskSnapshot;
+
+ public TaskSnapshotChangedEvent(int taskId, TaskSnapshot taskSnapshot) {
+ this.taskId = taskId;
+ this.taskSnapshot = taskSnapshot;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
index 3587b89..a2b86d1 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
@@ -24,7 +24,9 @@
import static android.app.ActivityManager.StackId.PINNED_STACK_ID;
import static android.provider.Settings.Global.DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT;
+import android.annotation.NonNull;
import android.app.ActivityManager;
+import android.app.ActivityManager.TaskSnapshot;
import android.app.ActivityOptions;
import android.app.AppGlobals;
import android.app.IActivityManager;
@@ -148,6 +150,7 @@
*/
public abstract static class TaskStackListener {
public void onTaskStackChanged() { }
+ public void onTaskSnapshotChanged(int taskId, TaskSnapshot snapshot) { }
public void onActivityPinned() { }
public void onPinnedActivityRestartAttempt() { }
public void onPinnedStackAnimationEnded() { }
@@ -202,6 +205,12 @@
public void onTaskProfileLocked(int taskId, int userId) {
mHandler.obtainMessage(H.ON_TASK_PROFILE_LOCKED, taskId, userId).sendToTarget();
}
+
+ @Override
+ public void onTaskSnapshotChanged(int taskId, TaskSnapshot snapshot)
+ throws RemoteException {
+ mHandler.obtainMessage(H.ON_TASK_SNAPSHOT_CHANGED, taskId, 0, snapshot).sendToTarget();
+ }
};
/**
@@ -591,17 +600,17 @@
/** Returns the top task thumbnail for the given task id */
public ThumbnailData getTaskThumbnail(int taskId) {
if (mAm == null) return null;
- ThumbnailData thumbnailData = new ThumbnailData();
// If we are mocking, then just return a dummy thumbnail
if (RecentsDebugFlags.Static.EnableMockTasks) {
+ ThumbnailData thumbnailData = new ThumbnailData();
thumbnailData.thumbnail = Bitmap.createBitmap(mDummyThumbnailWidth,
mDummyThumbnailHeight, Bitmap.Config.ARGB_8888);
thumbnailData.thumbnail.eraseColor(0xff333333);
return thumbnailData;
}
- getThumbnail(taskId, thumbnailData);
+ ThumbnailData thumbnailData = getThumbnail(taskId);
if (thumbnailData.thumbnail != null && !ActivityManager.ENABLE_TASK_SNAPSHOTS) {
thumbnailData.thumbnail.setHasAlpha(false);
// We use a dumb heuristic for now, if the thumbnail is purely transparent in the top
@@ -621,11 +630,12 @@
/**
* Returns a task thumbnail from the activity manager
*/
- public void getThumbnail(int taskId, ThumbnailData thumbnailDataOut) {
+ public @NonNull ThumbnailData getThumbnail(int taskId) {
if (mAm == null) {
- return;
+ return new ThumbnailData();
}
+ final ThumbnailData thumbnailData;
if (ActivityManager.ENABLE_TASK_SNAPSHOTS) {
ActivityManager.TaskSnapshot snapshot = null;
try {
@@ -634,16 +644,14 @@
Log.w(TAG, "Failed to retrieve snapshot", e);
}
if (snapshot != null) {
- thumbnailDataOut.thumbnail = Bitmap.createHardwareBitmap(snapshot.getSnapshot());
- thumbnailDataOut.orientation = snapshot.getOrientation();
- thumbnailDataOut.insets.set(snapshot.getContentInsets());
+ thumbnailData = ThumbnailData.createFromTaskSnapshot(snapshot);
} else {
- thumbnailDataOut.thumbnail = null;
+ return new ThumbnailData();
}
} else {
ActivityManager.TaskThumbnail taskThumbnail = mAm.getTaskThumbnail(taskId);
if (taskThumbnail == null) {
- return;
+ return new ThumbnailData();
}
Bitmap thumbnail = taskThumbnail.mainThumbnail;
@@ -658,10 +666,12 @@
} catch (IOException e) {
}
}
- thumbnailDataOut.thumbnail = thumbnail;
- thumbnailDataOut.orientation = taskThumbnail.thumbnailInfo.screenOrientation;
- thumbnailDataOut.insets.setEmpty();
+ thumbnailData = new ThumbnailData();
+ thumbnailData.thumbnail = thumbnail;
+ thumbnailData.orientation = taskThumbnail.thumbnailInfo.screenOrientation;
+ thumbnailData.insets.setEmpty();
}
+ return thumbnailData;
}
/**
@@ -1172,12 +1182,13 @@
private final class H extends Handler {
private static final int ON_TASK_STACK_CHANGED = 1;
- private static final int ON_ACTIVITY_PINNED = 2;
- private static final int ON_PINNED_ACTIVITY_RESTART_ATTEMPT = 3;
- private static final int ON_PINNED_STACK_ANIMATION_ENDED = 4;
- private static final int ON_ACTIVITY_FORCED_RESIZABLE = 5;
- private static final int ON_ACTIVITY_DISMISSING_DOCKED_STACK = 6;
- private static final int ON_TASK_PROFILE_LOCKED = 7;
+ private static final int ON_TASK_SNAPSHOT_CHANGED = 2;
+ private static final int ON_ACTIVITY_PINNED = 3;
+ private static final int ON_PINNED_ACTIVITY_RESTART_ATTEMPT = 4;
+ private static final int ON_PINNED_STACK_ANIMATION_ENDED = 5;
+ private static final int ON_ACTIVITY_FORCED_RESIZABLE = 6;
+ private static final int ON_ACTIVITY_DISMISSING_DOCKED_STACK = 7;
+ private static final int ON_TASK_PROFILE_LOCKED = 8;
@Override
public void handleMessage(Message msg) {
@@ -1188,6 +1199,13 @@
}
break;
}
+ case ON_TASK_SNAPSHOT_CHANGED: {
+ for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
+ mTaskStackListeners.get(i).onTaskSnapshotChanged(msg.arg1,
+ (TaskSnapshot) msg.obj);
+ }
+ break;
+ }
case ON_ACTIVITY_PINNED: {
for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
mTaskStackListeners.get(i).onActivityPinned();
diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/ThumbnailData.java b/packages/SystemUI/src/com/android/systemui/recents/model/ThumbnailData.java
index 18735ac..09a3712 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/model/ThumbnailData.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/ThumbnailData.java
@@ -16,6 +16,7 @@
package com.android.systemui.recents.model;
+import android.app.ActivityManager.TaskSnapshot;
import android.graphics.Bitmap;
import android.graphics.Rect;
@@ -23,7 +24,17 @@
* Data for a single thumbnail.
*/
public class ThumbnailData {
+
+ // TODO: Make these final once the non-snapshot path is removed.
public Bitmap thumbnail;
public int orientation;
public final Rect insets = new Rect();
+
+ public static ThumbnailData createFromTaskSnapshot(TaskSnapshot snapshot) {
+ ThumbnailData out = new ThumbnailData();
+ out.thumbnail = Bitmap.createHardwareBitmap(snapshot.getSnapshot());
+ out.insets.set(snapshot.getContentInsets());
+ out.orientation = snapshot.getOrientation();
+ return out;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
index 5f37349..e41a718 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
@@ -22,7 +22,6 @@
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
-import android.app.ActivityManager;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Outline;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java
index e3bf1df..bae5daa 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java
@@ -35,6 +35,9 @@
import android.view.ViewDebug;
import com.android.systemui.R;
+import com.android.systemui.recents.events.EventBus;
+import com.android.systemui.recents.events.EventBus.Event;
+import com.android.systemui.recents.events.ui.TaskSnapshotChangedEvent;
import com.android.systemui.recents.misc.Utilities;
import com.android.systemui.recents.model.Task;
import com.android.systemui.recents.model.ThumbnailData;
@@ -347,6 +350,7 @@
mBgFillPaint.setColor(t.colorBackground);
}
mLockedPaint.setColor(t.colorPrimary);
+ EventBus.getDefault().register(this);
}
/**
@@ -361,6 +365,14 @@
void unbindFromTask() {
mTask = null;
setThumbnail(null);
+ EventBus.getDefault().unregister(this);
+ }
+
+ public final void onBusEvent(TaskSnapshotChangedEvent event) {
+ if (mTask == null || event.taskId != mTask.key.id || event.taskSnapshot == null) {
+ return;
+ }
+ setThumbnail(ThumbnailData.createFromTaskSnapshot(event.taskSnapshot));
}
public void dump(String prefix, PrintWriter writer) {
diff --git a/services/core/java/com/android/server/am/TaskChangeNotificationController.java b/services/core/java/com/android/server/am/TaskChangeNotificationController.java
index cb20eac..d035fa9 100644
--- a/services/core/java/com/android/server/am/TaskChangeNotificationController.java
+++ b/services/core/java/com/android/server/am/TaskChangeNotificationController.java
@@ -16,6 +16,8 @@
package com.android.server.am;
+import android.app.ActivityManager;
+import android.app.ActivityManager.TaskSnapshot;
import android.app.ITaskStackListener;
import android.app.ActivityManager.TaskDescription;
import android.content.ComponentName;
@@ -43,6 +45,7 @@
static final int NOTIFY_ACTIVITY_REQUESTED_ORIENTATION_CHANGED_LISTENERS = 12;
static final int NOTIFY_TASK_REMOVAL_STARTED_LISTENERS = 13;
static final int NOTIFY_TASK_PROFILE_LOCKED_LISTENERS_MSG = 14;
+ static final int NOTIFY_TASK_SNAPSHOT_CHANGED_LISTENERS_MSG = 15;
// Delay in notifying task stack change listeners (in millis)
static final int NOTIFY_TASK_STACK_CHANGE_LISTENERS_DELAY = 100;
@@ -113,6 +116,10 @@
l.onTaskProfileLocked(m.arg1, m.arg2);
};
+ private final TaskStackConsumer mNotifyTaskSnapshotChanged = (l, m) -> {
+ l.onTaskSnapshotChanged(m.arg1, (TaskSnapshot) m.obj);
+ };
+
@FunctionalInterface
public interface TaskStackConsumer {
void accept(ITaskStackListener t, Message m) throws RemoteException;
@@ -170,7 +177,9 @@
break;
case NOTIFY_TASK_PROFILE_LOCKED_LISTENERS_MSG:
forAllRemoteListeners(mNotifyTaskProfileLocked, msg);
-
+ break;
+ case NOTIFY_TASK_SNAPSHOT_CHANGED_LISTENERS_MSG:
+ forAllRemoteListeners(mNotifyTaskSnapshotChanged, msg);
break;
}
}
@@ -348,4 +357,14 @@
forAllLocalListeners(mNotifyTaskProfileLocked, msg);
msg.sendToTarget();
}
+
+ /**
+ * Notify listeners that the snapshot of a task has changed.
+ */
+ void notifyTaskSnapshotChanged(int taskId, TaskSnapshot snapshot) {
+ final Message msg = mHandler.obtainMessage(NOTIFY_TASK_SNAPSHOT_CHANGED_LISTENERS_MSG,
+ taskId, 0, snapshot);
+ forAllLocalListeners(mNotifyTaskSnapshotChanged, msg);
+ msg.sendToTarget();
+ }
}
diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java
index 9e22c50..c3f657e 100644
--- a/services/core/java/com/android/server/am/TaskRecord.java
+++ b/services/core/java/com/android/server/am/TaskRecord.java
@@ -52,6 +52,8 @@
import com.android.internal.util.XmlUtils;
import com.android.server.wm.TaskWindowContainerController;
+import com.android.server.wm.TaskWindowContainerListener;
+
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
@@ -103,7 +105,7 @@
import static com.android.server.am.ActivityRecord.STARTING_WINDOW_SHOWN;
import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS;
-final class TaskRecord extends ConfigurationContainer {
+final class TaskRecord extends ConfigurationContainer implements TaskWindowContainerListener {
private static final String TAG = TAG_WITH_CLASS_NAME ? "TaskRecord" : TAG_AM;
private static final String TAG_ADD_REMOVE = TAG + POSTFIX_ADD_REMOVE;
private static final String TAG_RECENTS = TAG + POSTFIX_RECENTS;
@@ -410,8 +412,8 @@
final Rect bounds = updateOverrideConfigurationFromLaunchBounds();
final Configuration overrideConfig = getOverrideConfiguration();
- mWindowContainerController = new TaskWindowContainerController(taskId, getStackId(), userId,
- bounds, overrideConfig, mResizeMode, isHomeTask(), isOnTopLauncher(), onTop,
+ mWindowContainerController = new TaskWindowContainerController(taskId, this, getStackId(),
+ userId, bounds, overrideConfig, mResizeMode, isHomeTask(), isOnTopLauncher(), onTop,
showForAllUsers);
}
@@ -427,6 +429,11 @@
mWindowContainerController = null;
}
+ @Override
+ public void onSnapshotChanged(TaskSnapshot snapshot) {
+ mService.mTaskChangeNotificationController.notifyTaskSnapshotChanged(taskId, snapshot);
+ }
+
void setResizeMode(int resizeMode) {
if (mResizeMode == resizeMode) {
return;
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index b1b7542..f3196b1 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -639,6 +639,10 @@
return mFillsParent || !StackId.isTaskResizeAllowed(mStack.mStackId);
}
+ TaskWindowContainerController getController() {
+ return (TaskWindowContainerController) super.getController();
+ }
+
@Override
public String toString() {
return "{taskId=" + mTaskId + " appTokens=" + mChildren + " mdr=" + mDeferRemoval + "}";
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java
index efa72a6..bce2099 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotController.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java
@@ -17,17 +17,10 @@
package com.android.server.wm;
import static android.app.ActivityManager.ENABLE_TASK_SNAPSHOTS;
-import static android.graphics.Bitmap.Config.ARGB_8888;
-import static android.graphics.GraphicBuffer.USAGE_HW_TEXTURE;
-import static android.graphics.GraphicBuffer.USAGE_SW_READ_NEVER;
-import static android.graphics.GraphicBuffer.USAGE_SW_WRITE_NEVER;
-import static android.graphics.PixelFormat.RGBA_8888;
import android.annotation.Nullable;
import android.app.ActivityManager.StackId;
import android.app.ActivityManager.TaskSnapshot;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
import android.graphics.GraphicBuffer;
import android.util.ArraySet;
import android.view.WindowManagerPolicy.StartingSurface;
@@ -76,6 +69,9 @@
final TaskSnapshot snapshot = snapshotTask(task);
if (snapshot != null) {
mCache.putSnapshot(task, snapshot);
+ if (task.getController() != null) {
+ task.getController().reportSnapshotChanged(snapshot);
+ }
}
}
}
diff --git a/services/core/java/com/android/server/wm/TaskWindowContainerController.java b/services/core/java/com/android/server/wm/TaskWindowContainerController.java
index 0e4d048..75b3f3e 100644
--- a/services/core/java/com/android/server/wm/TaskWindowContainerController.java
+++ b/services/core/java/com/android/server/wm/TaskWindowContainerController.java
@@ -18,8 +18,10 @@
import android.app.ActivityManager.TaskSnapshot;
import android.content.res.Configuration;
-import android.graphics.GraphicBuffer;
import android.graphics.Rect;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
import android.util.EventLog;
import android.util.Slog;
@@ -37,14 +39,28 @@
* Test class: {@link TaskWindowContainerControllerTests}
*/
public class TaskWindowContainerController
- extends WindowContainerController<Task, WindowContainerListener> {
+ extends WindowContainerController<Task, TaskWindowContainerListener> {
+
+ private static final int REPORT_SNAPSHOT_CHANGED = 0;
private final int mTaskId;
- public TaskWindowContainerController(int taskId, int stackId, int userId, Rect bounds,
- Configuration overrideConfig, int resizeMode, boolean homeTask, boolean isOnTopLauncher,
- boolean toTop, boolean showForAllUsers) {
- super(null, WindowManagerService.getInstance());
+ private final Handler mHandler = new Handler(Looper.getMainLooper()) {
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case REPORT_SNAPSHOT_CHANGED:
+ mListener.onSnapshotChanged((TaskSnapshot) msg.obj);
+ break;
+ }
+ }
+ };
+
+ public TaskWindowContainerController(int taskId, TaskWindowContainerListener listener,
+ int stackId, int userId, Rect bounds, Configuration overrideConfig, int resizeMode,
+ boolean homeTask, boolean isOnTopLauncher, boolean toTop, boolean showForAllUsers) {
+ super(listener, WindowManagerService.getInstance());
mTaskId = taskId;
synchronized(mWindowMap) {
@@ -253,6 +269,10 @@
}
}
+ void reportSnapshotChanged(TaskSnapshot snapshot) {
+ mHandler.obtainMessage(REPORT_SNAPSHOT_CHANGED, snapshot).sendToTarget();
+ }
+
@Override
public String toString() {
return "{TaskWindowContainerController taskId=" + mTaskId + "}";
diff --git a/services/core/java/com/android/server/wm/TaskWindowContainerListener.java b/services/core/java/com/android/server/wm/TaskWindowContainerListener.java
new file mode 100644
index 0000000..61b202d
--- /dev/null
+++ b/services/core/java/com/android/server/wm/TaskWindowContainerListener.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.wm;
+
+import android.app.ActivityManager.TaskSnapshot;
+
+/**
+ * Interface used by the creator of the controller to listen to changes with the container.
+ */
+public interface TaskWindowContainerListener extends WindowContainerListener {
+
+ /**
+ * Called when the snapshot of this task has changed.
+ */
+ void onSnapshotChanged(TaskSnapshot snapshot);
+}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index b04ff42..9d945f0 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -235,6 +235,8 @@
import java.util.HashMap;
import java.util.List;
+import static android.Manifest.permission.MANAGE_ACTIVITY_STACKS;
+import static android.Manifest.permission.READ_FRAME_BUFFER;
/** {@hide} */
public class WindowManagerService extends IWindowManager.Stub
implements Watchdog.Monitor, WindowManagerPolicy.WindowManagerFuncs {
@@ -3854,7 +3856,7 @@
@Override
public Bitmap screenshotWallpaper() {
- if (!checkCallingPermission(Manifest.permission.READ_FRAME_BUFFER,
+ if (!checkCallingPermission(READ_FRAME_BUFFER,
"screenshotWallpaper()")) {
throw new SecurityException("Requires READ_FRAME_BUFFER permission");
}
@@ -3876,7 +3878,7 @@
*/
@Override
public boolean requestAssistScreenshot(final IAssistScreenshotReceiver receiver) {
- if (!checkCallingPermission(Manifest.permission.READ_FRAME_BUFFER,
+ if (!checkCallingPermission(READ_FRAME_BUFFER,
"requestAssistScreenshot()")) {
throw new SecurityException("Requires READ_FRAME_BUFFER permission");
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
index 466bd67..25f2c6e 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
@@ -19,6 +19,8 @@
import org.junit.Assert;
import org.junit.Before;
+import android.app.ActivityManager;
+import android.app.ActivityManager.TaskSnapshot;
import android.content.Context;
import android.os.IBinder;
import android.support.test.InstrumentationRegistry;
@@ -208,7 +210,7 @@
class TestTaskWindowContainerController extends TaskWindowContainerController {
TestTaskWindowContainerController(int stackId) {
- super(sNextTaskId++, stackId, 0 /* userId */, null /* bounds */,
+ super(sNextTaskId++, snapshot -> {}, stackId, 0 /* userId */, null /* bounds */,
EMPTY /* overrideConfig*/, RESIZE_MODE_UNRESIZEABLE, false /* homeTask*/,
false /* isOnTopLauncher */, true /* toTop*/, true /* showForAllUsers */);
}