summaryrefslogtreecommitdiffhomepage
path: root/android/src
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-03-30 14:52:17 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-03-30 14:52:17 -0300
commit365ccb65b6b03d3dde3f34f335cdd23e084c3600 (patch)
tree85c1de4058d29e1fb2da2e848f74f9ad5e1096eb /android/src
parent0f09b3ea7e56382772508a717c1bca3422a9fd52 (diff)
parent6beaf59cf1a5e9abb1dbea6c4e440a6644784f10 (diff)
downloadmullvadvpn-365ccb65b6b03d3dde3f34f335cdd23e084c3600.tar.xz
mullvadvpn-365ccb65b6b03d3dde3f34f335cdd23e084c3600.zip
Merge branch 'wireguard-mtu-android'
Diffstat (limited to 'android/src')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/model/Settings.kt1
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/model/TunnelOptions.kt5
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt5
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AdvancedFragment.kt66
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/CellInput.kt60
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/SettingsFragment.kt8
-rw-r--r--android/src/main/kotlin/net/mullvad/talpid/net/wireguard/TunnelOptions.kt3
-rw-r--r--android/src/main/res/drawable/cell_input_background.xml6
-rw-r--r--android/src/main/res/drawable/cell_input_cursor.xml6
-rw-r--r--android/src/main/res/layout/advanced.xml76
-rw-r--r--android/src/main/res/layout/settings.xml24
-rw-r--r--android/src/main/res/values/colors.xml1
-rw-r--r--android/src/main/res/values/strings.xml5
13 files changed, 266 insertions, 0 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/Settings.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/Settings.kt
index 2b8aa28b53..d9c10a6a01 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/Settings.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/Settings.kt
@@ -5,5 +5,6 @@ data class Settings(
var relaySettings: RelaySettings,
var allowLan: Boolean,
var autoConnect: Boolean,
+ var tunnelOptions: TunnelOptions,
var showBetaReleases: Boolean?
)
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/TunnelOptions.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/TunnelOptions.kt
new file mode 100644
index 0000000000..7579a469ca
--- /dev/null
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/TunnelOptions.kt
@@ -0,0 +1,5 @@
+package net.mullvad.mullvadvpn.model
+
+import net.mullvad.talpid.net.wireguard.TunnelOptions as WireguardTunnelOptions
+
+data class TunnelOptions(val wireguard: WireguardTunnelOptions)
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt
index 65d123e31a..60dce6ff10 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt
@@ -97,6 +97,10 @@ class MullvadDaemon(val vpnService: MullvadVpnService) {
setAutoConnect(daemonInterfaceAddress, autoConnect)
}
+ fun setWireguardMtu(wireguardMtu: Int?) {
+ setWireguardMtu(daemonInterfaceAddress, wireguardMtu)
+ }
+
fun shutdown() {
shutdown(daemonInterfaceAddress)
}
@@ -132,6 +136,7 @@ class MullvadDaemon(val vpnService: MullvadVpnService) {
private external fun setAccount(daemonInterfaceAddress: Long, accountToken: String?)
private external fun setAllowLan(daemonInterfaceAddress: Long, allowLan: Boolean)
private external fun setAutoConnect(daemonInterfaceAddress: Long, alwaysOn: Boolean)
+ private external fun setWireguardMtu(daemonInterfaceAddress: Long, wireguardMtu: Int?)
private external fun shutdown(daemonInterfaceAddress: Long)
private external fun updateRelaySettings(
daemonInterfaceAddress: Long,
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AdvancedFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AdvancedFragment.kt
new file mode 100644
index 0000000000..ec39ee2100
--- /dev/null
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AdvancedFragment.kt
@@ -0,0 +1,66 @@
+package net.mullvad.mullvadvpn.ui
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.launch
+import net.mullvad.mullvadvpn.R
+import net.mullvad.mullvadvpn.model.Settings
+
+private const val MIN_MTU_VALUE = 1280
+private const val MAX_MTU_VALUE = 1420
+
+class AdvancedFragment : ServiceDependentFragment(OnNoService.GoBack) {
+ private lateinit var wireguardMtuInput: CellInput
+
+ private var subscriptionId: Int? = null
+ private var updateUiJob: Job? = null
+
+ override fun onSafelyCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ val view = inflater.inflate(R.layout.advanced, container, false)
+
+ view.findViewById<View>(R.id.back).setOnClickListener {
+ parentActivity.onBackPressed()
+ }
+
+ wireguardMtuInput =
+ CellInput(view.findViewById(R.id.wireguard_mtu_input), MIN_MTU_VALUE, MAX_MTU_VALUE)
+
+ wireguardMtuInput.onSubmit = { mtu ->
+ GlobalScope.launch(Dispatchers.Default) {
+ daemon.setWireguardMtu(mtu)
+ }
+ }
+
+ view.findViewById<TextView>(R.id.wireguard_mtu_footer).apply {
+ text = context.getString(R.string.wireguard_mtu_footer, MIN_MTU_VALUE, MAX_MTU_VALUE)
+ }
+
+ settingsListener.subscribe({ settings -> updateUi(settings) })
+
+ return view
+ }
+
+ private fun updateUi(settings: Settings) {
+ updateUiJob?.cancel()
+ updateUiJob = GlobalScope.launch(Dispatchers.Main) {
+ if (!wireguardMtuInput.hasFocus) {
+ wireguardMtuInput.value = settings.tunnelOptions.wireguard.mtu
+ }
+ }
+ }
+
+ override fun onSafelyDestroyView() {
+ subscriptionId?.let { id -> settingsListener.unsubscribe(id) }
+ updateUiJob?.cancel()
+ }
+}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/CellInput.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/CellInput.kt
new file mode 100644
index 0000000000..0d5ede54fb
--- /dev/null
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/CellInput.kt
@@ -0,0 +1,60 @@
+package net.mullvad.mullvadvpn.ui
+
+import android.text.Editable
+import android.text.TextWatcher
+import android.widget.EditText
+import net.mullvad.mullvadvpn.R
+
+class CellInput(val input: EditText, val minValue: Int, val maxValue: Int) {
+ private val resources = input.context.resources
+
+ private val validInputColor = resources.getColor(R.color.white)
+ private val invalidInputColor = resources.getColor(R.color.red)
+
+ var value
+ get() = input.text.toString().trim().toIntOrNull()
+ set(value) {
+ input.setText(value?.toString() ?: "")
+ }
+
+ var onSubmit: ((Int?) -> Unit)? = null
+
+ var hasFocus = false
+ private set(value) {
+ if (field != value) {
+ field = value
+
+ if (value == false) {
+ val inputValue = this@CellInput.value
+
+ if (inputValue == null || (inputValue >= minValue && inputValue <= maxValue)) {
+ onSubmit?.invoke(inputValue)
+ }
+ }
+ }
+ }
+
+ init {
+ input.apply {
+ addTextChangedListener(InputWatcher())
+
+ setOnFocusChangeListener { _, newHasFocus -> hasFocus = newHasFocus }
+ }
+ }
+
+ inner class InputWatcher : TextWatcher {
+ override fun beforeTextChanged(text: CharSequence, start: Int, count: Int, after: Int) {}
+
+ override fun onTextChanged(text: CharSequence, start: Int, count: Int, after: Int) {}
+
+ override fun afterTextChanged(text: Editable) {
+ val value = text.toString().trim().toIntOrNull()
+
+ if (value != null && value >= minValue && value <= maxValue) {
+ input.setTextColor(validInputColor)
+ } else {
+ input.setTextColor(invalidInputColor)
+ }
+ }
+ }
+}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/SettingsFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/SettingsFragment.kt
index 154339b10a..8b9a30bd32 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/SettingsFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/SettingsFragment.kt
@@ -25,6 +25,7 @@ class SettingsFragment : ServiceAwareFragment() {
private lateinit var appVersionLabel: TextView
private lateinit var appVersionFooter: View
private lateinit var preferencesMenu: View
+ private lateinit var advancedMenu: View
private lateinit var remainingTimeLabel: RemainingTimeLabel
private lateinit var wireguardKeysMenu: View
@@ -76,6 +77,12 @@ class SettingsFragment : ServiceAwareFragment() {
}
}
+ advancedMenu = view.findViewById<View>(R.id.advanced).apply {
+ setOnClickListener {
+ openSubFragment(AdvancedFragment())
+ }
+ }
+
wireguardKeysMenu = view.findViewById<View>(R.id.wireguard_keys).apply {
setOnClickListener {
openSubFragment(WireguardKeyFragment())
@@ -173,6 +180,7 @@ class SettingsFragment : ServiceAwareFragment() {
accountMenu.visibility = visibility
preferencesMenu.visibility = visibility
+ advancedMenu.visibility = visibility
wireguardKeysMenu.visibility = visibility
}
diff --git a/android/src/main/kotlin/net/mullvad/talpid/net/wireguard/TunnelOptions.kt b/android/src/main/kotlin/net/mullvad/talpid/net/wireguard/TunnelOptions.kt
new file mode 100644
index 0000000000..bbba95fa6d
--- /dev/null
+++ b/android/src/main/kotlin/net/mullvad/talpid/net/wireguard/TunnelOptions.kt
@@ -0,0 +1,3 @@
+package net.mullvad.talpid.net.wireguard
+
+data class TunnelOptions(val mtu: Int?)
diff --git a/android/src/main/res/drawable/cell_input_background.xml b/android/src/main/res/drawable/cell_input_background.xml
new file mode 100644
index 0000000000..a08eb4cbcc
--- /dev/null
+++ b/android/src/main/res/drawable/cell_input_background.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <corners android:radius="4dp" />
+ <solid android:color="@color/white10" />
+</shape>
diff --git a/android/src/main/res/drawable/cell_input_cursor.xml b/android/src/main/res/drawable/cell_input_cursor.xml
new file mode 100644
index 0000000000..781c1d9b87
--- /dev/null
+++ b/android/src/main/res/drawable/cell_input_cursor.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <solid android:color="@color/white" />
+ <size android:width="1sp"
+ android:height="24sp" />
+</shape>
diff --git a/android/src/main/res/layout/advanced.xml b/android/src/main/res/layout/advanced.xml
new file mode 100644
index 0000000000..966200fee1
--- /dev/null
+++ b/android/src/main/res/layout/advanced.xml
@@ -0,0 +1,76 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/darkBlue"
+ android:orientation="vertical"
+ android:gravity="left"
+ android:elevation="2dp">
+ <LinearLayout android:id="@+id/back"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:padding="12dp"
+ android:orientation="horizontal"
+ android:gravity="center_vertical | left"
+ android:clickable="true"
+ android:background="?android:attr/selectableItemBackground">
+
+ <ImageView android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:layout_marginRight="8dp"
+ android:src="@drawable/icon_back" />
+ <TextView android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textColor="@color/white60"
+ android:textSize="13sp"
+ android:textStyle="bold"
+ android:text="@string/settings" />
+ </LinearLayout>
+ <TextView android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="4dp"
+ android:layout_marginLeft="24dp"
+ android:textColor="@color/white"
+ android:textSize="32sp"
+ android:textStyle="bold"
+ android:text="@string/settings_advanced" />
+ <LinearLayout android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="24dp"
+ android:paddingHorizontal="16dp"
+ android:background="@drawable/cell_button_background"
+ android:gravity="center">
+ <TextView android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:paddingHorizontal="8dp"
+ android:paddingVertical="17dp"
+ android:textColor="@color/white"
+ android:textSize="20sp"
+ android:textStyle="bold"
+ android:text="@string/wireguard_mtu" />
+ <EditText android:id="@+id/wireguard_mtu_input"
+ android:layout_width="80dp"
+ android:layout_height="34dp"
+ android:layout_weight="0"
+ android:paddingHorizontal="4dp"
+ android:background="@drawable/cell_input_background"
+ android:digits="0123456789"
+ android:inputType="number"
+ android:singleLine="true"
+ android:imeOptions="flagNoPersonalizedLearning"
+ android:textCursorDrawable="@drawable/cell_input_cursor"
+ android:gravity="center"
+ android:hint="@string/hint_default"
+ android:textColorHint="@color/white80"
+ android:textColor="@color/white"
+ android:textSize="20sp"
+ />
+ </LinearLayout>
+ <TextView android:id="@+id/wireguard_mtu_footer"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="8dp"
+ android:paddingHorizontal="24dp"
+ android:textColor="@color/white60"
+ android:textSize="13sp" />
+</LinearLayout>
diff --git a/android/src/main/res/layout/settings.xml b/android/src/main/res/layout/settings.xml
index 52fbc1e27b..5909f54faa 100644
--- a/android/src/main/res/layout/settings.xml
+++ b/android/src/main/res/layout/settings.xml
@@ -84,6 +84,30 @@
android:alpha="0.6"
android:src="@drawable/icon_chevron" />
</LinearLayout>
+ <LinearLayout android:id="@+id/advanced"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="1dp"
+ android:paddingHorizontal="16dp"
+ android:background="@drawable/cell_button_background"
+ android:clickable="true"
+ android:gravity="center"
+ android:visibility="gone">
+ <TextView android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:paddingHorizontal="8dp"
+ android:paddingVertical="17dp"
+ android:textColor="@color/white"
+ android:textSize="20sp"
+ android:textStyle="bold"
+ android:text="@string/settings_advanced" />
+ <ImageView android:layout_width="14dp"
+ android:layout_height="24dp"
+ android:layout_weight="0"
+ android:alpha="0.6"
+ android:src="@drawable/icon_chevron" />
+ </LinearLayout>
<LinearLayout android:id="@+id/wireguard_keys"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/android/src/main/res/values/colors.xml b/android/src/main/res/values/colors.xml
index 0649c967e5..bc18d267f5 100644
--- a/android/src/main/res/values/colors.xml
+++ b/android/src/main/res/values/colors.xml
@@ -11,6 +11,7 @@
<color name="white60">#99FFFFFF</color>
<color name="white40">#66FFFFFF</color>
<color name="white20">#33FFFFFF</color>
+ <color name="white10">#1AFFFFFF</color>
<color name="green">#44AD4D</color>
<color name="green90">#E644AD4D</color>
<color name="red">#FFE34039</color>
diff --git a/android/src/main/res/values/strings.xml b/android/src/main/res/values/strings.xml
index 93fc45ad30..a9c5cdab2a 100644
--- a/android/src/main/res/values/strings.xml
+++ b/android/src/main/res/values/strings.xml
@@ -35,6 +35,7 @@
left</string>
<string name="out_of_time">Out of time</string>
<string name="settings_preferences">Preferences</string>
+ <string name="settings_advanced">Advanced</string>
<string name="app_version">App version</string>
<string name="update_available_footer">Update available,
download to remain safe.</string>
@@ -54,6 +55,10 @@
<string name="auto_connect">Auto-connect</string>
<string name="auto_connect_footer">Automatically connect to a
server when the app launches.</string>
+ <string name="wireguard_mtu">WireGuard MTU</string>
+ <string name="wireguard_mtu_footer">Set WireGuard MTU value. Valid range:
+ %1$d - %2$d.</string>
+ <string name="hint_default">Default</string>
<string name="problem_report_description">To help you more
effectively, your app\'s log file will be attached to this
message. Your data will remain secure and private, as it is