/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package org.mozilla.fenix.helpers import android.content.ActivityNotFoundException import android.content.Context import android.content.Intent import android.net.Uri import android.os.Build import androidx.preference.PreferenceManager import androidx.test.espresso.Espresso.onView import androidx.test.espresso.ViewAction import androidx.test.espresso.action.CoordinatesProvider import androidx.test.espresso.action.GeneralClickAction import androidx.test.espresso.action.Press import androidx.test.espresso.action.Tap import androidx.test.espresso.action.ViewActions.longClick import androidx.test.espresso.assertion.ViewAssertions import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.platform.app.InstrumentationRegistry import androidx.test.uiautomator.By import androidx.test.uiautomator.UiScrollable import androidx.test.uiautomator.UiSelector import androidx.test.uiautomator.Until import org.hamcrest.CoreMatchers import org.hamcrest.CoreMatchers.allOf import org.mozilla.fenix.R import org.mozilla.fenix.helpers.ext.waitNotNull import org.mozilla.fenix.ui.robots.mDevice object TestHelper { fun scrollToElementByText(text: String): UiScrollable { val appView = UiScrollable(UiSelector().scrollable(true)) appView.scrollTextIntoView(text) return appView } fun longTapSelectItem(url: Uri) { mDevice.waitNotNull( Until.findObject(By.text(url.toString())), TestAssetHelper.waitingTime ) onView( allOf( withId(R.id.url), withText(url.toString()) ) ).perform(longClick()) } fun setPreference(context: Context, pref: String, value: Int) { val preferences = PreferenceManager.getDefaultSharedPreferences(context) val editor = preferences.edit() editor.putInt(pref, value) editor.apply() } fun restartApp(activity: HomeActivityTestRule) { with(activity) { finishActivity() mDevice.waitForIdle() launchActivity(null) } } fun getPermissionAllowID(): String { return when (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) { true -> "com.android.permissioncontroller" false -> "com.android.packageinstaller" } } fun waitUntilObjectIsFound(resourceName: String) { mDevice.waitNotNull( Until.findObjects(By.res(resourceName)), TestAssetHelper.waitingTime ) } fun verifyUrl(urlSubstring: String, resourceName: String, resId: Int) { waitUntilObjectIsFound(resourceName) onView(withId(resId)).check(ViewAssertions.matches(withText(CoreMatchers.containsString(urlSubstring)))) } fun openAppFromExternalLink(url: String) { val context = InstrumentationRegistry.getInstrumentation().getTargetContext() val intent = Intent().apply { action = Intent.ACTION_VIEW data = Uri.parse(url) `package` = "org.mozilla.fenix.debug" flags = Intent.FLAG_ACTIVITY_NEW_TASK } try { context.startActivity(intent) } catch (ex: ActivityNotFoundException) { intent.setPackage(null) context.startActivity(intent) } } fun sendSingleTapToScreen(x: Int, y: Int): ViewAction? { return GeneralClickAction( Tap.SINGLE, CoordinatesProvider { view -> val screenPos = IntArray(2) view.getLocationOnScreen(screenPos) val screenX = screenPos[0] + x.toFloat() val screenY = screenPos[1] + y.toFloat() floatArrayOf(screenX, screenY) }, Press.FINGER, 0, 0 ) } }