blob: ec2052f2ee4718de03f9076e0caaef803a538451 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.vr.util;
import static org.chromium.chrome.browser.vr.VrBrowserTestFramework.POLL_CHECK_INTERVAL_SHORT_MS;
import android.content.Intent;
import android.net.Uri;
import org.junit.Assert;
import org.chromium.base.ContextUtils;
import org.chromium.base.ThreadUtils;
import org.chromium.chrome.browser.ChromeTabbedActivity;
import org.chromium.chrome.browser.document.ChromeLauncherActivity;
import org.chromium.chrome.browser.vr.TestVrShellDelegate;
import org.chromium.chrome.browser.vr.VrIntentDelegate;
import org.chromium.chrome.browser.vr.VrModuleProvider;
import org.chromium.chrome.browser.vr.VrShell;
import org.chromium.chrome.browser.vr.VrShellDelegate;
import org.chromium.content_public.browser.test.util.CriteriaHelper;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* Class containing utility functions for transitioning between different states in the VR Browser.
*/
public class VrBrowserTransitionUtils extends VrTransitionUtils {
/**
* Forces Chrome into the VR Browser.
*
* @return True if the request to enter the VR Browser succeeded, false otherwise.
*/
public static boolean forceEnterVrBrowser() {
Boolean result = false;
try {
result = ThreadUtils.runOnUiThreadBlocking(
() -> { return VrShellDelegate.enterVrIfNecessary(); });
} catch (ExecutionException e) {
}
return result;
}
/**
* Forces Chrome into the VR Browser, causing a test failure if it is not entered in the
* allotted time.
*
* @param timeoutMs The amount of time in milliseconds to wait for VR Browser entry before
* failing.
*/
public static void forceEnterVrBrowserOrFail(int timeoutMs) {
Assert.assertTrue("Request to enter VR Browser failed", forceEnterVrBrowser());
waitForVrEntry(timeoutMs);
}
/**
* @return Whether the VR Browser's back button is enabled.
*/
public static Boolean isBackButtonEnabled() {
final AtomicBoolean isBackButtonEnabled = new AtomicBoolean();
ThreadUtils.runOnUiThreadBlocking(() -> {
isBackButtonEnabled.set(
TestVrShellDelegate.getVrShellForTesting().isBackButtonEnabled());
});
return isBackButtonEnabled.get();
}
/**
* @return Whether the VR Browers's forward button is enabled.
*/
public static Boolean isForwardButtonEnabled() {
final AtomicBoolean isForwardButtonEnabled = new AtomicBoolean();
ThreadUtils.runOnUiThreadBlocking(() -> {
isForwardButtonEnabled.set(
TestVrShellDelegate.getVrShellForTesting().isForwardButtonEnabled());
});
return isForwardButtonEnabled.get();
}
/**
* Navigates the VR Browser back.
*/
public static void navigateBack() {
ThreadUtils.runOnUiThreadBlocking(
() -> { TestVrShellDelegate.getVrShellForTesting().navigateBack(); });
}
/**
* Navigates the VR Browser forward.
*/
public static void navigateForward() {
ThreadUtils.runOnUiThreadBlocking(
() -> { TestVrShellDelegate.getVrShellForTesting().navigateForward(); });
}
/**
* Sends an intent to Chrome telling it to launch in VR mode.
*
* @param url String containing the URL to open.
*/
public static void sendVrLaunchIntent(String url) {
// Create an intent that will launch Chrome at the specified URL.
final Intent intent =
new Intent(ContextUtils.getApplicationContext(), ChromeLauncherActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
intent.addCategory(VrIntentDelegate.DAYDREAM_CATEGORY);
VrModuleProvider.getIntentDelegate().setupVrIntent(intent);
ThreadUtils.runOnUiThreadBlocking(
() -> { VrShellDelegate.getVrDaydreamApi().launchInVr(intent); });
}
/**
* Sends an intent to Chrome telling it to open a tab in 2D mode.
*/
public static void send2dMainIntent() {
final Intent intent =
new Intent(ContextUtils.getApplicationContext(), ChromeTabbedActivity.class);
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ThreadUtils.runOnUiThreadBlocking(
() -> { ContextUtils.getApplicationContext().startActivity(intent); });
}
/**
* Waits until either a JavaScript dialog or permission prompt is being displayed using the
* Android native UI in the VR browser.
*
* @param timeout How long in milliseconds to wait before timing out and failing.
*/
public static void waitForNativeUiPrompt(final int timeout) {
CriteriaHelper.pollInstrumentationThread(() -> {
VrShell vrShell = TestVrShellDelegate.getVrShellForTesting();
return vrShell.isDisplayingDialogView();
}, "Native UI prompt did not display", timeout, POLL_CHECK_INTERVAL_SHORT_MS);
}
}