1 /*
2  * Copyright (C) 2021 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.wm.shell.tasksurfacehelper;
18 
19 import android.app.ActivityManager.RunningTaskInfo;
20 import android.graphics.Rect;
21 import android.view.SurfaceControl;
22 
23 import com.android.wm.shell.ShellTaskOrganizer;
24 import com.android.wm.shell.common.ShellExecutor;
25 
26 import java.util.concurrent.Executor;
27 import java.util.function.Consumer;
28 
29 /**
30  * Intermediary controller that communicates with {@link ShellTaskOrganizer} to send commands
31  * to SurfaceControl.
32  */
33 public class TaskSurfaceHelperController {
34 
35     private final ShellTaskOrganizer mTaskOrganizer;
36     private final ShellExecutor mMainExecutor;
37     private final TaskSurfaceHelperImpl mImpl = new TaskSurfaceHelperImpl();
38 
TaskSurfaceHelperController(ShellTaskOrganizer taskOrganizer, ShellExecutor mainExecutor)39     public TaskSurfaceHelperController(ShellTaskOrganizer taskOrganizer,
40             ShellExecutor mainExecutor) {
41         mTaskOrganizer = taskOrganizer;
42         mMainExecutor = mainExecutor;
43     }
44 
asTaskSurfaceHelper()45     public TaskSurfaceHelper asTaskSurfaceHelper() {
46         return mImpl;
47     }
48 
49     /**
50      * Sends a Transaction to set the game mode metadata on the
51      * corresponding SurfaceControl
52      */
setGameModeForTask(int taskId, int gameMode)53     public void setGameModeForTask(int taskId, int gameMode) {
54         mTaskOrganizer.setSurfaceMetadata(taskId, SurfaceControl.METADATA_GAME_MODE, gameMode);
55     }
56 
57     /**
58      * Take screenshot of the specified task.
59      */
screenshotTask(RunningTaskInfo taskInfo, Rect crop, Consumer<SurfaceControl.ScreenshotHardwareBuffer> consumer)60     public void screenshotTask(RunningTaskInfo taskInfo, Rect crop,
61             Consumer<SurfaceControl.ScreenshotHardwareBuffer> consumer) {
62         mTaskOrganizer.screenshotTask(taskInfo, crop, consumer);
63     }
64 
65     private class TaskSurfaceHelperImpl implements TaskSurfaceHelper {
66         @Override
setGameModeForTask(int taskId, int gameMode)67         public void setGameModeForTask(int taskId, int gameMode) {
68             mMainExecutor.execute(() -> {
69                 TaskSurfaceHelperController.this.setGameModeForTask(taskId, gameMode);
70             });
71         }
72 
73         @Override
screenshotTask(RunningTaskInfo taskInfo, Rect crop, Executor executor, Consumer<SurfaceControl.ScreenshotHardwareBuffer> consumer)74         public void screenshotTask(RunningTaskInfo taskInfo, Rect crop, Executor executor,
75                 Consumer<SurfaceControl.ScreenshotHardwareBuffer> consumer) {
76             mMainExecutor.execute(() -> {
77                 TaskSurfaceHelperController.this.screenshotTask(taskInfo, crop,
78                         (t) -> executor.execute(() -> consumer.accept(t)));
79             });
80         }
81     }
82 }
83