Compare commits

...
14 Commits
Author SHA1 Message Date
Markus Fisch 1ccfcfcb8f Advance version number to 1.51.0 2022-06-16 13:37:44 +02:00
Markus Fisch 213689e9f9 Improve syntax for DP link generation 2022-06-16 13:30:07 +02:00
Markus Fisch 6e2f2cab92 Make drawing functions extensions in DetectorView
Because it's more idiomatic.
2022-06-16 13:20:32 +02:00
Markus Fisch 4b3d745154 Add and improve a few comments 2022-06-16 13:20:12 +02:00
Markus Fisch a2bcd67568 Use logical operator instead of bitwise 2022-06-16 13:19:14 +02:00
Markus Fisch 072eec5306 Simplify setting handleActive flag
And make sure it's false if handlePos is invalid.
2022-06-16 13:17:16 +02:00
ZahnstocherandGitHub d505c6b07d Add stamp tracking number 2022-06-14 18:41:41 +02:00
GiovanniandGitHub dbfbaab030 Update Italian translation 2022-06-14 14:26:07 +02:00
Markus Fisch 3d1402add4 Fix XML for zh-rCN translation 2022-06-12 20:29:20 +02:00
yzqzssandGitHub 1d2bd8d778 Update zh-rCN translation 2022-06-12 20:22:11 +02:00
Markus Fisch 2bb413e3e8 Add tests for MATMSG format 2022-06-07 20:43:15 +02:00
Markus Fisch 75a59bc3e9 Fix setting Intent.EXTRA_EMAIL for MatMsg contents
Remember, this must be an array.
2022-06-06 20:59:03 +02:00
inkhornandGitHub 9a15bf0871 Update ptbr translation including meta data 2022-05-31 20:28:03 +02:00
Markus Fisch 53248fd23d Allow free image rotation in pick activity
To make it easy to recognize barcodes at odd angles.
2022-05-23 23:33:23 +02:00
21 changed files with 327 additions and 137 deletions
+8
View File
@@ -1,5 +1,13 @@
# Change Log
## 1.51.0
* Add support for Deutsche Post Matrixcode stamp
* Allow free image rotation for scanning from images
* Fix setting TO field in MATMSG format
* Update Italian translation
* Update zh-rCN translation
* Update pt-br translation
## 1.50.0
* Add support for MATMSG format
* Add a setting to show the QR Code version
+3 -3
View File
@@ -9,8 +9,8 @@ android {
minSdkVersion 9
targetSdkVersion sdk_version
versionCode 97
versionName '1.50.0'
versionCode 98
versionName '1.51.0'
// Required for desugaring.
multiDexEnabled true
@@ -98,5 +98,5 @@ dependencies {
implementation "com.android.support:preference-v14:$support_version"
implementation 'com.google.zxing:core:3.5.0'
implementation 'com.github.markusfisch:CameraView:1.9.1'
implementation 'com.github.markusfisch:ScalingImageView:1.3.0'
implementation 'com.github.markusfisch:ScalingImageView:1.4.0'
}
@@ -19,31 +19,37 @@ object MatMsgAction : IntentAction() {
context: Context,
data: ByteArray
): Intent? {
val encoded = String(data)
// Allow arbitrary order.
val to = encoded.extractFirst("""[:;]TO:([\w.%@+-]+);""")
val sub = encoded.extractFirst("""[:;]SUB:([^;]+);""")
val body = encoded.extractFirst("""[:;]BODY:([^;]+);""")
val mm = MatMsg(String(data))
// Allow incomplete but not completely missing data.
if (to == null && sub == null && body == null) {
if (mm.isEmpty()) {
return null
}
return Intent(
Intent.ACTION_SENDTO,
Uri.parse("mailto:")
).apply {
to?.let {
putExtra(Intent.EXTRA_EMAIL, to)
mm.to?.let {
putExtra(Intent.EXTRA_EMAIL, arrayOf(mm.to))
}
sub?.let {
putExtra(Intent.EXTRA_SUBJECT, sub)
mm.sub?.let {
putExtra(Intent.EXTRA_SUBJECT, mm.sub)
}
body?.let {
putExtra(Intent.EXTRA_TEXT, body)
mm.body?.let {
putExtra(Intent.EXTRA_TEXT, mm.body)
}
}
}
}
// Public so this can be tested.
class MatMsg(encoded: String) {
// Allow arbitrary order.
val to = encoded.extractFirst("""[:;]TO:([\w.%@+-]+);""")
val sub = encoded.extractFirst("""[:;]SUB:([^;]+);""")
val body = encoded.extractFirst("""[:;]BODY:([^;]+);""")
fun isEmpty() = to == null && sub == null && body == null
}
private fun String.extractFirst(regex: String) =
regex.toRegex().find(this)?.groupValues?.get(1)
@@ -32,6 +32,7 @@ import de.markusfisch.android.binaryeye.widget.CropImageView
import de.markusfisch.android.binaryeye.widget.DetectorView
import de.markusfisch.android.binaryeye.widget.toast
import de.markusfisch.android.binaryeye.zxing.Zxing
import de.markusfisch.android.scalingimageview.widget.ScalingImageView
import kotlinx.coroutines.*
class PickActivity : AppCompatActivity() {
@@ -84,6 +85,7 @@ class PickActivity : AppCompatActivity() {
cropImageView = findViewById(R.id.image) as CropImageView
cropImageView.restrictTranslation = false
cropImageView.freeRotation = true
cropImageView.setImageBitmap(bitmap)
cropImageView.onScan = {
scanWithinBounds(bitmap)
@@ -126,7 +128,9 @@ class PickActivity : AppCompatActivity() {
val rectInImage = normalizeRoi(imageRect, rectInView)
val cropped = bitmap.crop(
rectInImage,
cropImageView.imageRotation
cropImageView.imageRotation,
cropImageView.pivotX,
cropImageView.pivotY
) ?: return
scope.launch {
result = zxing.decodePositiveNegative(cropped)
@@ -5,7 +5,9 @@ import android.os.Bundle
import android.support.design.widget.FloatingActionButton
import android.support.v4.app.Fragment
import android.text.Editable
import android.text.Html
import android.text.TextWatcher
import android.text.method.LinkMovementMethod
import android.view.*
import android.widget.EditText
import android.widget.TableLayout
@@ -40,6 +42,7 @@ class DecodeFragment : Fragment() {
private lateinit var metaView: TableLayout
private lateinit var hexView: TextView
private lateinit var format: String
private lateinit var stampView: TextView
private lateinit var fab: FloatingActionButton
private val parentJob = Job()
@@ -84,6 +87,7 @@ class DecodeFragment : Fragment() {
format = scan.format
contentView = view.findViewById(R.id.content)
stampView = view.findViewById(R.id.stamp)
fab = view.findViewById(R.id.open)
if (!isBinary) {
@@ -124,6 +128,17 @@ class DecodeFragment : Fragment() {
}
}
val trackingLink = generateDpTrackingLink(raw, scan.format)
if (trackingLink != null) {
stampView.apply {
text = Html.fromHtml(trackingLink)
isClickable = true
movementMethod = LinkMovementMethod.getInstance()
}
} else {
stampView.visibility = View.GONE
}
formatView = view.findViewById(R.id.format)
dataView = view.findViewById(R.id.data)
metaView = view.findViewById(R.id.meta)
@@ -419,6 +434,73 @@ private fun hexDump(bytes: ByteArray, charsPerLine: Int = 33): String {
return dump.toString()
}
private fun generateDpTrackingLink(raw: ByteArray, format: String): String? {
// Check for Deutsche Post Matrixcode stamp.
var isStamp = false
var rawData = raw
if (format == "DATA_MATRIX" &&
raw.toString(Charsets.ISO_8859_1).startsWith("DEA5")
) {
if (raw.size == 47) {
isStamp = true
} else if (raw.size > 47) {
// Transform back to original data.
rawData = raw.toString(Charsets.UTF_8).toByteArray(
Charsets.ISO_8859_1
)
if (rawData.size == 47) {
isStamp = true
}
}
}
if (!isStamp) {
return null
}
val hex = StringBuilder()
hex.append(String.format("%02X", rawData[9]))
hex.append(String.format("%02X", rawData[10]))
hex.append(String.format("%02X", rawData[11]))
hex.append(String.format("%02X", rawData[12]))
hex.append(String.format("%02X", rawData[13]))
hex.append(String.format("%X", (rawData[4].toInt() and 0x0f).toByte()))
hex.append(String.format("%02X", rawData[5]))
hex.append(String.format("%02X", rawData[6]))
hex.append(String.format("%02X", rawData[7]))
hex.append(String.format("%02X", rawData[8]))
val hexString = hex.toString()
val trackingNumber = hexString + String.format(
"%X",
crc4(hexString.toByteArray(Charsets.ISO_8859_1))
)
return "<a href=\"https://www.deutschepost.de/de/s/sendungsverfolgung/verfolgen.html?piececode=$trackingNumber\">Deutsche Post: $trackingNumber</a>"
}
// CRC-4 with polynomial x^4 + x + 1.
private fun crc4(input: ByteArray): Int {
var crc = 0
var i = 0
while (i < input.size) {
val c = input[i].toInt()
var j = 0x80
while (j != 0) {
var bit = crc and 0x8
crc = crc shl 1
if (c and j != 0) {
bit = bit xor 0x8
}
if (bit != 0) {
crc = crc xor 0x3
}
j = j ushr 1
}
++i
}
crc = crc and 0xF
return crc
}
private fun Scan.version(): Int = Encoder.encode(
content,
ErrorCorrectionLevel.valueOf(errorCorrectionLevel ?: "L")
@@ -49,8 +49,13 @@ private fun calculateInSampleSize(
return inSampleSize
}
fun Bitmap.crop(rect: RectF, rotation: Float) = try {
val erected = erect(rotation)
fun Bitmap.crop(
rect: RectF,
rotation: Float,
pivotX: Float,
pivotY: Float
) = try {
val erected = erect(rotation, pivotX, pivotY)
val w = erected.width
val h = erected.height
val x = max(0, (rect.left * w).roundToInt())
@@ -68,7 +73,11 @@ fun Bitmap.crop(rect: RectF, rotation: Float) = try {
null
}
private fun Bitmap.erect(rotation: Float): Bitmap = if (
private fun Bitmap.erect(
rotation: Float,
pivotX: Float,
pivotY: Float
): Bitmap = if (
rotation % 360f != 0f
) {
Bitmap.createBitmap(
@@ -78,7 +87,7 @@ private fun Bitmap.erect(rotation: Float): Bitmap = if (
width,
height,
Matrix().apply {
setRotate(rotation)
setRotate(rotation, pivotX, pivotY)
},
true
)
@@ -100,14 +100,15 @@ class DetectorView : View {
}
private fun setCropHandlePos(x: Int, y: Int, orientation: Int) {
// Always set handlePos even if it's invalid because
// handlePos.x may be -2 which is a signal to set the
// default ROI.
if (orientation == currentOrientation) {
handlePos.set(x, y)
} else {
handlePos.set(y, x)
}
if (x > -1) {
handleActive = true
}
handleActive = handlePos.x > -1
}
fun update(numberOfCoordinates: Int) {
@@ -164,8 +165,8 @@ class DetectorView : View {
MotionEvent.ACTION_MOVE -> {
if (handleGrabbed) {
handlePos.set(x, y)
handleActive =
handleActive or (distSq(handlePos, touchDown) > minMoveThresholdSq)
handleActive = handleActive ||
distSq(handlePos, touchDown) > minMoveThresholdSq
if (handleActive) {
updateClipRect()
invalidate()
@@ -216,10 +217,10 @@ class DetectorView : View {
val cy = clampY(y)
val dx = abs(cx - center.x)
val dy = abs(cy - center.y)
// check if handle is close to the vertical or horizontal center line
// Check if handle is close to the vertical or horizontal center line.
if (dx < distToFull ||
dy < distToFull ||
// check if handle is close to a screen corner
// Check if handle is close to a screen corner.
((abs(cy - minY) < distToFull || abs(maxY - cy) < distToFull) &&
abs(dx - center.x) < distToFull)
) {
@@ -260,23 +261,18 @@ class DetectorView : View {
override fun onDraw(canvas: Canvas) {
if (handleActive) {
drawClip(canvas)
canvas.drawClip()
}
drawDots(canvas)
canvas.drawDots()
if (prefs.showCropHandle) {
canvas.drawBitmap(
handleBitmap,
(handlePos.x - handleXRadius).toFloat(),
(handlePos.y - handleYRadius).toFloat(),
null
)
canvas.drawHandle()
}
}
private fun drawDots(canvas: Canvas) {
private fun Canvas.drawDots() {
var i = 0
while (i < coordinatesLast) {
canvas.drawCircle(
drawCircle(
coordinates[i++],
coordinates[i++],
dotRadius,
@@ -285,15 +281,15 @@ class DetectorView : View {
}
}
private fun drawClip(canvas: Canvas) {
private fun Canvas.drawClip() {
if (minDist < 1) {
return
}
// canvas.clipRect() doesn't work reliably below KITKAT.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
val radius = min(minDist / 2, cornerRadius).toFloat()
canvas.save()
canvas.clipOutPathCompat(
save()
clipOutPathCompat(
calculateRoundedRectPath(
roi.left.toFloat(),
roi.top.toFloat(),
@@ -303,13 +299,22 @@ class DetectorView : View {
radius
)
)
canvas.drawColor(shadeColor)
canvas.restore()
drawColor(shadeColor)
restore()
} else {
canvas.drawRect(roi, roiPaint)
drawRect(roi, roiPaint)
}
}
private fun Canvas.drawHandle() {
drawBitmap(
handleBitmap,
(handlePos.x - handleXRadius).toFloat(),
(handlePos.y - handleYRadius).toFloat(),
null
)
}
private fun updateClipRect() {
clampHandlePos()
val dx = abs(handlePos.x - center.x)
@@ -68,6 +68,18 @@
android:typeface="monospace"
android:textSize="12sp"
tools:text="54 65 73 74 20 51 52 20 Test QR\n43 6F 64 65 Code"/>
<TextView
android:id="@+id/stamp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/hex"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:layout_marginBottom="16dp"
android:textSize="12sp"
android:typeface="monospace"/>
</RelativeLayout>
</de.markusfisch.android.binaryeye.widget.ConfinedScrollView>
<android.support.design.widget.CoordinatorLayout
+56 -56
View File
@@ -10,11 +10,11 @@
<item quantity="one">%2$d carattere, %1$s</item>
<item quantity="other">%2$d caratteri, %1$s</item>
</plurals>
<string name="error_correction_level">Livello di correzione errori</string>
<string name="error_correction_level_l" formatted="false">Low (~7&#37; correction)</string>
<string name="error_correction_level_m" formatted="false">Medium (~15&#37; correction)</string>
<string name="error_correction_level_q" formatted="false">Quartile (~25&#37; correction)</string>
<string name="error_correction_level_h" formatted="false">High (~30&#37; correction)</string>
<string name="error_correction_level">Livello di correzione degli errori</string>
<string name="error_correction_level_l" formatted="false">Basso (Correzione del ~7&#37;)</string>
<string name="error_correction_level_m" formatted="false">Medio (Correzione del ~15&#37;)</string>
<string name="error_correction_level_q" formatted="false">Quartile (Correzione del ~25&#37;)</string>
<string name="error_correction_level_h" formatted="false">Alto (Correzione del ~30&#37;)</string>
<string name="issue_number">Numero di edizione</string>
<string name="orientation">Orientamento</string>
<string name="other_meta_data">Metadati</string>
@@ -22,11 +22,11 @@
<string name="possible_country">Probabile Paese di fabbricazione</string>
<string name="suggested_price">Prezzo consigliato</string>
<string name="upc_ean_extension">Estensione UPC EAN</string>
<string name="qr_version">QR version</string>
<string name="toggle_flash">Flash</string>
<string name="error_flash">Error toggling flash</string>
<string name="qr_version">Versione QR</string>
<string name="toggle_flash">Attiva/Disattiva flash</string>
<string name="error_flash">Errore durante l\'attivazione/disattivazione del flash</string>
<string name="share">Condividi</string>
<string name="share_as">Share as?</string>
<string name="share_as">Condividi come?</string>
<string name="copy_to_clipboard">Copia negli appunti</string>
<string name="copied_to_clipboard">Copiato negli appunti</string>
<string name="copy_password">Copia password negli appunti</string>
@@ -45,70 +45,70 @@
<string name="info">Info</string>
<string name="switch_camera">Cambia fotocamera</string>
<string name="bulk_mode">Scansione continua</string>
<string name="bulk_mode_summary">Always start scanning continuously.</string>
<string name="bulk_mode_delay">Delay between continuous scans</string>
<string name="restrict_format">Restrict format</string>
<string name="remove_restriction">Remove restriction</string>
<string name="scan_format">Scan %s</string>
<string name="quarter_second">A quarter second</string>
<string name="half_second">Half a second</string>
<string name="a_second">One second</string>
<string name="two_seconds">Two seconds</string>
<string name="five_seconds">Five seconds</string>
<string name="bulk_mode_summary">Avvia sempre la scansione in modo continuo.</string>
<string name="bulk_mode_delay">Ritardo tra scansioni continue</string>
<string name="restrict_format">Limita formato</string>
<string name="remove_restriction">Rimuovi la limitazione</string>
<string name="scan_format">Scansiona %s</string>
<string name="quarter_second">Un quarto di secondo</string>
<string name="half_second">Mezzo secondo</string>
<string name="a_second">Un secondo</string>
<string name="two_seconds">Due secondi</string>
<string name="five_seconds">Cinque secondi</string>
<string name="history">Cronologia</string>
<string name="preferences">Preferenze</string>
<string name="scan_category">Scansione</string>
<string name="content_category">Contenuto</string>
<string name="locale_category">Language</string>
<string name="custom_locale">Custom language</string>
<string name="follow_system_settings">Follow system settings</string>
<string name="locale_category">Lingua</string>
<string name="custom_locale">Lingua personalizzata</string>
<string name="follow_system_settings">Segui le impostazioni di sistema</string>
<string name="show_crop_handle">Mostra riquadro di limite</string>
<string name="show_crop_handle_summary">Limita la scansione ad una regione personalizzata.</string>
<string name="barcode_formats">Barcode formats</string>
<string name="barcode_formats">Formati di codici a barre</string>
<string name="zoom_by_swiping">Zoom fotocamera scorrendo su/giù</string>
<string name="zoom_by_swiping_summary">Scorri su o giù per controllare lo zoom della fotocamera.</string>
<string name="auto_rotate">Riconosci i codici a barre 1D verticalmente</string>
<string name="auto_rotate_summary">Ruota automaticamente la fotocamera per riconoscere i codici a barre 1D verticali. In base al dispositivo, potrebbe ridurre le prestazioni.</string>
<string name="try_harder">Ottimizza il lettore per accuratezza, non velocità</string>
<string name="try_harder">Ottimizza il lettore per accuratezza</string>
<string name="try_harder_summary">Attiva questa opzione per codici molto difficili da leggere. Riduce le prestazioni.</string>
<string name="show_toast_in_bulk_mode">Show data in continuous mode</string>
<string name="show_toast_in_bulk_mode_summary">Briefly show the scanned data when scanning continuously.</string>
<string name="show_toast_in_bulk_mode">Mostra i dati in modalità continua</string>
<string name="show_toast_in_bulk_mode_summary">Mostra brevemente i dati scansionati durante la scansione continua.</string>
<string name="vibrate">Vibra quando rilevato</string>
<string name="vibrate_summary">Attivalo se vuoi che il dispositivo vibri quando viene riconosciuto un codice.</string>
<string name="use_history">Salva cronologia delle scansioni</string>
<string name="use_history_summary">Salva i codici riconosciuti sul dispositivo.</string>
<string name="ignore_consecutive_duplicates">Non salvare doppi consecutivi</string>
<string name="ignore_consecutive_duplicates_summary">Non salvare doppi consecutivi nella cronologia di scansione.</string>
<string name="open_immediately">Salta l\'analisi e apri i contenuti direttamente</string>
<string name="open_immediately_summary">Salta l\'analisi e apri i contenuti direttamente. Se attivo potrebbe aprire contenuti dannosi.</string>
<string name="ignore_consecutive_duplicates">Ignora i duplicati</string>
<string name="ignore_consecutive_duplicates_summary">Non salvare duplicati consecutivi nella cronologia di scansione.</string>
<string name="open_immediately">Apri subito</string>
<string name="open_immediately_summary">Salta l\'ispezione e apri i contenuti immediatamente. Se abilitato può aprire contenuti dannosi.</string>
<string name="copy_immediately">Copia negli appunti</string>
<string name="copy_immediately_summary">Copia automaticamente i contenuti scansionati negli appunti. Nota che altre app potrebbero leggere gli appunti in secondo piano.</string>
<string name="show_meta_data">Mostra metadati</string>
<string name="show_meta_data_summary">Mostra dati aggiuntivi sul codice a barre scansionato.</string>
<string name="show_qr_version">Show QR version</string>
<string name="show_qr_version">Mostra versione QR</string>
<string name="show_qr_version_summary">Show QR version number.</string>
<string name="show_hex_dump">Mostra dump esadecimale</string>
<string name="show_hex_dump_summary">Mostra un dump esadecimale dei contenuti scansionati.</string>
<string name="close_automatically">Go back after Copy/Share</string>
<string name="close_automatically_summary">Automatically return to the scan screen after copying or sharing the read contents.</string>
<string name="default_search_engine">Open unknown data in</string>
<string name="always_ask">Always ask</string>
<string name="close_automatically">Vai indietro dopo la Copia/Condivisione</string>
<string name="close_automatically_summary">Ritorna automaticamente alla schermata di scansione dopo aver copiato o condiviso i contenuti letti.</string>
<string name="default_search_engine">Apri dati sconosciuti in</string>
<string name="always_ask">Chiedi sempre</string>
<string name="open_with_url">Apri dati sconosciuti con URL</string>
<string name="clear_network_suggestions">Clear network suggestions</string>
<string name="clear_network_suggestions_summary">Remove all of the network suggestions that were previously provided by this app.</string>
<string name="really_remove_all_networks">Really remove all networks?</string>
<string name="clear_network_suggestions_success">Network suggestions cleared</string>
<string name="clear_network_suggestions_nothing_to_remove">Nothing to remove</string>
<string name="clear_network_suggestions">Cancella suggerimenti di rete</string>
<string name="clear_network_suggestions_summary">Rimuovi tutti i suggerimenti di rete precedentemente forniti da questa app.</string>
<string name="really_remove_all_networks">Rimuovere davvero tutte le reti?</string>
<string name="clear_network_suggestions_success">Suggerimenti di rete cancellati</string>
<string name="clear_network_suggestions_nothing_to_remove">Niente da rimuovere</string>
<string name="send_category">Inoltro</string>
<string name="send_scan_active">Forward scans</string>
<string name="send_scan_active_summary">Enable to forward scans to a the given URL</string>
<string name="send_scan_url">Invia ogni scansione ad un URL</string>
<string name="send_scan_type">Tipo di richiesta per ogni scansione</string>
<string name="send_scan_active">Inoltra le scansioni</string>
<string name="send_scan_active_summary">Abilita per inoltrare le scansioni a un URL specificato</string>
<string name="send_scan_url">URL a cui inoltrare</string>
<string name="send_scan_type">Tipo di richiesta</string>
<string name="send_type_get_add_content">GET e aggiungi il contenuto</string>
<string name="send_type_get_query_string">GET con stringa completa della richiesta</string>
<string name="send_type_post_form">POST application/x-www-form-urlencoded</string>
<string name="send_type_post_json">POST application/json</string>
<string name="send_type_external_browser">Open in external browser</string>
<string name="send_type_external_browser">Apri nel browser esterno</string>
<string name="test_url">Test URL</string>
<string name="really_remove_scan">Vuoi veramente rimuovere la scansione?</string>
<string name="really_remove_all_scans">Vuoi veramente rimuovere tutte le scansioni?</string>
@@ -123,7 +123,7 @@
<string name="pick_list_separator">Come separare elementi della lista?</string>
<string name="separator_line_break">Interruzione di linea</string>
<string name="separator_ruler">Righello</string>
<string name="save_as_file_name">Salvare come file?</string>
<string name="save_as_file_name">Salvare come file nei Download?</string>
<string name="file_name">Nome del file</string>
<string name="error_saving_file">Impossibile salvare il file</string>
<string name="error_file_exists">Il file esiste già</string>
@@ -147,8 +147,8 @@
<string name="export_as">Esportare come?</string>
<string name="export_csv_comma">CSV con virgole</string>
<string name="export_csv_semicolon">CSV con punti e virgola</string>
<string name="export_json">Esporta come JSON</string>
<string name="export_database">Esporta database SQLite</string>
<string name="export_json">File JSON</string>
<string name="export_database">Database SQLite</string>
<string name="saved_in_downloads">Salvato nei download</string>
<string name="rotate_image_cw">Ruota immagine in senso orario</string>
<string name="pick_file">Scegli file immagine</string>
@@ -157,14 +157,14 @@
<string name="shortcut_encode">Crea un codice a barre</string>
<string name="shortcut_preferences">Impostazioni</string>
<string name="background_request_failed">Richiesta in secondo piano fallita</string>
<string name="entry_type">Type</string>
<string name="wifi_network">Wi-Fi network</string>
<string name="wifi_ssid">Name</string>
<string name="wifi_type">Authentication type</string>
<string name="entry_type">Tipo</string>
<string name="wifi_network">Rete Wi-Fi</string>
<string name="wifi_ssid">Nome</string>
<string name="wifi_type">Tipo di autenticazione</string>
<string name="wifi_password">Password</string>
<string name="wifi_hidden">Hidden network</string>
<string name="wifi_hidden">Rete nascosta</string>
<string name="wifi_eap">EAP method</string>
<string name="wifi_anonymous_identity">Anonymous identity</string>
<string name="wifi_identity">Identity</string>
<string name="wifi_phase2">Phase 2 method</string>
<string name="wifi_anonymous_identity">Identità anonima</string>
<string name="wifi_identity">Identità</string>
<string name="wifi_phase2">Metodo di fase 2</string>
</resources>
+30 -30
View File
@@ -1,5 +1,5 @@
<resources>
<string name="no_camera_no_fun">Infelizmente você não poderá usar este app sem acesso à câmera.</string>
<string name="no_camera_no_fun">Infelizmente você não poderá usar este app sem conceder o acesso à câmera.</string>
<string name="camera_error">Não foi possível acessar a câmera, por favor tente novamente</string>
<string name="scan_code">Escaneie código</string>
<string name="compose_barcode">Criar código</string>
@@ -22,11 +22,11 @@
<string name="possible_country">Possível país de fabricação</string>
<string name="suggested_price">Preço sugerido</string>
<string name="upc_ean_extension">Extensão UPC EAN</string>
<string name="qr_version">QR version</string>
<string name="qr_version">Versão do QR</string>
<string name="toggle_flash">Ativar lanterna</string>
<string name="error_flash">Falha ao ligar a lanterna</string>
<string name="share">Compartilhar</string>
<string name="share_as">Compartilhar como?</string>
<string name="share_as">Compartilhar em qual formato?</string>
<string name="copy_to_clipboard">Copiar ao clipboard</string>
<string name="copied_to_clipboard">Copiado ao clipboard</string>
<string name="copy_password">Copiar senha ao clipboard</string>
@@ -46,7 +46,7 @@
<string name="switch_camera">Alterar câmera</string>
<string name="bulk_mode">Digitalização contínua</string>
<string name="bulk_mode_summary">Sempre executar em modo contínuo.</string>
<string name="bulk_mode_delay">Adiar em escaneamentos contínuos</string>
<string name="bulk_mode_delay">Adiar durante digitalização contínua</string>
<string name="restrict_format">Limitar formato</string>
<string name="remove_restriction">Remover limitação</string>
<string name="scan_format">Escanear %s</string>
@@ -62,10 +62,10 @@
<string name="locale_category">Idioma</string>
<string name="custom_locale">Idioma da interface</string>
<string name="follow_system_settings">Adaptar do sistema</string>
<string name="show_crop_handle">Mostrar limitador de corte</string>
<string name="show_crop_handle_summary">Limitar a uma área personalizável.</string>
<string name="show_crop_handle">Mostrar limitador customizável</string>
<string name="show_crop_handle_summary">Permite limitar a uma área específica.</string>
<string name="barcode_formats">Tipos de código</string>
<string name="zoom_by_swiping">Deslize para baixo/cima para ajustar zoom</string>
<string name="zoom_by_swiping">Deslize para ajustar zoom</string>
<string name="zoom_by_swiping_summary">Deslize para baixo/cima na tela para ajustar zoom da câmera.</string>
<string name="auto_rotate">Reconhecer códigos 1D verticais</string>
<string name="auto_rotate_summary">Girar automaticamente a câmera para reconhecer códigos 1D verticais. Dependendo do dispositivo, isto pode afetar o desempenho.</string>
@@ -74,45 +74,45 @@
<string name="show_toast_in_bulk_mode">Mostrar dados em modo contínuo</string>
<string name="show_toast_in_bulk_mode_summary">Mostrar brevemente os dados durante digitalização contínua.</string>
<string name="vibrate">Vibrar ao reconhecer</string>
<string name="vibrate_summary">Ative a opção se quiser que seu dispositivo vibre quando um código for reconhecido.</string>
<string name="use_history">Salvar histórico de escaneamentos</string>
<string name="vibrate_summary">Ative esta opção se quiser que seu dispositivo vibre quando um código for reconhecido.</string>
<string name="use_history">Salvar histórico de digitalizações</string>
<string name="use_history_summary">Salve códigos reconhecidos no seu dispositivo.</string>
<string name="ignore_consecutive_duplicates">Ignorar duplicações</string>
<string name="ignore_consecutive_duplicates_summary">Não salvar duplicações consecutivas no histórico de escaneamentos.</string>
<string name="ignore_consecutive_duplicates_summary">Não salvar duplicações consecutivas no histórico de digitalizações.</string>
<string name="open_immediately">Abrir imediatamente</string>
<string name="open_immediately_summary">Pular a inspeção e abrir o conteúdo imediatamente. Se ativado pode abrir conteúdo perigoso.</string>
<string name="open_immediately_summary">Pular a inspeção e abrir o conteúdo no mesmo instante. Quando ativado, pode abrir conteúdo perigoso.</string>
<string name="copy_immediately">Copiar ao clipboard</string>
<string name="copy_immediately_summary">Copiar automaticamente o conteúdo escaneado ao clipboard. Tem cuidado porque outros apps podem examinar seu clipboard em segundo plano.</string>
<string name="copy_immediately_summary">Copiar automaticamente ao clipboard o conteúdo digitalizado. Tem cuidado porque outros apps podem examinar seu clipboard em segundo plano.</string>
<string name="show_meta_data">Mostrar metadados</string>
<string name="show_meta_data_summary">Mostrar dados adicionais de código escaneado.</string>
<string name="show_qr_version">Show QR version</string>
<string name="show_qr_version_summary">Show QR version number.</string>
<string name="show_meta_data_summary">Mostrar dados adicionais de código digitalizado.</string>
<string name="show_qr_version">Mostrar a versão do QR</string>
<string name="show_qr_version_summary">Mostrar o número de versão do código QR.</string>
<string name="show_hex_dump">Mostrar impressão hexadecimal</string>
<string name="show_hex_dump_summary">Mostrar a impressão hexadecimal de conteúdo escaneado.</string>
<string name="show_hex_dump_summary">Mostrar a impressão hexadecimal do conteúdo digitalizado.</string>
<string name="close_automatically">Voltar após copiar/compartilhar</string>
<string name="close_automatically_summary">Voltar automaticamente à tela de digitalização após copiar ou compartilhar o código consultado.</string>
<string name="close_automatically_summary">Voltar automaticamente à tela de digitalização após copiar ou compartilhar o código examinado.</string>
<string name="default_search_engine">Abrir dados desconhecidos em</string>
<string name="always_ask">Sempre perguntar</string>
<string name="open_with_url">Abrir dados desconhecidos via URL</string>
<string name="clear_network_suggestions">Remover sugestões da rede</string>
<string name="clear_network_suggestions_summary">Remover todas as sugestões da rede que foram anteriormente fornecidas pelo app.</string>
<string name="really_remove_all_networks">Realmente remover todas as redes?</string>
<string name="clear_network_suggestions_success">Sugestões da rede removidas</string>
<string name="clear_network_suggestions_success">Sugestões da rede foram removidas</string>
<string name="clear_network_suggestions_nothing_to_remove">Nada para remover</string>
<string name="send_category">Encaminhamento</string>
<string name="send_scan_active">Encaminhar escaneamentos</string>
<string name="send_scan_active_summary">Ativar para encaminhar escaneamentos à URL definida</string>
<string name="send_scan_active">Encaminhar conteúdo digitalizado</string>
<string name="send_scan_active_summary">Ative para encaminhar conteúdo digitalizado à URL definida</string>
<string name="send_scan_url">URL à qual encaminhar</string>
<string name="send_scan_type">Tipo de solicitação</string>
<string name="send_type_get_add_content">GET e apenas adicionar o conteúdo</string>
<string name="send_type_get_add_content">GET e somente adicionar o conteúdo</string>
<string name="send_type_get_query_string">GET com sequência completa da consulta</string>
<string name="send_type_post_form">POST application/x-www-form-urlencoded</string>
<string name="send_type_post_json">POST application/json</string>
<string name="send_type_external_browser">Abrir num navegador externo</string>
<string name="send_type_external_browser">Abrir em navegador externo</string>
<string name="test_url">Testar a URL</string>
<string name="really_remove_scan">Realmente quer remover este escaneamento?</string>
<string name="really_remove_all_scans">Realmente quer remover todos os escaneamentos?</string>
<string name="really_remove_selected_scans">Realmente remover escaneamentos selecionados?</string>
<string name="really_remove_scan">Realmente quer remover esta digitalização?</string>
<string name="really_remove_all_scans">Realmente quer remover todas as digitalizações?</string>
<string name="really_remove_selected_scans">Realmente remover digitalizações selecionados?</string>
<string name="clear_history">Limpar histórico</string>
<string name="copy_scan">Copiar digitalização</string>
<string name="edit_scan">Editar identificação</string>
@@ -123,7 +123,7 @@
<string name="pick_list_separator">Como separar itens da lista?</string>
<string name="separator_line_break">Quebra de linha</string>
<string name="separator_ruler">Régua</string>
<string name="save_as_file_name">Salvar em Downloads?</string>
<string name="save_as_file_name">Salvar para Downloads?</string>
<string name="file_name">Nome do arquivo</string>
<string name="error_saving_file">Não foi possível salvar o arquivo</string>
<string name="error_file_exists">Arquivo já existe</string>
@@ -133,10 +133,10 @@
<string name="sms_send">Envie SMS</string>
<string name="sms_error">Não foi possível enviar SMS</string>
<string name="tel_dial">Disque número</string>
<string name="tel_error">Não foi possível discar número</string>
<string name="tel_error">Não foi possível discar o número</string>
<string name="mail_send">Envie e-mail</string>
<string name="mail_error">Não foi possível enviar e-mail</string>
<string name="vcard_add">Adicionar para contatos</string>
<string name="mail_error">Não foi possível enviar o e-mail</string>
<string name="vcard_add">Adicionar aos contatos</string>
<string name="vcard_failed">Não foi possível adicionar aos contatos</string>
<string name="vevent_add">Adicionar ao calendário</string>
<string name="vevent_failed">Não foi possível adicionar ao calendário</string>
@@ -144,7 +144,7 @@
<string name="search_web">Pesquisar na internet</string>
<string name="search_scan">Pesquisar em conteúdo já digitalizado</string>
<string name="export_to_file">Exportar para arquivo</string>
<string name="export_as">Exportar como?</string>
<string name="export_as">Exportar em qual formato?</string>
<string name="export_csv_comma">Arquivo CSV com vírgulas</string>
<string name="export_csv_semicolon">Arquivo CSV com ponto-e-vírgula</string>
<string name="export_json">Arquivo JSON</string>
+4 -4
View File
@@ -21,7 +21,7 @@
<string name="possible_country">可能产地</string>
<string name="suggested_price">建议价格</string>
<string name="upc_ean_extension">UPC EAN 扩展</string>
<string name="qr_version">QR version</string>
<string name="qr_version">QR 版本</string>
<string name="toggle_flash">开关闪光灯</string>
<string name="error_flash">开关闪光灯出错</string>
<string name="share">分享</string>
@@ -46,7 +46,7 @@
<string name="bulk_mode">连续扫描</string>
<string name="bulk_mode_summary">始终开启连续扫描</string>
<string name="bulk_mode_delay">连续扫描之间的延迟</string>
<string name="restrict_format">受限格式</string>
<string name="restrict_format">严格模式(扫描指定编码格式)</string>
<string name="remove_restriction">解除限制</string>
<string name="scan_format">扫描 %s</string>
<string name="quarter_second">四分之一秒</string>
@@ -84,8 +84,8 @@
<string name="copy_immediately_summary">注意其他 APP 可能会在后台监控剪贴板</string>
<string name="show_meta_data">显示元数据</string>
<string name="show_meta_data_summary">显示已扫描条码的额外数据</string>
<string name="show_qr_version">Show QR version</string>
<string name="show_qr_version_summary">Show QR version number.</string>
<string name="show_qr_version">显示 QR 版本</string>
<string name="show_qr_version_summary">显示 QR Code 的版本号</string>
<string name="show_hex_dump">显示16进制数据</string>
<string name="show_hex_dump_summary">显示已扫描条码的16进制数据</string>
<string name="close_automatically">复制/分享后自动返回</string>
+1 -1
View File
@@ -11,7 +11,7 @@
<item>Georgian</item>
<item>Dutch</item>
<item>Polski</item>
<item>Portuguese (Brazil)</item>
<item>Português do Brasil</item>
<item>Russian</item>
<item>Turkish</item>
<item>Ukrainian</item>
@@ -0,0 +1,43 @@
package de.markusfisch.android.binaryeye.actions.mail
import junit.framework.TestCase.assertEquals
import org.junit.Test
class MatMsgTest {
@Test
fun to() {
val mm = MatMsg(
"MATMSG:TO:someone@example.org;;"
)
assertEquals(mm.to, "someone@example.org")
}
@Test
fun toSub() {
val mm = MatMsg(
"MATMSG:TO:someone@example.org;SUB:Stuff;;"
)
assertEquals(mm.to, "someone@example.org")
assertEquals(mm.sub, "Stuff")
}
@Test
fun toSubBody() {
val mm = MatMsg(
"MATMSG:TO:someone@example.org;SUB:Stuff;BODY:This is some text;;"
)
assertEquals(mm.to, "someone@example.org")
assertEquals(mm.sub, "Stuff")
assertEquals(mm.body, "This is some text")
}
@Test
fun differentOrder() {
val mm = MatMsg(
"MATMSG:SUB:Stuff;BODY:This is some text;TO:someone@example.org;;"
)
assertEquals(mm.to, "someone@example.org")
assertEquals(mm.sub, "Stuff")
assertEquals(mm.body, "This is some text")
}
}
@@ -1,6 +1,5 @@
package de.markusfisch.android.binaryeye.actions.vtype
import de.markusfisch.android.binaryeye.simpleFail
import junit.framework.TestCase.*
import org.junit.Test
@@ -1,6 +1,5 @@
package de.markusfisch.android.binaryeye.actions.web
import de.markusfisch.android.binaryeye.simpleFail
import junit.framework.TestCase.*
import org.junit.Test
@@ -0,0 +1,10 @@
Funziona con orientamento verticale e orizzontale, può leggere codici invertiti,
è in Material Design e può anche generare codici a barre.
Usa la libreria di scansione di codici a barre ZXing ("Zebra Crossing").
I formati di codici a barre supportati sono: AZTEC, CODABAR, CODE 39, CODE 93, CODE 128,
DATA MATRIX, EAN 8, EAN 13, ITF, PDF417, QR CODE, RSS 14, RSS EXPANDED,
UPC A, UPC E e UPC EAN EXTENSION.
Questa è open source:
https://github.com/markusfisch/BinaryEye
@@ -0,0 +1 @@
Ancora un altro lettore di codici a barre per Android. Gratuito, senza pubblicità e open source.
@@ -0,0 +1,10 @@
Funciona tanto no modo vertical quanto no horizontal, pode ler códigos invertidos,
gerar vários tipos de códigos e é feito com Material Design.
Utiliza a biblioteca de leitura de códigos ZXing ("Zebra Crossing").
Os seguintes formatos de códigos são suportados: AZTEC, CODABAR, CODE 39, CODE 93,
CODE 128, DATA MATRIX, EAN 8, EAN 13, ITF, PDF417, QR CODE, RSS 14, RSS EXPANDED,
UPC A, UPC E e UPC EAN EXTENSION.
App é de software livre:
https://github.com/markusfisch/BinaryEye
@@ -0,0 +1 @@
Mais um leitor de códigos QR etc. para Android. Sem anúncios e de software livre.
+1 -1
View File
@@ -1 +1 @@
Mais um scanner de código de barras
Mais um leitor de códigos QR etc
@@ -0,0 +1 @@
Binary Eye