diff options
author | Harsh Shandilya <me@msfjarvis.dev> | 2020-03-16 14:46:36 +0530 |
---|---|---|
committer | Harsh Shandilya <me@msfjarvis.dev> | 2020-03-19 09:24:48 +0530 |
commit | fc0660ca8d5dd98b5a98a32e13896f9553a4311c (patch) | |
tree | 03dc9fb1c4a872496940a4f5364874ba63654285 /ui/src/main/java/com/wireguard/android/fragment/BaseFragment.kt | |
parent | b2ed5dbbc8d1618d919d25117509602d9af6a47c (diff) |
ui: Convert fragment package to Kotlin
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
Diffstat (limited to 'ui/src/main/java/com/wireguard/android/fragment/BaseFragment.kt')
-rw-r--r-- | ui/src/main/java/com/wireguard/android/fragment/BaseFragment.kt | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/ui/src/main/java/com/wireguard/android/fragment/BaseFragment.kt b/ui/src/main/java/com/wireguard/android/fragment/BaseFragment.kt new file mode 100644 index 00000000..12b99f25 --- /dev/null +++ b/ui/src/main/java/com/wireguard/android/fragment/BaseFragment.kt @@ -0,0 +1,108 @@ +/* + * Copyright © 2017-2019 WireGuard LLC. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +package com.wireguard.android.fragment + +import android.content.Context +import android.content.Intent +import android.util.Log +import android.view.View +import android.widget.Toast +import androidx.databinding.DataBindingUtil +import androidx.databinding.ViewDataBinding +import androidx.fragment.app.Fragment +import com.google.android.material.snackbar.Snackbar +import com.wireguard.android.Application +import com.wireguard.android.R +import com.wireguard.android.activity.BaseActivity +import com.wireguard.android.activity.BaseActivity.OnSelectedTunnelChangedListener +import com.wireguard.android.backend.Backend +import com.wireguard.android.backend.GoBackend +import com.wireguard.android.backend.Tunnel +import com.wireguard.android.databinding.TunnelDetailFragmentBinding +import com.wireguard.android.databinding.TunnelListItemBinding +import com.wireguard.android.model.ObservableTunnel +import com.wireguard.android.util.ErrorMessages + +/** + * Base class for fragments that need to know the currently-selected tunnel. Only does anything when + * attached to a `BaseActivity`. + */ +abstract class BaseFragment : Fragment(), OnSelectedTunnelChangedListener { + private var baseActivity: BaseActivity? = null + private var pendingTunnel: ObservableTunnel? = null + private var pendingTunnelUp: Boolean? = null + protected var selectedTunnel: ObservableTunnel? + get() = baseActivity?.selectedTunnel + protected set(tunnel) { + baseActivity?.selectedTunnel = tunnel + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == REQUEST_CODE_VPN_PERMISSION) { + if (pendingTunnel != null && pendingTunnelUp != null) setTunnelStateWithPermissionsResult(pendingTunnel!!, pendingTunnelUp!!) + pendingTunnel = null + pendingTunnelUp = null + } + } + + override fun onAttach(context: Context) { + super.onAttach(context) + if (context is BaseActivity) { + baseActivity = context + baseActivity?.addOnSelectedTunnelChangedListener(this) + } else { + baseActivity = null + } + } + + override fun onDetach() { + baseActivity?.removeOnSelectedTunnelChangedListener(this) + baseActivity = null + super.onDetach() + } + + fun setTunnelState(view: View, checked: Boolean) { + val tunnel = when (val binding = DataBindingUtil.findBinding<ViewDataBinding>(view)) { + is TunnelDetailFragmentBinding -> binding.tunnel + is TunnelListItemBinding -> binding.item + else -> return + } + Application.getBackendAsync().thenAccept { backend: Backend? -> + if (backend is GoBackend) { + val intent = GoBackend.VpnService.prepare(view.context) + if (intent != null) { + pendingTunnel = tunnel + pendingTunnelUp = checked + startActivityForResult(intent, REQUEST_CODE_VPN_PERMISSION) + return@thenAccept + } + } + setTunnelStateWithPermissionsResult(tunnel!!, checked) + } + } + + private fun setTunnelStateWithPermissionsResult(tunnel: ObservableTunnel, checked: Boolean) { + tunnel.setState(Tunnel.State.of(checked)).whenComplete { _, throwable -> + if (throwable == null) return@whenComplete + val error = ErrorMessages.get(throwable) + val messageResId = if (checked) R.string.error_up else R.string.error_down + val message = requireContext().getString(messageResId, error) + val view = view + if (view != null) + Snackbar.make(view, message, Snackbar.LENGTH_LONG) + .setAnchorView(view.findViewById<View>(R.id.create_fab)) + .show() + else + Toast.makeText(requireContext(), message, Toast.LENGTH_LONG).show() + Log.e(TAG, message, throwable) + } + } + + companion object { + private const val REQUEST_CODE_VPN_PERMISSION = 23491 + private val TAG = "WireGuard/" + BaseFragment::class.java.simpleName + } +} |