tv: wire in stats
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
parent
382e10e103
commit
444a86cc9f
@ -7,9 +7,12 @@ package com.wireguard.android.activity
|
|||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
import android.view.View
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
import androidx.core.view.forEach
|
||||||
|
import androidx.databinding.DataBindingUtil
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import com.wireguard.android.Application
|
import com.wireguard.android.Application
|
||||||
import com.wireguard.android.R
|
import com.wireguard.android.R
|
||||||
@ -20,7 +23,9 @@ import com.wireguard.android.databinding.TvActivityBinding
|
|||||||
import com.wireguard.android.databinding.TvTunnelListItemBinding
|
import com.wireguard.android.databinding.TvTunnelListItemBinding
|
||||||
import com.wireguard.android.model.ObservableTunnel
|
import com.wireguard.android.model.ObservableTunnel
|
||||||
import com.wireguard.android.util.ErrorMessages
|
import com.wireguard.android.util.ErrorMessages
|
||||||
|
import com.wireguard.android.util.QuantityFormatter
|
||||||
import com.wireguard.android.util.TunnelImporter
|
import com.wireguard.android.util.TunnelImporter
|
||||||
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
class TvMainActivity : AppCompatActivity() {
|
class TvMainActivity : AppCompatActivity() {
|
||||||
@ -50,12 +55,15 @@ class TvMainActivity : AppCompatActivity() {
|
|||||||
Toast.makeText(this@TvMainActivity, message, Toast.LENGTH_LONG).show()
|
Toast.makeText(this@TvMainActivity, message, Toast.LENGTH_LONG).show()
|
||||||
Log.e(TAG, message, e)
|
Log.e(TAG, message, e)
|
||||||
}
|
}
|
||||||
|
updateStats()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lateinit var binding: TvActivityBinding
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
val binding = TvActivityBinding.inflate(layoutInflater)
|
binding = TvActivityBinding.inflate(layoutInflater)
|
||||||
lifecycleScope.launch { binding.tunnels = Application.getTunnelManager().getTunnels() }
|
lifecycleScope.launch { binding.tunnels = Application.getTunnelManager().getTunnels() }
|
||||||
binding.rowConfigurationHandler = object : ObservableKeyedRecyclerViewAdapter.RowConfigurationHandler<TvTunnelListItemBinding, ObservableTunnel> {
|
binding.rowConfigurationHandler = object : ObservableKeyedRecyclerViewAdapter.RowConfigurationHandler<TvTunnelListItemBinding, ObservableTunnel> {
|
||||||
override fun onConfigureRow(binding: TvTunnelListItemBinding, item: ObservableTunnel, position: Int) {
|
override fun onConfigureRow(binding: TvTunnelListItemBinding, item: ObservableTunnel, position: Int) {
|
||||||
@ -79,6 +87,33 @@ class TvMainActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
binding.executePendingBindings()
|
binding.executePendingBindings()
|
||||||
setContentView(binding.root)
|
setContentView(binding.root)
|
||||||
|
|
||||||
|
lifecycleScope.launch {
|
||||||
|
while (true) {
|
||||||
|
updateStats()
|
||||||
|
delay(1000)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private suspend fun updateStats() {
|
||||||
|
binding.tunnelList.forEach { viewItem ->
|
||||||
|
val listItem = DataBindingUtil.findBinding<TvTunnelListItemBinding>(viewItem) ?: return@forEach
|
||||||
|
try {
|
||||||
|
val tunnel = listItem.item!!
|
||||||
|
if (tunnel.state != Tunnel.State.UP) {
|
||||||
|
throw Exception()
|
||||||
|
}
|
||||||
|
val statistics = tunnel.getStatisticsAsync()
|
||||||
|
val rx = statistics.totalRx()
|
||||||
|
val tx = statistics.totalTx()
|
||||||
|
listItem.tunnelTransfer.text = getString(R.string.transfer_rx_tx, QuantityFormatter.formatBytes(rx), QuantityFormatter.formatBytes(tx))
|
||||||
|
listItem.tunnelTransfer.visibility = View.VISIBLE
|
||||||
|
} catch (_: Throwable) {
|
||||||
|
listItem.tunnelTransfer.visibility = View.GONE
|
||||||
|
listItem.tunnelTransfer.text = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
@ -17,6 +17,7 @@ import com.wireguard.android.backend.Tunnel
|
|||||||
import com.wireguard.android.databinding.TunnelDetailFragmentBinding
|
import com.wireguard.android.databinding.TunnelDetailFragmentBinding
|
||||||
import com.wireguard.android.databinding.TunnelDetailPeerBinding
|
import com.wireguard.android.databinding.TunnelDetailPeerBinding
|
||||||
import com.wireguard.android.model.ObservableTunnel
|
import com.wireguard.android.model.ObservableTunnel
|
||||||
|
import com.wireguard.android.util.QuantityFormatter
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
@ -28,16 +29,6 @@ class TunnelDetailFragment : BaseFragment() {
|
|||||||
private var lastState = Tunnel.State.TOGGLE
|
private var lastState = Tunnel.State.TOGGLE
|
||||||
private var timerActive = true
|
private var timerActive = true
|
||||||
|
|
||||||
private fun formatBytes(bytes: Long): String {
|
|
||||||
return when {
|
|
||||||
bytes < 1024 -> getString(R.string.transfer_bytes, bytes)
|
|
||||||
bytes < 1024 * 1024 -> getString(R.string.transfer_kibibytes, bytes / 1024.0)
|
|
||||||
bytes < 1024 * 1024 * 1024 -> getString(R.string.transfer_mibibytes, bytes / (1024.0 * 1024.0))
|
|
||||||
bytes < 1024 * 1024 * 1024 * 1024L -> getString(R.string.transfer_gibibytes, bytes / (1024.0 * 1024.0 * 1024.0))
|
|
||||||
else -> getString(R.string.transfer_tibibytes, bytes / (1024.0 * 1024.0 * 1024.0) / 1024.0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
setHasOptionsMenu(true)
|
setHasOptionsMenu(true)
|
||||||
@ -117,7 +108,7 @@ class TunnelDetailFragment : BaseFragment() {
|
|||||||
peer.transferText.visibility = View.GONE
|
peer.transferText.visibility = View.GONE
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
peer.transferText.text = getString(R.string.transfer_rx_tx, formatBytes(rx), formatBytes(tx))
|
peer.transferText.text = getString(R.string.transfer_rx_tx, QuantityFormatter.formatBytes(rx), QuantityFormatter.formatBytes(tx))
|
||||||
peer.transferLabel.visibility = View.VISIBLE
|
peer.transferLabel.visibility = View.VISIBLE
|
||||||
peer.transferText.visibility = View.VISIBLE
|
peer.transferText.visibility = View.VISIBLE
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* Copyright © 2020 WireGuard LLC. All Rights Reserved.
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.wireguard.android.util
|
||||||
|
|
||||||
|
import com.wireguard.android.Application
|
||||||
|
import com.wireguard.android.R
|
||||||
|
|
||||||
|
object QuantityFormatter {
|
||||||
|
fun formatBytes(bytes: Long): String {
|
||||||
|
val context = Application.get().applicationContext
|
||||||
|
return when {
|
||||||
|
bytes < 1024 -> context.getString(R.string.transfer_bytes, bytes)
|
||||||
|
bytes < 1024 * 1024 -> context.getString(R.string.transfer_kibibytes, bytes / 1024.0)
|
||||||
|
bytes < 1024 * 1024 * 1024 -> context.getString(R.string.transfer_mibibytes, bytes / (1024.0 * 1024.0))
|
||||||
|
bytes < 1024 * 1024 * 1024 * 1024L -> context.getString(R.string.transfer_gibibytes, bytes / (1024.0 * 1024.0 * 1024.0))
|
||||||
|
else -> context.getString(R.string.transfer_tibibytes, bytes / (1024.0 * 1024.0 * 1024.0) / 1024.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -42,7 +42,6 @@
|
|||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
tools:text="@sample/interface_names.json/names/names/name" />
|
tools:text="@sample/interface_names.json/names/names/name" />
|
||||||
|
|
||||||
<!-- TODO: wire in updates here -->
|
|
||||||
<com.google.android.material.textview.MaterialTextView
|
<com.google.android.material.textview.MaterialTextView
|
||||||
android:id="@+id/tunnel_transfer"
|
android:id="@+id/tunnel_transfer"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
|
Loading…
Reference in New Issue
Block a user