Merge "integration test for open settings menu from workspace." into ub-launcher3-master
This commit is contained in:
commit
d068f1cf66
|
@ -24,6 +24,7 @@ import android.graphics.Bitmap;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Debug;
|
import android.os.Debug;
|
||||||
|
import android.system.Os;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
||||||
import androidx.annotation.Keep;
|
import androidx.annotation.Keep;
|
||||||
|
@ -136,6 +137,11 @@ public class TestInformationHandler implements ResourceBasedOverride {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case TestProtocol.REQUEST_PID: {
|
||||||
|
response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD, Os.getpid());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case TestProtocol.REQUEST_TOTAL_PSS_KB: {
|
case TestProtocol.REQUEST_TOTAL_PSS_KB: {
|
||||||
runGcAndFinalizersSync();
|
runGcAndFinalizersSync();
|
||||||
Debug.MemoryInfo mem = new Debug.MemoryInfo();
|
Debug.MemoryInfo mem = new Debug.MemoryInfo();
|
||||||
|
|
|
@ -73,6 +73,7 @@ public final class TestProtocol {
|
||||||
public static final String REQUEST_APPS_LIST_SCROLL_Y = "apps-list-scroll-y";
|
public static final String REQUEST_APPS_LIST_SCROLL_Y = "apps-list-scroll-y";
|
||||||
public static final String REQUEST_OVERVIEW_LEFT_GESTURE_MARGIN = "overview-left-margin";
|
public static final String REQUEST_OVERVIEW_LEFT_GESTURE_MARGIN = "overview-left-margin";
|
||||||
public static final String REQUEST_OVERVIEW_RIGHT_GESTURE_MARGIN = "overview-right-margin";
|
public static final String REQUEST_OVERVIEW_RIGHT_GESTURE_MARGIN = "overview-right-margin";
|
||||||
|
public static final String REQUEST_PID = "pid";
|
||||||
public static final String REQUEST_TOTAL_PSS_KB = "total_pss";
|
public static final String REQUEST_TOTAL_PSS_KB = "total_pss";
|
||||||
public static final String REQUEST_JAVA_LEAK = "java-leak";
|
public static final String REQUEST_JAVA_LEAK = "java-leak";
|
||||||
public static final String REQUEST_NATIVE_LEAK = "native-leak";
|
public static final String REQUEST_NATIVE_LEAK = "native-leak";
|
||||||
|
|
|
@ -47,7 +47,6 @@ import com.android.launcher3.widget.WidgetsFullSheet;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Popup shown on long pressing an empty space in launcher
|
* Popup shown on long pressing an empty space in launcher
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -18,6 +18,9 @@ package com.android.launcher3.ui;
|
||||||
|
|
||||||
import static androidx.test.InstrumentationRegistry.getInstrumentation;
|
import static androidx.test.InstrumentationRegistry.getInstrumentation;
|
||||||
|
|
||||||
|
import static com.android.launcher3.util.rule.TestStabilityRule.LOCAL;
|
||||||
|
import static com.android.launcher3.util.rule.TestStabilityRule.UNBUNDLED_POSTSUBMIT;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
@ -36,10 +39,12 @@ import com.android.launcher3.tapl.AppIconMenu;
|
||||||
import com.android.launcher3.tapl.AppIconMenuItem;
|
import com.android.launcher3.tapl.AppIconMenuItem;
|
||||||
import com.android.launcher3.tapl.Widgets;
|
import com.android.launcher3.tapl.Widgets;
|
||||||
import com.android.launcher3.tapl.Workspace;
|
import com.android.launcher3.tapl.Workspace;
|
||||||
|
import com.android.launcher3.util.rule.TestStabilityRule.Stability;
|
||||||
import com.android.launcher3.views.OptionsPopupView;
|
import com.android.launcher3.views.OptionsPopupView;
|
||||||
import com.android.launcher3.widget.WidgetsFullSheet;
|
import com.android.launcher3.widget.WidgetsFullSheet;
|
||||||
import com.android.launcher3.widget.WidgetsRecyclerView;
|
import com.android.launcher3.widget.WidgetsRecyclerView;
|
||||||
|
|
||||||
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Ignore;
|
import org.junit.Ignore;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
@ -50,10 +55,18 @@ import org.junit.runner.RunWith;
|
||||||
public class TaplTestsLauncher3 extends AbstractLauncherUiTest {
|
public class TaplTestsLauncher3 extends AbstractLauncherUiTest {
|
||||||
private static final String APP_NAME = "LauncherTestApp";
|
private static final String APP_NAME = "LauncherTestApp";
|
||||||
|
|
||||||
|
private int mLauncherPid;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() throws Exception {
|
public void setUp() throws Exception {
|
||||||
super.setUp();
|
super.setUp();
|
||||||
initialize(this);
|
initialize(this);
|
||||||
|
mLauncherPid = mLauncher.getPid();
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void teardown() {
|
||||||
|
assertEquals("Launcher crashed, pid mismatch:", mLauncherPid, mLauncher.getPid());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void initialize(AbstractLauncherUiTest test) throws Exception {
|
public static void initialize(AbstractLauncherUiTest test) throws Exception {
|
||||||
|
@ -100,6 +113,16 @@ public class TaplTestsLauncher3 extends AbstractLauncherUiTest {
|
||||||
mLauncher.pressHome();
|
mLauncher.pressHome();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// b/146432215: remove @Stability after 2/1/2020 if this test doesn't flake
|
||||||
|
@Test
|
||||||
|
@Stability(flavors = LOCAL | UNBUNDLED_POSTSUBMIT)
|
||||||
|
public void testOpenHomeSettingsFromWorkspace() {
|
||||||
|
mDevice.pressMenu();
|
||||||
|
mDevice.waitForIdle();
|
||||||
|
mLauncher.getOptionsPopupMenu().getMenuItem("Home settings")
|
||||||
|
.launch(mDevice.getLauncherPackageName());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Ignore
|
@Ignore
|
||||||
public void testPressHomeOnAllAppsContextMenu() throws Exception {
|
public void testPressHomeOnAllAppsContextMenu() throws Exception {
|
||||||
|
|
|
@ -16,9 +16,6 @@
|
||||||
|
|
||||||
package com.android.launcher3.tapl;
|
package com.android.launcher3.tapl;
|
||||||
|
|
||||||
import android.graphics.Point;
|
|
||||||
import android.os.SystemClock;
|
|
||||||
import android.view.MotionEvent;
|
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.test.uiautomator.By;
|
import androidx.test.uiautomator.By;
|
||||||
|
@ -41,14 +38,8 @@ public final class AppIcon extends Launchable {
|
||||||
* Long-clicks the icon to open its menu.
|
* Long-clicks the icon to open its menu.
|
||||||
*/
|
*/
|
||||||
public AppIconMenu openMenu() {
|
public AppIconMenu openMenu() {
|
||||||
final Point iconCenter = mObject.getVisibleCenter();
|
return new AppIconMenu(mLauncher, mLauncher.clickAndGet(
|
||||||
final long downTime = SystemClock.uptimeMillis();
|
mObject, "deep_shortcuts_container"));
|
||||||
mLauncher.sendPointer(downTime, downTime, MotionEvent.ACTION_DOWN, iconCenter);
|
|
||||||
final UiObject2 deepShortcutsContainer = mLauncher.waitForLauncherObject(
|
|
||||||
"deep_shortcuts_container");
|
|
||||||
mLauncher.sendPointer(
|
|
||||||
downTime, SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, iconCenter);
|
|
||||||
return new AppIconMenu(mLauncher, deepShortcutsContainer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -683,6 +683,20 @@ public final class LauncherInstrumentation {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the Options Popup Menu object if the current state is showing the popup menu. Fails if
|
||||||
|
* the launcher is not in that state.
|
||||||
|
*
|
||||||
|
* @return Options Popup Menu object.
|
||||||
|
*/
|
||||||
|
@NonNull
|
||||||
|
public OptionsPopupMenu getOptionsPopupMenu() {
|
||||||
|
try (LauncherInstrumentation.Closable c = addContextLayer(
|
||||||
|
"want to get context menu object")) {
|
||||||
|
return new OptionsPopupMenu(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void waitUntilGone(String resId) {
|
void waitUntilGone(String resId) {
|
||||||
assertTrue("Unexpected launcher object visible: " + resId,
|
assertTrue("Unexpected launcher object visible: " + resId,
|
||||||
mDevice.wait(Until.gone(getLauncherObjectSelector(resId)),
|
mDevice.wait(Until.gone(getLauncherObjectSelector(resId)),
|
||||||
|
@ -991,6 +1005,16 @@ public final class LauncherInstrumentation {
|
||||||
return getSystemIntegerRes(context, "config_navBarInteractionMode");
|
return getSystemIntegerRes(context, "config_navBarInteractionMode");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
UiObject2 clickAndGet(@NonNull final UiObject2 target, @NonNull String resName) {
|
||||||
|
final Point targetCenter = target.getVisibleCenter();
|
||||||
|
final long downTime = SystemClock.uptimeMillis();
|
||||||
|
sendPointer(downTime, downTime, MotionEvent.ACTION_DOWN, targetCenter);
|
||||||
|
final UiObject2 result = waitForLauncherObject(resName);
|
||||||
|
sendPointer(downTime, SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, targetCenter);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
private static int getSystemIntegerRes(Context context, String resName) {
|
private static int getSystemIntegerRes(Context context, String resName) {
|
||||||
Resources res = context.getResources();
|
Resources res = context.getResources();
|
||||||
int resId = res.getIdentifier(resName, "integer", "android");
|
int resId = res.getIdentifier(resName, "integer", "android");
|
||||||
|
@ -1050,6 +1074,10 @@ public final class LauncherInstrumentation {
|
||||||
getInt(TestProtocol.TEST_INFO_RESPONSE_FIELD);
|
getInt(TestProtocol.TEST_INFO_RESPONSE_FIELD);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getPid() {
|
||||||
|
return getTestInfo(TestProtocol.REQUEST_PID).getInt(TestProtocol.TEST_INFO_RESPONSE_FIELD);
|
||||||
|
}
|
||||||
|
|
||||||
public void produceJavaLeak() {
|
public void produceJavaLeak() {
|
||||||
getTestInfo(TestProtocol.REQUEST_JAVA_LEAK);
|
getTestInfo(TestProtocol.REQUEST_JAVA_LEAK);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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 com.android.launcher3.tapl;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.test.uiautomator.By;
|
||||||
|
import androidx.test.uiautomator.UiObject2;
|
||||||
|
|
||||||
|
public class OptionsPopupMenu {
|
||||||
|
|
||||||
|
private final LauncherInstrumentation mLauncher;
|
||||||
|
private final UiObject2 mDeepShortcutsContainer;
|
||||||
|
|
||||||
|
OptionsPopupMenu(LauncherInstrumentation launcher) {
|
||||||
|
mLauncher = launcher;
|
||||||
|
mDeepShortcutsContainer = launcher.waitForLauncherObject("deep_shortcuts_container");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a menu item with a given label. Fails if it doesn't exist.
|
||||||
|
*/
|
||||||
|
@NonNull
|
||||||
|
public OptionsPopupMenuItem getMenuItem(@NonNull final String label) {
|
||||||
|
final UiObject2 menuItem = mLauncher.waitForObjectInContainer(mDeepShortcutsContainer,
|
||||||
|
By.text(label));
|
||||||
|
return new OptionsPopupMenuItem(mLauncher, menuItem);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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 com.android.launcher3.tapl;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.test.uiautomator.By;
|
||||||
|
import androidx.test.uiautomator.UiObject2;
|
||||||
|
import androidx.test.uiautomator.Until;
|
||||||
|
|
||||||
|
public class OptionsPopupMenuItem {
|
||||||
|
|
||||||
|
private final LauncherInstrumentation mLauncher;
|
||||||
|
private final UiObject2 mObject;
|
||||||
|
|
||||||
|
OptionsPopupMenuItem(@NonNull LauncherInstrumentation launcher, @NonNull UiObject2 shortcut) {
|
||||||
|
mLauncher = launcher;
|
||||||
|
mObject = shortcut;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clicks the option.
|
||||||
|
*/
|
||||||
|
@NonNull
|
||||||
|
public void launch(@NonNull String expectedPackageName) {
|
||||||
|
LauncherInstrumentation.log("OptionsPopupMenuItem before click "
|
||||||
|
+ mObject.getVisibleCenter() + " in " + mObject.getVisibleBounds());
|
||||||
|
mObject.click();
|
||||||
|
mLauncher.assertTrue(
|
||||||
|
"App didn't start: " + By.pkg(expectedPackageName),
|
||||||
|
mLauncher.getDevice().wait(Until.hasObject(By.pkg(expectedPackageName)),
|
||||||
|
LauncherInstrumentation.WAIT_TIME_MS));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue