michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: package org.mozilla.gecko.tests.components; michael@0: michael@0: import static org.mozilla.gecko.tests.helpers.AssertionHelper.fAssertEquals; michael@0: import static org.mozilla.gecko.tests.helpers.AssertionHelper.fAssertFalse; michael@0: import static org.mozilla.gecko.tests.helpers.AssertionHelper.fAssertNotNull; michael@0: import static org.mozilla.gecko.tests.helpers.AssertionHelper.fAssertTrue; michael@0: michael@0: import org.mozilla.gecko.R; michael@0: import org.mozilla.gecko.tests.UITestContext; michael@0: import org.mozilla.gecko.tests.helpers.DeviceHelper; michael@0: import org.mozilla.gecko.tests.helpers.WaitHelper; michael@0: michael@0: import android.view.View; michael@0: import android.widget.EditText; michael@0: import android.widget.ImageButton; michael@0: import android.widget.TextView; michael@0: michael@0: import com.jayway.android.robotium.solo.Condition; michael@0: import com.jayway.android.robotium.solo.Solo; michael@0: michael@0: /** michael@0: * A class representing any interactions that take place on the Toolbar. michael@0: */ michael@0: public class ToolbarComponent extends BaseComponent { michael@0: public ToolbarComponent(final UITestContext testContext) { michael@0: super(testContext); michael@0: } michael@0: michael@0: public ToolbarComponent assertIsEditing() { michael@0: fAssertTrue("The toolbar is in the editing state", isEditing()); michael@0: return this; michael@0: } michael@0: michael@0: public ToolbarComponent assertIsNotEditing() { michael@0: fAssertFalse("The toolbar is not in the editing state", isEditing()); michael@0: return this; michael@0: } michael@0: michael@0: public ToolbarComponent assertTitle(final String expected) { michael@0: fAssertEquals("The Toolbar title is " + expected, expected, getTitle()); michael@0: return this; michael@0: } michael@0: michael@0: public ToolbarComponent assertUrl(final String expected) { michael@0: assertIsEditing(); michael@0: fAssertEquals("The Toolbar url is " + expected, expected, getUrlEditText().getText()); michael@0: return this; michael@0: } michael@0: michael@0: /** michael@0: * Returns the root View for the browser toolbar. michael@0: */ michael@0: private View getToolbarView() { michael@0: return mSolo.getView(R.id.browser_toolbar); michael@0: } michael@0: michael@0: private EditText getUrlEditText() { michael@0: return (EditText) getToolbarView().findViewById(R.id.url_edit_text); michael@0: } michael@0: michael@0: private View getUrlDisplayLayout() { michael@0: return getToolbarView().findViewById(R.id.display_layout); michael@0: } michael@0: michael@0: private TextView getUrlTitleText() { michael@0: return (TextView) getToolbarView().findViewById(R.id.url_bar_title); michael@0: } michael@0: michael@0: private ImageButton getBackButton() { michael@0: DeviceHelper.assertIsTablet(); michael@0: return (ImageButton) getToolbarView().findViewById(R.id.back); michael@0: } michael@0: michael@0: private ImageButton getForwardButton() { michael@0: DeviceHelper.assertIsTablet(); michael@0: return (ImageButton) getToolbarView().findViewById(R.id.forward); michael@0: } michael@0: michael@0: /** michael@0: * Returns the View for the edit cancel button in the browser toolbar. michael@0: */ michael@0: private ImageButton getEditCancelButton() { michael@0: return (ImageButton) getToolbarView().findViewById(R.id.edit_cancel); michael@0: } michael@0: michael@0: private CharSequence getTitle() { michael@0: return getTitleHelper(true); michael@0: } michael@0: michael@0: /** michael@0: * Returns the title of the page. Note that this makes no assertions to Toolbar state and michael@0: * may return a value that may never be visible to the user. Callers likely want to use michael@0: * {@link assertTitle} instead. michael@0: */ michael@0: public CharSequence getPotentiallyInconsistentTitle() { michael@0: return getTitleHelper(false); michael@0: } michael@0: michael@0: private CharSequence getTitleHelper(final boolean shouldAssertNotEditing) { michael@0: if (shouldAssertNotEditing) { michael@0: assertIsNotEditing(); michael@0: } michael@0: michael@0: return getUrlTitleText().getText(); michael@0: } michael@0: michael@0: private boolean isEditing() { michael@0: return getUrlDisplayLayout().getVisibility() != View.VISIBLE && michael@0: getUrlEditText().getVisibility() == View.VISIBLE; michael@0: } michael@0: michael@0: public ToolbarComponent enterEditingMode() { michael@0: assertIsNotEditing(); michael@0: michael@0: mSolo.clickOnView(getUrlTitleText(), true); michael@0: michael@0: waitForEditing(); michael@0: WaitHelper.waitFor("UrlEditText to be input method target", new Condition() { michael@0: @Override michael@0: public boolean isSatisfied() { michael@0: return getUrlEditText().isInputMethodTarget(); michael@0: } michael@0: }); michael@0: michael@0: return this; michael@0: } michael@0: michael@0: public ToolbarComponent commitEditingMode() { michael@0: assertIsEditing(); michael@0: michael@0: WaitHelper.waitForPageLoad(new Runnable() { michael@0: @Override michael@0: public void run() { michael@0: mSolo.sendKey(Solo.ENTER); michael@0: } michael@0: }); michael@0: waitForNotEditing(); michael@0: michael@0: return this; michael@0: } michael@0: michael@0: public ToolbarComponent dismissEditingMode() { michael@0: assertIsEditing(); michael@0: michael@0: // Cancel Button not implemeneted in tablet. michael@0: if (DeviceHelper.isTablet()) { michael@0: if (getUrlEditText().isInputMethodTarget()) { michael@0: // Drop the soft keyboard. michael@0: // TODO: Solo.hideSoftKeyboard() does not clear focus, causing unexpected michael@0: // behavior, but we may want to use it over goBack(). michael@0: mSolo.goBack(); michael@0: } michael@0: michael@0: mSolo.goBack(); michael@0: } else { michael@0: mSolo.clickOnView(getEditCancelButton()); michael@0: } michael@0: michael@0: waitForNotEditing(); michael@0: michael@0: return this; michael@0: } michael@0: michael@0: public ToolbarComponent enterUrl(final String url) { michael@0: fAssertNotNull("url is not null", url); michael@0: michael@0: assertIsEditing(); michael@0: michael@0: final EditText urlEditText = getUrlEditText(); michael@0: fAssertTrue("The UrlEditText is the input method target", michael@0: urlEditText.isInputMethodTarget()); michael@0: michael@0: mSolo.clearEditText(urlEditText); michael@0: mSolo.enterText(urlEditText, url); michael@0: michael@0: return this; michael@0: } michael@0: michael@0: public ToolbarComponent pressBackButton() { michael@0: final ImageButton backButton = getBackButton(); michael@0: return pressButton(backButton, "back"); michael@0: } michael@0: michael@0: public ToolbarComponent pressForwardButton() { michael@0: final ImageButton forwardButton = getForwardButton(); michael@0: return pressButton(forwardButton, "forward"); michael@0: } michael@0: michael@0: private ToolbarComponent pressButton(final View view, final String buttonName) { michael@0: fAssertNotNull("The " + buttonName + " button View is not null", view); michael@0: fAssertTrue("The " + buttonName + " button is enabled", view.isEnabled()); michael@0: fAssertEquals("The " + buttonName + " button is visible", michael@0: View.VISIBLE, view.getVisibility()); michael@0: assertIsNotEditing(); michael@0: michael@0: WaitHelper.waitForPageLoad(new Runnable() { michael@0: @Override michael@0: public void run() { michael@0: mSolo.clickOnView(view); michael@0: } michael@0: }); michael@0: michael@0: return this; michael@0: } michael@0: michael@0: private void waitForEditing() { michael@0: WaitHelper.waitFor("Toolbar to enter editing mode", new Condition() { michael@0: @Override michael@0: public boolean isSatisfied() { michael@0: return isEditing(); michael@0: } michael@0: }); michael@0: } michael@0: michael@0: private void waitForNotEditing() { michael@0: WaitHelper.waitFor("Toolbar to exit editing mode", new Condition() { michael@0: @Override michael@0: public boolean isSatisfied() { michael@0: return !isEditing(); michael@0: } michael@0: }); michael@0: } michael@0: }