From 0572cab97c9e1e6b83c6e553f97531940b0cf38b Mon Sep 17 00:00:00 2001 From: "codrut.topliceanu" Date: Fri, 4 Jun 2021 17:56:09 +0300 Subject: [PATCH] For #19738 - Secure mode enabled in private tabs tray Prevents screenshots while tabs tray with private tabs page is open. --- .../fenix/tabstray/SecureTabsTrayBinding.kt | 42 +++++++++++++++++++ .../fenix/tabstray/TabsTrayFragment.kt | 11 +++++ 2 files changed, 53 insertions(+) create mode 100644 app/src/main/java/org/mozilla/fenix/tabstray/SecureTabsTrayBinding.kt diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/SecureTabsTrayBinding.kt b/app/src/main/java/org/mozilla/fenix/tabstray/SecureTabsTrayBinding.kt new file mode 100644 index 0000000000..b4c2e987b2 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/tabstray/SecureTabsTrayBinding.kt @@ -0,0 +1,42 @@ +/* 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.tabstray + +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.map +import mozilla.components.lib.state.helpers.AbstractBinding +import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifAnyChanged +import org.mozilla.fenix.ext.removeSecure +import org.mozilla.fenix.ext.secure +import org.mozilla.fenix.utils.Settings + +/** + * Sets TabsTrayFragment flags to secure when private tabs list is selected. + */ +@OptIn(ExperimentalCoroutinesApi::class) +class SecureTabsTrayBinding( + store: TabsTrayStore, + private val settings: Settings, + private val tabsTrayFragment: TabsTrayFragment +) : AbstractBinding(store) { + + override suspend fun onState(flow: Flow) { + flow.map { it } + .ifAnyChanged { state -> + arrayOf( + state.selectedPage + ) + } + .collect { state -> + if (state.selectedPage == Page.PrivateTabs) { + tabsTrayFragment.secure() + } else if (!settings.lastKnownMode.isPrivate) { + tabsTrayFragment.removeSecure() + } + } + } +} diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt index a8e4fb9ca2..a85565df4a 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt @@ -72,6 +72,7 @@ class TabsTrayFragment : AppCompatDialogFragment() { private val selectionBannerBinding = ViewBoundFeatureWrapper() private val selectionHandleBinding = ViewBoundFeatureWrapper() private val tabsTrayCtaBinding = ViewBoundFeatureWrapper() + private val secureTabsTrayBinding = ViewBoundFeatureWrapper() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -267,6 +268,16 @@ class TabsTrayFragment : AppCompatDialogFragment() { owner = this, view = view ) + + secureTabsTrayBinding.set( + feature = SecureTabsTrayBinding( + store = tabsTrayStore, + settings = requireComponents.settings, + tabsTrayFragment = this + ), + owner = this, + view = view + ) } @VisibleForTesting