blob: 839371fd9e46dca1448424e0cf1f753e5c7fc888 [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.server.wm;
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP;
import static android.server.wm.ComponentNameUtils.getActivityName;
import static android.server.wm.UiDeviceUtils.pressHomeButton;
import static android.server.wm.app.Components.ENTRY_POINT_ALIAS_ACTIVITY;
import static android.server.wm.app.Components.LAUNCHING_ACTIVITY;
import static android.server.wm.app.Components.SINGLE_TASK_ACTIVITY;
import static android.server.wm.app.Components.TEST_ACTIVITY;
import static android.view.Display.DEFAULT_DISPLAY;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
import static org.junit.Assert.assertNotEquals;
import android.content.ComponentName;
import android.platform.test.annotations.Presubmit;
import androidx.test.filters.FlakyTest;
import org.junit.Test;
/**
* Build/Install/Run:
* atest CtsWindowManagerDeviceTestCases:AmStartOptionsTests
*/
@Presubmit
public class AmStartOptionsTests extends ActivityManagerTestBase {
@Test
public void testDashD() {
// Run at least 2 rounds to verify that -D works with an existing process.
// -D could fail in this case if the force stop of process is broken.
int prevProcId = -1;
for (int i = 0; i < 2; i++) {
executeShellCommand("am start -n " + getActivityName(TEST_ACTIVITY) + " -D");
mAmWmState.waitForDebuggerWindowVisible(TEST_ACTIVITY);
int procId = mAmWmState.getAmState().getActivityProcId(TEST_ACTIVITY);
assertThat("Invalid ProcId.", procId, greaterThanOrEqualTo(0));
if (i > 0) {
assertNotEquals("Run " + i + " didn't start new proc.", prevProcId, procId);
}
prevProcId = procId;
}
}
@Test
public void testDashW_Direct() throws Exception {
testDashW(SINGLE_TASK_ACTIVITY, SINGLE_TASK_ACTIVITY);
}
@Test
@FlakyTest
public void testDashW_Indirect() throws Exception {
testDashW(ENTRY_POINT_ALIAS_ACTIVITY, SINGLE_TASK_ACTIVITY);
}
@Test
public void testDashW_FinishingTop() {
// Start LaunchingActivity and TestActivity
getLaunchActivityBuilder().setLaunchingActivity(LAUNCHING_ACTIVITY)
.setTargetActivity(TEST_ACTIVITY).execute();
// Return to home
pressHomeButton();
// Start LaunchingActivity again and finish TestActivity
final int flags =
FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP;
executeShellCommand("am start -W -f " + flags + " -n " + getActivityName(LAUNCHING_ACTIVITY)
+ " --display " + DEFAULT_DISPLAY);
waitAndAssertTopResumedActivity(LAUNCHING_ACTIVITY, DEFAULT_DISPLAY,
"Activity must be launched.");
}
private void testDashW(final ComponentName entryActivity, final ComponentName actualActivity)
throws Exception {
// Test cold start
startActivityAndVerifyResult(entryActivity, actualActivity, true);
// Test warm start
pressHomeButton();
startActivityAndVerifyResult(entryActivity, actualActivity, false);
// Test "hot" start (app already in front)
startActivityAndVerifyResult(entryActivity, actualActivity, false);
}
private void startActivityAndVerifyResult(final ComponentName entryActivity,
final ComponentName actualActivity, boolean shouldStart) {
mAmWmState.waitForAppTransitionIdleOnDisplay(DEFAULT_DISPLAY);
// Pass in different data only when cold starting. This is to make the intent
// different in subsequent warm/hot launches, so that the entrypoint alias
// activity is always started, but the actual activity is not started again
// because of the NEW_TASK and singleTask flags.
executeShellCommand("am start -n " + getActivityName(entryActivity) + " -W --display "
+ DEFAULT_DISPLAY + (shouldStart ? " -d about:blank" : ""));
waitAndAssertTopResumedActivity(actualActivity, DEFAULT_DISPLAY,
"Activity must be launched");
}
}