Compare commits

...
10 Commits
Author SHA1 Message Date
Markus Fisch 4326df5069 Advance version number to 1.56.0 2022-11-03 19:05:06 +01:00
Markus Fisch ba24287f04 Update to latest ZXing C++ wrapper
To fix getting UTF-8 strings from the JVM.
2022-11-03 19:00:49 +01:00
Markus Fisch bd8f1b17dd Remove double action item for forward/next 2022-11-02 21:57:32 +01:00
Markus Fisch 2c21aeb83a Set FAB background to @null
To silence this warning:

> I/FloatingActionButton: Setting a custom background is not supported.

Details:
https://github.com/material-components/material-components-android/issues/283
2022-11-03 12:30:05 +01:00
Markus Fisch 9ccff808bc Replace properties with functions in Barcode
We should only prefer read-only properties over of functions if the
underlying algorithm…

* does not throw
* is cheap to calculate (or cached on the first run)
* returns the same result over invocations if the object state
  hasn't changed

See:
https://kotlinlang.org/docs/coding-conventions.html#functions-vs-properties

But `ZXing.encodeAs*` may throw and may also not be that cheap to
calculate. So functions are a better fit here.

Also, because these functions will always return the same result,
it makes sense to cache their outputs.
2022-11-02 21:49:08 +01:00
Markus Fisch 32e936dd71 Optimize new drawables with avocado 2022-11-02 21:06:17 +01:00
Markus Fisch 58eebacd4f Use forward arrow for FAB in picking activity
Hopefully this makes it more clear that you have to tap on the
FAB to actually read the found barcode.
2022-11-02 21:06:17 +01:00
Markus Fisch 75b945e842 Remove unused forceCompat preference
Obsolete since we use the ZXing C++ fork.
2022-11-02 21:06:17 +01:00
Markus Fisch a9ea77f74f Add an action item to lock/unlock free rotation
When scanning a barcode from an image.

