diff --git a/.editorconfig b/.editorconfig index fcd504b44..34ccba8ad 100644 --- a/.editorconfig +++ b/.editorconfig @@ -4,15 +4,10 @@ ij_kotlin_allow_trailing_comma=true [*] insert_final_newline = true +max_line_length = 120 # same as detekt.yml # rules we should look into enabling -ktlint_standard_blank-line-before-declaration = disabled -ktlint_standard_chain-method-continuation = disabled -ktlint_standard_class-signature = disabled -ktlint_standard_function-expression-body = disabled ktlint_standard_function-naming = disabled -ktlint_standard_function-signature = disabled ktlint_standard_indent = disabled ktlint_standard_multiline-expression-wrapping = disabled -ktlint_standard_no-empty-first-line-in-class-body = disabled ktlint_standard_string-template-indent = disabled diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/FirefoxTestRunner.kt b/app/src/androidTest/java/org/mozilla/reference/browser/FirefoxTestRunner.kt index ba540c9bd..119f1c3af 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/FirefoxTestRunner.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/FirefoxTestRunner.kt @@ -9,8 +9,9 @@ import android.content.Context import androidx.test.runner.AndroidJUnitRunner class FirefoxTestRunner : AndroidJUnitRunner() { - - override fun newApplication(cl: ClassLoader?, className: String?, context: Context?): Application { - return super.newApplication(cl, FirefoxTestApplication::class.java.name, context) - } + override fun newApplication( + cl: ClassLoader?, + className: String?, + context: Context?, + ): Application = super.newApplication(cl, FirefoxTestApplication::class.java.name, context) } diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/ext/UiDevice.kt b/app/src/androidTest/java/org/mozilla/reference/browser/ext/UiDevice.kt index a0628d602..e0ff688a8 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/ext/UiDevice.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/ext/UiDevice.kt @@ -15,7 +15,10 @@ import org.mozilla.reference.browser.helpers.TestAssetHelper.waitingTime * * @throws AssertionError if no [UiObject2] matches the condition */ -fun UiDevice.waitAndInteract(condition: SearchCondition, interaction: UiObject2.() -> Unit) { +fun UiDevice.waitAndInteract( + condition: SearchCondition, + interaction: UiObject2.() -> Unit, +) { val obj = this.wait(condition, waitingTime) assertNotNull(obj) interaction.invoke(obj) diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/helpers/Assert.kt b/app/src/androidTest/java/org/mozilla/reference/browser/helpers/Assert.kt index 082469a9a..e6e6cf70b 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/helpers/Assert.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/helpers/Assert.kt @@ -13,7 +13,11 @@ import org.junit.Assert.assertEquals * pixel data are the same (within the provided delta): this is the same metrics that * [Bitmap.sameAs] uses. */ -fun assertEqualsWithDelta(expectedB: Bitmap, actualB: Bitmap, delta: Float) { +fun assertEqualsWithDelta( + expectedB: Bitmap, + actualB: Bitmap, + delta: Float, +) { assertEquals("widths should be equal", expectedB.width, actualB.width) assertEquals("heights should be equal", expectedB.height, actualB.height) assertEquals("config should be equal", expectedB.config, actualB.config) diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/helpers/BrowserActivityTestRule.kt b/app/src/androidTest/java/org/mozilla/reference/browser/helpers/BrowserActivityTestRule.kt index e60918663..528e2ebe3 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/helpers/BrowserActivityTestRule.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/helpers/BrowserActivityTestRule.kt @@ -20,7 +20,6 @@ class BrowserActivityTestRule( initialTouchMode: Boolean = false, launchActivity: Boolean = true, ) : ActivityTestRule(BrowserActivity::class.java, initialTouchMode, launchActivity) { - /** * Ensures the test doesn't advance until session page load is completed. * diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/helpers/Matchers.kt b/app/src/androidTest/java/org/mozilla/reference/browser/helpers/Matchers.kt index ca33af108..40c3f46f6 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/helpers/Matchers.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/helpers/Matchers.kt @@ -36,7 +36,8 @@ fun isSelected(isSelected: Boolean): Matcher = maybeInvertMatcher(espresso * * @param matcher The matcher that our view cousins will be checked against to */ -fun hasCousin(matcher: Matcher): Matcher = object : BaseMatcher() { +fun hasCousin(matcher: Matcher): Matcher = + object : BaseMatcher() { override fun describeTo(description: Description?) { description?.apply { appendText("has cousin that matches: ") @@ -54,7 +55,8 @@ fun hasCousin(matcher: Matcher): Matcher = object : BaseMatcher): (View?) -> Boolean = { + private fun matchChildren(matcher: Matcher): (View?) -> Boolean = + { (it as? ViewGroup) ?.children ?.filter { v -> matcher.matches(v) } @@ -62,7 +64,11 @@ fun hasCousin(matcher: Matcher): Matcher = object : BaseMatcher, useUnmodifiedMatcher: Boolean): Matcher = when { +private fun maybeInvertMatcher( + matcher: Matcher, + useUnmodifiedMatcher: Boolean, +): Matcher = + when { useUnmodifiedMatcher -> matcher else -> not(matcher) } diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/helpers/MockWebServer.kt b/app/src/androidTest/java/org/mozilla/reference/browser/helpers/MockWebServer.kt index 8662c95a6..4c17581b2 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/helpers/MockWebServer.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/helpers/MockWebServer.kt @@ -18,7 +18,6 @@ import java.io.IOException import java.io.InputStream object MockWebServerHelper { - fun initMockWebServerAndReturnEndpoints(vararg messages: String): List { val mockServer = MockWebServer() var uniquePath = 0 @@ -48,7 +47,9 @@ class AndroidAssetDispatcher : Dispatcher() { private val mainThreadHandler = Handler(Looper.getMainLooper()) override fun dispatch(request: RecordedRequest): MockResponse { - val assetManager = androidx.test.platform.app.InstrumentationRegistry.getInstrumentation().context.assets + val assetManager = androidx.test.platform.app.InstrumentationRegistry + .getInstrumentation() + .context.assets try { val pathWithoutQueryParams = Uri.parse(request.path!!.drop(1)).path assetManager.open(pathWithoutQueryParams!!).use { inputStream -> @@ -64,12 +65,14 @@ class AndroidAssetDispatcher : Dispatcher() { } @Throws(IOException::class) -private fun fileToResponse(path: String, file: InputStream): MockResponse { - return MockResponse() +private fun fileToResponse( + path: String, + file: InputStream, +): MockResponse = + MockResponse() .setResponseCode(HTTP_OK) .setBody(fileToBytes(file)!!) .addHeader("content-type: " + contentType(path)) -} @Throws(IOException::class) private fun fileToBytes(file: InputStream): Buffer? { @@ -78,8 +81,8 @@ private fun fileToBytes(file: InputStream): Buffer? { return result } -private fun contentType(path: String): String? { - return when { +private fun contentType(path: String): String? = + when { path.endsWith(".png") -> "image/png" path.endsWith(".jpg") -> "image/jpeg" path.endsWith(".jpeg") -> "image/jpeg" @@ -89,4 +92,3 @@ private fun contentType(path: String): String? { path.endsWith(".txt") -> "text/plain; charset=utf-8" else -> "application/octet-stream" } -} diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/helpers/RetryTestRule.kt b/app/src/androidTest/java/org/mozilla/reference/browser/helpers/RetryTestRule.kt index 5e4e75f19..5486d17f6 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/helpers/RetryTestRule.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/helpers/RetryTestRule.kt @@ -11,10 +11,14 @@ import org.junit.runner.Description import org.junit.runners.model.Statement import java.lang.AssertionError -class RetryTestRule(private val retryCount: Int = 5) : TestRule { - - override fun apply(base: Statement, description: Description): Statement { - return statement { +class RetryTestRule( + private val retryCount: Int = 5, +) : TestRule { + override fun apply( + base: Statement, + description: Description, + ): Statement = + statement { for (i in 1..retryCount) { try { base.evaluate() @@ -34,11 +38,9 @@ class RetryTestRule(private val retryCount: Int = 5) : TestRule { } } } - } - private inline fun statement(crossinline eval: () -> Unit): Statement { - return object : Statement() { + private inline fun statement(crossinline eval: () -> Unit): Statement = + object : Statement() { override fun evaluate() = eval() } - } } diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/helpers/SessionLoadedIdlingResource.kt b/app/src/androidTest/java/org/mozilla/reference/browser/helpers/SessionLoadedIdlingResource.kt index 1acc35474..f5423f2a2 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/helpers/SessionLoadedIdlingResource.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/helpers/SessionLoadedIdlingResource.kt @@ -17,9 +17,7 @@ import org.mozilla.reference.browser.BrowserApplication class SessionLoadedIdlingResource : IdlingResource { private var resourceCallback: IdlingResource.ResourceCallback? = null - override fun getName(): String { - return SessionLoadedIdlingResource::class.java.simpleName - } + override fun getName(): String = SessionLoadedIdlingResource::class.java.simpleName override fun isIdleNow(): Boolean { val context = InstrumentationRegistry.getInstrumentation().targetContext.applicationContext @@ -27,7 +25,10 @@ class SessionLoadedIdlingResource : IdlingResource { val store = context.components.core.store - return if (store.state.selectedTab?.content?.loading == true) { + return if (store.state.selectedTab + ?.content + ?.loading == true + ) { false } else { invokeCallback() diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/helpers/TestAssetHelper.kt b/app/src/androidTest/java/org/mozilla/reference/browser/helpers/TestAssetHelper.kt index 0566c78c6..f601f1341 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/helpers/TestAssetHelper.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/helpers/TestAssetHelper.kt @@ -15,7 +15,12 @@ import java.util.concurrent.TimeUnit object TestAssetHelper { val waitingTime: Long = TimeUnit.SECONDS.toMillis(15) val waitingTimeShort: Long = TimeUnit.SECONDS.toMillis(1) - data class TestAsset(val url: Uri, val content: String, val title: String) + + data class TestAsset( + val url: Uri, + val content: String, + val title: String, + ) /** * Hosts 3 simple websites, found at androidTest/assets/pages/generic[1|2|3].html @@ -25,17 +30,19 @@ object TestAssetHelper { * Content for these pages all follow the same pattern. See [generic1.html] for * content implementation details. */ - fun getGenericAssets(server: MockWebServer): List { - return (1..4).map { + fun getGenericAssets(server: MockWebServer): List = + (1..4).map { TestAsset( server.url("pages/generic$it.html").toString().toUri()!!, "Page content: $it", "", ) } - } - fun getGenericAsset(server: MockWebServer, pageNum: Int): TestAsset { + fun getGenericAsset( + server: MockWebServer, + pageNum: Int, + ): TestAsset { val url = server.url("pages/generic$pageNum.html").toString().toUri()!! val content = "Page content: $pageNum" val title = "Test_Page_$pageNum" diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/helpers/TestHelper.kt b/app/src/androidTest/java/org/mozilla/reference/browser/helpers/TestHelper.kt index 335da1489..fdffa82b2 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/helpers/TestHelper.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/helpers/TestHelper.kt @@ -27,7 +27,6 @@ import org.mozilla.reference.browser.helpers.TestAssetHelper.waitingTimeShort import org.mozilla.reference.browser.ui.robots.mDevice object TestHelper { - val packageName = InstrumentationRegistry.getInstrumentation().targetContext.packageName val appContext: Context = InstrumentationRegistry.getInstrumentation().targetContext val appName = appContext.appName @@ -38,30 +37,30 @@ object TestHelper { return appView } - fun getPermissionAllowID(): String { - return when (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) { + fun getPermissionAllowID(): String = + when (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) { true -> "com.android.permissioncontroller" false -> "com.android.packageinstaller" } - } fun createCustomTabIntent( pageUrl: String, customActionButtonDescription: String = "", ): Intent { - val appContext = InstrumentationRegistry.getInstrumentation() + val appContext = InstrumentationRegistry + .getInstrumentation() .targetContext .applicationContext val pendingIntent = PendingIntent.getActivity(appContext, 0, Intent(), 0) - val customTabsIntent = CustomTabsIntent.Builder() + val customTabsIntent = CustomTabsIntent + .Builder() .setShareState(CustomTabsIntent.SHARE_STATE_ON) .setActionButton( createTestBitmap(), customActionButtonDescription, pendingIntent, true, - ) - .build() + ).build() customTabsIntent.intent.data = Uri.parse(pageUrl) return customTabsIntent.intent } @@ -73,21 +72,27 @@ object TestHelper { return bitmap } - fun UiDevice.waitForObjects(obj: UiObject, waitingTime: Long = TestAssetHelper.waitingTime) { + fun UiDevice.waitForObjects( + obj: UiObject, + waitingTime: Long = TestAssetHelper.waitingTime, + ) { this.waitForIdle() Assert.assertNotNull(obj.waitForExists(waitingTime)) } - fun itemWithResId(resourceId: String) = - mDevice.findObject(UiSelector().resourceId(resourceId)) + fun itemWithResId(resourceId: String) = mDevice.findObject(UiSelector().resourceId(resourceId)) - fun itemWithText(itemText: String) = - mDevice.findObject(UiSelector().text(itemText)) + fun itemWithText(itemText: String) = mDevice.findObject(UiSelector().text(itemText)) - fun itemWithResIdContainingText(resourceId: String, text: String) = - mDevice.findObject(UiSelector().resourceId(resourceId).textContains(text)) + fun itemWithResIdContainingText( + resourceId: String, + text: String, + ) = mDevice.findObject(UiSelector().resourceId(resourceId).textContains(text)) - fun assertUIObjectExists(vararg appItems: UiObject, exists: Boolean = true) { + fun assertUIObjectExists( + vararg appItems: UiObject, + exists: Boolean = true, + ) { if (exists) { for (appItem in appItems) { assertTrue(appItem.waitForExists(waitingTime)) diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/helpers/ext/String.kt b/app/src/androidTest/java/org/mozilla/reference/browser/helpers/ext/String.kt index 8b125773b..f2e7d3218 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/helpers/ext/String.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/helpers/ext/String.kt @@ -8,7 +8,8 @@ import android.net.Uri // Extension functions for the String class -fun String?.toUri(): Uri? = if (this == null) { +fun String?.toUri(): Uri? = + if (this == null) { null } else { Uri.parse(this) diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/helpers/ext/ViewInteraction.kt b/app/src/androidTest/java/org/mozilla/reference/browser/helpers/ext/ViewInteraction.kt index 044919541..043f92584 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/helpers/ext/ViewInteraction.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/helpers/ext/ViewInteraction.kt @@ -10,14 +10,9 @@ import androidx.test.espresso.assertion.ViewAssertions.matches fun ViewInteraction.click(): ViewInteraction = this.perform(ViewActions.click())!! -fun ViewInteraction.assertIsEnabled(isEnabled: Boolean): ViewInteraction { - return this.check(matches(isEnabled(isEnabled)))!! -} +fun ViewInteraction.assertIsEnabled(isEnabled: Boolean): ViewInteraction = this.check(matches(isEnabled(isEnabled)))!! -fun ViewInteraction.assertIsChecked(isChecked: Boolean): ViewInteraction { - return this.check(matches(isChecked(isChecked)))!! -} +fun ViewInteraction.assertIsChecked(isChecked: Boolean): ViewInteraction = this.check(matches(isChecked(isChecked)))!! -fun ViewInteraction.assertIsSelected(isSelected: Boolean): ViewInteraction { - return this.check(matches(isSelected(isSelected)))!! -} +fun ViewInteraction.assertIsSelected(isSelected: Boolean): ViewInteraction = + this.check(matches(isSelected(isSelected)))!! diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/helpers/matchers/TabMatcher.kt b/app/src/androidTest/java/org/mozilla/reference/browser/helpers/matchers/TabMatcher.kt index f2a5328ac..71417585b 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/helpers/matchers/TabMatcher.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/helpers/matchers/TabMatcher.kt @@ -34,12 +34,11 @@ class TabMatcher( } companion object { - fun withText(text: String): Matcher { - return TabMatcher( + fun withText(text: String): Matcher = + TabMatcher( R.id.mozac_browser_tabstray_title, ) { (it as TextView).text == text } - } } } diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/ui/AddonsTest.kt b/app/src/androidTest/java/org/mozilla/reference/browser/ui/AddonsTest.kt index 720a4b6db..1977f6e4a 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/ui/AddonsTest.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/ui/AddonsTest.kt @@ -15,7 +15,6 @@ import org.mozilla.reference.browser.helpers.RetryTestRule import org.mozilla.reference.browser.ui.robots.navigationToolbar class AddonsTest { - private lateinit var mockWebServer: MockWebServer @get:Rule diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/ui/ContextMenusTest.kt b/app/src/androidTest/java/org/mozilla/reference/browser/ui/ContextMenusTest.kt index 3e6604214..8176e691d 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/ui/ContextMenusTest.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/ui/ContextMenusTest.kt @@ -17,7 +17,6 @@ import org.mozilla.reference.browser.ui.robots.browser import org.mozilla.reference.browser.ui.robots.navigationToolbar class ContextMenusTest { - private lateinit var mockWebServer: MockWebServer @get:Rule diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/ui/CustomTabsTest.kt b/app/src/androidTest/java/org/mozilla/reference/browser/ui/CustomTabsTest.kt index 57fe31244..3f8ab7980 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/ui/CustomTabsTest.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/ui/CustomTabsTest.kt @@ -21,7 +21,6 @@ import org.mozilla.reference.browser.helpers.TestHelper.createCustomTabIntent import org.mozilla.reference.browser.ui.robots.customTabScreen class CustomTabsTest { - private lateinit var mockWebServer: MockWebServer @get:Rule diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/ui/DownloadTest.kt b/app/src/androidTest/java/org/mozilla/reference/browser/ui/DownloadTest.kt index c654e6356..446ad982b 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/ui/DownloadTest.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/ui/DownloadTest.kt @@ -19,7 +19,6 @@ import org.mozilla.reference.browser.ui.robots.navigationToolbar import org.mozilla.reference.browser.ui.robots.notificationShade class DownloadTest { - private lateinit var mockWebServer: MockWebServer @get:Rule diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/ui/MediaPlaybackTest.kt b/app/src/androidTest/java/org/mozilla/reference/browser/ui/MediaPlaybackTest.kt index 70575d0cb..972384008 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/ui/MediaPlaybackTest.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/ui/MediaPlaybackTest.kt @@ -17,7 +17,6 @@ import org.mozilla.reference.browser.ui.robots.navigationToolbar import org.mozilla.reference.browser.ui.robots.notificationShade class MediaPlaybackTest { - private lateinit var mockWebServer: MockWebServer @get:Rule diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/ui/ReaderViewTest.kt b/app/src/androidTest/java/org/mozilla/reference/browser/ui/ReaderViewTest.kt index 83a520a7a..bb3882cb5 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/ui/ReaderViewTest.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/ui/ReaderViewTest.kt @@ -16,7 +16,6 @@ import org.mozilla.reference.browser.helpers.TestAssetHelper import org.mozilla.reference.browser.ui.robots.navigationToolbar class ReaderViewTest { - private lateinit var mockWebServer: MockWebServer @get:Rule diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/ui/SearchTest.kt b/app/src/androidTest/java/org/mozilla/reference/browser/ui/SearchTest.kt index 964a229ae..076ec1c62 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/ui/SearchTest.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/ui/SearchTest.kt @@ -16,7 +16,6 @@ import org.mozilla.reference.browser.helpers.TestAssetHelper import org.mozilla.reference.browser.ui.robots.navigationToolbar class SearchTest { - private lateinit var mockWebServer: MockWebServer @get:Rule diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/ui/TabTrayMenuTest.kt b/app/src/androidTest/java/org/mozilla/reference/browser/ui/TabTrayMenuTest.kt index f02224068..c7f3359f2 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/ui/TabTrayMenuTest.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/ui/TabTrayMenuTest.kt @@ -33,7 +33,6 @@ import org.mozilla.reference.browser.ui.robots.navigationToolbar */ class TabTrayMenuTest { - private lateinit var mockWebServer: MockWebServer @get:Rule val activityTestRule = BrowserActivityTestRule() @@ -53,7 +52,9 @@ class TabTrayMenuTest { } fun optionsButton() = onView(ViewMatchers.withContentDescription("More options")) + fun closeAllTabsButton() = onView(ViewMatchers.withText("Close All Tabs")) + fun goBackButton() = onView(ViewMatchers.withContentDescription("back")) val tabCounterButton = onView(withId(R.id.counter_text)) diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/ui/ThreeDotMenuTest.kt b/app/src/androidTest/java/org/mozilla/reference/browser/ui/ThreeDotMenuTest.kt index d38dae1ed..539cd53d0 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/ui/ThreeDotMenuTest.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/ui/ThreeDotMenuTest.kt @@ -39,7 +39,6 @@ import org.mozilla.reference.browser.ui.robots.navigationToolbar */ class ThreeDotMenuTest { - private val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) private lateinit var mockWebServer: MockWebServer diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/AddToHomeScreenRobot.kt b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/AddToHomeScreenRobot.kt index ed098ca9d..786e81832 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/AddToHomeScreenRobot.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/AddToHomeScreenRobot.kt @@ -11,18 +11,21 @@ import org.mozilla.reference.browser.helpers.TestAssetHelper.waitingTime * Implementation of Robot Pattern for the Add to homescreen feature. */ class AddToHomeScreenRobot { - fun clickCancelAddToHomeScreenButton() { cancelAddToHomeScreenButton().waitForExists(waitingTime) cancelAddToHomeScreenButton().click() } + fun clickAddAutomaticallyToHomeScreenButton() { addAutomaticallyToHomeScreenButton().waitForExists(waitingTime) addAutomaticallyToHomeScreenButton().click() } class Transition { - fun openHomeScreenShortcut(title: String, interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { + fun openHomeScreenShortcut( + title: String, + interact: BrowserRobot.() -> Unit, + ): BrowserRobot.Transition { mDevice.findObject(UiSelector().textContains(title)).waitForExists(waitingTime) mDevice.findObject((UiSelector().textContains(title))).clickAndWaitForNewWindow(waitingTime) @@ -32,6 +35,7 @@ class AddToHomeScreenRobot { } private fun cancelAddToHomeScreenButton() = mDevice.findObject(UiSelector().textContains("CANCEL")) + private fun addAutomaticallyToHomeScreenButton() = mDevice.findObject(UiSelector().textContains("ADD AUTOMATICALLY")) } diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/AddonsManagerRobot.kt b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/AddonsManagerRobot.kt index ef342689d..93600e6ba 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/AddonsManagerRobot.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/AddonsManagerRobot.kt @@ -37,7 +37,6 @@ import org.mozilla.reference.browser.helpers.click * Implementation of Robot Pattern for the addons manager. */ class AddonsManagerRobot { - fun verifyAddonsRecommendedView() { assertTrue(mDevice.findObject(UiSelector().text("Recommended")).waitForExists(waitingTime)) // Check uBlock is displayed in the "Recommended" section @@ -56,12 +55,19 @@ class AddonsManagerRobot { } fun verifyInstallAddonPrompt(addonName: String) = assertAddonPrompt(addonName) + fun verifyAddonDownloadCompletedPrompt(addonName: String) = assertAddonDownloadCompletedPrompt(addonName) + fun verifyAddonElementsView(addonName: String) = assertAddonElementsView(addonName) + fun clickInstallAddonButton(addonName: String) = selectInstallAddonButton(addonName) + fun clickCancelInstallButton() = cancelInstallButton() + fun clickAllowInstallAddonButton() = allowInstallAddonButton() + fun waitForAddonDownloadComplete() = waitForDownloadProgressUntilGone() + fun openAddon(addonName: String) = itemWithResIdContainingText("$packageName:id/add_on_name", addonName) .also { @@ -71,7 +77,8 @@ class AddonsManagerRobot { fun dismissAddonDownloadCompletedPrompt(addonName: String) { mDevice.waitForWindowUpdate(packageName, waitingTime) - mDevice.findObject(UiSelector().text("$addonName has been added to Reference Browser")) + mDevice + .findObject(UiSelector().text("$addonName has been added to Reference Browser")) .waitForExists(waitingTime) mDevice.waitAndInteract( Until.findObject( @@ -80,7 +87,8 @@ class AddonsManagerRobot { ), ), ) {} - mDevice.findObject( + mDevice + .findObject( UiSelector().textContains( getStringResource(R.string.mozac_feature_addons_installed_dialog_okay_button_2), ), @@ -112,7 +120,8 @@ class AddonsManagerRobot { private fun selectInstallAddonButton(addonName: String) { mDevice.waitForIdle() - mDevice.findObject(UiSelector().textContains(addonName)) + mDevice + .findObject(UiSelector().textContains(addonName)) .waitForExists(waitingTime) installAddonButton(addonName) @@ -122,14 +131,15 @@ class AddonsManagerRobot { private fun assertAddonPrompt(addonName: String) { mDevice.waitForIdle() - mDevice.findObject( + mDevice + .findObject( UiSelector() .resourceId("$packageName:id/title"), - ) - .waitForExists(waitingTime) + ).waitForExists(waitingTime) assertTrue( - mDevice.findObject(UiSelector().textContains("Add $addonName?")) + mDevice + .findObject(UiSelector().textContains("Add $addonName?")) .waitForExists(waitingTime), ) @@ -145,16 +155,14 @@ class AddonsManagerRobot { withId(R.id.allow_button), withText(R.string.mozac_feature_addons_permissions_dialog_add), ), - ) - .check(matches(isCompletelyDisplayed())) + ).check(matches(isCompletelyDisplayed())) onView( allOf( withId(R.id.deny_button), withText(R.string.mozac_feature_addons_permissions_dialog_cancel), ), - ) - .check(matches(isCompletelyDisplayed())) + ).check(matches(isCompletelyDisplayed())) } private fun cancelInstallButton() { @@ -163,8 +171,7 @@ class AddonsManagerRobot { withId(R.id.deny_button), withText(R.string.mozac_feature_addons_permissions_dialog_cancel), ), - ) - .check(matches(isCompletelyDisplayed())) + ).check(matches(isCompletelyDisplayed())) .perform(click()) } @@ -176,25 +183,25 @@ class AddonsManagerRobot { withId(R.id.allow_button), withText(R.string.mozac_feature_addons_permissions_dialog_add), ), - ) - .check(matches(isCompletelyDisplayed())) + ).check(matches(isCompletelyDisplayed())) .perform(click()) } private fun assertAddonDownloadCompletedPrompt(addonName: String) { mDevice.waitForIdle() assertTrue( - mDevice.findObject( + mDevice + .findObject( UiSelector() .textContains("$addonName has been added to Reference Browser"), - ) - .waitForExists(waitingTime), + ).waitForExists(waitingTime), ) } private fun waitForDownloadProgressUntilGone() { mDevice.waitForIdle() - mDevice.findObject(UiSelector().resourceId("$packageName:id/addonProgressOverlay")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/addonProgressOverlay")) .waitUntilGone(waitingTime) } diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/AwesomeBarRobot.kt b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/AwesomeBarRobot.kt index 0c1d6e51d..7d06910af 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/AwesomeBarRobot.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/AwesomeBarRobot.kt @@ -26,9 +26,10 @@ import org.mozilla.reference.browser.helpers.click * Implementation of Robot Pattern for awesomebar. */ class AwesomeBarRobot { - fun verifySearchSuggestion(searchSuggestionTitle: String) = assertSearchSuggestion(searchSuggestionTitle) + fun verifyLinkFromClipboard(clipboardLink: String) = assertLinkFromClipboard(clipboardLink) + fun verifyPastedToolbarText(expectedText: String) = assertPastedToolbarText(expectedText) fun typeText(searchTerm: String) { @@ -44,9 +45,11 @@ class AwesomeBarRobot { fun longClickToolbar() { mDevice.waitForWindowUpdate(packageName, waitingTime) - mDevice.findObject(UiSelector().resourceId("$packageName:id/awesomeBar")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/awesomeBar")) .waitForExists(waitingTime) - mDevice.findObject(UiSelector().resourceId("$packageName:id/toolbar")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/toolbar")) .waitForExists(waitingTime) val toolbar = mDevice.findObject(By.res("$packageName:id/toolbar")) toolbar.click(LONG_CLICK_DURATION) @@ -67,7 +70,6 @@ class AwesomeBarRobot { } class Transition { - fun openWebPage(interact: NavigationToolbarRobot.() -> Unit): NavigationToolbarRobot.Transition { NavigationToolbarRobot().interact() return NavigationToolbarRobot.Transition() @@ -105,27 +107,33 @@ private fun clearToolbarButton() = private fun assertSearchSuggestion(searchSuggestionTitle: String) { mDevice.waitForIdle() assertTrue( - mDevice.findObject(UiSelector().textContains(searchSuggestionTitle)) + mDevice + .findObject(UiSelector().textContains(searchSuggestionTitle)) .waitForExists(waitingTime), ) } private fun assertLinkFromClipboard(clipboardLink: String) { mDevice.waitForIdle() - mDevice.findObject(UiSelector().resourceId("$packageName:id/awesomeBar")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/awesomeBar")) .waitForExists(waitingTime) - mDevice.findObject(UiSelector().resourceId("$packageName:id/mozac_browser_awesomebar_title")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/mozac_browser_awesomebar_title")) .waitForExists(waitingTime) assertTrue( - mDevice.findObject(UiSelector().textContains(clipboardLink)) + mDevice + .findObject(UiSelector().textContains(clipboardLink)) .waitForExists(waitingTime), ) } private fun assertPastedToolbarText(expectedText: String) { - mDevice.findObject(UiSelector().resourceId("$packageName:id/toolbar")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/toolbar")) .waitForExists(waitingTime) - mDevice.findObject(UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_url_view")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_url_view")) .waitForExists(waitingTime) onView( allOf( diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/BrowserRobot.kt b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/BrowserRobot.kt index 58115524f..e2bce734b 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/BrowserRobot.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/BrowserRobot.kt @@ -31,7 +31,8 @@ class BrowserRobot { fun verifyPageContent(expectedText: String) { mDevice.waitForObjects(mDevice.findObject(UiSelector().resourceId("android.webkit.WebView"))) assertTrue( - mDevice.findObject( + mDevice + .findObject( UiSelector() .textContains(expectedText), ).waitForExists(waitingTime), @@ -47,17 +48,18 @@ class BrowserRobot { } fun verifyUrl(expectedUrl: String) { - mDevice.findObject( + mDevice + .findObject( UiSelector() .resourceId("$packageName:id/toolbar"), - ) - .waitForExists(waitingTime) - mDevice.findObject( + ).waitForExists(waitingTime) + mDevice + .findObject( UiSelector() .resourceId("$packageName:id/mozac_browser_toolbar_url_view"), - ) - .waitForExists(waitingTime) - mDevice.findObject(UiSelector().textContains(expectedUrl)) + ).waitForExists(waitingTime) + mDevice + .findObject(UiSelector().textContains(expectedUrl)) .waitForExists(waitingTime) onView( allOf( @@ -70,29 +72,36 @@ class BrowserRobot { fun verifyAboutBrowser() { assertTrue( - mDevice.findObject(UiSelector().resourceId("$packageName:id/about_content")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/about_content")) .waitForExists(waitingTime), ) assertTrue( - mDevice.findObject(UiSelector().resourceId("$packageName:id/version_info")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/version_info")) .waitForExists(waitingTime), ) } fun longClickMatchingText(expectedText: String) { mDevice.waitForWindowUpdate(packageName, waitingTime) - mDevice.findObject(UiSelector().resourceId("$packageName:id/engineView")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/engineView")) .waitForExists(waitingTime) mDevice.findObject(UiSelector().textContains(expectedText)).waitForExists(waitingTime) val link = mDevice.findObject(By.textContains(expectedText)) link.click(LONG_CLICK_DURATION) } - fun longClickAndCopyText(expectedText: String, selectAll: Boolean = false) { + fun longClickAndCopyText( + expectedText: String, + selectAll: Boolean = false, + ) { try { // Long click desired text mDevice.waitForWindowUpdate(packageName, waitingTime) - mDevice.findObject(UiSelector().resourceId("$packageName:id/engineView")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/engineView")) .waitForExists(waitingTime) mDevice.findObject(UiSelector().textContains(expectedText)).waitForExists(waitingTime) val link = mDevice.findObject(By.textContains(expectedText)) @@ -121,7 +130,8 @@ class BrowserRobot { // Long click again the desired text mDevice.waitForWindowUpdate(packageName, waitingTime) - mDevice.findObject(UiSelector().resourceId("$packageName:id/engineView")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/engineView")) .waitForExists(waitingTime) mDevice.findObject(UiSelector().textContains(expectedText)).waitForExists(waitingTime) val link = mDevice.findObject(By.textContains(expectedText)) @@ -143,56 +153,69 @@ class BrowserRobot { fun verifyLinkContextMenuItems() { mDevice.waitForWindowUpdate(packageName, waitingTime) - mDevice.findObject(UiSelector().resourceId("$packageName:id/parentPanel")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/parentPanel")) .waitForExists(waitingTime) assertTrue( - mDevice.findObject(UiSelector().resourceId("$packageName:id/titleView")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/titleView")) .waitForExists(waitingTime), ) assertTrue( - mDevice.findObject(UiSelector().textContains("Open link in new tab")) + mDevice + .findObject(UiSelector().textContains("Open link in new tab")) .waitForExists(waitingTime), ) assertTrue( - mDevice.findObject(UiSelector().textContains("Open link in private tab")) + mDevice + .findObject(UiSelector().textContains("Open link in private tab")) .waitForExists(waitingTime), ) assertTrue( - mDevice.findObject(UiSelector().textContains("Copy link")) + mDevice + .findObject(UiSelector().textContains("Copy link")) .waitForExists(waitingTime), ) assertTrue( - mDevice.findObject(UiSelector().textContains("Share link")) + mDevice + .findObject(UiSelector().textContains("Share link")) .waitForExists(waitingTime), ) } fun verifyNoControlsVideoContextMenuItems() { mDevice.waitForWindowUpdate(packageName, waitingTime) - mDevice.findObject(UiSelector().resourceId("$packageName:id/parentPanel")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/parentPanel")) .waitForExists(waitingTime) assertTrue( - mDevice.findObject(UiSelector().resourceId("$packageName:id/titleView")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/titleView")) .waitForExists(waitingTime), ) assertTrue( - mDevice.findObject(UiSelector().textContains("Copy link")) + mDevice + .findObject(UiSelector().textContains("Copy link")) .waitForExists(waitingTime), ) assertTrue( - mDevice.findObject(UiSelector().textContains("Share link")) + mDevice + .findObject(UiSelector().textContains("Share link")) .waitForExists(waitingTime), ) assertTrue( - mDevice.findObject(UiSelector().textContains("Save file to device")) + mDevice + .findObject(UiSelector().textContains("Save file to device")) .waitForExists(waitingTime), ) } fun clickContextOpenLinkInNewTab() { - mDevice.findObject(UiSelector().resourceId("$packageName:id/parentPanel")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/parentPanel")) .waitForExists(waitingTime) - mDevice.findObject(UiSelector().textContains("Open link in new tab")) + mDevice + .findObject(UiSelector().textContains("Open link in new tab")) .waitForExists(waitingTime) val contextMenuOpenInNewTab = mDevice.findObject(UiSelector().textContains("Open link in new tab")) @@ -200,9 +223,11 @@ class BrowserRobot { } fun clickContextOpenLinkInPrivateTab() { - mDevice.findObject(UiSelector().resourceId("$packageName:id/parentPanel")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/parentPanel")) .waitForExists(waitingTime) - mDevice.findObject(UiSelector().textContains("Open link in private tab")) + mDevice + .findObject(UiSelector().textContains("Open link in private tab")) .waitForExists(waitingTime) val contextMenuOpenInNewPrivateTab = mDevice.findObject(UiSelector().textContains("Open link in private tab")) @@ -210,9 +235,11 @@ class BrowserRobot { } fun clickContextCopyLink() { - mDevice.findObject(UiSelector().resourceId("$packageName:id/parentPanel")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/parentPanel")) .waitForExists(waitingTime) - mDevice.findObject(UiSelector().textContains("Copy link")) + mDevice + .findObject(UiSelector().textContains("Copy link")) .waitForExists(waitingTime) val contextCopyLink = mDevice.findObject(UiSelector().textContains("Copy link")) @@ -220,7 +247,8 @@ class BrowserRobot { } fun waitUntilCopyLinkSnackbarIsGone() = - mDevice.findObject( + mDevice + .findObject( UiSelector() .resourceId("$packageName:id/snackbar_text") .textContains("Link copied to clipboard"), @@ -239,7 +267,8 @@ class BrowserRobot { } fun clickOpenInAppPromptButton() = - mDevice.findObject( + mDevice + .findObject( UiSelector() .resourceId("android:id/button1") .textContains("OPEN"), @@ -249,7 +278,8 @@ class BrowserRobot { } fun clickSnackbarSwitchButton() = - mDevice.findObject( + mDevice + .findObject( UiSelector() .resourceId("$packageName:id/snackbar_action") .textContains("SWITCH"), @@ -266,9 +296,11 @@ class BrowserRobot { } fun clickContextShareLink(interact: ContentPanelRobot.() -> Unit): ContentPanelRobot.Transition { - mDevice.findObject(UiSelector().resourceId("$packageName:id/parentPanel")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/parentPanel")) .waitForExists(waitingTime) - mDevice.findObject(UiSelector().textContains("Share link")) + mDevice + .findObject(UiSelector().textContains("Share link")) .waitForExists(waitingTime) val contextCopyLink = mDevice.findObject(UiSelector().textContains("Share link")) @@ -280,7 +312,8 @@ class BrowserRobot { fun goBack(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { mDevice.pressBack() - mDevice.findObject( + mDevice + .findObject( UiSelector() .resourceId("$packageName:id/mozac_browser_toolbar_progress"), ).waitUntilGone(waitingTime) diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/CustomTabRobot.kt b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/CustomTabRobot.kt index 29e8e3a5d..4ae2fd4c8 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/CustomTabRobot.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/CustomTabRobot.kt @@ -24,27 +24,43 @@ import org.mozilla.reference.browser.helpers.click * Implementation of the robot pattern for Custom tabs */ class CustomTabRobot { - fun verifyCloseButton() = assertCloseButton() + fun verifyTrackingProtectionIcon() = assertTrackingProtectionIcon() + fun verifySecurityIndicator() = assertSecurityIndicator() + fun verifyPageTitle(title: String) = assertCustomTabTitle(title) + fun verifyPageUrl(url: String) = assertCustomTabUrl(url) + fun verifyActionButton() = assertActionButton() + fun verifyMenuButton() = assertMenuButton() + fun verifyForwardButton() = assertForwardButton() + fun verifyRefreshButton() = assertRefreshButton() + fun verifyStopButton() = assertStopButton() + fun verifyShareButton() = assertShareButton() + fun verifyRequestDesktopButton() = assertRequestDesktopButton() + fun verifyFindInPageButton() = assertFindInPageButton() + fun verifyOpenInBrowserButton() = assertOpenInBrowserButton() + fun verifyRequestDesktopSiteIsTurnedOff() = assertRequestDesktopSiteIsTurnedOff() + fun verifyRequestDesktopSiteIsTurnedOn() = assertRequestDesktopSiteIsTurnedOn() + fun clickForwardButton() = forwardButton().click() fun clickGenericLink(expectedText: String) { - mDevice.findObject(UiSelector().resourceId("$packageName:id/engineView")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/engineView")) .waitForExists(waitingTime) mDevice.findObject(UiSelector().textContains(expectedText)).waitForExists(waitingTime) val link = mDevice.findObject(By.textContains(expectedText)) @@ -54,12 +70,14 @@ class CustomTabRobot { fun switchRequestDesktopSiteToggle() { try { // Click the Request desktop site toggle - mDevice.findObject(UiSelector().textContains("Request desktop site")) + mDevice + .findObject(UiSelector().textContains("Request desktop site")) .waitForExists(waitingTime) requestDesktopButton().click() mDevice.waitForIdle() assertTrue( - mDevice.findObject( + mDevice + .findObject( UiSelector() .resourceId("$packageName:id/mozac_browser_menu_recyclerView"), ).waitUntilGone(waitingTime), @@ -72,7 +90,8 @@ class CustomTabRobot { }.openMainMenu { } // Click again the Request desktop site toggle - mDevice.findObject(UiSelector().textContains("Request desktop site")) + mDevice + .findObject(UiSelector().textContains("Request desktop site")) .waitForExists(waitingTime) requestDesktopButton().click() mDevice.waitForIdle() @@ -81,7 +100,8 @@ class CustomTabRobot { class Transition { fun openMainMenu(interact: CustomTabRobot.() -> Unit): Transition { - mDevice.findObject(UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_menu")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_menu")) .waitForExists(waitingTime) menuButton().click() @@ -120,57 +140,81 @@ fun customTabScreen(interact: CustomTabRobot.() -> Unit): CustomTabRobot.Transit } private fun closeButton() = onView(withId(R.id.mozac_browser_toolbar_navigation_actions)) + private fun trackingProtectionIcon() = onView(withId(R.id.mozac_browser_toolbar_tracking_protection_indicator)) + private fun securityIndicator() = onView(withId(R.id.mozac_browser_toolbar_site_info_indicator)) + private fun menuButton() = onView(withId(R.id.mozac_browser_toolbar_menu)) + private fun actionButton() = onView(withContentDescription("Share link")) + private fun forwardButton() = onView(withContentDescription("Forward")) + private fun refreshButton() = onView(withContentDescription("Refresh")) + private fun stopButton() = onView(withContentDescription("Stop")) + private fun shareButton() = mDevice.findObject(UiSelector().textContains("Share")) + private fun requestDesktopButton() = onView(withSubstring("Request desktop site")) + private fun findInPage() = onView(withText("Find in Page")) + private fun openInBrowserButton() = onView(withText("Open in Browser")) -private fun assertCloseButton() = - closeButton().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) +private fun assertCloseButton() = closeButton().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + private fun assertTrackingProtectionIcon() = trackingProtectionIcon().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + private fun assertSecurityIndicator() = securityIndicator().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertMenuButton() = - menuButton().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + +private fun assertMenuButton() = menuButton().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + private fun assertActionButton() = actionButton().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + private fun assertCustomTabTitle(title: String) { - mDevice.findObject(UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_title_view")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_title_view")) .waitForExists(waitingTime) assertTrue(mDevice.findObject(UiSelector().textContains(title)).waitForExists(waitingTime)) } + private fun assertCustomTabUrl(url: String) { - mDevice.findObject(UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_url_view")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_url_view")) .waitForExists(waitingTime) assertTrue(mDevice.findObject(UiSelector().textContains(url)).waitForExists(waitingTime)) } + private fun assertForwardButton() = forwardButton().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + private fun assertRefreshButton() = refreshButton().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertStopButton() = - stopButton().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertShareButton() = - assertTrue(shareButton().waitForExists(waitingTime)) + +private fun assertStopButton() = stopButton().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + +private fun assertShareButton() = assertTrue(shareButton().waitForExists(waitingTime)) + private fun assertRequestDesktopButton() = requestDesktopButton().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + private fun assertFindInPageButton() = findInPage().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + private fun assertOpenInBrowserButton() = openInBrowserButton().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + private fun assertRequestDesktopSiteIsTurnedOff() { assertFalse( mDevice.findObject(UiSelector().textContains("Request desktop site")).isChecked, ) } + private fun assertRequestDesktopSiteIsTurnedOn() { assertTrue( mDevice.findObject(UiSelector().textContains("Request desktop site")).isChecked, diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/ExternalAppsRobot.kt b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/ExternalAppsRobot.kt index 030e2eba4..1e5c04ba4 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/ExternalAppsRobot.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/ExternalAppsRobot.kt @@ -23,14 +23,15 @@ import org.mozilla.reference.browser.helpers.TestHelper.packageName */ class ExternalAppsRobot { fun verifyAndroidDefaultApps() = assertDefaultAppsLayout() + fun verifyAndroidAutofillServices() = assertAutofillServices() + fun verifyFxAQrCode() = assertFXAQrCode() + fun verifyYouTubeApp() = assertYouTubeApp() class Transition { - fun externalApps(): ExternalAppsRobot.Transition { - return ExternalAppsRobot.Transition() - } + fun externalApps(): ExternalAppsRobot.Transition = ExternalAppsRobot.Transition() } } @@ -41,7 +42,8 @@ private fun assertDefaultAppsLayout() { private fun assertAutofillServices() { mDevice.waitForWindowUpdate(packageName, waitingTime) assertTrue( - mDevice.findObject(UiSelector().textContains("Autofill service")) + mDevice + .findObject(UiSelector().textContains("Autofill service")) .waitForExists(waitingTime), ) } @@ -51,18 +53,21 @@ private fun assertYouTubeApp() { // Check youtube's home buttons mDevice.waitForIdle() assertTrue( - mDevice.findObject(UiSelector().text("Home")) + mDevice + .findObject(UiSelector().text("Home")) .waitForExists(waitingTime), ) assertTrue( - mDevice.findObject(UiSelector().text("Subscriptions")) + mDevice + .findObject(UiSelector().text("Subscriptions")) .waitForExists(waitingTime), ) } catch (e: AssertionError) { println("The native youtube app opens but needs to be updated") // In case the app isn't up to date on the emulator an update message will be displayed assertTrue( - mDevice.findObject(UiSelector().text("Update for a faster, better YouTube")) + mDevice + .findObject(UiSelector().text("Update for a faster, better YouTube")) .waitForExists(waitingTime), ) } diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/FindInPagePanelRobot.kt b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/FindInPagePanelRobot.kt index f7cd9b997..ba44f4cae 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/FindInPagePanelRobot.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/FindInPagePanelRobot.kt @@ -22,11 +22,14 @@ import org.mozilla.reference.browser.helpers.click * Implementation of Robot Pattern for the FindInPage Panel. */ class FindInPagePanelRobot { - fun verifyFindInPageBar() = assertFindInPageBarExists() + fun verifyFindInPageBarIsDismissed() = assertFindInPageBarIsDismissed() + fun clickFindInPageNextButton() = findInPageNextButton().click() + fun clickFindInPagePreviousButton() = findInPagePreviousButton().click() + fun clickFindInPageCloseButton() = findInPageCloseButton().click() fun enterFindInPageQuery(expectedText: String) { @@ -35,21 +38,23 @@ class FindInPagePanelRobot { } fun verifyFindInPageResult(ratioCounter: String) { - mDevice.findObject(UiSelector().resourceId("$packageName:id/find_in_page_result_text")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/find_in_page_result_text")) .waitForExists(waitingTime) assertTrue(mDevice.findObject(UiSelector().textContains(ratioCounter)).waitForExists(waitingTime)) } class Transition { - fun findInPage(): FindInPagePanelRobot.Transition { - return FindInPagePanelRobot.Transition() - } + fun findInPage(): FindInPagePanelRobot.Transition = FindInPagePanelRobot.Transition() } } private fun findInPageBar() = onView(withId(R.id.findInPageBar)) + private fun findInPageNextButton() = onView(withId(R.id.find_in_page_next_btn)) + private fun findInPagePreviousButton() = onView(withId(R.id.find_in_page_prev_btn)) + private fun findInPageCloseButton() = onView(withId(R.id.find_in_page_close_btn)) private fun assertFindInPageBarExists() { diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/NavigationToolbarRobot.kt b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/NavigationToolbarRobot.kt index 54296b71d..413f02cbb 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/NavigationToolbarRobot.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/NavigationToolbarRobot.kt @@ -27,22 +27,27 @@ import org.mozilla.reference.browser.helpers.click * Implementation of Robot Pattern for the navigation toolbar menu. */ class NavigationToolbarRobot { - fun verifyNoTabAddressView() = assertNoTabAddressText() + fun verifyNewTabAddressView(url: String) = assertNewTabAddressText(url) + fun verifyReaderViewButton() = assertReaderViewButton() + fun checkNumberOfTabsTabCounter(numTabs: String) = numberOfOpenTabsTabCounter.check(matches(withText(numTabs))) class Transition { - val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) - fun enterUrlAndEnterToBrowser(url: Uri, interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { + fun enterUrlAndEnterToBrowser( + url: Uri, + interact: BrowserRobot.() -> Unit, + ): BrowserRobot.Transition { urlBar().click() awesomeBar().setText(url.toString()) mDevice.pressEnter() - mDevice.findObject( + mDevice + .findObject( UiSelector() .resourceId("$packageName:id/mozac_browser_toolbar_progress"), ).waitUntilGone(waitingTime) @@ -52,11 +57,11 @@ class NavigationToolbarRobot { } fun openThreeDotMenu(interact: ThreeDotMenuRobot.() -> Unit): ThreeDotMenuRobot.Transition { - mDevice.findObject( + mDevice + .findObject( UiSelector() .resourceId("$packageName:id/mozac_browser_toolbar_menu"), - ) - .waitForExists(waitingTime) + ).waitForExists(waitingTime) threeDotMenuButton().click() ThreeDotMenuRobot().interact() @@ -72,7 +77,8 @@ class NavigationToolbarRobot { fun clickToolbar(interact: AwesomeBarRobot.() -> Unit): AwesomeBarRobot.Transition { urlBar().click() mDevice.waitForIdle() - mDevice.findObject(UiSelector().textContains("Search or enter address")) + mDevice + .findObject(UiSelector().textContains("Search or enter address")) .waitForExists(waitingTime) AwesomeBarRobot().interact() return AwesomeBarRobot.Transition() @@ -93,12 +99,16 @@ fun navigationToolbar(interact: NavigationToolbarRobot.() -> Unit): NavigationTo } private fun openTabTray() = onView(withId(R.id.counter_box)) + private var numberOfOpenTabsTabCounter = onView(withId(R.id.counter_text)) -private fun urlBar() = - mDevice.findObject(UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_url_view")) + +private fun urlBar() = mDevice.findObject(UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_url_view")) + private fun awesomeBar() = mDevice.findObject(UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_edit_url_view")) + private fun threeDotMenuButton() = onView(withId(R.id.mozac_browser_toolbar_menu)) + private fun readerViewButton() = onView(withId(R.id.mozac_browser_toolbar_page_actions)) private fun assertNoTabAddressText() { @@ -111,7 +121,8 @@ private fun assertNewTabAddressText(url: String) { private fun assertReaderViewButton() { mDevice.waitForWindowUpdate(packageName, waitingTime) - mDevice.findObject( + mDevice + .findObject( UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_page_actions"), ).waitForExists(waitingTime) diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/NotificationRobot.kt b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/NotificationRobot.kt index 3f027d83c..73b1c9dc0 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/NotificationRobot.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/NotificationRobot.kt @@ -11,7 +11,6 @@ import org.junit.Assert.assertTrue import org.mozilla.reference.browser.helpers.TestAssetHelper.waitingTime class NotificationRobot { - fun verifySystemMediaNotificationExists(notificationMessage: String) { assertTrue(systemMediaNotification.waitForExists(waitingTime)) assertTrue(systemMediaNotificationTitle(notificationMessage).waitForExists(waitingTime)) @@ -26,7 +25,10 @@ class NotificationRobot { assertTrue(systemMediaNotificationControlButton(action).waitForExists(waitingTime)) } - fun verifyDownloadNotificationExist(notificationMessage: String, fileName: String) { + fun verifyDownloadNotificationExist( + notificationMessage: String, + fileName: String, + ) { val notification = UiSelector().text(notificationMessage) var notificationFound = mDevice.findObject(notification).waitForExists(waitingTime) val downloadFilename = mDevice.findObject(UiSelector().text(fileName)) @@ -39,7 +41,10 @@ class NotificationRobot { assertTrue(downloadFilename.exists()) } - fun verifyDownloadNotificationDoesNotExist(notificationMessage: String, fileName: String) { + fun verifyDownloadNotificationDoesNotExist( + notificationMessage: String, + fileName: String, + ) { val notification = UiSelector().text(notificationMessage) val notificationFound = mDevice.findObject(notification).waitForExists(waitingTime) val downloadFilename = mDevice.findObject(UiSelector().text(fileName)) @@ -51,7 +56,6 @@ class NotificationRobot { } class Transition { - fun closeNotification(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { mDevice.pressBack() diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/ReaderViewRobot.kt b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/ReaderViewRobot.kt index 5a757225a..e2b468ac4 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/ReaderViewRobot.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/ReaderViewRobot.kt @@ -27,28 +27,43 @@ import org.mozilla.reference.browser.ui.robots.mDevice * Implementation of Robot Pattern for Reader View UI. */ class ReaderViewRobot { - fun verifyAppearanceButtonExists() = assertAppearanceButtonExists() + fun verifyAppearanceButtonDoesntExists() = assertAppearanceButtonDoesntExists() + fun verifyAppearanceMenuExists() = assertAppearanceMenu() + fun verifyFontGroupButtons() = assertFontGroupButtons() + fun verifyIncreaseFontSizeButton() = assertIncreaseFontSizeButton() + fun verifyDecreaseFontSizeButton() = assertDecreaseFontSizeButton() + fun verifyColorSchemeGroupButtons() = assertColorSchemeGroupButtons() + fun clickAppearanceButton() = appearanceButton().click() + fun clickSansSerifButton() = sansSerifButton().click() + fun clickSerifButton() = serifButton().click() + fun clickIncreaseFontSizeButton() = increaseFontSizeButton().click() + fun clickDecreaseFontSizeButton() = decreaseFontSizeButton().click() + fun clickLightColorButton() = lightColorButton().click() + fun clickSepiaColorButton() = sepiaColorButton().click() + fun clickDarkColorButton() = darkColorButton().click() fun verifyActiveAppearanceFont(fontType: String) { val fontTypeKey: String = "mozac-readerview-fonttype" - val prefs = InstrumentationRegistry.getInstrumentation() - .targetContext.getSharedPreferences( + val prefs = InstrumentationRegistry + .getInstrumentation() + .targetContext + .getSharedPreferences( "mozac_feature_reader_view", Context.MODE_PRIVATE, ) @@ -59,8 +74,10 @@ class ReaderViewRobot { fun verifyAppearanceFontSize(expectedFontSize: Int) { val fontSizeKey: String = "mozac-readerview-fontsize" - val prefs = InstrumentationRegistry.getInstrumentation() - .targetContext.getSharedPreferences( + val prefs = InstrumentationRegistry + .getInstrumentation() + .targetContext + .getSharedPreferences( "mozac_feature_reader_view", Context.MODE_PRIVATE, ) @@ -73,8 +90,10 @@ class ReaderViewRobot { fun verifyAppearanceColorScheme(expectedColorScheme: String) { val colorSchemeKey: String = "mozac-readerview-colorscheme" - val prefs = InstrumentationRegistry.getInstrumentation() - .targetContext.getSharedPreferences( + val prefs = InstrumentationRegistry + .getInstrumentation() + .targetContext + .getSharedPreferences( "mozac_feature_reader_view", Context.MODE_PRIVATE, ) @@ -181,13 +200,15 @@ private fun darkColorButton() = ) private fun assertAppearanceButtonExists() { - mDevice.findObject(UiSelector().resourceId("$packageName:id/readerViewAppearanceButton")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/readerViewAppearanceButton")) .waitForExists(waitingTime) appearanceButton().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) } private fun assertAppearanceButtonDoesntExists() { - mDevice.findObject(UiSelector().resourceId("$packageName:id/readerViewAppearanceButton")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/readerViewAppearanceButton")) .waitUntilGone(waitingTime) appearanceButton().check((matches(withEffectiveVisibility(ViewMatchers.Visibility.GONE)))) } @@ -199,28 +220,32 @@ private fun assertAppearanceMenu() { } private fun assertFontGroupButtons() { - mDevice.findObject( + mDevice + .findObject( UiSelector().resourceId("$packageName:id/:id/mozac_feature_readerview_font_group"), ).waitForExists(waitingTime) fontGroupButtons().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) } private fun assertIncreaseFontSizeButton() { - mDevice.findObject( + mDevice + .findObject( UiSelector().resourceId("$packageName:id/mozac_feature_readerview_font_size_increase"), ).waitForExists(waitingTime) increaseFontSizeButton().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) } private fun assertDecreaseFontSizeButton() { - mDevice.findObject( + mDevice + .findObject( UiSelector().resourceId("$packageName:id/mozac_feature_readerview_font_size_decrease"), ).waitForExists(waitingTime) decreaseFontSizeButton().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) } private fun assertColorSchemeGroupButtons() { - mDevice.findObject( + mDevice + .findObject( UiSelector().resourceId("$packageName:id/mozac_feature_readerview_color_scheme_group"), ).waitForExists(waitingTime) colorSchemeGroupButtons().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/SettingsViewPrivacyRobot.kt b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/SettingsViewPrivacyRobot.kt index d47945f8f..567a4e311 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/SettingsViewPrivacyRobot.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/SettingsViewPrivacyRobot.kt @@ -15,46 +15,70 @@ import org.mozilla.reference.browser.helpers.TestAssetHelper * Implementation of Robot Pattern for the settings privacy menu. */ class SettingsViewPrivacyRobot { - fun verifyPrivacyUpButton() = assertPrivacyUpButton() + fun verifyPrivacySettings() = assertPrivacySettingsView() + fun verifyTrackingProtectionHeading() = assertTrackingProtectionHeading() + fun verifyTPEnableInNormalBrowsing() = assertTpEnableInNormalBrowsing() + fun verifyTPEnableinPrivateBrowsing() = assertTpEnableInPrivateBrowsing() + fun verifyDataChoicesHeading() = assertDataChoicesHeading() // verifyUseTelemetryToggle does not yet check that the client telemetry is disabled/enabled fun verifyUseTelemetryToggle() = assertUseTelemetryToggle() + fun verifyTelemetrySummary() = assertTelemetrySummary() class Transition { - fun settingsViewPrivacy(): SettingsViewPrivacyRobot.Transition { - return SettingsViewPrivacyRobot.Transition() - } + fun settingsViewPrivacy(): SettingsViewPrivacyRobot.Transition = SettingsViewPrivacyRobot.Transition() } } private fun privacySettingsView() = Espresso.onView(ViewMatchers.withText("Privacy Settings")) + private fun trackingProtectionHeading() = Espresso.onView(ViewMatchers.withText("Tracking Protection")) + private fun tpEnableInNormalBrowsing() = Espresso.onView(ViewMatchers.withText("Enable in Normal Browsing Mode")) + private fun tpEnableInPrivateBrowsing() = Espresso.onView(ViewMatchers.withText("Enable in Private Browsing Mode")) + private fun dataChoicesHeading() = Espresso.onView(ViewMatchers.withText("Data Choices")) + private fun useTelemetryToggle() = Espresso.onView(ViewMatchers.withText("Use Telemetry")) + private fun telemetrySummary() = Espresso.onView(ViewMatchers.withText("Send usage data")) + private fun assertPrivacyUpButton() { mDevice.wait(Until.findObject(By.text("Navigate up")), TestAssetHelper.waitingTimeShort) } -private fun assertPrivacySettingsView() = privacySettingsView() + +private fun assertPrivacySettingsView() = + privacySettingsView() .check(ViewAssertions.matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertTrackingProtectionHeading() = trackingProtectionHeading() + +private fun assertTrackingProtectionHeading() = + trackingProtectionHeading() .check(ViewAssertions.matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertTpEnableInNormalBrowsing() = tpEnableInNormalBrowsing() + +private fun assertTpEnableInNormalBrowsing() = + tpEnableInNormalBrowsing() .check(ViewAssertions.matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertTpEnableInPrivateBrowsing() = tpEnableInPrivateBrowsing() + +private fun assertTpEnableInPrivateBrowsing() = + tpEnableInPrivateBrowsing() .check(ViewAssertions.matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertDataChoicesHeading() = dataChoicesHeading() + +private fun assertDataChoicesHeading() = + dataChoicesHeading() .check(ViewAssertions.matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertUseTelemetryToggle() = useTelemetryToggle() + +private fun assertUseTelemetryToggle() = + useTelemetryToggle() .check(ViewAssertions.matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertTelemetrySummary() = telemetrySummary() + +private fun assertTelemetrySummary() = + telemetrySummary() .check(ViewAssertions.matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/SettingsViewRobot.kt b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/SettingsViewRobot.kt index 88d9271bf..017454c7f 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/SettingsViewRobot.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/SettingsViewRobot.kt @@ -36,38 +36,58 @@ class SettingsViewRobot { fun verifySettingsViewExists() = assertSettingsView() fun verifyNavigateUp() = assertNavigateUpButton() + fun verifySyncSigninButton() = assertSyncSigninButton() + fun verifySyncHistorySummary() = assertSyncHistorySummary() + fun verifySyncQrCodeButton() = assertSyncQrCodeButton() + fun verifySyncQrSummary() = assertSyncQrSummary() + fun verifyPrivacyButton() = assertPrivacyButton() + fun verifyPrivacySummary() = assertPrivacySummary() + fun verifyOpenLinksInApps() = assertOpenLinksInApps() + fun verifyMakeDefaultBrowserButton() = assertMakeDefaultBrowserButton() + fun verifyAutofillAppsButton() = assertAutofillAppsButton() + fun varifyAutofillAppsSummary() = assertAutofillAppsSummary() + fun verifyJetpackComposeButton() = assertJetpackComposeButton() + fun verifyDeveloperToolsHeading() = assertDeveloperToolsHeading() + fun verifyRemoteDebugging() = assertRemoteDebugging() + fun verifyCustomAddonCollectionButton() = assertCustomAddonCollectionButton() + fun verifyMozillaHeading() = assertMozillaHeading() + fun verifyAboutReferenceBrowserButton() = assertAboutReferenceBrowserButton() + fun verifySettingsRecyclerViewToExist() = waitForSettingsRecyclerViewToExist() fun clickCustomAddonCollectionButton() = customAddonCollectionButton().click() + fun verifyCustomAddonCollectionPanelExist() = assertCustomAddonCollectionPanel() fun clickOpenLinksInApps() = openLinksInAppsToggle().click() // toggleRemoteDebugging does not yet verify that the debug service is started // server runs on port 6000 - fun toggleRemoteDebuggingOn() = { + fun toggleRemoteDebuggingOn() = + { Espresso.onView(withText("OFF")).check(matches(isDisplayed())) remoteDebuggingToggle().click() Espresso.onView(withText("ON")).check(matches(isDisplayed())) } - fun toggleRemoteDebuggingOff() = { + fun toggleRemoteDebuggingOff() = + { Espresso.onView(withText("ON")).check(matches(isDisplayed())) remoteDebuggingToggle().click() Espresso.onView(withText("OFF")).check(matches(isDisplayed())) @@ -123,7 +143,8 @@ class SettingsViewRobot { } private fun waitForSettingsRecyclerViewToExist() { - mDevice.findObject(UiSelector().resourceId("$packageName:id/recycler_view")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/recycler_view")) .waitForExists( waitingTime, ) @@ -132,7 +153,8 @@ private fun waitForSettingsRecyclerViewToExist() { private fun assertSettingsView() { // verify that we are in the correct settings view assertTrue( - mDevice.findObject( + mDevice + .findObject( UiSelector() .resourceId("$packageName:id/action_bar") .childSelector( @@ -146,69 +168,118 @@ private fun assertSettingsView() { } private fun syncSignInButton() = itemWithText(getStringResource(R.string.sign_in)) + private fun syncHistorySummary() = Espresso.onView(withText(R.string.preferences_sign_in_summary)) + private fun syncQrCodeButton() = Espresso.onView(withText(R.string.pair_sign_in)) + private fun syncQrSummary() = Espresso.onView(withText(R.string.preferences_pair_sign_in_summary)) + private fun privacyButton() = Espresso.onView(withText(R.string.privacy)) + private fun privacySummary() = Espresso.onView(withText(R.string.preferences_privacy_summary)) -private fun openLinksInAppsToggle() = Espresso.onView( + +private fun openLinksInAppsToggle() = + Espresso.onView( allOf( withId(R.id.switchWidget), hasCousin(withText(R.string.open_links_in_apps)), ), ) + private fun makeDefaultBrowserButton() = Espresso.onView(withText(R.string.preferences_make_default_browser)) + private fun autofillAppsButton() = onView(withText("Autofill apps")) + private fun jetpackComposeButton() = onView(withText("Use experimental Jetpack Compose UI")) + private fun autofillAppsSummary() = onView(withText("Autofill logins and passwords in other apps")) + private fun developerToolsHeading() = Espresso.onView(withText(R.string.developer_tools_category)) -private fun remoteDebuggingToggle() = Espresso.onView( + +private fun remoteDebuggingToggle() = + Espresso.onView( allOf( withId(R.id.switchWidget), hasCousin(withText(R.string.preferences_remote_debugging)), ), ) + private fun customAddonCollectionButton() = onView(withText("Custom Add-on collection")) + private fun mozillaHeading() = Espresso.onView(withText(R.string.mozilla_category)) + private fun aboutReferenceBrowserButton() = Espresso.onView(withText(R.string.preferences_about_page)) private fun assertNavigateUpButton() { mDevice.wait(Until.findObject(By.text("Navigate up")), TestAssetHelper.waitingTimeShort) } + private fun assertSyncSigninButton() = assertUIObjectExists(syncSignInButton()) -private fun assertSyncHistorySummary() = syncHistorySummary() + +private fun assertSyncHistorySummary() = + syncHistorySummary() .check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertSyncQrCodeButton() = syncQrCodeButton() + +private fun assertSyncQrCodeButton() = + syncQrCodeButton() .check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertSyncQrSummary() = syncQrSummary() + +private fun assertSyncQrSummary() = + syncQrSummary() .check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertPrivacyButton() = privacyButton() + +private fun assertPrivacyButton() = + privacyButton() .check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertPrivacySummary() = privacySummary() + +private fun assertPrivacySummary() = + privacySummary() .check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertOpenLinksInApps() = openLinksInAppsToggle() + +private fun assertOpenLinksInApps() = + openLinksInAppsToggle() .check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertMakeDefaultBrowserButton() = makeDefaultBrowserButton() + +private fun assertMakeDefaultBrowserButton() = + makeDefaultBrowserButton() .check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertAutofillAppsButton() = autofillAppsButton() + +private fun assertAutofillAppsButton() = + autofillAppsButton() .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertAutofillAppsSummary() = autofillAppsSummary() + +private fun assertAutofillAppsSummary() = + autofillAppsSummary() .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertJetpackComposeButton() = jetpackComposeButton() + +private fun assertJetpackComposeButton() = + jetpackComposeButton() .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertDeveloperToolsHeading() = developerToolsHeading() + +private fun assertDeveloperToolsHeading() = + developerToolsHeading() .check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertRemoteDebugging() = remoteDebuggingToggle() + +private fun assertRemoteDebugging() = + remoteDebuggingToggle() .check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertCustomAddonCollectionButton() = customAddonCollectionButton() + +private fun assertCustomAddonCollectionButton() = + customAddonCollectionButton() .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + private fun assertMozillaHeading() = mozillaHeading().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertAboutReferenceBrowserButton() = aboutReferenceBrowserButton() + +private fun assertAboutReferenceBrowserButton() = + aboutReferenceBrowserButton() .check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + private fun assertCustomAddonCollectionPanel() { mDevice.waitForIdle() - mDevice.findObject(UiSelector().resourceId("$packageName:id/parentPanel")) + mDevice + .findObject(UiSelector().resourceId("$packageName:id/parentPanel")) .waitForExists(waitingTime) onView( allOf( diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/SyncedTabsRobot.kt b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/SyncedTabsRobot.kt index b174f1ba4..fab1db71e 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/SyncedTabsRobot.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/SyncedTabsRobot.kt @@ -15,7 +15,6 @@ import org.mozilla.reference.browser.helpers.TestHelper.packageName * Implementation of Robot Pattern for Synced Tabs sub menu. */ class SyncedTabsRobot { - fun verifyNotSignedInSyncTabsView() = assertNotSignedInSyncTabsView() class Transition { @@ -27,12 +26,12 @@ class SyncedTabsRobot { private fun assertNotSignedInSyncTabsView() { assertTrue( - mDevice.findObject( + mDevice + .findObject( UiSelector() .resourceId("$packageName:id/synced_tabs_status") .textContains(getStringResource(R.string.synced_tabs_connect_to_sync_account)), - ) - .waitForExists(waitingTime), + ).waitForExists(waitingTime), ) } } diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/TabTrayMenuRobot.kt b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/TabTrayMenuRobot.kt index 7177df167..079adc85b 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/TabTrayMenuRobot.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/TabTrayMenuRobot.kt @@ -38,16 +38,23 @@ class TabTrayMenuRobot { val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) fun verifyRegularBrowsingTab() = assertRegularBrowsingTabs() + fun verifyPrivateBrowsingTab() = assertPrivateBrowsingTabs() + fun verifyGoBackButton() = assertGoBackButton() + fun verifyNewTabButton() = assertNewTabButton() - fun verifyRegularBrowsingTab(isSelected: Boolean) = - regularTabs().assertIsSelected(isSelected) - fun verifyPrivateBrowsingTab(isSelected: Boolean) = - privateTabs().assertIsSelected(isSelected) + + fun verifyRegularBrowsingTab(isSelected: Boolean) = regularTabs().assertIsSelected(isSelected) + + fun verifyPrivateBrowsingTab(isSelected: Boolean) = privateTabs().assertIsSelected(isSelected) + fun verifyThereAreNotPrivateTabsOpen() = assertThereAreNoPrivateTabsOpen() + fun verifyThereIsOnePrivateTabOpen() = assertPrivateTabs() + fun verifyThereIsOneTabOpen() = tab().check(matches(isDisplayed())) + fun verifyExistingOpenTabs(title: String) = assertExistingOpenTabs(title) fun goBackFromTabTrayTest() = goBackButton().click() @@ -63,7 +70,6 @@ class TabTrayMenuRobot { } class Transition { - fun openNewTab(interact: NavigationToolbarRobot.() -> Unit): NavigationToolbarRobot.Transition { newTabButton().click() NavigationToolbarRobot().interact() @@ -94,7 +100,10 @@ class TabTrayMenuRobot { return NavigationToolbarRobot.Transition() } - fun clickOpenTab(title: String, interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { + fun clickOpenTab( + title: String, + interact: BrowserRobot.() -> Unit, + ): BrowserRobot.Transition { openTab(title).clickAndWaitForNewWindow() BrowserRobot().interact() @@ -104,23 +113,37 @@ class TabTrayMenuRobot { } private fun regularTabs() = onView(ViewMatchers.withContentDescription("Tabs")) + private fun privateTabs() = onView(ViewMatchers.withContentDescription("Private tabs")) + private fun goBackButton() = onView(ViewMatchers.withContentDescription("back")) + private fun newTabButton() = onView(ViewMatchers.withContentDescription("Add New Tab")) + private fun closeTabButtonTabTray() = onView(withId(R.id.mozac_browser_tabstray_close)) + private fun tab() = onView(TabMatcher.withText("about:blank")) -private fun assertRegularBrowsingTabs() = regularTabs() +private fun assertRegularBrowsingTabs() = + regularTabs() .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertPrivateBrowsingTabs() = privateTabs() + +private fun assertPrivateBrowsingTabs() = + privateTabs() .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertGoBackButton() = goBackButton() + +private fun assertGoBackButton() = + goBackButton() .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertNewTabButton() = newTabButton() + +private fun assertNewTabButton() = + newTabButton() .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + private fun assertPrivateTabs() { mDevice.wait(Until.findObject(By.text("Private Browsing")), waitingTime) } + private fun assertThereAreNoPrivateTabsOpen() { val obj = mDevice.wait(Until.findObject(By.text("Private Browsing")), waitingTimeShort) try { @@ -132,7 +155,8 @@ private fun assertThereAreNoPrivateTabsOpen() { private fun assertExistingOpenTabs(title: String) { mDevice.waitForIdle() - mDevice.findObject(UiSelector().resourceId("${TestHelper.packageName}:id/tabsTray")) + mDevice + .findObject(UiSelector().resourceId("${TestHelper.packageName}:id/tabsTray")) .waitForExists(waitingTime) Assert.assertTrue( mDevice.findObject(UiSelector().textContains(title)).waitForExists(waitingTime), diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/TabTrayMoreOptionsMenuRobot.kt b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/TabTrayMoreOptionsMenuRobot.kt index 81944da85..6786ed74a 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/TabTrayMoreOptionsMenuRobot.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/TabTrayMoreOptionsMenuRobot.kt @@ -20,8 +20,8 @@ import org.mozilla.reference.browser.helpers.click */ class TabTrayMoreOptionsMenuRobot { - fun verifyCloseAllTabsButton() = assertCloseAllTabsButton() + fun verifyCloseAllPrivateTabsButton() = assertCloseAllPrivateTabsButton() class Transition { @@ -44,10 +44,14 @@ class TabTrayMoreOptionsMenuRobot { } private fun closeAllTabsButton() = onView(ViewMatchers.withText("Close All Tabs")) + private fun closeAllPrivateTabsButton() = onView(ViewMatchers.withText("Close Private Tabs")) + private fun assertCloseAllTabsButton() { val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) mDevice.waitAndInteract(Until.findObject(By.text("Close All Tabs"))) {} } -private fun assertCloseAllPrivateTabsButton() = closeAllPrivateTabsButton() + +private fun assertCloseAllPrivateTabsButton() = + closeAllPrivateTabsButton() .check(ViewAssertions.matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/ThreeDotMenuRobot.kt b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/ThreeDotMenuRobot.kt index 1a50e73a2..9d8ee26a0 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/ThreeDotMenuRobot.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/ui/robots/ThreeDotMenuRobot.kt @@ -23,37 +23,53 @@ import org.mozilla.reference.browser.helpers.click * Implementation of Robot Pattern for three dot menu. */ class ThreeDotMenuRobot { - fun verifyThreeDotMenuExists() = threeDotMenuRecyclerViewExists() fun verifyForwardButtonExists() = assertForwardButton() + fun verifyReloadButtonExists() = assertRefreshButton() + fun verifyStopButtonExists() = assertStopButton() + fun verifyShareButtonExists() = assertShareButton() + fun verifyRequestDesktopSiteToggleExists() = assertRequestDesktopSiteToggle() + fun verifyAddToHomescreenButtonExists() = assertAddToHomescreenButton() + fun verifyFindInPageButtonExists() = assertFindInPageButton() + fun verifyAddOnsButtonExists() = assertAddOnsButton() + fun verifySyncedTabsButtonExists() = assertSyncedTabsButton() + fun verifyReportIssueExists() = assertReportIssueButton() + fun verifyOpenSettingsExists() = assertSettingsButton() fun verifyShareButtonDoesntExist() = assertShareButtonDoesntExist() + fun verifyRequestDesktopSiteToggleDoesntExist() = assertRequestDesktopSiteToggleDoesntExist() + fun verifyFindInPageButtonDoesntExist() = assertFindInPageButtonDoesntExist() + fun verifyForwardButtonDoesntExist() = assertForwardButtonDoesntExist() + fun verifyReloadButtonDoesntExist() = assertRefreshButtonDoesntExist() + fun verifyStopButtonDoesntExist() = assertStopButtonDoesntExist() + fun verifyAddToHomescreenButtonDoesntExist() = assertAddToHomescreenButtonDoesntExist() fun verifyRequestDesktopSiteIsTurnedOff() = assertRequestDesktopSiteIsTurnedOff() + fun verifyRequestDesktopSiteIsTurnedOn() = assertRequestDesktopSiteIsTurnedOn() class Transition { - fun goForward(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { forwardButton().click() - mDevice.findObject( + mDevice + .findObject( UiSelector() .resourceId("$packageName:id/mozac_browser_toolbar_progress"), ).waitUntilGone(waitingTime) @@ -86,12 +102,14 @@ class ThreeDotMenuRobot { interact: NavigationToolbarRobot.() -> Unit, ): NavigationToolbarRobot.Transition { try { - mDevice.findObject(UiSelector().textContains("Request desktop site")) + mDevice + .findObject(UiSelector().textContains("Request desktop site")) .waitForExists(waitingTime) requestDesktopSiteToggle().click() mDevice.waitForIdle() assertTrue( - mDevice.findObject( + mDevice + .findObject( UiSelector() .resourceId("$packageName:id/mozac_browser_menu_recyclerView"), ).waitUntilGone(waitingTime), @@ -101,13 +119,15 @@ class ThreeDotMenuRobot { // If the click didn't succeed the main menu remains displayed and should be dismissed mDevice.pressBack() threeDotMenuButton().click() - mDevice.findObject(UiSelector().textContains("Request desktop site")) + mDevice + .findObject(UiSelector().textContains("Request desktop site")) .waitForExists(waitingTime) // Click again the Request desktop site toggle requestDesktopSiteToggle().click() mDevice.waitForIdle() assertTrue( - mDevice.findObject( + mDevice + .findObject( UiSelector() .resourceId("$packageName:id/mozac_browser_menu_recyclerView"), ).waitUntilGone(waitingTime), @@ -173,55 +193,96 @@ private fun threeDotMenuRecyclerViewExists() { } private fun threeDotMenuButton() = onView(withId(R.id.mozac_browser_toolbar_menu)) + private fun forwardButton() = onView(ViewMatchers.withContentDescription("Forward")) + private fun refreshButton() = onView(ViewMatchers.withContentDescription("Refresh")) + private fun stopButton() = onView(ViewMatchers.withContentDescription("Stop")) + private fun shareButton() = onView(ViewMatchers.withText("Share")) + private fun requestDesktopSiteToggle() = onView(ViewMatchers.withText("Request desktop site")) + private fun findInPageButton() = onView(ViewMatchers.withText("Find in Page")) + private fun reportIssueButton() = onView(ViewMatchers.withText("Report issue")) + private fun settingsButton() = onView(ViewMatchers.withText("Settings")) + private fun addToHomescreenButton() = onView(ViewMatchers.withText("Add to homescreen")) + private fun addOnsButton() = onView(ViewMatchers.withText("Add-ons")) + private fun syncedTabsButton() = onView(ViewMatchers.withText("Synced Tabs")) private fun assertShareButtonDoesntExist() = shareButton().check(ViewAssertions.doesNotExist()) + private fun assertRequestDesktopSiteToggleDoesntExist() = requestDesktopSiteToggle().check(ViewAssertions.doesNotExist()) + private fun assertFindInPageButtonDoesntExist() = findInPageButton().check(ViewAssertions.doesNotExist()) + private fun assertForwardButtonDoesntExist() = forwardButton().check(ViewAssertions.doesNotExist()) + private fun assertRefreshButtonDoesntExist() = refreshButton().check(ViewAssertions.doesNotExist()) + private fun assertStopButtonDoesntExist() = stopButton().check(ViewAssertions.doesNotExist()) -private fun assertAddToHomescreenButtonDoesntExist() = addToHomescreenButton() + +private fun assertAddToHomescreenButtonDoesntExist() = + addToHomescreenButton() .check(ViewAssertions.doesNotExist()) -private fun assertForwardButton() = forwardButton() +private fun assertForwardButton() = + forwardButton() .check(ViewAssertions.matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertRefreshButton() = refreshButton() + +private fun assertRefreshButton() = + refreshButton() .check(ViewAssertions.matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertStopButton() = stopButton() + +private fun assertStopButton() = + stopButton() .check(ViewAssertions.matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertShareButton() = shareButton() + +private fun assertShareButton() = + shareButton() .check(ViewAssertions.matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertRequestDesktopSiteToggle() = requestDesktopSiteToggle() + +private fun assertRequestDesktopSiteToggle() = + requestDesktopSiteToggle() .check(ViewAssertions.matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertAddToHomescreenButton() = addToHomescreenButton() + +private fun assertAddToHomescreenButton() = + addToHomescreenButton() .check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertFindInPageButton() = findInPageButton() + +private fun assertFindInPageButton() = + findInPageButton() .check(ViewAssertions.matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertAddOnsButton() = addOnsButton() + +private fun assertAddOnsButton() = + addOnsButton() .check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertSyncedTabsButton() = syncedTabsButton() + +private fun assertSyncedTabsButton() = + syncedTabsButton() .check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertReportIssueButton() = reportIssueButton() + +private fun assertReportIssueButton() = + reportIssueButton() .check(ViewAssertions.matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertSettingsButton() = settingsButton() + +private fun assertSettingsButton() = + settingsButton() .check(ViewAssertions.matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + private fun assertRequestDesktopSiteIsTurnedOff() { assertFalse( mDevice.findObject(UiSelector().textContains("Request desktop site")).isChecked, ) } + private fun assertRequestDesktopSiteIsTurnedOn() { assertTrue( mDevice.findObject(UiSelector().textContains("Request desktop site")).isChecked, diff --git a/app/src/main/java/org/mozilla/reference/browser/AppRequestInterceptor.kt b/app/src/main/java/org/mozilla/reference/browser/AppRequestInterceptor.kt index 4dd78265d..ecb195882 100644 --- a/app/src/main/java/org/mozilla/reference/browser/AppRequestInterceptor.kt +++ b/app/src/main/java/org/mozilla/reference/browser/AppRequestInterceptor.kt @@ -21,7 +21,9 @@ import org.mozilla.reference.browser.tabs.PrivatePage * component; this creates a circular dependency, since firefoxAccountsFeature relies on tabsUseCases * which in turn needs 'core' itself. */ -class AppRequestInterceptor(private val context: Context) : RequestInterceptor { +class AppRequestInterceptor( + private val context: Context, +) : RequestInterceptor { override fun onLoadRequest( engineSession: EngineSession, uri: String, @@ -31,8 +33,8 @@ class AppRequestInterceptor(private val context: Context) : RequestInterceptor { isRedirect: Boolean, isDirectNavigation: Boolean, isSubframeRequest: Boolean, - ): RequestInterceptor.InterceptionResponse? { - return when (uri) { + ): RequestInterceptor.InterceptionResponse? = + when (uri) { "about:privatebrowsing" -> { val page = PrivatePage.createPrivateBrowsingPage(context, uri) RequestInterceptor.InterceptionResponse.Content(page, encoding = "base64") @@ -68,7 +70,6 @@ class AppRequestInterceptor(private val context: Context) : RequestInterceptor { ) } } - } override fun onErrorRequest( session: EngineSession, diff --git a/app/src/main/java/org/mozilla/reference/browser/BrowserActivity.kt b/app/src/main/java/org/mozilla/reference/browser/BrowserActivity.kt index b790eacf7..18ab57a9a 100644 --- a/app/src/main/java/org/mozilla/reference/browser/BrowserActivity.kt +++ b/app/src/main/java/org/mozilla/reference/browser/BrowserActivity.kt @@ -32,7 +32,6 @@ import org.mozilla.reference.browser.ext.isCrashReportActive * Activity that holds the [BrowserFragment]. */ open class BrowserActivity : AppCompatActivity() { - private lateinit var crashIntegration: CrashIntegration private val sessionId: String? @@ -45,8 +44,7 @@ open class BrowserActivity : AppCompatActivity() { /** * Returns a new instance of [BrowserFragment] to display. */ - open fun createBrowserFragment(sessionId: String?): Fragment = - BrowserFragment.create(sessionId) + open fun createBrowserFragment(sessionId: String?): Fragment = BrowserFragment.create(sessionId) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -114,14 +112,23 @@ open class BrowserActivity : AppCompatActivity() { super.onUserLeaveHint() } - override fun onCreateView(parent: View?, name: String, context: Context, attrs: AttributeSet): View? = + override fun onCreateView( + parent: View?, + name: String, + context: Context, + attrs: AttributeSet, + ): View? = when (name) { - EngineView::class.java.name -> components.core.engine.createView(context, attrs).asView() + EngineView::class.java.name -> + components.core.engine + .createView(context, attrs) + .asView() else -> super.onCreateView(parent, name, context, attrs) } private fun onNonFatalCrash(crash: Crash) { - Snackbar.make(findViewById(android.R.id.content), R.string.crash_report_non_fatal_message, LENGTH_LONG) + Snackbar + .make(findViewById(android.R.id.content), R.string.crash_report_non_fatal_message, LENGTH_LONG) .setAction(R.string.crash_report_non_fatal_action) { crashIntegration.sendCrashReport(crash) }.show() diff --git a/app/src/main/java/org/mozilla/reference/browser/BrowserApplication.kt b/app/src/main/java/org/mozilla/reference/browser/BrowserApplication.kt index c77905886..7f4b38bbc 100644 --- a/app/src/main/java/org/mozilla/reference/browser/BrowserApplication.kt +++ b/app/src/main/java/org/mozilla/reference/browser/BrowserApplication.kt @@ -115,7 +115,8 @@ open class BrowserApplication : Application() { } @OptIn(DelicateCoroutinesApi::class) - private fun restoreBrowserState() = GlobalScope.launch(Dispatchers.Main) { + private fun restoreBrowserState() = + GlobalScope.launch(Dispatchers.Main) { val store = components.core.store val sessionStorage = components.core.sessionStorage @@ -123,7 +124,8 @@ open class BrowserApplication : Application() { // Now that we have restored our previous state (if there's one) let's setup auto saving the state while // the app is used. - sessionStorage.autoSave(store) + sessionStorage + .autoSave(store) .periodicallyInForeground(interval = 30, unit = TimeUnit.SECONDS) .whenGoingToBackground() .whenSessionsChange() @@ -145,6 +147,7 @@ private fun setupCrashReporting(application: BrowserApplication) { application .components .analytics - .crashReporter.install(application) + .crashReporter + .install(application) } } diff --git a/app/src/main/java/org/mozilla/reference/browser/BrowserTestActivity.kt b/app/src/main/java/org/mozilla/reference/browser/BrowserTestActivity.kt index 7b18e2007..d39598550 100644 --- a/app/src/main/java/org/mozilla/reference/browser/BrowserTestActivity.kt +++ b/app/src/main/java/org/mozilla/reference/browser/BrowserTestActivity.kt @@ -14,7 +14,6 @@ import org.mozilla.reference.browser.ext.components * https://wiki.mozilla.org/Performance_sheriffing/Raptor */ class BrowserTestActivity : Activity() { - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/org/mozilla/reference/browser/Components.kt b/app/src/main/java/org/mozilla/reference/browser/Components.kt index d914a9cbe..e75454ff4 100644 --- a/app/src/main/java/org/mozilla/reference/browser/Components.kt +++ b/app/src/main/java/org/mozilla/reference/browser/Components.kt @@ -25,7 +25,9 @@ import org.mozilla.reference.browser.components.Utilities /** * Provides access to all components. */ -class Components(private val context: Context) { +class Components( + private val context: Context, +) { val core by lazy { Core(context, analytics.crashReporter) } val useCases by lazy { UseCases( diff --git a/app/src/main/java/org/mozilla/reference/browser/EngineProvider.kt b/app/src/main/java/org/mozilla/reference/browser/EngineProvider.kt index 96c20729c..9eff93105 100644 --- a/app/src/main/java/org/mozilla/reference/browser/EngineProvider.kt +++ b/app/src/main/java/org/mozilla/reference/browser/EngineProvider.kt @@ -17,7 +17,6 @@ import org.mozilla.geckoview.GeckoRuntimeSettings import org.mozilla.reference.browser.ext.isCrashReportActive object EngineProvider { - private var runtime: GeckoRuntime? = null @Synchronized @@ -38,7 +37,10 @@ object EngineProvider { return runtime!! } - fun createEngine(context: Context, defaultSettings: DefaultSettings): Engine { + fun createEngine( + context: Context, + defaultSettings: DefaultSettings, + ): Engine { val runtime = getOrCreateRuntime(context) return GeckoEngine(context, defaultSettings, runtime).also { diff --git a/app/src/main/java/org/mozilla/reference/browser/IntentReceiverActivity.kt b/app/src/main/java/org/mozilla/reference/browser/IntentReceiverActivity.kt index a0e075144..4783c7fb0 100644 --- a/app/src/main/java/org/mozilla/reference/browser/IntentReceiverActivity.kt +++ b/app/src/main/java/org/mozilla/reference/browser/IntentReceiverActivity.kt @@ -12,7 +12,6 @@ import kotlinx.coroutines.launch import org.mozilla.reference.browser.ext.components class IntentReceiverActivity : Activity() { - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val intent = intent?.let { Intent(it) } ?: Intent() diff --git a/app/src/main/java/org/mozilla/reference/browser/NotificationManager.kt b/app/src/main/java/org/mozilla/reference/browser/NotificationManager.kt index 0e07d76e4..5724d9811 100644 --- a/app/src/main/java/org/mozilla/reference/browser/NotificationManager.kt +++ b/app/src/main/java/org/mozilla/reference/browser/NotificationManager.kt @@ -30,7 +30,6 @@ import android.app.NotificationManager as AndroidNotificationManager * Manages notification channels and allows displaying different supported types of notifications. */ object NotificationManager { - // Send Tab private const val RECEIVE_TABS_TAG = "org.mozilla.reference.browser.receivedTabs" private const val RECEIVE_TABS_CHANNEL_ID = "org.mozilla.reference.browser.ReceivedTabsChannel" @@ -57,7 +56,11 @@ object NotificationManager { * @param tabs A list of tabs to be displayed. */ @SuppressLint("MissingPermission", "NotifyUsage") - fun showReceivedTabs(context: Context, device: Device?, tabs: List) { + fun showReceivedTabs( + context: Context, + device: Device?, + tabs: List, + ) { // In the future, experiment with displaying multiple tabs from the same device as as Notification Groups. // For now, a single notification per tab received will suffice. logger.debug("Showing ${tabs.size} tab(s) received from deviceID=${device?.id}") @@ -94,7 +97,8 @@ object NotificationManager { importance, ) - val builder = NotificationCompat.Builder(context, channelId) + val builder = NotificationCompat + .Builder(context, channelId) .setSmallIcon(R.drawable.ic_notification) .setSendTabTitle(context, device, tab) .setWhen(System.currentTimeMillis()) @@ -127,7 +131,10 @@ object NotificationManager { * Launch a notification of the data policy, and record notification time and version. */ @SuppressLint("MissingPermission", "NotifyUsage") - private fun notifyDataPolicy(context: Context, preferences: SharedPreferences) { + private fun notifyDataPolicy( + context: Context, + preferences: SharedPreferences, + ) { val resources = context.resources val notificationTitle = resources.getString(R.string.datareporting_notification_title) @@ -147,7 +154,8 @@ object NotificationManager { val pendingIntent = PendingIntent.getActivity(context, REQUEST_CODE_DATA_REPORTING, intent, flags) - val notificationBuilder = NotificationCompat.Builder( + val notificationBuilder = NotificationCompat + .Builder( context, getNotificationChannelId(context), ).apply { @@ -159,7 +167,8 @@ object NotificationManager { setStyle(NotificationCompat.BigTextStyle().bigText(notificationSummary)) } - NotificationManagerCompat.from(context) + NotificationManagerCompat + .from(context) .notify(DATA_REPORTING_TAG, DATA_REPORTING_NOTIFICATION_ID, notificationBuilder.build()) preferences.edit { diff --git a/app/src/main/java/org/mozilla/reference/browser/addons/AddonSettingsActivity.kt b/app/src/main/java/org/mozilla/reference/browser/addons/AddonSettingsActivity.kt index 0476e1c7d..8c7838df4 100644 --- a/app/src/main/java/org/mozilla/reference/browser/addons/AddonSettingsActivity.kt +++ b/app/src/main/java/org/mozilla/reference/browser/addons/AddonSettingsActivity.kt @@ -25,7 +25,6 @@ import org.mozilla.reference.browser.ext.components * An activity to show the settings of an add-on. */ class AddonSettingsActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_add_on_settings) @@ -42,9 +41,17 @@ class AddonSettingsActivity : AppCompatActivity() { .commit() } - override fun onCreateView(parent: View?, name: String, context: Context, attrs: AttributeSet): View? = + override fun onCreateView( + parent: View?, + name: String, + context: Context, + attrs: AttributeSet, + ): View? = when (name) { - EngineView::class.java.name -> components.core.engine.createView(context, attrs).asView() + EngineView::class.java.name -> + components.core.engine + .createView(context, attrs) + .asView() else -> super.onCreateView(parent, name, context, attrs) } @@ -55,20 +62,31 @@ class AddonSettingsActivity : AppCompatActivity() { private lateinit var optionsPageUrl: String private lateinit var engineSession: EngineSession - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?, + ): View? { optionsPageUrl = requireNotNull( - arguments?.getParcelableCompat( + arguments + ?.getParcelableCompat( "add_on", Addon::class.java, - )?.installedState?.optionsPageUrl, + )?.installedState + ?.optionsPageUrl, ) - engineSession = requireContext().components.core.engine.createSession() + engineSession = requireContext() + .components.core.engine + .createSession() return inflater.inflate(R.layout.fragment_add_on_settings, container, false) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated( + view: View, + savedInstanceState: Bundle?, + ) { super.onViewCreated(view, savedInstanceState) val addonSettingsEngineView = view.findViewById(R.id.addonSettingsEngineView) as EngineView @@ -85,7 +103,8 @@ class AddonSettingsActivity : AppCompatActivity() { /** * Create an [AddonSettingsFragment] with add_on as a required parameter. */ - fun create(addon: Addon) = AddonSettingsFragment().apply { + fun create(addon: Addon) = + AddonSettingsFragment().apply { arguments = Bundle().apply { putParcelable("add_on", addon) } diff --git a/app/src/main/java/org/mozilla/reference/browser/addons/AddonsFragment.kt b/app/src/main/java/org/mozilla/reference/browser/addons/AddonsFragment.kt index fc513ea68..1a0c8f2a0 100644 --- a/app/src/main/java/org/mozilla/reference/browser/addons/AddonsFragment.kt +++ b/app/src/main/java/org/mozilla/reference/browser/addons/AddonsFragment.kt @@ -27,7 +27,9 @@ import org.mozilla.reference.browser.ext.components /** * Fragment use for managing add-ons. */ -class AddonsFragment : Fragment(), AddonsManagerAdapterDelegate { +class AddonsFragment : + Fragment(), + AddonsManagerAdapterDelegate { private val webExtensionPromptFeature = ViewBoundFeatureWrapper() private lateinit var recyclerView: RecyclerView private val scope = CoroutineScope(Dispatchers.IO) @@ -41,11 +43,12 @@ class AddonsFragment : Fragment(), AddonsManagerAdapterDelegate { inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?, - ): View { - return inflater.inflate(R.layout.fragment_add_ons, container, false) - } + ): View = inflater.inflate(R.layout.fragment_add_ons, container, false) - override fun onViewCreated(rootView: View, savedInstanceState: Bundle?) { + override fun onViewCreated( + rootView: View, + savedInstanceState: Bundle?, + ) { super.onViewCreated(rootView, savedInstanceState) bindRecyclerView(rootView) webExtensionPromptFeature.set( @@ -74,7 +77,9 @@ class AddonsFragment : Fragment(), AddonsManagerAdapterDelegate { recyclerView.layoutManager = LinearLayoutManager(requireContext()) scope.launch { try { - addons = requireContext().components.core.addonManager.getAddons() + addons = requireContext() + .components.core.addonManager + .getAddons() scope.launch(Dispatchers.Main) { adapter = AddonsManagerAdapter( @@ -86,7 +91,8 @@ class AddonsFragment : Fragment(), AddonsManagerAdapterDelegate { } } catch (e: AddonManagerException) { scope.launch(Dispatchers.Main) { - Toast.makeText( + Toast + .makeText( activity, R.string.mozac_feature_addons_failed_to_query_extensions, Toast.LENGTH_SHORT, diff --git a/app/src/main/java/org/mozilla/reference/browser/addons/Extensions.kt b/app/src/main/java/org/mozilla/reference/browser/addons/Extensions.kt index d1677babc..30e328a87 100644 --- a/app/src/main/java/org/mozilla/reference/browser/addons/Extensions.kt +++ b/app/src/main/java/org/mozilla/reference/browser/addons/Extensions.kt @@ -8,9 +8,8 @@ import androidx.fragment.app.Fragment import java.text.NumberFormat import java.util.Locale -internal fun getFormattedAmount(amount: Int): String { - return NumberFormat.getNumberInstance(Locale.getDefault()).format(amount) -} +internal fun getFormattedAmount(amount: Int): String = + NumberFormat.getNumberInstance(Locale.getDefault()).format(amount) /** * Run the [block] only if the [Fragment] is attached. diff --git a/app/src/main/java/org/mozilla/reference/browser/addons/InstalledAddonDetailsActivity.kt b/app/src/main/java/org/mozilla/reference/browser/addons/InstalledAddonDetailsActivity.kt index 2c1ac26ad..1664994f2 100644 --- a/app/src/main/java/org/mozilla/reference/browser/addons/InstalledAddonDetailsActivity.kt +++ b/app/src/main/java/org/mozilla/reference/browser/addons/InstalledAddonDetailsActivity.kt @@ -42,7 +42,8 @@ class InstalledAddonDetailsActivity : AppCompatActivity() { private fun bindAddon(addon: Addon) { scope.launch { try { - val addons = baseContext.components.core.addonManager.getAddons() + val addons = baseContext.components.core.addonManager + .getAddons() scope.launch(Dispatchers.Main) { addons.find { addon.id == it.id }.let { if (it == null) { @@ -54,7 +55,8 @@ class InstalledAddonDetailsActivity : AppCompatActivity() { } } catch (e: AddonManagerException) { scope.launch(Dispatchers.Main) { - Toast.makeText( + Toast + .makeText( baseContext, R.string.mozac_feature_addons_failed_to_query_extensions, Toast.LENGTH_SHORT, @@ -89,14 +91,16 @@ class InstalledAddonDetailsActivity : AppCompatActivity() { addon, onSuccess = { switch.setState(true) - Toast.makeText( + Toast + .makeText( this, getString(R.string.mozac_feature_addons_successfully_enabled, addon.translateName(this)), Toast.LENGTH_SHORT, ).show() }, onError = { - Toast.makeText( + Toast + .makeText( this, getString(R.string.mozac_feature_addons_failed_to_enable, addon.translateName(this)), Toast.LENGTH_SHORT, @@ -108,14 +112,16 @@ class InstalledAddonDetailsActivity : AppCompatActivity() { addon, onSuccess = { switch.setState(false) - Toast.makeText( + Toast + .makeText( this, getString(R.string.mozac_feature_addons_successfully_disabled, addon.translateName(this)), Toast.LENGTH_SHORT, ).show() }, onError = { - Toast.makeText( + Toast + .makeText( this, getString(R.string.mozac_feature_addons_failed_to_disable, addon.translateName(this)), Toast.LENGTH_SHORT, @@ -172,7 +178,8 @@ class InstalledAddonDetailsActivity : AppCompatActivity() { this.components.core.addonManager.uninstallAddon( addon, onSuccess = { - Toast.makeText( + Toast + .makeText( this, getString(R.string.mozac_feature_addons_successfully_uninstalled, addon.translateName(this)), Toast.LENGTH_SHORT, @@ -180,7 +187,8 @@ class InstalledAddonDetailsActivity : AppCompatActivity() { finish() }, onError = { _, _ -> - Toast.makeText( + Toast + .makeText( this, getString(R.string.mozac_feature_addons_failed_to_uninstall, addon.translateName(this)), Toast.LENGTH_SHORT, diff --git a/app/src/main/java/org/mozilla/reference/browser/addons/PermissionsDetailsActivity.kt b/app/src/main/java/org/mozilla/reference/browser/addons/PermissionsDetailsActivity.kt index 54720dc92..02d940986 100644 --- a/app/src/main/java/org/mozilla/reference/browser/addons/PermissionsDetailsActivity.kt +++ b/app/src/main/java/org/mozilla/reference/browser/addons/PermissionsDetailsActivity.kt @@ -25,7 +25,9 @@ private const val LEARN_MORE_URL = /** * An activity to show the permissions of an add-on. */ -class PermissionsDetailsActivity : AppCompatActivity(), View.OnClickListener { +class PermissionsDetailsActivity : + AppCompatActivity(), + View.OnClickListener { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_add_on_permissions) @@ -56,9 +58,11 @@ class PermissionsDetailsActivity : AppCompatActivity(), View.OnClickListener { */ class PermissionsAdapter( private val permissions: List, - ) : - RecyclerView.Adapter() { - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PermissionViewHolder { + ) : RecyclerView.Adapter() { + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int, + ): PermissionViewHolder { val context = parent.context val inflater = LayoutInflater.from(context) val view = inflater.inflate(R.layout.add_ons_permission_item, parent, false) @@ -71,7 +75,10 @@ class PermissionsDetailsActivity : AppCompatActivity(), View.OnClickListener { override fun getItemCount() = permissions.size - override fun onBindViewHolder(holder: PermissionViewHolder, position: Int) { + override fun onBindViewHolder( + holder: PermissionViewHolder, + position: Int, + ) { val permission = permissions[position] holder.textView.text = permission } diff --git a/app/src/main/java/org/mozilla/reference/browser/addons/WebExtensionActionPopupActivity.kt b/app/src/main/java/org/mozilla/reference/browser/addons/WebExtensionActionPopupActivity.kt index 6be53ab4e..a2f929221 100644 --- a/app/src/main/java/org/mozilla/reference/browser/addons/WebExtensionActionPopupActivity.kt +++ b/app/src/main/java/org/mozilla/reference/browser/addons/WebExtensionActionPopupActivity.kt @@ -41,30 +41,49 @@ class WebExtensionActionPopupActivity : AppCompatActivity() { .commit() } - override fun onCreateView(parent: View?, name: String, context: Context, attrs: AttributeSet): View? = + override fun onCreateView( + parent: View?, + name: String, + context: Context, + attrs: AttributeSet, + ): View? = when (name) { - EngineView::class.java.name -> components.core.engine.createView(context, attrs).asView() + EngineView::class.java.name -> + components.core.engine + .createView(context, attrs) + .asView() else -> super.onCreateView(parent, name, context, attrs) } /** * A fragment to show the web extension action popup with [EngineView]. */ - class WebExtensionActionPopupFragment : Fragment(), EngineSession.Observer { + class WebExtensionActionPopupFragment : + Fragment(), + EngineSession.Observer { private var engineSession: EngineSession? = null private lateinit var webExtensionId: String private val addonSettingsEngineView: EngineView get() = requireView().findViewById(R.id.addonSettingsEngineView) as EngineView - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?, + ): View? { webExtensionId = requireNotNull(arguments?.getString("web_extension_id")) - engineSession = requireContext().components.core.store.state.extensions[webExtensionId]?.popupSession + engineSession = requireContext() + .components.core.store.state.extensions[webExtensionId] + ?.popupSession return inflater.inflate(R.layout.fragment_add_on_settings, container, false) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated( + view: View, + savedInstanceState: Bundle?, + ) { super.onViewCreated(view, savedInstanceState) val session = engineSession @@ -112,7 +131,8 @@ class WebExtensionActionPopupActivity : AppCompatActivity() { /** * Create an [WebExtensionActionPopupFragment] with webExtensionId as a required parameter. */ - fun create(webExtensionId: String) = WebExtensionActionPopupFragment().apply { + fun create(webExtensionId: String) = + WebExtensionActionPopupFragment().apply { arguments = Bundle().apply { putString("web_extension_id", webExtensionId) } diff --git a/app/src/main/java/org/mozilla/reference/browser/addons/WebExtensionPromptFeature.kt b/app/src/main/java/org/mozilla/reference/browser/addons/WebExtensionPromptFeature.kt index b9efd7591..b00c0236a 100644 --- a/app/src/main/java/org/mozilla/reference/browser/addons/WebExtensionPromptFeature.kt +++ b/app/src/main/java/org/mozilla/reference/browser/addons/WebExtensionPromptFeature.kt @@ -34,7 +34,6 @@ class WebExtensionPromptFeature( private val context: Context, private val fragmentManager: FragmentManager, ) : LifecycleAwareFeature { - /** * Whether or not an add-on installation is in progress. */ @@ -47,9 +46,11 @@ class WebExtensionPromptFeature( */ override fun start() { scope = store.flowScoped { flow -> - flow.mapNotNull { state -> + flow + .mapNotNull { state -> state.webExtensionPromptRequest - }.distinctUntilChanged().collect { promptRequest -> + }.distinctUntilChanged() + .collect { promptRequest -> when (promptRequest) { is WebExtensionPromptRequest.AfterInstallation -> { handleAfterInstallationRequest(promptRequest) @@ -87,9 +88,7 @@ class WebExtensionPromptFeature( } } - private fun handlePostInstallationRequest( - addon: Addon, - ) { + private fun handlePostInstallationRequest(addon: Addon) { showPostInstallationDialog(addon) } @@ -252,18 +251,14 @@ class WebExtensionPromptFeature( store.dispatch(WebExtensionAction.ConsumePromptRequestWebExtensionAction) } - private fun hasExistingPermissionDialogFragment(): Boolean { - return findPreviousDialogFragment() != null - } + private fun hasExistingPermissionDialogFragment(): Boolean = findPreviousDialogFragment() != null - private fun findPreviousDialogFragment(): PermissionsDialogFragment? { - return fragmentManager.findFragmentByTag(PERMISSIONS_DIALOG_FRAGMENT_TAG) as? PermissionsDialogFragment - } + private fun findPreviousDialogFragment(): PermissionsDialogFragment? = + fragmentManager.findFragmentByTag(PERMISSIONS_DIALOG_FRAGMENT_TAG) as? PermissionsDialogFragment - private fun hasExistingAddonPostInstallationDialogFragment(): Boolean { - return fragmentManager.findFragmentByTag(POST_INSTALLATION_DIALOG_FRAGMENT_TAG) + private fun hasExistingAddonPostInstallationDialogFragment(): Boolean = + fragmentManager.findFragmentByTag(POST_INSTALLATION_DIALOG_FRAGMENT_TAG) as? AddonInstallationDialogFragment != null - } private fun handleBeforeInstallationRequest(promptRequest: WebExtensionPromptRequest.BeforeInstallation) { when (promptRequest) { @@ -277,9 +272,7 @@ class WebExtensionPromptFeature( } @VisibleForTesting - internal fun handleInstallationFailedRequest( - exception: WebExtensionInstallException, - ) { + internal fun handleInstallationFailedRequest(exception: WebExtensionInstallException) { val addonName = exception.extensionName ?: "" var title = context.getString(R.string.mozac_feature_addons_cant_install_extension, "") val message = when (exception) { @@ -352,10 +345,15 @@ class WebExtensionPromptFeature( message: String, ) { context.let { - AlertDialog.Builder(it).setTitle(title) - .setPositiveButton(android.R.string.ok) { _, _ -> }.setCancelable(false).setMessage( + AlertDialog + .Builder(it) + .setTitle(title) + .setPositiveButton(android.R.string.ok) { _, _ -> } + .setCancelable(false) + .setMessage( message, - ).show().withCenterAlignedButtons() + ).show() + .withCenterAlignedButtons() } } diff --git a/app/src/main/java/org/mozilla/reference/browser/browser/BaseBrowserFragment.kt b/app/src/main/java/org/mozilla/reference/browser/browser/BaseBrowserFragment.kt index 567e627ec..bf3225899 100644 --- a/app/src/main/java/org/mozilla/reference/browser/browser/BaseBrowserFragment.kt +++ b/app/src/main/java/org/mozilla/reference/browser/browser/BaseBrowserFragment.kt @@ -62,7 +62,10 @@ import mozilla.components.ui.widgets.behavior.ViewPosition as MozacToolbarBehavi * This class only contains shared code focused on the main browsing content. * UI code specific to the app or to custom tabs can be found in the subclasses. */ -abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, ActivityResultHandler { +abstract class BaseBrowserFragment : + Fragment(), + UserInteractionHandler, + ActivityResultHandler { private val sessionFeature = ViewBoundFeatureWrapper() private val toolbarIntegration = ViewBoundFeatureWrapper() private val contextMenuIntegration = ViewBoundFeatureWrapper() @@ -119,7 +122,8 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Activit registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { results -> val permissions = results.keys.toTypedArray() val grantResults = - results.values.map { + results.values + .map { if (it) PackageManager.PERMISSION_GRANTED else PackageManager.PERMISSION_DENIED }.toIntArray() downloadsFeature.withFeature { @@ -131,7 +135,8 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Activit registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { results -> val permissions = results.keys.toTypedArray() val grantResults = - results.values.map { + results.values + .map { if (it) PackageManager.PERMISSION_GRANTED else PackageManager.PERMISSION_DENIED }.toIntArray() sitePermissionFeature.withFeature { @@ -143,7 +148,8 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Activit registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { results -> val permissions = results.keys.toTypedArray() val grantResults = - results.values.map { + results.values + .map { if (it) PackageManager.PERMISSION_GRANTED else PackageManager.PERMISSION_DENIED }.toIntArray() promptsFeature.withFeature { @@ -156,15 +162,16 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Activit inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?, - ): View { - return inflater.inflate(R.layout.fragment_browser, container, false) - } + ): View = inflater.inflate(R.layout.fragment_browser, container, false) abstract val shouldUseComposeUI: Boolean @CallSuper @Suppress("LongMethod") - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated( + view: View, + savedInstanceState: Bundle?, + ) { val prefs = PreferenceManager.getDefaultSharedPreferences(requireContext()) sessionFeature.set( @@ -432,13 +439,9 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Activit } @CallSuper - override fun onBackPressed(): Boolean { - return backButtonHandler.any { it.onBackPressed() } - } + override fun onBackPressed(): Boolean = backButtonHandler.any { it.onBackPressed() } - final override fun onHomePressed(): Boolean { - return pictureInPictureIntegration.get()?.onHomePressed() ?: false - } + final override fun onHomePressed(): Boolean = pictureInPictureIntegration.get()?.onHomePressed() ?: false final override fun onPictureInPictureModeChanged(enabled: Boolean) { val session = requireComponents.core.store.state.selectedTab @@ -459,7 +462,11 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Activit } } - override fun onActivityResult(requestCode: Int, data: Intent?, resultCode: Int): Boolean { + override fun onActivityResult( + requestCode: Int, + data: Intent?, + resultCode: Int, + ): Boolean { Logger.info( "Fragment onActivityResult received with " + "requestCode: $requestCode, resultCode: $resultCode, data: $data", diff --git a/app/src/main/java/org/mozilla/reference/browser/browser/BrowserFragment.kt b/app/src/main/java/org/mozilla/reference/browser/browser/BrowserFragment.kt index ffbe5f6fa..9806764b5 100644 --- a/app/src/main/java/org/mozilla/reference/browser/browser/BrowserFragment.kt +++ b/app/src/main/java/org/mozilla/reference/browser/browser/BrowserFragment.kt @@ -29,7 +29,9 @@ import org.mozilla.reference.browser.tabs.TabsTrayFragment /** * Fragment used for browsing the web within the main app. */ -class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { +class BrowserFragment : + BaseBrowserFragment(), + UserInteractionHandler { private val thumbnailsFeature = ViewBoundFeatureWrapper() private val readerViewFeature = ViewBoundFeatureWrapper() private val webExtToolbarFeature = ViewBoundFeatureWrapper() @@ -53,7 +55,10 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { ) @Suppress("LongMethod") - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated( + view: View, + savedInstanceState: Bundle?, + ) { super.onViewCreated(view, savedInstanceState) AwesomeBarFeature(awesomeBar, toolbar, engineView) @@ -66,17 +71,14 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { engine = requireComponents.core.engine, limit = 5, filterExactMatch = true, - ) - .addSessionProvider( + ).addSessionProvider( resources, requireComponents.core.store, requireComponents.useCases.tabsUseCases.selectTab, - ) - .addHistoryProvider( + ).addHistoryProvider( requireComponents.core.historyStorage, requireComponents.useCases.sessionUseCases.loadUrl, - ) - .addClipboardProvider(requireContext(), requireComponents.useCases.sessionUseCases.loadUrl) + ).addClipboardProvider(requireContext(), requireComponents.useCases.sessionUseCases.loadUrl) // We cannot really add a `addSyncedTabsProvider` to `AwesomeBarFeature` coz that would create // a dependency on feature-syncedtabs (which depends on Sync). @@ -149,11 +151,11 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { } } - override fun onBackPressed(): Boolean = - readerViewFeature.onBackPressed() || super.onBackPressed() + override fun onBackPressed(): Boolean = readerViewFeature.onBackPressed() || super.onBackPressed() companion object { - fun create(sessionId: String? = null) = BrowserFragment().apply { + fun create(sessionId: String? = null) = + BrowserFragment().apply { arguments = Bundle().apply { putSessionId(sessionId) } diff --git a/app/src/main/java/org/mozilla/reference/browser/browser/ContextMenuIntegration.kt b/app/src/main/java/org/mozilla/reference/browser/browser/ContextMenuIntegration.kt index 54d331f96..057458d6a 100644 --- a/app/src/main/java/org/mozilla/reference/browser/browser/ContextMenuIntegration.kt +++ b/app/src/main/java/org/mozilla/reference/browser/browser/ContextMenuIntegration.kt @@ -32,7 +32,6 @@ class ContextMenuIntegration( parentView: View, sessionId: String? = null, ) : LifecycleAwareFeature { - private val candidates = run { if (sessionId != null) { val snackbarDelegate = DefaultSnackbarDelegate() diff --git a/app/src/main/java/org/mozilla/reference/browser/browser/CrashIntegration.kt b/app/src/main/java/org/mozilla/reference/browser/browser/CrashIntegration.kt index a50612891..674cd2e7c 100644 --- a/app/src/main/java/org/mozilla/reference/browser/browser/CrashIntegration.kt +++ b/app/src/main/java/org/mozilla/reference/browser/browser/CrashIntegration.kt @@ -25,9 +25,11 @@ class CrashIntegration( private val crashReporter: CrashReporter, private val onCrash: (Crash) -> Unit, ) : DefaultLifecycleObserver { - private val receiver = object : BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) { + override fun onReceive( + context: Context, + intent: Intent, + ) { if (!Crash.isCrashIntent(intent)) { return } diff --git a/app/src/main/java/org/mozilla/reference/browser/browser/CustomTabsIntegration.kt b/app/src/main/java/org/mozilla/reference/browser/browser/CustomTabsIntegration.kt index c7450c3c1..24fd19d12 100644 --- a/app/src/main/java/org/mozilla/reference/browser/browser/CustomTabsIntegration.kt +++ b/app/src/main/java/org/mozilla/reference/browser/browser/CustomTabsIntegration.kt @@ -46,9 +46,9 @@ class CustomTabsIntegration( private val customTabsUseCases: CustomTabsUseCases, sessionId: String, private val activity: Activity?, -) : LifecycleAwareFeature, UserInteractionHandler { - - private val session = store.state.findCustomTab(sessionId) +) : LifecycleAwareFeature, + UserInteractionHandler { + private val session = store.state.findCustomTab(sessionId) private val logger = Logger("CustomTabsIntegration") init { @@ -99,8 +99,8 @@ class CustomTabsIntegration( return RowMenuCandidate(listOf(forward, refresh, stop)) } - private fun menuItems(sessionState: SessionState?): List { - return listOf( + private fun menuItems(sessionState: SessionState?): List = + listOf( menuToolbar(session), TextMenuCandidate("Share") { val url = sessionState?.content?.url.orEmpty() @@ -133,7 +133,6 @@ class CustomTabsIntegration( context.startActivity(intent) }, ) - } private val menuController: MenuController = BrowserMenuController() @@ -150,7 +149,8 @@ class CustomTabsIntegration( toolbar.display.menuController = menuController store.flowScoped { flow -> - flow.map { state -> state.findCustomTab(sessionId) } + flow + .map { state -> state.findCustomTab(sessionId) } .distinctUntilChanged() .collect { tab -> val items = menuItems(tab) @@ -168,7 +168,5 @@ class CustomTabsIntegration( feature.stop() } - override fun onBackPressed(): Boolean { - return feature.onBackPressed() - } + override fun onBackPressed(): Boolean = feature.onBackPressed() } diff --git a/app/src/main/java/org/mozilla/reference/browser/browser/ExternalAppBrowserFragment.kt b/app/src/main/java/org/mozilla/reference/browser/browser/ExternalAppBrowserFragment.kt index 801296e75..8b7fb9d48 100644 --- a/app/src/main/java/org/mozilla/reference/browser/browser/ExternalAppBrowserFragment.kt +++ b/app/src/main/java/org/mozilla/reference/browser/browser/ExternalAppBrowserFragment.kt @@ -27,7 +27,9 @@ import org.mozilla.reference.browser.ext.requireComponents /** * Fragment used for browsing within an external app, such as for custom tabs and PWAs. */ -class ExternalAppBrowserFragment : BaseBrowserFragment(), UserInteractionHandler { +class ExternalAppBrowserFragment : + BaseBrowserFragment(), + UserInteractionHandler { private val customTabsIntegration = ViewBoundFeatureWrapper() private val windowFeature = ViewBoundFeatureWrapper() private val hideToolbarFeature = ViewBoundFeatureWrapper() @@ -44,7 +46,10 @@ class ExternalAppBrowserFragment : BaseBrowserFragment(), UserInteractionHandler private val trustedScopes: List get() = arguments?.getParcelableArrayListCompat(ARG_TRUSTED_SCOPES, Uri::class.java).orEmpty() - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated( + view: View, + savedInstanceState: Bundle?, + ) { super.onViewCreated(view, savedInstanceState) val manifest = this.manifest @@ -115,8 +120,7 @@ class ExternalAppBrowserFragment : BaseBrowserFragment(), UserInteractionHandler * Calls [onBackPressed] for features in the base class first, * before trying to call the custom tab [UserInteractionHandler]. */ - override fun onBackPressed(): Boolean = - super.onBackPressed() || customTabsIntegration.onBackPressed() + override fun onBackPressed(): Boolean = super.onBackPressed() || customTabsIntegration.onBackPressed() companion object { private const val ARG_TRUSTED_SCOPES = "org.mozilla.samples.browser.TRUSTED_SCOPES" diff --git a/app/src/main/java/org/mozilla/reference/browser/browser/FindInPageIntegration.kt b/app/src/main/java/org/mozilla/reference/browser/browser/FindInPageIntegration.kt index 42c73c43d..3ab15bcf1 100644 --- a/app/src/main/java/org/mozilla/reference/browser/browser/FindInPageIntegration.kt +++ b/app/src/main/java/org/mozilla/reference/browser/browser/FindInPageIntegration.kt @@ -23,7 +23,8 @@ class FindInPageIntegration( private val sessionId: String? = null, private val view: FindInPageView, engineView: EngineView, -) : LifecycleAwareFeature, UserInteractionHandler { +) : LifecycleAwareFeature, + UserInteractionHandler { private val feature = FindInPageFeature(store, view, engineView, ::onClose) override fun start() { @@ -38,9 +39,7 @@ class FindInPageIntegration( FindInPageIntegration.launch = null } - override fun onBackPressed(): Boolean { - return feature.onBackPressed() - } + override fun onBackPressed(): Boolean = feature.onBackPressed() private fun onClose() { view.asView().visibility = View.GONE @@ -72,7 +71,11 @@ class FindInPageBarBehavior( context: Context, attrs: AttributeSet, ) : CoordinatorLayout.Behavior(context, attrs) { - override fun layoutDependsOn(parent: CoordinatorLayout, child: FindInPageBar, dependency: View): Boolean { + override fun layoutDependsOn( + parent: CoordinatorLayout, + child: FindInPageBar, + dependency: View, + ): Boolean { if (dependency is BrowserToolbar) { return true } @@ -80,16 +83,22 @@ class FindInPageBarBehavior( return super.layoutDependsOn(parent, child, dependency) } - override fun onDependentViewChanged(parent: CoordinatorLayout, child: FindInPageBar, dependency: View): Boolean { - return if (dependency is BrowserToolbar) { + override fun onDependentViewChanged( + parent: CoordinatorLayout, + child: FindInPageBar, + dependency: View, + ): Boolean = + if (dependency is BrowserToolbar) { repositionFindInPageBar(child, dependency) true } else { false } - } - private fun repositionFindInPageBar(findInPageView: FindInPageBar, toolbar: BrowserToolbar) { + private fun repositionFindInPageBar( + findInPageView: FindInPageBar, + toolbar: BrowserToolbar, + ) { findInPageView.translationY = (toolbar.translationY + toolbar.height * -1.0).toFloat() } } diff --git a/app/src/main/java/org/mozilla/reference/browser/browser/ReaderViewIntegration.kt b/app/src/main/java/org/mozilla/reference/browser/browser/ReaderViewIntegration.kt index 642fa62ac..6dd13e878 100644 --- a/app/src/main/java/org/mozilla/reference/browser/browser/ReaderViewIntegration.kt +++ b/app/src/main/java/org/mozilla/reference/browser/browser/ReaderViewIntegration.kt @@ -28,9 +28,9 @@ class ReaderViewIntegration( toolbar: BrowserToolbar, view: ReaderViewControlsView, readerViewAppearanceButton: FloatingActionButton, -) : LifecycleAwareFeature, UserInteractionHandler { - - private var readerViewButtonVisible = false +) : LifecycleAwareFeature, + UserInteractionHandler { + private var readerViewButtonVisible = false private val readerViewButton: BrowserToolbar.ToggleButton = BrowserToolbar.ToggleButton( image = ContextCompat.getDrawable(context, R.drawable.mozac_ic_reader_view_24)!!, @@ -39,7 +39,9 @@ class ReaderViewIntegration( }, contentDescription = "Enable Reader View", contentDescriptionSelected = "Disable Reader View", - selected = store.state.selectedTab?.readerState?.active ?: false, + selected = store.state.selectedTab + ?.readerState + ?.active ?: false, visible = { readerViewButtonVisible }, ) { enabled -> if (enabled) { @@ -73,9 +75,7 @@ class ReaderViewIntegration( feature.stop() } - override fun onBackPressed(): Boolean { - return feature.onBackPressed() - } + override fun onBackPressed(): Boolean = feature.onBackPressed() } /** @@ -87,7 +87,11 @@ class ReaderViewAppearanceButtonBehavior( context: Context, attrs: AttributeSet, ) : CoordinatorLayout.Behavior(context, attrs) { - override fun layoutDependsOn(parent: CoordinatorLayout, child: FloatingActionButton, dependency: View): Boolean { + override fun layoutDependsOn( + parent: CoordinatorLayout, + child: FloatingActionButton, + dependency: View, + ): Boolean { if (dependency is FindInPageBar || dependency is BrowserToolbar) { return true } @@ -99,16 +103,18 @@ class ReaderViewAppearanceButtonBehavior( parent: CoordinatorLayout, child: FloatingActionButton, dependency: View, - ): Boolean { - return if (dependency is FindInPageBar || dependency is BrowserToolbar) { + ): Boolean = + if (dependency is FindInPageBar || dependency is BrowserToolbar) { repositionReaderViewAppearanceButton(child, dependency) true } else { false } - } - private fun repositionReaderViewAppearanceButton(button: FloatingActionButton, toolbar: View) { + private fun repositionReaderViewAppearanceButton( + button: FloatingActionButton, + toolbar: View, + ) { button.translationY = (toolbar.translationY + toolbar.height * -1.0).toFloat() } } diff --git a/app/src/main/java/org/mozilla/reference/browser/browser/ToolbarIntegration.kt b/app/src/main/java/org/mozilla/reference/browser/browser/ToolbarIntegration.kt index 840f4d203..d4c1fff62 100644 --- a/app/src/main/java/org/mozilla/reference/browser/browser/ToolbarIntegration.kt +++ b/app/src/main/java/org/mozilla/reference/browser/browser/ToolbarIntegration.kt @@ -53,7 +53,8 @@ class ToolbarIntegration( private val tabsUseCases: TabsUseCases, private val webAppUseCases: WebAppUseCases, sessionId: String? = null, -) : LifecycleAwareFeature, UserInteractionHandler { +) : LifecycleAwareFeature, + UserInteractionHandler { private val shippedDomainsProvider = ShippedDomainsProvider().also { it.initialize(context) } @@ -102,8 +103,8 @@ class ToolbarIntegration( return RowMenuCandidate(listOf(forward, refresh, stop)) } - private fun sessionMenuItems(sessionState: SessionState): List { - return listOfNotNull( + private fun sessionMenuItems(sessionState: SessionState): List = + listOfNotNull( menuToolbar(sessionState), TextMenuCandidate("Share") { val url = sessionState.content.url @@ -134,7 +135,6 @@ class ToolbarIntegration( FindInPageIntegration.launch?.invoke() }, ) - } private fun menuItems(sessionState: SessionState?): List { val sessionMenuItems = if (sessionState != null) { @@ -191,7 +191,8 @@ class ToolbarIntegration( ) scope.launch { - store.flow() + store + .flow() .map { state -> state.selectedTab } .distinctUntilChanged() .collect { tab -> @@ -222,7 +223,5 @@ class ToolbarIntegration( toolbarFeature.stop() } - override fun onBackPressed(): Boolean { - return toolbarFeature.onBackPressed() - } + override fun onBackPressed(): Boolean = toolbarFeature.onBackPressed() } diff --git a/app/src/main/java/org/mozilla/reference/browser/components/Analytics.kt b/app/src/main/java/org/mozilla/reference/browser/components/Analytics.kt index 682415b1c..ac9db1e36 100644 --- a/app/src/main/java/org/mozilla/reference/browser/components/Analytics.kt +++ b/app/src/main/java/org/mozilla/reference/browser/components/Analytics.kt @@ -25,8 +25,9 @@ import org.mozilla.reference.browser.ext.components * Component group for all functionality related to analytics e.g. crash * reporting and telemetry. */ -class Analytics(private val context: Context) { - +class Analytics( + private val context: Context, +) { /** * A generic crash reporter component configured to use both Sentry and Socorro. */ diff --git a/app/src/main/java/org/mozilla/reference/browser/components/Core.kt b/app/src/main/java/org/mozilla/reference/browser/components/Core.kt index 31501bfbf..aa54013a7 100644 --- a/app/src/main/java/org/mozilla/reference/browser/components/Core.kt +++ b/app/src/main/java/org/mozilla/reference/browser/components/Core.kt @@ -62,7 +62,10 @@ private const val DAY_IN_MINUTES = 24 * 60L /** * Component group for all core browser functionality. */ -class Core(private val context: Context, crashReporter: CrashReporter) { +class Core( + private val context: Context, + crashReporter: CrashReporter, +) { /** * The browser engine component initialized based on the build * configuration (see build variants). @@ -217,23 +220,21 @@ class Core(private val context: Context, crashReporter: CrashReporter) { FileUploadsDirCleaner { context.cacheDir } } - private fun provideDefaultAddonProvider(): AMOAddonsProvider { - return AMOAddonsProvider( + private fun provideDefaultAddonProvider(): AMOAddonsProvider = + AMOAddonsProvider( context = context, client = client, collectionName = "7dfae8669acc4312a65e8ba5553036", maxCacheAgeInMinutes = DAY_IN_MINUTES, ) - } - private fun provideCustomAddonProvider(): AMOAddonsProvider { - return AMOAddonsProvider( + private fun provideCustomAddonProvider(): AMOAddonsProvider = + AMOAddonsProvider( context, client, collectionUser = Settings.getOverrideAmoUser(context), collectionName = Settings.getOverrideAmoCollection(context), ) - } /** * Constructs a [TrackingProtectionPolicy] based on current preferences. diff --git a/app/src/main/java/org/mozilla/reference/browser/components/Utilities.kt b/app/src/main/java/org/mozilla/reference/browser/components/Utilities.kt index 1d3a3b4e8..a04723b18 100644 --- a/app/src/main/java/org/mozilla/reference/browser/components/Utilities.kt +++ b/app/src/main/java/org/mozilla/reference/browser/components/Utilities.kt @@ -27,7 +27,6 @@ class Utilities( private val tabsUseCases: TabsUseCases, private val customTabsUseCases: CustomTabsUseCases, ) { - /** * Provides intent processing functionality for Progressive Web App and Custom Tab intents. */ diff --git a/app/src/main/java/org/mozilla/reference/browser/compose/ComposableComponents.kt b/app/src/main/java/org/mozilla/reference/browser/compose/ComposableComponents.kt index 3a0ad51a8..5221725a1 100644 --- a/app/src/main/java/org/mozilla/reference/browser/compose/ComposableComponents.kt +++ b/app/src/main/java/org/mozilla/reference/browser/compose/ComposableComponents.kt @@ -14,11 +14,7 @@ import org.mozilla.reference.browser.ext.components * Composable helper for providing the [BrowserStore] instance of this application. */ @Composable -fun browserStore(): BrowserStore { - return LocalContext.current.components.core.store -} +fun browserStore(): BrowserStore = LocalContext.current.components.core.store @Composable -fun sessionUseCases(): SessionUseCases { - return LocalContext.current.components.useCases.sessionUseCases -} +fun sessionUseCases(): SessionUseCases = LocalContext.current.components.useCases.sessionUseCases diff --git a/app/src/main/java/org/mozilla/reference/browser/ext/Context.kt b/app/src/main/java/org/mozilla/reference/browser/ext/Context.kt index b5d29a90c..2935b57d4 100644 --- a/app/src/main/java/org/mozilla/reference/browser/ext/Context.kt +++ b/app/src/main/java/org/mozilla/reference/browser/ext/Context.kt @@ -32,8 +32,7 @@ val Context.components: Components fun Context.getPreferenceKey( @StringRes resourceId: Int, -): String = - resources.getString(resourceId) +): String = resources.getString(resourceId) /** * Shares content via [ACTION_SEND] intent. @@ -42,8 +41,11 @@ fun Context.getPreferenceKey( * @param subject of the intent [EXTRA_TEXT] * @return true it is able to share false otherwise. */ -fun Context.share(text: String, subject: String = ""): Boolean { - return try { +fun Context.share( + text: String, + subject: String = "", +): Boolean = + try { val intent = Intent(ACTION_SEND).apply { type = "text/plain" putExtra(EXTRA_SUBJECT, subject) @@ -61,4 +63,3 @@ fun Context.share(text: String, subject: String = ""): Boolean { Log.log(WARN, message = "No activity to share to found", throwable = e, tag = "Reference-Browser") false } -} diff --git a/app/src/main/java/org/mozilla/reference/browser/ext/Long.kt b/app/src/main/java/org/mozilla/reference/browser/ext/Long.kt index 17ed9811e..99e3220c2 100644 --- a/app/src/main/java/org/mozilla/reference/browser/ext/Long.kt +++ b/app/src/main/java/org/mozilla/reference/browser/ext/Long.kt @@ -12,7 +12,10 @@ import java.util.Date import java.util.GregorianCalendar @Suppress("MagicNumber") -fun Long.timeSince(context: Context, time: Long): String { +fun Long.timeSince( + context: Context, + time: Long, +): String { val earliestValidSyncDate: Date = GregorianCalendar.getInstance().run { set(2000, Calendar.JANUARY, 1, 0, 0, 0) getTime() diff --git a/app/src/main/java/org/mozilla/reference/browser/pip/PictureInPictureIntegration.kt b/app/src/main/java/org/mozilla/reference/browser/pip/PictureInPictureIntegration.kt index 4acdffbca..18bf74b75 100644 --- a/app/src/main/java/org/mozilla/reference/browser/pip/PictureInPictureIntegration.kt +++ b/app/src/main/java/org/mozilla/reference/browser/pip/PictureInPictureIntegration.kt @@ -27,7 +27,8 @@ class PictureInPictureIntegration( override fun start() { scope = store.flowScoped { flow -> - flow.mapNotNull { state -> state.findTabOrCustomTabOrSelectedTab(customTabId) } + flow + .mapNotNull { state -> state.findTabOrCustomTabOrSelectedTab(customTabId) } .distinctUntilChangedBy { it.content.url } .collect { whiteListed = isWhitelisted(it.content.url) } } @@ -37,7 +38,8 @@ class PictureInPictureIntegration( scope?.cancel() } - fun onHomePressed() = if (whiteListed) { + fun onHomePressed() = + if (whiteListed) { pictureFeature.enterPipModeCompat() } else { pictureFeature.onHomePressed() diff --git a/app/src/main/java/org/mozilla/reference/browser/push/PushFxaIntegration.kt b/app/src/main/java/org/mozilla/reference/browser/push/PushFxaIntegration.kt index f7410e250..5a071966a 100644 --- a/app/src/main/java/org/mozilla/reference/browser/push/PushFxaIntegration.kt +++ b/app/src/main/java/org/mozilla/reference/browser/push/PushFxaIntegration.kt @@ -81,7 +81,10 @@ internal class OneTimePushMessageObserver( private val lazyAccountManager: Lazy, private val pushFeature: AutoPushFeature, ) : AutoPushFeature.Observer { - override fun onMessageReceived(scope: PushScope, message: ByteArray?) { + override fun onMessageReceived( + scope: PushScope, + message: ByteArray?, + ) { // Ignore empty push messages. val rawBytes = message ?: return diff --git a/app/src/main/java/org/mozilla/reference/browser/push/WebPushEngineIntegration.kt b/app/src/main/java/org/mozilla/reference/browser/push/WebPushEngineIntegration.kt index 9737c9986..2f044de01 100644 --- a/app/src/main/java/org/mozilla/reference/browser/push/WebPushEngineIntegration.kt +++ b/app/src/main/java/org/mozilla/reference/browser/push/WebPushEngineIntegration.kt @@ -21,7 +21,6 @@ class WebPushEngineIntegration( private val engine: Engine, private val pushFeature: AutoPushFeature, ) : AutoPushFeature.Observer { - private var handler: WebPushHandler? = null private val delegate = WebPushEngineDelegate(pushFeature) @@ -35,7 +34,10 @@ class WebPushEngineIntegration( pushFeature.unregister(this) } - override fun onMessageReceived(scope: PushScope, message: ByteArray?) { + override fun onMessageReceived( + scope: PushScope, + message: ByteArray?, + ) { CoroutineScope(Dispatchers.Main).launch { handler?.onPushMessage(scope, message) } @@ -53,7 +55,10 @@ internal class WebPushEngineDelegate( ) : WebPushDelegate { private val logger = Logger("WebPushEngineDelegate") - override fun onGetSubscription(scope: String, onSubscription: (WebPushSubscription?) -> Unit) { + override fun onGetSubscription( + scope: String, + onSubscription: (WebPushSubscription?) -> Unit, + ) { // We don't have the appServerKey unless an app is creating a new subscription so we // allow the key to be null since it won't be overridden from a previous subscription. pushFeature.getSubscription(scope) { @@ -81,7 +86,10 @@ internal class WebPushEngineDelegate( ) } - override fun onUnsubscribe(scope: String, onUnsubscribe: (Boolean) -> Unit) { + override fun onUnsubscribe( + scope: String, + onUnsubscribe: (Boolean) -> Unit, + ) { pushFeature.unsubscribe( scope = scope, onUnsubscribeError = { @@ -95,7 +103,8 @@ internal class WebPushEngineDelegate( } } -internal fun AutoPushSubscription.toEnginePushSubscription() = WebPushSubscription( +internal fun AutoPushSubscription.toEnginePushSubscription() = + WebPushSubscription( scope = this.scope, publicKey = this.publicKey.toDecodedByteArray(), endpoint = this.endpoint, diff --git a/app/src/main/java/org/mozilla/reference/browser/search/AwesomeBarWrapper.kt b/app/src/main/java/org/mozilla/reference/browser/search/AwesomeBarWrapper.kt index e8b14bb20..50f68b219 100644 --- a/app/src/main/java/org/mozilla/reference/browser/search/AwesomeBarWrapper.kt +++ b/app/src/main/java/org/mozilla/reference/browser/search/AwesomeBarWrapper.kt @@ -28,7 +28,8 @@ class AwesomeBarWrapper context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0, -) : AbstractComposeView(context, attrs, defStyleAttr), AwesomeBar { +) : AbstractComposeView(context, attrs, defStyleAttr), + AwesomeBar { private val providers = mutableStateOf(emptyList()) private val text = mutableStateOf("") private var onEditSuggestionListener: ((String) -> Unit)? = null @@ -69,9 +70,8 @@ class AwesomeBarWrapper this.providers.value = newProviders } - override fun containsProvider(provider: AwesomeBar.SuggestionProvider): Boolean { - return providers.value.any { current -> current.id == provider.id } - } + override fun containsProvider(provider: AwesomeBar.SuggestionProvider): Boolean = + providers.value.any { current -> current.id == provider.id } override fun onInputChanged(text: String) { this.text.value = text diff --git a/app/src/main/java/org/mozilla/reference/browser/settings/AboutFragment.kt b/app/src/main/java/org/mozilla/reference/browser/settings/AboutFragment.kt index 5b27c2f66..c02bacc89 100644 --- a/app/src/main/java/org/mozilla/reference/browser/settings/AboutFragment.kt +++ b/app/src/main/java/org/mozilla/reference/browser/settings/AboutFragment.kt @@ -25,11 +25,16 @@ import org.mozilla.geckoview.BuildConfig.MOZ_APP_VERSION import org.mozilla.reference.browser.R class AboutFragment : Fragment() { - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_about, container, false) - } + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?, + ): View? = inflater.inflate(R.layout.fragment_about, container, false) - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated( + view: View, + savedInstanceState: Bundle?, + ) { super.onViewCreated(view, savedInstanceState) val appName = requireContext().resources.getString(R.string.app_name) diff --git a/app/src/main/java/org/mozilla/reference/browser/settings/AccountSettingsFragment.kt b/app/src/main/java/org/mozilla/reference/browser/settings/AccountSettingsFragment.kt index a013caf25..702b7a846 100644 --- a/app/src/main/java/org/mozilla/reference/browser/settings/AccountSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/reference/browser/settings/AccountSettingsFragment.kt @@ -69,7 +69,10 @@ class AccountSettingsFragment : PreferenceFragmentCompat() { } } - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + override fun onCreatePreferences( + savedInstanceState: Bundle?, + rootKey: String?, + ) { setPreferencesFromResource(R.xml.account_preferences, rootKey) val signOutKey = requireContext().getPreferenceKey(pref_key_sign_out) @@ -111,7 +114,11 @@ class AccountSettingsFragment : PreferenceFragmentCompat() { ) } - fun updateLastSyncedTimePref(context: Context, pref: Preference?, failed: Boolean = false) { + fun updateLastSyncedTimePref( + context: Context, + pref: Preference?, + failed: Boolean = false, + ) { val lastSyncTime = getLastSynced(context) pref?.summary = if (!failed && lastSyncTime == 0L) { @@ -135,34 +142,34 @@ class AccountSettingsFragment : PreferenceFragmentCompat() { } } - private fun getClickListenerForSignOut(): OnPreferenceClickListener { - return OnPreferenceClickListener { + private fun getClickListenerForSignOut(): OnPreferenceClickListener = + OnPreferenceClickListener { CoroutineScope(Dispatchers.Main).launch { requireComponents.backgroundServices.accountManager.logout() activity?.onBackPressedDispatcher?.onBackPressed() } true } - } - private fun getClickListenerForSyncNow(): OnPreferenceClickListener { - return OnPreferenceClickListener { + private fun getClickListenerForSyncNow(): OnPreferenceClickListener = + OnPreferenceClickListener { CoroutineScope(Dispatchers.Main).launch { // Trigger a sync & update devices. requireComponents.backgroundServices.accountManager.syncNow(SyncReason.User) // Poll for device events. - requireComponents.backgroundServices.accountManager.authenticatedAccount() - ?.deviceConstellation()?.run { + requireComponents.backgroundServices.accountManager + .authenticatedAccount() + ?.deviceConstellation() + ?.run { refreshDevices() pollForCommands() } } true } - } - private fun getClickListenerForManageAccount(): OnPreferenceClickListener { - return OnPreferenceClickListener { + private fun getClickListenerForManageAccount(): OnPreferenceClickListener = + OnPreferenceClickListener { viewLifecycleOwner.lifecycleScope.launch(Dispatchers.Main) { context?.let { val account = @@ -176,9 +183,13 @@ class AccountSettingsFragment : PreferenceFragmentCompat() { } true } - } - private fun createCustomTabIntent(context: Context, url: String): Intent = CustomTabsIntent.Builder() + private fun createCustomTabIntent( + context: Context, + url: String, + ): Intent = + CustomTabsIntent + .Builder() .setInstantAppsEnabled(false) .build() .intent @@ -186,7 +197,11 @@ class AccountSettingsFragment : PreferenceFragmentCompat() { .setClassName(context, IntentReceiverActivity::class.java.name) .setPackage(context.packageName) - private fun updateSyncEngineState(context: Context, engine: SyncEngine, newState: Boolean) { + private fun updateSyncEngineState( + context: Context, + engine: SyncEngine, + newState: Boolean, + ) { SyncEnginesStorage(context).setStatus(engine, newState) CoroutineScope(Dispatchers.Main).launch { requireComponents.backgroundServices.accountManager.syncNow(SyncReason.EngineChange) @@ -204,7 +219,8 @@ class AccountSettingsFragment : PreferenceFragmentCompat() { } } - private fun SyncEngine.prefId(): Int = when (this) { + private fun SyncEngine.prefId(): Int = + when (this) { SyncEngine.History -> pref_key_sync_history SyncEngine.Passwords -> pref_key_sync_passwords SyncEngine.Tabs -> pref_key_sync_tabs diff --git a/app/src/main/java/org/mozilla/reference/browser/settings/CustomColorPreference.kt b/app/src/main/java/org/mozilla/reference/browser/settings/CustomColorPreference.kt index 3e7cee680..230125029 100644 --- a/app/src/main/java/org/mozilla/reference/browser/settings/CustomColorPreference.kt +++ b/app/src/main/java/org/mozilla/reference/browser/settings/CustomColorPreference.kt @@ -30,7 +30,10 @@ class CustomColorPreference init(context, attrs) } - private fun init(context: Context, attrs: AttributeSet?) { + private fun init( + context: Context, + attrs: AttributeSet?, + ) { context.obtainStyledAttributes(attrs, R.styleable.CustomColorPreference).apply { titleColor = getColor( R.styleable.CustomColorPreference_titleColor, diff --git a/app/src/main/java/org/mozilla/reference/browser/settings/PairSettingsFragment.kt b/app/src/main/java/org/mozilla/reference/browser/settings/PairSettingsFragment.kt index 2542537b9..535e2f0f1 100644 --- a/app/src/main/java/org/mozilla/reference/browser/settings/PairSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/reference/browser/settings/PairSettingsFragment.kt @@ -22,9 +22,12 @@ import org.mozilla.reference.browser.R import org.mozilla.reference.browser.ext.requireComponents import org.mozilla.reference.browser.sync.BrowserFxAEntryPoint -class PairSettingsFragment : Fragment(), UserInteractionHandler { +class PairSettingsFragment : + Fragment(), + UserInteractionHandler { private val qrFeature = ViewBoundFeatureWrapper() private lateinit var requestPermissionLauncher: ActivityResultLauncher + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) requestPermissionLauncher = @@ -34,11 +37,17 @@ class PairSettingsFragment : Fragment(), UserInteractionHandler { } } } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_pairing, container, false) - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?, + ): View? = inflater.inflate(R.layout.fragment_pairing, container, false) + + override fun onViewCreated( + view: View, + savedInstanceState: Bundle?, + ) { super.onViewCreated(view, savedInstanceState) qrFeature.set( feature = QrFeature( diff --git a/app/src/main/java/org/mozilla/reference/browser/settings/PrivacySettingsFragment.kt b/app/src/main/java/org/mozilla/reference/browser/settings/PrivacySettingsFragment.kt index b0b436e2c..989d08582 100644 --- a/app/src/main/java/org/mozilla/reference/browser/settings/PrivacySettingsFragment.kt +++ b/app/src/main/java/org/mozilla/reference/browser/settings/PrivacySettingsFragment.kt @@ -14,8 +14,10 @@ import org.mozilla.reference.browser.ext.getPreferenceKey import org.mozilla.reference.browser.ext.requireComponents class PrivacySettingsFragment : PreferenceFragmentCompat() { - - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + override fun onCreatePreferences( + savedInstanceState: Bundle?, + rootKey: String?, + ) { setPreferencesFromResource(R.xml.privacy_preferences, rootKey) val context = requireContext() @@ -39,30 +41,29 @@ class PrivacySettingsFragment : PreferenceFragmentCompat() { globalPrivacyControl?.onPreferenceChangeListener = getChangeListenerForGPC { enabled -> requireComponents.core.engine.settings.globalPrivacyControlEnabled = enabled - requireComponents.useCases.sessionUseCases.reload.invoke() + requireComponents.useCases.sessionUseCases.reload + .invoke() } } - private fun getChangeListenerForTelemetry(): OnPreferenceChangeListener { - return OnPreferenceChangeListener { _, _ -> + private fun getChangeListenerForTelemetry(): OnPreferenceChangeListener = + OnPreferenceChangeListener { _, _ -> true } - } private fun getChangeListenerForTrackingProtection( createTrackingProtectionPolicy: (Boolean) -> TrackingProtectionPolicy, - ): OnPreferenceChangeListener { - return OnPreferenceChangeListener { _, value -> + ): OnPreferenceChangeListener = + OnPreferenceChangeListener { _, value -> val policy = createTrackingProtectionPolicy(value as Boolean) - requireComponents.useCases.settingsUseCases.updateTrackingProtection.invoke(policy) + requireComponents.useCases.settingsUseCases.updateTrackingProtection + .invoke(policy) true } - } - private fun getChangeListenerForGPC(action: (Boolean) -> Unit): OnPreferenceChangeListener { - return OnPreferenceChangeListener { _, enabled -> + private fun getChangeListenerForGPC(action: (Boolean) -> Unit): OnPreferenceChangeListener = + OnPreferenceChangeListener { _, enabled -> action.invoke(enabled as Boolean) true } - } } diff --git a/app/src/main/java/org/mozilla/reference/browser/settings/Settings.kt b/app/src/main/java/org/mozilla/reference/browser/settings/Settings.kt index 7ddb6c77c..a2dbf8946 100644 --- a/app/src/main/java/org/mozilla/reference/browser/settings/Settings.kt +++ b/app/src/main/java/org/mozilla/reference/browser/settings/Settings.kt @@ -28,21 +28,26 @@ object Settings { "", ) ?: "" - fun setOverrideAmoUser(context: Context, value: String) { + fun setOverrideAmoUser( + context: Context, + value: String, + ) { val key = context.getString(R.string.pref_key_override_amo_user) PreferenceManager.getDefaultSharedPreferences(context).edit { putString(key, value) } } - fun setOverrideAmoCollection(context: Context, value: String) { + fun setOverrideAmoCollection( + context: Context, + value: String, + ) { val key = context.getString(R.string.pref_key_override_amo_collection) PreferenceManager.getDefaultSharedPreferences(context).edit { putString(key, value) } } - fun isAmoCollectionOverrideConfigured(context: Context): Boolean { - return getOverrideAmoUser(context).isNotEmpty() && getOverrideAmoCollection(context).isNotEmpty() - } + fun isAmoCollectionOverrideConfigured(context: Context): Boolean = + getOverrideAmoUser(context).isNotEmpty() && getOverrideAmoCollection(context).isNotEmpty() } diff --git a/app/src/main/java/org/mozilla/reference/browser/settings/SettingsActivity.kt b/app/src/main/java/org/mozilla/reference/browser/settings/SettingsActivity.kt index a76cd095c..e4640e4c4 100644 --- a/app/src/main/java/org/mozilla/reference/browser/settings/SettingsActivity.kt +++ b/app/src/main/java/org/mozilla/reference/browser/settings/SettingsActivity.kt @@ -10,9 +10,10 @@ import android.view.MenuItem import androidx.appcompat.app.AppCompatActivity import mozilla.components.support.base.feature.UserInteractionHandler -class SettingsActivity : AppCompatActivity(), SettingsFragment.ActionBarUpdater { - - override fun onCreate(savedInstanceState: Bundle?) { +class SettingsActivity : + AppCompatActivity(), + SettingsFragment.ActionBarUpdater { + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (savedInstanceState == null) { @@ -23,7 +24,8 @@ class SettingsActivity : AppCompatActivity(), SettingsFragment.ActionBarUpdater } } - override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) { + override fun onOptionsItemSelected(item: MenuItem): Boolean = + when (item.itemId) { android.R.id.home -> { onBackPressedDispatcher.onBackPressed() true diff --git a/app/src/main/java/org/mozilla/reference/browser/settings/SettingsFragment.kt b/app/src/main/java/org/mozilla/reference/browser/settings/SettingsFragment.kt index 96c95dcd4..a5d174597 100644 --- a/app/src/main/java/org/mozilla/reference/browser/settings/SettingsFragment.kt +++ b/app/src/main/java/org/mozilla/reference/browser/settings/SettingsFragment.kt @@ -41,7 +41,6 @@ import kotlin.system.exitProcess private typealias RBSettings = org.mozilla.reference.browser.settings.Settings class SettingsFragment : PreferenceFragmentCompat() { - interface ActionBarUpdater { fun updateTitle(titleResId: Int) } @@ -51,7 +50,10 @@ class SettingsFragment : PreferenceFragmentCompat() { true } - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + override fun onCreatePreferences( + savedInstanceState: Bundle?, + rootKey: String?, + ) { setPreferencesFromResource(R.xml.preferences, rootKey) } @@ -113,8 +115,8 @@ class SettingsFragment : PreferenceFragmentCompat() { preferenceCustomAddons?.onPreferenceClickListener = getClickListenerForCustomAddons() } - private fun getClickListenerForMakeDefaultBrowser(): OnPreferenceClickListener { - return if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { + private fun getClickListenerForMakeDefaultBrowser(): OnPreferenceClickListener = + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { OnPreferenceClickListener { val intent = Intent( Settings.ACTION_MANAGE_DEFAULT_APPS_SETTINGS, @@ -125,10 +127,9 @@ class SettingsFragment : PreferenceFragmentCompat() { } else { defaultClickListener } - } - private fun getClickListenerForSignIn(): OnPreferenceClickListener { - return OnPreferenceClickListener { + private fun getClickListenerForSignIn(): OnPreferenceClickListener = + OnPreferenceClickListener { requireComponents.services.accountsAuthFeature.beginAuthentication( requireContext(), BrowserFxAEntryPoint.HomeMenu, @@ -137,11 +138,11 @@ class SettingsFragment : PreferenceFragmentCompat() { activity?.finish() true } - } - private fun getClickListenerForPairingSignIn(): OnPreferenceClickListener { - return OnPreferenceClickListener { - parentFragmentManager.beginTransaction() + private fun getClickListenerForPairingSignIn(): OnPreferenceClickListener = + OnPreferenceClickListener { + parentFragmentManager + .beginTransaction() .replace(android.R.id.content, PairSettingsFragment()) .addToBackStack(null) .commit() @@ -150,11 +151,11 @@ class SettingsFragment : PreferenceFragmentCompat() { } true } - } - private fun getClickListenerForFirefoxAccount(): OnPreferenceClickListener { - return OnPreferenceClickListener { - parentFragmentManager.beginTransaction() + private fun getClickListenerForFirefoxAccount(): OnPreferenceClickListener = + OnPreferenceClickListener { + parentFragmentManager + .beginTransaction() .replace(android.R.id.content, AccountSettingsFragment()) .addToBackStack(null) .commit() @@ -163,11 +164,11 @@ class SettingsFragment : PreferenceFragmentCompat() { } true } - } - private fun getClickListenerForPrivacy(): OnPreferenceClickListener { - return OnPreferenceClickListener { - parentFragmentManager.beginTransaction() + private fun getClickListenerForPrivacy(): OnPreferenceClickListener = + OnPreferenceClickListener { + parentFragmentManager + .beginTransaction() .replace(android.R.id.content, PrivacySettingsFragment()) .addToBackStack(null) .commit() @@ -176,35 +177,35 @@ class SettingsFragment : PreferenceFragmentCompat() { } true } - } - private fun getChangeListenerForRemoteDebugging(): OnPreferenceChangeListener { - return OnPreferenceChangeListener { _, newValue -> + private fun getChangeListenerForRemoteDebugging(): OnPreferenceChangeListener = + OnPreferenceChangeListener { _, newValue -> requireComponents.core.engine.settings.remoteDebuggingEnabled = newValue as Boolean true } - } - private fun getAboutPageListener(): OnPreferenceClickListener { - return OnPreferenceClickListener { - parentFragmentManager.beginTransaction() + private fun getAboutPageListener(): OnPreferenceClickListener = + OnPreferenceClickListener { + parentFragmentManager + .beginTransaction() .replace(android.R.id.content, AboutFragment()) .addToBackStack(null) .commit() true } - } private fun getActionBarUpdater() = activity as ActionBarUpdater - private fun getClickListenerForCustomAddons(): OnPreferenceClickListener { - return OnPreferenceClickListener { + private fun getClickListenerForCustomAddons(): OnPreferenceClickListener = + OnPreferenceClickListener { val context = requireContext() val dialogView = View.inflate(context, R.layout.amo_collection_override_dialog, null) val userView = dialogView.findViewById(R.id.custom_amo_user) val collectionView = dialogView.findViewById(R.id.custom_amo_collection) - AlertDialog.Builder(context).apply { + AlertDialog + .Builder(context) + .apply { setTitle(context.getString(R.string.preferences_customize_amo_collection)) setView(dialogView) setNegativeButton(R.string.customize_addon_collection_cancel) { dialog: DialogInterface, _ -> @@ -215,7 +216,8 @@ class SettingsFragment : PreferenceFragmentCompat() { RBSettings.setOverrideAmoUser(context, userView.text.toString()) RBSettings.setOverrideAmoCollection(context, collectionView.text.toString()) - Toast.makeText( + Toast + .makeText( context, getString(R.string.toast_customize_addon_collection_done), Toast.LENGTH_LONG, @@ -237,7 +239,7 @@ class SettingsFragment : PreferenceFragmentCompat() { }.show() true } - } + companion object { private const val AMO_COLLECTION_OVERRIDE_EXIT_DELAY = 3000L } diff --git a/app/src/main/java/org/mozilla/reference/browser/sync/BrowserFxAEntryPoint.kt b/app/src/main/java/org/mozilla/reference/browser/sync/BrowserFxAEntryPoint.kt index ddb218687..ab79e929a 100644 --- a/app/src/main/java/org/mozilla/reference/browser/sync/BrowserFxAEntryPoint.kt +++ b/app/src/main/java/org/mozilla/reference/browser/sync/BrowserFxAEntryPoint.kt @@ -9,7 +9,9 @@ import mozilla.components.concept.sync.FxAEntryPoint /** * Reference Browser implementation of [FxAEntryPoint]. */ -enum class BrowserFxAEntryPoint(override val entryName: String) : FxAEntryPoint { +enum class BrowserFxAEntryPoint( + override val entryName: String, +) : FxAEntryPoint { /** * Authenticating from the home menu (the hamburger menu) */ diff --git a/app/src/main/java/org/mozilla/reference/browser/tabs/LastTabFeature.kt b/app/src/main/java/org/mozilla/reference/browser/tabs/LastTabFeature.kt index fc41176b6..5a164f244 100644 --- a/app/src/main/java/org/mozilla/reference/browser/tabs/LastTabFeature.kt +++ b/app/src/main/java/org/mozilla/reference/browser/tabs/LastTabFeature.kt @@ -21,9 +21,10 @@ class LastTabFeature( private val tabId: String? = null, private val removeTabUseCase: TabsUseCases.RemoveTabUseCase, private val activity: Activity, -) : LifecycleAwareFeature, UserInteractionHandler { +) : LifecycleAwareFeature, + UserInteractionHandler { + override fun start() = Unit - override fun start() = Unit override fun stop() = Unit /** diff --git a/app/src/main/java/org/mozilla/reference/browser/tabs/PrivatePage.kt b/app/src/main/java/org/mozilla/reference/browser/tabs/PrivatePage.kt index a8c92e562..60fe7da9e 100644 --- a/app/src/main/java/org/mozilla/reference/browser/tabs/PrivatePage.kt +++ b/app/src/main/java/org/mozilla/reference/browser/tabs/PrivatePage.kt @@ -22,7 +22,8 @@ object PrivatePage { it.readText() } - return context.resources.openRawResource(htmlRes) + return context.resources + .openRawResource(htmlRes) .bufferedReader() .use { it.readText() } .replace("%pageTitle%", context.getString(R.string.private_browsing_title)) diff --git a/app/src/main/java/org/mozilla/reference/browser/tabs/TabsPanel.kt b/app/src/main/java/org/mozilla/reference/browser/tabs/TabsPanel.kt index a02789974..b565d6343 100644 --- a/app/src/main/java/org/mozilla/reference/browser/tabs/TabsPanel.kt +++ b/app/src/main/java/org/mozilla/reference/browser/tabs/TabsPanel.kt @@ -23,7 +23,8 @@ class TabsPanel constructor( context: Context, attrs: AttributeSet? = null, -) : TabLayout(context, attrs), TabLayout.OnTabSelectedListener { +) : TabLayout(context, attrs), + TabLayout.OnTabSelectedListener { private var normalTab: Tab private var privateTab: Tab private var tabsFeature: TabsFeature? = null @@ -46,7 +47,10 @@ class TabsPanel addTab(privateTab) } - fun initialize(tabsFeature: TabsFeature?, updateTabsToolbar: (isPrivate: Boolean) -> Unit) { + fun initialize( + tabsFeature: TabsFeature?, + updateTabsToolbar: (isPrivate: Boolean) -> Unit, + ) { this.tabsFeature = tabsFeature this.updateTabsToolbar = updateTabsToolbar } @@ -77,8 +81,7 @@ class TabsPanel private fun Resources.getThemedDrawable( @DrawableRes resId: Int, - ) = - ResourcesCompat.getDrawable(resources, resId, context.theme) + ) = ResourcesCompat.getDrawable(resources, resId, context.theme) private fun Drawable.colorTint( @ColorRes color: Int, diff --git a/app/src/main/java/org/mozilla/reference/browser/tabs/TabsToolbar.kt b/app/src/main/java/org/mozilla/reference/browser/tabs/TabsToolbar.kt index 3e47afefc..30bff972d 100644 --- a/app/src/main/java/org/mozilla/reference/browser/tabs/TabsToolbar.kt +++ b/app/src/main/java/org/mozilla/reference/browser/tabs/TabsToolbar.kt @@ -48,7 +48,10 @@ class TabsToolbar } } - fun initialize(tabsFeature: TabsFeature?, closeTabsTray: () -> Unit) { + fun initialize( + tabsFeature: TabsFeature?, + closeTabsTray: () -> Unit, + ) { this.tabsFeature = tabsFeature this.closeTabsTray = closeTabsTray } diff --git a/app/src/main/java/org/mozilla/reference/browser/tabs/TabsTouchHelper.kt b/app/src/main/java/org/mozilla/reference/browser/tabs/TabsTouchHelper.kt index 6ac6ed04b..a555961e4 100644 --- a/app/src/main/java/org/mozilla/reference/browser/tabs/TabsTouchHelper.kt +++ b/app/src/main/java/org/mozilla/reference/browser/tabs/TabsTouchHelper.kt @@ -9,9 +9,11 @@ import mozilla.components.browser.state.state.TabSessionState import mozilla.components.browser.tabstray.TabTouchCallback import kotlin.math.abs -class TabsTouchHelper(observable: (TabSessionState) -> Unit) : - ItemTouchHelper(object : TabTouchCallback(observable) { - override fun alphaForItemSwipe(dX: Float, distanceToAlphaMin: Int): Float { - return 1f - 2f * abs(dX) / distanceToAlphaMin - } +class TabsTouchHelper( + observable: (TabSessionState) -> Unit, +) : ItemTouchHelper(object : TabTouchCallback(observable) { + override fun alphaForItemSwipe( + dX: Float, + distanceToAlphaMin: Int, + ): Float = 1f - 2f * abs(dX) / distanceToAlphaMin }) diff --git a/app/src/main/java/org/mozilla/reference/browser/tabs/TabsTrayFragment.kt b/app/src/main/java/org/mozilla/reference/browser/tabs/TabsTrayFragment.kt index 8cf044c66..308115023 100644 --- a/app/src/main/java/org/mozilla/reference/browser/tabs/TabsTrayFragment.kt +++ b/app/src/main/java/org/mozilla/reference/browser/tabs/TabsTrayFragment.kt @@ -30,13 +30,21 @@ import org.mozilla.reference.browser.ext.requireComponents /** * A fragment for displaying the tabs tray. */ -class TabsTrayFragment : Fragment(), UserInteractionHandler { +class TabsTrayFragment : + Fragment(), + UserInteractionHandler { private var tabsFeature: TabsFeature? = null - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View = - inflater.inflate(R.layout.fragment_tabstray, container, false) + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?, + ): View = inflater.inflate(R.layout.fragment_tabstray, container, false) - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated( + view: View, + savedInstanceState: Bundle?, + ) { super.onViewCreated(view, savedInstanceState) val trayAdapter = createAndSetupTabsTray(requireContext()) @@ -88,7 +96,8 @@ class TabsTrayFragment : Fragment(), UserInteractionHandler { val thumbnailLoader = ThumbnailLoader(context.components.core.thumbnailStorage) val trayStyling = TabsTrayStyling(itemBackgroundColor = Color.TRANSPARENT, itemTextColor = Color.WHITE) val viewHolderProvider: ViewHolderProvider = { viewGroup -> - val view = LayoutInflater.from(context) + val view = LayoutInflater + .from(context) .inflate(R.layout.browser_tabstray_item, viewGroup, false) DefaultTabViewHolder(view, thumbnailLoader) @@ -98,12 +107,18 @@ class TabsTrayFragment : Fragment(), UserInteractionHandler { viewHolderProvider = viewHolderProvider, styling = trayStyling, delegate = object : TabsTray.Delegate { - override fun onTabSelected(tab: TabSessionState, source: String?) { + override fun onTabSelected( + tab: TabSessionState, + source: String?, + ) { requireComponents.useCases.tabsUseCases.selectTab(tab.id) closeTabsTray() } - override fun onTabClosed(tab: TabSessionState, source: String?) { + override fun onTabClosed( + tab: TabSessionState, + source: String?, + ) { requireComponents.useCases.tabsUseCases.removeTab(tab.id) } }, diff --git a/app/src/main/java/org/mozilla/reference/browser/tabs/synced/SyncedTabsAdapter.kt b/app/src/main/java/org/mozilla/reference/browser/tabs/synced/SyncedTabsAdapter.kt index 0b0c9700b..1cbbe711b 100644 --- a/app/src/main/java/org/mozilla/reference/browser/tabs/synced/SyncedTabsAdapter.kt +++ b/app/src/main/java/org/mozilla/reference/browser/tabs/synced/SyncedTabsAdapter.kt @@ -18,8 +18,10 @@ class SyncedTabsAdapter( ) : ListAdapter( DiffCallback, ) { - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SyncedTabsViewHolder { + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int, + ): SyncedTabsViewHolder { val itemView = LayoutInflater.from(parent.context).inflate(viewType, parent, false) return when (viewType) { @@ -29,7 +31,10 @@ class SyncedTabsAdapter( } } - override fun onBindViewHolder(holder: SyncedTabsViewHolder, position: Int) { + override fun onBindViewHolder( + holder: SyncedTabsViewHolder, + position: Int, + ) { val item = when (holder) { is DeviceViewHolder -> getItem(position) as AdapterItem.Device is TabViewHolder -> getItem(position) as AdapterItem.Tab @@ -37,23 +42,31 @@ class SyncedTabsAdapter( holder.bind(item, listener) } - override fun getItemViewType(position: Int): Int { - return when (getItem(position)) { + override fun getItemViewType(position: Int): Int = + when (getItem(position)) { is AdapterItem.Device -> DeviceViewHolder.LAYOUT_ID is AdapterItem.Tab -> TabViewHolder.LAYOUT_ID } - } private object DiffCallback : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: AdapterItem, newItem: AdapterItem) = - areContentsTheSame(oldItem, newItem) + override fun areItemsTheSame( + oldItem: AdapterItem, + newItem: AdapterItem, + ) = areContentsTheSame(oldItem, newItem) - override fun areContentsTheSame(oldItem: AdapterItem, newItem: AdapterItem) = - oldItem == newItem + override fun areContentsTheSame( + oldItem: AdapterItem, + newItem: AdapterItem, + ) = oldItem == newItem } sealed class AdapterItem { - data class Device(val device: SyncDevice) : AdapterItem() - data class Tab(val tab: SyncTab) : AdapterItem() + data class Device( + val device: SyncDevice, + ) : AdapterItem() + + data class Tab( + val tab: SyncTab, + ) : AdapterItem() } } diff --git a/app/src/main/java/org/mozilla/reference/browser/tabs/synced/SyncedTabsFragment.kt b/app/src/main/java/org/mozilla/reference/browser/tabs/synced/SyncedTabsFragment.kt index a76aede2b..00d0a61a1 100644 --- a/app/src/main/java/org/mozilla/reference/browser/tabs/synced/SyncedTabsFragment.kt +++ b/app/src/main/java/org/mozilla/reference/browser/tabs/synced/SyncedTabsFragment.kt @@ -24,11 +24,12 @@ class SyncedTabsFragment : Fragment() { inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?, - ): View? { - return inflater.inflate(R.layout.fragment_synced_tabs, container, false) - } + ): View? = inflater.inflate(R.layout.fragment_synced_tabs, container, false) - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated( + view: View, + savedInstanceState: Bundle?, + ) { super.onViewCreated(view, savedInstanceState) val backgroundServices = requireContext().components.backgroundServices diff --git a/app/src/main/java/org/mozilla/reference/browser/tabs/synced/SyncedTabsIntegration.kt b/app/src/main/java/org/mozilla/reference/browser/tabs/synced/SyncedTabsIntegration.kt index 21d41c437..dc4635f48 100644 --- a/app/src/main/java/org/mozilla/reference/browser/tabs/synced/SyncedTabsIntegration.kt +++ b/app/src/main/java/org/mozilla/reference/browser/tabs/synced/SyncedTabsIntegration.kt @@ -27,12 +27,19 @@ class SyncedTabsIntegration( } } -internal class SyncedTabsAccountObserver(private val context: Context) : AccountObserver { - override fun onAuthenticated(account: OAuthAccount, authType: AuthType) { - context.components.backgroundServices.syncedTabsStorage.start() +internal class SyncedTabsAccountObserver( + private val context: Context, +) : AccountObserver { + override fun onAuthenticated( + account: OAuthAccount, + authType: AuthType, + ) { + context.components.backgroundServices.syncedTabsStorage + .start() } override fun onLoggedOut() { - context.components.backgroundServices.syncedTabsStorage.stop() + context.components.backgroundServices.syncedTabsStorage + .stop() } } diff --git a/app/src/main/java/org/mozilla/reference/browser/tabs/synced/SyncedTabsLayout.kt b/app/src/main/java/org/mozilla/reference/browser/tabs/synced/SyncedTabsLayout.kt index aa0f090ea..54180b9cb 100644 --- a/app/src/main/java/org/mozilla/reference/browser/tabs/synced/SyncedTabsLayout.kt +++ b/app/src/main/java/org/mozilla/reference/browser/tabs/synced/SyncedTabsLayout.kt @@ -27,9 +27,9 @@ class SyncedTabsLayout context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0, -) : FrameLayout(context, attrs, defStyleAttr), SyncedTabsView { - - override var listener: SyncedTabsView.Listener? = null +) : FrameLayout(context, attrs, defStyleAttr), + SyncedTabsView { + override var listener: SyncedTabsView.Listener? = null private val adapter = SyncedTabsAdapter { listener?.onTabClicked(it) } @@ -67,7 +67,8 @@ class SyncedTabsLayout syncedTabsList.visibility = View.VISIBLE syncedTabsStatus.visibility = View.GONE - val allDeviceTabs = syncedTabs.filter { + val allDeviceTabs = syncedTabs + .filter { it.tabs.isEmpty() }.flatMap { (device, tabs) -> val deviceTabs = tabs.map { SyncedTabsAdapter.AdapterItem.Tab(it) } diff --git a/app/src/main/java/org/mozilla/reference/browser/tabs/synced/SyncedTabsViewHolder.kt b/app/src/main/java/org/mozilla/reference/browser/tabs/synced/SyncedTabsViewHolder.kt index 5f2ef47cb..b00a150e7 100644 --- a/app/src/main/java/org/mozilla/reference/browser/tabs/synced/SyncedTabsViewHolder.kt +++ b/app/src/main/java/org/mozilla/reference/browser/tabs/synced/SyncedTabsViewHolder.kt @@ -11,17 +11,26 @@ import mozilla.components.browser.storage.sync.Tab import org.mozilla.reference.browser.R import org.mozilla.reference.browser.tabs.synced.SyncedTabsAdapter.AdapterItem -sealed class SyncedTabsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { +sealed class SyncedTabsViewHolder( + itemView: View, +) : RecyclerView.ViewHolder(itemView) { + abstract fun bind( + item: T, + interactor: (Tab) -> Unit, + ) - abstract fun bind(item: T, interactor: (Tab) -> Unit) - - class TabViewHolder(itemView: View) : SyncedTabsViewHolder(itemView) { + class TabViewHolder( + itemView: View, + ) : SyncedTabsViewHolder(itemView) { // See TODO below // private val image = itemView.findViewById(R.id.synced_tabs_item_image) private val title = itemView.findViewById(R.id.synced_tabs_item_title) private val url = itemView.findViewById(R.id.synced_tabs_item_desc) - override fun bind(item: T, interactor: (Tab) -> Unit) { + override fun bind( + item: T, + interactor: (Tab) -> Unit, + ) { bindTab(item as AdapterItem.Tab) itemView.setOnClickListener { @@ -43,10 +52,15 @@ sealed class SyncedTabsViewHolder(itemView: View) : RecyclerView.ViewHolder(item } } - class DeviceViewHolder(itemView: View) : SyncedTabsViewHolder(itemView) { + class DeviceViewHolder( + itemView: View, + ) : SyncedTabsViewHolder(itemView) { private val title = itemView.findViewById(R.id.synced_tabs_group_name) - override fun bind(item: T, interactor: (Tab) -> Unit) { + override fun bind( + item: T, + interactor: (Tab) -> Unit, + ) { bindHeader(item as AdapterItem.Device) } diff --git a/config/detekt-baseline.xml b/config/detekt-baseline.xml index 391bef59a..0353865e0 100644 --- a/config/detekt-baseline.xml +++ b/config/detekt-baseline.xml @@ -61,7 +61,7 @@ UndocumentedPublicClass:WebExtensionActionPopupActivity.kt$WebExtensionActionPopupActivity.WebExtensionActionPopupFragment$Companion UndocumentedPublicClass:WebExtensionPromptFeature.kt$WebExtensionPromptFeature$Companion UndocumentedPublicClass:WebPushEngineIntegration.kt$WebPushEngineIntegration : Observer - UndocumentedPublicFunction:AccountSettingsFragment.kt$AccountSettingsFragment$fun updateLastSyncedTimePref(context: Context, pref: Preference?, failed: Boolean = false) + UndocumentedPublicFunction:AccountSettingsFragment.kt$AccountSettingsFragment$fun updateLastSyncedTimePref( context: Context, pref: Preference?, failed: Boolean = false, ) UndocumentedPublicFunction:Analytics.kt$fun isSentryEnabled() UndocumentedPublicFunction:AutofillPreference.kt$AutofillPreference$fun updateSwitch() UndocumentedPublicFunction:AutofillPreference.kt$AutofillPreference.Companion$fun isSupported(context: Context): Boolean @@ -76,22 +76,22 @@ UndocumentedPublicFunction:CrashIntegration.kt$CrashIntegration$@OptIn(DelicateCoroutinesApi::class) fun sendCrashReport(crash: Crash) UndocumentedPublicFunction:EngineProvider.kt$EngineProvider$@Synchronized fun getOrCreateRuntime(context: Context): GeckoRuntime UndocumentedPublicFunction:EngineProvider.kt$EngineProvider$fun createClient(context: Context): Client - UndocumentedPublicFunction:EngineProvider.kt$EngineProvider$fun createEngine(context: Context, defaultSettings: DefaultSettings): Engine + UndocumentedPublicFunction:EngineProvider.kt$EngineProvider$fun createEngine( context: Context, defaultSettings: DefaultSettings, ): Engine UndocumentedPublicFunction:ExternalAppBrowserFragment.kt$ExternalAppBrowserFragment.Companion$fun create( sessionId: String, manifest: WebAppManifest?, trustedScopes: List<Uri>, ) - UndocumentedPublicFunction:Long.kt$@Suppress("MagicNumber") fun Long.timeSince(context: Context, time: Long): String + UndocumentedPublicFunction:Long.kt$@Suppress("MagicNumber") fun Long.timeSince( context: Context, time: Long, ): String UndocumentedPublicFunction:NotificationManager.kt$NotificationManager$fun checkAndNotifyPolicy(context: Context) UndocumentedPublicFunction:PictureInPictureIntegration.kt$PictureInPictureIntegration$fun onHomePressed() UndocumentedPublicFunction:Settings.kt$Settings$fun getOverrideAmoCollection(context: Context): String UndocumentedPublicFunction:Settings.kt$Settings$fun getOverrideAmoUser(context: Context): String UndocumentedPublicFunction:Settings.kt$Settings$fun isAmoCollectionOverrideConfigured(context: Context): Boolean UndocumentedPublicFunction:Settings.kt$Settings$fun isTelemetryEnabled(context: Context): Boolean - UndocumentedPublicFunction:Settings.kt$Settings$fun setOverrideAmoCollection(context: Context, value: String) - UndocumentedPublicFunction:Settings.kt$Settings$fun setOverrideAmoUser(context: Context, value: String) + UndocumentedPublicFunction:Settings.kt$Settings$fun setOverrideAmoCollection( context: Context, value: String, ) + UndocumentedPublicFunction:Settings.kt$Settings$fun setOverrideAmoUser( context: Context, value: String, ) UndocumentedPublicFunction:SettingsFragment.kt$SettingsFragment.ActionBarUpdater$fun updateTitle(titleResId: Int) UndocumentedPublicFunction:SyncedTabsIntegration.kt$SyncedTabsIntegration$fun launch() - UndocumentedPublicFunction:SyncedTabsViewHolder.kt$SyncedTabsViewHolder$abstract fun <T : AdapterItem> bind(item: T, interactor: (Tab) -> Unit) - UndocumentedPublicFunction:TabsPanel.kt$TabsPanel$fun initialize(tabsFeature: TabsFeature?, updateTabsToolbar: (isPrivate: Boolean) -> Unit) - UndocumentedPublicFunction:TabsToolbar.kt$TabsToolbar$fun initialize(tabsFeature: TabsFeature?, closeTabsTray: () -> Unit) + UndocumentedPublicFunction:SyncedTabsViewHolder.kt$SyncedTabsViewHolder$abstract fun <T : AdapterItem> bind( item: T, interactor: (Tab) -> Unit, ) + UndocumentedPublicFunction:TabsPanel.kt$TabsPanel$fun initialize( tabsFeature: TabsFeature?, updateTabsToolbar: (isPrivate: Boolean) -> Unit, ) + UndocumentedPublicFunction:TabsToolbar.kt$TabsToolbar$fun initialize( tabsFeature: TabsFeature?, closeTabsTray: () -> Unit, ) UndocumentedPublicFunction:TabsToolbar.kt$TabsToolbar$fun updateToolbar(isPrivate: Boolean) UndocumentedPublicFunction:WebPushEngineIntegration.kt$WebPushEngineIntegration$fun start() UndocumentedPublicFunction:WebPushEngineIntegration.kt$WebPushEngineIntegration$fun stop()