diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/TemporaryScreenshotSecurity.kt b/app/src/main/java/org/thoughtcrime/securesms/components/TemporaryScreenshotSecurity.kt new file mode 100644 index 0000000000..7736c12295 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/components/TemporaryScreenshotSecurity.kt @@ -0,0 +1,52 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.components + +import android.view.WindowManager +import androidx.activity.ComponentActivity +import androidx.fragment.app.Fragment +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner +import org.thoughtcrime.securesms.util.TextSecurePreferences + +/** + * Applies temporary screenshot security for the given component lifecycle. + */ +object TemporaryScreenshotSecurity { + + @JvmStatic + fun bindToViewLifecycleOwner(fragment: Fragment) { + val observer = LifecycleObserver { fragment.requireActivity() } + + fragment.viewLifecycleOwner.lifecycle.addObserver(observer) + } + + @JvmStatic + fun bind(activity: ComponentActivity) { + val observer = LifecycleObserver { activity } + + activity.lifecycle.addObserver(observer) + } + + private class LifecycleObserver( + private val activityProvider: () -> ComponentActivity + ) : DefaultLifecycleObserver { + + override fun onStart(owner: LifecycleOwner) { + val activity = activityProvider() + if (!TextSecurePreferences.isScreenSecurityEnabled(activity)) { + activity.window.addFlags(WindowManager.LayoutParams.FLAG_SECURE) + } + } + + override fun onStop(owner: LifecycleOwner) { + val activity = activityProvider() + if (!TextSecurePreferences.isScreenSecurityEnabled(activity)) { + activity.window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE) + } + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/card/CreditCardFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/card/CreditCardFragment.kt index ac9e226cf5..31672af480 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/card/CreditCardFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/card/CreditCardFragment.kt @@ -3,7 +3,6 @@ package org.thoughtcrime.securesms.components.settings.app.subscription.donate.c import android.content.Context import android.os.Bundle import android.view.View -import android.view.WindowManager import android.view.inputmethod.EditorInfo import androidx.annotation.StringRes import androidx.core.content.ContextCompat @@ -18,6 +17,7 @@ import androidx.navigation.navGraphViewModels import org.signal.core.util.concurrent.LifecycleDisposable import org.signal.core.util.getParcelableCompat import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.components.TemporaryScreenshotSecurity import org.thoughtcrime.securesms.components.ViewBinderDelegate import org.thoughtcrime.securesms.components.settings.app.subscription.DonationPaymentComponent import org.thoughtcrime.securesms.components.settings.app.subscription.donate.DonateToSignalType @@ -29,7 +29,6 @@ import org.thoughtcrime.securesms.components.settings.app.subscription.donate.st import org.thoughtcrime.securesms.components.settings.app.subscription.errors.DonationErrorSource import org.thoughtcrime.securesms.databinding.CreditCardFragmentBinding import org.thoughtcrime.securesms.payments.FiatMoneyUtil -import org.thoughtcrime.securesms.util.TextSecurePreferences import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.fragments.requireListener import org.thoughtcrime.securesms.util.navigation.safeNavigate @@ -48,6 +47,8 @@ class CreditCardFragment : Fragment(R.layout.credit_card_fragment) { ) override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + TemporaryScreenshotSecurity.bindToViewLifecycleOwner(this) + val errorSource: DonationErrorSource = when (args.request.donateToSignalType) { DonateToSignalType.ONE_TIME -> DonationErrorSource.BOOST DonateToSignalType.MONTHLY -> DonationErrorSource.SUBSCRIPTION @@ -140,13 +141,6 @@ class CreditCardFragment : Fragment(R.layout.credit_card_fragment) { } } - override fun onStart() { - super.onStart() - if (!TextSecurePreferences.isScreenSecurityEnabled(requireContext())) { - requireActivity().window.addFlags(WindowManager.LayoutParams.FLAG_SECURE) - } - } - override fun onResume() { super.onResume() @@ -158,13 +152,6 @@ class CreditCardFragment : Fragment(R.layout.credit_card_fragment) { } } - override fun onStop() { - super.onStop() - if (!TextSecurePreferences.isScreenSecurityEnabled(requireContext())) { - requireActivity().window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE) - } - } - private fun presentContinue(state: CreditCardValidationState) { binding.continueButton.isEnabled = state.isValid } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/details/BankTransferDetailsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/details/BankTransferDetailsFragment.kt index 0745ddc897..f40fa5ecd0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/details/BankTransferDetailsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/details/BankTransferDetailsFragment.kt @@ -5,6 +5,8 @@ package org.thoughtcrime.securesms.components.settings.app.subscription.donate.transfer.details +import android.os.Bundle +import android.view.View import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.defaultMinSize @@ -46,6 +48,7 @@ import org.signal.core.ui.Scaffolds import org.signal.core.ui.Texts import org.signal.core.ui.theme.SignalTheme import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.components.TemporaryScreenshotSecurity import org.thoughtcrime.securesms.components.settings.app.subscription.DonationPaymentComponent import org.thoughtcrime.securesms.components.settings.app.subscription.donate.DonateToSignalType import org.thoughtcrime.securesms.components.settings.app.subscription.donate.DonationProcessorAction @@ -71,6 +74,10 @@ class BankTransferDetailsFragment : ComposeFragment() { } ) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + TemporaryScreenshotSecurity.bindToViewLifecycleOwner(this) + } + @Composable override fun FragmentContent() { val state: BankTransferDetailsState by viewModel.state