diff options
| -rw-r--r-- | data/etc/platform.xml | 1 | ||||
| -rw-r--r-- | services/core/java/com/android/server/camera/CameraServiceProxy.java | 98 |
2 files changed, 39 insertions, 60 deletions
diff --git a/data/etc/platform.xml b/data/etc/platform.xml index 756425eedabb..0b8dc3fe0dec 100644 --- a/data/etc/platform.xml +++ b/data/etc/platform.xml @@ -180,6 +180,7 @@ <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.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" /> diff --git a/services/core/java/com/android/server/camera/CameraServiceProxy.java b/services/core/java/com/android/server/camera/CameraServiceProxy.java index 5ce72c2fd080..3120dc58eebd 100644 --- a/services/core/java/com/android/server/camera/CameraServiceProxy.java +++ b/services/core/java/com/android/server/camera/CameraServiceProxy.java @@ -25,7 +25,6 @@ import android.annotation.TestApi; import android.app.ActivityManager; import android.app.ActivityTaskManager; import android.app.compat.CompatChanges; -import android.app.TaskStackListener; import android.compat.annotation.ChangeId; import android.compat.annotation.Disabled; import android.compat.annotation.Overridable; @@ -35,6 +34,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; +import android.content.pm.ParceledListSlice; import android.content.res.Configuration; import android.hardware.CameraSessionStats; import android.hardware.CameraStreamStats; @@ -84,7 +84,6 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.Map; import java.util.Set; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -309,8 +308,6 @@ public class CameraServiceProxy extends SystemService private final DisplayWindowListener mDisplayWindowListener = new DisplayWindowListener(); - private final TaskStateHandler mTaskStackListener = new TaskStateHandler(); - public static final class TaskInfo { public int frontTaskId; public boolean isResizeable; @@ -320,54 +317,6 @@ public class CameraServiceProxy extends SystemService 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() { @Override public void onReceive(Context context, Intent intent) { @@ -490,18 +439,53 @@ public class CameraServiceProxy extends SystemService private final ICameraServiceProxy.Stub mCameraServiceProxy = new ICameraServiceProxy.Stub() { @Override - public int getRotateAndCropOverride(String packageName, int lensFacing) { + public int getRotateAndCropOverride(String packageName, int lensFacing, int userId) { if (Binder.getCallingUid() != Process.CAMERASERVER_UID) { Slog.e(TAG, "Calling UID: " + Binder.getCallingUid() + " doesn't match expected " + " camera service UID!"); 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 // 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 // current value by retrieving the camera characteristics from the camera device. - TaskInfo taskInfo = mTaskStackListener.getFrontTaskInfo(packageName); if ((taskInfo != null) && (CompatChanges.isChangeEnabled( OVERRIDE_CAMERA_ROTATE_AND_CROP_DEFAULTS, packageName, UserHandle.getUserHandleForUid(taskInfo.userId)))) { @@ -673,12 +657,6 @@ public class CameraServiceProxy extends SystemService CameraStatsJobService.schedule(mContext); try { - ActivityTaskManager.getService().registerTaskStackListener(mTaskStackListener); - } catch (RemoteException e) { - Log.e(TAG, "Failed to register task stack listener!"); - } - - try { int[] displayIds = WindowManagerGlobal.getWindowManagerService() .registerDisplayWindowListener(mDisplayWindowListener); for (int i = 0; i < displayIds.length; i++) { |