Free rotation may not always be desirable.
2022-11-02 21:06:17 +01:00
Markus Fisch 3df658165b Support setting fore and background colors
When creating AZTEC, DATA MATRIX or QR Codes.
2022-11-02 21:06:17 +01:00
37 changed files with 313 additions and 63 deletions
+5
View File
@@ -1,5 +1,10 @@
# Change Log
## 1.56.0
* Add an action item to lock/unlock free rotation
* Support setting fore and background colors when creating barcodes
* Fix creating barcodes with UTF-8 content
## 1.55.0
* Make recreated barcode interactive
* Update to latest ZXing C++
+3 -3
View File
@@ -9,8 +9,8 @@ android {
minSdkVersion 9
targetSdkVersion sdk_version
versionCode 105
versionName '1.55.0'
versionCode 106
versionName '1.56.0'
}
signingConfigs {
@@ -66,5 +66,5 @@ dependencies {
implementation "com.android.support:preference-v14:$support_version"
implementation 'com.github.markusfisch:CameraView:1.9.1'
implementation 'com.github.markusfisch:ScalingImageView:1.4.0'
implementation 'com.github.markusfisch:zxing-cpp:v1.4.0.6'
implementation 'com.github.markusfisch:zxing-cpp:v1.4.0.7'
}
@@ -45,6 +45,7 @@ class PickActivity : AppCompatActivity() {
private lateinit var vibrator: Vibrator
private lateinit var cropImageView: CropImageView
private lateinit var detectorView: DetectorView
private lateinit var freeRotationItem: MenuItem
private var result: Result? = null
@@ -81,7 +82,7 @@ class PickActivity : AppCompatActivity() {
cropImageView = findViewById(R.id.image) as CropImageView
cropImageView.restrictTranslation = false
cropImageView.freeRotation = true
cropImageView.freeRotation = prefs.freeRotation
cropImageView.setImageBitmap(bitmap)
cropImageView.onScan = {
scanWithinBounds(bitmap)
@@ -179,6 +180,9 @@ class PickActivity : AppCompatActivity() {
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.activity_pick, menu)
freeRotationItem = menu.findItem(R.id.toggle_free).apply {
updateFreeRotationIcon()
}
return true
}
@@ -188,10 +192,26 @@ class PickActivity : AppCompatActivity() {
rotateClockwise()
true
}
R.id.toggle_free -> {
prefs.freeRotation = prefs.freeRotation xor true
cropImageView.freeRotation = prefs.freeRotation
freeRotationItem.updateFreeRotationIcon()
true
}
else -> super.onOptionsItemSelected(item)
}
}
private fun MenuItem.updateFreeRotationIcon() {
setIcon(
if (prefs.freeRotation) {
R.drawable.ic_action_rotation_unlocked
} else {
R.drawable.ic_action_rotation_locked
}
)
}
private fun rotateClockwise() {
cropImageView.imageRotation = cropImageView.imageRotation + 90 % 360
}
@@ -14,6 +14,8 @@ import de.markusfisch.android.binaryeye.app.hasWritePermission
import de.markusfisch.android.binaryeye.content.copyToClipboard
import de.markusfisch.android.binaryeye.content.shareFile
import de.markusfisch.android.binaryeye.content.shareText
import de.markusfisch.android.binaryeye.graphics.COLOR_BLACK
import de.markusfisch.android.binaryeye.graphics.COLOR_WHITE
import de.markusfisch.android.binaryeye.io.addSuffixIfNotGiven
import de.markusfisch.android.binaryeye.io.toSaveResult
import de.markusfisch.android.binaryeye.io.writeExternalFile
@@ -61,11 +63,11 @@ class BarcodeFragment : Fragment() {
val bitmap: Bitmap
try {
barcode = arguments?.toProperties() ?: throw IllegalArgumentException(
barcode = arguments?.toBarcode() ?: throw IllegalArgumentException(
"Illegal arguments"
)
// Catch exceptions from encoding.
bitmap = barcode.bitmap
bitmap = barcode.bitmap()
} catch (e: Exception) {
var message = e.message
if (message == null || message.isEmpty()) {
@@ -103,7 +105,7 @@ class BarcodeFragment : Fragment() {
return view
}
private fun Bundle.toProperties() = Barcode(
private fun Bundle.toBarcode() = Barcode(
getString(CONTENT) ?: throw IllegalArgumentException(
"content cannot be null"
),
@@ -113,7 +115,8 @@ class BarcodeFragment : Fragment() {
)
),
getInt(SIZE),
getInt(EC_LEVEL)
getInt(EC_LEVEL),
Colors.values()[getInt(COLORS)]
)
override fun onDestroyView() {
@@ -129,7 +132,7 @@ class BarcodeFragment : Fragment() {
return when (item.itemId) {
R.id.copy_to_clipboard -> {
context.apply {
copyToClipboard(barcode.text)
copyToClipboard(barcode.text())
toast(R.string.copied_to_clipboard)
}
true
@@ -181,19 +184,19 @@ class BarcodeFragment : Fragment() {
addSuffixIfNotGiven(fileName, ".png"),
MIME_PNG
) {
barcode.bitmap.saveAsPng(it)
barcode.bitmap().saveAsPng(it)
}
FileType.SVG -> saveAs(
addSuffixIfNotGiven(fileName, ".svg"),
MIME_SVG
) { outputStream ->
outputStream.write(barcode.svg.toByteArray())
outputStream.write(barcode.svg().toByteArray())
}
FileType.TXT -> saveAs(
addSuffixIfNotGiven(fileName, ".txt"),
MIME_TXT
) { outputStream ->
outputStream.write(barcode.text.toByteArray())
outputStream.write(barcode.text().toByteArray())
}
}
}
@@ -218,9 +221,9 @@ class BarcodeFragment : Fragment() {
private fun Context.shareAs(fileType: FileType) {
when (fileType) {
FileType.PNG -> share(barcode.bitmap)
FileType.SVG -> shareText(barcode.svg, MIME_SVG)
FileType.TXT -> shareText(barcode.text)
FileType.PNG -> share(barcode.bitmap())
FileType.SVG -> shareText(barcode.svg(), MIME_SVG)
FileType.TXT -> shareText(barcode.text())
}
}
@@ -253,6 +256,7 @@ class BarcodeFragment : Fragment() {
private const val FORMAT = "format"
private const val SIZE = "size"
private const val EC_LEVEL = "ec_level"
private const val COLORS = "colors"
private const val MIME_PNG = "image/png"
private const val MIME_SVG = "image/svg+xmg"
private const val MIME_TXT = "text/plain"
@@ -261,13 +265,15 @@ class BarcodeFragment : Fragment() {
content: String,
format: Format,
size: Int,
ecLevel: Int = -1
ecLevel: Int = -1,
colors: Int = 0
): Fragment {
val args = Bundle()
args.putString(CONTENT, content)
args.putString(FORMAT, format.name)
args.putInt(SIZE, size)
args.putInt(EC_LEVEL, ecLevel)
args.putInt(COLORS, colors)
val fragment = BarcodeFragment()
fragment.arguments = args
return fragment
@@ -279,20 +285,59 @@ private data class Barcode(
val content: String,
val format: Format,
val size: Int,
val ecLevel: Int
val ecLevel: Int,
val colors: Colors
) {
val bitmap: Bitmap
get() = ZxingCpp.encodeAsBitmap(
content, format, size, size, -1, ecLevel
private var _bitmap: Bitmap? = null
fun bitmap(): Bitmap {
val b = _bitmap ?: ZxingCpp.encodeAsBitmap(
content, format, size, size, -1, ecLevel,
setColor = colors.foregroundColor(),
unsetColor = colors.backgroundColor()
)
val svg: String
get() = ZxingCpp.encodeAsSvg(
_bitmap = b
return b
}
private var _svg: String? = null
fun svg(): String {
val s = _svg ?: ZxingCpp.encodeAsSvg(
content, format, -1, ecLevel
)
val text: String
get() = ZxingCpp.encodeAsText(
content, format, -1, ecLevel
_svg = s
return s
}
private var _text: String? = null
fun text(): String {
val t = _text ?: ZxingCpp.encodeAsText(
content, format, -1, ecLevel,
inverted = colors == Colors.BLACK_ON_WHITE
)
_text = t
return t
}
}
private enum class Colors {
BLACK_ON_WHITE,
WHITE_ON_BLACK,
BLACK_ON_TRANSPARENT,
WHITE_ON_TRANSPARENT;
fun foregroundColor(): Int = when (this) {
BLACK_ON_WHITE,
BLACK_ON_TRANSPARENT -> COLOR_BLACK
WHITE_ON_BLACK,
WHITE_ON_TRANSPARENT -> COLOR_WHITE
}
fun backgroundColor(): Int = when (this) {
BLACK_ON_WHITE -> COLOR_WHITE
WHITE_ON_BLACK -> COLOR_BLACK
BLACK_ON_TRANSPARENT,
WHITE_ON_TRANSPARENT -> 0
}
}
private fun Bitmap.saveAsPng(outputStream: OutputStream, quality: Int = 90) =
@@ -1,5 +1,6 @@
package de.markusfisch.android.binaryeye.fragment
import android.content.Context
import android.os.Bundle
import android.support.v4.app.Fragment
import android.view.LayoutInflater
@@ -12,12 +13,15 @@ import de.markusfisch.android.binaryeye.app.addFragment
import de.markusfisch.android.binaryeye.app.prefs
import de.markusfisch.android.binaryeye.view.hideSoftKeyboard
import de.markusfisch.android.binaryeye.view.setPaddingFromWindowInsets
import de.markusfisch.android.binaryeye.widget.toast
import de.markusfisch.android.zxingcpp.ZxingCpp.Format
class EncodeFragment : Fragment() {
private lateinit var formatView: Spinner
private lateinit var errorCorrectionLabel: TextView
private lateinit var errorCorrectionLevel: Spinner
private lateinit var ecLabel: TextView
private lateinit var ecSpinner: Spinner
private lateinit var colorsLabel: TextView
private lateinit var colorsSpinner: Spinner
private lateinit var sizeView: TextView
private lateinit var sizeBarView: SeekBar
private lateinit var contentView: EditText
@@ -67,22 +71,26 @@ class EncodeFragment : Fragment() {
position: Int,
id: Long
) {
val visibility = if (
val ecVisibility = if (
writers[position] == Format.QR_CODE
) {
View.VISIBLE
} else {
View.GONE
}
errorCorrectionLabel.visibility = visibility
errorCorrectionLevel.visibility = visibility
) View.VISIBLE else View.GONE
ecLabel.visibility = ecVisibility
ecSpinner.visibility = ecVisibility
val colorsVisibility = if (
writers[position].canBeInverted()
) View.VISIBLE else View.GONE
colorsLabel.visibility = colorsVisibility
colorsSpinner.visibility = colorsVisibility
}
override fun onNothingSelected(parentView: AdapterView<*>?) {}
}
errorCorrectionLabel = view.findViewById(R.id.error_correction_label)
errorCorrectionLevel = view.findViewById(R.id.error_correction_level)
ecLabel = view.findViewById(R.id.error_correction_label)
ecSpinner = view.findViewById(R.id.error_correction_level)
colorsLabel = view.findViewById(R.id.colors_label)
colorsSpinner = view.findViewById(R.id.colors)
sizeView = view.findViewById(R.id.size_display)
sizeBarView = view.findViewById(R.id.size_bar)
@@ -107,7 +115,7 @@ class EncodeFragment : Fragment() {
}
view.findViewById<View>(R.id.encode).setOnClickListener {
encode()
it.context.encode()
}
(view.findViewById(R.id.inset_layout) as View).setPaddingFromWindowInsets()
@@ -121,25 +129,25 @@ class EncodeFragment : Fragment() {
prefs.indexOfLastSelectedFormat = formatView.selectedItemPosition
}
private fun encode() {
private fun Context.encode() {
val content = contentView.text.toString()
if (content.isEmpty()) {
Toast.makeText(
context,
R.string.error_no_content,
Toast.LENGTH_SHORT
).show()
} else {
activity?.hideSoftKeyboard(contentView)
fragmentManager?.addFragment(
BarcodeFragment.newInstance(
content,
writers[formatView.selectedItemPosition],
getSize(sizeBarView.progress),
errorCorrectionLevel.selectedItemPosition
)
)
toast(R.string.error_no_content)
return
}
hideSoftKeyboard(contentView)
val writer = writers[formatView.selectedItemPosition]
fragmentManager?.addFragment(
BarcodeFragment.newInstance(
content,
writer,
getSize(sizeBarView.progress),
ecSpinner.selectedItemPosition,
if (writer.canBeInverted()) {
colorsSpinner.selectedItemPosition
} else 0
)
)
}
private fun initSizeBar() {
@@ -185,6 +193,13 @@ class EncodeFragment : Fragment() {
}
}
private fun Format.canBeInverted() = when (this) {
Format.AZTEC,
Format.DATA_MATRIX,
Format.QR_CODE -> true
else -> false
}
private fun String.toFormat(default: Format = Format.QR_CODE): Format = try {
Format.valueOf(this)
} catch (_: IllegalArgumentException) {
@@ -0,0 +1,4 @@
package de.markusfisch.android.binaryeye.graphics
const val COLOR_BLACK = 0xff000000.toInt()
const val COLOR_WHITE = 0xffffffff.toInt()
@@ -44,9 +44,9 @@ private fun Bitmap.analyzeTransparency(): Result {
return Result(
transparent > 0,
if (bright > 0 && visible / bright < 2) {
0xff000000.toInt()
COLOR_BLACK
} else {
0xffffffff.toInt()
COLOR_WHITE
}
)
}
@@ -174,11 +174,9 @@ class Preferences {
apply(INDEX_OF_LAST_SELECTED_FORMAT, value)
field = value
}
var forceCompat = false
var freeRotation = true
set(value) {
// Since the app may be about to crash when forceCompat is set,
// it's necessary to `commit()` this synchronously.
commit(FORCE_COMPAT, value)
apply(FREE_ROTATION, value)
field = value
}
@@ -259,7 +257,7 @@ class Preferences {
INDEX_OF_LAST_SELECTED_FORMAT,
indexOfLastSelectedFormat
)
forceCompat = preferences.getBoolean(FORCE_COMPAT, forceCompat)
freeRotation = preferences.getBoolean(FREE_ROTATION, freeRotation)
}
private fun put(label: String, value: Boolean) =
@@ -321,6 +319,6 @@ class Preferences {
private const val SEND_SCAN_TYPE = "send_scan_type"
private const val CUSTOM_LOCALE = "custom_locale"
private const val INDEX_OF_LAST_SELECTED_FORMAT = "index_of_last_selected_format"
private const val FORCE_COMPAT = "force_compat"
private const val FREE_ROTATION = "free_rotation"
}
}
@@ -0,0 +1,3 @@
<vector android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 0.9-2 2v10c0 1.1 0.9 2 2 2h12c1.1 0 2-0.9 2-2V10c0-1.1-0.9-2-2-2zm-6 9c-1.1 0-2-0.9-2-2s0.9-2 2-2 2 0.9 2 2-0.9 2-2 2zm3.1-9H8.9V6c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z"/>
</vector>
@@ -0,0 +1,3 @@
<vector android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M12 17c1.1 0 2-0.9 2-2s-0.9-2-2-2-2 0.9-2 2 0.9 2 2 2zm6-9h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6h1.9c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2H6c-1.1 0-2 0.9-2 2v10c0 1.1 0.9 2 2 2h12c1.1 0 2-0.9 2-2V10c0-1.1-0.9-2-2-2zm0 12H6V10h12v10z"/>
</vector>
+1 -1
View File
@@ -17,6 +17,6 @@
style="@style/FAB"
android:id="@+id/scan"
android:contentDescription="@string/scan_code"
android:src="@drawable/ic_action_search"/>
android:src="@drawable/ic_action_next"/>
</android.support.design.widget.CoordinatorLayout>
</merge>
@@ -35,6 +35,18 @@
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:entries="@array/error_correction_levels"/>
<TextView
android:id="@+id/colors_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:text="@string/colors"/>
<Spinner
android:id="@+id/colors"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:entries="@array/colors"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
+5
View File
@@ -1,6 +1,11 @@
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:material="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/toggle_free"
android:title="@string/toggle_free_rotation"
android:icon="@drawable/ic_action_rotation_unlocked"
material:showAsAction="ifRoom"/>
<item
android:id="@+id/rotate"
android:title="@string/rotate_image_cw"
+6
View File
@@ -15,6 +15,11 @@
<string name="error_correction_level_m" formatted="false">মধ্যম (~১৫&#37; ঠিককরণ)</string>
<string name="error_correction_level_q" formatted="false">বেশি (~২৫&#37; ঠিককরণ)</string>
<string name="error_correction_level_h" formatted="false">অনেক বেশি (~৩০&#37; ঠিককরণ)</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
<string name="colors_black_on_transparent">Black on transparent</string>
<string name="colors_white_on_transparent">White on transparent</string>
<string name="sequence_size">Sequence size</string>
<string name="sequence_index">Sequence index</string>
<string name="sequence_id">Sequence ID</string>
@@ -152,6 +157,7 @@
<string name="export_database">এসকিউলাইট তথ্যভিত্তি</string>
<string name="saved_in_downloads">ডাউনলোডে সংরক্ষিত</string>
<string name="rotate_image_cw">ছবি ঘড়ির দিকে ঘুরাও</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">ছবি নাও</string>
<string name="pick_code_to_scan">খুঁজার জন্য কোড নাও</string>
<string name="shortcut_decode">বারকোড খুজো</string>
+6
View File
@@ -17,6 +17,11 @@
<string name="error_correction_level_m" formatted="false">Střední (~15&#37; korekce)</string>
<string name="error_correction_level_q" formatted="false">Čtvrtinový (~25&#37; korekce)</string>
<string name="error_correction_level_h" formatted="false">Vysoký (~30&#37; korekce)</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
<string name="colors_black_on_transparent">Black on transparent</string>
<string name="colors_white_on_transparent">White on transparent</string>
<string name="sequence_size">Sequence size</string>
<string name="sequence_index">Sequence index</string>
<string name="sequence_id">Sequence ID</string>
@@ -154,6 +159,7 @@
<string name="export_database">SQLite databáze</string>
<string name="saved_in_downloads">Uloženo do složky Stahování</string>
<string name="rotate_image_cw">Otočit obrázek po směru hodinových ručiček</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">Vybrat obrázek</string>
<string name="pick_code_to_scan">Vyberte kód k naskenování</string>
<string name="shortcut_decode">Skenovat čárový kód</string>
+6
View File
@@ -15,6 +15,11 @@
<string name="error_correction_level_m" formatted="false">Medium (~15&#37; wiederherstellbar)</string>
<string name="error_correction_level_q" formatted="false">Quartile (~25&#37; wiederherstellbar)</string>
<string name="error_correction_level_h" formatted="false">High (~30&#37; wiederherstellbar)</string>
<string name="colors">Vor und Hintergrund</string>
<string name="colors_black_on_white">Schwarz auf Weiss</string>
<string name="colors_white_on_black">Weiss auf Schwarz</string>
<string name="colors_black_on_transparent">Schwarz auf Transparent</string>
<string name="colors_white_on_transparent">Weiss auf Transparent</string>
<string name="sequence_size">Sequence size</string>
<string name="sequence_index">Sequence index</string>
<string name="sequence_id">Sequence ID</string>
@@ -152,6 +157,7 @@
<string name="export_database">SQLite Datenbank</string>
<string name="saved_in_downloads">In den Downloads gespeichert</string>
<string name="rotate_image_cw">Bild im Uhrzeigersinn rotieren</string>
<string name="toggle_free_rotation">Freie Rotation ein/ausschalten</string>
<string name="pick_file">Bilddatei auswählen</string>
<string name="pick_code_to_scan">Code im Bild auswählen</string>
<string name="shortcut_decode">Barcode lesen</string>
+6
View File
@@ -15,6 +15,11 @@
<string name="error_correction_level_m" formatted="false">Medio (~15&#37; de correción)</string>
<string name="error_correction_level_q" formatted="false">Cuartil (~25&#37; de correción)</string>
<string name="error_correction_level_h" formatted="false">Alto (~30&#37; de correción)</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
<string name="colors_black_on_transparent">Black on transparent</string>
<string name="colors_white_on_transparent">White on transparent</string>
<string name="sequence_size">Sequence size</string>
<string name="sequence_index">Sequence index</string>
<string name="sequence_id">Sequence ID</string>
@@ -152,6 +157,7 @@
<string name="export_database">Base de datos SQLite</string>
<string name="saved_in_downloads">Guardado en Descargas</string>
<string name="rotate_image_cw">Rotar la imagen en sentido horario</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">Seleccionar imagen</string>
<string name="pick_code_to_scan">Seleccione el código a escanear</string>
<string name="shortcut_decode">Escanear un código</string>
+6
View File
@@ -15,6 +15,11 @@
<string name="error_correction_level_m" formatted="false">متوسط (⁦~۱۵٪⁩ تصحیح)</string>
<string name="error_correction_level_q" formatted="false">یک‌چهارم (⁦~۲۵٪⁩ تصحیح)</string>
<string name="error_correction_level_h" formatted="false">زیاد (~۳۰٪⁩ تصحیح)</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
<string name="colors_black_on_transparent">Black on transparent</string>
<string name="colors_white_on_transparent">White on transparent</string>
<string name="sequence_size">Sequence size</string>
<string name="sequence_index">Sequence index</string>
<string name="sequence_id">Sequence ID</string>
@@ -152,6 +157,7 @@
<string name="export_database">پایگاه‌دادهٔ اس‌کیولایت</string>
<string name="saved_in_downloads">در بارگیری‌ها ذخیره شد</string>
<string name="rotate_image_cw">تصویر را در جهت ساعتگرد بچرخانید</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">پروندهٔ تصویری را برگزینید</string>
<string name="pick_code_to_scan">کدی را برای پویش برگزینید</string>
<string name="shortcut_decode">پویش یک بارکد</string>
+6
View File
@@ -16,6 +16,11 @@
<string name="error_correction_level_m" formatted="false">Moyen (~15% de correction)</string>
<string name="error_correction_level_q" formatted="false">Quartile (~25% de correction)</string>
<string name="error_correction_level_h" formatted="false">Élevé (~30% de correction)</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
<string name="colors_black_on_transparent">Black on transparent</string>
<string name="colors_white_on_transparent">White on transparent</string>
<string name="sequence_size">Sequence size</string>
<string name="sequence_index">Sequence index</string>
<string name="sequence_id">Sequence ID</string>
@@ -153,6 +158,7 @@
<string name="export_database">Exporter la base de données SQLite</string>
<string name="saved_in_downloads">Sauvegardé dans les Téléchargements</string>
<string name="rotate_image_cw">Tourner l\'image dans le sens horaire</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">Choisir un fichier image</string>
<string name="pick_code_to_scan">Choisissez le code à scanner</string>
<string name="shortcut_decode">Scanner un code-barres</string>
+6
View File
@@ -15,6 +15,11 @@
<string name="error_correction_level_m" formatted="false">Közepes (~15&#37; javítás)</string>
<string name="error_correction_level_q" formatted="false">Kvartilis (~25&#37; javítás)</string>
<string name="error_correction_level_h" formatted="false">Magas (~30&#37; javítás)</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
<string name="colors_black_on_transparent">Black on transparent</string>
<string name="colors_white_on_transparent">White on transparent</string>
<string name="sequence_size">Sequence size</string>
<string name="sequence_index">Sequence index</string>
<string name="sequence_id">Sequence ID</string>
@@ -152,6 +157,7 @@
<string name="export_database">SQLite adatbázis</string>
<string name="saved_in_downloads">Elmentve a letöltésekbe</string>
<string name="rotate_image_cw">Kép forgatása jobbra</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">Képfájl kiválasztása</string>
<string name="pick_code_to_scan">Kód kiválasztása a beolvasáshoz</string>
<string name="shortcut_decode">Vonalkód beolvasása</string>
+6
View File
@@ -14,6 +14,11 @@
<string name="error_correction_level_m" formatted="false">Medium (~15&#37; koreksi)</string>
<string name="error_correction_level_q" formatted="false">Kuartil (~25&#37; koreksi)</string>
<string name="error_correction_level_h" formatted="false">Tinggi (~30&#37; koreksi)</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
<string name="colors_black_on_transparent">Black on transparent</string>
<string name="colors_white_on_transparent">White on transparent</string>
<string name="sequence_size">Sequence size</string>
<string name="sequence_index">Sequence index</string>
<string name="sequence_id">Sequence ID</string>
@@ -151,6 +156,7 @@
<string name="export_database">Ekspor basis data SQLite</string>
<string name="saved_in_downloads">Simpan di dalam unduhan</string>
<string name="rotate_image_cw">Putar gambar searah jarum jam</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">Pilih berkas gambar</string>
<string name="pick_code_to_scan">Pilih kode untuk dipindai</string>
<string name="shortcut_decode">Pindai barcode</string>
+6
View File
@@ -15,6 +15,11 @@
<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="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
<string name="colors_black_on_transparent">Black on transparent</string>
<string name="colors_white_on_transparent">White on transparent</string>
<string name="sequence_size">Dimensione della sequenza</string>
<string name="sequence_index">Indice della sequenza</string>
<string name="sequence_id">ID della sequenza</string>
@@ -152,6 +157,7 @@
<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="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">Scegli file immagine</string>
<string name="pick_code_to_scan">Scegli codice da scansionare</string>
<string name="shortcut_decode">Scansiona un codice a barre</string>
+6
View File
@@ -14,6 +14,11 @@
<string name="error_correction_level_m" formatted="false">中 (~15&#37; の正確性)</string>
<string name="error_correction_level_q" formatted="false">高 (~25&#37; の正確性)</string>
<string name="error_correction_level_h" formatted="false">最高 (~30&#37; の正確性)</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
<string name="colors_black_on_transparent">Black on transparent</string>
<string name="colors_white_on_transparent">White on transparent</string>
<string name="sequence_size">Sequence size</string>
<string name="sequence_index">Sequence index</string>
<string name="sequence_id">Sequence ID</string>
@@ -151,6 +156,7 @@
<string name="export_database">SQLiteデータベース</string>
<string name="saved_in_downloads">ダウンロードフォルダに保存されました</string>
<string name="rotate_image_cw">時計回りに回転</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">画像を選択して読み込み</string>
<string name="pick_code_to_scan">スキャンするバーコードを選択</string>
<string name="shortcut_decode">バーコードをスキャン</string>
+6
View File
@@ -15,6 +15,11 @@
<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="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
<string name="colors_black_on_transparent">Black on transparent</string>
<string name="colors_white_on_transparent">White on transparent</string>
<string name="sequence_size">Sequence size</string>
<string name="sequence_index">Sequence index</string>
<string name="sequence_id">Sequence ID</string>
@@ -152,6 +157,7 @@
<string name="export_database">SQLite მონაცემთა ბაზა</string>
<string name="saved_in_downloads">შენახულია გადმოწერებში</string>
<string name="rotate_image_cw">გამოსახულების შემობრუნება საათის ისრის მიხედვით</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">აირჩიეთ ფაილი გამოსახულებით</string>
<string name="pick_code_to_scan">აირჩიეთ შტრიხ-კოდი სკანირებისთვის</string>
<string name="shortcut_decode">შტრიხ-კოდის სკანირება</string>
+6
View File
@@ -15,6 +15,11 @@
<string name="error_correction_level_m" formatted="false">Middelhoog (~15&#37; correction)</string>
<string name="error_correction_level_q" formatted="false">Kwartiel (~25&#37; correction)</string>
<string name="error_correction_level_h" formatted="false">Hoog (~30&#37; correction)</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
<string name="colors_black_on_transparent">Black on transparent</string>
<string name="colors_white_on_transparent">White on transparent</string>
<string name="sequence_size">Sequence size</string>
<string name="sequence_index">Sequence index</string>
<string name="sequence_id">Sequence ID</string>
@@ -152,6 +157,7 @@
<string name="export_database">SQLite database</string>
<string name="saved_in_downloads">Opgeslagen in downloads</string>
<string name="rotate_image_cw">Afbeelding rechtsom draaien</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">Beeldbestand kiezen</string>
<string name="pick_code_to_scan">Kies code om te scannen</string>
<string name="shortcut_decode">Een barcode scannen</string>
+6
View File
@@ -30,6 +30,11 @@
<string name="error_correction_level_m" formatted="false">Średni (~15&#37; korekcji)</string>
<string name="error_correction_level_q" formatted="false">Kwartyl (~25&#37; korekcji)</string>
<string name="error_correction_level_h" formatted="false">Wysoki (~30&#37; korekcji)</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
<string name="colors_black_on_transparent">Black on transparent</string>
<string name="colors_white_on_transparent">White on transparent</string>
<string name="sequence_size">Sequence size</string>
<string name="sequence_index">Sequence index</string>
<string name="sequence_id">Sequence ID</string>
@@ -46,6 +51,7 @@
<string name="sms_error">Nie można wysłać SMS-a</string>
<string name="mail_error">Nie można wysłać e-maila</string>
<string name="rotate_image_cw">Obróć obraz zgodnie z ruchem wskazówek zegara</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="edit_scan">Edytuj etykietę</string>
<string name="enter_name_hint">Nazwa skanu</string>
<string name="camera_error">Nie można uzyskać dostępu do kamery, spróbuj ponownie</string>
@@ -15,6 +15,11 @@
<string name="error_correction_level_m" formatted="false">Médio (~15&#37; correção)</string>
<string name="error_correction_level_q" formatted="false">Quartil (~25&#37; correção)</string>
<string name="error_correction_level_h" formatted="false">Alto (~30&#37; correção)</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
<string name="colors_black_on_transparent">Black on transparent</string>
<string name="colors_white_on_transparent">White on transparent</string>
<string name="sequence_size">Sequence size</string>
<string name="sequence_index">Sequence index</string>
<string name="sequence_id">Sequence ID</string>
@@ -152,6 +157,7 @@
<string name="export_database">Base de dados SQLite</string>
<string name="saved_in_downloads">Salvo em Downloads</string>
<string name="rotate_image_cw">Girar a imagem no sentido horário</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">Escolha imagem</string>
<string name="pick_code_to_scan">Escolha código para digitalizar</string>
<string name="shortcut_decode">Escaneie código</string>
@@ -17,6 +17,11 @@
<string name="error_correction_level_m" formatted="false">Средний (≈15&#37; исправлений)</string>
<string name="error_correction_level_q" formatted="false">Квартиль (≈25&#37; исправлений)</string>
<string name="error_correction_level_h" formatted="false">Высокий (≈30&#37; исправлений)</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
<string name="colors_black_on_transparent">Black on transparent</string>
<string name="colors_white_on_transparent">White on transparent</string>
<string name="sequence_size">Размер последовательности</string>
<string name="sequence_index">Индекс последовательности</string>
<string name="sequence_id">Идентификатор последовательности</string>
@@ -154,6 +159,7 @@
<string name="export_database">База данных SQLite</string>
<string name="saved_in_downloads">Сохранено в загрузках</string>
<string name="rotate_image_cw">Повернуть изображение по часовой стрелке</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">Открыть файл с изображением</string>
<string name="pick_code_to_scan">Выберите штрих-код для сканирования</string>
<string name="shortcut_decode">Сканировать штрих-код</string>
+6
View File
@@ -15,6 +15,11 @@
<string name="error_correction_level_m" formatted="false">Orta (~&#37;15 düzeltim)</string>
<string name="error_correction_level_q" formatted="false">Dörtte Bir (~&#37;25 düzeltim)</string>
<string name="error_correction_level_h" formatted="false">Yüksek (~&#37;30 düzeltim)</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
<string name="colors_black_on_transparent">Black on transparent</string>
<string name="colors_white_on_transparent">White on transparent</string>
<string name="sequence_size">Dizi boyutu</string>
<string name="sequence_index">Dizi indeksi</string>
<string name="sequence_id">Dizi kimliği</string>
@@ -152,6 +157,7 @@
<string name="export_database">SQLite veri tabanı olarak dışa aktar</string>
<string name="saved_in_downloads">İndirilenlere kaydedildi</string>
<string name="rotate_image_cw">Görüntüyü saat yönünde döndür</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">Görüntü dosyası seç</string>
<string name="pick_code_to_scan">Taranacak kod seç</string>
<string name="shortcut_decode">Barkod tara</string>
+6
View File
@@ -16,6 +16,11 @@
<string name="error_correction_level_m" formatted="false">Середній (~15&#37; виправлення)</string>
<string name="error_correction_level_q" formatted="false">Квартиль (~25&#37; виправлення)</string>
<string name="error_correction_level_h" formatted="false">Високий (~30&#37; виправлення)</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
<string name="colors_black_on_transparent">Black on transparent</string>
<string name="colors_white_on_transparent">White on transparent</string>
<string name="sequence_size">Sequence size</string>
<string name="sequence_index">Sequence index</string>
<string name="sequence_id">Sequence ID</string>
@@ -153,6 +158,7 @@
<string name="export_database">Експортувати базу даних SQLite</string>
<string name="saved_in_downloads">Збережено в Завантаженнях</string>
<string name="rotate_image_cw">Повернути зображення за годинниковою стрілкою</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">Вибрати файл зображення</string>
<string name="pick_code_to_scan">Вибрати код для сканування</string>
<string name="shortcut_decode">Сканувати штрих-код</string>
+6
View File
@@ -14,6 +14,11 @@
<string name="error_correction_level_m" formatted="false">Trung bình (sửa ~15&#37;)</string>
<string name="error_correction_level_q" formatted="false">Một phần tư (sửa ~25&#37;)</string>
<string name="error_correction_level_h" formatted="false">Cao (sửa ~30&#37;)</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
<string name="colors_black_on_transparent">Black on transparent</string>
<string name="colors_white_on_transparent">White on transparent</string>
<string name="sequence_size">Sequence size</string>
<string name="sequence_index">Sequence index</string>
<string name="sequence_id">Sequence ID</string>
@@ -151,6 +156,7 @@
<string name="export_database">Cơ sở dữ liệu SQLite</string>
<string name="saved_in_downloads">Lưu vào Downloads</string>
<string name="rotate_image_cw">Quay ảnh theo chiều kim đồng hồ</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">Chọn tệp ảnh</string>
<string name="pick_code_to_scan">Chọn mã để quét</string>
<string name="shortcut_decode">Quét mã vạch</string>
@@ -14,6 +14,11 @@
<string name="error_correction_level_m" formatted="false">Medium (~15&#37; 准确度)</string>
<string name="error_correction_level_q" formatted="false">Quartile (~25&#37; 准确度)</string>
<string name="error_correction_level_h" formatted="false">High (~30&#37; 准确度)</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
<string name="colors_black_on_transparent">Black on transparent</string>
<string name="colors_white_on_transparent">White on transparent</string>
<string name="sequence_size">Sequence size</string>
<string name="sequence_index">Sequence index</string>
<string name="sequence_id">Sequence ID</string>
@@ -151,6 +156,7 @@
<string name="export_database">导出 SQLite 数据库</string>
<string name="saved_in_downloads">已保存到下载目录</string>
<string name="rotate_image_cw">旋转图片</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">选择图片文件</string>
<string name="pick_code_to_scan">选择扫描编码</string>
<string name="shortcut_decode">扫描条码</string>
@@ -14,6 +14,11 @@
<string name="error_correction_level_m" formatted="false">中 (~15&#37; 準確度)</string>
<string name="error_correction_level_q" formatted="false">Quartile (~25&#37; 準確度)</string>
<string name="error_correction_level_h" formatted="false">高 (~30&#37; 準確度)</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
<string name="colors_black_on_transparent">Black on transparent</string>
<string name="colors_white_on_transparent">White on transparent</string>
<string name="sequence_size">Sequence size</string>
<string name="sequence_index">Sequence index</string>
<string name="sequence_id">Sequence ID</string>
@@ -151,6 +156,7 @@
<string name="export_database">SQLite 資料庫</string>
<string name="saved_in_downloads">已儲存到下載目錄</string>
<string name="rotate_image_cw">順時針旋轉圖片</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">選擇圖片檔案</string>
<string name="pick_code_to_scan">選擇要掃描的條碼</string>
<string name="shortcut_decode">掃描條碼</string>
@@ -0,0 +1,8 @@
<resources>
<string-array name="colors">
<item>@string/colors_black_on_white</item>
<item>@string/colors_white_on_black</item>
<item>@string/colors_black_on_transparent</item>
<item>@string/colors_white_on_transparent</item>
</string-array>
</resources>
+6
View File
@@ -15,6 +15,11 @@
<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="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
<string name="colors_black_on_transparent">Black on transparent</string>
<string name="colors_white_on_transparent">White on transparent</string>
<string name="sequence_size">Sequence size</string>
<string name="sequence_index">Sequence index</string>
<string name="sequence_id">Sequence ID</string>
@@ -152,6 +157,7 @@
<string name="export_database">SQLite database</string>
<string name="saved_in_downloads">Saved in downloads</string>
<string name="rotate_image_cw">Rotate image clockwise</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">Pick image file</string>
<string name="pick_code_to_scan">Pick code to scan</string>
<string name="shortcut_decode">Scan a barcode</string>
+2
View File
@@ -27,6 +27,8 @@
<item name="android:maxLines">1</item>
</style>
<style name="FAB" parent="Widget.Design.FloatingActionButton">
<!-- Silence nonsense warning about setting a custom background. -->
<item name="android:background">@null</item>
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_margin">20dp</item>
@@ -0,0 +1,4 @@
* Add an action item to lock/unlock free rotation
* Support setting fore and background colors when creating barcodes
* Fix creating barcodes with UTF-8 content