Merge "CameraServiceProxy: Query recent tasks for top activity data" into sc-v2-dev

This commit is contained in:
TreeHugger Robot
2021-12-10 18:58:45 +00:00
committed by Android (Google) Code Review
2 changed files with 39 additions and 60 deletions

View File

@@ -180,6 +180,7 @@
<assign-permission name="android.permission.WATCH_APPOPS" uid="cameraserver" /> <assign-permission name="android.permission.WATCH_APPOPS" uid="cameraserver" />
<assign-permission name="android.permission.MANAGE_APP_OPS_MODES" uid="cameraserver" /> <assign-permission name="android.permission.MANAGE_APP_OPS_MODES" uid="cameraserver" />
<assign-permission name="android.permission.OBSERVE_SENSOR_PRIVACY" uid="cameraserver" /> <assign-permission name="android.permission.OBSERVE_SENSOR_PRIVACY" uid="cameraserver" />
<assign-permission name="android.permission.REAL_GET_TASKS" uid="cameraserver" />
<assign-permission name="android.permission.ACCESS_SURFACE_FLINGER" uid="graphics" /> <assign-permission name="android.permission.ACCESS_SURFACE_FLINGER" uid="graphics" />

View File

@@ -25,7 +25,6 @@ import android.annotation.TestApi;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.app.ActivityTaskManager; import android.app.ActivityTaskManager;
import android.app.compat.CompatChanges; import android.app.compat.CompatChanges;
import android.app.TaskStackListener;
import android.compat.annotation.ChangeId; import android.compat.annotation.ChangeId;
import android.compat.annotation.Disabled; import android.compat.annotation.Disabled;
import android.compat.annotation.Overridable; import android.compat.annotation.Overridable;
@@ -35,6 +34,7 @@ import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.ParceledListSlice;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.hardware.CameraSessionStats; import android.hardware.CameraSessionStats;
import android.hardware.CameraStreamStats; import android.hardware.CameraStreamStats;
@@ -84,7 +84,6 @@ import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@@ -309,8 +308,6 @@ public class CameraServiceProxy extends SystemService
private final DisplayWindowListener mDisplayWindowListener = new DisplayWindowListener(); private final DisplayWindowListener mDisplayWindowListener = new DisplayWindowListener();
private final TaskStateHandler mTaskStackListener = new TaskStateHandler();
public static final class TaskInfo { public static final class TaskInfo {
public int frontTaskId; public int frontTaskId;
public boolean isResizeable; public boolean isResizeable;
@@ -320,54 +317,6 @@ public class CameraServiceProxy extends SystemService
public int userId; public int userId;
} }
private final class TaskStateHandler extends TaskStackListener {
private final Object mMapLock = new Object();
// maps the package name to its corresponding current top level task id
@GuardedBy("mMapLock")
private final ArrayMap<String, TaskInfo> mTaskInfoMap = new ArrayMap<>();
@Override
public void onTaskMovedToFront(ActivityManager.RunningTaskInfo taskInfo) {
synchronized (mMapLock) {
TaskInfo info = new TaskInfo();
info.frontTaskId = taskInfo.taskId;
info.isResizeable =
(taskInfo.topActivityInfo.resizeMode != RESIZE_MODE_UNRESIZEABLE);
info.displayId = taskInfo.displayId;
info.userId = taskInfo.userId;
info.isFixedOrientationLandscape = ActivityInfo.isFixedOrientationLandscape(
taskInfo.topActivityInfo.screenOrientation);
info.isFixedOrientationPortrait = ActivityInfo.isFixedOrientationPortrait(
taskInfo.topActivityInfo.screenOrientation);
mTaskInfoMap.put(taskInfo.topActivityInfo.packageName, info);
}
}
@Override
public void onTaskRemoved(int taskId) {
synchronized (mMapLock) {
for (Map.Entry<String, TaskInfo> entry : mTaskInfoMap.entrySet()){
if (entry.getValue().frontTaskId == taskId) {
mTaskInfoMap.remove(entry.getKey());
break;
}
}
}
}
public @Nullable TaskInfo getFrontTaskInfo(String packageName) {
synchronized (mMapLock) {
if (mTaskInfoMap.containsKey(packageName)) {
return mTaskInfoMap.get(packageName);
}
}
Log.e(TAG, "Top task with package name: " + packageName + " not found!");
return null;
}
}
private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
@@ -490,18 +439,53 @@ public class CameraServiceProxy extends SystemService
private final ICameraServiceProxy.Stub mCameraServiceProxy = new ICameraServiceProxy.Stub() { private final ICameraServiceProxy.Stub mCameraServiceProxy = new ICameraServiceProxy.Stub() {
@Override @Override
public int getRotateAndCropOverride(String packageName, int lensFacing) { public int getRotateAndCropOverride(String packageName, int lensFacing, int userId) {
if (Binder.getCallingUid() != Process.CAMERASERVER_UID) { if (Binder.getCallingUid() != Process.CAMERASERVER_UID) {
Slog.e(TAG, "Calling UID: " + Binder.getCallingUid() + " doesn't match expected " + Slog.e(TAG, "Calling UID: " + Binder.getCallingUid() + " doesn't match expected " +
" camera service UID!"); " camera service UID!");
return CaptureRequest.SCALER_ROTATE_AND_CROP_NONE; return CaptureRequest.SCALER_ROTATE_AND_CROP_NONE;
} }
TaskInfo taskInfo = null;
ParceledListSlice<ActivityManager.RecentTaskInfo> recentTasks = null;
try {
recentTasks = ActivityTaskManager.getService().getRecentTasks(/*maxNum*/1,
/*flags*/ 0, userId);
} catch (RemoteException e) {
Log.e(TAG, "Failed to query recent tasks!");
return CaptureRequest.SCALER_ROTATE_AND_CROP_NONE;
}
if ((recentTasks != null) && (!recentTasks.getList().isEmpty())) {
ActivityManager.RecentTaskInfo task = recentTasks.getList().get(0);
if (packageName.equals(task.topActivityInfo.packageName)) {
taskInfo = new TaskInfo();
taskInfo.frontTaskId = task.taskId;
taskInfo.isResizeable =
(task.topActivityInfo.resizeMode != RESIZE_MODE_UNRESIZEABLE);
taskInfo.displayId = task.displayId;
taskInfo.userId = task.userId;
taskInfo.isFixedOrientationLandscape =
ActivityInfo.isFixedOrientationLandscape(
task.topActivityInfo.screenOrientation);
taskInfo.isFixedOrientationPortrait =
ActivityInfo.isFixedOrientationPortrait(
task.topActivityInfo.screenOrientation);
} else {
Log.e(TAG, "Recent task package name: " + task.topActivityInfo.packageName
+ " doesn't match with camera client package name: " + packageName);
return CaptureRequest.SCALER_ROTATE_AND_CROP_NONE;
}
} else {
Log.e(TAG, "Recent task list is empty!");
return CaptureRequest.SCALER_ROTATE_AND_CROP_NONE;
}
// TODO: Modify the sensor orientation in camera characteristics along with any 3A // TODO: Modify the sensor orientation in camera characteristics along with any 3A
// regions in capture requests/results to account for thea physical rotation. The // regions in capture requests/results to account for thea physical rotation. The
// former is somewhat tricky as it assumes that camera clients always check for the // former is somewhat tricky as it assumes that camera clients always check for the
// current value by retrieving the camera characteristics from the camera device. // current value by retrieving the camera characteristics from the camera device.
TaskInfo taskInfo = mTaskStackListener.getFrontTaskInfo(packageName);
if ((taskInfo != null) && (CompatChanges.isChangeEnabled( if ((taskInfo != null) && (CompatChanges.isChangeEnabled(
OVERRIDE_CAMERA_ROTATE_AND_CROP_DEFAULTS, packageName, OVERRIDE_CAMERA_ROTATE_AND_CROP_DEFAULTS, packageName,
UserHandle.getUserHandleForUid(taskInfo.userId)))) { UserHandle.getUserHandleForUid(taskInfo.userId)))) {
@@ -672,12 +656,6 @@ public class CameraServiceProxy extends SystemService
if (phase == PHASE_BOOT_COMPLETED) { if (phase == PHASE_BOOT_COMPLETED) {
CameraStatsJobService.schedule(mContext); CameraStatsJobService.schedule(mContext);
try {
ActivityTaskManager.getService().registerTaskStackListener(mTaskStackListener);
} catch (RemoteException e) {
Log.e(TAG, "Failed to register task stack listener!");
}
try { try {
int[] displayIds = WindowManagerGlobal.getWindowManagerService() int[] displayIds = WindowManagerGlobal.getWindowManagerService()
.registerDisplayWindowListener(mDisplayWindowListener); .registerDisplayWindowListener(mDisplayWindowListener);