Trim the activity info of another uid if no privilege
The activity info could be from another uid which is different from the app that hosts the task. The information should be trimmed if the caller app doesn't have the privilege. Bug: 243130512 Test: verified locally Test: atest RecentTasksTest Change-Id: Ia343ac70e5bb9aeae718fca6674e1ca491a14512
This commit is contained in:
@@ -98,7 +98,7 @@ class AppTaskImpl extends IAppTask.Stub {
|
|||||||
throw new IllegalArgumentException("Unable to find task ID " + mTaskId);
|
throw new IllegalArgumentException("Unable to find task ID " + mTaskId);
|
||||||
}
|
}
|
||||||
return mService.getRecentTasks().createRecentTaskInfo(task,
|
return mService.getRecentTasks().createRecentTaskInfo(task,
|
||||||
false /* stripExtras */);
|
false /* stripExtras */, true /* getTasksAllowed */);
|
||||||
} finally {
|
} finally {
|
||||||
Binder.restoreCallingIdentity(origId);
|
Binder.restoreCallingIdentity(origId);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -976,7 +976,7 @@ class RecentTasks {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
res.add(createRecentTaskInfo(task, true /* stripExtras */));
|
res.add(createRecentTaskInfo(task, true /* stripExtras */, getTasksAllowed));
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@@ -1895,7 +1895,8 @@ class RecentTasks {
|
|||||||
/**
|
/**
|
||||||
* Creates a new RecentTaskInfo from a Task.
|
* Creates a new RecentTaskInfo from a Task.
|
||||||
*/
|
*/
|
||||||
ActivityManager.RecentTaskInfo createRecentTaskInfo(Task tr, boolean stripExtras) {
|
ActivityManager.RecentTaskInfo createRecentTaskInfo(Task tr, boolean stripExtras,
|
||||||
|
boolean getTasksAllowed) {
|
||||||
final ActivityManager.RecentTaskInfo rti = new ActivityManager.RecentTaskInfo();
|
final ActivityManager.RecentTaskInfo rti = new ActivityManager.RecentTaskInfo();
|
||||||
// If the recent Task is detached, we consider it will be re-attached to the default
|
// If the recent Task is detached, we consider it will be re-attached to the default
|
||||||
// TaskDisplayArea because we currently only support recent overview in the default TDA.
|
// TaskDisplayArea because we currently only support recent overview in the default TDA.
|
||||||
@@ -1907,6 +1908,9 @@ class RecentTasks {
|
|||||||
rti.id = rti.isRunning ? rti.taskId : INVALID_TASK_ID;
|
rti.id = rti.isRunning ? rti.taskId : INVALID_TASK_ID;
|
||||||
rti.persistentId = rti.taskId;
|
rti.persistentId = rti.taskId;
|
||||||
rti.lastSnapshotData.set(tr.mLastTaskSnapshotData);
|
rti.lastSnapshotData.set(tr.mLastTaskSnapshotData);
|
||||||
|
if (!getTasksAllowed) {
|
||||||
|
Task.trimIneffectiveInfo(tr, rti);
|
||||||
|
}
|
||||||
|
|
||||||
// Fill in organized child task info for the task created by organizer.
|
// Fill in organized child task info for the task created by organizer.
|
||||||
if (tr.mCreatedByOrganizer) {
|
if (tr.mCreatedByOrganizer) {
|
||||||
|
|||||||
@@ -142,6 +142,10 @@ class RunningTasks {
|
|||||||
task.fillTaskInfo(rti, !mKeepIntentExtra);
|
task.fillTaskInfo(rti, !mKeepIntentExtra);
|
||||||
// Fill in some deprecated values
|
// Fill in some deprecated values
|
||||||
rti.id = rti.taskId;
|
rti.id = rti.taskId;
|
||||||
|
|
||||||
|
if (!mAllowed) {
|
||||||
|
Task.trimIneffectiveInfo(task, rti);
|
||||||
|
}
|
||||||
return rti;
|
return rti;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3446,6 +3446,27 @@ class Task extends TaskFragment {
|
|||||||
info.isSleeping = shouldSleepActivities();
|
info.isSleeping = shouldSleepActivities();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the activity info if the activity belongs to a different uid, which is
|
||||||
|
* different from the app that hosts the task.
|
||||||
|
*/
|
||||||
|
static void trimIneffectiveInfo(Task task, TaskInfo info) {
|
||||||
|
final ActivityRecord baseActivity = task.getActivity(r -> !r.finishing,
|
||||||
|
false /* traverseTopToBottom */);
|
||||||
|
final int baseActivityUid =
|
||||||
|
baseActivity != null ? baseActivity.getUid() : task.effectiveUid;
|
||||||
|
|
||||||
|
if (info.topActivityInfo != null
|
||||||
|
&& task.effectiveUid != info.topActivityInfo.applicationInfo.uid) {
|
||||||
|
info.topActivity = null;
|
||||||
|
info.topActivityInfo = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (task.effectiveUid != baseActivityUid) {
|
||||||
|
info.baseActivity = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable PictureInPictureParams getPictureInPictureParams() {
|
@Nullable PictureInPictureParams getPictureInPictureParams() {
|
||||||
final Task topTask = getTopMostTask();
|
final Task topTask = getTopMostTask();
|
||||||
if (topTask == null) return null;
|
if (topTask == null) return null;
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
|
|||||||
import static android.content.pm.ActivityInfo.LAUNCH_MULTIPLE;
|
import static android.content.pm.ActivityInfo.LAUNCH_MULTIPLE;
|
||||||
import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_INSTANCE;
|
import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_INSTANCE;
|
||||||
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
|
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
|
||||||
|
import static android.os.Process.NOBODY_UID;
|
||||||
|
|
||||||
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
|
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
|
||||||
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
|
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
|
||||||
@@ -1220,20 +1221,34 @@ public class RecentTasksTest extends WindowTestsBase {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCreateRecentTaskInfo_detachedTask() {
|
public void testCreateRecentTaskInfo_detachedTask() {
|
||||||
final Task task = createTaskBuilder(".Task").setCreateActivity(true).build();
|
final Task task = createTaskBuilder(".Task").build();
|
||||||
|
new ActivityBuilder(mSupervisor.mService)
|
||||||
|
.setTask(task)
|
||||||
|
.setUid(NOBODY_UID)
|
||||||
|
.setComponent(getUniqueComponentName())
|
||||||
|
.build();
|
||||||
final TaskDisplayArea tda = task.getDisplayArea();
|
final TaskDisplayArea tda = task.getDisplayArea();
|
||||||
|
|
||||||
assertTrue(task.isAttached());
|
assertTrue(task.isAttached());
|
||||||
assertTrue(task.supportsMultiWindow());
|
assertTrue(task.supportsMultiWindow());
|
||||||
|
|
||||||
RecentTaskInfo info = mRecentTasks.createRecentTaskInfo(task, true);
|
RecentTaskInfo info = mRecentTasks.createRecentTaskInfo(task, true /* stripExtras */,
|
||||||
|
true /* getTasksAllowed */);
|
||||||
|
|
||||||
assertTrue(info.supportsMultiWindow);
|
assertTrue(info.supportsMultiWindow);
|
||||||
|
|
||||||
|
info = mRecentTasks.createRecentTaskInfo(task, true /* stripExtras */,
|
||||||
|
false /* getTasksAllowed */);
|
||||||
|
|
||||||
|
assertTrue(info.topActivity == null);
|
||||||
|
assertTrue(info.topActivityInfo == null);
|
||||||
|
assertTrue(info.baseActivity == null);
|
||||||
|
|
||||||
// The task can be put in split screen even if it is not attached now.
|
// The task can be put in split screen even if it is not attached now.
|
||||||
task.removeImmediately();
|
task.removeImmediately();
|
||||||
|
|
||||||
info = mRecentTasks.createRecentTaskInfo(task, true);
|
info = mRecentTasks.createRecentTaskInfo(task, true /* stripExtras */,
|
||||||
|
true /* getTasksAllowed */);
|
||||||
|
|
||||||
assertTrue(info.supportsMultiWindow);
|
assertTrue(info.supportsMultiWindow);
|
||||||
|
|
||||||
@@ -1242,7 +1257,8 @@ public class RecentTasksTest extends WindowTestsBase {
|
|||||||
doReturn(false).when(tda).supportsNonResizableMultiWindow();
|
doReturn(false).when(tda).supportsNonResizableMultiWindow();
|
||||||
doReturn(false).when(task).isResizeable();
|
doReturn(false).when(task).isResizeable();
|
||||||
|
|
||||||
info = mRecentTasks.createRecentTaskInfo(task, true);
|
info = mRecentTasks.createRecentTaskInfo(task, true /* stripExtras */,
|
||||||
|
true /* getTasksAllowed */);
|
||||||
|
|
||||||
assertFalse(info.supportsMultiWindow);
|
assertFalse(info.supportsMultiWindow);
|
||||||
|
|
||||||
@@ -1250,7 +1266,8 @@ public class RecentTasksTest extends WindowTestsBase {
|
|||||||
// the device supports it.
|
// the device supports it.
|
||||||
doReturn(true).when(tda).supportsNonResizableMultiWindow();
|
doReturn(true).when(tda).supportsNonResizableMultiWindow();
|
||||||
|
|
||||||
info = mRecentTasks.createRecentTaskInfo(task, true);
|
info = mRecentTasks.createRecentTaskInfo(task, true /* stripExtras */,
|
||||||
|
true /* getTasksAllowed */);
|
||||||
|
|
||||||
assertTrue(info.supportsMultiWindow);
|
assertTrue(info.supportsMultiWindow);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user