diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-06-07 13:48:35 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-06-17 10:14:36 +0000 |
| commit | 65a659c0f06e57deba69e6c4a7071545279b70dd (patch) | |
| tree | da0cb5dd2ee6f5c767ade5124074e58c8e54872e /android | |
| parent | d4f5af480d905827987006fbd3cc198836b3703e (diff) | |
| download | mullvadvpn-65a659c0f06e57deba69e6c4a7071545279b70dd.tar.xz mullvadvpn-65a659c0f06e57deba69e6c4a7071545279b70dd.zip | |
Show remaining time of account in Settings
Diffstat (limited to 'android')
| -rw-r--r-- | android/build.gradle | 1 | ||||
| -rw-r--r-- | android/src/main/kotlin/net/mullvad/mullvadvpn/RemainingTimeLabel.kt | 87 | ||||
| -rw-r--r-- | android/src/main/kotlin/net/mullvad/mullvadvpn/SettingsFragment.kt | 16 | ||||
| -rw-r--r-- | android/src/main/res/layout/settings.xml | 12 | ||||
| -rw-r--r-- | android/src/main/res/values/plurals.xml | 14 | ||||
| -rw-r--r-- | android/src/main/res/values/strings.xml | 2 |
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> |
