summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-06-07 13:48:35 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-06-17 10:14:36 +0000
commit65a659c0f06e57deba69e6c4a7071545279b70dd (patch)
treeda0cb5dd2ee6f5c767ade5124074e58c8e54872e /android
parentd4f5af480d905827987006fbd3cc198836b3703e (diff)
downloadmullvadvpn-65a659c0f06e57deba69e6c4a7071545279b70dd.tar.xz
mullvadvpn-65a659c0f06e57deba69e6c4a7071545279b70dd.zip
Show remaining time of account in Settings
Diffstat (limited to 'android')
-rw-r--r--android/build.gradle1
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/RemainingTimeLabel.kt87
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/SettingsFragment.kt16
-rw-r--r--android/src/main/res/layout/settings.xml12
-rw-r--r--android/src/main/res/values/plurals.xml14
-rw-r--r--android/src/main/res/values/strings.xml2
6 files changed, 132 insertions, 0 deletions
diff --git a/android/build.gradle b/android/build.gradle
index 914ee21e88..5e22c4decb 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -61,6 +61,7 @@ dependencies {
implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.3.21'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1'
+ implementation 'joda-time:joda-time:2.10.2'
}
buildscript {
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/RemainingTimeLabel.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/RemainingTimeLabel.kt
new file mode 100644
index 0000000000..50fcaa8b0f
--- /dev/null
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/RemainingTimeLabel.kt
@@ -0,0 +1,87 @@
+package net.mullvad.mullvadvpn
+
+import kotlinx.coroutines.async
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.GlobalScope
+
+import org.joda.time.format.DateTimeFormat
+import org.joda.time.DateTime
+import org.joda.time.Duration
+import org.joda.time.PeriodType
+
+import android.view.View
+import android.widget.TextView
+
+val EXPIRY_FORMAT = DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss z")
+
+class RemainingTimeLabel(val parentActivity: MainActivity, val view: View) {
+ private val daemon = parentActivity.asyncDaemon
+ private val settings = parentActivity.asyncSettings
+
+ private val expiredColor = parentActivity.getColor(R.color.red)
+ private val normalColor = parentActivity.getColor(R.color.white60)
+
+ private val resources = parentActivity.resources
+
+ private val label = view.findViewById<TextView>(R.id.remaining_time)
+
+ private var accountExpiry = loadAccountExpiry()
+ private var updateJob = updateLabel()
+
+ fun onDestroy() {
+ updateJob.cancel()
+ accountExpiry.cancel()
+ }
+
+ private fun loadAccountExpiry() = GlobalScope.async(Dispatchers.Default) {
+ val accountToken = settings.await().accountToken
+
+ if (accountToken != null) {
+ val accountData = daemon.await().getAccountData(accountToken)
+ val accountExpiry = accountData?.expiry
+
+ if (accountExpiry != null) {
+ DateTime.parse(accountExpiry, EXPIRY_FORMAT)
+ } else {
+ null
+ }
+ } else {
+ null
+ }
+ }
+
+ private fun updateLabel() = GlobalScope.launch(Dispatchers.Main) {
+ val expiry = accountExpiry.await()
+
+ if (expiry != null) {
+ val remainingTime = Duration(DateTime.now(), expiry)
+
+ if (remainingTime.isShorterThan(Duration.ZERO)) {
+ label.setText(R.string.out_of_time)
+ label.setTextColor(expiredColor)
+ } else {
+ val remainingTimeInfo =
+ remainingTime.toPeriodTo(expiry, PeriodType.yearMonthDayTime())
+
+ if (remainingTimeInfo.years > 0) {
+ label.setText(getRemainingText(R.plurals.years_left, remainingTimeInfo.years))
+ } else if (remainingTimeInfo.months > 0) {
+ label.setText(getRemainingText(R.plurals.months_left, remainingTimeInfo.months))
+ } else if (remainingTimeInfo.days > 0) {
+ label.setText(getRemainingText(R.plurals.days_left, remainingTimeInfo.days))
+ } else {
+ label.setText(R.string.less_than_a_day_left)
+ }
+
+ label.setTextColor(normalColor)
+ }
+ } else {
+ label.text = ""
+ }
+ }
+
+ private fun getRemainingText(pluralId: Int, quantity: Int): String {
+ return resources.getQuantityString(pluralId, quantity, quantity)
+ }
+}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/SettingsFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/SettingsFragment.kt
index a958978daa..436cc33fd6 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/SettingsFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/SettingsFragment.kt
@@ -10,6 +10,15 @@ import android.widget.Button
import android.widget.ImageButton
class SettingsFragment : Fragment() {
+ private lateinit var parentActivity: MainActivity
+ private lateinit var remainingTimeLabel: RemainingTimeLabel
+
+ override fun onAttach(context: Context) {
+ super.onAttach(context)
+
+ parentActivity = context as MainActivity
+ }
+
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@@ -25,6 +34,13 @@ class SettingsFragment : Fragment() {
activity?.finishAndRemoveTask()
}
+ remainingTimeLabel = RemainingTimeLabel(parentActivity, view)
+
return view
}
+
+ override fun onDestroyView() {
+ remainingTimeLabel.onDestroy()
+ super.onDestroyView()
+ }
}
diff --git a/android/src/main/res/layout/settings.xml b/android/src/main/res/layout/settings.xml
index 7868e8e54c..a62a3cfc59 100644
--- a/android/src/main/res/layout/settings.xml
+++ b/android/src/main/res/layout/settings.xml
@@ -45,6 +45,18 @@
android:textStyle="bold"
android:text="@string/settings_account"
/>
+ <TextView android:id="@+id/remaining_time"
+ 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"
+ />
</LinearLayout>
<Button android:id="@+id/quit_button"
android:layout_marginTop="24dp"
diff --git a/android/src/main/res/values/plurals.xml b/android/src/main/res/values/plurals.xml
new file mode 100644
index 0000000000..5395e2f4fa
--- /dev/null
+++ b/android/src/main/res/values/plurals.xml
@@ -0,0 +1,14 @@
+<resources>
+ <plurals name="years_left">
+ <item quantity="one">%d year left</item>
+ <item quantity="other">%d years left</item>
+ </plurals>
+ <plurals name="months_left">
+ <item quantity="one">%d month left</item>
+ <item quantity="other">%d months left</item>
+ </plurals>
+ <plurals name="days_left">
+ <item quantity="one">%d day left</item>
+ <item quantity="other">%d days left</item>
+ </plurals>
+</resources>
diff --git a/android/src/main/res/values/strings.xml b/android/src/main/res/values/strings.xml
index b0fbcc3499..ae2abb9d34 100644
--- a/android/src/main/res/values/strings.xml
+++ b/android/src/main/res/values/strings.xml
@@ -14,6 +14,8 @@
<string name="settings">Settings</string>
<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="quit">Quit</string>
<string name="unsecured_connection">Unsecured connection</string>