aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java/org/pacien/tincapp/activities/ConfigureActivity.kt
blob: 9027b148f19c972fe7918522cfddea091f276d85 (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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package org.pacien.tincapp.activities

import android.app.Activity
import android.content.ActivityNotFoundException
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.support.annotation.StringRes
import android.support.v7.app.AlertDialog
import android.view.View
import java8.util.concurrent.CompletableFuture
import kotlinx.android.synthetic.main.base.*
import kotlinx.android.synthetic.main.dialog_network_generate.view.*
import kotlinx.android.synthetic.main.dialog_network_join.view.*
import kotlinx.android.synthetic.main.page_configure.*
import org.pacien.tincapp.R
import org.pacien.tincapp.commands.Tinc
import org.pacien.tincapp.commands.TincApp
import org.pacien.tincapp.context.App
import org.pacien.tincapp.context.AppPaths
import org.pacien.tincapp.extensions.Java.exceptionallyAccept

/**
 * @author pacien
 */
class ConfigureActivity : BaseActivity() {

    companion object {
        val REQUEST_SCAN = 0
        val SCAN_PROVIDER = "com.google.zxing.client.android"
    }

    private var joinDialog: View? = null

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        if (requestCode == REQUEST_SCAN && resultCode == Activity.RESULT_OK)
            joinDialog?.invitation_url?.setText(data!!.getStringExtra("SCAN_RESULT").trim())
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        supportActionBar!!.setDisplayHomeAsUpEnabled(true)
        layoutInflater.inflate(R.layout.page_configure, main_content)
        writeContent()
    }

    fun scanCode(@Suppress("UNUSED_PARAMETER") v: View) {
        try {
            startActivityForResult(Intent("$SCAN_PROVIDER.SCAN"), REQUEST_SCAN)
        } catch (e: ActivityNotFoundException) {
            AlertDialog.Builder(this).setTitle(R.string.action_scan_qr_code)
                    .setMessage(R.string.message_no_qr_code_scanner)
                    .setPositiveButton(R.string.action_install) { _, _ ->
                        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=$SCAN_PROVIDER")))
                    }.setNegativeButton(R.string.action_cancel, App.dismissAction).show()
        }
    }

    fun openGenerateConfDialog(@Suppress("UNUSED_PARAMETER") v: View) {
        val genDialog = layoutInflater.inflate(R.layout.dialog_network_generate, main_content, false)
        AlertDialog.Builder(this).setTitle(R.string.title_new_network).setView(genDialog)
                .setPositiveButton(R.string.action_create) { _, _ ->
                    generateConf(genDialog.new_net_name.text.toString(), genDialog.new_node_name.text.toString())
                }.setNegativeButton(R.string.action_cancel, App.dismissAction).show()
    }

    fun openJoinNetworkDialog(@Suppress("UNUSED_PARAMETER") v: View) {
        joinDialog = layoutInflater.inflate(R.layout.dialog_network_join, main_content, false)
        AlertDialog.Builder(this).setTitle(R.string.title_join_network).setView(joinDialog)
                .setPositiveButton(R.string.action_join) { _, _ ->
                    joinNetwork(joinDialog!!.net_name.text.toString(), joinDialog!!.invitation_url.text.toString())
                }.setNegativeButton(R.string.action_cancel, App.dismissAction).show()
    }

    private fun writeContent() {
        text_configuration_directory.text = AppPaths.confDir().absolutePath
        text_log_directory.text = AppPaths.cacheDir().absolutePath
        text_tinc_binary.text = AppPaths.tinc().absolutePath
    }

    private fun generateConf(netName: String, nodeName: String) = execAction(
            R.string.message_generating_configuration,
            Tinc.init(netName, nodeName)
                    .thenCompose { TincApp.removeScripts(netName) })

    private fun joinNetwork(netName: String, url: String) = execAction(
            R.string.message_joining_network,
            Tinc.join(netName, url)
                    .thenCompose { TincApp.removeScripts(netName) }
                    .thenCompose { TincApp.generateIfaceCfg(netName) })

    private fun execAction(@StringRes label: Int, action: CompletableFuture<Void>) {
        showProgressDialog(label).let { progressDialog ->
            action
                    .whenComplete { _, _ -> progressDialog.dismiss() }
                    .thenAccept { notify(R.string.message_network_configuration_created) }
                    .exceptionallyAccept { runOnUiThread { showErrorDialog(it.cause!!.localizedMessage) } }
        }
    }

}