diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2020-03-30 14:52:17 -0300 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2020-03-30 14:52:17 -0300 |
| commit | 365ccb65b6b03d3dde3f34f335cdd23e084c3600 (patch) | |
| tree | 85c1de4058d29e1fb2da2e848f74f9ad5e1096eb /android | |
| parent | 0f09b3ea7e56382772508a717c1bca3422a9fd52 (diff) | |
| parent | 6beaf59cf1a5e9abb1dbea6c4e440a6644784f10 (diff) | |
| download | mullvadvpn-365ccb65b6b03d3dde3f34f335cdd23e084c3600.tar.xz mullvadvpn-365ccb65b6b03d3dde3f34f335cdd23e084c3600.zip | |
Merge branch 'wireguard-mtu-android'
Diffstat (limited to 'android')
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 |
