diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2020-09-22 15:31:02 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2020-09-22 23:53:37 +0200 |
commit | 382e10e1035466e09faa53816d12587d576f7d5c (patch) | |
tree | df0256f4452bca4dd5e7bed70c317876361ec0a8 /ui | |
parent | dc002d77fa514eb6526516f23beb7093654c23db (diff) |
tv: wire up tunnel start/stop
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'ui')
-rw-r--r-- | ui/src/main/java/com/wireguard/android/activity/TvMainActivity.kt | 50 | ||||
-rw-r--r-- | ui/src/main/res/layout/tv_activity.xml | 5 | ||||
-rw-r--r-- | ui/src/main/res/layout/tv_tunnel_list_item.xml | 14 |
3 files changed, 59 insertions, 10 deletions
diff --git a/ui/src/main/java/com/wireguard/android/activity/TvMainActivity.kt b/ui/src/main/java/com/wireguard/android/activity/TvMainActivity.kt index 16873642..fcac6b3e 100644 --- a/ui/src/main/java/com/wireguard/android/activity/TvMainActivity.kt +++ b/ui/src/main/java/com/wireguard/android/activity/TvMainActivity.kt @@ -6,12 +6,20 @@ package com.wireguard.android.activity import android.os.Bundle +import android.util.Log import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope import com.wireguard.android.Application +import com.wireguard.android.R +import com.wireguard.android.backend.GoBackend +import com.wireguard.android.backend.Tunnel +import com.wireguard.android.databinding.ObservableKeyedRecyclerViewAdapter import com.wireguard.android.databinding.TvActivityBinding +import com.wireguard.android.databinding.TvTunnelListItemBinding +import com.wireguard.android.model.ObservableTunnel +import com.wireguard.android.util.ErrorMessages import com.wireguard.android.util.TunnelImporter import kotlinx.coroutines.launch @@ -24,14 +32,56 @@ class TvMainActivity : AppCompatActivity() { } } + private var pendingTunnel: ObservableTunnel? = null + private val permissionActivityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + val tunnel = pendingTunnel + if (tunnel != null) + setTunnelStateWithPermissionsResult(tunnel) + pendingTunnel = null + } + + private fun setTunnelStateWithPermissionsResult(tunnel: ObservableTunnel) { + lifecycleScope.launch { + try { + tunnel.setStateAsync(Tunnel.State.TOGGLE) + } catch (e: Throwable) { + val error = ErrorMessages[e] + val message = getString(R.string.error_up, error) + Toast.makeText(this@TvMainActivity, message, Toast.LENGTH_LONG).show() + Log.e(TAG, message, e) + } + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding = TvActivityBinding.inflate(layoutInflater) lifecycleScope.launch { binding.tunnels = Application.getTunnelManager().getTunnels() } + binding.rowConfigurationHandler = object : ObservableKeyedRecyclerViewAdapter.RowConfigurationHandler<TvTunnelListItemBinding, ObservableTunnel> { + override fun onConfigureRow(binding: TvTunnelListItemBinding, item: ObservableTunnel, position: Int) { + binding.root.setOnClickListener() { + lifecycleScope.launch { + if (Application.getBackend() is GoBackend) { + val intent = GoBackend.VpnService.prepare(binding.root.context) + if (intent != null) { + pendingTunnel = item + permissionActivityResultLauncher.launch(intent) + return@launch + } + } + setTunnelStateWithPermissionsResult(item) + } + } + } + } binding.importButton.setOnClickListener { tunnelFileImportResultLauncher.launch("*/*") } binding.executePendingBindings() setContentView(binding.root) } + + companion object { + private const val TAG = "WireGuard/TvMainActivity" + } } diff --git a/ui/src/main/res/layout/tv_activity.xml b/ui/src/main/res/layout/tv_activity.xml index 33f13a17..4ca5f839 100644 --- a/ui/src/main/res/layout/tv_activity.xml +++ b/ui/src/main/res/layout/tv_activity.xml @@ -10,6 +10,10 @@ <variable name="tunnels" type="com.wireguard.android.databinding.ObservableKeyedArrayList<String, ObservableTunnel>" /> + + <variable + name="rowConfigurationHandler" + type="com.wireguard.android.databinding.ObservableKeyedRecyclerViewAdapter.RowConfigurationHandler" /> </data> <androidx.constraintlayout.widget.ConstraintLayout @@ -22,6 +26,7 @@ android:layout_height="match_parent" android:layout_marginTop="16dp" android:orientation="horizontal" + app:configurationHandler="@{rowConfigurationHandler}" app:items="@{tunnels}" app:layout="@{@layout/tv_tunnel_list_item}" app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" diff --git a/ui/src/main/res/layout/tv_tunnel_list_item.xml b/ui/src/main/res/layout/tv_tunnel_list_item.xml index 5611d579..b38a97bf 100644 --- a/ui/src/main/res/layout/tv_tunnel_list_item.xml +++ b/ui/src/main/res/layout/tv_tunnel_list_item.xml @@ -23,7 +23,10 @@ android:layout_height="150dp" android:layout_marginStart="8dp" android:layout_marginEnd="8dp" - app:cardCornerRadius="12dp"> + app:cardCornerRadius="12dp" + android:checkable="true" + android:focusable="true" + android:backgroundTint="@{item.state == State.UP ? @color/secondary_light_color : @color/primary_color}"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" @@ -39,15 +42,6 @@ app:layout_constraintTop_toTopOf="parent" tools:text="@sample/interface_names.json/names/names/name" /> - <com.wireguard.android.widget.ToggleSwitch - android:id="@+id/tunnel_toggle" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - app:checked="@{item.state == State.UP}" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent" - tools:checked="@sample/interface_names.json/names/checked/checked" /> - <!-- TODO: wire in updates here --> <com.google.android.material.textview.MaterialTextView android:id="@+id/tunnel_transfer" |