diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/android/MailboxNotificationManager.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/MailboxNotificationManager.kt index 6a995cde61ed9e1b4ec6d593b9bc0b705c777644..3e97c4c07361cfd76db91c4566c0b3068a17934c 100644 --- a/mailbox-android/src/main/java/org/briarproject/mailbox/android/MailboxNotificationManager.kt +++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/MailboxNotificationManager.kt @@ -36,13 +36,16 @@ import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import org.briarproject.mailbox.R -import org.briarproject.mailbox.android.StatusManager.AfterRunning import org.briarproject.mailbox.android.StatusManager.ErrorClockSkew import org.briarproject.mailbox.android.StatusManager.ErrorNoNetwork import org.briarproject.mailbox.android.StatusManager.MailboxAppState +import org.briarproject.mailbox.android.StatusManager.NotStarted import org.briarproject.mailbox.android.StatusManager.StartedSettingUp import org.briarproject.mailbox.android.StatusManager.StartedSetupComplete import org.briarproject.mailbox.android.StatusManager.Starting +import org.briarproject.mailbox.android.StatusManager.Stopped +import org.briarproject.mailbox.android.StatusManager.Stopping +import org.briarproject.mailbox.android.StatusManager.Wiping import org.briarproject.mailbox.android.ui.MainActivity import javax.inject.Inject import javax.inject.Singleton @@ -110,7 +113,8 @@ class MailboxNotificationManager @Inject constructor( setContentTitle(ctx.getString(R.string.notification_mailbox_title_offline)) setContentText(ctx.getString(R.string.notification_mailbox_content_clock_skew)) } - AfterRunning -> error("No notifications when lifecycle not running") + NotStarted, Stopping, Stopped, Wiping -> + error("No notifications when lifecycle not running") } setSmallIcon(R.drawable.ic_notification_foreground) setContentIntent(pendingIntent) diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/android/StatusManager.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/StatusManager.kt index 8e8f2c2d6d936510aca427656d77296015cd316c..29df60ca472a1a66e7fe6ccc9f127bb6cf9193ec 100644 --- a/mailbox-android/src/main/java/org/briarproject/mailbox/android/StatusManager.kt +++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/StatusManager.kt @@ -63,19 +63,25 @@ class StatusManager @Inject constructor( * Possible values for [appState] */ sealed class MailboxAppState + object NotStarted : MailboxAppState() data class Starting(val status: String) : MailboxAppState() data class StartedSettingUp(val qrCode: Bitmap) : MailboxAppState() object StartedSetupComplete : MailboxAppState() - object AfterRunning : MailboxAppState() object ErrorClockSkew : MailboxAppState() object ErrorNoNetwork : MailboxAppState() + object Wiping : MailboxAppState() + object Stopping : MailboxAppState() + object Stopped : MailboxAppState() @Suppress("OPT_IN_USAGE") val appState: Flow<MailboxAppState> = combine( lifecycleState, torPluginState, setupComplete ) { ls, ts, sc -> when { - ls.isAfter(LifecycleState.RUNNING) -> AfterRunning + ls == LifecycleState.NOT_STARTED -> NotStarted + ls == LifecycleState.WIPING -> Wiping + ls == LifecycleState.STOPPING -> Stopping + ls == LifecycleState.STOPPED -> Stopped ls != LifecycleState.RUNNING -> Starting(getString(R.string.startup_starting_services)) // RUNNING ts != TorState.Published -> when (ts) { @@ -103,9 +109,10 @@ class StatusManager @Inject constructor( }.flowOn(Dispatchers.IO) .distinctUntilChanged() .onEach { state -> - if (state != AfterRunning) notificationManager.onMailboxAppStateChanged(state) + if (state != NotStarted && state != Wiping && state != Stopping && state != Stopped) + notificationManager.onMailboxAppStateChanged(state) } - .stateIn(GlobalScope, Lazily, Starting(getString(R.string.startup_starting_services))) + .stateIn(GlobalScope, Lazily, NotStarted) private fun getString(@StringRes resId: Int, vararg formatArgs: Any?): String { return context.getString(resId, *formatArgs) diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/ClockSkewFragment.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/ClockSkewFragment.kt index 4b2fd9e9f6381aed81e0d82f786263714559ebb3..c3d4189374830cba87bbdc387955b46f21fb724b 100644 --- a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/ClockSkewFragment.kt +++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/ClockSkewFragment.kt @@ -24,20 +24,12 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment -import androidx.fragment.app.activityViewModels -import androidx.navigation.fragment.findNavController import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.flow.collect import org.briarproject.mailbox.R -import org.briarproject.mailbox.android.StatusManager.ErrorClockSkew -import org.briarproject.mailbox.android.StatusManager.MailboxAppState -import org.briarproject.mailbox.android.ui.ClockSkewFragmentDirections.actionClockSkewFragmentToStartupFragment @AndroidEntryPoint class ClockSkewFragment : Fragment() { - private val viewModel: MailboxViewModel by activityViewModels() - override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -45,17 +37,4 @@ class ClockSkewFragment : Fragment() { ): View? { return inflater.inflate(R.layout.fragment_clock_skew, container, false) } - - override fun onViewCreated(v: View, savedInstanceState: Bundle?) { - launchAndRepeatWhileStarted { - viewModel.appState.collect { onSetupStateChanged(it) } - } - } - - private fun onSetupStateChanged(state: MailboxAppState) { - if (state != ErrorClockSkew) { - findNavController().navigate(actionClockSkewFragmentToStartupFragment()) - } - } - } diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/MainActivity.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/MainActivity.kt index 782bffae6bbff7f9a5c022ec452df09101f4f69e..f78b1b3ef50993e4c8ca296f5d0646fce5f059c2 100644 --- a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/MainActivity.kt +++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/MainActivity.kt @@ -32,19 +32,28 @@ import androidx.lifecycle.lifecycleScope import androidx.navigation.NavController import androidx.navigation.fragment.NavHostFragment import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import org.briarproject.android.dontkillmelib.DozeUtils.needsDozeWhitelisting +import org.briarproject.mailbox.NavOnboardingDirections.actionGlobalClockSkewFragment +import org.briarproject.mailbox.NavOnboardingDirections.actionGlobalDoNotKillMeFragment +import org.briarproject.mailbox.NavOnboardingDirections.actionGlobalNoNetworkFragment +import org.briarproject.mailbox.NavOnboardingDirections.actionGlobalQrCodeFragment +import org.briarproject.mailbox.NavOnboardingDirections.actionGlobalStartupFragment +import org.briarproject.mailbox.NavOnboardingDirections.actionGlobalStatusFragment import org.briarproject.mailbox.NavOnboardingDirections.actionGlobalStoppingFragment import org.briarproject.mailbox.NavOnboardingDirections.actionGlobalWipingFragment import org.briarproject.mailbox.R -import org.briarproject.mailbox.android.dontkillme.DoNotKillMeFragmentDirections.actionDoNotKillMeFragmentToStartupFragment -import org.briarproject.mailbox.android.dontkillme.DoNotKillMeFragmentDirections.actionGlobalDoNotKillMeFragment -import org.briarproject.mailbox.android.ui.InitFragmentDirections.actionInitFragmentToDoNotKillMeFragment -import org.briarproject.mailbox.android.ui.InitFragmentDirections.actionInitFragmentToStartupFragment +import org.briarproject.mailbox.android.StatusManager.ErrorClockSkew +import org.briarproject.mailbox.android.StatusManager.ErrorNoNetwork +import org.briarproject.mailbox.android.StatusManager.MailboxAppState +import org.briarproject.mailbox.android.StatusManager.NotStarted +import org.briarproject.mailbox.android.StatusManager.StartedSettingUp +import org.briarproject.mailbox.android.StatusManager.StartedSetupComplete +import org.briarproject.mailbox.android.StatusManager.Starting +import org.briarproject.mailbox.android.StatusManager.Stopped +import org.briarproject.mailbox.android.StatusManager.Stopping +import org.briarproject.mailbox.android.StatusManager.Wiping import org.briarproject.mailbox.core.lifecycle.LifecycleManager.LifecycleState.NOT_STARTED -import org.briarproject.mailbox.core.lifecycle.LifecycleManager.LifecycleState.STOPPING -import org.briarproject.mailbox.core.lifecycle.LifecycleManager.LifecycleState.WIPING import org.briarproject.mailbox.core.util.LogUtils.info import org.slf4j.LoggerFactory.getLogger @@ -73,19 +82,12 @@ class MainActivity : AppCompatActivity(), ActivityResultCallback<ActivityResult> viewModel.doNotKillComplete.observe(this) { complete -> if (complete && nav.currentDestination?.id == R.id.doNotKillMeFragment) nav.navigate( - actionDoNotKillMeFragmentToStartupFragment() + actionGlobalStartupFragment() ) } launchAndRepeatWhileStarted { - viewModel.lifecycleState.collect { state -> - LOG.info { "lifecycle state: $state" } - when (state) { - STOPPING -> nav.navigate(actionGlobalStoppingFragment()) - WIPING -> nav.navigate(actionGlobalWipingFragment()) - else -> {} - } - } + viewModel.appState.collect { onAppStateChanged(it) } } LOG.info { "do we have a saved instance state? " + (savedInstanceState != null) } @@ -97,6 +99,27 @@ class MainActivity : AppCompatActivity(), ActivityResultCallback<ActivityResult> } } + private fun onAppStateChanged(state: MailboxAppState) { + when (state) { + NotStarted -> {} // do not navigate anywhere yet + is Starting -> if (nav.currentDestination?.id != R.id.startupFragment) + nav.navigate(actionGlobalStartupFragment()) + is StartedSettingUp -> if (nav.currentDestination?.id != R.id.qrCodeFragment) + nav.navigate(actionGlobalQrCodeFragment()) + StartedSetupComplete -> if (nav.currentDestination?.id != R.id.statusFragment) + nav.navigate(actionGlobalStatusFragment()) + ErrorNoNetwork -> if (nav.currentDestination?.id != R.id.noNetworkFragment) + nav.navigate(actionGlobalNoNetworkFragment()) + ErrorClockSkew -> if (nav.currentDestination?.id != R.id.clockSkewFragment) + nav.navigate(actionGlobalClockSkewFragment()) + Stopping -> if (nav.currentDestination?.id != R.id.stoppingFragment) + nav.navigate(actionGlobalStoppingFragment()) + Wiping -> if (nav.currentDestination?.id != R.id.wipingFragment) + nav.navigate(actionGlobalWipingFragment()) + Stopped -> {} // nothing to do but needs to be exhaustive for Kotlin 1.7 + } + } + private fun onDbChecked(hasDb: Boolean, savedInstanceState: Bundle?) { if (lifecycle.currentState == DESTROYED) { return @@ -105,9 +128,9 @@ class MainActivity : AppCompatActivity(), ActivityResultCallback<ActivityResult> if (!hasDb) { startForResult.launch(Intent(this, OnboardingActivity::class.java)) } else if (needsDozeWhitelisting(this)) { - nav.navigate(actionInitFragmentToDoNotKillMeFragment()) + nav.navigate(actionGlobalDoNotKillMeFragment()) } else { - nav.navigate(actionInitFragmentToStartupFragment()) + nav.navigate(actionGlobalStartupFragment()) } } else { // At this point, when we do not have a db, this can be either of two situations: @@ -139,9 +162,9 @@ class MainActivity : AppCompatActivity(), ActivityResultCallback<ActivityResult> // only show next fragment when user went throw onboarding // result doesn't matter as we kill the app when user backs out in onboarding if (viewModel.needToShowDoNotKillMeFragment) { - nav.navigate(actionInitFragmentToDoNotKillMeFragment()) + nav.navigate(actionGlobalDoNotKillMeFragment()) } else { - nav.navigate(actionInitFragmentToStartupFragment()) + nav.navigate(actionGlobalStartupFragment()) } } diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/NoNetworkFragment.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/NoNetworkFragment.kt index b35b2191eb5729b510c1daa2af1cf4d1ef47ac59..43f4aaa2c8827651bcf5ed21ee7b601d06aca02c 100644 --- a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/NoNetworkFragment.kt +++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/NoNetworkFragment.kt @@ -24,20 +24,12 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment -import androidx.fragment.app.activityViewModels -import androidx.navigation.fragment.findNavController import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.flow.collect import org.briarproject.mailbox.R -import org.briarproject.mailbox.android.StatusManager.ErrorNoNetwork -import org.briarproject.mailbox.android.StatusManager.MailboxAppState -import org.briarproject.mailbox.android.ui.NoNetworkFragmentDirections.actionNoNetworkFragmentToStartupFragment @AndroidEntryPoint class NoNetworkFragment : Fragment() { - private val viewModel: MailboxViewModel by activityViewModels() - override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -45,17 +37,4 @@ class NoNetworkFragment : Fragment() { ): View? { return inflater.inflate(R.layout.fragment_no_network, container, false) } - - override fun onViewCreated(v: View, savedInstanceState: Bundle?) { - launchAndRepeatWhileStarted { - viewModel.appState.collect { onAppStateChanged(it) } - } - } - - private fun onAppStateChanged(state: MailboxAppState) { - if (state != ErrorNoNetwork) { - findNavController().navigate(actionNoNetworkFragmentToStartupFragment()) - } - } - } diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/QrCodeFragment.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/QrCodeFragment.kt index a3c73ab441babdda62deb383391b6042857fb7cf..44cb232a1c4219876d76ebe87ae58658d1f6669a 100644 --- a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/QrCodeFragment.kt +++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/QrCodeFragment.kt @@ -27,14 +27,11 @@ import android.widget.Button import android.widget.ImageView import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels -import androidx.navigation.fragment.findNavController import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collect import org.briarproject.mailbox.R import org.briarproject.mailbox.android.StatusManager.MailboxAppState import org.briarproject.mailbox.android.StatusManager.StartedSettingUp -import org.briarproject.mailbox.android.StatusManager.StartedSetupComplete -import org.briarproject.mailbox.android.ui.QrCodeFragmentDirections.actionQrCodeFragmentToSetupCompleteFragment @AndroidEntryPoint class QrCodeFragment : Fragment() { @@ -66,12 +63,8 @@ class QrCodeFragment : Fragment() { } private fun onAppStateChanged(state: MailboxAppState) { - when (state) { - is StartedSettingUp -> qrCodeView.setImageBitmap(state.qrCode) - is StartedSetupComplete -> findNavController().navigate( - actionQrCodeFragmentToSetupCompleteFragment() - ) - else -> error("Unexpected app state: $state") + if (state is StartedSettingUp) { + qrCodeView.setImageBitmap(state.qrCode) } } diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/SetupCompleteFragment.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/SetupCompleteFragment.kt index c5867be9a787403a125b63d26e43c50c4bc850ed..3b0f4d953999236228fbaed89db992d60ba35d3c 100644 --- a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/SetupCompleteFragment.kt +++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/SetupCompleteFragment.kt @@ -25,16 +25,14 @@ import android.view.View import android.view.ViewGroup import android.widget.Button import androidx.fragment.app.Fragment -import androidx.fragment.app.activityViewModels import androidx.navigation.fragment.findNavController import dagger.hilt.android.AndroidEntryPoint +import org.briarproject.mailbox.NavOnboardingDirections.actionGlobalStatusFragment import org.briarproject.mailbox.R -import org.briarproject.mailbox.android.ui.SetupCompleteFragmentDirections.actionSetupCompleteFragmentToStatusFragment @AndroidEntryPoint class SetupCompleteFragment : Fragment() { - private val viewModel: MailboxViewModel by activityViewModels() private lateinit var button: Button override fun onCreateView( @@ -48,7 +46,7 @@ class SetupCompleteFragment : Fragment() { override fun onViewCreated(v: View, savedInstanceState: Bundle?) { button = v.findViewById(R.id.button) button.setOnClickListener { - findNavController().navigate(actionSetupCompleteFragmentToStatusFragment()) + findNavController().navigate(actionGlobalStatusFragment()) } } diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/StartupFragment.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/StartupFragment.kt index c8d3d877fea9b05a89176fb53935910377733df1..42ea8b19ef8cde14689bca40c721fae09e9613d1 100644 --- a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/StartupFragment.kt +++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/StartupFragment.kt @@ -26,20 +26,11 @@ import android.view.ViewGroup import android.widget.TextView import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels -import androidx.navigation.fragment.findNavController import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collect import org.briarproject.mailbox.R -import org.briarproject.mailbox.android.StatusManager.ErrorClockSkew -import org.briarproject.mailbox.android.StatusManager.ErrorNoNetwork import org.briarproject.mailbox.android.StatusManager.MailboxAppState -import org.briarproject.mailbox.android.StatusManager.StartedSettingUp -import org.briarproject.mailbox.android.StatusManager.StartedSetupComplete import org.briarproject.mailbox.android.StatusManager.Starting -import org.briarproject.mailbox.android.ui.StartupFragmentDirections.actionStartupFragmentToClockSkewFragment -import org.briarproject.mailbox.android.ui.StartupFragmentDirections.actionStartupFragmentToNoNetworkFragment -import org.briarproject.mailbox.android.ui.StartupFragmentDirections.actionStartupFragmentToQrCodeFragment -import org.briarproject.mailbox.android.ui.StartupFragmentDirections.actionStartupFragmentToStatusFragment @AndroidEntryPoint class StartupFragment : Fragment() { @@ -66,20 +57,8 @@ class StartupFragment : Fragment() { } private fun onAppStateChanged(state: MailboxAppState) { - when (state) { - is Starting -> statusTextView.text = state.status - is StartedSettingUp -> findNavController().navigate( - actionStartupFragmentToQrCodeFragment() - ) - is StartedSetupComplete -> findNavController().navigate( - actionStartupFragmentToStatusFragment() - ) - is ErrorNoNetwork -> findNavController().navigate( - actionStartupFragmentToNoNetworkFragment() - ) - is ErrorClockSkew -> findNavController().navigate( - actionStartupFragmentToClockSkewFragment() - ) + if (state is Starting) { + statusTextView.text = state.status } } diff --git a/mailbox-android/src/main/res/navigation/nav_main.xml b/mailbox-android/src/main/res/navigation/nav_main.xml index 2100a74c3137acc2b5fe00704795f47ee8da29df..1e8162752618a57754ec8fef1e1bf2458b6921cc 100644 --- a/mailbox-android/src/main/res/navigation/nav_main.xml +++ b/mailbox-android/src/main/res/navigation/nav_main.xml @@ -9,90 +9,27 @@ android:id="@+id/initFragment" android:name="org.briarproject.mailbox.android.ui.InitFragment" android:label="InitFragment" - tools:layout="@layout/fragment_init"> - <action - android:id="@+id/action_initFragment_to_doNotKillMeFragment" - app:destination="@id/doNotKillMeFragment" - app:popUpTo="@id/initFragment" - app:popUpToInclusive="true" /> - <action - android:id="@+id/action_initFragment_to_startupFragment" - app:destination="@id/startupFragment" - app:popUpTo="@id/initFragment" - app:popUpToInclusive="true" /> - <action - android:id="@+id/action_initFragment_to_stoppingFragment" - app:destination="@id/stoppingFragment" - app:popUpTo="@id/initFragment" - app:popUpToInclusive="true" /> - <action - android:id="@+id/action_initFragment_to_wipingFragment" - app:destination="@id/wipingFragment" - app:popUpTo="@id/initFragment" - app:popUpToInclusive="true" /> - </fragment> + tools:layout="@layout/fragment_init" /> <fragment android:id="@+id/doNotKillMeFragment" android:name="org.briarproject.mailbox.android.dontkillme.DoNotKillMeFragment" android:label="DoNotKillMeFragment" - tools:layout="@layout/fragment_dont_kill_me"> - <action - android:id="@+id/action_doNotKillMeFragment_to_startupFragment" - app:destination="@id/startupFragment" - app:popUpTo="@id/doNotKillMeFragment" - app:popUpToInclusive="true" /> - </fragment> - <action - android:id="@+id/action_global_doNotKillMeFragment" - app:destination="@id/doNotKillMeFragment" - app:popUpTo="@id/nav_onboarding" - app:popUpToInclusive="true" /> + tools:layout="@layout/fragment_dont_kill_me" /> <fragment android:id="@+id/startupFragment" android:name="org.briarproject.mailbox.android.ui.StartupFragment" android:label="StartupFragment" - tools:layout="@layout/fragment_startup"> - <action - android:id="@+id/action_startupFragment_to_qrCodeFragment" - app:destination="@id/qrCodeFragment" - app:popUpTo="@id/startupFragment" - app:popUpToInclusive="true" /> - <action - android:id="@+id/action_startupFragment_to_statusFragment" - app:destination="@id/statusFragment" - app:popUpTo="@id/startupFragment" - app:popUpToInclusive="true" /> - <action - android:id="@+id/action_startupFragment_to_noNetworkFragment" - app:destination="@id/noNetworkFragment" - app:popUpTo="@id/startupFragment" - app:popUpToInclusive="true" /> - <action - android:id="@+id/action_startupFragment_to_clockSkewFragment" - app:destination="@id/clockSkewFragment" /> - </fragment> + tools:layout="@layout/fragment_startup" /> <fragment android:id="@+id/qrCodeFragment" android:name="org.briarproject.mailbox.android.ui.QrCodeFragment" android:label="QrCodeFragment" - tools:layout="@layout/fragment_qr"> - <action - android:id="@+id/action_qrCodeFragment_to_setupCompleteFragment" - app:destination="@id/setupCompleteFragment" - app:popUpTo="@id/qrCodeFragment" - app:popUpToInclusive="true" /> - </fragment> + tools:layout="@layout/fragment_qr" /> <fragment android:id="@+id/setupCompleteFragment" android:name="org.briarproject.mailbox.android.ui.SetupCompleteFragment" android:label="SetupCompleteFragment" - tools:layout="@layout/fragment_setup_complete"> - <action - android:id="@+id/action_setupCompleteFragment_to_statusFragment" - app:destination="@id/statusFragment" - app:popUpTo="@id/setupCompleteFragment" - app:popUpToInclusive="true" /> - </fragment> + tools:layout="@layout/fragment_setup_complete" /> <fragment android:id="@+id/statusFragment" android:name="org.briarproject.mailbox.android.ui.StatusFragment" @@ -102,20 +39,12 @@ android:id="@+id/noNetworkFragment" android:name="org.briarproject.mailbox.android.ui.NoNetworkFragment" android:label="NoNetworkFragment" - tools:layout="@layout/fragment_no_network"> - <action - android:id="@+id/action_noNetworkFragment_to_startupFragment" - app:destination="@id/startupFragment" /> - </fragment> + tools:layout="@layout/fragment_no_network" /> <fragment android:id="@+id/clockSkewFragment" android:name="org.briarproject.mailbox.android.ui.ClockSkewFragment" android:label="ClockSkewFragment" - tools:layout="@layout/fragment_clock_skew"> - <action - android:id="@+id/action_clockSkewFragment_to_startupFragment" - app:destination="@id/startupFragment" /> - </fragment> + tools:layout="@layout/fragment_clock_skew" /> <fragment android:id="@+id/stoppingFragment" android:name="org.briarproject.mailbox.android.ui.StoppingFragment" @@ -126,6 +55,36 @@ android:name="org.briarproject.mailbox.android.ui.WipingFragment" android:label="WipingFragment" tools:layout="@layout/fragment_wiping" /> + <action + android:id="@+id/action_global_doNotKillMeFragment" + app:destination="@id/doNotKillMeFragment" + app:popUpTo="@id/nav_onboarding" + app:popUpToInclusive="true" /> + <action + android:id="@+id/action_global_startupFragment" + app:destination="@id/startupFragment" + app:popUpTo="@id/nav_onboarding" + app:popUpToInclusive="true" /> + <action + android:id="@+id/action_global_qrCodeFragment" + app:destination="@id/qrCodeFragment" + app:popUpTo="@id/nav_onboarding" + app:popUpToInclusive="true" /> + <action + android:id="@+id/action_global_statusFragment" + app:destination="@id/statusFragment" + app:popUpTo="@id/nav_onboarding" + app:popUpToInclusive="true" /> + <action + android:id="@+id/action_global_noNetworkFragment" + app:destination="@id/noNetworkFragment" + app:popUpTo="@id/nav_onboarding" + app:popUpToInclusive="true" /> + <action + android:id="@+id/action_global_clockSkewFragment" + app:destination="@id/clockSkewFragment" + app:popUpTo="@id/nav_onboarding" + app:popUpToInclusive="true" /> <action android:id="@+id/action_global_wipingFragment" app:destination="@id/wipingFragment"