diff options
author | pacien | 2017-08-24 15:54:31 +0200 |
---|---|---|
committer | pacien | 2017-08-24 16:32:10 +0200 |
commit | cf24442cd7b18ffd7dfe3998ea40d8e5e1d3f16e (patch) | |
tree | f215f87f6b9288ce77bab937570e75cb15e29f2e | |
parent | 5bd162da8412d637869b62fe0631106015a11bec (diff) | |
download | tincapp-cf24442cd7b18ffd7dfe3998ea40d8e5e1d3f16e.tar.gz |
Add invitation URL QR code scanning ; Refactor configuration dialogs
-rw-r--r-- | app/src/main/java/org/pacien/tincapp/activities/ConfigureActivity.kt | 75 | ||||
-rw-r--r-- | app/src/main/java/org/pacien/tincapp/activities/StatusActivity.kt | 10 | ||||
-rw-r--r-- | app/src/main/res/drawable/ic_photo_camera_primary_24dp.xml | 12 | ||||
-rw-r--r-- | app/src/main/res/layout/dialog_network_generate.xml (renamed from app/src/main/res/layout/dialog_frame.xml) | 12 | ||||
-rw-r--r-- | app/src/main/res/layout/dialog_network_join.xml | 37 | ||||
-rw-r--r-- | app/src/main/res/layout/dialog_node_details.xml (renamed from app/src/main/res/layout/dialog_text_monopsace.xml) | 2 | ||||
-rw-r--r-- | app/src/main/res/values/strings.xml | 3 |
7 files changed, 112 insertions, 39 deletions
diff --git a/app/src/main/java/org/pacien/tincapp/activities/ConfigureActivity.kt b/app/src/main/java/org/pacien/tincapp/activities/ConfigureActivity.kt index ea37944..9027b14 100644 --- a/app/src/main/java/org/pacien/tincapp/activities/ConfigureActivity.kt +++ b/app/src/main/java/org/pacien/tincapp/activities/ConfigureActivity.kt | |||
@@ -1,14 +1,17 @@ | |||
1 | package org.pacien.tincapp.activities | 1 | package org.pacien.tincapp.activities |
2 | 2 | ||
3 | import android.app.Activity | ||
4 | import android.content.ActivityNotFoundException | ||
5 | import android.content.Intent | ||
6 | import android.net.Uri | ||
3 | import android.os.Bundle | 7 | import android.os.Bundle |
4 | import android.support.annotation.StringRes | 8 | import android.support.annotation.StringRes |
5 | import android.support.v7.app.AlertDialog | 9 | import android.support.v7.app.AlertDialog |
6 | import android.view.View | 10 | import android.view.View |
7 | import android.view.ViewGroup | ||
8 | import android.widget.EditText | ||
9 | import android.widget.FrameLayout | ||
10 | import java8.util.concurrent.CompletableFuture | 11 | import java8.util.concurrent.CompletableFuture |
11 | import kotlinx.android.synthetic.main.base.* | 12 | import kotlinx.android.synthetic.main.base.* |
13 | import kotlinx.android.synthetic.main.dialog_network_generate.view.* | ||
14 | import kotlinx.android.synthetic.main.dialog_network_join.view.* | ||
12 | import kotlinx.android.synthetic.main.page_configure.* | 15 | import kotlinx.android.synthetic.main.page_configure.* |
13 | import org.pacien.tincapp.R | 16 | import org.pacien.tincapp.R |
14 | import org.pacien.tincapp.commands.Tinc | 17 | import org.pacien.tincapp.commands.Tinc |
@@ -22,6 +25,20 @@ import org.pacien.tincapp.extensions.Java.exceptionallyAccept | |||
22 | */ | 25 | */ |
23 | class ConfigureActivity : BaseActivity() { | 26 | class ConfigureActivity : BaseActivity() { |
24 | 27 | ||
28 | companion object { | ||
29 | val REQUEST_SCAN = 0 | ||
30 | val SCAN_PROVIDER = "com.google.zxing.client.android" | ||
31 | } | ||
32 | |||
33 | private var joinDialog: View? = null | ||
34 | |||
35 | override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { | ||
36 | super.onActivityResult(requestCode, resultCode, data) | ||
37 | |||
38 | if (requestCode == REQUEST_SCAN && resultCode == Activity.RESULT_OK) | ||
39 | joinDialog?.invitation_url?.setText(data!!.getStringExtra("SCAN_RESULT").trim()) | ||
40 | } | ||
41 | |||
25 | override fun onCreate(savedInstanceState: Bundle?) { | 42 | override fun onCreate(savedInstanceState: Bundle?) { |
26 | super.onCreate(savedInstanceState) | 43 | super.onCreate(savedInstanceState) |
27 | supportActionBar!!.setDisplayHomeAsUpEnabled(true) | 44 | supportActionBar!!.setDisplayHomeAsUpEnabled(true) |
@@ -29,40 +46,32 @@ class ConfigureActivity : BaseActivity() { | |||
29 | writeContent() | 46 | writeContent() |
30 | } | 47 | } |
31 | 48 | ||
32 | fun openGenerateConfDialog(@Suppress("UNUSED_PARAMETER") v: View) { | 49 | fun scanCode(@Suppress("UNUSED_PARAMETER") v: View) { |
33 | val netNameField = EditText(this) | 50 | try { |
34 | netNameField.layoutParams = FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT) | 51 | startActivityForResult(Intent("$SCAN_PROVIDER.SCAN"), REQUEST_SCAN) |
35 | netNameField.setHint(R.string.field_net_name) | 52 | } catch (e: ActivityNotFoundException) { |
36 | 53 | AlertDialog.Builder(this).setTitle(R.string.action_scan_qr_code) | |
37 | val nodeNameField = EditText(this) | 54 | .setMessage(R.string.message_no_qr_code_scanner) |
38 | nodeNameField.layoutParams = FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT) | 55 | .setPositiveButton(R.string.action_install) { _, _ -> |
39 | nodeNameField.setHint(R.string.field_node_name) | 56 | startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=$SCAN_PROVIDER"))) |
40 | 57 | }.setNegativeButton(R.string.action_cancel, App.dismissAction).show() | |
41 | val dialogFrame = layoutInflater.inflate(R.layout.dialog_frame, main_content, false) as ViewGroup | 58 | } |
42 | dialogFrame.addView(netNameField) | 59 | } |
43 | dialogFrame.addView(nodeNameField) | ||
44 | 60 | ||
45 | AlertDialog.Builder(this).setTitle(R.string.title_new_network).setView(dialogFrame) | 61 | fun openGenerateConfDialog(@Suppress("UNUSED_PARAMETER") v: View) { |
46 | .setPositiveButton(R.string.action_create) { _, _ -> generateConf(netNameField.text.toString(), nodeNameField.text.toString()) } | 62 | val genDialog = layoutInflater.inflate(R.layout.dialog_network_generate, main_content, false) |
47 | .setNegativeButton(R.string.action_cancel, App.dismissAction).show() | 63 | AlertDialog.Builder(this).setTitle(R.string.title_new_network).setView(genDialog) |
64 | .setPositiveButton(R.string.action_create) { _, _ -> | ||
65 | generateConf(genDialog.new_net_name.text.toString(), genDialog.new_node_name.text.toString()) | ||
66 | }.setNegativeButton(R.string.action_cancel, App.dismissAction).show() | ||
48 | } | 67 | } |
49 | 68 | ||
50 | fun openJoinNetworkDialog(@Suppress("UNUSED_PARAMETER") v: View) { | 69 | fun openJoinNetworkDialog(@Suppress("UNUSED_PARAMETER") v: View) { |
51 | val netNameField = EditText(this) | 70 | joinDialog = layoutInflater.inflate(R.layout.dialog_network_join, main_content, false) |
52 | netNameField.layoutParams = FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT) | 71 | AlertDialog.Builder(this).setTitle(R.string.title_join_network).setView(joinDialog) |
53 | netNameField.setHint(R.string.field_net_name) | 72 | .setPositiveButton(R.string.action_join) { _, _ -> |
54 | 73 | joinNetwork(joinDialog!!.net_name.text.toString(), joinDialog!!.invitation_url.text.toString()) | |
55 | val joinUrlField = EditText(this) | 74 | }.setNegativeButton(R.string.action_cancel, App.dismissAction).show() |
56 | joinUrlField.layoutParams = FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT) | ||
57 | joinUrlField.setHint(R.string.field_invitation_url) | ||
58 | |||
59 | val dialogFrame = layoutInflater.inflate(R.layout.dialog_frame, main_content, false) as ViewGroup | ||
60 | dialogFrame.addView(netNameField) | ||
61 | dialogFrame.addView(joinUrlField) | ||
62 | |||
63 | AlertDialog.Builder(this).setTitle(R.string.title_join_network).setView(dialogFrame) | ||
64 | .setPositiveButton(R.string.action_join) { _, _ -> joinNetwork(netNameField.text.toString(), joinUrlField.text.toString()) } | ||
65 | .setNegativeButton(R.string.action_cancel, App.dismissAction).show() | ||
66 | } | 75 | } |
67 | 76 | ||
68 | private fun writeContent() { | 77 | private fun writeContent() { |
diff --git a/app/src/main/java/org/pacien/tincapp/activities/StatusActivity.kt b/app/src/main/java/org/pacien/tincapp/activities/StatusActivity.kt index 6d97dca..356ff6e 100644 --- a/app/src/main/java/org/pacien/tincapp/activities/StatusActivity.kt +++ b/app/src/main/java/org/pacien/tincapp/activities/StatusActivity.kt | |||
@@ -12,7 +12,7 @@ import android.widget.ArrayAdapter | |||
12 | import android.widget.TextView | 12 | import android.widget.TextView |
13 | import java8.util.concurrent.CompletableFuture | 13 | import java8.util.concurrent.CompletableFuture |
14 | import kotlinx.android.synthetic.main.base.* | 14 | import kotlinx.android.synthetic.main.base.* |
15 | import kotlinx.android.synthetic.main.dialog_text_monopsace.view.* | 15 | import kotlinx.android.synthetic.main.dialog_node_details.view.* |
16 | import kotlinx.android.synthetic.main.fragment_list_view.* | 16 | import kotlinx.android.synthetic.main.fragment_list_view.* |
17 | import kotlinx.android.synthetic.main.fragment_network_status_header.* | 17 | import kotlinx.android.synthetic.main.fragment_network_status_header.* |
18 | import org.pacien.tincapp.R | 18 | import org.pacien.tincapp.R |
@@ -36,7 +36,7 @@ class StatusActivity : BaseActivity(), AdapterView.OnItemClickListener, SwipeRef | |||
36 | override fun onCreate(savedInstanceState: Bundle?) { | 36 | override fun onCreate(savedInstanceState: Bundle?) { |
37 | super.onCreate(savedInstanceState) | 37 | super.onCreate(savedInstanceState) |
38 | 38 | ||
39 | nodeListAdapter = ArrayAdapter<String>(this, R.layout.fragment_list_item) | 39 | nodeListAdapter = ArrayAdapter(this, R.layout.fragment_list_item) |
40 | refreshTimer = Timer(true) | 40 | refreshTimer = Timer(true) |
41 | 41 | ||
42 | layoutInflater.inflate(R.layout.fragment_list_view, main_content) | 42 | layoutInflater.inflate(R.layout.fragment_list_view, main_content) |
@@ -81,7 +81,7 @@ class StatusActivity : BaseActivity(), AdapterView.OnItemClickListener, SwipeRef | |||
81 | getNodeNames().thenAccept { | 81 | getNodeNames().thenAccept { |
82 | runOnUiThread { | 82 | runOnUiThread { |
83 | nodeListAdapter?.setElements(it) | 83 | nodeListAdapter?.setElements(it) |
84 | node_list_placeholder.visibility = if (nodeListAdapter?.isEmpty ?: true) View.VISIBLE else View.GONE | 84 | node_list_placeholder.visibility = if (nodeListAdapter?.isEmpty != false) View.VISIBLE else View.GONE |
85 | list_wrapper.isRefreshing = false | 85 | list_wrapper.isRefreshing = false |
86 | if (!TincVpnService.isConnected()) openStartActivity() | 86 | if (!TincVpnService.isConnected()) openStartActivity() |
87 | } | 87 | } |
@@ -90,10 +90,10 @@ class StatusActivity : BaseActivity(), AdapterView.OnItemClickListener, SwipeRef | |||
90 | 90 | ||
91 | override fun onItemClick(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { | 91 | override fun onItemClick(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { |
92 | val nodeName = (view as TextView).text.toString() | 92 | val nodeName = (view as TextView).text.toString() |
93 | val dialogTextView = layoutInflater.inflate(R.layout.dialog_text_monopsace, main_content, false) | 93 | val dialogTextView = layoutInflater.inflate(R.layout.dialog_node_details, main_content, false) |
94 | Tinc.info(TincVpnService.getCurrentNetName()!!, nodeName).thenAccept { | 94 | Tinc.info(TincVpnService.getCurrentNetName()!!, nodeName).thenAccept { |
95 | runOnUiThread { | 95 | runOnUiThread { |
96 | dialogTextView.dialog_text_monospace.text = it | 96 | dialogTextView.dialog_node_details.text = it |
97 | AlertDialog.Builder(this) | 97 | AlertDialog.Builder(this) |
98 | .setTitle(R.string.title_node_info) | 98 | .setTitle(R.string.title_node_info) |
99 | .setView(dialogTextView) | 99 | .setView(dialogTextView) |
diff --git a/app/src/main/res/drawable/ic_photo_camera_primary_24dp.xml b/app/src/main/res/drawable/ic_photo_camera_primary_24dp.xml new file mode 100644 index 0000000..28172b6 --- /dev/null +++ b/app/src/main/res/drawable/ic_photo_camera_primary_24dp.xml | |||
@@ -0,0 +1,12 @@ | |||
1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" | ||
2 | android:width="24dp" | ||
3 | android:height="24dp" | ||
4 | android:viewportHeight="24.0" | ||
5 | android:viewportWidth="24.0"> | ||
6 | <path | ||
7 | android:fillColor="@color/textPrimary" | ||
8 | android:pathData="M12,12m-3.2,0a3.2,3.2 0,1 1,6.4 0a3.2,3.2 0,1 1,-6.4 0"/> | ||
9 | <path | ||
10 | android:fillColor="@color/textPrimary" | ||
11 | android:pathData="M9,2L7.17,4L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2h-3.17L15,2L9,2zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5z"/> | ||
12 | </vector> | ||
diff --git a/app/src/main/res/layout/dialog_frame.xml b/app/src/main/res/layout/dialog_network_generate.xml index 9b4a512..cc51b7b 100644 --- a/app/src/main/res/layout/dialog_frame.xml +++ b/app/src/main/res/layout/dialog_network_generate. |