aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/dev/msfjarvis/aps/ui
diff options
context:
space:
mode:
authorHarsh Shandilya <me@msfjarvis.dev>2022-03-11 01:52:39 +0530
committerGitHub <noreply@github.com>2022-03-10 20:22:39 +0000
commit2f034bc2372d29b4ddebf74d532279073fb3d92b (patch)
treedc9197276622c56f32c9b395e9339a046f608103 /app/src/main/java/dev/msfjarvis/aps/ui
parent3e988b2a3428c3759535a2bd1f3e1ba0b5e411a3 (diff)
downloadHardenedPass-2f034bc2372d29b4ddebf74d532279073fb3d92b.tar.gz
HardenedPass-2f034bc2372d29b4ddebf74d532279073fb3d92b.zip
Show remaining time in TOTP field (#1766)
* Pass down remaining time for TOTPs to UI layer * format-common: switch TOTP flow to use co-operative cancelation * format-common: add a regression test for OTP duration calculation * Abstract out labels * Switch to launchIn
Diffstat (limited to 'app/src/main/java/dev/msfjarvis/aps/ui')
-rw-r--r--app/src/main/java/dev/msfjarvis/aps/ui/adapters/FieldItemAdapter.kt7
-rw-r--r--app/src/main/java/dev/msfjarvis/aps/ui/crypto/DecryptActivity.kt9
-rw-r--r--app/src/main/java/dev/msfjarvis/aps/ui/crypto/DecryptActivityV2.kt15
3 files changed, 11 insertions, 20 deletions
diff --git a/app/src/main/java/dev/msfjarvis/aps/ui/adapters/FieldItemAdapter.kt b/app/src/main/java/dev/msfjarvis/aps/ui/adapters/FieldItemAdapter.kt
index d019bcae..ea96f961 100644
--- a/app/src/main/java/dev/msfjarvis/aps/ui/adapters/FieldItemAdapter.kt
+++ b/app/src/main/java/dev/msfjarvis/aps/ui/adapters/FieldItemAdapter.kt
@@ -13,6 +13,7 @@ import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.textfield.TextInputLayout
import dev.msfjarvis.aps.R
+import dev.msfjarvis.aps.data.passfile.Totp
import dev.msfjarvis.aps.data.password.FieldItem
import dev.msfjarvis.aps.databinding.ItemFieldBinding
@@ -35,13 +36,13 @@ class FieldItemAdapter(
return fieldItemList.size
}
- fun updateOTPCode(code: String) {
+ fun updateOTPCode(totp: Totp) {
var otpItemPosition = -1
fieldItemList =
fieldItemList.mapIndexed { position, item ->
- if (item.key.equals(FieldItem.ItemType.OTP.type, true)) {
+ if (item.key.startsWith(FieldItem.ItemType.OTP.type, true)) {
otpItemPosition = position
- return@mapIndexed FieldItem.createOtpField(code)
+ return@mapIndexed FieldItem.createOtpField(totp)
}
return@mapIndexed item
diff --git a/app/src/main/java/dev/msfjarvis/aps/ui/crypto/DecryptActivity.kt b/app/src/main/java/dev/msfjarvis/aps/ui/crypto/DecryptActivity.kt
index 413e6f6a..c6fda844 100644
--- a/app/src/main/java/dev/msfjarvis/aps/ui/crypto/DecryptActivity.kt
+++ b/app/src/main/java/dev/msfjarvis/aps/ui/crypto/DecryptActivity.kt
@@ -30,8 +30,8 @@ import kotlin.time.Duration
import kotlin.time.ExperimentalTime
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
-import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@@ -210,12 +210,7 @@ class DecryptActivity : BasePgpActivity(), OpenPgpServiceConnection.OnBound {
binding.recyclerView.adapter = adapter
if (entry.hasTotp()) {
- lifecycleScope.launch {
- entry
- .totp
- .onEach { code -> withContext(Dispatchers.Main) { adapter.updateOTPCode(code) } }
- .collect()
- }
+ entry.totp.onEach(adapter::updateOTPCode).launchIn(lifecycleScope)
}
}
.onFailure { e -> logcat(ERROR) { e.asLog() } }
diff --git a/app/src/main/java/dev/msfjarvis/aps/ui/crypto/DecryptActivityV2.kt b/app/src/main/java/dev/msfjarvis/aps/ui/crypto/DecryptActivityV2.kt
index f5c02e49..21cd42aa 100644
--- a/app/src/main/java/dev/msfjarvis/aps/ui/crypto/DecryptActivityV2.kt
+++ b/app/src/main/java/dev/msfjarvis/aps/ui/crypto/DecryptActivityV2.kt
@@ -25,17 +25,18 @@ import dev.msfjarvis.aps.util.settings.PreferenceKeys
import java.io.ByteArrayOutputStream
import java.io.File
import javax.inject.Inject
-import kotlin.time.Duration
+import kotlin.time.Duration.Companion.seconds
import kotlin.time.ExperimentalTime
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
-import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
+@OptIn(ExperimentalTime::class)
@AndroidEntryPoint
class DecryptActivityV2 : BasePgpActivity() {
@@ -90,10 +91,9 @@ class DecryptActivityV2 : BasePgpActivity() {
* Automatically finishes the activity 60 seconds after decryption succeeded to prevent
* information leaks from stale activities.
*/
- @OptIn(ExperimentalTime::class)
private fun startAutoDismissTimer() {
lifecycleScope.launch {
- delay(Duration.seconds(60))
+ delay(60.seconds)
finish()
}
}
@@ -198,12 +198,7 @@ class DecryptActivityV2 : BasePgpActivity() {
binding.recyclerView.adapter = adapter
if (entry.hasTotp()) {
- lifecycleScope.launch {
- entry
- .totp
- .onEach { code -> withContext(Dispatchers.Main) { adapter.updateOTPCode(code) } }
- .collect()
- }
+ entry.totp.onEach(adapter::updateOTPCode).launchIn(lifecycleScope)
}
}