aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java/org/pacien/tincapp/activities/ConfigureActivity.kt
blob: ea379446ab7b68a5da4539fff06d040b5790a0b2 (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
package org.pacien.tincapp.activities

import android.os.Bundle
import android.support.annotation.StringRes
import android.support.v7.app.AlertDialog
import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import android.widget.FrameLayout
import java8.util.concurrent.CompletableFuture
import kotlinx.android.synthetic.main.base.*
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() {

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

    fun openGenerateConfDialog(@Suppress("UNUSED_PARAMETER") v: View) {
        val netNameField = EditText(this)
        netNameField.layoutParams = FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)
        netNameField.setHint(R.string.field_net_name)

        val nodeNameField = EditText(this)
        nodeNameField.layoutParams = FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)
        nodeNameField.setHint(R.string.field_node_name)

        val dialogFrame = layoutInflater.inflate(R.layout.dialog_frame, main_content, false) as ViewGroup
        dialogFrame.addView(netNameField)
        dialogFrame.addView(nodeNameField)

        AlertDialog.Builder(this).setTitle(R.string.title_new_network).setView(dialogFrame)
                .setPositiveButton(R.string.action_create) { _, _ -> generateConf(netNameField.text.toString(), nodeNameField.text.toString()) }
                .setNegativeButton(R.string.action_cancel, App.dismissAction).show()
    }

    fun openJoinNetworkDialog(@Suppress("UNUSED_PARAMETER") v: View) {
        val netNameField = EditText(this)
        netNameField.layoutParams = FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)
        netNameField.setHint(R.string.field_net_name)

        val joinUrlField = EditText(this)
        joinUrlField.layoutParams = FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)
        joinUrlField.setHint(R.string.field_invitation_url)

        val dialogFrame = layoutInflater.inflate(R.layout.dialog_frame, main_content, false) as ViewGroup
        dialogFrame.addView(netNameField)
        dialogFrame.addView(joinUrlField)

        AlertDialog.Builder(this).setTitle(R.string.title_join_network).setView(dialogFrame)
                .setPositiveButton(R.string.action_join) { _, _ -> joinNetwork(netNameField.text.toString(), joinUrlField.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) } }
        }
    }

}