From 03790b9f488b4d71475c16a032cf714b342b5f52 Mon Sep 17 00:00:00 2001 From: Roman Makeev <57789105+makeevrserg@users.noreply.github.com> Date: Mon, 20 May 2024 15:24:48 +0300 Subject: [PATCH] Fix/mfkey32 initial progress state (#854) **Background** When open NFC Tools -> MIFARE Classic, it will immediately start downloading even if folder is empty **Changes** - Ad check for storage content **Test plan** - Open Mfkey32 (Detect Reader) - See that loading now will not start if storage is empty --- CHANGELOG.md | 1 + .../flipperdevices/nfc/mfkey32/api/MfKey32Api.kt | 7 +++++++ .../nfc/mfkey32/screen/api/MfKey32ApiImpl.kt | 6 ++++++ .../mfkey32/screen/viewmodel/MfKey32ViewModel.kt | 16 ++++++++++++++-- 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b0fc362b67..b2db7288b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,7 @@ - [FIX] Text overflow on apps card - [FIX] SD Card error on installed screen - [FIX] Scrolling of zoomed screenshots in app image preview +- [FIX] Display MfKey32 loading progress when no keys available - [Feature] Add not connected, empty and syncing states to emulation button on key screen - [Feature] Check app exist on apps catalog manifest loading - [Feature] First version of device orchestrator diff --git a/components/nfc/mfkey32/api/src/main/java/com/flipperdevices/nfc/mfkey32/api/MfKey32Api.kt b/components/nfc/mfkey32/api/src/main/java/com/flipperdevices/nfc/mfkey32/api/MfKey32Api.kt index 1e79eb0bf7..7f4910ce5f 100644 --- a/components/nfc/mfkey32/api/src/main/java/com/flipperdevices/nfc/mfkey32/api/MfKey32Api.kt +++ b/components/nfc/mfkey32/api/src/main/java/com/flipperdevices/nfc/mfkey32/api/MfKey32Api.kt @@ -4,6 +4,13 @@ import com.flipperdevices.bridge.api.manager.FlipperRequestApi import kotlinx.coroutines.flow.Flow interface MfKey32Api { + /** + * Cached value of bruteforce file existing + * + * This should be updated each [checkBruteforceFileExist] + */ + val isBruteforceFileExist: Boolean + fun hasNotification(): Flow suspend fun checkBruteforceFileExist(requestApi: FlipperRequestApi) } diff --git a/components/nfc/mfkey32/screen/src/main/java/com/flipperdevices/nfc/mfkey32/screen/api/MfKey32ApiImpl.kt b/components/nfc/mfkey32/screen/src/main/java/com/flipperdevices/nfc/mfkey32/screen/api/MfKey32ApiImpl.kt index e51f646268..c004eeaf17 100644 --- a/components/nfc/mfkey32/screen/src/main/java/com/flipperdevices/nfc/mfkey32/screen/api/MfKey32ApiImpl.kt +++ b/components/nfc/mfkey32/screen/src/main/java/com/flipperdevices/nfc/mfkey32/screen/api/MfKey32ApiImpl.kt @@ -16,6 +16,10 @@ import javax.inject.Singleton @Singleton @ContributesBinding(AppGraph::class, MfKey32Api::class) class MfKey32ApiImpl @Inject constructor() : MfKey32Api { + private var _isBruteforceFileExist: Boolean = false + override val isBruteforceFileExist: Boolean + get() = _isBruteforceFileExist + private val hasNotificationFlow = MutableStateFlow(false) override fun hasNotification() = hasNotificationFlow @@ -30,8 +34,10 @@ class MfKey32ApiImpl @Inject constructor() : MfKey32Api { }.wrapToRequest() ).first() if (response.hasStorageMd5SumResponse()) { + _isBruteforceFileExist = true hasNotificationFlow.emit(true) } else { + _isBruteforceFileExist = false hasNotificationFlow.emit(false) } } diff --git a/components/nfc/mfkey32/screen/src/main/java/com/flipperdevices/nfc/mfkey32/screen/viewmodel/MfKey32ViewModel.kt b/components/nfc/mfkey32/screen/src/main/java/com/flipperdevices/nfc/mfkey32/screen/viewmodel/MfKey32ViewModel.kt index c58c96d8ad..d7ddb8c58f 100644 --- a/components/nfc/mfkey32/screen/src/main/java/com/flipperdevices/nfc/mfkey32/screen/viewmodel/MfKey32ViewModel.kt +++ b/components/nfc/mfkey32/screen/src/main/java/com/flipperdevices/nfc/mfkey32/screen/viewmodel/MfKey32ViewModel.kt @@ -116,7 +116,7 @@ class MfKey32ViewModel @Inject constructor( is ConnectionState.Ready -> {} } - if (!prepare()) { + if (!prepare(serviceApi)) { info { "Failed prepare" } return } @@ -140,8 +140,20 @@ class MfKey32ViewModel @Inject constructor( mfKey32StateFlow.emit(MfKey32State.Saved(addedKeys.toImmutableList())) } - private suspend fun prepare(): Boolean { + private suspend fun prepare(serviceApi: FlipperServiceApi): Boolean { info { "Flipper connected" } + + if (!mfKey32Api.isBruteforceFileExist) { + info { "Not found $PATH_NONCE_LOG" } + mfKey32StateFlow.emit(MfKey32State.Error(ErrorType.NOT_FOUND_FILE)) + } + + mfKey32Api.checkBruteforceFileExist(serviceApi.requestApi) + + if (!mfKey32Api.isBruteforceFileExist) { + return false + } + mfKey32StateFlow.emit(MfKey32State.DownloadingRawFile(0f)) try {