[tor-commits] [Git][tpo/applications/fenix][tor-browser-102.2.1-12.5-1] 2 commits: Bug 1816059 - Show the notification for entering fullscreen as a Toast

Richard Pospesel (@richard) git at gitlab.torproject.org
Wed Apr 12 16:41:02 UTC 2023



Richard Pospesel pushed to branch tor-browser-102.2.1-12.5-1 at The Tor Project / Applications / fenix


Commits:
cdaac9f3 by Mugurell at 2023-04-12T16:37:12+00:00
Bug 1816059 - Show the notification for entering fullscreen as a Toast

- - - - -
850f7163 by Alexandru2909 at 2023-04-12T16:37:12+00:00
Add FLAG_SECURE to SearchDialogFragment

- - - - -


3 changed files:

- app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
- app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt
- + app/src/test/java/org/mozilla/fenix/search/SearchDialogFragmentTest.kt


Changes:

=====================================
app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
=====================================
@@ -17,6 +17,7 @@ import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
 import android.view.accessibility.AccessibilityManager
+import android.widget.Toast
 import androidx.annotation.CallSuper
 import androidx.annotation.VisibleForTesting
 import androidx.appcompat.app.AlertDialog
@@ -1381,12 +1382,8 @@ abstract class BaseBrowserFragment :
         if (inFullScreen) {
             // Close find in page bar if opened
             findInPageIntegration.onBackPressed()
-            FenixSnackbar.make(
-                view = binding.dynamicSnackbarContainer,
-                duration = Snackbar.LENGTH_SHORT,
-                isDisplayedWithBrowserToolbar = false
-            )
-                .setText(getString(R.string.full_screen_notification))
+            Toast
+                .makeText(requireContext(), R.string.full_screen_notification, Toast.LENGTH_SHORT)
                 .show()
             activity?.enterToImmersiveMode()
             browserToolbarView.collapse()


=====================================
app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt
=====================================
@@ -78,6 +78,7 @@ import org.mozilla.fenix.databinding.SearchSuggestionsHintBinding
 import org.mozilla.fenix.ext.components
 import org.mozilla.fenix.ext.increaseTapArea
 import org.mozilla.fenix.ext.requireComponents
+import org.mozilla.fenix.ext.secure
 import org.mozilla.fenix.ext.settings
 import org.mozilla.fenix.search.awesomebar.AwesomeBarView
 import org.mozilla.fenix.search.awesomebar.toSearchProviderState
@@ -151,6 +152,10 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler {
             override fun onBackPressed() {
                 this at SearchDialogFragment.onBackPressed()
             }
+        }.apply {
+            if ((requireActivity() as HomeActivity).browsingModeManager.mode.isPrivate) {
+                this.secure(requireActivity())
+            }
         }
     }
 


