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