1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package android.support.test.launcherhelper; 17 18 import android.support.test.uiautomator.By; 19 import android.support.test.uiautomator.BySelector; 20 import android.support.test.uiautomator.Direction; 21 import android.support.test.uiautomator.UiDevice; 22 import android.support.test.uiautomator.UiObject2; 23 import android.support.test.uiautomator.Until; 24 import android.widget.Button; 25 import android.widget.TextView; 26 27 import junit.framework.Assert; 28 29 /** 30 * Implementation of {@link ILauncherStrategy} to support AOSP launcher 31 */ 32 public class AospLauncherStrategy implements ILauncherStrategy { 33 34 private static final String LAUNCHER_PKG = "com.android.launcher"; 35 private static final BySelector APPS_CONTAINER = 36 By.res(LAUNCHER_PKG, "apps_customize_pane_content"); 37 private static final BySelector WORKSPACE = By.res(LAUNCHER_PKG, "workspace"); 38 private static final BySelector HOTSEAT = By.res(LAUNCHER_PKG, "hotseat"); 39 private UiDevice mDevice; 40 41 /** 42 * {@inheritDoc} 43 */ 44 @Override open()45 public void open() { 46 // if we see hotseat, assume at home screen already 47 if (!mDevice.hasObject(getHotSeatSelector())) { 48 mDevice.pressHome(); 49 Assert.assertTrue("Failed to open launcher", 50 mDevice.wait(Until.hasObject(By.pkg(LAUNCHER_PKG)), 5000)); 51 mDevice.waitForIdle(); 52 } 53 // remove cling if it exists 54 UiObject2 cling = mDevice.findObject(By.res(LAUNCHER_PKG, "workspace_cling")); 55 if (cling != null) { 56 cling.findObject(By.clazz(Button.class).text("OK")).click(); 57 } 58 } 59 60 /** 61 * {@inheritDoc} 62 */ 63 @Override openAllApps(boolean reset)64 public UiObject2 openAllApps(boolean reset) { 65 // if we see apps container, skip the opening step, only ensure that the "Apps" tab is 66 // selected 67 if (!mDevice.hasObject(APPS_CONTAINER)) { 68 open(); 69 // taps on the "apps" button at the bottom of the screen 70 mDevice.findObject(By.desc("Apps")).click(); 71 // wait until hotseat disappears, so that we know that we are no longer on home screen 72 mDevice.wait(Until.gone(getHotSeatSelector()), 2000); 73 mDevice.waitForIdle(); 74 } 75 // check if there's a "cling" on screen 76 UiObject2 cling = mDevice.findObject(By.res(LAUNCHER_PKG, "cling_dismiss") 77 .clazz(Button.class).text("OK")); 78 if (cling != null) { 79 cling.click(); 80 } 81 // taps on the "apps" page selector near the top of the screen 82 UiObject2 appsTab = mDevice.findObject(By.desc("Apps") 83 .clazz(TextView.class).selected(false)); 84 if (appsTab != null) { 85 appsTab.click(); 86 } 87 UiObject2 allAppsContainer = mDevice.findObject(APPS_CONTAINER); 88 Assert.assertNotNull("openAllApps: did not find all apps container", allAppsContainer); 89 if (reset) { 90 CommonLauncherHelper.getInstance(mDevice).scrollBackToBeginning(allAppsContainer, 91 Direction.reverse(getAllAppsScrollDirection())); 92 } 93 return allAppsContainer; 94 } 95 96 /** 97 * {@inheritDoc} 98 */ 99 @Override getAllAppsScrollDirection()100 public Direction getAllAppsScrollDirection() { 101 return Direction.RIGHT; 102 } 103 104 /** 105 * {@inheritDoc} 106 */ 107 @Override openAllWidgets(boolean reset)108 public UiObject2 openAllWidgets(boolean reset) { 109 boolean needReset = true; 110 // if we see apps container, skip the opening step, only ensure that the "Widgets" tab is 111 // selected 112 if (!mDevice.hasObject(APPS_CONTAINER)) { 113 open(); 114 // taps on the "apps" button at the bottom of the screen 115 mDevice.findObject(By.desc("Apps")).click(); 116 // wait until hotseat disappears, so that we know that we are no longer on home screen 117 mDevice.wait(Until.gone(getHotSeatSelector()), 2000); 118 mDevice.waitForIdle(); 119 } 120 // taps on the "Widgets" page selector near the top of the screen 121 UiObject2 widgetsTab = mDevice.findObject(By.desc("Widgets") 122 .clazz(TextView.class).selected(false)); 123 if (widgetsTab != null) { 124 widgetsTab.click(); 125 // if we switched into widget page, then there's no need to reset, since it will go 126 // back to beginning 127 needReset = false; 128 } 129 UiObject2 allWidgetsContainer = mDevice.findObject(APPS_CONTAINER); 130 Assert.assertNotNull( 131 "openAllWidgets: did not find all widgets container", allWidgetsContainer); 132 if (reset && needReset) { 133 // only way to reset is to switch to "Apps" then back to "Widget", scroll to beginning 134 // won't work 135 mDevice.findObject(By.desc("Apps").selected(false)).click(); 136 mDevice.waitForIdle(); 137 mDevice.findObject(By.desc("Widgets").selected(false)).click(); 138 mDevice.waitForIdle(); 139 } 140 return allWidgetsContainer; 141 } 142 143 /** 144 * {@inheritDoc} 145 */ 146 @Override getAllWidgetsScrollDirection()147 public Direction getAllWidgetsScrollDirection() { 148 return Direction.RIGHT; 149 } 150 151 /** 152 * {@inheritDoc} 153 */ 154 @Override launch(String appName, String packageName)155 public long launch(String appName, String packageName) { 156 return CommonLauncherHelper.getInstance(mDevice).launchApp(this, 157 By.res("").clazz(TextView.class).desc(appName), packageName); 158 } 159 160 /** 161 * {@inheritDoc} 162 */ 163 @Override setUiDevice(UiDevice uiDevice)164 public void setUiDevice(UiDevice uiDevice) { 165 mDevice = uiDevice; 166 } 167 168 /** 169 * {@inheritDoc} 170 */ 171 @Override getSupportedLauncherPackage()172 public String getSupportedLauncherPackage() { 173 return LAUNCHER_PKG; 174 } 175 176 /** 177 * {@inheritDoc} 178 */ 179 @Override getAllAppsSelector()180 public BySelector getAllAppsSelector() { 181 return APPS_CONTAINER; 182 } 183 184 /** 185 * {@inheritDoc} 186 */ 187 @Override getAllWidgetsSelector()188 public BySelector getAllWidgetsSelector() { 189 return APPS_CONTAINER; 190 } 191 192 /** 193 * {@inheritDoc} 194 */ 195 @Override getWorkspaceSelector()196 public BySelector getWorkspaceSelector() { 197 return WORKSPACE; 198 } 199 200 /** 201 * {@inheritDoc} 202 */ 203 @Override getHotSeatSelector()204 public BySelector getHotSeatSelector() { 205 return HOTSEAT; 206 } 207 208 /** 209 * {@inheritDoc} 210 */ 211 @Override getWorkspaceScrollDirection()212 public Direction getWorkspaceScrollDirection() { 213 return Direction.RIGHT; 214 } 215 216 } 217