=====================================
app/src/test/java/org/mozilla/fenix/search/SearchDialogFragmentTest.kt
=====================================
@@ -0,0 +1,212 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.fenix.search
+
+import android.view.WindowManager.LayoutParams
+import androidx.fragment.app.Fragment
+import androidx.navigation.NavBackStackEntry
+import androidx.navigation.NavController
+import androidx.navigation.fragment.findNavController
+import io.mockk.Called
+import io.mockk.Runs
+import io.mockk.every
+import io.mockk.just
+import io.mockk.mockk
+import io.mockk.mockkStatic
+import io.mockk.spyk
+import io.mockk.unmockkStatic
+import io.mockk.verify
+import mozilla.components.browser.state.search.SearchEngine
+import mozilla.components.browser.state.state.SearchState
+import mozilla.components.browser.state.state.searchEngines
+import mozilla.components.browser.state.state.selectedOrDefaultSearchEngine
+import mozilla.components.support.test.robolectric.testContext
+import org.junit.After
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNull
+import org.junit.Assert.assertSame
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mozilla.fenix.HomeActivity
+import org.mozilla.fenix.components.Components
+import org.mozilla.fenix.ext.requireComponents
+import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
+
+ at RunWith(FenixRobolectricTestRunner::class)
+internal class SearchDialogFragmentTest {
+    private val navController: NavController = mockk()
+    private val fragment = SearchDialogFragment()
+
+    @Before
+    fun setup() {
+        mockkStatic("androidx.navigation.fragment.FragmentKt")
+        every { any<Fragment>().findNavController() } returns navController
+    }
+
+    @After
+    fun teardown() {
+        unmockkStatic("androidx.navigation.fragment.FragmentKt")
+    }
+
+    @Test
+    fun `GIVEN this is the only visible fragment WHEN asking for the previous destination THEN return null`() {
+        every { navController.backQueue } returns ArrayDeque(listOf(getDestination(fragmentName)))
+
+        assertNull(fragment.getPreviousDestination())
+    }
+
+    @Test
+    fun `GIVEN this and FragmentB on top of this are visible WHEN asking for the previous destination THEN return null`() {
+        every { navController.backQueue } returns ArrayDeque(
+            listOf(
+                getDestination(fragmentName),
+                getDestination("FragmentB"),
+            ),
+        )
+
+        assertNull(fragment.getPreviousDestination())
+    }
+
+    @Test
+    fun `GIVEN FragmentA, this and FragmentB are visible WHEN asking for the previous destination THEN return FragmentA`() {
+        val fragmentADestination = getDestination("FragmentA")
+        every { navController.backQueue } returns ArrayDeque(
+            listOf(
+                fragmentADestination,
+                getDestination(fragmentName),
+                getDestination("FragmentB"),
+            ),
+        )
+
+        assertSame(fragmentADestination, fragment.getPreviousDestination())
+    }
+
+    @Test
+    fun `GIVEN FragmentA and this on top of it are visible WHEN asking for the previous destination THEN return FragmentA`() {
+        val fragmentADestination = getDestination("FragmentA")
+        every { navController.backQueue } returns ArrayDeque(
+            listOf(
+                fragmentADestination,
+                getDestination(fragmentName),
+            ),
+        )
+
+        assertSame(fragmentADestination, fragment.getPreviousDestination())
+    }
+
+    @Test
+    fun `GIVEN the default search engine is currently selected WHEN checking the need to update the current search engine THEN don't to anything`() {
+        fragment.interactor = mockk()
+        val defaultSearchEngine: SearchEngine = mockk {
+            every { id } returns "default"
+        }
+        val otherSearchEngine: SearchEngine = mockk {
+            every { id } returns "other"
+        }
+        val components: Components = mockk {
+            every { core.store.state.search } returns mockk(relaxed = true) {
+                every { searchEngines } returns listOf(otherSearchEngine, defaultSearchEngine)
+            }
+        }
+        mockkStatic(
+            "org.mozilla.fenix.ext.FragmentKt",
+            "mozilla.components.browser.state.state.SearchStateKt",
+        ) {
+            every { any<Fragment>().requireComponents } returns components
+            every { any<SearchState>().selectedOrDefaultSearchEngine } returns defaultSearchEngine
+
+            fragment.maybeSelectShortcutEngine(defaultSearchEngine.id)
+
+            verify { fragment.interactor wasNot Called }
+        }
+    }
+
+    @Test
+    fun `GIVEN the default search engine is not currently selected WHEN checking the need to update the current search engine THEN update it to the current engine`() {
+        fragment.interactor = mockk {
+            every { onSearchShortcutEngineSelected(any()) } just Runs
+        }
+        val defaultSearchEngine: SearchEngine = mockk {
+            every { id } returns "default"
+        }
+        val otherSearchEngine: SearchEngine = mockk {
+            every { id } returns "other"
+        }
+        val components: Components = mockk {
+            every { core.store.state.search } returns mockk(relaxed = true) {
+                every { searchEngines } returns listOf(otherSearchEngine, defaultSearchEngine)
+            }
+        }
+        mockkStatic(
+            "org.mozilla.fenix.ext.FragmentKt",
+            "mozilla.components.browser.state.state.SearchStateKt",
+        ) {
+            every { any<Fragment>().requireComponents } returns components
+            every { any<SearchState>().selectedOrDefaultSearchEngine } returns defaultSearchEngine
+
+            fragment.maybeSelectShortcutEngine(otherSearchEngine.id)
+
+            verify { fragment.interactor.onSearchShortcutEngineSelected(otherSearchEngine) }
+        }
+    }
+
+    @Test
+    fun `GIVEN the currently selected search engine is unknown WHEN checking the need to update the current search engine THEN don't do anything`() {
+        fragment.interactor = mockk()
+
+        fragment.maybeSelectShortcutEngine(null)
+
+        verify { fragment.interactor wasNot Called }
+    }
+
+    @Test
+    fun `GIVEN app is in private mode WHEN search dialog is created THEN the dialog is secure`() {
+        val activity: HomeActivity = mockk(relaxed = true)
+        val fragment = spyk(SearchDialogFragment())
+        val layoutParams = LayoutParams()
+        layoutParams.flags = LayoutParams.FLAG_SECURE
+
+        every { activity.browsingModeManager.mode.isPrivate } returns true
+        every { activity.window } returns mockk(relaxed = true) {
+            every { attributes } returns LayoutParams().apply { flags = LayoutParams.FLAG_SECURE }
+        }
+        every { fragment.requireActivity() } returns activity
+        every { fragment.requireContext() } returns testContext
+
+        val dialog = fragment.onCreateDialog(null)
+
+        assertEquals(LayoutParams.FLAG_SECURE, dialog.window?.attributes?.flags!! and LayoutParams.FLAG_SECURE)
+    }
+
+    @Test
+    fun `GIVEN app is in normal mode WHEN search dialog is created THEN the dialog is not secure`() {
+        val activity: HomeActivity = mockk(relaxed = true)
+        val fragment = spyk(SearchDialogFragment())
+        val layoutParams = LayoutParams()
+        layoutParams.flags = LayoutParams.FLAG_SECURE
+
+        every { activity.browsingModeManager.mode.isPrivate } returns false
+        every { activity.window } returns mockk(relaxed = true) {
+            every { attributes } returns LayoutParams().apply { flags = LayoutParams.FLAG_SECURE }
+        }
+        every { fragment.requireActivity() } returns activity
+        every { fragment.requireContext() } returns testContext
+
+        val dialog = fragment.onCreateDialog(null)
+
+        assertEquals(0, dialog.window?.attributes?.flags!! and LayoutParams.FLAG_SECURE)
+    }
+}
+
+private val fragmentName = SearchDialogFragment::class.java.canonicalName?.substringAfterLast('.')!!
+
+private fun getDestination(destinationName: String): NavBackStackEntry {
+    return mockk {
+        every { destination } returns mockk {
+            every { displayName } returns "test.id/$destinationName"
+        }
+    }
+}



View it on GitLab: https://gitlab.torproject.org/tpo/applications/fenix/-/compare/5c26f2353ef1ae1756cfee563db6f06614a76bd4...850f716365ea560abd2fd2706d4f66e383227556

-- 
View it on GitLab: https://gitlab.torproject.org/tpo/applications/fenix/-/compare/5c26f2353ef1ae1756cfee563db6f06614a76bd4...850f716365ea560abd2fd2706d4f66e383227556
You're receiving this email because of your account on gitlab.torproject.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.torproject.org/pipermail/tor-commits/attachments/20230412/7ecc1b30/attachment-0001.htm>


More information about the tor-commits mailing list