summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
Diffstat (limited to 'android')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt6
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt1
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/SettingsFragment.kt34
-rw-r--r--android/src/main/res/drawable/icon_extlink.xml10
-rw-r--r--android/src/main/res/layout/settings.xml40
-rw-r--r--android/src/main/res/values/strings.xml1
6 files changed, 92 insertions, 0 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
index f5d4d6bd60..33920b749a 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
@@ -36,6 +36,8 @@ class MainActivity : FragmentActivity() {
var daemon = CompletableDeferred<MullvadDaemon>()
private set
+ var currentVersion = fetchCurrentVersion()
+
val connectionProxy = ConnectionProxy(this)
val keyStatusListener = KeyStatusListener(daemon)
val problemReport = MullvadProblemReport()
@@ -149,4 +151,8 @@ class MainActivity : FragmentActivity() {
private fun fetchSettings() = GlobalScope.async(Dispatchers.Default) {
daemon.await().getSettings()
}
+
+ private fun fetchCurrentVersion() = GlobalScope.async(Dispatchers.Default) {
+ daemon.await().getCurrentVersion()
+ }
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt
index e88355c274..9de3dc12d7 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt
@@ -25,6 +25,7 @@ class MullvadDaemon(val vpnService: MullvadVpnService) {
external fun generateWireguardKey(): KeygenEvent?
external fun getAccountData(accountToken: String): AccountData?
external fun getCurrentLocation(): GeoIpLocation?
+ external fun getCurrentVersion(): String
external fun getRelayLocations(): RelayList
external fun getSettings(): Settings
external fun getState(): TunnelState
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/SettingsFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/SettingsFragment.kt
index f82ef1e0a9..967e91b6f9 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/SettingsFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/SettingsFragment.kt
@@ -1,6 +1,13 @@
package net.mullvad.mullvadvpn
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.Job
+
import android.content.Context
+import android.content.Intent
+import android.net.Uri
import android.os.Bundle
import android.support.v4.app.Fragment
import android.view.LayoutInflater
@@ -8,10 +15,14 @@ import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.ImageButton
+import android.widget.TextView
class SettingsFragment : Fragment() {
private lateinit var parentActivity: MainActivity
private lateinit var remainingTimeLabel: RemainingTimeLabel
+ private lateinit var appVersionLabel: TextView
+
+ private var showCurrentVersionJob: Job? = null
override fun onAttach(context: Context) {
super.onAttach(context)
@@ -37,11 +48,17 @@ class SettingsFragment : Fragment() {
view.findViewById<View>(R.id.account).setOnClickListener {
openSubFragment(AccountFragment())
}
+ view.findViewById<View>(R.id.app_version).setOnClickListener {
+ openLink("https://mullvad.net/download/")
+ }
view.findViewById<View>(R.id.report_a_problem).setOnClickListener {
openSubFragment(ProblemReportFragment())
}
remainingTimeLabel = RemainingTimeLabel(parentActivity, view)
+ appVersionLabel = view.findViewById<TextView>(R.id.app_version_label)
+
+ showCurrentVersionJob = showCurrentVersion()
return view
}
@@ -56,6 +73,11 @@ class SettingsFragment : Fragment() {
super.onPause()
}
+ override fun onDestroyView() {
+ showCurrentVersionJob?.cancel()
+ super.onDestroyView()
+ }
+
private fun openSubFragment(fragment: Fragment) {
fragmentManager?.beginTransaction()?.apply {
setCustomAnimations(
@@ -69,4 +91,16 @@ class SettingsFragment : Fragment() {
commit()
}
}
+
+ private fun openLink(url: String) {
+ val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
+
+ startActivity(intent)
+ }
+
+ private fun showCurrentVersion() = GlobalScope.launch(Dispatchers.Main) {
+ val version = parentActivity.currentVersion.await()
+
+ appVersionLabel.setText(version)
+ }
}
diff --git a/android/src/main/res/drawable/icon_extlink.xml b/android/src/main/res/drawable/icon_extlink.xml
new file mode 100644
index 0000000000..2411533520
--- /dev/null
+++ b/android/src/main/res/drawable/icon_extlink.xml
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="16dp"
+ android:height="16dp"
+ android:viewportWidth="16"
+ android:viewportHeight="16">
+ <path
+ android:pathData="M12.5858,2L8.9908,2C8.451,2 8,1.5523 8,1C8,0.4439 8.4464,0 8.997,0L15.003,0C15.547,0 16,0.4464 16,0.997L16,7.003C16,7.547 15.5523,8 15,8C14.4439,8 14,7.5564 14,7.0092L14,3.4142L6.7071,10.7071C6.3166,11.0976 5.6834,11.0976 5.2929,10.7071C4.9024,10.3166 4.9024,9.6834 5.2929,9.2929L12.5858,2ZM8.4645,4L6.4645,6L2,6L2,14L10,14L10,9.5355L12,7.5355L12,14.9975C12,15.5512 11.5442,16 10.9975,16L1.0025,16C0.4488,16 0,15.5442 0,14.9975L0,5.0025C0,4.4488 0.4558,4 1.0025,4L8.4645,4Z"
+ android:fillColor="#FFFFFF"
+ android:fillType="evenOdd"/>
+</vector>
diff --git a/android/src/main/res/layout/settings.xml b/android/src/main/res/layout/settings.xml
index 0be7a8087e..fd86678a75 100644
--- a/android/src/main/res/layout/settings.xml
+++ b/android/src/main/res/layout/settings.xml
@@ -64,6 +64,46 @@
android:src="@drawable/icon_chevron"
/>
</LinearLayout>
+ <LinearLayout android:id="@+id/app_version"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="24dp"
+ android:paddingHorizontal="16dp"
+ android:background="@drawable/cell_button_background"
+ android:clickable="true"
+ 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/app_version"
+ />
+ <TextView android:id="@+id/app_version_label"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:paddingHorizontal="8dp"
+ android:gravity="right"
+ android:textColor="@color/white60"
+ android:textSize="13sp"
+ android:textStyle="bold"
+ android:text=""
+ android:textAllCaps="true"
+ />
+ <ImageView
+ android:layout_width="16dp"
+ android:layout_height="16dp"
+ android:layout_weight="0"
+ android:alpha="0.6"
+ android:src="@drawable/icon_extlink"
+ />
+ </LinearLayout>
<LinearLayout android:id="@+id/report_a_problem"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/android/src/main/res/values/strings.xml b/android/src/main/res/values/strings.xml
index 711be12793..0ca628f401 100644
--- a/android/src/main/res/values/strings.xml
+++ b/android/src/main/res/values/strings.xml
@@ -16,6 +16,7 @@
<string name="settings_account">Account</string>
<string name="less_than_a_day_left">less than a day left</string>
<string name="out_of_time">Out of time</string>
+ <string name="app_version">App version</string>
<string name="report_a_problem">Report a problem</string>
<string name="quit">Quit</string>