aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java/org
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/org')
-rw-r--r--app/src/main/java/org/pacien/tincapp/activities/BaseActivity.java71
-rw-r--r--app/src/main/java/org/pacien/tincapp/activities/StartActivity.java82
-rw-r--r--app/src/main/java/org/pacien/tincapp/commands/Command.java67
-rw-r--r--app/src/main/java/org/pacien/tincapp/commands/Executor.java44
-rw-r--r--app/src/main/java/org/pacien/tincapp/commands/PermissionFixer.java34
-rw-r--r--app/src/main/java/org/pacien/tincapp/commands/Tinc.java60
-rw-r--r--app/src/main/java/org/pacien/tincapp/commands/Tincd.java28
-rw-r--r--app/src/main/java/org/pacien/tincapp/context/AppInfo.java42
-rw-r--r--app/src/main/java/org/pacien/tincapp/context/AppPaths.java75
-rw-r--r--app/src/main/java/org/pacien/tincapp/service/TincVpnService.java51
-rw-r--r--app/src/main/java/org/pacien/tincapp/service/VpnInterfaceConfigurator.java81
-rw-r--r--app/src/main/java/org/pacien/tincapp/util/Function.java28
12 files changed, 663 insertions, 0 deletions
diff --git a/app/src/main/java/org/pacien/tincapp/activities/BaseActivity.java b/app/src/main/java/org/pacien/tincapp/activities/BaseActivity.java
new file mode 100644
index 0000000..0e6cb95
--- /dev/null
+++ b/app/src/main/java/org/pacien/tincapp/activities/BaseActivity.java
@@ -0,0 +1,71 @@
1package org.pacien.tincapp.activities;
2
3import android.content.ClipData;
4import android.content.ClipboardManager;
5import android.content.Context;
6import android.content.Intent;
7import android.net.Uri;
8import android.os.Bundle;
9import android.support.annotation.StringRes;
10import android.support.design.widget.Snackbar;
11import android.support.v7.app.AlertDialog;
12import android.support.v7.app.AppCompatActivity;
13import android.support.v7.widget.Toolbar;
14import android.view.Menu;
15import android.view.MenuItem;
16import android.view.ViewGroup;
17
18import org.pacien.tincapp.BuildConfig;
19import org.pacien.tincapp.R;
20import org.pacien.tincapp.context.AppInfo;
21
22/**
23 * @author pacien
24 */
25public abstract class BaseActivity extends AppCompatActivity {
26
27 @Override
28 protected void onCreate(Bundle savedInstanceState) {
29 super.onCreate(savedInstanceState);
30 setContentView(R.layout.base);
31 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
32 setSupportActionBar(toolbar);
33 }
34
35 @Override
36 public boolean onCreateOptionsMenu(Menu m) {
37 getMenuInflater().inflate(R.menu.menu_base, m);
38 return true;
39 }
40
41 public void aboutDialog(MenuItem i) {
42 new AlertDialog.Builder(this)
43 .setTitle(BuildConfig.APPLICATION_ID)
44 .setMessage(getResources().getString(R.string.app_short_desc) + "\n\n" +
45 getResources().getString(R.string.app_copyright) + " " +
46 getResources().getString(R.string.app_license) + "\n\n" +
47 AppInfo.all(getResources()))
48 .setNeutralButton(R.string.action_open_project_website, (dialog, which) -> openWebsite(R.string.app_website_url))
49 .setPositiveButton(R.string.action_close, (dialog, which) -> { /* nop */ })
50 .show();
51 }
52
53 protected ViewGroup getContentView() {
54 return (ViewGroup) findViewById(R.id.main_content);
55 }
56
57 protected void openWebsite(@StringRes int url) {
58 startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getResources().getString(url))));
59 }
60
61 protected void notify(@StringRes int msg) {
62 Snackbar.make(findViewById(R.id.activity_base), msg, Snackbar.LENGTH_LONG).show();
63 }
64
65 protected void copyIntoClipboard(String label, String str) {
66 ClipboardManager c = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
67 c.setPrimaryClip(ClipData.newPlainText(label, str));
68 notify(R.string.message_text_copied);
69 }
70
71}
diff --git a/app/src/main/java/org/pacien/tincapp/activities/StartActivity.java b/app/src/main/java/org/pacien/tincapp/activities/StartActivity.java
new file mode 100644
index 0000000..e469fa0
--- /dev/null
+++ b/app/src/main/java/org/pacien/tincapp/activities/StartActivity.java
@@ -0,0 +1,82 @@
1package org.pacien.tincapp.activities;
2
3import android.annotation.SuppressLint;
4import android.content.Intent;
5import android.os.Bundle;
6import android.support.v7.app.AlertDialog;
7import android.view.View;
8import android.view.ViewGroup;
9import android.widget.EditText;
10import android.widget.FrameLayout;
11
12import org.pacien.tincapp.R;
13import org.pacien.tincapp.commands.PermissionFixer;
14import org.pacien.tincapp.context.AppPaths;
15import org.pacien.tincapp.service.TincVpnService;
16
17/**
18 * @author pacien
19 */
20public class StartActivity extends BaseActivity {
21
22 @Override
23 protected void onCreate(Bundle savedInstanceState) {
24 super.onCreate(savedInstanceState);
25 getLayoutInflater().inflate(R.layout.page_start, getContentView());
26 }
27
28 @Override
29 protected void onActivityResult(int request, int result, Intent data) {
30 notify(result == RESULT_OK ? R.string.message_vpn_permissions_granted : R.string.message_vpn_permissions_denied);
31 }
32
33 public void requestVpnPermission(View v) {
34 Intent askPermIntent = TincVpnService.prepare(this);
35
36 if (askPermIntent != null)
37 startActivityForResult(askPermIntent, 0);
38 else
39 onActivityResult(0, RESULT_OK, null);
40 }
41
42 public void startVpnDialog(View v) {
43 final EditText i = new EditText(this);
44 i.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
45 i.setHint(R.string.field_net_name);
46
47 @SuppressLint("InflateParams")
48 ViewGroup vg = (ViewGroup) getLayoutInflater().inflate(R.layout.dialog_frame, null);
49 vg.addView(i);
50
51 new AlertDialog.Builder(this)
52 .setTitle(R.string.title_connect_to_network)
53 .setView(vg)
54 .setPositiveButton(R.string.action_connect, (dialog, which) -> startVpn(i.getText().toString()))
55 .setNegativeButton(R.string.action_close, (dialog, which) -> { /* nop */ })
56 .show();
57 }
58
59 public void confDirDialog(View v) {
60 String confDir = AppPaths.confDir(this).getPath();
61
62 new AlertDialog.Builder(this)
63 .setTitle(R.string.title_tinc_config_dir)
64 .setMessage(confDir)
65 .setNeutralButton(R.string.action_fix_perms, (dialog, which) -> fixPerms())
66 .setNegativeButton(R.string.action_copy,
67 (dialog, which) -> copyIntoClipboard(getResources().getString(R.string.title_tinc_config_dir), confDir))
68 .setPositiveButton(R.string.action_close, (dialog, which) -> { /* nop */ })
69 .show();
70 }
71
72 private void startVpn(String netName) {
73 startService(new Intent(this, TincVpnService.class)
74 .putExtra(TincVpnService.INTENT_EXTRA_NET_NAME, netName));
75 }
76
77 private void fixPerms() {
78 boolean ok = PermissionFixer.makePrivateDirsPublic(getApplicationContext());
79 notify(ok ? R.string.message_perms_fixed : R.string.message_perms_fix_failure);
80 }
81
82}
diff --git a/app/src/main/java/org/pacien/tincapp/commands/Command.java b/app/src/main/java/org/pacien/tincapp/commands/Command.java
new file mode 100644
index 0000000..28ff226
--- /dev/null
+++ b/app/src/main/java/org/pacien/tincapp/commands/Command.java
@@ -0,0 +1,67 @@
1package org.pacien.tincapp.commands;
2
3import com.annimon.stream.Collectors;
4import com.annimon.stream.Optional;
5import com.annimon.stream.Stream;
6
7import java.util.Arrays;
8import java.util.Collections;
9import java.util.LinkedList;
10import java.util.List;
11
12/**
13 * @author pacien
14 */
15class Command {
16
17 static private class Option {
18 final String key;
19 final Optional<java.lang.String> val;
20
21 Option(String key, String val) {
22 this.key = key;
23 this.val = Optional.ofNullable(val);
24 }
25
26 @Override