• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 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 java.io.ByteArrayOutputStream;
19 import java.io.File;
20 import java.io.IOException;
21 
22 import android.app.Instrumentation;
23 import android.content.Context;
24 import android.content.Intent;
25 import android.os.SystemClock;
26 import android.support.test.uiautomator.By;
27 import android.support.test.uiautomator.BySelector;
28 import android.support.test.uiautomator.Direction;
29 import android.support.test.uiautomator.UiDevice;
30 import android.support.test.uiautomator.UiObject2;
31 import android.support.test.uiautomator.Until;
32 import android.widget.TextView;
33 import android.util.Log;
34 
35 import junit.framework.Assert;
36 
37 public class WearLauncherStrategy implements ILauncherStrategy {
38 
39     private static final String LAUNCHER_PKG = "com.google.android.wearable.app";
40     private static final String LOG_TAG = WearLauncherStrategy.class.getSimpleName();
41     protected UiDevice mDevice;
42     protected Context mContext;
43 
44     /**
45      * {@inheritDoc}
46      */
47     @Override
getSupportedLauncherPackage()48     public String getSupportedLauncherPackage() {
49         return LAUNCHER_PKG;
50     }
51 
52     /**
53      * {@inheritDoc}
54      */
55     @Override
setUiDevice(UiDevice uiDevice)56     public void setUiDevice(UiDevice uiDevice) {
57         mDevice = uiDevice;
58     }
59 
60     /**
61      * Shows the home screen of launcher
62      */
63     @Override
open()64     public void open() {
65         if (!mDevice.hasObject(getHotSeatSelector())) {
66             mDevice.pressHome();
67             if (!mDevice.wait(Until.hasObject(getHotSeatSelector()), 5000)) {
68                 dumpScreen("Return Watch face");
69                 Assert.fail("Failed to open launcher");
70             }
71             mDevice.waitForIdle();
72         }
73     }
74 
75     /**
76      * Opens the all apps drawer of launcher
77      * @param reset if the all apps drawer should be reset to the beginning
78      * @return {@link UiObject2} representation of the all apps drawer
79      */
80     @Override
openAllApps(boolean reset)81     public UiObject2 openAllApps(boolean reset) {
82         if (!mDevice.hasObject(getAllAppsSelector())) {
83             mDevice.pressHome();
84             mDevice.waitForIdle();
85             if (!mDevice.wait(Until.hasObject(getAllAppsSelector()), 5000)) {
86                 dumpScreen("Open launcher");
87                 Assert.fail("Failed to open launcher");
88             }
89         }
90         UiObject2 allAppsContainer = mDevice.wait(Until.findObject(getAllAppsSelector()), 2000);
91         if (reset) {
92             CommonLauncherHelper.getInstance(mDevice).scrollBackToBeginning(
93                     allAppsContainer, Direction.reverse(getAllAppsScrollDirection()));
94         }
95         if (allAppsContainer == null) {
96             Assert.fail("Failed to find launcher");
97         }
98         return allAppsContainer;
99     }
100 
101     /**
102      * {@inheritDoc}
103      */
104     @Override
getHotSeatSelector()105     public BySelector getHotSeatSelector() {
106          return By.res(getSupportedLauncherPackage(), "watchface_overlay");
107     }
108 
109 
110     /**
111      * Returns a {@link BySelector} describing the all apps drawer
112      * @return
113      */
114     @Override
getAllAppsSelector()115     public BySelector getAllAppsSelector() {
116         return By.res(getSupportedLauncherPackage(), "launcher_view");
117     }
118 
119     /**
120      * Retrieves the all apps drawer forward scroll direction as implemented by the launcher
121      * @return
122      */
123     @Override
getAllAppsScrollDirection()124     public Direction getAllAppsScrollDirection() {
125         return Direction.DOWN;
126     }
127 
128     @Override
getAllAppsButtonSelector()129     public BySelector getAllAppsButtonSelector() {
130         throw new UnsupportedOperationException(
131                 "The 'All Apps' button is not available on Android Wear Launcher.");
132     }
133 
134     @Override
openAllWidgets(boolean reset)135     public UiObject2 openAllWidgets(boolean reset) {
136         throw new UnsupportedOperationException(
137                 "The 'All Widgets' button is not available on Android Wear Launcher.");
138     }
139 
140     @Override
getAllWidgetsSelector()141     public BySelector getAllWidgetsSelector() {
142         throw new UnsupportedOperationException(
143                 "The 'All Widgets' button is not available on Android Wear Launcher.");
144     }
145 
146     @Override
getAllWidgetsScrollDirection()147     public Direction getAllWidgetsScrollDirection() {
148         throw new UnsupportedOperationException(
149                 "The 'All Widgets' button is not available on Android Wear Launcher.");
150     }
151 
152     @Override
getWorkspaceSelector()153     public BySelector getWorkspaceSelector() {
154         throw new UnsupportedOperationException(
155                 "The 'Work space' is not available on Android Wear Launcher.");
156     }
157 
158     @Override
getWorkspaceScrollDirection()159     public Direction getWorkspaceScrollDirection() {
160         throw new UnsupportedOperationException(
161                 "The 'Work Space' is not available on Android Wear Launcher.");
162     }
163 
164     /**
165      * Launch the named application
166      * @param appName the name of the application to launch as shown in launcher
167      * @param packageName the expected package name to verify that the application has been launched
168      *                    into foreground. If <code>null</code> is provided, no verification is
169      *                    performed.
170      * @return <code>true</code> if application is verified to be in foreground after launch, or the
171      *   verification is skipped; <code>false</code> otherwise.
172      */
173     @Override
launch(String appName, String packageName)174     public long launch(String appName, String packageName) {
175         BySelector app = By.res(
176                 getSupportedLauncherPackage(), "title").clazz(TextView.class).text(appName);
177         return CommonLauncherHelper.getInstance(mDevice).launchApp(this, app, packageName);
178     }
179 
dumpScreen(String description)180     private void dumpScreen(String description) {
181         // DEBUG: dump hierarchy to logcat
182         Log.d(LOG_TAG, "Dump Screen at " + description);
183         try (ByteArrayOutputStream baos = new ByteArrayOutputStream()){
184             mDevice.dumpWindowHierarchy(baos);
185             baos.flush();
186             String[] lines = baos.toString().split(System.lineSeparator());
187             for (String line : lines) {
188                 Log.d(LOG_TAG, line.trim());
189             }
190         } catch (IOException ioe) {
191             Log.e(LOG_TAG, "error dumping XML to logcat", ioe);
192         }
193     }
194 }
195