Merge "Ensure task will be attached when starting activity from AppTask" into tm-dev
This commit is contained in:
@@ -1935,6 +1935,14 @@ class ActivityStarter {
|
|||||||
} else if (mSourceRecord != null) {
|
} else if (mSourceRecord != null) {
|
||||||
return mSourceRecord.getTask();
|
return mSourceRecord.getTask();
|
||||||
} else if (mInTask != null) {
|
} else if (mInTask != null) {
|
||||||
|
// The task is specified from AppTaskImpl, so it may not be attached yet.
|
||||||
|
if (!mInTask.isAttached()) {
|
||||||
|
// Clear reuse task so it can find a proper parent to add the task.
|
||||||
|
if (mReuseTask == mInTask) {
|
||||||
|
mReuseTask = null;
|
||||||
|
}
|
||||||
|
return getOrCreateRootTask(mStartActivity, mLaunchFlags, mInTask, mOptions);
|
||||||
|
}
|
||||||
return mInTask;
|
return mInTask;
|
||||||
} else {
|
} else {
|
||||||
final Task rootTask = getOrCreateRootTask(mStartActivity, mLaunchFlags, null /* task */,
|
final Task rootTask = getOrCreateRootTask(mStartActivity, mLaunchFlags, null /* task */,
|
||||||
|
|||||||
@@ -26,6 +26,8 @@ import android.content.Intent;
|
|||||||
import android.os.Binder;
|
import android.os.Binder;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
|
import android.os.Parcel;
|
||||||
|
import android.os.RemoteException;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -53,6 +55,16 @@ class AppTaskImpl extends IAppTask.Stub {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
|
||||||
|
throws RemoteException {
|
||||||
|
try {
|
||||||
|
return super.onTransact(code, data, reply, flags);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
throw ActivityTaskManagerService.logAndRethrowRuntimeExceptionOnTransact(TAG, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void finishAndRemoveTask() {
|
public void finishAndRemoveTask() {
|
||||||
checkCaller();
|
checkCaller();
|
||||||
|
|||||||
@@ -1139,18 +1139,8 @@ public class ActivityStarterTests extends WindowTestsBase {
|
|||||||
true /* createdByOrganizer */);
|
true /* createdByOrganizer */);
|
||||||
sourceRecord.getTask().addChild(taskFragment, POSITION_TOP);
|
sourceRecord.getTask().addChild(taskFragment, POSITION_TOP);
|
||||||
|
|
||||||
starter.startActivityInner(
|
startActivityInner(starter, targetRecord, sourceRecord, null /* options */,
|
||||||
/* r */targetRecord,
|
null /* inTask */, taskFragment);
|
||||||
/* sourceRecord */ sourceRecord,
|
|
||||||
/* voiceSession */null,
|
|
||||||
/* voiceInteractor */ null,
|
|
||||||
/* startFlags */ 0,
|
|
||||||
/* doResume */true,
|
|
||||||
/* options */null,
|
|
||||||
/* inTask */null,
|
|
||||||
/* inTaskFragment */ taskFragment,
|
|
||||||
/* restrictedBgActivity */false,
|
|
||||||
/* intentGrants */null);
|
|
||||||
|
|
||||||
assertFalse(taskFragment.hasChild());
|
assertFalse(taskFragment.hasChild());
|
||||||
}
|
}
|
||||||
@@ -1167,18 +1157,8 @@ public class ActivityStarterTests extends WindowTestsBase {
|
|||||||
taskFragment.setTaskFragmentOrganizer(mock(TaskFragmentOrganizerToken.class), SYSTEM_UID,
|
taskFragment.setTaskFragmentOrganizer(mock(TaskFragmentOrganizerToken.class), SYSTEM_UID,
|
||||||
"system_uid");
|
"system_uid");
|
||||||
|
|
||||||
starter.startActivityInner(
|
startActivityInner(starter, targetRecord, sourceRecord, null /* options */,
|
||||||
/* r */targetRecord,
|
null /* inTask */, taskFragment);
|
||||||
/* sourceRecord */ sourceRecord,
|
|
||||||
/* voiceSession */null,
|
|
||||||
/* voiceInteractor */ null,
|
|
||||||
/* startFlags */ 0,
|
|
||||||
/* doResume */true,
|
|
||||||
/* options */null,
|
|
||||||
/* inTask */null,
|
|
||||||
/* inTaskFragment */ taskFragment,
|
|
||||||
/* restrictedBgActivity */false,
|
|
||||||
/* intentGrants */null);
|
|
||||||
|
|
||||||
assertTrue(taskFragment.hasChild());
|
assertTrue(taskFragment.hasChild());
|
||||||
}
|
}
|
||||||
@@ -1195,18 +1175,8 @@ public class ActivityStarterTests extends WindowTestsBase {
|
|||||||
taskFragment.setTaskFragmentOrganizer(mock(TaskFragmentOrganizerToken.class),
|
taskFragment.setTaskFragmentOrganizer(mock(TaskFragmentOrganizerToken.class),
|
||||||
targetRecord.getUid(), "test_process_name");
|
targetRecord.getUid(), "test_process_name");
|
||||||
|
|
||||||
starter.startActivityInner(
|
startActivityInner(starter, targetRecord, sourceRecord, null /* options */,
|
||||||
/* r */targetRecord,
|
null /* inTask */, taskFragment);
|
||||||
/* sourceRecord */ sourceRecord,
|
|
||||||
/* voiceSession */null,
|
|
||||||
/* voiceInteractor */ null,
|
|
||||||
/* startFlags */ 0,
|
|
||||||
/* doResume */true,
|
|
||||||
/* options */null,
|
|
||||||
/* inTask */null,
|
|
||||||
/* inTaskFragment */ taskFragment,
|
|
||||||
/* restrictedBgActivity */false,
|
|
||||||
/* intentGrants */null);
|
|
||||||
|
|
||||||
assertTrue(taskFragment.hasChild());
|
assertTrue(taskFragment.hasChild());
|
||||||
}
|
}
|
||||||
@@ -1231,18 +1201,8 @@ public class ActivityStarterTests extends WindowTestsBase {
|
|||||||
doReturn(true).when(signingDetails).hasAncestorOrSelfWithDigest(any());
|
doReturn(true).when(signingDetails).hasAncestorOrSelfWithDigest(any());
|
||||||
doReturn(signingDetails).when(androidPackage).getSigningDetails();
|
doReturn(signingDetails).when(androidPackage).getSigningDetails();
|
||||||
|
|
||||||
starter.startActivityInner(
|
startActivityInner(starter, targetRecord, sourceRecord, null /* options */,
|
||||||
/* r */targetRecord,
|
null /* inTask */, taskFragment);
|
||||||
/* sourceRecord */ sourceRecord,
|
|
||||||
/* voiceSession */null,
|
|
||||||
/* voiceInteractor */ null,
|
|
||||||
/* startFlags */ 0,
|
|
||||||
/* doResume */true,
|
|
||||||
/* options */null,
|
|
||||||
/* inTask */null,
|
|
||||||
/* inTaskFragment */ taskFragment,
|
|
||||||
/* restrictedBgActivity */false,
|
|
||||||
/* intentGrants */null);
|
|
||||||
|
|
||||||
assertTrue(taskFragment.hasChild());
|
assertTrue(taskFragment.hasChild());
|
||||||
}
|
}
|
||||||
@@ -1258,22 +1218,29 @@ public class ActivityStarterTests extends WindowTestsBase {
|
|||||||
|
|
||||||
targetRecord.info.flags |= ActivityInfo.FLAG_ALLOW_UNTRUSTED_ACTIVITY_EMBEDDING;
|
targetRecord.info.flags |= ActivityInfo.FLAG_ALLOW_UNTRUSTED_ACTIVITY_EMBEDDING;
|
||||||
|
|
||||||
starter.startActivityInner(
|
startActivityInner(starter, targetRecord, sourceRecord, null /* options */,
|
||||||
/* r */targetRecord,
|
null /* inTask */, taskFragment);
|
||||||
/* sourceRecord */ sourceRecord,
|
|
||||||
/* voiceSession */null,
|
|
||||||
/* voiceInteractor */ null,
|
|
||||||
/* startFlags */ 0,
|
|
||||||
/* doResume */true,
|
|
||||||
/* options */null,
|
|
||||||
/* inTask */null,
|
|
||||||
/* inTaskFragment */ taskFragment,
|
|
||||||
/* restrictedBgActivity */false,
|
|
||||||
/* intentGrants */null);
|
|
||||||
|
|
||||||
assertTrue(taskFragment.hasChild());
|
assertTrue(taskFragment.hasChild());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testStartActivityInner_inTask() {
|
||||||
|
final ActivityStarter starter = prepareStarter(0, false);
|
||||||
|
// Simulate an app uses AppTask to create a non-attached task, and then it requests to
|
||||||
|
// start activity in the task.
|
||||||
|
final Task inTask = new TaskBuilder(mSupervisor).setTaskDisplayArea(null).setTaskId(123)
|
||||||
|
.build();
|
||||||
|
inTask.inRecents = true;
|
||||||
|
assertFalse(inTask.isAttached());
|
||||||
|
final ActivityRecord target = new ActivityBuilder(mAtm).build();
|
||||||
|
startActivityInner(starter, target, null /* source */, null /* options */, inTask,
|
||||||
|
null /* inTaskFragment */);
|
||||||
|
|
||||||
|
assertTrue(inTask.isAttached());
|
||||||
|
assertEquals(inTask, target.getTask());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testLaunchCookie_newAndExistingTask() {
|
public void testLaunchCookie_newAndExistingTask() {
|
||||||
final ActivityStarter starter = prepareStarter(0, false);
|
final ActivityStarter starter = prepareStarter(0, false);
|
||||||
@@ -1322,21 +1289,20 @@ public class ActivityStarterTests extends WindowTestsBase {
|
|||||||
|
|
||||||
// Start the target launch-into-pip activity from a source
|
// Start the target launch-into-pip activity from a source
|
||||||
final ActivityRecord sourceRecord = new ActivityBuilder(mAtm).setCreateTask(true).build();
|
final ActivityRecord sourceRecord = new ActivityBuilder(mAtm).setCreateTask(true).build();
|
||||||
starter.startActivityInner(
|
startActivityInner(starter, targetRecord, sourceRecord, opts,
|
||||||
/* r */ targetRecord,
|
null /* inTask */, null /* inTaskFragment */);
|
||||||
/* sourceRecord */ sourceRecord,
|
|
||||||
/* voiceSession */ null,
|
|
||||||
/* voiceInteractor */ null,
|
|
||||||
/* startFlags */ 0,
|
|
||||||
/* doResume */ true,
|
|
||||||
/* options */ opts,
|
|
||||||
/* inTask */ null,
|
|
||||||
/* inTaskFragment */ null,
|
|
||||||
/* restrictedBgActivity */ false,
|
|
||||||
/* intentGrants */ null);
|
|
||||||
|
|
||||||
// Verify the ActivityRecord#getLaunchIntoPipHostActivity points to sourceRecord.
|
// Verify the ActivityRecord#getLaunchIntoPipHostActivity points to sourceRecord.
|
||||||
assertThat(targetRecord.getLaunchIntoPipHostActivity()).isNotNull();
|
assertThat(targetRecord.getLaunchIntoPipHostActivity()).isNotNull();
|
||||||
assertEquals(targetRecord.getLaunchIntoPipHostActivity(), sourceRecord);
|
assertEquals(targetRecord.getLaunchIntoPipHostActivity(), sourceRecord);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void startActivityInner(ActivityStarter starter, ActivityRecord target,
|
||||||
|
ActivityRecord source, ActivityOptions options, Task inTask,
|
||||||
|
TaskFragment inTaskFragment) {
|
||||||
|
starter.startActivityInner(target, source, null /* voiceSession */,
|
||||||
|
null /* voiceInteractor */, 0 /* startFlags */, true /* doResume */,
|
||||||
|
options, inTask, inTaskFragment, false /* restrictedBgActivity */,
|
||||||
|
null /* intentGrants */);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user