diff --git a/app/src/main/java/org/torproject/android/ui/connect/ConfigConnectionBottomSheet.kt b/app/src/main/java/org/torproject/android/ui/connect/ConfigConnectionBottomSheet.kt index d106c33bd..098f2255f 100644 --- a/app/src/main/java/org/torproject/android/ui/connect/ConfigConnectionBottomSheet.kt +++ b/app/src/main/java/org/torproject/android/ui/connect/ConfigConnectionBottomSheet.kt @@ -10,8 +10,8 @@ import android.widget.RadioButton import android.widget.Toast import androidx.appcompat.content.res.AppCompatResources import androidx.core.net.toUri +import androidx.fragment.app.activityViewModels import androidx.lifecycle.lifecycleScope -import androidx.navigation.fragment.NavHostFragment import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -28,6 +28,7 @@ class ConfigConnectionBottomSheet : OrbotBottomSheetDialogFragment(), CompoundButton.OnCheckedChangeListener { private lateinit var binding: ConfigConnectionBottomSheetBinding + private val viewModel: ConnectViewModel by activityViewModels() private lateinit var radios: List private lateinit var radioSubtitleMap: Map @@ -177,9 +178,7 @@ class ConfigConnectionBottomSheet : private fun closeAndConnect() { dismiss() - val navHostFragment = requireActivity().supportFragmentManager.fragments[0] as NavHostFragment - val connectFrag = navHostFragment.childFragmentManager.fragments.last() as ConnectFragment - connectFrag.startTorAndVpn() + viewModel.triggerStartTorAndVpn() } private fun selectRadioButtonFromPreference() { diff --git a/app/src/main/java/org/torproject/android/ui/connect/ConnectFragment.kt b/app/src/main/java/org/torproject/android/ui/connect/ConnectFragment.kt index 03e37e38f..470eb5301 100644 --- a/app/src/main/java/org/torproject/android/ui/connect/ConnectFragment.kt +++ b/app/src/main/java/org/torproject/android/ui/connect/ConnectFragment.kt @@ -53,7 +53,7 @@ class ConnectFragment : Fragment(), private val startTorResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == AppCompatActivity.RESULT_OK) { - startTorAndVpn() + viewModel.triggerStartTorAndVpn() } } @@ -61,7 +61,7 @@ class ConnectFragment : Fragment(), registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == AppCompatActivity.RESULT_OK) { requireContext().sendIntentToService(OrbotConstants.ACTION_RESTART_VPN) // is this enough todo? - refreshMenuList(requireContext()) + viewModel.triggerRefreshMenuList() } } @@ -80,7 +80,6 @@ class ConnectFragment : Fragment(), binding.progressBar.progress = it } } - is ConnectUiState.On -> doLayoutOn(requireContext()) is ConnectUiState.Stopping -> {} } @@ -93,6 +92,8 @@ class ConnectFragment : Fragment(), when (event) { is ConnectEvent.StartTorAndVpn -> startTorAndVpn() is ConnectEvent.RefreshMenuList -> refreshMenuList(requireContext()) + is ConnectEvent.StopTorAndVpn -> stopTorAndVpn() + is ConnectEvent.SendNewnymSignal -> sendNewnymSignal() } } } @@ -119,7 +120,6 @@ class ConnectFragment : Fragment(), private fun stopTorAndVpn() { requireContext().sendIntentToService(OrbotConstants.ACTION_STOP) - doLayoutOff() } private fun stopAnimations() { @@ -178,8 +178,13 @@ class ConnectFragment : Fragment(), "ExitNodeBottomSheet" ) }, - OrbotMenuAction(R.string.btn_refresh, R.drawable.ic_refresh) { sendNewnymSignal() }, - OrbotMenuAction(R.string.btn_tor_off, R.drawable.ic_power) { stopTorAndVpn() }) + OrbotMenuAction(R.string.btn_refresh, R.drawable.ic_refresh) { + viewModel.triggerSendNewnymSignal() + }, + OrbotMenuAction(R.string.btn_tor_off, R.drawable.ic_power) { + viewModel.triggerStopTorAndVpn() + } + ) if (!Prefs.isPowerUserMode) listItems.add( 0, OrbotMenuAction(R.string.btn_choose_apps, R.drawable.ic_choose_apps) { @@ -223,7 +228,7 @@ class ConnectFragment : Fragment(), binding.swSmartConnect.visibility = View.GONE binding.tvConfigure.visibility = View.GONE - refreshMenuList(context) + viewModel.triggerRefreshMenuList() binding.ivStatus.setOnClickListener {} } @@ -241,7 +246,7 @@ class ConnectFragment : Fragment(), binding.swSmartConnect.isChecked = Prefs.smartConnect binding.swSmartConnect.setOnCheckedChangeListener { _, value -> Prefs.smartConnect = value - doLayoutOff() + viewModel.updateState(requireContext(), lastStatus) } binding.tvConfigure.visibility = View.VISIBLE @@ -323,11 +328,13 @@ class ConnectFragment : Fragment(), backgroundTintList = ColorStateList.valueOf( ContextCompat.getColor(requireContext(), R.color.orbot_btn_enabled_purple) ) - setOnClickListener { startTorAndVpn() } + setOnClickListener { + viewModel.triggerStartTorAndVpn() + } } binding.ivStatus.setOnClickListener { - startTorAndVpn() + viewModel.triggerStartTorAndVpn() } } @@ -361,7 +368,7 @@ class ConnectFragment : Fragment(), ) ) setOnClickListener { - stopTorAndVpn() + viewModel.triggerStopTorAndVpn() } } @@ -385,6 +392,6 @@ class ConnectFragment : Fragment(), .setAction(OrbotConstants.CMD_SET_EXIT).putExtra("exit", countryCode) ) - refreshMenuList(requireContext()) + viewModel.triggerRefreshMenuList() } } \ No newline at end of file diff --git a/app/src/main/java/org/torproject/android/ui/connect/ConnectViewModel.kt b/app/src/main/java/org/torproject/android/ui/connect/ConnectViewModel.kt index 7a5d46bea..53cbaa63c 100644 --- a/app/src/main/java/org/torproject/android/ui/connect/ConnectViewModel.kt +++ b/app/src/main/java/org/torproject/android/ui/connect/ConnectViewModel.kt @@ -50,9 +50,23 @@ class ConnectViewModel : ViewModel() { _eventChannel.send(ConnectEvent.RefreshMenuList) } } + + fun triggerStopTorAndVpn() { + viewModelScope.launch { + _eventChannel.send(ConnectEvent.StopTorAndVpn) + } + } + + fun triggerSendNewnymSignal() { + viewModelScope.launch { + _eventChannel.send(ConnectEvent.SendNewnymSignal) + } + } } sealed class ConnectEvent { object StartTorAndVpn : ConnectEvent() object RefreshMenuList : ConnectEvent() + object StopTorAndVpn : ConnectEvent() + object SendNewnymSignal : ConnectEvent() }