Merge "[RESTRICT AUTOMERGE] Strip part of the activity info of another uid if no privilege" into sc-dev
This commit is contained in:
@@ -84,7 +84,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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -974,7 +974,7 @@ class RecentTasks {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
res.add(createRecentTaskInfo(task, true /* stripExtras */));
|
res.add(createRecentTaskInfo(task, true /* stripExtras */, getTasksAllowed));
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@@ -1886,7 +1886,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.
|
||||||
@@ -1898,6 +1899,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) {
|
||||||
|
|||||||
@@ -137,6 +137,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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4156,6 +4156,54 @@ class Task extends WindowContainer<WindowContainer> {
|
|||||||
info.mTopActivityLocusId = topRecord != null ? topRecord.getLocusId() : null;
|
info.mTopActivityLocusId = topRecord != null ? topRecord.getLocusId() : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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) {
|
||||||
|
// Making a copy to prevent eliminating the info in the original ActivityRecord.
|
||||||
|
info.topActivityInfo = new ActivityInfo(info.topActivityInfo);
|
||||||
|
info.topActivityInfo.applicationInfo =
|
||||||
|
new ApplicationInfo(info.topActivityInfo.applicationInfo);
|
||||||
|
|
||||||
|
// Strip the sensitive info.
|
||||||
|
info.topActivity = new ComponentName("", "");
|
||||||
|
info.topActivityInfo.packageName = "";
|
||||||
|
info.topActivityInfo.taskAffinity = "";
|
||||||
|
info.topActivityInfo.processName = "";
|
||||||
|
info.topActivityInfo.name = "";
|
||||||
|
info.topActivityInfo.parentActivityName = "";
|
||||||
|
info.topActivityInfo.targetActivity = "";
|
||||||
|
info.topActivityInfo.splitName = "";
|
||||||
|
info.topActivityInfo.applicationInfo.className = "";
|
||||||
|
info.topActivityInfo.applicationInfo.credentialProtectedDataDir = "";
|
||||||
|
info.topActivityInfo.applicationInfo.dataDir = "";
|
||||||
|
info.topActivityInfo.applicationInfo.deviceProtectedDataDir = "";
|
||||||
|
info.topActivityInfo.applicationInfo.manageSpaceActivityName = "";
|
||||||
|
info.topActivityInfo.applicationInfo.nativeLibraryDir = "";
|
||||||
|
info.topActivityInfo.applicationInfo.nativeLibraryRootDir = "";
|
||||||
|
info.topActivityInfo.applicationInfo.processName = "";
|
||||||
|
info.topActivityInfo.applicationInfo.publicSourceDir = "";
|
||||||
|
info.topActivityInfo.applicationInfo.scanPublicSourceDir = "";
|
||||||
|
info.topActivityInfo.applicationInfo.scanSourceDir = "";
|
||||||
|
info.topActivityInfo.applicationInfo.sourceDir = "";
|
||||||
|
info.topActivityInfo.applicationInfo.taskAffinity = "";
|
||||||
|
info.topActivityInfo.applicationInfo.name = "";
|
||||||
|
info.topActivityInfo.applicationInfo.packageName = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (task.effectiveUid != baseActivityUid) {
|
||||||
|
info.baseActivity = new ComponentName("", "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable PictureInPictureParams getPictureInPictureParams() {
|
@Nullable PictureInPictureParams getPictureInPictureParams() {
|
||||||
return getPictureInPictureParams(getTopMostTask());
|
return getPictureInPictureParams(getTopMostTask());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
@@ -1145,21 +1146,36 @@ 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();
|
||||||
|
final ComponentName componentName = new ComponentName("com.foo", ".BarActivity");
|
||||||
|
new ActivityBuilder(mSupervisor.mService)
|
||||||
|
.setTask(task)
|
||||||
|
.setUid(NOBODY_UID)
|
||||||
|
.setComponent(componentName)
|
||||||
|
.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);
|
||||||
assertTrue(info.supportsSplitScreenMultiWindow);
|
assertTrue(info.supportsSplitScreenMultiWindow);
|
||||||
|
|
||||||
|
info = mRecentTasks.createRecentTaskInfo(task, true /* stripExtras */,
|
||||||
|
false /* getTasksAllowed */);
|
||||||
|
|
||||||
|
assertFalse(info.topActivity.equals(componentName));
|
||||||
|
assertFalse(info.topActivityInfo.packageName.equals(componentName.getPackageName()));
|
||||||
|
assertFalse(info.baseActivity.equals(componentName));
|
||||||
|
|
||||||
// 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);
|
||||||
assertTrue(info.supportsSplitScreenMultiWindow);
|
assertTrue(info.supportsSplitScreenMultiWindow);
|
||||||
@@ -1169,7 +1185,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);
|
||||||
assertFalse(info.supportsSplitScreenMultiWindow);
|
assertFalse(info.supportsSplitScreenMultiWindow);
|
||||||
@@ -1178,7 +1195,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);
|
||||||
assertTrue(info.supportsSplitScreenMultiWindow);
|
assertTrue(info.supportsSplitScreenMultiWindow);
|
||||||
|
|||||||
Reference in New Issue
Block a user