diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2020-09-26 13:34:20 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2020-09-26 13:49:14 +0200 |
commit | 938399d881aa6b365be131ffb3a517d64be427bb (patch) | |
tree | 818d6d25c5394d0f7af15cf7ed130b48992d0154 /ui/src/main/java/com/wireguard/android/fragment/TunnelEditorFragment.kt | |
parent | ui: print proper exception trace from log viewer (diff) | |
download | wireguard-android-938399d881aa6b365be131ffb3a517d64be427bb.tar.xz wireguard-android-938399d881aa6b365be131ffb3a517d64be427bb.zip |
ui: queue up tunnel mutating on activity scope instead of fragment scope
Fragment scopes get cancelled when the fragment goes away, but we don't
actually want to cancel an in-flight transition in that case. Also,
before when the fragment would cancel, there'd be an exception, and the
exception handler would call Fragment::getString, which in turn called
requireContext, which caused an exception. Work around this by using the
`activity ?: Application.get()` idiom to always have a context for
strings and toasts.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'ui/src/main/java/com/wireguard/android/fragment/TunnelEditorFragment.kt')
-rw-r--r-- | ui/src/main/java/com/wireguard/android/fragment/TunnelEditorFragment.kt | 66 |
1 files changed, 36 insertions, 30 deletions
diff --git a/ui/src/main/java/com/wireguard/android/fragment/TunnelEditorFragment.kt b/ui/src/main/java/com/wireguard/android/fragment/TunnelEditorFragment.kt index e035210a..f002c085 100644 --- a/ui/src/main/java/com/wireguard/android/fragment/TunnelEditorFragment.kt +++ b/ui/src/main/java/com/wireguard/android/fragment/TunnelEditorFragment.kt @@ -39,24 +39,27 @@ class TunnelEditorFragment : BaseFragment() { private var haveShownKeys = false private var binding: TunnelEditorFragmentBinding? = null private var tunnel: ObservableTunnel? = null + private fun onConfigLoaded(config: Config) { binding?.config = ConfigProxy(config) } private fun onConfigSaved(savedTunnel: Tunnel, throwable: Throwable?) { - val message: String + val ctx = activity ?: Application.get() if (throwable == null) { - message = getString(R.string.config_save_success, savedTunnel.name) + val message = ctx.getString(R.string.config_save_success, savedTunnel.name) Log.d(TAG, message) - Toast.makeText(activity ?: Application.get(), message, Toast.LENGTH_SHORT).show() + Toast.makeText(ctx, message, Toast.LENGTH_SHORT).show() onFinished() } else { val error = ErrorMessages[throwable] - message = getString(R.string.config_save_error, savedTunnel.name, error) + val message = ctx.getString(R.string.config_save_error, savedTunnel.name, error) Log.e(TAG, message, throwable) - binding?.let { - Snackbar.make(it.mainContainer, message, Snackbar.LENGTH_LONG).show() - } + val binding = binding + if (binding != null) + Snackbar.make(binding.mainContainer, message, Snackbar.LENGTH_LONG).show() + else + Toast.makeText(ctx, message, Toast.LENGTH_SHORT).show() } } @@ -115,7 +118,8 @@ class TunnelEditorFragment : BaseFragment() { Snackbar.make(binding!!.mainContainer, error, Snackbar.LENGTH_LONG).show() return false } - lifecycleScope.launch { + val activity = requireActivity() + activity.lifecycleScope.launch { when { tunnel == null -> { Log.d(TAG, "Attempting to create new tunnel " + binding!!.name) @@ -209,46 +213,48 @@ class TunnelEditorFragment : BaseFragment() { } private fun onTunnelCreated(newTunnel: ObservableTunnel?, throwable: Throwable?) { - val message: String + val ctx = activity ?: Application.get() if (throwable == null) { tunnel = newTunnel - message = getString(R.string.tunnel_create_success, tunnel!!.name) + val message = ctx.getString(R.string.tunnel_create_success, tunnel!!.name) Log.d(TAG, message) - Toast.makeText(activity ?: Application.get(), message, Toast.LENGTH_SHORT).show() + Toast.makeText(ctx, message, Toast.LENGTH_SHORT).show() onFinished() } else { val error = ErrorMessages[throwable] - message = getString(R.string.tunnel_create_error, error) + val message = ctx.getString(R.string.tunnel_create_error, error) Log.e(TAG, message, throwable) - binding?.let { - Snackbar.make(it.mainContainer, message, Snackbar.LENGTH_LONG).show() - } + val binding = binding + if (binding != null) + Snackbar.make(binding.mainContainer, message, Snackbar.LENGTH_LONG).show() + else + Toast.makeText(ctx, message, Toast.LENGTH_SHORT).show() } } - private fun onTunnelRenamed(renamedTunnel: ObservableTunnel, newConfig: Config, - throwable: Throwable?) { - val message: String + private suspend fun onTunnelRenamed(renamedTunnel: ObservableTunnel, newConfig: Config, + throwable: Throwable?) { + val ctx = activity ?: Application.get() if (throwable == null) { - message = getString(R.string.tunnel_rename_success, renamedTunnel.name) + val message = ctx.getString(R.string.tunnel_rename_success, renamedTunnel.name) Log.d(TAG, message) // Now save the rest of configuration changes. Log.d(TAG, "Attempting to save config of renamed tunnel " + tunnel!!.name) - lifecycleScope.launch { - try { - renamedTunnel.setConfigAsync(newConfig) - onConfigSaved(renamedTunnel, null) - } catch (e: Throwable) { - onConfigSaved(renamedTunnel, e) - } + try { + renamedTunnel.setConfigAsync(newConfig) + onConfigSaved(renamedTunnel, null) + } catch (e: Throwable) { + onConfigSaved(renamedTunnel, e) } } else { val error = ErrorMessages[throwable] - message = getString(R.string.tunnel_rename_error, error) + val message = ctx.getString(R.string.tunnel_rename_error, error) Log.e(TAG, message, throwable) - binding?.let { - Snackbar.make(it.mainContainer, message, Snackbar.LENGTH_LONG).show() - } + val binding = binding + if (binding != null) + Snackbar.make(binding.mainContainer, message, Snackbar.LENGTH_LONG).show() + else + Toast.makeText(ctx, message, Toast.LENGTH_SHORT).show() } } |