1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/mobile/android/base/tests/components/ToolbarComponent.java Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,227 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +package org.mozilla.gecko.tests.components; 1.9 + 1.10 +import static org.mozilla.gecko.tests.helpers.AssertionHelper.fAssertEquals; 1.11 +import static org.mozilla.gecko.tests.helpers.AssertionHelper.fAssertFalse; 1.12 +import static org.mozilla.gecko.tests.helpers.AssertionHelper.fAssertNotNull; 1.13 +import static org.mozilla.gecko.tests.helpers.AssertionHelper.fAssertTrue; 1.14 + 1.15 +import org.mozilla.gecko.R; 1.16 +import org.mozilla.gecko.tests.UITestContext; 1.17 +import org.mozilla.gecko.tests.helpers.DeviceHelper; 1.18 +import org.mozilla.gecko.tests.helpers.WaitHelper; 1.19 + 1.20 +import android.view.View; 1.21 +import android.widget.EditText; 1.22 +import android.widget.ImageButton; 1.23 +import android.widget.TextView; 1.24 + 1.25 +import com.jayway.android.robotium.solo.Condition; 1.26 +import com.jayway.android.robotium.solo.Solo; 1.27 + 1.28 +/** 1.29 + * A class representing any interactions that take place on the Toolbar. 1.30 + */ 1.31 +public class ToolbarComponent extends BaseComponent { 1.32 + public ToolbarComponent(final UITestContext testContext) { 1.33 + super(testContext); 1.34 + } 1.35 + 1.36 + public ToolbarComponent assertIsEditing() { 1.37 + fAssertTrue("The toolbar is in the editing state", isEditing()); 1.38 + return this; 1.39 + } 1.40 + 1.41 + public ToolbarComponent assertIsNotEditing() { 1.42 + fAssertFalse("The toolbar is not in the editing state", isEditing()); 1.43 + return this; 1.44 + } 1.45 + 1.46 + public ToolbarComponent assertTitle(final String expected) { 1.47 + fAssertEquals("The Toolbar title is " + expected, expected, getTitle()); 1.48 + return this; 1.49 + } 1.50 + 1.51 + public ToolbarComponent assertUrl(final String expected) { 1.52 + assertIsEditing(); 1.53 + fAssertEquals("The Toolbar url is " + expected, expected, getUrlEditText().getText()); 1.54 + return this; 1.55 + } 1.56 + 1.57 + /** 1.58 + * Returns the root View for the browser toolbar. 1.59 + */ 1.60 + private View getToolbarView() { 1.61 + return mSolo.getView(R.id.browser_toolbar); 1.62 + } 1.63 + 1.64 + private EditText getUrlEditText() { 1.65 + return (EditText) getToolbarView().findViewById(R.id.url_edit_text); 1.66 + } 1.67 + 1.68 + private View getUrlDisplayLayout() { 1.69 + return getToolbarView().findViewById(R.id.display_layout); 1.70 + } 1.71 + 1.72 + private TextView getUrlTitleText() { 1.73 + return (TextView) getToolbarView().findViewById(R.id.url_bar_title); 1.74 + } 1.75 + 1.76 + private ImageButton getBackButton() { 1.77 + DeviceHelper.assertIsTablet(); 1.78 + return (ImageButton) getToolbarView().findViewById(R.id.back); 1.79 + } 1.80 + 1.81 + private ImageButton getForwardButton() { 1.82 + DeviceHelper.assertIsTablet(); 1.83 + return (ImageButton) getToolbarView().findViewById(R.id.forward); 1.84 + } 1.85 + 1.86 + /** 1.87 + * Returns the View for the edit cancel button in the browser toolbar. 1.88 + */ 1.89 + private ImageButton getEditCancelButton() { 1.90 + return (ImageButton) getToolbarView().findViewById(R.id.edit_cancel); 1.91 + } 1.92 + 1.93 + private CharSequence getTitle() { 1.94 + return getTitleHelper(true); 1.95 + } 1.96 + 1.97 + /** 1.98 + * Returns the title of the page. Note that this makes no assertions to Toolbar state and 1.99 + * may return a value that may never be visible to the user. Callers likely want to use 1.100 + * {@link assertTitle} instead. 1.101 + */ 1.102 + public CharSequence getPotentiallyInconsistentTitle() { 1.103 + return getTitleHelper(false); 1.104 + } 1.105 + 1.106 + private CharSequence getTitleHelper(final boolean shouldAssertNotEditing) { 1.107 + if (shouldAssertNotEditing) { 1.108 + assertIsNotEditing(); 1.109 + } 1.110 + 1.111 + return getUrlTitleText().getText(); 1.112 + } 1.113 + 1.114 + private boolean isEditing() { 1.115 + return getUrlDisplayLayout().getVisibility() != View.VISIBLE && 1.116 + getUrlEditText().getVisibility() == View.VISIBLE; 1.117 + } 1.118 + 1.119 + public ToolbarComponent enterEditingMode() { 1.120 + assertIsNotEditing(); 1.121 + 1.122 + mSolo.clickOnView(getUrlTitleText(), true); 1.123 + 1.124 + waitForEditing(); 1.125 + WaitHelper.waitFor("UrlEditText to be input method target", new Condition() { 1.126 + @Override 1.127 + public boolean isSatisfied() { 1.128 + return getUrlEditText().isInputMethodTarget(); 1.129 + } 1.130 + }); 1.131 + 1.132 + return this; 1.133 + } 1.134 + 1.135 + public ToolbarComponent commitEditingMode() { 1.136 + assertIsEditing(); 1.137 + 1.138 + WaitHelper.waitForPageLoad(new Runnable() { 1.139 + @Override 1.140 + public void run() { 1.141 + mSolo.sendKey(Solo.ENTER); 1.142 + } 1.143 + }); 1.144 + waitForNotEditing(); 1.145 + 1.146 + return this; 1.147 + } 1.148 + 1.149 + public ToolbarComponent dismissEditingMode() { 1.150 + assertIsEditing(); 1.151 + 1.152 + // Cancel Button not implemeneted in tablet. 1.153 + if (DeviceHelper.isTablet()) { 1.154 + if (getUrlEditText().isInputMethodTarget()) { 1.155 + // Drop the soft keyboard. 1.156 + // TODO: Solo.hideSoftKeyboard() does not clear focus, causing unexpected 1.157 + // behavior, but we may want to use it over goBack(). 1.158 + mSolo.goBack(); 1.159 + } 1.160 + 1.161 + mSolo.goBack(); 1.162 + } else { 1.163 + mSolo.clickOnView(getEditCancelButton()); 1.164 + } 1.165 + 1.166 + waitForNotEditing(); 1.167 + 1.168 + return this; 1.169 + } 1.170 + 1.171 + public ToolbarComponent enterUrl(final String url) { 1.172 + fAssertNotNull("url is not null", url); 1.173 + 1.174 + assertIsEditing(); 1.175 + 1.176 + final EditText urlEditText = getUrlEditText(); 1.177 + fAssertTrue("The UrlEditText is the input method target", 1.178 + urlEditText.isInputMethodTarget()); 1.179 + 1.180 + mSolo.clearEditText(urlEditText); 1.181 + mSolo.enterText(urlEditText, url); 1.182 + 1.183 + return this; 1.184 + } 1.185 + 1.186 + public ToolbarComponent pressBackButton() { 1.187 + final ImageButton backButton = getBackButton(); 1.188 + return pressButton(backButton, "back"); 1.189 + } 1.190 + 1.191 + public ToolbarComponent pressForwardButton() { 1.192 + final ImageButton forwardButton = getForwardButton(); 1.193 + return pressButton(forwardButton, "forward"); 1.194 + } 1.195 + 1.196 + private ToolbarComponent pressButton(final View view, final String buttonName) { 1.197 + fAssertNotNull("The " + buttonName + " button View is not null", view); 1.198 + fAssertTrue("The " + buttonName + " button is enabled", view.isEnabled()); 1.199 + fAssertEquals("The " + buttonName + " button is visible", 1.200 + View.VISIBLE, view.getVisibility()); 1.201 + assertIsNotEditing(); 1.202 + 1.203 + WaitHelper.waitForPageLoad(new Runnable() { 1.204 + @Override 1.205 + public void run() { 1.206 + mSolo.clickOnView(view); 1.207 + } 1.208 + }); 1.209 + 1.210 + return this; 1.211 + } 1.212 + 1.213 + private void waitForEditing() { 1.214 + WaitHelper.waitFor("Toolbar to enter editing mode", new Condition() { 1.215 + @Override 1.216 + public boolean isSatisfied() { 1.217 + return isEditing(); 1.218 + } 1.219 + }); 1.220 + } 1.221 + 1.222 + private void waitForNotEditing() { 1.223 + WaitHelper.waitFor("Toolbar to exit editing mode", new Condition() { 1.224 + @Override 1.225 + public boolean isSatisfied() { 1.226 + return !isEditing(); 1.227 + } 1.228 + }); 1.229 + } 1.230 +}