diff options
Diffstat (limited to 'app/src/main/java/org/pacien/tincapp/extensions')
4 files changed, 109 insertions, 0 deletions
diff --git a/app/src/main/java/org/pacien/tincapp/extensions/Android.kt b/app/src/main/java/org/pacien/tincapp/extensions/Android.kt new file mode 100644 index 0000000..f10c4c7 --- /dev/null +++ b/app/src/main/java/org/pacien/tincapp/extensions/Android.kt | |||
@@ -0,0 +1,24 @@ | |||
1 | package org.pacien.tincapp.extensions | ||
2 | |||
3 | import android.widget.ArrayAdapter | ||
4 | import android.widget.TextView | ||
5 | import org.pacien.tincapp.R | ||
6 | import org.pacien.tincapp.context.App | ||
7 | |||
8 | /** | ||
9 | * @author pacien | ||
10 | */ | ||
11 | object Android { | ||
12 | |||
13 | fun <T> ArrayAdapter<T>.setElements(elems: Collection<T>) { | ||
14 | setNotifyOnChange(false) | ||
15 | clear() | ||
16 | addAll(elems) | ||
17 | notifyDataSetChanged() | ||
18 | setNotifyOnChange(true) | ||
19 | } | ||
20 | |||
21 | fun TextView.setText(list: List<String>) = | ||
22 | if (list.isNotEmpty()) text = list.joinToString("\n") else text = App.getContext().getString(R.string.value_none) | ||
23 | |||
24 | } | ||
diff --git a/app/src/main/java/org/pacien/tincapp/extensions/ApacheConfiguration.kt b/app/src/main/java/org/pacien/tincapp/extensions/ApacheConfiguration.kt new file mode 100644 index 0000000..eb4bb47 --- /dev/null +++ b/app/src/main/java/org/pacien/tincapp/extensions/ApacheConfiguration.kt | |||
@@ -0,0 +1,16 @@ | |||
1 | package org.pacien.tincapp.extensions | ||
2 | |||
3 | |||
4 | import org.apache.commons.configuration2.Configuration | ||
5 | import org.pacien.tincapp.data.CidrAddress | ||
6 | |||
7 | /** | ||
8 | * @author pacien | ||
9 | */ | ||
10 | object ApacheConfiguration { | ||
11 | |||
12 | fun Configuration.getStringList(key: String): List<String> = getList(String::class.java, key, emptyList()) | ||
13 | fun Configuration.getCidrList(key: String): List<CidrAddress> = getStringList(key).map { CidrAddress.fromSlashSeparated(it) } | ||
14 | fun Configuration.getIntList(key: String): List<Int> = getList(Int::class.java, key, emptyList()) | ||
15 | |||
16 | } | ||
diff --git a/app/src/main/java/org/pacien/tincapp/extensions/Java.kt b/app/src/main/java/org/pacien/tincapp/extensions/Java.kt new file mode 100644 index 0000000..af3c1af --- /dev/null +++ b/app/src/main/java/org/pacien/tincapp/extensions/Java.kt | |||
@@ -0,0 +1,18 @@ | |||
1 | package org.pacien.tincapp.extensions | ||
2 | |||
3 | import java8.util.concurrent.CompletableFuture | ||
4 | |||
5 | /** | ||
6 | * @author pacien | ||
7 | */ | ||
8 | object Java { | ||
9 | |||
10 | fun <T> CompletableFuture<T>.exceptionallyAccept(fn: (Throwable) -> Unit) = exceptionally { fn(it); null }!! | ||
11 | |||
12 | fun <A, R> applyIgnoringException(f: (A) -> R, x: A, alt: R? = null) = try { | ||
13 | f(x) | ||
14 | } catch (_: Exception) { | ||
15 | alt | ||
16 | } | ||
17 | |||
18 | } | ||
diff --git a/app/src/main/java/org/pacien/tincapp/extensions/VpnServiceBuilder.kt b/app/src/main/java/org/pacien/tincapp/extensions/VpnServiceBuilder.kt new file mode 100644 index 0000000..870668a --- /dev/null +++ b/app/src/main/java/org/pacien/tincapp/extensions/VpnServiceBuilder.kt | |||
@@ -0,0 +1,51 @@ | |||
1 | package org.pacien.tincapp.extensions | ||
2 | |||
3 | import android.net.VpnService | ||
4 | import org.pacien.tincapp.data.CidrAddress | ||
5 | import org.pacien.tincapp.data.VpnInterfaceConfiguration | ||
6 | import org.pacien.tincapp.extensions.Java.applyIgnoringException | ||
7 | |||
8 | /** | ||
9 | * @author pacien | ||
10 | */ | ||
11 | object VpnServiceBuilder { | ||
12 | |||
13 | fun VpnService.Builder.addAddress(cidr: CidrAddress): VpnService.Builder = addAddress(cidr.address, cidr.prefix) | ||
14 | fun VpnService.Builder.addRoute(cidr: CidrAddress): VpnService.Builder = addRoute(cidr.address, cidr.prefix) | ||
15 | fun VpnService.Builder.allowBypass(allow: Boolean): VpnService.Builder = if (allow) allowBypass() else this | ||
16 | fun VpnService.Builder.overrideMtu(mtu: Int?): VpnService.Builder = if (mtu != null) setMtu(mtu) else this | ||
17 | |||
18 | fun VpnService.Builder.addAddresses(cidrList: List<CidrAddress>): VpnService.Builder = | ||
19 | cidrList.fold(this, { net, cidr -> net.addAddress(cidr) }) | ||
20 | |||
21 | fun VpnService.Builder.addRoutes(cidrList: List<CidrAddress>): VpnService.Builder = | ||
22 | cidrList.fold(this, { net, cidr -> net.addRoute(cidr) }) | ||
23 | |||
24 | fun VpnService.Builder.addDnsServers(dnsList: List<String>): VpnService.Builder = | ||
25 | dnsList.fold(this, { net, dns -> net.addDnsServer(dns) }) | ||
26 | |||
27 | fun VpnService.Builder.addSearchDomains(domainList: List<String>): VpnService.Builder = | ||
28 | domainList.fold(this, { net, domain -> net.addSearchDomain(domain) }) | ||
29 | |||
30 | fun VpnService.Builder.allowFamilies(familyList: List<Int>): VpnService.Builder = | ||
31 | familyList.fold(this, { net, family -> net.allowFamily(family) }) | ||
32 | |||
33 | fun VpnService.Builder.addAllowedApplications(apps: List<String>): VpnService.Builder = | ||
34 | apps.fold(this, { net, app -> applyIgnoringException(net::addAllowedApplication, app, net)!! }) | ||
35 | |||
36 | fun VpnService.Builder.addDisallowedApplications(apps: List<String>): VpnService.Builder = | ||
37 | apps.fold(this, { net, app -> applyIgnoringException(net::addDisallowedApplication, app, net)!! }) | ||
38 | |||
39 | fun VpnService.Builder.applyCfg(cfg: VpnInterfaceConfiguration): VpnService.Builder = this | ||
40 | .addAddresses(cfg.addresses) | ||
41 | .addRoutes(cfg.routes) | ||
42 | .addDnsServers(cfg.dnsServers) | ||
43 | .addSearchDomains(cfg.searchDomains) | ||
44 | .addAllowedApplications(cfg.allowedApplications) | ||
45 | .addDisallowedApplications(cfg.disallowedApplications) | ||
46 | .allowFamilies(cfg.allowedFamilies) | ||
47 | .allowBypass(cfg.allowBypass) | ||
48 | .setBlocking(cfg.blocking) | ||
49 | .overrideMtu(cfg.mtu) | ||
50 | |||
51 | } | ||