ma1 pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android
Commits:
-
af11e480
by t-p-white at 2023-12-14T20:08:19+01:00
-
068e68e8
by Tarik Eshaq at 2023-12-14T20:09:55+01:00
9 changed files:
- + android-components/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/dialog/FullScreenNotificationDialog.kt
- android-components/components/feature/sitepermissions/src/main/java/mozilla/components/feature/sitepermissions/SitePermissionsFeature.kt
- fenix/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
- fenix/app/src/main/java/org/mozilla/fenix/push/WebPushEngineIntegration.kt
- + fenix/app/src/main/res/layout/full_screen_notification_dialog.xml
- focus-android/app/src/main/java/org/mozilla/focus/browser/integration/FullScreenIntegration.kt
- focus-android/app/src/main/java/org/mozilla/focus/fragment/BrowserFragment.kt
- + focus-android/app/src/main/res/layout/dialog_full_screen_notification.xml
- focus-android/app/src/test/java/org/mozilla/focus/browser/integration/FullScreenIntegrationTest.kt
Changes:
1 | +/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2 | + * License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3 | + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
4 | + |
|
5 | +package mozilla.components.feature.prompts.dialog
|
|
6 | + |
|
7 | +import android.app.Dialog
|
|
8 | +import android.os.Bundle
|
|
9 | +import android.view.Gravity
|
|
10 | +import android.view.WindowManager
|
|
11 | +import androidx.annotation.LayoutRes
|
|
12 | +import androidx.appcompat.app.AlertDialog
|
|
13 | +import androidx.fragment.app.DialogFragment
|
|
14 | +import androidx.fragment.app.FragmentManager
|
|
15 | +import androidx.lifecycle.lifecycleScope
|
|
16 | +import kotlinx.coroutines.delay
|
|
17 | +import kotlinx.coroutines.launch
|
|
18 | + |
|
19 | +private const val TAG = "mozac_feature_prompts_full_screen_notification_dialog"
|
|
20 | +private const val SNACKBAR_DURATION_LONG_MS = 3000L
|
|
21 | + |
|
22 | +/**
|
|
23 | + * UI to show a 'full screen mode' notification.
|
|
24 | + */
|
|
25 | +interface FullScreenNotification {
|
|
26 | + /**
|
|
27 | + * Show the notification.
|
|
28 | + *
|
|
29 | + * @param fragmentManager the [FragmentManager] to add this notification to.
|
|
30 | + */
|
|
31 | + fun show(fragmentManager: FragmentManager)
|
|
32 | +}
|
|
33 | + |
|
34 | +/**
|
|
35 | + * [DialogFragment] that is configured to match the style and behaviour of a Snackbar.
|
|
36 | + *
|
|
37 | + * @property layout the layout to use for the dialog.
|
|
38 | + */
|
|
39 | +class FullScreenNotificationDialog(@LayoutRes val layout: Int) :
|
|
40 | + DialogFragment(), FullScreenNotification {
|
|
41 | + override fun show(fragmentManager: FragmentManager) = super.show(fragmentManager, TAG)
|
|
42 | + |
|
43 | + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = requireActivity().let {
|
|
44 | + val view = layoutInflater.inflate(layout, null)
|
|
45 | + AlertDialog.Builder(it).setView(view).create()
|
|
46 | + }
|
|
47 | + |
|
48 | + override fun onStart() {
|
|
49 | + super.onStart()
|
|
50 | + |
|
51 | + dialog?.let { dialog ->
|
|
52 | + dialog.window?.let { window ->
|
|
53 | + // Prevent any user input from key or other button events to it.
|
|
54 | + window.setFlags(
|
|
55 | + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
|
|
56 | + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
|
|
57 | + )
|
|
58 | + |
|
59 | + window.setGravity(Gravity.BOTTOM)
|
|
60 | + window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
|
|
61 | + }
|
|
62 | + |
|
63 | + lifecycleScope.launch {
|
|
64 | + delay(SNACKBAR_DURATION_LONG_MS)
|
|
65 | + dismiss()
|
|
66 | + }
|
|
67 | + }
|
|
68 | + }
|
|
69 | +} |
... | ... | @@ -70,7 +70,9 @@ import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifChanged |
70 | 70 | import java.security.InvalidParameterException
|
71 | 71 | import mozilla.components.ui.icons.R as iconsR
|
72 | 72 | |
73 | -internal const val FRAGMENT_TAG = "mozac_feature_sitepermissions_prompt_dialog"
|
|
73 | +internal const val PROMPT_FRAGMENT_TAG = "mozac_feature_sitepermissions_prompt_dialog"
|
|
74 | + |
|
75 | +private const val FULL_SCREEN_NOTIFICATION_TAG = "mozac_feature_prompts_full_screen_notification_dialog"
|
|
74 | 76 | |
75 | 77 | @VisibleForTesting
|
76 | 78 | internal const val STORAGE_ACCESS_DOCUMENTATION_URL =
|
... | ... | @@ -124,7 +126,7 @@ class SitePermissionsFeature( |
124 | 126 | private var loadingScope: CoroutineScope? = null
|
125 | 127 | |
126 | 128 | override fun start() {
|
127 | - fragmentManager.findFragmentByTag(FRAGMENT_TAG)?.let { fragment ->
|
|
129 | + fragmentManager.findFragmentByTag(PROMPT_FRAGMENT_TAG)?.let { fragment ->
|
|
128 | 130 | // There's still a [SitePermissionsDialogFragment] visible from the last time. Re-attach
|
129 | 131 | // this feature so that the fragment can invoke the callback on this feature once the user
|
130 | 132 | // makes a selection. This can happen when the app was in the background and on resume
|
... | ... | @@ -439,8 +441,16 @@ class SitePermissionsFeature( |
439 | 441 | } else {
|
440 | 442 | handleNoRuledFlow(permissionFromStorage, permissionRequest, origin)
|
441 | 443 | }
|
442 | - prompt?.show(fragmentManager, FRAGMENT_TAG)
|
|
443 | - return prompt
|
|
444 | + |
|
445 | + val fullScreenNotificationDisplayed =
|
|
446 | + fragmentManager.fragments.any { fragment -> fragment.tag == FULL_SCREEN_NOTIFICATION_TAG }
|
|
447 | + |
|
448 | + return if (fullScreenNotificationDisplayed || prompt == null) {
|
|
449 | + null
|
|
450 | + } else {
|
|
451 | + prompt.show(fragmentManager, PROMPT_FRAGMENT_TAG)
|
|
452 | + prompt
|
|
453 | + }
|
|
444 | 454 | }
|
445 | 455 | |
446 | 456 | @VisibleForTesting
|
... | ... | @@ -17,7 +17,6 @@ import android.view.LayoutInflater |
17 | 17 | import android.view.View
|
18 | 18 | import android.view.ViewGroup
|
19 | 19 | import android.view.accessibility.AccessibilityManager
|
20 | -import android.widget.Toast
|
|
21 | 20 | import androidx.activity.result.ActivityResultLauncher
|
22 | 21 | import androidx.annotation.CallSuper
|
23 | 22 | import androidx.annotation.VisibleForTesting
|
... | ... | @@ -74,6 +73,7 @@ import mozilla.components.feature.prompts.PromptFeature |
74 | 73 | import mozilla.components.feature.prompts.PromptFeature.Companion.PIN_REQUEST
|
75 | 74 | import mozilla.components.feature.prompts.address.AddressDelegate
|
76 | 75 | import mozilla.components.feature.prompts.creditcard.CreditCardDelegate
|
76 | +import mozilla.components.feature.prompts.dialog.FullScreenNotificationDialog
|
|
77 | 77 | import mozilla.components.feature.prompts.login.LoginDelegate
|
78 | 78 | import mozilla.components.feature.prompts.share.ShareDelegate
|
79 | 79 | import mozilla.components.feature.readerview.ReaderViewFeature
|
... | ... | @@ -1465,10 +1465,11 @@ abstract class BaseBrowserFragment : |
1465 | 1465 | if (inFullScreen) {
|
1466 | 1466 | // Close find in page bar if opened
|
1467 | 1467 | findInPageIntegration.onBackPressed()
|
1468 | - Toast
|
|
1469 | - .makeText(requireContext(), R.string.full_screen_notification, Toast.LENGTH_SHORT)
|
|
1470 | - .show()
|
|
1471 | - activity?.enterToImmersiveMode()
|
|
1468 | + |
|
1469 | + FullScreenNotificationDialog(R.layout.full_screen_notification_dialog).show(
|
|
1470 | + parentFragmentManager,
|
|
1471 | + )
|
|
1472 | + |
|
1472 | 1473 | (view as? SwipeGestureLayout)?.isSwipeEnabled = false
|
1473 | 1474 | browserToolbarView.collapse()
|
1474 | 1475 | browserToolbarView.view.isVisible = false
|
... | ... | @@ -58,8 +58,6 @@ internal class WebPushEngineDelegate( |
58 | 58 | private val logger = Logger("WebPushEngineDelegate")
|
59 | 59 | |
60 | 60 | override fun onGetSubscription(scope: String, onSubscription: (WebPushSubscription?) -> Unit) {
|
61 | - // We don't have the appServerKey unless an app is creating a new subscription so we
|
|
62 | - // allow the key to be null since it won't be overridden from a previous subscription.
|
|
63 | 61 | pushFeature.getSubscription(scope) {
|
64 | 62 | onSubscription(it?.toEnginePushSubscription())
|
65 | 63 | }
|
... | ... | @@ -72,9 +70,7 @@ internal class WebPushEngineDelegate( |
72 | 70 | ) {
|
73 | 71 | pushFeature.subscribe(
|
74 | 72 | scope = scope,
|
75 | - // See the full note at the implementation of `toEnginePushSubscription`.
|
|
76 | - // Issue: https://github.com/mozilla/application-services/issues/2698
|
|
77 | - appServerKey = null,
|
|
73 | + appServerKey = serverKey?.toEncodedBase64String(),
|
|
78 | 74 | onSubscribeError = {
|
79 | 75 | logger.error("Error on push onSubscribe.")
|
80 | 76 | onSubscribe(null)
|
... | ... | @@ -104,13 +100,12 @@ internal fun AutoPushSubscription.toEnginePushSubscription() = WebPushSubscripti |
104 | 100 | publicKey = this.publicKey.toDecodedByteArray(),
|
105 | 101 | endpoint = this.endpoint,
|
106 | 102 | authSecret = this.authKey.toDecodedByteArray(),
|
107 | - // We don't send the `serverKey` because the code path from that will query
|
|
108 | - // the push database for this key, which leads to an exception thrown.
|
|
109 | - // Our workaround for now is to not put the server key in to begin with (which
|
|
110 | - // will probably break a lot of sites).
|
|
111 | - // See: https://github.com/mozilla/application-services/issues/2698
|
|
103 | + // We don't have the appServerKey unless an app is creating a new subscription so we
|
|
104 | + // allow the key to be null since it won't be overridden from a previous subscription.
|
|
112 | 105 | appServerKey = null,
|
113 | 106 | )
|
114 | 107 | |
115 | 108 | private fun String.toDecodedByteArray() =
|
116 | 109 | Base64.decode(this.toByteArray(), Base64.URL_SAFE or Base64.NO_PADDING or Base64.NO_WRAP)
|
110 | +private fun ByteArray.toEncodedBase64String() =
|
|
111 | + Base64.encodeToString(this, Base64.URL_SAFE or Base64.NO_PADDING or Base64.NO_WRAP) |
1 | +<?xml version="1.0" encoding="utf-8"?>
|
|
2 | +<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
|
3 | + - License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4 | + - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
|
5 | + |
|
6 | +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
7 | + xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
8 | + xmlns:tools="http://schemas.android.com/tools"
|
|
9 | + android:id="@+id/full_screen_notification"
|
|
10 | + android:layout_width="match_parent"
|
|
11 | + android:layout_height="wrap_content"
|
|
12 | + android:layout_margin="8dp"
|
|
13 | + android:background="@drawable/fenix_snackbar_background"
|
|
14 | + android:elevation="4dp"
|
|
15 | + android:minHeight="48dp"
|
|
16 | + android:orientation="horizontal"
|
|
17 | + android:paddingStart="16dp"
|
|
18 | + android:paddingEnd="16dp">
|
|
19 | + |
|
20 | + <TextView
|
|
21 | + android:id="@+id/full_screen_notification_text"
|
|
22 | + android:layout_width="0dp"
|
|
23 | + android:layout_height="wrap_content"
|
|
24 | + android:ellipsize="end"
|
|
25 | + android:letterSpacing="0.05"
|
|
26 | + android:maxLines="2"
|
|
27 | + android:minHeight="46dp"
|
|
28 | + android:paddingTop="8dp"
|
|
29 | + android:paddingBottom="8dp"
|
|
30 | + android:text="@string/full_screen_notification"
|
|
31 | + android:textAlignment="textStart"
|
|
32 | + android:textColor="@color/photonWhite"
|
|
33 | + android:textSize="18sp"
|
|
34 | + app:layout_constraintBottom_toBottomOf="parent"
|
|
35 | + app:layout_constraintEnd_toEndOf="parent"
|
|
36 | + app:layout_constraintStart_toStartOf="parent"
|
|
37 | + app:layout_constraintTop_toTopOf="parent"
|
|
38 | + tools:text="@string/full_screen_notification" />
|
|
39 | + |
|
40 | +</androidx.constraintlayout.widget.ConstraintLayout> |
... | ... | @@ -7,12 +7,14 @@ package org.mozilla.focus.browser.integration |
7 | 7 | import android.app.Activity
|
8 | 8 | import android.os.Build
|
9 | 9 | import android.view.View
|
10 | -import android.widget.Toast
|
|
11 | 10 | import androidx.annotation.VisibleForTesting
|
12 | 11 | import androidx.core.view.isVisible
|
12 | +import androidx.fragment.app.FragmentManager
|
|
13 | 13 | import mozilla.components.browser.state.store.BrowserStore
|
14 | 14 | import mozilla.components.browser.toolbar.BrowserToolbar
|
15 | 15 | import mozilla.components.concept.engine.EngineView
|
16 | +import mozilla.components.feature.prompts.dialog.FullScreenNotification
|
|
17 | +import mozilla.components.feature.prompts.dialog.FullScreenNotificationDialog
|
|
16 | 18 | import mozilla.components.feature.session.FullScreenFeature
|
17 | 19 | import mozilla.components.feature.session.SessionUseCases
|
18 | 20 | import mozilla.components.support.base.feature.LifecycleAwareFeature
|
... | ... | @@ -26,6 +28,7 @@ import org.mozilla.focus.ext.hide |
26 | 28 | import org.mozilla.focus.ext.showAsFixed
|
27 | 29 | import org.mozilla.focus.utils.Settings
|
28 | 30 | |
31 | +@Suppress("LongParameterList")
|
|
29 | 32 | class FullScreenIntegration(
|
30 | 33 | val activity: Activity,
|
31 | 34 | val store: BrowserStore,
|
... | ... | @@ -35,6 +38,7 @@ class FullScreenIntegration( |
35 | 38 | private val toolbarView: BrowserToolbar,
|
36 | 39 | private val statusBar: View,
|
37 | 40 | private val engineView: EngineView,
|
41 | + private val parentFragmentManager: FragmentManager,
|
|
38 | 42 | ) : LifecycleAwareFeature, UserInteractionHandler {
|
39 | 43 | @VisibleForTesting
|
40 | 44 | internal var feature = FullScreenFeature(
|
... | ... | @@ -54,14 +58,16 @@ class FullScreenIntegration( |
54 | 58 | }
|
55 | 59 | |
56 | 60 | @VisibleForTesting
|
57 | - internal fun fullScreenChanged(enabled: Boolean) {
|
|
61 | + internal fun fullScreenChanged(
|
|
62 | + enabled: Boolean,
|
|
63 | + fullScreenNotification: FullScreenNotification =
|
|
64 | + FullScreenNotificationDialog(R.layout.dialog_full_screen_notification),
|
|
65 | + ) {
|
|
58 | 66 | if (enabled) {
|
59 | 67 | enterBrowserFullscreen()
|
60 | 68 | statusBar.isVisible = false
|
61 | 69 | |
62 | - Toast
|
|
63 | - .makeText(activity, R.string.full_screen_notification, Toast.LENGTH_SHORT)
|
|
64 | - .show()
|
|
70 | + fullScreenNotification.show(parentFragmentManager)
|
|
65 | 71 | |
66 | 72 | switchToImmersiveMode()
|
67 | 73 | } else {
|
... | ... | @@ -272,6 +272,7 @@ class BrowserFragment : |
272 | 272 | binding.browserToolbar,
|
273 | 273 | binding.statusBarBackground,
|
274 | 274 | binding.engineView,
|
275 | + parentFragmentManager,
|
|
275 | 276 | ),
|
276 | 277 | this,
|
277 | 278 | view,
|
1 | +<?xml version="1.0" encoding="utf-8"?>
|
|
2 | +<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
|
3 | + - License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4 | + - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
|
5 | + |
|
6 | +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
7 | + xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
8 | + xmlns:tools="http://schemas.android.com/tools"
|
|
9 | + android:id="@+id/full_screen_notification_layout"
|
|
10 | + android:layout_width="match_parent"
|
|
11 | + android:layout_height="match_parent"
|
|
12 | + android:layout_margin="8dp"
|
|
13 | + android:background="@drawable/focus_snackbar_background"
|
|
14 | + android:elevation="4dp"
|
|
15 | + android:minHeight="48dp"
|
|
16 | + android:orientation="horizontal"
|
|
17 | + android:paddingStart="16dp"
|
|
18 | + android:paddingEnd="16dp">
|
|
19 | + |
|
20 | + <TextView
|
|
21 | + android:id="@+id/full_screen_notification_text"
|
|
22 | + android:layout_width="0dp"
|
|
23 | + android:layout_height="wrap_content"
|
|
24 | + android:ellipsize="end"
|
|
25 | + android:letterSpacing="0.05"
|
|
26 | + android:maxLines="2"
|
|
27 | + android:paddingTop="8dp"
|
|
28 | + android:paddingBottom="8dp"
|
|
29 | + android:text="@string/full_screen_notification"
|
|
30 | + android:textAlignment="textStart"
|
|
31 | + android:textColor="@color/snackbarTextColor"
|
|
32 | + android:textSize="14sp"
|
|
33 | + app:layout_constraintBottom_toBottomOf="parent"
|
|
34 | + app:layout_constraintEnd_toEndOf="parent"
|
|
35 | + app:layout_constraintStart_toStartOf="parent"
|
|
36 | + app:layout_constraintTop_toTopOf="parent"
|
|
37 | + tools:text="@string/full_screen_notification" />
|
|
38 | +</androidx.constraintlayout.widget.ConstraintLayout> |
... | ... | @@ -12,11 +12,11 @@ import android.view.WindowManager |
12 | 12 | import androidx.core.view.isVisible
|
13 | 13 | import mozilla.components.browser.engine.gecko.GeckoEngineView
|
14 | 14 | import mozilla.components.browser.toolbar.BrowserToolbar
|
15 | +import mozilla.components.feature.prompts.dialog.FullScreenNotification
|
|
15 | 16 | import mozilla.components.feature.session.FullScreenFeature
|
16 | 17 | import mozilla.components.support.test.any
|
17 | 18 | import mozilla.components.support.test.mock
|
18 | 19 | import mozilla.components.support.test.robolectric.testContext
|
19 | -import org.junit.Assert.assertNotNull
|
|
20 | 20 | import org.junit.Test
|
21 | 21 | import org.junit.jupiter.api.Assertions.assertEquals
|
22 | 22 | import org.junit.runner.RunWith
|
... | ... | @@ -26,7 +26,6 @@ import org.mockito.Mockito.never |
26 | 26 | import org.mockito.Mockito.spy
|
27 | 27 | import org.mockito.Mockito.times
|
28 | 28 | import org.mockito.Mockito.verify
|
29 | -import org.mozilla.focus.R
|
|
30 | 29 | import org.mozilla.focus.ext.disableDynamicBehavior
|
31 | 30 | import org.mozilla.focus.ext.enableDynamicBehavior
|
32 | 31 | import org.mozilla.focus.ext.hide
|
... | ... | @@ -34,7 +33,6 @@ import org.mozilla.focus.ext.showAsFixed |
34 | 33 | import org.mozilla.focus.utils.Settings
|
35 | 34 | import org.robolectric.Robolectric
|
36 | 35 | import org.robolectric.RobolectricTestRunner
|
37 | -import org.robolectric.shadows.ShadowToast
|
|
38 | 36 | |
39 | 37 | @RunWith(RobolectricTestRunner::class)
|
40 | 38 | internal class FullScreenIntegrationTest {
|
... | ... | @@ -50,6 +48,7 @@ internal class FullScreenIntegrationTest { |
50 | 48 | mock(),
|
51 | 49 | mock(),
|
52 | 50 | mock(),
|
51 | + mock(),
|
|
53 | 52 | ).apply {
|
54 | 53 | this.feature = feature
|
55 | 54 | }
|
... | ... | @@ -71,6 +70,7 @@ internal class FullScreenIntegrationTest { |
71 | 70 | mock(),
|
72 | 71 | mock(),
|
73 | 72 | mock(),
|
73 | + mock(),
|
|
74 | 74 | ).apply {
|
75 | 75 | this.feature = feature
|
76 | 76 | }
|
... | ... | @@ -92,6 +92,7 @@ internal class FullScreenIntegrationTest { |
92 | 92 | mock(),
|
93 | 93 | mock(),
|
94 | 94 | mock(),
|
95 | + mock(),
|
|
95 | 96 | ).apply {
|
96 | 97 | this.feature = feature
|
97 | 98 | }
|
... | ... | @@ -117,6 +118,7 @@ internal class FullScreenIntegrationTest { |
117 | 118 | mock(),
|
118 | 119 | mock(),
|
119 | 120 | mock(),
|
121 | + mock(),
|
|
120 | 122 | )
|
121 | 123 | |
122 | 124 | integration.viewportFitChanged(33)
|
... | ... | @@ -141,6 +143,7 @@ internal class FullScreenIntegrationTest { |
141 | 143 | mock(),
|
142 | 144 | mock(),
|
143 | 145 | mock(),
|
146 | + mock(),
|
|
144 | 147 | )
|
145 | 148 | |
146 | 149 | integration.switchToImmersiveMode()
|
... | ... | @@ -169,6 +172,7 @@ internal class FullScreenIntegrationTest { |
169 | 172 | mock(),
|
170 | 173 | mock(),
|
171 | 174 | mock(),
|
175 | + mock(),
|
|
172 | 176 | )
|
173 | 177 | |
174 | 178 | integration.exitImmersiveMode()
|
... | ... | @@ -195,6 +199,7 @@ internal class FullScreenIntegrationTest { |
195 | 199 | toolbar,
|
196 | 200 | mock(),
|
197 | 201 | engineView,
|
202 | + mock(),
|
|
198 | 203 | )
|
199 | 204 | |
200 | 205 | integration.enterBrowserFullscreen()
|
... | ... | @@ -220,6 +225,7 @@ internal class FullScreenIntegrationTest { |
220 | 225 | toolbar,
|
221 | 226 | mock(),
|
222 | 227 | engineView,
|
228 | + mock(),
|
|
223 | 229 | )
|
224 | 230 | |
225 | 231 | integration.enterBrowserFullscreen()
|
... | ... | @@ -250,6 +256,7 @@ internal class FullScreenIntegrationTest { |
250 | 256 | toolbar,
|
251 | 257 | mock(),
|
252 | 258 | engineView,
|
259 | + mock(),
|
|
253 | 260 | )
|
254 | 261 | |
255 | 262 | integration.exitBrowserFullscreen()
|
... | ... | @@ -278,6 +285,7 @@ internal class FullScreenIntegrationTest { |
278 | 285 | toolbar,
|
279 | 286 | mock(),
|
280 | 287 | engineView,
|
288 | + mock(),
|
|
281 | 289 | )
|
282 | 290 | |
283 | 291 | integration.exitBrowserFullscreen()
|
... | ... | @@ -308,21 +316,17 @@ internal class FullScreenIntegrationTest { |
308 | 316 | toolbar,
|
309 | 317 | statusBar,
|
310 | 318 | engineView,
|
319 | + mock(),
|
|
311 | 320 | ),
|
312 | 321 | )
|
313 | 322 | |
314 | - integration.fullScreenChanged(true)
|
|
323 | + val fullScreenNotification = mock<FullScreenNotification>()
|
|
324 | + integration.fullScreenChanged(true, fullScreenNotification)
|
|
315 | 325 | |
316 | 326 | verify(integration).enterBrowserFullscreen()
|
317 | - verify(integration).switchToImmersiveMode()
|
|
318 | 327 | verify(statusBar).isVisible = false
|
319 | - |
|
320 | - val toast = ShadowToast.getTextOfLatestToast()
|
|
321 | - assertNotNull(toast)
|
|
322 | - assertEquals(
|
|
323 | - testContext.getString(R.string.full_screen_notification),
|
|
324 | - toast,
|
|
325 | - )
|
|
328 | + verify(fullScreenNotification).show(any())
|
|
329 | + verify(integration).switchToImmersiveMode()
|
|
326 | 330 | }
|
327 | 331 | |
328 | 332 | @Test
|
... | ... | @@ -352,6 +356,7 @@ internal class FullScreenIntegrationTest { |
352 | 356 | toolbar,
|
353 | 357 | statusBar,
|
354 | 358 | engineView,
|
359 | + mock(),
|
|
355 | 360 | ),
|
356 | 361 | )
|
357 | 362 |