Loading services/core/java/com/android/server/wm/ActivityRecord.java +155 −14 Original line number Diff line number Diff line Loading @@ -1491,13 +1491,14 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } } ActivityRecord(ActivityTaskManagerService _service, WindowProcessController _caller, private ActivityRecord(ActivityTaskManagerService _service, WindowProcessController _caller, int _launchedFromPid, int _launchedFromUid, String _launchedFromPackage, @Nullable String _launchedFromFeature, Intent _intent, String _resolvedType, ActivityInfo aInfo, Configuration _configuration, ActivityRecord _resultTo, String _resultWho, int _reqCode, boolean _componentSpecified, boolean _rootVoiceInteraction, ActivityTaskSupervisor supervisor, ActivityOptions options, ActivityRecord sourceRecord) { ActivityOptions options, ActivityRecord sourceRecord, PersistableBundle persistentState, TaskDescription _taskDescription, long _createTime) { super(_service.mWindowManager, new Token(_intent).asBinder(), TYPE_APPLICATION, true, null /* displayContent */, false /* ownerCanManageAppTokens */); Loading Loading @@ -1652,6 +1653,12 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A mHandoverLaunchDisplayId = options.getLaunchDisplayId(); mLaunchCookie = options.getLaunchCookie(); } mPersistentState = persistentState; taskDescription = _taskDescription; if (_createTime > 0) { createTime = _createTime; } } /** Loading Loading @@ -7544,18 +7551,18 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A throw new XmlPullParserException("restoreActivity resolver error. Intent=" + intent + " resolvedType=" + resolvedType); } final ActivityRecord r = new ActivityRecord(service, null /* caller */, 0 /* launchedFromPid */, launchedFromUid, launchedFromPackage, launchedFromFeature, intent, resolvedType, aInfo, service.getConfiguration(), null /* resultTo */, null /* resultWho */, 0 /* reqCode */, componentSpecified, false /* rootVoiceInteraction */, taskSupervisor, null /* options */, null /* sourceRecord */); r.mPersistentState = persistentState; r.taskDescription = taskDescription; r.createTime = createTime; return r; return new ActivityRecord.Builder(service) .setLaunchedFromUid(launchedFromUid) .setLaunchedFromPackage(launchedFromPackage) .setLaunchedFromFeature(launchedFromFeature) .setIntent(intent) .setResolvedType(resolvedType) .setActivityInfo(aInfo) .setComponentSpecified(componentSpecified) .setPersistentState(persistentState) .setTaskDescription(taskDescription) .setCreateTime(createTime) .build(); } private static boolean isInVrUiMode(Configuration config) { Loading Loading @@ -7983,4 +7990,138 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } return false; } static class Builder { private final ActivityTaskManagerService mAtmService; private WindowProcessController mCallerApp; private int mLaunchedFromPid; private int mLaunchedFromUid; private String mLaunchedFromPackage; private String mLaunchedFromFeature; private Intent mIntent; private String mResolvedType; private ActivityInfo mActivityInfo; private Configuration mConfiguration; private ActivityRecord mResultTo; private String mResultWho; private int mRequestCode; private boolean mComponentSpecified; private boolean mRootVoiceInteraction; private ActivityOptions mOptions; private ActivityRecord mSourceRecord; private PersistableBundle mPersistentState; private TaskDescription mTaskDescription; private long mCreateTime; Builder(ActivityTaskManagerService service) { mAtmService = service; } Builder setCaller(@NonNull WindowProcessController caller) { mCallerApp = caller; return this; } Builder setLaunchedFromPid(int pid) { mLaunchedFromPid = pid; return this; } Builder setLaunchedFromUid(int uid) { mLaunchedFromUid = uid; return this; } Builder setLaunchedFromPackage(String fromPackage) { mLaunchedFromPackage = fromPackage; return this; } Builder setLaunchedFromFeature(String fromFeature) { mLaunchedFromFeature = fromFeature; return this; } Builder setIntent(Intent intent) { mIntent = intent; return this; } Builder setResolvedType(String resolvedType) { mResolvedType = resolvedType; return this; } Builder setActivityInfo(ActivityInfo activityInfo) { mActivityInfo = activityInfo; return this; } Builder setResultTo(ActivityRecord resultTo) { mResultTo = resultTo; return this; } Builder setResultWho(String resultWho) { mResultWho = resultWho; return this; } Builder setRequestCode(int reqCode) { mRequestCode = reqCode; return this; } Builder setComponentSpecified(boolean componentSpecified) { mComponentSpecified = componentSpecified; return this; } Builder setRootVoiceInteraction(boolean rootVoiceInteraction) { mRootVoiceInteraction = rootVoiceInteraction; return this; } Builder setActivityOptions(ActivityOptions options) { mOptions = options; return this; } Builder setConfiguration(Configuration config) { mConfiguration = config; return this; } Builder setSourceRecord(ActivityRecord source) { mSourceRecord = source; return this; } private Builder setPersistentState(PersistableBundle persistentState) { mPersistentState = persistentState; return this; } private Builder setTaskDescription(TaskDescription taskDescription) { mTaskDescription = taskDescription; return this; } private Builder setCreateTime(long createTime) { mCreateTime = createTime; return this; } ActivityRecord build() { if (mConfiguration == null) { mConfiguration = mAtmService.getConfiguration(); } return new ActivityRecord(mAtmService, mCallerApp, mLaunchedFromPid, mLaunchedFromUid, mLaunchedFromPackage, mLaunchedFromFeature, mIntent, mResolvedType, mActivityInfo, mConfiguration, mResultTo, mResultWho, mRequestCode, mComponentSpecified, mRootVoiceInteraction, mAtmService.mTaskSupervisor, mOptions, mSourceRecord, mPersistentState, mTaskDescription, mCreateTime); } } } services/core/java/com/android/server/wm/ActivityStarter.java +18 −5 Original line number Diff line number Diff line Loading @@ -1161,12 +1161,25 @@ class ActivityStarter { aInfo = mSupervisor.resolveActivity(intent, rInfo, startFlags, null /*profilerInfo*/); } final ActivityRecord r = new ActivityRecord.Builder(mService) .setCaller(callerApp) .setLaunchedFromPid(callingPid) .setLaunchedFromUid(callingUid) .setLaunchedFromPackage(callingPackage) .setLaunchedFromFeature(callingFeatureId) .setIntent(intent) .setResolvedType(resolvedType) .setActivityInfo(aInfo) .setConfiguration(mService.getGlobalConfiguration()) .setResultTo(resultRecord) .setResultWho(resultWho) .setRequestCode(requestCode) .setComponentSpecified(request.componentSpecified) .setRootVoiceInteraction(voiceSession != null) .setActivityOptions(checkedOptions) .setSourceRecord(sourceRecord) .build(); final ActivityRecord r = new ActivityRecord(mService, callerApp, callingPid, callingUid, callingPackage, callingFeatureId, intent, resolvedType, aInfo, mService.getGlobalConfiguration(), resultRecord, resultWho, requestCode, request.componentSpecified, voiceSession != null, mSupervisor, checkedOptions, sourceRecord); mLastStartActivityRecord = r; if (r.appTimeTracker == null && sourceRecord != null) { Loading services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +3 −0 Original line number Diff line number Diff line Loading @@ -384,6 +384,7 @@ public class ActivityRecordTests extends WindowTestsBase { .build(); final Task task = activity.getTask(); activity.setState(DESTROYED, "Testing"); clearInvocations(mAtm.getLifecycleManager()); final Configuration newConfig = new Configuration(task.getConfiguration()); newConfig.orientation = newConfig.orientation == ORIENTATION_PORTRAIT Loading @@ -408,6 +409,7 @@ public class ActivityRecordTests extends WindowTestsBase { activity.setLastReportedConfiguration(new MergedConfiguration(new Configuration(), activity.getConfiguration())); clearInvocations(mAtm.getLifecycleManager()); final Configuration newConfig = new Configuration(activity.getConfiguration()); final int shortSide = Math.min(newConfig.screenWidthDp, newConfig.screenHeightDp); final int longSide = Math.max(newConfig.screenWidthDp, newConfig.screenHeightDp); Loading Loading @@ -596,6 +598,7 @@ public class ActivityRecordTests extends WindowTestsBase { final Task stack = new TaskBuilder(mSupervisor).setCreateActivity(true).build(); try { clearInvocations(mAtm.getLifecycleManager()); doReturn(false).when(stack).isTranslucent(any()); assertTrue(task.shouldBeVisible(null /* starting */)); Loading services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +9 −9 Original line number Diff line number Diff line Loading @@ -27,6 +27,8 @@ import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; import static android.os.Process.SYSTEM_UID; import static android.view.View.VISIBLE; import static android.view.WindowManager.DISPLAY_IME_POLICY_FALLBACK_DISPLAY; import static android.view.WindowManager.DISPLAY_IME_POLICY_LOCAL; import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW; import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW; Loading @@ -40,8 +42,6 @@ import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR; import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE; import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR; import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; import static android.view.WindowManager.DISPLAY_IME_POLICY_LOCAL; import static android.view.WindowManager.DISPLAY_IME_POLICY_FALLBACK_DISPLAY; import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; Loading @@ -64,7 +64,6 @@ import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.res.Configuration; import android.hardware.display.DisplayManager; import android.os.Build; import android.os.Bundle; Loading Loading @@ -831,13 +830,14 @@ class WindowTestsBase extends SystemServiceTestsBase { if (mLaunchTaskBehind) { options = ActivityOptions.makeTaskLaunchBehind(); } final ActivityRecord activity = new ActivityRecord.Builder(mService) .setLaunchedFromPid(mLaunchedFromPid) .setLaunchedFromUid(mLaunchedFromUid) .setIntent(intent) .setActivityInfo(aInfo) .setActivityOptions(options) .build(); final ActivityRecord activity = new ActivityRecord(mService, null /* caller */, mLaunchedFromPid /* launchedFromPid */, mLaunchedFromUid /* launchedFromUid */, null, null, intent, null, aInfo /*aInfo*/, new Configuration(), null /* resultTo */, null /* resultWho */, 0 /* reqCode */, false /*componentSpecified*/, false /* rootVoiceInteraction */, mService.mTaskSupervisor, options, null /* sourceRecord */); spyOn(activity); if (mTask != null) { // fullscreen value is normally read from resources in ctor, so for testing we need Loading Loading
services/core/java/com/android/server/wm/ActivityRecord.java +155 −14 Original line number Diff line number Diff line Loading @@ -1491,13 +1491,14 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } } ActivityRecord(ActivityTaskManagerService _service, WindowProcessController _caller, private ActivityRecord(ActivityTaskManagerService _service, WindowProcessController _caller, int _launchedFromPid, int _launchedFromUid, String _launchedFromPackage, @Nullable String _launchedFromFeature, Intent _intent, String _resolvedType, ActivityInfo aInfo, Configuration _configuration, ActivityRecord _resultTo, String _resultWho, int _reqCode, boolean _componentSpecified, boolean _rootVoiceInteraction, ActivityTaskSupervisor supervisor, ActivityOptions options, ActivityRecord sourceRecord) { ActivityOptions options, ActivityRecord sourceRecord, PersistableBundle persistentState, TaskDescription _taskDescription, long _createTime) { super(_service.mWindowManager, new Token(_intent).asBinder(), TYPE_APPLICATION, true, null /* displayContent */, false /* ownerCanManageAppTokens */); Loading Loading @@ -1652,6 +1653,12 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A mHandoverLaunchDisplayId = options.getLaunchDisplayId(); mLaunchCookie = options.getLaunchCookie(); } mPersistentState = persistentState; taskDescription = _taskDescription; if (_createTime > 0) { createTime = _createTime; } } /** Loading Loading @@ -7544,18 +7551,18 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A throw new XmlPullParserException("restoreActivity resolver error. Intent=" + intent + " resolvedType=" + resolvedType); } final ActivityRecord r = new ActivityRecord(service, null /* caller */, 0 /* launchedFromPid */, launchedFromUid, launchedFromPackage, launchedFromFeature, intent, resolvedType, aInfo, service.getConfiguration(), null /* resultTo */, null /* resultWho */, 0 /* reqCode */, componentSpecified, false /* rootVoiceInteraction */, taskSupervisor, null /* options */, null /* sourceRecord */); r.mPersistentState = persistentState; r.taskDescription = taskDescription; r.createTime = createTime; return r; return new ActivityRecord.Builder(service) .setLaunchedFromUid(launchedFromUid) .setLaunchedFromPackage(launchedFromPackage) .setLaunchedFromFeature(launchedFromFeature) .setIntent(intent) .setResolvedType(resolvedType) .setActivityInfo(aInfo) .setComponentSpecified(componentSpecified) .setPersistentState(persistentState) .setTaskDescription(taskDescription) .setCreateTime(createTime) .build(); } private static boolean isInVrUiMode(Configuration config) { Loading Loading @@ -7983,4 +7990,138 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } return false; } static class Builder { private final ActivityTaskManagerService mAtmService; private WindowProcessController mCallerApp; private int mLaunchedFromPid; private int mLaunchedFromUid; private String mLaunchedFromPackage; private String mLaunchedFromFeature; private Intent mIntent; private String mResolvedType; private ActivityInfo mActivityInfo; private Configuration mConfiguration; private ActivityRecord mResultTo; private String mResultWho; private int mRequestCode; private boolean mComponentSpecified; private boolean mRootVoiceInteraction; private ActivityOptions mOptions; private ActivityRecord mSourceRecord; private PersistableBundle mPersistentState; private TaskDescription mTaskDescription; private long mCreateTime; Builder(ActivityTaskManagerService service) { mAtmService = service; } Builder setCaller(@NonNull WindowProcessController caller) { mCallerApp = caller; return this; } Builder setLaunchedFromPid(int pid) { mLaunchedFromPid = pid; return this; } Builder setLaunchedFromUid(int uid) { mLaunchedFromUid = uid; return this; } Builder setLaunchedFromPackage(String fromPackage) { mLaunchedFromPackage = fromPackage; return this; } Builder setLaunchedFromFeature(String fromFeature) { mLaunchedFromFeature = fromFeature; return this; } Builder setIntent(Intent intent) { mIntent = intent; return this; } Builder setResolvedType(String resolvedType) { mResolvedType = resolvedType; return this; } Builder setActivityInfo(ActivityInfo activityInfo) { mActivityInfo = activityInfo; return this; } Builder setResultTo(ActivityRecord resultTo) { mResultTo = resultTo; return this; } Builder setResultWho(String resultWho) { mResultWho = resultWho; return this; } Builder setRequestCode(int reqCode) { mRequestCode = reqCode; return this; } Builder setComponentSpecified(boolean componentSpecified) { mComponentSpecified = componentSpecified; return this; } Builder setRootVoiceInteraction(boolean rootVoiceInteraction) { mRootVoiceInteraction = rootVoiceInteraction; return this; } Builder setActivityOptions(ActivityOptions options) { mOptions = options; return this; } Builder setConfiguration(Configuration config) { mConfiguration = config; return this; } Builder setSourceRecord(ActivityRecord source) { mSourceRecord = source; return this; } private Builder setPersistentState(PersistableBundle persistentState) { mPersistentState = persistentState; return this; } private Builder setTaskDescription(TaskDescription taskDescription) { mTaskDescription = taskDescription; return this; } private Builder setCreateTime(long createTime) { mCreateTime = createTime; return this; } ActivityRecord build() { if (mConfiguration == null) { mConfiguration = mAtmService.getConfiguration(); } return new ActivityRecord(mAtmService, mCallerApp, mLaunchedFromPid, mLaunchedFromUid, mLaunchedFromPackage, mLaunchedFromFeature, mIntent, mResolvedType, mActivityInfo, mConfiguration, mResultTo, mResultWho, mRequestCode, mComponentSpecified, mRootVoiceInteraction, mAtmService.mTaskSupervisor, mOptions, mSourceRecord, mPersistentState, mTaskDescription, mCreateTime); } } }
services/core/java/com/android/server/wm/ActivityStarter.java +18 −5 Original line number Diff line number Diff line Loading @@ -1161,12 +1161,25 @@ class ActivityStarter { aInfo = mSupervisor.resolveActivity(intent, rInfo, startFlags, null /*profilerInfo*/); } final ActivityRecord r = new ActivityRecord.Builder(mService) .setCaller(callerApp) .setLaunchedFromPid(callingPid) .setLaunchedFromUid(callingUid) .setLaunchedFromPackage(callingPackage) .setLaunchedFromFeature(callingFeatureId) .setIntent(intent) .setResolvedType(resolvedType) .setActivityInfo(aInfo) .setConfiguration(mService.getGlobalConfiguration()) .setResultTo(resultRecord) .setResultWho(resultWho) .setRequestCode(requestCode) .setComponentSpecified(request.componentSpecified) .setRootVoiceInteraction(voiceSession != null) .setActivityOptions(checkedOptions) .setSourceRecord(sourceRecord) .build(); final ActivityRecord r = new ActivityRecord(mService, callerApp, callingPid, callingUid, callingPackage, callingFeatureId, intent, resolvedType, aInfo, mService.getGlobalConfiguration(), resultRecord, resultWho, requestCode, request.componentSpecified, voiceSession != null, mSupervisor, checkedOptions, sourceRecord); mLastStartActivityRecord = r; if (r.appTimeTracker == null && sourceRecord != null) { Loading
services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +3 −0 Original line number Diff line number Diff line Loading @@ -384,6 +384,7 @@ public class ActivityRecordTests extends WindowTestsBase { .build(); final Task task = activity.getTask(); activity.setState(DESTROYED, "Testing"); clearInvocations(mAtm.getLifecycleManager()); final Configuration newConfig = new Configuration(task.getConfiguration()); newConfig.orientation = newConfig.orientation == ORIENTATION_PORTRAIT Loading @@ -408,6 +409,7 @@ public class ActivityRecordTests extends WindowTestsBase { activity.setLastReportedConfiguration(new MergedConfiguration(new Configuration(), activity.getConfiguration())); clearInvocations(mAtm.getLifecycleManager()); final Configuration newConfig = new Configuration(activity.getConfiguration()); final int shortSide = Math.min(newConfig.screenWidthDp, newConfig.screenHeightDp); final int longSide = Math.max(newConfig.screenWidthDp, newConfig.screenHeightDp); Loading Loading @@ -596,6 +598,7 @@ public class ActivityRecordTests extends WindowTestsBase { final Task stack = new TaskBuilder(mSupervisor).setCreateActivity(true).build(); try { clearInvocations(mAtm.getLifecycleManager()); doReturn(false).when(stack).isTranslucent(any()); assertTrue(task.shouldBeVisible(null /* starting */)); Loading
services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +9 −9 Original line number Diff line number Diff line Loading @@ -27,6 +27,8 @@ import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; import static android.os.Process.SYSTEM_UID; import static android.view.View.VISIBLE; import static android.view.WindowManager.DISPLAY_IME_POLICY_FALLBACK_DISPLAY; import static android.view.WindowManager.DISPLAY_IME_POLICY_LOCAL; import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW; import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW; Loading @@ -40,8 +42,6 @@ import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR; import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE; import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR; import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; import static android.view.WindowManager.DISPLAY_IME_POLICY_LOCAL; import static android.view.WindowManager.DISPLAY_IME_POLICY_FALLBACK_DISPLAY; import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; Loading @@ -64,7 +64,6 @@ import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.res.Configuration; import android.hardware.display.DisplayManager; import android.os.Build; import android.os.Bundle; Loading Loading @@ -831,13 +830,14 @@ class WindowTestsBase extends SystemServiceTestsBase { if (mLaunchTaskBehind) { options = ActivityOptions.makeTaskLaunchBehind(); } final ActivityRecord activity = new ActivityRecord.Builder(mService) .setLaunchedFromPid(mLaunchedFromPid) .setLaunchedFromUid(mLaunchedFromUid) .setIntent(intent) .setActivityInfo(aInfo) .setActivityOptions(options) .build(); final ActivityRecord activity = new ActivityRecord(mService, null /* caller */, mLaunchedFromPid /* launchedFromPid */, mLaunchedFromUid /* launchedFromUid */, null, null, intent, null, aInfo /*aInfo*/, new Configuration(), null /* resultTo */, null /* resultWho */, 0 /* reqCode */, false /*componentSpecified*/, false /* rootVoiceInteraction */, mService.mTaskSupervisor, options, null /* sourceRecord */); spyOn(activity); if (mTask != null) { // fullscreen value is normally read from resources in ctor, so for testing we need Loading