aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java/org/pacien/tincapp/activities/StatusActivity.kt
blob: ca572eafd9d6678a236efed6dc978925a627a35a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package org.pacien.tincapp.activities

import android.content.Intent
import android.os.Bundle
import android.support.v7.app.AlertDialog
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.TextView
import kotlinx.android.synthetic.main.base.*
import kotlinx.android.synthetic.main.dialog_text_monopsace.view.*
import kotlinx.android.synthetic.main.fragment_network_status_header.*
import kotlinx.android.synthetic.main.page_status.*
import org.pacien.tincapp.R
import org.pacien.tincapp.commands.Tinc
import org.pacien.tincapp.service.TincVpnService
import org.pacien.tincapp.service.VpnInterfaceConfiguration

/**
 * @author pacien
 */
class StatusActivity : BaseActivity(), AdapterView.OnItemClickListener {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        layoutInflater.inflate(R.layout.page_status, main_content)
        writeContent()
    }

    override fun onCreateOptionsMenu(m: Menu): Boolean {
        menuInflater.inflate(R.menu.menu_status, m)
        return super.onCreateOptionsMenu(m)
    }

    override fun onItemClick(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
        val nodeName = (view as TextView).text.toString()
        val v = layoutInflater.inflate(R.layout.dialog_text_monopsace, main_content, false)
        v.dialog_text_monospace.text = Tinc.info(TincVpnService.getCurrentNetName()!!, nodeName)

        AlertDialog.Builder(this)
                .setTitle(R.string.title_node_info)
                .setView(v)
                .setPositiveButton(R.string.action_close) { _, _ -> /* nop */ }
                .show()
    }

    fun stopVpn(@Suppress("UNUSED_PARAMETER") i: MenuItem) {
        TincVpnService.stopVpn()
        startActivity(Intent(this, StartActivity::class.java).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
        finish()
    }

    private fun TextView.setText(list: List<String>) {
        if (list.isNotEmpty()) text = list.joinToString("\n")
        else text = getString(R.string.value_none)
    }

    private fun getNodeNames() = Tinc.dumpNodes(TincVpnService.getCurrentNetName()!!).map { it.substringBefore(" ") }

    private fun writeContent() {
        node_list.addHeaderView(layoutInflater.inflate(R.layout.fragment_network_status_header, node_list, false), null, false)
        node_list.addFooterView(View(this), null, false)
        node_list.emptyView = node_list_empty
        node_list.onItemClickListener = this
        node_list.adapter = ArrayAdapter<String>(this, R.layout.fragment_list_item, getNodeNames())

        text_network_name.text = TincVpnService.getCurrentNetName() ?: getString(R.string.value_none)
        writeNetworkInfo(TincVpnService.getCurrentInterfaceCfg() ?: VpnInterfaceConfiguration())
    }


    private fun writeNetworkInfo(cfg: VpnInterfaceConfiguration) {
        text_network_ip_addresses.setText(cfg.addresses.map { it.toString() })
        text_network_routes.setText(cfg.routes.map { it.toString() })
        text_network_dns_servers.setText(cfg.dnsServers)
        text_network_search_domains.setText(cfg.searchDomains)
        text_network_allow_bypass.text = getString(if (cfg.allowBypass) R.string.value_yes else R.string.value_no)

        block_network_allowed_applications.visibility = if (cfg.allowedApplications.isNotEmpty()) View.VISIBLE else View.GONE
        text_network_allowed_applications.setText(cfg.allowedApplications)

        block_network_disallowed_applications.visibility = if (cfg.disallowedApplications.isNotEmpty()) View.VISIBLE else View.GONE
        text_network_disallowed_applications.setText(cfg.disallowedApplications)
    }

}