Skip to content

Commit fa71d41

Browse files
committed
Add more specific error messages to failures
1 parent 8477b4e commit fa71d41

4 files changed

Lines changed: 65 additions & 35 deletions

File tree

app/src/main/java/com/hiddenramblings/tagmo/nfctech/NTAG215.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@ class NTAG215 : TagTechnology {
7373
}
7474
}
7575

76+
@Throws(IOException::class)
77+
fun transceiveOrThrow(data: ByteArray?): ByteArray {
78+
return tagMifare?.transceive(data) ?: tagNfcA?.transceive(data)
79+
?: throw IOException()
80+
}
81+
7682
fun getVersion(isGeneric: Boolean): ByteArray? {
7783
val command = if (isGeneric)
7884
byteArrayOf(NfcByte.CMD_GET_VERSION.toByte())

app/src/main/java/com/hiddenramblings/tagmo/nfctech/NfcActivity.kt

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -586,15 +586,32 @@ class NfcActivity : AppCompatActivity() {
586586
} else {
587587
throw Exception(getString(R.string.error_tag_protocol, tagTech))
588588
}
589-
} catch (e: Exception) {
590-
Debug.warn(e)
591-
Debug.getExceptionCause(e)?.let { error ->
589+
} catch (e: Exception) {
590+
Debug.warn(e)
591+
if (e is TagLostException) {
592+
closeTagSilently(ntag215)
593+
if (prefs.eliteEnabled()) {
594+
showMessage(R.string.error_tag_lost)
595+
} else {
596+
showError(getString(R.string.error_tag_lost))
597+
}
598+
return
599+
}
600+
Debug.getExceptionCause(e)?.let { error ->
592601
when {
593-
e is SecurityException && !tagExpired -> {
594-
tagExpired = true
595-
onMifareUltralight(intent.parcelable<Tag>(NfcAdapter.EXTRA_TAG))
596-
}
597-
getString(R.string.error_tag_rewrite) == error -> {
602+
e is SecurityException && !tagExpired -> {
603+
tagExpired = true
604+
onMifareUltralight(intent.parcelable<Tag>(NfcAdapter.EXTRA_TAG))
605+
}
606+
e is SecurityException -> {
607+
closeTagSilently(ntag215)
608+
if (prefs.eliteEnabled()) {
609+
showMessage(R.string.error_tag_lost)
610+
} else {
611+
showError(getString(R.string.error_tag_lost))
612+
}
613+
}
614+
getString(R.string.error_tag_rewrite) == error -> {
598615
withContext(Dispatchers.Main) {
599616
getErrorDialog(
600617
this@NfcActivity, R.string.error_tag_rewrite, R.string.tag_update_only
@@ -639,14 +656,9 @@ class NfcActivity : AppCompatActivity() {
639656
}
640657
}
641658

642-
prefs.eliteEnabled() -> {
643-
when {
644-
e is TagLostException -> {
645-
showMessage(R.string.speed_scan)
646-
closeTagSilently(ntag215)
647-
}
648-
649-
getString(R.string.invalid_tag_lock) == error -> {
659+
prefs.eliteEnabled() -> {
660+
when {
661+
getString(R.string.invalid_tag_lock) == error -> {
650662
showMessage(R.string.tag_disconnect)
651663
closeTagSilently(ntag215)
652664
}
@@ -678,9 +690,9 @@ class NfcActivity : AppCompatActivity() {
678690
}
679691
}
680692

681-
else -> {
682-
when {
683-
e is TagLostException || getString(R.string.invalid_tag_lock) == error -> {
693+
else -> {
694+
when {
695+
getString(R.string.invalid_tag_lock) == error -> {
684696
closeTagSilently(ntag215)
685697
showError("${getString(R.string.tag_disconnect)}\n\n$error")
686698
}

app/src/main/java/com/hiddenramblings/tagmo/nfctech/TagWriter.kt

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
package com.hiddenramblings.tagmo.nfctech
2-
1+
package com.hiddenramblings.tagmo.nfctech
2+
3+
import android.nfc.TagLostException
34
import com.hiddenramblings.tagmo.R
45
import com.hiddenramblings.tagmo.TagMo
56
import com.hiddenramblings.tagmo.amiibo.KeyManager
@@ -14,7 +15,9 @@ import java.io.BufferedReader
1415
import java.io.IOException
1516
import java.io.InputStreamReader
1617

17-
object TagWriter {
18+
object TagWriter {
19+
private const val AUTH_TIMEOUT_MS = 1000
20+
1821
@Throws(Exception::class)
1922
private fun splitPages(data: ByteArray): Array<ByteArray?> {
2023
if (data.size < NfcByte.TAG_DATA_SIZE)
@@ -256,13 +259,19 @@ object TagWriter {
256259
password[2],
257260
password[3]
258261
)
259-
val response = tag.transceive(auth)
260-
?: throw Exception(TagMo.appContext.getString(R.string.error_auth_null))
261-
val respStr = response.toHex()
262-
Debug.verbose(TagWriter::class.java, R.string.auth_response, respStr)
263-
if ("8080" != respStr) {
264-
throw Exception(TagMo.appContext.getString(R.string.fail_auth))
265-
}
262+
tag.timeout = AUTH_TIMEOUT_MS
263+
val response = try {
264+
tag.transceiveOrThrow(auth)
265+
} catch (e: TagLostException) {
266+
throw e
267+
} catch (e: IOException) {
268+
throw Exception(TagMo.appContext.getString(R.string.error_auth_io), e)
269+
}
270+
val respStr = response.toHex()
271+
Debug.verbose(TagWriter::class.java, R.string.auth_response, respStr)
272+
if ("8080" != respStr) {
273+
throw Exception(TagMo.appContext.getString(R.string.error_auth_rejected))
274+
}
266275
}
267276

268277
private fun doEliteAuth(tag: NTAG215, password: ByteArray?): Boolean {
@@ -432,4 +441,4 @@ object TagWriter {
432441
throw Exception(context.getString(R.string.firmware_failed, 4))
433442
}
434443
}
435-
}
444+
}

app/src/main/res/values/strings.xml

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -436,9 +436,12 @@
436436
<string name="error_amiibo_parse">amiibo info parse error</string>
437437
<string name="error_powertag_key">Power Tag keys not loaded</string>
438438
<string name="error_elite_write">Error while writing data to N2 Elite</string>
439-
<string name="error_elite_auth">Error while authenticating N2 Elite</string>
440-
<string name="error_amiitool_init">Failed to initialize amiitool</string>
441-
<string name="error_auth_null">Auth result was null</string>
439+
<string name="error_elite_auth">Error while authenticating N2 Elite</string>
440+
<string name="error_amiitool_init">Failed to initialize amiitool</string>
441+
<string name="error_auth_null">NFC communication failed during authentication.</string>
442+
<string name="error_auth_io">NFC communication failed during authentication.</string>
443+
<string name="error_tag_lost">The NFC tag was lost during the operation.</string>
444+
<string name="error_auth_rejected">The tag rejected the authentication password.</string>
442445
<string name="error_archive_format">Zip encoding not supported</string>
443446
<string name="error_archive_invalid">Archive extraction failed!</string>
444447
<string name="error_uri_unknown">Invalid or empty file selected!</string>
@@ -465,10 +468,10 @@
465468
<string name="fail_active_oob">Active bank beyond new count!</string>
466469
<string name="fail_parse_banks">Failed to parse banks!</string>
467470
<string name="fail_read_amiibo">Reading amiibo data failed!</string>
468-
<string name="fail_early_remove">amiibo removed too early!</string>
471+
<string name="fail_early_remove">amiibo removed too early!</string>
469472
<string name="fail_amiibo_null">Please scan the amiibo again</string>
470473
<string name="fail_read">Read failed</string>
471-
<string name="fail_auth">Authentication failed</string>
474+
<string name="fail_auth">Authentication failed</string>
472475
<string name="fail_decrypt_null">Cannot decrypt empty data.</string>
473476
<string name="fail_decrypt">Failed to decrypt tag data</string>
474477
<string name="fail_encrypt">Failed to encrypt tag data</string>

0 commit comments

Comments
 (0)