blob: 7f913ad59d2c72a1ab77babee21b24f37bcd43b3 [file] [log] [blame]
/*
* Copyright (C) 2017 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.support.test.launcherhelper;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import android.app.Instrumentation;
import android.content.Context;
import android.content.Intent;
import android.os.SystemClock;
import android.support.test.uiautomator.By;
import android.support.test.uiautomator.BySelector;
import android.support.test.uiautomator.Direction;
import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiObject2;
import android.support.test.uiautomator.Until;
import android.widget.TextView;
import android.util.Log;
import junit.framework.Assert;
public class WearLauncherStrategy implements ILauncherStrategy {
private static final String LAUNCHER_PKG = "com.google.android.wearable.app";
private static final String LOG_TAG = WearLauncherStrategy.class.getSimpleName();
protected UiDevice mDevice;
protected Context mContext;
/**
* {@inheritDoc}
*/
@Override
public String getSupportedLauncherPackage() {
return LAUNCHER_PKG;
}
/**
* {@inheritDoc}
*/
@Override
public void setUiDevice(UiDevice uiDevice) {
mDevice = uiDevice;
}
/**
* Shows the home screen of launcher
*/
@Override
public void open() {
if (!mDevice.hasObject(getHotSeatSelector())) {
mDevice.pressHome();
if (!mDevice.wait(Until.hasObject(getHotSeatSelector()), 5000)) {
dumpScreen("Return Watch face");
Assert.fail("Failed to open launcher");
}
mDevice.waitForIdle();
}
}
/**
* Opens the all apps drawer of launcher
* @param reset if the all apps drawer should be reset to the beginning
* @return {@link UiObject2} representation of the all apps drawer
*/
@Override
public UiObject2 openAllApps(boolean reset) {
if (!mDevice.hasObject(getAllAppsSelector())) {
mDevice.pressHome();
mDevice.waitForIdle();
if (!mDevice.wait(Until.hasObject(getAllAppsSelector()), 5000)) {
dumpScreen("Open launcher");
Assert.fail("Failed to open launcher");
}
}
UiObject2 allAppsContainer = mDevice.wait(Until.findObject(getAllAppsSelector()), 2000);
if (reset) {
CommonLauncherHelper.getInstance(mDevice).scrollBackToBeginning(
allAppsContainer, Direction.reverse(getAllAppsScrollDirection()));
}
if (allAppsContainer == null) {
Assert.fail("Failed to find launcher");
}
return allAppsContainer;
}
/**
* {@inheritDoc}
*/
@Override
public BySelector getHotSeatSelector() {
return By.res(getSupportedLauncherPackage(), "watchface_overlay");
}
/**
* Returns a {@link BySelector} describing the all apps drawer
* @return
*/
@Override
public BySelector getAllAppsSelector() {
return By.res(getSupportedLauncherPackage(), "launcher_view");
}
/**
* Retrieves the all apps drawer forward scroll direction as implemented by the launcher
* @return
*/
@Override
public Direction getAllAppsScrollDirection() {
return Direction.DOWN;
}
@Override
public BySelector getAllAppsButtonSelector() {
throw new UnsupportedOperationException(
"The 'All Apps' button is not available on Android Wear Launcher.");
}
@Override
public UiObject2 openAllWidgets(boolean reset) {
throw new UnsupportedOperationException(
"The 'All Widgets' button is not available on Android Wear Launcher.");
}
@Override
public BySelector getAllWidgetsSelector() {
throw new UnsupportedOperationException(
"The 'All Widgets' button is not available on Android Wear Launcher.");
}
@Override
public Direction getAllWidgetsScrollDirection() {
throw new UnsupportedOperationException(
"The 'All Widgets' button is not available on Android Wear Launcher.");
}
@Override
public BySelector getWorkspaceSelector() {
throw new UnsupportedOperationException(
"The 'Work space' is not available on Android Wear Launcher.");
}
@Override
public Direction getWorkspaceScrollDirection() {
throw new UnsupportedOperationException(
"The 'Work Space' is not available on Android Wear Launcher.");
}
/**
* Launch the named application
* @param appName the name of the application to launch as shown in launcher
* @param packageName the expected package name to verify that the application has been launched
* into foreground. If <code>null</code> is provided, no verification is
* performed.
* @return <code>true</code> if application is verified to be in foreground after launch, or the
* verification is skipped; <code>false</code> otherwise.
*/
@Override
public long launch(String appName, String packageName) {
BySelector app = By.res(
getSupportedLauncherPackage(), "title").clazz(TextView.class).text(appName);
return CommonLauncherHelper.getInstance(mDevice).launchApp(this, app, packageName);
}
private void dumpScreen(String description) {
// DEBUG: dump hierarchy to logcat
Log.d(LOG_TAG, "Dump Screen at " + description);
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()){
mDevice.dumpWindowHierarchy(baos);
baos.flush();
String[] lines = baos.toString().split(System.lineSeparator());
for (String line : lines) {
Log.d(LOG_TAG, line.trim());
}
} catch (IOException ioe) {
Log.e(LOG_TAG, "error dumping XML to logcat", ioe);
}
}
}