Compare commits

...
75 Commits
Author SHA1 Message Date
Markus Fisch 3aa2371eeb Advance version number to 1.63.5 2024-03-24 21:15:31 +01:00
solokotandGitHub 88f92943c0 Update Russian translation 2024-03-24 14:53:36 +01:00
Sergiy StuparandGitHub 39710d4ab9 Update Ukrainian translation 2024-03-24 14:53:03 +01:00
Markus Fisch 93f7cd3cb8 Map old ignore setting to new one
For existing installations that changed this value.
2024-03-23 20:21:08 +01:00
Markus Fisch 69baa3b824 Add an option to ignore any duplicates
As requested in issue #439.
2024-03-23 14:20:42 +01:00
Markus Fisch bb05e38278 Update tools version 2024-03-21 21:23:28 +01:00
KamaleiZestriandGitHub 554f5a5e73 Fix failing send due to invalid bluetooth connection
Try reconnect to socket once before failing.
2024-03-21 21:19:51 +01:00
Markus Fisch 2dcf7772f2 Update tools version and gradle wrapper 2024-03-17 13:52:49 +01:00
Markus Fisch 3c7012e3c4 Advance version number to 1.63.4 2024-03-17 13:35:31 +01:00
Markus Fisch 08e11c3c40 Update ZXingCpp to fix support for old devices 2024-03-16 21:38:51 +01:00
Unknownman820andGitHub 31854dab0c Update Chinese translation 2024-03-16 21:38:04 +01:00
Markus Fisch 4f12c3e270 Advance version number to 1.63.3 2024-03-04 21:06:50 +01:00
Markus Fisch 3ec43dabce Update AndroidX SCAN Intent sample 2024-03-03 18:34:42 +01:00
Markus Fisch 0d4f536f71 Fix returning barcode format in return Intent
The class `BarcodeFormat` is not known to callers, of course.
2024-03-03 18:30:55 +01:00
Markus Fisch b064a293fb Add donation options to the README 2024-02-29 20:25:50 +01:00
Markus Fisch d124c29919 Advance version number to 1.63.2 2024-02-19 22:08:22 +01:00
Markus Fisch 2e89f1530a Add DX_FILM_EDGE barcode format
And add it to the selected barcodes so it's immediately
available for existing installations too.
2024-02-17 13:41:49 +01:00
Markus Fisch ef7e2a4b0d Update build tools 2024-02-17 13:40:28 +01:00
Markus Fisch f680533819 Update ZXingCpp for DX_FILM_EDGE format 2024-02-17 13:21:06 +01:00
Oğuz ErsenandGitHub a8c977c40e Update Turkish translation 2024-01-21 17:31:20 +01:00
Markus Fisch 1e89b22953 Update ZXingCpp to latest version
For QRCode: fix crash reported in #700
2024-01-15 20:14:50 +01:00
Markus Fisch 11f028e0f3 Update Kotlin version 2024-01-15 20:13:37 +01:00
Markus Fisch 1f7f4a23b5 Update tools version 2024-01-15 20:11:50 +01:00
Sergiy StuparandGitHub 41581d07ec Update Ukrainian translation 2024-01-14 20:53:17 +01:00
Markus Fisch dc819a6e1a Advance version number to 1.63.1 2024-01-13 13:47:32 +01:00
Markus Fisch 5b51072f1a Include custom label in json/csv exports/shares 2024-01-13 13:29:45 +01:00
solokotandGitHub 1b10e82cb2 Update Russian translation 2024-01-12 08:55:55 +01:00
Markus Fisch eeae1eb0ad Advance version number to 1.63.0 2024-01-11 20:27:27 +01:00
Markus Fisch 21c29ca373 Set sendScanActive to false by default
Was enabled by default because this setting came after `sendScanUrl`
and I didn't want to annoy users using this feature already.

But it's probably too suspicious to have it enabled by default, even
if it does nothing, of course.
2024-01-11 17:10:22 +01:00
Markus Fisch 8bcb72e91b Use getParcelableExtra(String, Class) on Tiramisu+ 2024-01-11 00:23:15 +01:00
Markus Fisch 8f345fbfbe Remove redundant suppress annotation 2024-01-11 00:14:04 +01:00
Markus Fisch 2c88dbca02 Reformat scanWithinBounds()
Apply autoformat.
2024-01-11 00:12:45 +01:00
Markus Fisch bd1c629c85 Reformat imports
Let Android Studio do its thing.
2024-01-11 00:11:48 +01:00
Markus Fisch f89e6612c4 Replace Enum.values() with Enum.entries
Following the recommendation.
2024-01-11 00:09:27 +01:00
Markus Fisch 7a0cd0ce19 Use isNullOrEmpty instead of checking both 2024-01-11 00:08:22 +01:00
Markus Fisch 8544affa1e Edit scan label in DecodeFragment
Which makes this feature more prominent and also easier to access.
2024-01-10 23:56:44 +01:00
Markus Fisch 48d3588341 Add a button to add generated codes to the history
So generated barcodes can be saved, too.
2024-01-10 23:37:51 +01:00
Markus Fisch 783f6e4892 Refactor edit_scan to edit_label
This action is used to edit the (optional) label of a scan.
2024-01-10 23:03:24 +01:00
Markus Fisch 032cd64daf Avoid asking multiple times for camera permission
Otherwise ActivityCompat.requestPermissions() will trigger onResume()
again and again.
2024-01-11 10:59:29 +01:00
Markus Fisch 96626e6b00 Move origin subtraction out of min()
Simplifies the calculation of the width and height of the crop
section.
2024-01-10 22:38:31 +01:00
Markus Fisch 11ae65ec3e Refactor Bitmap.erect to rotate
The original task of this function was to straighten a picture
lying on its side. However, the function is now used for any rotation.
2024-01-10 22:36:02 +01:00
Markus Fisch 91e3acb647 Disable free rotation by default
This is probably too delicate to use, most barcodes are still
recognized when skewed (a little), and it can be quite an expensive
operation to rotate a very big image. So it's better to disable
this feature by default (for new installations).
2024-01-09 20:25:21 +01:00
Markus Fisch 40c2f5947b Crop imported images in background thread
Because rotating and cropping a big photo can take some time.
2024-01-09 20:03:26 +01:00
Markus Fisch 58b9466cfc Fix margin/error correction for recreated codes
The `margin` argument position was incorrectly used for the
error correction level.
2024-01-09 19:28:50 +01:00
Markus Fisch 12210e1768 Update CameraView library 2024-01-09 12:13:12 +01:00
Sergiy StuparandGitHub ad2ac457c9 Update Ukrainian translation 2024-01-09 12:06:05 +01:00
Markus Fisch 634b6e8d2b Limit duration of error beep to 1s
Since `ToneGenerator.TONE_SUP_ERROR` keeps on playing which
is quite annoying.
2024-01-03 19:21:29 +01:00
CertainBotandGitHub 6dd47f4dd0 Update Spanish translation 2023-12-19 22:00:31 +01:00
Markus Fisch 8426f66cfb Fix indent in settings.gradle
Match this with the rest of the project.
2023-12-18 12:27:34 +01:00
Meen BeeseandGitHub 3dfa84a33e Simplification and clean up of Gradle files
* Some linting suggestions by Android Studio
* Move all repository declarations to settings
2023-12-18 09:41:07 +01:00
Markus Fisch 38f658e253 Advance version number to 1.62.3 2023-12-15 12:18:14 +01:00
Markus Fisch 287d99e2b4 Make clicks select list items when in action mode
Avoids having to do long presses for every item you want to add
to the selection.
2023-12-14 22:57:31 +01:00
Markus Fisch 5cfcde9d4a Update pt-br translation
Thanks to m_s_
2023-12-12 23:05:47 +01:00
Markus Fisch b2730259fc Advance version number to 1.62.2 2023-12-12 21:56:37 +01:00
Markus Fisch 61a2d3023c Add rMQR Code on existing installations
So it's working immediately after an update.
2023-12-12 21:50:28 +01:00
CertainBotandGitHub 239ac7bd1a Update Spanish translation
- New strings translated. Typos ammended.
- Términos nuevos traducidos. Corrección de erratas.
2023-12-11 21:58:35 +01:00
Markus Fisch 4048314cf7 Advance version number to 1.62.1 2023-12-11 20:19:18 +01:00
Markus Fisch 3dbd772847 Add rMQR Code to barcode format resources
To make it selectable, too.
2023-12-11 20:12:23 +01:00
Markus Fisch 3a08465c35 Add rMQR Code list of supported codes in README 2023-12-10 18:24:08 +01:00
Markus Fisch 92e3669ee5 Advance version number to 1.62.0 2023-12-10 15:49:33 +01:00
Markus Fisch 8b297f4768 Ignore plurals warning for qr_version_and_modules
Because a QR Code always has more than one module.
2023-12-10 15:45:13 +01:00
Markus Fisch 42b7f1179b Remove incomplete zh-rTW locales translation
Because this got incomplete and so won't work with the values
array anymore.

Also it's probably a really bad idea to translate locales anyway.
If you pick a wrong one by accident, you'll have a hard time
changing it back to something you can understand.
2023-12-10 15:40:37 +01:00
Markus Fisch 9d6854c282 Suppress false-positive warning about TileService
`TileService#startActivityAndCollapse(Intent)` is only ever run
below UpsideDownCake, but Lint doesn't understand this yet.
2023-12-10 15:37:48 +01:00
Markus Fisch d943b7deff Suppress warning about commit()ing prefs
Because `commit()` is intentional where it's used.
2023-12-10 15:36:10 +01:00
Markus Fisch a138da9d9b Update Kotlin version 2023-12-10 15:35:28 +01:00
Markus Fisch 194338a0d2 Remove "many" quantity from French plural
Lint says this isn't relevant to French.
2023-12-10 15:34:27 +01:00
Markus Fisch 7eb8fdcce1 Add Brave search to and de/fa/tr locales
This was missing from the original commit.
2023-12-10 15:33:21 +01:00
Markus Fisch 2bf1796340 Improve naming of shared wrapper files
And add extensions so it's easier to deal with these files
in other contexts.
2023-12-10 15:14:31 +01:00
Markus Fisch cc42015da2 Wipe share file in HistoryFragment too 2023-12-09 22:20:33 +01:00
Markus Fisch 648c39c439 Rename share file to just "contents"
A better fit when sharing the history in this file.
2023-12-09 22:20:00 +01:00
Markus Fisch 8c25b05cda Remove menu group to make actions fold 2023-12-09 22:16:16 +01:00
Markus Fisch 780bebc9d1 Share history as a file
To make sharing the history via Bluetooth more easily, as Android
converts plain text to HTML there.
2023-12-09 22:01:51 +01:00
Markus Fisch bf7eb7efd5 Update tools version and gradle wrapper
And finally add the `compileOptions` block to make Gradle 8
work, because the Google guys are still unable to fix their bugs.
2023-12-09 16:29:48 +01:00
Markus Fisch d00d08bae3 Update to latest ZXingCpp 2023-12-09 15:13:45 +01:00
Markus Fisch 379256a7fe Share selected scans only from history
If there is a selection. Otherwise use the search filter as before.
2023-11-26 19:54:08 +01:00
78 changed files with 1034 additions and 490 deletions
+47
View File
@@ -1,5 +1,52 @@
# Change Log
## 1.63.5
* Add an option to ignore any duplicates
* Fix invalid bluetooth connection
* Update Russian translation
* Update Ukrainian translation
## 1.63.4
* Update Chinese translation
* Improve support for old devices
## 1.63.3
* Fix SCAN Intent
## 1.63.2
* Add DX Film Edge barcode format
* Update Turkish translation
* Update Ukrainian translation
## 1.63.1
* Include scan label in exports/shares
* Update Russian translation
## 1.63.0
* Edit scan label in decoding screen
* Add a button to add generated codes to the history
* Improve scanning from images
* Improve asking for camera permission
* Fix margin for recreated barcodes
* Limit duration of error beep to 1s
* Update Ukrainian translation
* Update Spanish translation
## 1.62.3
* Extend selection with single taps in history listing
* Update Brazilian Portuguese translation
## 1.62.2
* Include rMQR Code for updates
## 1.62.1
* Make rMQR Code selectable
## 1.62.0
* Add support for rMQR (rectangular Micro QR) Code
* Share history as a file
* Only share selected scans from history
## 1.61.2
* Fix quick settings tile for Android 14
* Fix Xiaomi MIUI lockscreen barcode shortcut
+19 -4
View File
@@ -10,6 +10,15 @@ comes in Material Design and can also generate barcodes.
Binary Eye uses the [ZXing-C++][zxing_cpp] ("Zebra Crossing") barcode
scanning library.
If you find this app useful and wish to support its continued development,
you can [buy me a coffee](https://www.buymeacoffee.com/markusfisch) or
send some Bitcoin decimals to `bc1q2guk2rpll587aymrfadkdtpq32448x5khk5j8z`.
<a href="https://www.buymeacoffee.com/markusfisch" target="_blank"><img
src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png"
alt="Buy Me A Coffee"
style="height: 60px !important;width: 217px !important;"/></a>
## Screenshots
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/screencap-scanning.png"
@@ -36,6 +45,7 @@ ZXing can read the following barcode formats:
* [CODE 93][code_93]
* [CODE 128][code_128]
* [DATA MATRIX][data_matrix]
* [DX FILM EDGE][dx_film_edge]
* [EAN 8][ean_8]
* [EAN 13][ean_13]
* [ITF][itf]
@@ -43,6 +53,7 @@ ZXing can read the following barcode formats:
* [PDF417][pdf417]
* [QR CODE][qr_code]
* [Micro QR Code][micro_qr_code]
* [rMQR Code][rmqr_code]
* [RSS 14][rss]
* [RSS EXPANDED][rss]
* [UPC A][upc_a]
@@ -120,10 +131,12 @@ If you're using AndroidX, this would be the new,
[recommended way][intent_result]:
```kotlin
class YourActivity : Activity() {
private val resultLauncher = registerForActivityResult(StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val scan = result.data?.getStringExtra("SCAN_RESULT")
class YourActivity : AppCompatActivity() {
private val resultLauncher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
if (result.resultCode == RESULT_OK) {
val content = result.data?.getStringExtra("SCAN_RESULT")
}
}
@@ -143,6 +156,7 @@ class YourActivity : Activity() {
[code_93]: https://en.wikipedia.org/wiki/Code_93
[code_128]: https://en.wikipedia.org/wiki/Code_128
[data_matrix]: https://en.wikipedia.org/wiki/Data_Matrix
[dx_film_edge]: https://en.wikipedia.org/wiki/DX_encoding
[ean_8]: https://en.wikipedia.org/wiki/EAN-8
[ean_13]: https://en.wikipedia.org/wiki/International_Article_Number
[itf]: https://en.wikipedia.org/wiki/Interleaved_2_of_5
@@ -150,6 +164,7 @@ class YourActivity : Activity() {
[pdf417]: https://en.wikipedia.org/wiki/PDF417
[qr_code]: https://en.wikipedia.org/wiki/QR_code
[micro_qr_code]: https://en.wikipedia.org/wiki/QR_code#Micro_QR_code
[rmqr_code]: https://www.qrcode.com/en/codes/rmqr.html
[rss]: https://en.wikipedia.org/wiki/GS1_DataBar
[upc_a]: https://en.wikipedia.org/wiki/Universal_Product_Code
[upc_e]: https://en.wikipedia.org/wiki/Universal_Product_Code#UPC-E
+24 -11
View File
@@ -2,14 +2,15 @@ apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
android {
namespace 'de.markusfisch.android.binaryeye'
compileSdkVersion sdk_version
defaultConfig {
minSdkVersion 9
targetSdkVersion sdk_version
namespace "de.markusfisch.android.binaryeye"
compileSdk sdk_version
versionCode 123
versionName '1.61.2'
defaultConfig {
minSdk 9
targetSdk sdk_version
versionCode 133
versionName '1.63.5'
}
signingConfigs {
@@ -52,18 +53,30 @@ android {
enableSplit = false
}
}
compileOptions {
// Required for Gradle 8.
sourceCompatibility = 17
targetCompatibility = 17
}
}
dependencies {
testImplementation 'junit:junit:4.13.2'
// Kotlin
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4"
// Support
implementation "com.android.support:appcompat-v7:$support_version"
implementation "com.android.support:design:$support_version"
implementation "com.android.support:preference-v7:$support_version"
implementation "com.android.support:preference-v14:$support_version"
implementation 'com.github.markusfisch:CameraView:1.9.2'
// External
implementation 'com.github.markusfisch:CameraView:1.10.0'
implementation 'com.github.markusfisch:ScalingImageView:1.4.1'
implementation 'com.github.markusfisch:zxing-cpp:v2.1.0.2'
implementation 'com.github.markusfisch:zxing-cpp:v2.2.0.4'
// Testing
testImplementation 'junit:junit:4.13.2'
}
-2
View File
@@ -3,5 +3,3 @@
-dontwarn android.support.v8.**
-keep class android.support.v7.widget.SearchView { *; }
-keep class de.markusfisch.android.zxingcpp.** { *; }
@@ -20,7 +20,12 @@ import android.view.View
import android.widget.SeekBar
import de.markusfisch.android.binaryeye.R
import de.markusfisch.android.binaryeye.adapter.prettifyFormatName
import de.markusfisch.android.binaryeye.app.*
import de.markusfisch.android.binaryeye.app.PERMISSION_CAMERA
import de.markusfisch.android.binaryeye.app.applyLocale
import de.markusfisch.android.binaryeye.app.db
import de.markusfisch.android.binaryeye.app.hasBluetoothPermission
import de.markusfisch.android.binaryeye.app.hasCameraPermission
import de.markusfisch.android.binaryeye.app.prefs
import de.markusfisch.android.binaryeye.bluetooth.sendBluetoothAsync
import de.markusfisch.android.binaryeye.content.copyToClipboard
import de.markusfisch.android.binaryeye.content.execShareIntent
@@ -34,6 +39,7 @@ import de.markusfisch.android.binaryeye.graphics.setFrameToView
import de.markusfisch.android.binaryeye.media.releaseToneGenerators
import de.markusfisch.android.binaryeye.net.sendAsync
import de.markusfisch.android.binaryeye.net.urlEncode
import de.markusfisch.android.binaryeye.preference.Preferences
import de.markusfisch.android.binaryeye.view.errorFeedback
import de.markusfisch.android.binaryeye.view.initSystemBars
import de.markusfisch.android.binaryeye.view.scanFeedback
@@ -42,8 +48,9 @@ import de.markusfisch.android.binaryeye.widget.DetectorView
import de.markusfisch.android.binaryeye.widget.toast
import de.markusfisch.android.cameraview.widget.CameraView
import de.markusfisch.android.zxingcpp.ZxingCpp
import de.markusfisch.android.zxingcpp.ZxingCpp.BarcodeFormat
import de.markusfisch.android.zxingcpp.ZxingCpp.Binarizer
import de.markusfisch.android.zxingcpp.ZxingCpp.DecodeHints
import de.markusfisch.android.zxingcpp.ZxingCpp.ReaderOptions
import de.markusfisch.android.zxingcpp.ZxingCpp.Result
import kotlin.math.max
import kotlin.math.min
@@ -58,7 +65,7 @@ class CameraActivity : AppCompatActivity() {
private lateinit var zoomBar: SeekBar
private lateinit var flashFab: FloatingActionButton
private var formatsToRead = setOf<String>()
private var formatsToRead = setOf<BarcodeFormat>()
private var frameMetrics = FrameMetrics()
private var decoding = true
private var returnResult = false
@@ -69,6 +76,7 @@ class CameraActivity : AppCompatActivity() {
private var restrictFormat: String? = null
private var ignoreNext: String? = null
private var fallbackBuffer: IntArray? = null
private var requestCameraPermission = true
override fun onRequestPermissionsResult(
requestCode: Int,
@@ -151,9 +159,13 @@ class CameraActivity : AppCompatActivity() {
ignoreNext = null
}
setReturnTarget(intent)
if (hasCameraPermission()) {
// Avoid asking multiple times when the user has denied access
// for this session. Otherwise ActivityCompat.requestPermissions()
// will trigger onResume() again and again.
if (hasCameraPermission(requestCameraPermission)) {
openCamera()
}
requestCameraPermission = false
}
private fun updateHints() {
@@ -167,7 +179,7 @@ class CameraActivity : AppCompatActivity() {
} else {
setTitle(R.string.scan_code)
prefs.barcodeFormats
}
}.toFormatSet()
}
private fun setReturnTarget(intent: Intent?) {
@@ -432,7 +444,7 @@ class CameraActivity : AppCompatActivity() {
ignoreNext = null
decoding = true
// These settings can't change while the camera is open.
val decodeHints = DecodeHints(
val options = ReaderOptions(
tryHarder = prefs.tryHarder,
tryRotate = prefs.autoRotate,
tryInvert = true,
@@ -449,7 +461,7 @@ class CameraActivity : AppCompatActivity() {
frameRoi.left, frameRoi.top,
frameRoi.width(), frameRoi.height(),
frameMetrics.orientation,
decodeHints.apply {
options.apply {
// By default, ZXing uses LOCAL_AVERAGE, but
// this does not work well with inverted
// barcodes on low-contrast backgrounds.
@@ -458,7 +470,7 @@ class CameraActivity : AppCompatActivity() {
} else {
Binarizer.GLOBAL_HISTOGRAM
}
formats = formatsToRead.joinToString()
formats = formatsToRead
}
)?.let { results ->
val result = results.first()
@@ -615,8 +627,12 @@ class CameraActivity : AppCompatActivity() {
}
}
if (bulkMode) {
if (prefs.ignoreConsecutiveDuplicates) {
ignoreNext = result.text
when (prefs.ignoreDuplicates()) {
Preferences.Companion.IgnoreDuplicates.Consecutive,
Preferences.Companion.IgnoreDuplicates.Any ->
ignoreNext = result.text
else -> Unit
}
if (prefs.showToastInBulkMode) {
toast(result.text)
@@ -638,6 +654,10 @@ class CameraActivity : AppCompatActivity() {
}
}
fun Set<String>.toFormatSet(): Set<BarcodeFormat> = map {
BarcodeFormat.valueOf(it)
}.toSet()
fun Activity.showResult(
result: Result,
bulkMode: Boolean = false,
@@ -663,7 +683,7 @@ fun Activity.showResult(
if (code == null || code < 200 || code > 299) {
errorFeedback()
}
if (body != null && body.isNotEmpty()) {
if (!body.isNullOrEmpty()) {
toast(body)
} else if (code == null || code > 299) {
toast(R.string.background_request_failed)
@@ -703,7 +723,7 @@ fun Activity.showResult(
private fun getReturnIntent(result: Result) = Intent().apply {
putExtra("SCAN_RESULT", result.text)
putExtra("SCAN_RESULT_FORMAT", result.format)
putExtra("SCAN_RESULT_FORMAT", result.format.toString())
putExtra("SCAN_RESULT_ORIENTATION", result.orientation)
putExtra("SCAN_RESULT_ERROR_CORRECTION_LEVEL", result.ecLevel)
if (result.rawBytes.isNotEmpty()) {
@@ -721,9 +741,7 @@ private fun completeUrl(urlTemplate: String, result: Result) = Uri.parse(
urlTemplate
.replace("{RESULT}", result.text.urlEncode())
.replace("{RESULT_BYTES}", result.rawBytes.toHexString())
.replace(
"{FORMAT}", result.format.urlEncode()
)
.replace("{FORMAT}", result.format.name.urlEncode())
// And support {CODE} from the old ZXing app, too.
.replace("{CODE}", result.text.urlEncode())
)
@@ -89,9 +89,9 @@ class MainActivity : AppCompatActivity() {
intent.getStringExtra(ENCODE)
)
intent.hasExtra(DECODED) -> DecodeFragment.newInstance(
intent.getParcelableExtra(DECODED)!!
)
intent.hasExtra(DECODED) -> intent.getScanExtra(DECODED)?.let {
DecodeFragment.newInstance(it)
} ?: DecodeFragment()
else -> PreferencesFragment()
}
@@ -137,3 +137,12 @@ class MainActivity : AppCompatActivity() {
}
}
}
private fun Intent.getScanExtra(name: String): Scan? = if (
Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU
) {
@Suppress("DEPRECATION")
getParcelableExtra(name)
} else {
getParcelableExtra(name, Scan::class.java)
}
@@ -7,8 +7,8 @@ import android.graphics.Matrix
import android.graphics.Rect
import android.graphics.RectF
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.Parcelable
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.Toolbar
import android.view.Menu
@@ -31,7 +31,7 @@ import de.markusfisch.android.binaryeye.widget.DetectorView
import de.markusfisch.android.binaryeye.widget.toast
import de.markusfisch.android.zxingcpp.ZxingCpp
import de.markusfisch.android.zxingcpp.ZxingCpp.Binarizer
import de.markusfisch.android.zxingcpp.ZxingCpp.DecodeHints
import de.markusfisch.android.zxingcpp.ZxingCpp.ReaderOptions
import de.markusfisch.android.zxingcpp.ZxingCpp.Result
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@@ -46,13 +46,13 @@ class PickActivity : AppCompatActivity() {
private val matrix = Matrix()
private val parentJob = Job()
private val scope = CoroutineScope(Dispatchers.IO + parentJob)
private val decodeHints = DecodeHints(
private val options = ReaderOptions(
tryHarder = true,
tryRotate = true,
tryInvert = true,
tryDownscale = true,
maxNumberOfSymbols = 1,
formats = prefs.barcodeFormats.joinToString()
formats = prefs.barcodeFormats.toFormatSet()
)
private lateinit var cropImageView: CropImageView
@@ -125,35 +125,40 @@ class PickActivity : AppCompatActivity() {
}
private fun scanWithinBounds(bitmap: Bitmap) {
val viewRoi = if (detectorView.roi.width() < 1) {
cropImageView.getBoundsRect()
} else {
detectorView.roi
}
val mappedRect = cropImageView.mappedRect
val cropped = bitmap.crop(
getNormalizedRoi(mappedRect, viewRoi),
cropImageView.imageRotation,
cropImageView.pivotX,
cropImageView.pivotY
) ?: return
val croppedInView = Rect(
max(viewRoi.left, mappedRect.left.roundToInt()),
max(viewRoi.top, mappedRect.top.roundToInt()),
min(viewRoi.right, mappedRect.right.roundToInt()),
min(viewRoi.bottom, mappedRect.bottom.roundToInt())
val viewRoi = Rect(
if (detectorView.roi.width() < 1) {
cropImageView.getBoundsRect()
} else {
detectorView.roi
}
)
matrix.apply {
setScale(
croppedInView.width().toFloat() / cropped.width,
croppedInView.height().toFloat() / cropped.height
)
postTranslate(
croppedInView.left.toFloat(),
croppedInView.top.toFloat()
)
}
val mappedRect = RectF(cropImageView.mappedRect)
val imageRotation = cropImageView.imageRotation
val pivotX = cropImageView.pivotX
val pivotY = cropImageView.pivotY
scope.launch {
val cropped = bitmap.crop(
getNormalizedRoi(mappedRect, viewRoi),
imageRotation,
pivotX,
pivotY
) ?: return@launch
val croppedInView = Rect(
max(viewRoi.left, mappedRect.left.roundToInt()),
max(viewRoi.top, mappedRect.top.roundToInt()),
min(viewRoi.right, mappedRect.right.roundToInt()),
min(viewRoi.bottom, mappedRect.bottom.roundToInt())
)
matrix.apply {
setScale(
croppedInView.width().toFloat() / cropped.width,
croppedInView.height().toFloat() / cropped.height
)
postTranslate(
croppedInView.left.toFloat(),
croppedInView.top.toFloat()
)
}
cropped.decode()?.first()?.let {
withContext(Dispatchers.Main) {
if (isFinishing) {
@@ -179,7 +184,7 @@ class PickActivity : AppCompatActivity() {
0, 0,
width, height,
0,
decodeHints.apply {
options.apply {
binarizer = Binarizer.LOCAL_AVERAGE
}
) ?: ZxingCpp.readBitmap(
@@ -187,7 +192,7 @@ class PickActivity : AppCompatActivity() {
0, 0,
width, height,
0,
decodeHints.apply {
options.apply {
binarizer = Binarizer.GLOBAL_HISTOGRAM
}
)
@@ -240,9 +245,7 @@ class PickActivity : AppCompatActivity() {
}
private fun loadSentImage(intent: Intent): Bitmap? {
val uri = intent.getParcelableExtra<Parcelable>(
Intent.EXTRA_STREAM
) as? Uri ?: return null
val uri = intent.getUriExtra() ?: return null
return contentResolver.loadImageUri(uri)
}
@@ -272,3 +275,12 @@ private fun getNormalizedRoi(imageRect: RectF, roi: Rect): RectF {
(roi.bottom - imageRect.top) / h
)
}
private fun Intent.getUriExtra(): Uri? = if (
Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU
) {
@Suppress("DEPRECATION")
getParcelableExtra(Intent.EXTRA_STREAM)
} else {
getParcelableExtra(Intent.EXTRA_STREAM, Uri::class.java)
}
@@ -2,7 +2,7 @@ package de.markusfisch.android.binaryeye.app
import android.content.Context
import android.os.Build
import java.util.*
import java.util.Locale
fun Context.applyLocale(localeName: String) {
if (localeName.isEmpty()) {
@@ -10,9 +10,9 @@ import android.support.v4.content.ContextCompat
var permissionGrantedCallback: (() -> Any)? = null
const val PERMISSION_CAMERA = 1
fun Activity.hasCameraPermission() = hasPermission(
fun Activity.hasCameraPermission(request: Boolean = true) = hasPermission(
Manifest.permission.CAMERA,
PERMISSION_CAMERA
if (request) PERMISSION_CAMERA else 0
)
const val PERMISSION_WRITE = 2
@@ -53,11 +53,13 @@ private fun Activity.hasPermission(
permission
) != PackageManager.PERMISSION_GRANTED
) {
ActivityCompat.requestPermissions(
this,
arrayOf(permission),
requestCode
)
if (requestCode > 0) {
ActivityCompat.requestPermissions(
this,
arrayOf(permission),
requestCode
)
}
false
} else {
true
@@ -21,10 +21,10 @@ fun Scan.sendBluetoothAsync(
val connected = if (isConnected) {
true
} else {
connect(host)
connect(host,true)
}
val sent = if (connected) {
send(content)
send(content,host,true)
} else {
false
}
@@ -62,7 +62,7 @@ private val uuid = UUID.fromString(
private var isConnected = false
private fun connect(deviceName: String): Boolean = try {
private fun connect(deviceName: String, onceMore: Boolean): Boolean = try {
val device = findByName(deviceName) ?: throw RuntimeException(
"Bluetooth device not found"
)
@@ -72,11 +72,14 @@ private fun connect(deviceName: String): Boolean = try {
isConnected = true
true
} catch (e: Exception) {
close()
if (onceMore)
connect(deviceName, false)
else
close()
false
}
private fun send(message: String): Boolean = try {
private fun send(message: String, host: String, onceMore: Boolean): Boolean = try {
writer?.apply {
write(message)
write("\n")
@@ -85,7 +88,11 @@ private fun send(message: String): Boolean = try {
true
} catch (e: Exception) {
close()
false
if (connect(host, false))
send(message, host, false)
else
false
}
private fun close() {
@@ -61,12 +61,15 @@ fun Context.shareText(text: String, mimeType: String = "text/plain") {
})
}
private const val SHARE_AS_TEXT_FILE_NAME = "barcode_content"
fun Context.wipeShareFile() {
File(externalCacheDir, SHARE_AS_TEXT_FILE_NAME).delete()
private var lastShareFile: File? = null
fun wipeLastShareFile() {
lastShareFile?.let {
it.delete()
lastShareFile = null
}
}
fun <T> Context.shareAsFile(content: T) {
fun <T> Context.shareAsFile(content: T, fileName: String) {
val (bytes, mimeType) = when (content) {
is ByteArray -> Pair(
content,
@@ -82,7 +85,8 @@ fun <T> Context.shareAsFile(content: T) {
"Unsupported content text for shareAsFile()"
)
}
val file = File(externalCacheDir, SHARE_AS_TEXT_FILE_NAME)
wipeLastShareFile()
val file = File(externalCacheDir, fileName)
try {
FileOutputStream(file).use {
it.write(bytes)
@@ -91,6 +95,7 @@ fun <T> Context.shareAsFile(content: T) {
toast(R.string.error_saving_file)
return
}
lastShareFile = file
shareFile(file, mimeType)
}
@@ -32,6 +32,7 @@ private fun exportCsv(
val columns = arrayOf(
Database.SCANS_DATETIME,
Database.SCANS_FORMAT,
Database.SCANS_NAME,
Database.SCANS_CONTENT,
Database.SCANS_ERROR_CORRECTION_LEVEL,
Database.SCANS_VERSION,
@@ -6,6 +6,8 @@ import android.database.Cursor
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
import de.markusfisch.android.binaryeye.app.prefs
import de.markusfisch.android.binaryeye.preference.Preferences
import de.markusfisch.android.zxingcpp.ZxingCpp.BarcodeFormat
class Database {
private lateinit var db: SQLiteDatabase
@@ -69,6 +71,29 @@ class Database {
null
}
fun getScansDetailed(ids: LongArray): Cursor? = db.rawQuery(
"""SELECT
$SCANS_ID,
$SCANS_DATETIME,
$SCANS_NAME,
$SCANS_CONTENT,
$SCANS_RAW,
$SCANS_FORMAT,
$SCANS_ERROR_CORRECTION_LEVEL,
$SCANS_VERSION,
$SCANS_SEQUENCE_SIZE,
$SCANS_SEQUENCE_INDEX,
$SCANS_SEQUENCE_ID,
$SCANS_GTIN_COUNTRY,
$SCANS_GTIN_ADD_ON,
$SCANS_GTIN_PRICE,
$SCANS_GTIN_ISSUE_NUMBER
FROM $SCANS
WHERE $SCANS_ID IN (?)
ORDER BY $SCANS_DATETIME DESC
""".trimMargin(), arrayOf(ids.joinToString(","))
)
fun getScan(id: Long): Scan? = db.rawQuery(
"""SELECT
$SCANS_ID,
@@ -94,7 +119,7 @@ class Database {
Scan(
it.getString(SCANS_CONTENT),
it.getBlob(SCANS_RAW),
it.getString(SCANS_FORMAT),
BarcodeFormat.valueOf(it.getString(SCANS_FORMAT)),
it.getString(SCANS_ERROR_CORRECTION_LEVEL),
it.getString(SCANS_VERSION),
it.getInt(SCANS_SEQUENCE_SIZE),
@@ -105,51 +130,65 @@ class Database {
it.getString(SCANS_GTIN_PRICE),
it.getString(SCANS_GTIN_ISSUE_NUMBER),
it.getString(SCANS_DATETIME),
it.getLong(SCANS_ID)
it.getLong(SCANS_ID),
it.getString(SCANS_NAME),
)
} else {
null
}
}
fun insertScan(scan: Scan): Long = db.insert(
SCANS,
null,
ContentValues().apply {
put(SCANS_DATETIME, scan.dateTime)
put(SCANS_CONTENT, scan.content)
if (scan.raw != null) {
put(SCANS_RAW, scan.raw)
}
put(SCANS_FORMAT, scan.format)
scan.errorCorrectionLevel?.let {
put(SCANS_ERROR_CORRECTION_LEVEL, it)
}
put(SCANS_VERSION, scan.version)
put(SCANS_SEQUENCE_SIZE, scan.sequenceSize)
put(SCANS_SEQUENCE_INDEX, scan.sequenceIndex)
put(SCANS_SEQUENCE_ID, scan.sequenceId)
scan.country?.let { put(SCANS_GTIN_COUNTRY, it) }
scan.addOn?.let { put(SCANS_GTIN_ADD_ON, it) }
scan.price?.let { put(SCANS_GTIN_PRICE, it) }
scan.issueNumber?.let { put(SCANS_GTIN_ISSUE_NUMBER, it) }
if (prefs.ignoreConsecutiveDuplicates) {
fun insertScan(scan: Scan): Long {
when (prefs.ignoreDuplicates()) {
Preferences.Companion.IgnoreDuplicates.Consecutive -> {
val id = getIdOfLastScan(
get(SCANS_CONTENT) as String,
get(SCANS_RAW) as ByteArray?,
scan.content,
scan.raw,
scan.format
)
if (id > 0L) {
return id
}
}
Preferences.Companion.IgnoreDuplicates.Any -> {
val id = getIdOfScanByContent(scan.content, scan.format)
if (id > 0L) {
return id
}
}
else -> Unit
}
)
return db.insert(
SCANS,
null,
ContentValues().apply {
put(SCANS_DATETIME, scan.dateTime)
put(SCANS_CONTENT, scan.content)
if (scan.raw != null) {
put(SCANS_RAW, scan.raw)
}
put(SCANS_FORMAT, scan.format.name)
scan.errorCorrectionLevel?.let {
put(SCANS_ERROR_CORRECTION_LEVEL, it)
}
put(SCANS_VERSION, scan.version)
put(SCANS_SEQUENCE_SIZE, scan.sequenceSize)
put(SCANS_SEQUENCE_INDEX, scan.sequenceIndex)
put(SCANS_SEQUENCE_ID, scan.sequenceId)
scan.country?.let { put(SCANS_GTIN_COUNTRY, it) }
scan.addOn?.let { put(SCANS_GTIN_ADD_ON, it) }
scan.price?.let { put(SCANS_GTIN_PRICE, it) }
scan.issueNumber?.let { put(SCANS_GTIN_ISSUE_NUMBER, it) }
}
)
}
private fun getIdOfLastScan(
content: String,
raw: ByteArray?,
format: String
format: BarcodeFormat
): Long = db.rawQuery(
"""SELECT
$SCANS_ID,
@@ -166,7 +205,7 @@ class Database {
it.getString(SCANS_CONTENT) == content &&
(raw == null || it.getBlob(SCANS_RAW)
?.contentEquals(raw) == true) &&
it.getString(SCANS_FORMAT) == format
it.getString(SCANS_FORMAT) == format.name
) {
it.getLong(SCANS_ID)
} else {
@@ -174,6 +213,25 @@ class Database {
}
} ?: 0L
fun getIdOfScanByContent(
content: String,
format: BarcodeFormat
): Long = db.rawQuery(
"""SELECT
$SCANS_ID
FROM $SCANS
WHERE $SCANS_CONTENT = ?
AND $SCANS_FORMAT = ?
LIMIT 1
""".trimMargin(), arrayOf(content, format.name)
)?.use {
if (it.moveToFirst()) {
it.getLong(SCANS_ID)
} else {
0L
}
} ?: 0L
fun removeScan(id: Long) {
db.delete(SCANS, "$SCANS_ID = ?", arrayOf("$id"))
}
@@ -24,6 +24,7 @@ fun Cursor.exportJson(): String? {
val columns = arrayOf(
Database.SCANS_DATETIME,
Database.SCANS_FORMAT,
Database.SCANS_NAME,
Database.SCANS_CONTENT,
Database.SCANS_ERROR_CORRECTION_LEVEL,
Database.SCANS_VERSION,
@@ -6,14 +6,14 @@ import android.os.Parcel
import android.os.Parcelable
import android.text.format.DateFormat
import de.markusfisch.android.zxingcpp.ZxingCpp
import de.markusfisch.android.zxingcpp.ZxingCpp.BarcodeFormat
import de.markusfisch.android.zxingcpp.ZxingCpp.ContentType
import de.markusfisch.android.zxingcpp.ZxingCpp.Format
import de.markusfisch.android.zxingcpp.ZxingCpp.Result
data class Scan(
val content: String,
val raw: ByteArray?,
val format: String,
val format: BarcodeFormat,
val errorCorrectionLevel: String? = null,
val version: String? = null,
val sequenceSize: Int = -1,
@@ -24,7 +24,8 @@ data class Scan(
val price: String? = null,
val issueNumber: String? = null,
val dateTime: String = getDateTime(),
var id: Long = 0L
var id: Long = 0L,
val label: String? = null
) : Parcelable {
// Needs to be overwritten manually, as ByteArray is an array and
// this isn't handled well by Kotlin.
@@ -78,7 +79,7 @@ data class Scan(
private constructor(parcel: Parcel) : this(
content = parcel.readString() ?: "",
raw = parcel.readSizedByteArray(),
format = parcel.readString() ?: "",
format = BarcodeFormat.valueOf(parcel.readString() ?: ""),
errorCorrectionLevel = parcel.readString(),
version = parcel.readString(),
sequenceSize = parcel.readInt(),
@@ -89,14 +90,15 @@ data class Scan(
price = parcel.readString(),
issueNumber = parcel.readString(),
dateTime = parcel.readString() ?: "",
id = parcel.readLong()
id = parcel.readLong(),
label = parcel.readString()
)
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.apply {
writeString(content)
writeSizedByteArray(raw)
writeString(format)
writeString(format.name)
writeString(errorCorrectionLevel)
writeString(version)
writeInt(sequenceSize)
@@ -108,6 +110,7 @@ data class Scan(
writeString(issueNumber)
writeString(dateTime)
writeLong(id)
writeString(label)
}
}
@@ -146,7 +149,7 @@ fun Result.toScan(): Scan {
}
data class Recreation(
val format: Format,
val format: BarcodeFormat,
val ecLevel: Int,
val size: Int,
val margin: Int
@@ -164,7 +167,7 @@ fun Scan.toRecreation(
size: Int = 128,
margin: Int = -1
) = Recreation(
Format.valueOf(format),
format,
when (errorCorrectionLevel) {
"L" -> 0
"M" -> 4
@@ -10,10 +10,12 @@ import android.support.v4.app.Fragment
import android.view.*
import android.widget.EditText
import de.markusfisch.android.binaryeye.R
import de.markusfisch.android.binaryeye.app.db
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.database.toScan
import de.markusfisch.android.binaryeye.graphics.COLOR_BLACK
import de.markusfisch.android.binaryeye.graphics.COLOR_WHITE
import de.markusfisch.android.binaryeye.io.addSuffixIfNotGiven
@@ -24,7 +26,7 @@ import de.markusfisch.android.binaryeye.view.setPaddingFromWindowInsets
import de.markusfisch.android.binaryeye.widget.ConfinedScalingImageView
import de.markusfisch.android.binaryeye.widget.toast
import de.markusfisch.android.zxingcpp.ZxingCpp
import de.markusfisch.android.zxingcpp.ZxingCpp.Format
import de.markusfisch.android.zxingcpp.ZxingCpp.BarcodeFormat
import kotlinx.coroutines.*
import java.io.File
import java.io.FileOutputStream
@@ -42,6 +44,7 @@ class BarcodeFragment : Fragment() {
private val scope = CoroutineScope(Dispatchers.IO + parentJob)
private lateinit var barcode: Barcode<*>
private lateinit var addToHistoryItem: MenuItem
override fun onCreate(state: Bundle?) {
super.onCreate(state)
@@ -113,7 +116,7 @@ class BarcodeFragment : Fragment() {
getString(CONTENT_TEXT) ?: getByteArray(CONTENT_RAW) ?: throw IllegalArgumentException(
"content cannot be null"
),
Format.valueOf(
BarcodeFormat.valueOf(
getString(FORMAT) ?: throw IllegalArgumentException(
"format cannot be null"
)
@@ -121,7 +124,7 @@ class BarcodeFragment : Fragment() {
getInt(SIZE),
getInt(MARGIN),
getInt(EC_LEVEL),
Colors.values()[getInt(COLORS)]
Colors.entries[getInt(COLORS)]
)
override fun onDestroyView() {
@@ -131,10 +134,18 @@ class BarcodeFragment : Fragment() {
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.fragment_barcode, menu)
addToHistoryItem = menu.findItem(R.id.add_to_history)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.add_to_history -> {
readAndAddToHistory(barcode.bitmap(), barcode.format)
addToHistoryItem.isVisible = false
context.toast(R.string.added_to_history)
true
}
R.id.copy_to_clipboard -> {
context.apply {
copyToClipboard(barcode.text())
@@ -158,7 +169,7 @@ class BarcodeFragment : Fragment() {
title: Int,
action: (FileType) -> Unit
) {
val fileTypes = FileType.values()
val fileTypes = FileType.entries.toTypedArray()
AlertDialog.Builder(this)
.setTitle(title)
.setItems(fileTypes.map { it.name }.toTypedArray()) { _, which ->
@@ -274,7 +285,7 @@ class BarcodeFragment : Fragment() {
fun <T> newInstance(
content: T,
format: Format,
format: BarcodeFormat,
size: Int,
margin: Int,
ecLevel: Int = -1,
@@ -310,7 +321,7 @@ class BarcodeFragment : Fragment() {
private data class Barcode<T>(
val content: T,
val format: Format,
val format: BarcodeFormat,
val size: Int,
val margin: Int,
val ecLevel: Int,
@@ -373,5 +384,31 @@ private fun Bitmap.saveAsPng(outputStream: OutputStream, quality: Int = 90) =
compress(Bitmap.CompressFormat.PNG, quality, outputStream)
private val fileNameCharacters = "[^A-Za-z0-9]".toRegex()
private fun encodeFileName(name: String): String =
fileNameCharacters.replace(name, "_").take(16).trim('_').lowercase(Locale.getDefault())
private fun encodeFileName(name: String): String = fileNameCharacters
.replace(name, "_")
.take(16)
.trim('_')
.lowercase(Locale.getDefault())
private fun readAndAddToHistory(
bitmap: Bitmap,
format: BarcodeFormat
) {
ZxingCpp.readBitmap(
bitmap,
0, 0,
bitmap.width, bitmap.height,
0,
ZxingCpp.ReaderOptions(
tryHarder = true,
tryRotate = true,
tryInvert = true,
tryDownscale = true,
maxNumberOfSymbols = 1,
formats = setOf(format)
)
)?.first {
db.insertScan(it.toScan())
true
}
}
@@ -8,8 +8,17 @@ import android.text.Editable
import android.text.Html
import android.text.TextWatcher
import android.text.method.LinkMovementMethod
import android.view.*
import android.widget.*
import android.view.LayoutInflater
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import android.widget.ImageView
import android.widget.TableLayout
import android.widget.TableRow
import android.widget.TextView
import de.markusfisch.android.binaryeye.R
import de.markusfisch.android.binaryeye.actions.ActionRegistry
import de.markusfisch.android.binaryeye.actions.IAction
@@ -17,12 +26,16 @@ import de.markusfisch.android.binaryeye.actions.wifi.WifiAction
import de.markusfisch.android.binaryeye.actions.wifi.WifiConnector
import de.markusfisch.android.binaryeye.activity.MainActivity
import de.markusfisch.android.binaryeye.adapter.prettifyFormatName
import de.markusfisch.android.binaryeye.app.*
import de.markusfisch.android.binaryeye.app.addFragment
import de.markusfisch.android.binaryeye.app.db
import de.markusfisch.android.binaryeye.app.hasLocationPermission
import de.markusfisch.android.binaryeye.app.hasWritePermission
import de.markusfisch.android.binaryeye.app.prefs
import de.markusfisch.android.binaryeye.content.copyToClipboard
import de.markusfisch.android.binaryeye.content.shareAsFile
import de.markusfisch.android.binaryeye.content.shareText
import de.markusfisch.android.binaryeye.content.toHexString
import de.markusfisch.android.binaryeye.content.wipeShareFile
import de.markusfisch.android.binaryeye.content.wipeLastShareFile
import de.markusfisch.android.binaryeye.database.Recreation
import de.markusfisch.android.binaryeye.database.Scan
import de.markusfisch.android.binaryeye.database.toRecreation
@@ -31,7 +44,11 @@ import de.markusfisch.android.binaryeye.io.toSaveResult
import de.markusfisch.android.binaryeye.io.writeExternalFile
import de.markusfisch.android.binaryeye.view.setPaddingFromWindowInsets
import de.markusfisch.android.binaryeye.widget.toast
import kotlinx.coroutines.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import kotlin.math.roundToInt
class DecodeFragment : Fragment() {
@@ -42,6 +59,7 @@ class DecodeFragment : Fragment() {
private lateinit var hexView: TextView
private lateinit var stampView: TextView
private lateinit var recreationView: ImageView
private lateinit var labelView: EditText
private lateinit var fab: FloatingActionButton
private lateinit var format: String
@@ -58,6 +76,7 @@ class DecodeFragment : Fragment() {
private var originalBytes: ByteArray = ByteArray(0)
private var id = 0L
private var recreation: Recreation? = null
private var label: String? = null
override fun onCreate(state: Bundle?) {
super.onCreate(state)
@@ -90,7 +109,7 @@ class DecodeFragment : Fragment() {
val originalContent = scan.content
isBinary = scan.content.isEmpty()
originalBytes = scan.raw ?: originalContent.toByteArray()
format = scan.format
format = scan.format.name
id = scan.id
contentView = view.findViewById(R.id.content)
@@ -100,6 +119,7 @@ class DecodeFragment : Fragment() {
hexView = view.findViewById(R.id.hex)
stampView = view.findViewById(R.id.stamp)
recreationView = view.findViewById(R.id.recreation)
labelView = view.findViewById(R.id.label)
fab = view.findViewById(R.id.open)
initContentAndFab(originalContent)
@@ -114,6 +134,14 @@ class DecodeFragment : Fragment() {
(200f * dp).roundToInt()
)
}
if (id > 0) {
scan.label?.let {
labelView.setText(it)
label = it
}
} else {
labelView.visibility = View.GONE
}
updateViewsAndFab(originalContent, originalBytes)
@@ -123,10 +151,21 @@ class DecodeFragment : Fragment() {
return view
}
override fun onPause() {
super.onPause()
if (id > 0) {
val newLabel = labelView.text.toString().trim()
if (newLabel != (label ?: "")) {
db.renameScan(id, newLabel)
label = newLabel
}
}
}
override fun onDestroy() {
super.onDestroy()
parentJob.cancel()
activity?.wipeShareFile()
wipeLastShareFile()
}
private fun initContentAndFab(originalContent: String) {
@@ -215,6 +254,7 @@ class DecodeFragment : Fragment() {
content,
r.format,
r.size,
r.margin,
r.ecLevel
)
)
@@ -258,7 +298,7 @@ class DecodeFragment : Fragment() {
R.string.gtin_issue_number to scan.issueNumber,
)
if (!scan.version.isNullOrBlank()) {
val versionString = if (scan.format == "QR_CODE") {
val versionString = if (scan.format.name == "QR_CODE") {
getString(
R.string.qr_version_and_modules,
scan.version,
@@ -335,7 +375,12 @@ class DecodeFragment : Fragment() {
R.id.share_file -> {
context?.apply {
shareAsFile(if (isBinary) originalBytes else content)
val (data, name) = if (isBinary) {
Pair(originalBytes, "barcode_content.bin")
} else {
Pair(content, "barcode_content.txt")
}
shareAsFile(data, name)
maybeBackOrFinish()
}
true
@@ -27,7 +27,7 @@ import de.markusfisch.android.binaryeye.text.unescape
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
import de.markusfisch.android.zxingcpp.ZxingCpp.BarcodeFormat
import java.io.InputStream
import kotlin.math.max
import kotlin.math.min
@@ -47,17 +47,17 @@ class EncodeFragment : Fragment() {
private lateinit var unescapeCheckBox: CheckBox
private val formats = arrayListOf(
Format.AZTEC,
Format.CODABAR,
Format.CODE_39,
Format.CODE_128,
Format.DATA_MATRIX,
Format.EAN_8,
Format.EAN_13,
Format.ITF,
Format.PDF_417,
Format.QR_CODE,
Format.UPC_A
BarcodeFormat.AZTEC,
BarcodeFormat.CODABAR,
BarcodeFormat.CODE_39,
BarcodeFormat.CODE_128,
BarcodeFormat.DATA_MATRIX,
BarcodeFormat.EAN_8,
BarcodeFormat.EAN_13,
BarcodeFormat.ITF,
BarcodeFormat.PDF_417,
BarcodeFormat.QR_CODE,
BarcodeFormat.UPC_A
)
private var minMargin = 0
@@ -124,9 +124,9 @@ class EncodeFragment : Fragment() {
) {
val format = formats[position]
val arrayId = when (format) {
Format.AZTEC -> R.array.aztec_error_correction_levels
Format.QR_CODE -> R.array.qr_error_correction_levels
Format.PDF_417 -> R.array.pdf417_error_correction_levels
BarcodeFormat.AZTEC -> R.array.aztec_error_correction_levels
BarcodeFormat.QR_CODE -> R.array.qr_error_correction_levels
BarcodeFormat.PDF_417 -> R.array.pdf417_error_correction_levels
else -> 0
}
if (arrayId > 0) {
@@ -145,10 +145,10 @@ class EncodeFragment : Fragment() {
colorsLabel, colorsSpinner
)
when (format) {
Format.AZTEC -> setMarginBar(4, 4)
Format.DATA_MATRIX -> setMarginBar(1, 1)
Format.QR_CODE -> setMarginBar(4, 4)
Format.PDF_417 -> setMarginBar(0, 30)
BarcodeFormat.AZTEC -> setMarginBar(4, 4)
BarcodeFormat.DATA_MATRIX -> setMarginBar(1, 1)
BarcodeFormat.QR_CODE -> setMarginBar(4, 4)
BarcodeFormat.PDF_417 -> setMarginBar(0, 30)
else -> false
}.setVisibilityFor(marginLayout)
}
@@ -278,10 +278,10 @@ class EncodeFragment : Fragment() {
format,
getSize(sizeBarView.progress),
when (format) {
Format.AZTEC,
Format.DATA_MATRIX,
Format.QR_CODE,
Format.PDF_417 -> marginBarView.progress
BarcodeFormat.AZTEC,
BarcodeFormat.DATA_MATRIX,
BarcodeFormat.QR_CODE,
BarcodeFormat.PDF_417 -> marginBarView.progress
else -> -1
},
@@ -399,39 +399,39 @@ private fun Boolean.setVisibilityFor(vararg views: View) {
}
}
private fun Format.packEcLevel(packed: Int, level: Int): Int {
private fun BarcodeFormat.packEcLevel(packed: Int, level: Int): Int {
val s = ecLevelShift()
return (level shl s) or (packed and (15 shl s).inv())
}
private fun Format.unpackEcLevel(packed: Int) =
private fun BarcodeFormat.unpackEcLevel(packed: Int) =
(packed shr ecLevelShift()) and 15
private fun Format.ecLevelShift() = when (this) {
Format.AZTEC -> 0
Format.QR_CODE -> 4
Format.PDF_417 -> 8
private fun BarcodeFormat.ecLevelShift() = when (this) {
BarcodeFormat.AZTEC -> 0
BarcodeFormat.QR_CODE -> 4
BarcodeFormat.PDF_417 -> 8
else -> throw IllegalArgumentException("$this does not have error levels")
}
private fun Format.canBeInverted() = when (this) {
Format.AZTEC,
Format.DATA_MATRIX,
Format.QR_CODE -> true
private fun BarcodeFormat.canBeInverted() = when (this) {
BarcodeFormat.AZTEC,
BarcodeFormat.DATA_MATRIX,
BarcodeFormat.QR_CODE -> true
else -> false
}
private fun String.toFormat(default: Format = Format.QR_CODE): Format = try {
Format.valueOf(this)
private fun String.toFormat(default: BarcodeFormat = BarcodeFormat.QR_CODE): BarcodeFormat = try {
BarcodeFormat.valueOf(this)
} catch (_: IllegalArgumentException) {
default
}
private fun Format.getErrorCorrectionLevel(position: Int) = when (this) {
Format.AZTEC -> position
Format.QR_CODE -> (position + 1) * 2
Format.PDF_417 -> position
private fun BarcodeFormat.getErrorCorrectionLevel(position: Int) = when (this) {
BarcodeFormat.AZTEC -> position
BarcodeFormat.QR_CODE -> (position + 1) * 2
BarcodeFormat.PDF_417 -> position
else -> 0
}.coerceIn(0, 8)
@@ -461,4 +461,4 @@ private fun InputStream.readBytesMax(max: Int): ByteArray {
offset += read
}
return result
}
}
@@ -22,7 +22,9 @@ import de.markusfisch.android.binaryeye.R
import de.markusfisch.android.binaryeye.adapter.ScansAdapter
import de.markusfisch.android.binaryeye.app.*
import de.markusfisch.android.binaryeye.content.copyToClipboard
import de.markusfisch.android.binaryeye.content.shareAsFile
import de.markusfisch.android.binaryeye.content.shareText
import de.markusfisch.android.binaryeye.content.wipeLastShareFile
import de.markusfisch.android.binaryeye.database.*
import de.markusfisch.android.binaryeye.io.askForFileName
import de.markusfisch.android.binaryeye.io.toSaveResult
@@ -80,7 +82,7 @@ class HistoryFragment : Fragment() {
true
}
R.id.edit_scan -> {
R.id.edit_label -> {
scansAdapter?.forSelection { id, position ->
ac.askForName(
id,
@@ -117,6 +119,7 @@ class HistoryFragment : Fragment() {
private var filter: String? = null
private var clearListMenuItem: MenuItem? = null
private var exportHistoryMenuItem: MenuItem? = null
private var shareAsFileMenuItem: MenuItem? = null
override fun onCreate(state: Bundle?) {
super.onCreate(state)
@@ -143,8 +146,12 @@ class HistoryFragment : Fragment() {
initHistorySwitch(useHistorySwitch)
listView = view.findViewById(R.id.scans)
listView.setOnItemClickListener { _, _, _, id ->
showScan(id)
listView.setOnItemClickListener { _, v, position, id ->
if (actionMode != null) {
scansAdapter?.select(v, id, position)
} else {
showScan(id)
}
}
listView.setOnItemLongClickListener { _, v, position, id ->
scansAdapter?.select(v, id, position)
@@ -159,7 +166,7 @@ class HistoryFragment : Fragment() {
fab = view.findViewById(R.id.share)
fab.setOnClickListener { v ->
v.context.pickListSeparatorAndShare()
v.context.pickListSeparatorAndShare(false)
}
progressView = view.findViewById(R.id.progress_view)
@@ -176,6 +183,7 @@ class HistoryFragment : Fragment() {
super.onDestroy()
scansAdapter?.changeCursor(null)
parentJob.cancel()
wipeLastShareFile()
}
override fun onPause() {
@@ -185,10 +193,19 @@ class HistoryFragment : Fragment() {
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.fragment_history, menu)
initSearchView(menu.findItem(R.id.search))
menu.setGroupVisible(R.id.scans_available, scansAdapter?.count != 0)
clearListMenuItem = menu.findItem(R.id.clear)
exportHistoryMenuItem = menu.findItem(R.id.export_history)
val searchMenuItem = menu.findItem(R.id.search)
initSearchView(searchMenuItem)
val visible = scansAdapter?.count != 0
searchMenuItem?.isVisible = visible
exportHistoryMenuItem = menu.findItem(R.id.export_history)?.apply {
isVisible = visible
}
shareAsFileMenuItem = menu.findItem(R.id.share_as_file)?.apply {
isVisible = visible
}
clearListMenuItem = menu.findItem(R.id.clear)?.apply {
isVisible = visible
}
}
private fun initSearchView(item: MenuItem?) {
@@ -230,6 +247,11 @@ class HistoryFragment : Fragment() {
true
}
R.id.share_as_file -> {
context.pickListSeparatorAndShare(true)
true
}
else -> super.onOptionsItemSelected(item)
}
}
@@ -283,6 +305,7 @@ class HistoryFragment : Fragment() {
private fun enableMenuItems(enabled: Boolean) {
clearListMenuItem?.isEnabled = enabled
exportHistoryMenuItem?.isEnabled = enabled
shareAsFileMenuItem?.isEnabled = enabled
}
private fun closeActionMode() {
@@ -412,32 +435,44 @@ class HistoryFragment : Fragment() {
}
}
private fun Context.pickListSeparatorAndShare() {
private fun Context.pickListSeparatorAndShare(asFile: Boolean) {
val separators = resources.getStringArray(
R.array.list_separators_values
)
AlertDialog.Builder(this)
.setTitle(R.string.pick_list_separator)
.setItems(R.array.list_separators_names) { _, which ->
shareScans(separators[which])
shareScans(separators[which], asFile)
}
.show()
}
private fun shareScans(format: String) = scope.launch {
private fun shareScans(format: String, asFile: Boolean) = scope.launch {
progressView.useVisibility {
var text: String? = null
db.getScansDetailed(filter)?.use { cursor ->
val selectedIds = scansAdapter?.getSelectedIds()
if (selectedIds?.isNotEmpty() == true) {
db.getScansDetailed(selectedIds.toLongArray())
} else {
db.getScansDetailed(filter)
}?.use { cursor ->
val details = format.split(":")
text = when (details[0]) {
"text" -> cursor.exportText(details[1])
"csv" -> cursor.exportCsv(details[1])
else -> cursor.exportJson()
when (details[0]) {
"text" -> Pair(cursor.exportText(details[1]), "txt")
"csv" -> Pair(cursor.exportCsv(details[1]), "csv")
else -> Pair(cursor.exportJson(), "json")
}
}
text?.let {
withContext(Dispatchers.Main) {
context.shareText(it)
}?.let { (text, ext) ->
text?.let {
withContext(Dispatchers.Main) {
if (asFile) {
context.shareAsFile(
it,
String.format("scans.%s", ext)
)
} else {
context.shareText(it)
}
}
}
}
}
@@ -9,6 +9,7 @@ import de.markusfisch.android.binaryeye.app.prefs
import de.markusfisch.android.binaryeye.database.Scan
import de.markusfisch.android.binaryeye.net.sendAsync
import de.markusfisch.android.binaryeye.preference.UrlPreference
import de.markusfisch.android.zxingcpp.ZxingCpp.BarcodeFormat
class UrlDialogFragment : PreferenceDialogFragmentCompat() {
private var urlView: TextView? = null
@@ -50,7 +51,7 @@ class UrlDialogFragment : PreferenceDialogFragmentCompat() {
Scan(
"test",
null,
"none"
BarcodeFormat.NONE
).sendAsync(url, prefs.sendScanType) { code, body ->
textView.text = when {
code != null -> "$code"
@@ -55,17 +55,17 @@ fun Bitmap.crop(
pivotX: Float,
pivotY: Float
) = try {
val erected = erect(rotation, pivotX, pivotY)
val w = erected.width
val h = erected.height
val b = rotate(rotation, pivotX, pivotY)
val w = b.width
val h = b.height
val x = max(0, (rect.left * w).roundToInt())
val y = max(0, (rect.top * h).roundToInt())
Bitmap.createBitmap(
erected,
b,
x,
y,
min(w - x, (rect.right * w).roundToInt() - x),
min(h - y, (rect.bottom * h).roundToInt() - y)
min(w, (rect.right * w).roundToInt()) - x,
min(h, (rect.bottom * h).roundToInt()) - y
)
} catch (e: OutOfMemoryError) {
null
@@ -73,13 +73,11 @@ fun Bitmap.crop(
null
}
private fun Bitmap.erect(
private fun Bitmap.rotate(
rotation: Float,
pivotX: Float,
pivotY: Float
): Bitmap = if (
rotation % 360f != 0f
) {
): Bitmap = if (rotation % 360f != 0f) {
Bitmap.createBitmap(
this,
0,
@@ -61,7 +61,6 @@ private fun Context.openExternalOutputStream(
fileName: String,
mimeType: String
): OutputStream = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
@Suppress("DEPRECATION")
val file = File(
Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DOWNLOADS
@@ -22,7 +22,7 @@ fun beepError() {
ToneGenerator.MAX_VOLUME
)
errorToneGenerator = tg
tg.startTone(ToneGenerator.TONE_SUP_ERROR)
tg.startTone(ToneGenerator.TONE_SUP_ERROR, 1000)
}
fun releaseToneGenerators() {
@@ -69,7 +69,7 @@ private fun Scan.asJson() = JSONObject().apply {
private fun Scan.getMap(): Map<String, String> = mapOf(
"content" to content,
"raw" to raw?.toHexString(),
"format" to format,
"format" to format.name,
"errorCorrectionLevel" to errorCorrectionLevel,
"version" to version,
"sequenceSize" to sequenceSize.toString(),
@@ -1,34 +1,37 @@
package de.markusfisch.android.binaryeye.preference
import android.annotation.SuppressLint
import android.content.Context
import android.content.SharedPreferences
import android.media.ToneGenerator
import android.os.Build
import android.preference.PreferenceManager
import android.support.annotation.RequiresApi
import de.markusfisch.android.zxingcpp.ZxingCpp.Format
import de.markusfisch.android.zxingcpp.ZxingCpp.BarcodeFormat
class Preferences {
lateinit var preferences: SharedPreferences
var barcodeFormats = setOf(
Format.AZTEC.name,
Format.CODABAR.name,
Format.CODE_39.name,
Format.CODE_93.name,
Format.CODE_128.name,
Format.DATA_BAR.name,
Format.DATA_BAR_EXPANDED.name,
Format.DATA_MATRIX.name,
Format.EAN_8.name,
Format.EAN_13.name,
Format.ITF.name,
Format.MAXICODE.name,
Format.PDF_417.name,
Format.QR_CODE.name,
Format.MICRO_QR_CODE.name,
Format.UPC_A.name,
Format.UPC_E.name,
BarcodeFormat.AZTEC.name,
BarcodeFormat.CODABAR.name,
BarcodeFormat.CODE_39.name,
BarcodeFormat.CODE_93.name,
BarcodeFormat.CODE_128.name,
BarcodeFormat.DATA_BAR.name,
BarcodeFormat.DATA_BAR_EXPANDED.name,
BarcodeFormat.DATA_MATRIX.name,
BarcodeFormat.DX_FILM_EDGE.name,
BarcodeFormat.EAN_8.name,
BarcodeFormat.EAN_13.name,
BarcodeFormat.ITF.name,
BarcodeFormat.MAXICODE.name,
BarcodeFormat.PDF_417.name,
BarcodeFormat.QR_CODE.name,
BarcodeFormat.MICRO_QR_CODE.name,
BarcodeFormat.RMQR_CODE.name,
BarcodeFormat.UPC_A.name,
BarcodeFormat.UPC_E.name,
)
@RequiresApi(Build.VERSION_CODES.HONEYCOMB)
set(value) {
@@ -105,9 +108,9 @@ class Preferences {
apply(USE_HISTORY, value)
field = value
}
var ignoreConsecutiveDuplicates = true
var ignoreDuplicatesName = "ignore_consecutive_duplicates"
set(value) {
apply(IGNORE_CONSECUTIVE_DUPLICATES, value)
apply(IGNORE_DUPLICATES_NAME, value)
field = value
}
var copyImmediately = false
@@ -150,7 +153,7 @@ class Preferences {
apply(OPEN_WITH_URL, value)
field = value
}
var sendScanActive = true
var sendScanActive = false
set(value) {
apply(SEND_SCAN_ACTIVE, value)
field = value
@@ -197,7 +200,7 @@ class Preferences {
apply(LAST_MARGIN, value)
field = value
}
var freeRotation = true
var freeRotation = false
set(value) {
apply(FREE_ROTATION, value)
field = value
@@ -216,9 +219,14 @@ class Preferences {
fun update() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
preferences.getStringSet(BARCODE_FORMATS, barcodeFormats)?.let {
barcodeFormats = it
barcodeFormats = addFormatsOnUpdate(
it,
BarcodeFormat.RMQR_CODE,
BarcodeFormat.DX_FILM_EDGE
)
}
}
cropHandleX = preferences.getInt(CROP_HANDLE_X, cropHandleX)
cropHandleY = preferences.getInt(CROP_HANDLE_Y, cropHandleY)
cropHandleOrientation = preferences.getInt(
@@ -247,10 +255,17 @@ class Preferences {
beepToneName = it
}
useHistory = preferences.getBoolean(USE_HISTORY, useHistory)
ignoreConsecutiveDuplicates = preferences.getBoolean(
IGNORE_CONSECUTIVE_DUPLICATES,
ignoreConsecutiveDuplicates
)
// Map old setting to new one if it wasn't on default value.
val ignoreConsecutiveDuplicates = "ignore_consecutive_duplicates"
if (!preferences.getBoolean(ignoreConsecutiveDuplicates, true)) {
preferences.edit().remove(ignoreConsecutiveDuplicates).apply()
ignoreDuplicatesName = "accept_duplicates"
}
preferences.getString(IGNORE_DUPLICATES_NAME, ignoreDuplicatesName)?.also {
ignoreDuplicatesName = it
}
copyImmediately = preferences.getBoolean(
COPY_IMMEDIATELY,
copyImmediately
@@ -314,6 +329,19 @@ class Preferences {
)
}
private fun addFormatsOnUpdate(
restored: Set<String>,
vararg formats: BarcodeFormat
) = restored.toMutableSet().apply {
for (format in formats) {
val name = "${format.name}_added"
if (!preferences.getBoolean(name, false)) {
preferences.edit().putBoolean(name, true).apply()
add(format.name)
}
}
}
fun beepTone() = when (beepToneName) {
"tone_cdma_confirm" -> ToneGenerator.TONE_CDMA_CONFIRM
"tone_sup_radio_ack" -> ToneGenerator.TONE_SUP_RADIO_ACK
@@ -323,6 +351,12 @@ class Preferences {
else -> ToneGenerator.TONE_PROP_BEEP
}
fun ignoreDuplicates() = when (ignoreDuplicatesName) {
"ignore_consecutive_duplicates" -> IgnoreDuplicates.Consecutive
"ignore_any_duplicates" -> IgnoreDuplicates.Any
else -> IgnoreDuplicates.Never
}
private fun put(label: String, value: Boolean) =
preferences.edit().putBoolean(label, value)
@@ -341,6 +375,7 @@ class Preferences {
preferences.edit().putInt(label, value).apply()
}
@SuppressLint("ApplySharedPref")
private fun commit(label: String, value: String) {
preferences.edit().putString(label, value).commit()
}
@@ -351,6 +386,10 @@ class Preferences {
}
companion object {
enum class IgnoreDuplicates {
Consecutive, Any, Never
}
private const val BARCODE_FORMATS = "formats"
private const val CROP_HANDLE_X = "crop_handle_x"
private const val CROP_HANDLE_Y = "crop_handle_y"
@@ -366,7 +405,7 @@ class Preferences {
private const val BEEP = "beep"
private const val BEEP_TONE_NAME = "beep_tone_name"
private const val USE_HISTORY = "use_history"
private const val IGNORE_CONSECUTIVE_DUPLICATES = "ignore_consecutive_duplicates"
private const val IGNORE_DUPLICATES_NAME = "ignore_duplicates_name"
private const val OPEN_IMMEDIATELY = "open_immediately"
private const val COPY_IMMEDIATELY = "copy_immediately"
private const val SHOW_META_DATA = "show_meta_data"
@@ -1,5 +1,6 @@
package de.markusfisch.android.binaryeye.service
import android.annotation.SuppressLint
import android.app.PendingIntent
import android.content.Intent
import android.os.Build
@@ -13,17 +14,21 @@ class ScanTileService : TileService() {
super.onClick()
val intent = Intent(applicationContext, CameraActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
// TileService#startActivityAndCollapse(Intent) is only ever run
// below UpsideDownCake, but Lint doesn't understand this yet.
@SuppressLint("StartActivityAndCollapseDeprecated")
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
@Suppress("DEPRECATION")
startActivityAndCollapse(intent)
} else {
val pendingIntent = PendingIntent.getActivity(
this,
0,
intent,
PendingIntent.FLAG_IMMUTABLE
startActivityAndCollapse(
PendingIntent.getActivity(
this,
0,
intent,
PendingIntent.FLAG_IMMUTABLE
)
)
startActivityAndCollapse(pendingIntent)
}
}
}
@@ -0,0 +1,3 @@
<vector android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24.0" android:viewportWidth="24.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M14.54,18.49L14.54,16.51L17.51,16.51L17.51,13.54L19.49,13.54L19.49,16.51L22.46,16.51L22.46,18.49L19.508,18.508L19.49,21.46L17.51,21.46L17.492,18.508L14.54,18.49ZM13.35,14.75L11,12.4L11,7L13,7L13,11.6L14.4,13L13.35,14.75ZM3,10L3,4L5,4L5,6.35C5.85,5.283 6.888,4.458 8.113,3.875C9.338,3.292 10.633,3 12,3C14.5,3 16.625,3.875 18.375,5.625C20.125,7.375 21,9.5 21,12L19,12C19,10.05 18.321,8.396 16.963,7.037C15.604,5.679 13.95,5 12,5C10.85,5 9.775,5.267 8.775,5.8C7.775,6.333 6.933,7.067 6.25,8L9,8L9,10L3,10ZM12,21C9.7,21 7.696,20.237 5.988,18.712C4.279,17.187 3.3,15.283 3.05,13L5.1,13C5.333,14.733 6.104,16.167 7.413,17.3C8.721,18.433 10.25,19 12,19C12.183,19 12.354,18.996 12.513,18.987C12.671,18.979 12.833,18.958 13,18.925L13,20.95C12.833,20.967 12.671,20.979 12.513,20.987C12.354,20.996 12.183,21 12,21Z"/>
</vector>
@@ -13,6 +13,17 @@
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<EditText
android:id="@+id/label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:gravity="start|top"
android:hint="@string/label"
android:imeOptions="flagNoExtractUi"
android:importantForAutofill="no"
android:inputType="text"
tools:ignore="UnusedAttribute"/>
<EditText
android:id="@+id/content"
android:layout_width="match_parent"
@@ -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/add_to_history"
android:title="@string/add_to_history"
android:icon="@drawable/ic_action_history_add"
material:showAsAction="ifRoom"/>
<item
android:id="@+id/copy_to_clipboard"
android:title="@string/copy_to_clipboard"
+21 -19
View File
@@ -1,23 +1,25 @@
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:material="http://schemas.android.com/apk/res-auto">
<group android:id="@+id/scans_available"
android:visible="false">
<item
android:id="@+id/search"
android:icon="@drawable/ic_action_search"
android:title="@string/search_scan"
material:actionViewClass="android.support.v7.widget.SearchView"
material:showAsAction="collapseActionView|always"/>
<item
android:id="@+id/export_history"
android:icon="@drawable/ic_action_export"
android:title="@string/export_to_file"
material:showAsAction="ifRoom"/>
<item
android:id="@+id/clear"
android:icon="@drawable/ic_action_remove"
android:title="@string/clear_history"
material:showAsAction="ifRoom"/>
</group>
<item
android:id="@+id/search"
android:icon="@drawable/ic_action_search"
android:title="@string/search_scan"
material:actionViewClass="android.support.v7.widget.SearchView"
material:showAsAction="collapseActionView|always"/>
<item
android:id="@+id/export_history"
android:icon="@drawable/ic_action_export"
android:title="@string/export_to_file"
material:showAsAction="ifRoom"/>
<item
android:id="@+id/share_as_file"
android:icon="@drawable/ic_action_share"
android:title="@string/share_file"
material:showAsAction="ifRoom"/>
<item
android:id="@+id/clear"
android:icon="@drawable/ic_action_remove"
android:title="@string/clear_history"
material:showAsAction="ifRoom"/>
</menu>
@@ -7,8 +7,8 @@
android:icon="@drawable/ic_action_copy"
material:showAsAction="ifRoom"/>
<item
android:id="@+id/edit_scan"
android:title="@string/edit_scan"
android:id="@+id/edit_label"
android:title="@string/edit_label"
android:icon="@drawable/ic_action_edit"
material:showAsAction="ifRoom"/>
<item
+7 -2
View File
@@ -14,6 +14,7 @@
<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="label">Label</string>
<string name="colors">Преден и заден план</string>
<string name="colors_black_on_white">Черно на бяло</string>
<string name="colors_white_on_black">Бяло на черно</string>
@@ -93,8 +94,10 @@
<string name="tone_prop_beep2">Общ двоен звуков сигнал</string>
<string name="use_history">Хронология на сканирането</string>
<string name="use_history_summary">Запазва разпознатите кодове на вашето устройство.</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">Игнориране на дубликатите</string>
<string name="ignore_consecutive_duplicates_summary">Не запазва последователни дубликати в хронологията на сканирането.</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">Отваряй внезапно</string>
<string name="open_immediately_summary">Пропуска проверката и внезапно отваря съдържанието. Може да отвори вредно съдържание, ако е активирано.</string>
<string name="copy_immediately">Поставяй в клипборда</string>
@@ -138,7 +141,7 @@
<string name="really_remove_selected_scans">Наистина ли искате да премахнете избраните сканирания?</string>
<string name="clear_history">Изчистване на историята</string>
<string name="copy_scan">Сопиране на сканирането</string>
<string name="edit_scan">Редактиране на етикет</string>
<string name="edit_label">Редактиране на етикет</string>
<string name="remove_scan">Премахване на сканиране</string>
<string name="enter_name">Въведете име, за да опишете сканирането</string>
<string name="enter_name_hint">Име на сканирането</string>
@@ -166,6 +169,8 @@
<string name="otpauth_add">Добави 2FA</string>
<string name="search_web">Търси в мрежата</string>
<string name="search_scan">Търсещо сканиране</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">Извеждане в файл</string>
<string name="export_as">Извеждане като?</string>
<string name="export_csv_comma">CSV файл със запетаи</string>
+7 -2
View File
@@ -14,6 +14,7 @@
<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="label">Label</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>
@@ -93,8 +94,10 @@
<string name="tone_prop_beep2">General double beep</string>
<string name="use_history">ইতিহাস সংরক্ষণ করো।</string>
<string name="use_history_summary">সনাক্তকৃত সংকেত যন্ত্রে সংরক্ষণ করো।</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">দ্বিত্ব উপেক্ষা করো</string>
<string name="ignore_consecutive_duplicates_summary">দুইটা ইতিহাস সংরক্ষণ করবে না।</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">সাথে সাথে খুলো</string>
<string name="open_immediately_summary">না দেখে সাথে সাথে খুলো। সক্রিয় থাকলে ক্ষতিকারক তথ্য খুলতে পারে।</string>
<string name="copy_immediately">ক্লিপবোর্ডে রাখো</string>
@@ -138,7 +141,7 @@
<string name="really_remove_selected_scans">আসলেই নির্বাচিত সব মুছবে?</string>
<string name="clear_history">ইতিহাস মুছো</string>
<string name="copy_scan">পাঠোদ্ধার অনুলিপি করো</string>
<string name="edit_scan">চিহ্ন সম্পাদনা করো</string>
<string name="edit_label">চিহ্ন সম্পাদনা করো</string>
<string name="remove_scan">পাঠোদ্ধার মুছো</string>
<string name="enter_name">পাঠোদ্ধার ব্যাখ্যা করতে একটা নাম দাও</string>
<string name="enter_name_hint">পাঠোদ্ধারের নাম</string>
@@ -166,6 +169,8 @@
<string name="otpauth_add">২এফএ যোগ করো</string>
<string name="search_web">ওয়েবে খুঁজো</string>
<string name="search_scan">আগেরগুলোতে খুঁজো</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">নথিতে রপ্তানি করো</string>
<string name="export_as">রপ্তানির ধরণ?</string>
<string name="export_csv_comma">কমাসহ সিএসভি(.csv) নথি</string>
+7 -2
View File
@@ -16,6 +16,7 @@
<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="label">Label</string>
<string name="colors">Popředí a pozadí</string>
<string name="colors_black_on_white">Černá na bílé</string>
<string name="colors_white_on_black">Bílá na černé</string>
@@ -95,8 +96,10 @@
<string name="tone_prop_beep2">Dvojité obecné pípnutí</string>
<string name="use_history">Ukládat historii skenování</string>
<string name="use_history_summary">Rozpoznané kódy se uloží do zařízení.</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">Ignorovat duplikáty</string>
<string name="ignore_consecutive_duplicates_summary">Další skeny stejného kódu se nebudou ukládat.</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">Otevírat okamžitě</string>
<string name="open_immediately_summary">Přeskočí kontrolu a otevře obsah okamžitě. Může otevřít škodlivý obsah.</string>
<string name="copy_immediately">Vložit do schránky</string>
@@ -140,7 +143,7 @@
<string name="really_remove_selected_scans">Opravdu odstranit zvolené skeny?</string>
<string name="clear_history">Vymazat historii</string>
<string name="copy_scan">Zkopírovat sken</string>
<string name="edit_scan">Upravit popisek</string>
<string name="edit_label">Upravit popisek</string>
<string name="remove_scan">Odstranit sken</string>
<string name="enter_name">Napište název popisující sken</string>
<string name="enter_name_hint">Název skenu</string>
@@ -168,6 +171,8 @@
<string name="otpauth_add">Přidat 2FA</string>
<string name="search_web">Vyhledat na webu</string>
<string name="search_scan">Vyhledat sken</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">Exportovat do souboru</string>
<string name="export_as">Exportovat jako</string>
<string name="export_csv_comma">CSV oddělené čárkami</string>
+7 -2
View File
@@ -14,6 +14,7 @@
<string name="error_correction_level_m" formatted="false">Medium (~15&#37; korrigering)</string>
<string name="error_correction_level_q" formatted="false">Kvartil (~25&#37; korrigering)</string>
<string name="error_correction_level_h" formatted="false">Høj (~30&#37; korrigering)</string>
<string name="label">Label</string>
<string name="colors">For- og baggrund</string>
<string name="colors_black_on_white">Sort på hvidt</string>
<string name="colors_white_on_black">Hvid på sort</string>
@@ -93,8 +94,10 @@
<string name="tone_prop_beep2">Generelt dobbelt bip</string>
<string name="use_history">Gem scanningshistorik</string>
<string name="use_history_summary">Gem genkendte koder på din enhed.</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">Ignorer dubletter</string>
<string name="ignore_consecutive_duplicates_summary">Gem ikke fortløbende dubletter i scanningshistorikken.</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">Åbn straks</string>
<string name="open_immediately_summary">Spring inspektion over og åbn indholdet med det samme. Kan åbne skadeligt indhold, hvis det er aktiveret.</string>
<string name="copy_immediately">Læg i udklipsholderen</string>
@@ -138,7 +141,7 @@
<string name="really_remove_selected_scans">Vil du virkelig fjerne valgte scanninger?</string>
<string name="clear_history">Ryd historik</string>
<string name="copy_scan">Kopier scanning</string>
<string name="edit_scan">Rediger etiket</string>
<string name="edit_label">Rediger etiket</string>
<string name="remove_scan">Fjern scanning</string>
<string name="enter_name">Indtast et navn for at beskrive scanningen</string>
<string name="enter_name_hint">Navn på scanningen</string>
@@ -166,6 +169,8 @@
<string name="otpauth_add">Tilføj 2FA</string>
<string name="search_web">Søg på nettet</string>
<string name="search_scan">Søg scanning</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">Eksporter til fil</string>
<string name="export_as">Eksporter som?</string>
<string name="export_csv_comma">CSV-fil med kommaer</string>
@@ -2,6 +2,7 @@
<string-array name="search_engines_names">
<item>@string/always_ask</item>
<item>Google</item>
<item>Brave Search</item>
<item>DuckDuckGo</item>
<item>Qwant</item>
<item>Bing</item>
@@ -16,6 +17,7 @@
<string-array name="search_engines_values">
<item></item>
<item>https://www.google.de/search?q=</item>
<item>https://search.brave.com/search?q=</item>
<item>https://duckduckgo.com/?q=</item>
<item>https://www.qwant.com/?q=</item>
<item>https://bing.com/?q=</item>
+8 -3
View File
@@ -14,6 +14,7 @@
<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="label">Bezeichnung</string>
<string name="colors">Vor und Hintergrund</string>
<string name="colors_black_on_white">Schwarz auf Weiß</string>
<string name="colors_white_on_black">Weiß auf Schwarz</string>
@@ -93,8 +94,10 @@
<string name="tone_prop_beep2">General double beep</string>
<string name="use_history">Codes speichern</string>
<string name="use_history_summary">Eingelesene Barcodes auf dem Gerät speichern.</string>
<string name="ignore_consecutive_duplicates">Duplikate ignorieren</string>
<string name="ignore_consecutive_duplicates_summary">Aufeinanderfolgende Duplikate werden nicht in der Scan-Historie gespeichert.</string>
<string name="ignore_duplicates">Ignoriere Duplikate</string>
<string name="ignore_consecutive_duplicates">Aufeinanderfolgende Duplikate</string>
<string name="ignore_any_duplicates">Jedes Duplicat</string>
<string name="accept_duplicates">Akzeptiere Duplikate</string>
<string name="open_immediately">Inhalte sofort öffnen</string>
<string name="open_immediately_summary">Inspektion überspringen und Inhalt sofort öffnen. Kann schädliche Inhalte öffnen, wenn aktiviert.</string>
<string name="copy_immediately">Automatisch in Zwischenablage</string>
@@ -138,7 +141,7 @@
<string name="really_remove_selected_scans">Alle ausgewählten Codes entfernen?</string>
<string name="clear_history">Gespeicherte Codes löschen</string>
<string name="copy_scan">Code kopieren</string>
<string name="edit_scan">Bezeichnung ändern</string>
<string name="edit_label">Bezeichnung ändern</string>
<string name="remove_scan">Code löschen</string>
<string name="enter_name">Geben Sie eine Bezeichnung für den Code ein</string>
<string name="enter_name_hint">Bezeichung des Codes</string>
@@ -166,6 +169,8 @@
<string name="otpauth_add">2FA hinzufügen</string>
<string name="search_web">Suche im Internet</string>
<string name="search_scan">Code suchen</string>
<string name="add_to_history">Zu gespeicherten Codes hinzufügen</string>
<string name="added_to_history">Zu den gespeicherten Codes hinzugefügt</string>
<string name="export_to_file">In Datei exportieren</string>
<string name="export_as">Exportieren als?</string>
<string name="export_csv_comma">CSV Datei mit Kommas</string>
+77 -72
View File
@@ -1,7 +1,7 @@
<resources>
<string name="camera_error">No se puede acceder a la cámara, por favor, inténtelo de nuevo</string>
<string name="scan_code">Escanear código de barras</string>
<string name="compose_barcode">Componer código de barras</string>
<string name="scan_code">Escanear código</string>
<string name="compose_barcode">Componer código</string>
<string name="decode_barcode">Decodificar código de barras</string>
<string name="content">Contenido</string>
<string name="binary_data">(datos binarios)</string>
@@ -14,24 +14,25 @@
<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>
<string name="label">Label</string>
<string name="colors">Color frontal y fondo</string>
<string name="colors_black_on_white">Negro sobre blanco</string>
<string name="colors_white_on_black">Blanco sobre negro</string>
<string name="colors_black_on_transparent">Negro sobre transparente</string>
<string name="colors_white_on_transparent">Blanco sobre transparente</string>
<string name="sequence_size">Tamaño secuencia</string>
<string name="sequence_index">Indice secuencia</string>
<string name="sequence_id">ID secuencia</string>
<string name="gtin_issue_number">Número de emisión</string>
<string name="gtin_country">Posible país de fabricación</string>
<string name="gtin_price">Precio sugerido</string>
<string name="gtin_add_on">Extensión UPC EAN</string>
<string name="barcode_version_number">Version</string>
<string name="qr_version_and_modules">%1$s (%2$d modules)</string>
<string name="qr_version_and_modules">%1$s (%2$d modulos)</string>
<string name="toggle_flash">Activar el flash</string>
<string name="error_flash">Error toggling flash</string>
<string name="error_flash">Error activando flash</string>
<string name="share">Compartir</string>
<string name="share_file">Share as file</string>
<string name="share_file">Compartir como archivo</string>
<string name="share_as">¿Compartir como?</string>
<string name="copy_to_clipboard">Copiar al portapapeles</string>
<string name="copied_to_clipboard">Copiado al portapapeles</string>
@@ -39,20 +40,20 @@
<string name="copied_password_to_clipboard">Contraseña copiada al portapapeles</string>
<string name="open_url">Abrir URL</string>
<string name="cannot_resolve_action">Ninguna aplicación puede abrir eso</string>
<string name="pick_search_engine">Elija un motor de búsqueda</string>
<string name="pick_search_engine">Seleccionar motor de búsqueda</string>
<string name="format">Formato</string>
<string name="size_width_by_height">Tamaño en píxeles: %1$d×%2$d</string>
<string name="margin_size">Margin in pixels: %1$d</string>
<string name="margin_size">Margen en pixeles: %1$d</string>
<string name="input_content_here">Introduzca el contenido aquí</string>
<string name="unescape">Expand escape sequences</string>
<string name="unescape">Expandir secuencia de escape</string>
<string name="encode">CODIFICAR</string>
<string name="error_no_content">Contenido no disponible</string>
<string name="error_encoding_barcode">No se pudo generar el código de barras</string>
<string name="view_barcode">Ver código de barras</string>
<string name="info">Información</string>
<string name="switch_camera">Cambiar cámara</string>
<string name="bulk_mode">Escanear constantemente</string>
<string name="bulk_mode_summary">Siempre iniciar escaneando constantemente</string>
<string name="bulk_mode">Escaneo continuo</string>
<string name="bulk_mode_summary">Iniciar siempre en modo de escaneo contínuo</string>
<string name="bulk_mode_delay">Demora entre escaneos continuos</string>
<string name="restrict_format">Restringir formato</string>
<string name="remove_restriction">Eliminar restricción</string>
@@ -69,55 +70,57 @@
<string name="locale_category">Idioma</string>
<string name="custom_locale">Idioma personalizado</string>
<string name="follow_system_settings">Seguir los ajustes del sistema</string>
<string name="show_crop_handle">Mostrar el delimitador de recorte</string>
<string name="show_crop_handle_summary">Restringir el escaneo a una región personalizable.</string>
<string name="show_crop_handle">Mostrar delimitador de recorte</string>
<string name="show_crop_handle_summary">Permite personalizar la región a escanear.</string>
<string name="barcode_formats">Formatos de códigos de barras</string>
<string name="zoom_by_swiping">Deslice hacia arriba/abajo para ampliar</string>
<string name="zoom_by_swiping_summary">Deslice su dedo hacia arriba o abajo en la pantalla para controlar el aumento de la cámara.</string>
<string name="auto_rotate">Reconocer los códigos de barras 1D verticalmente</string>
<string name="auto_rotate_summary">Rotar automáticamente el marco de la cámara para reconocer los códigos de barras 1D verticales. Dependiendo del dispositivo, esto puede afectar al rendimiento.</string>
<string name="zoom_by_swiping">Ampliar deslizando arriba/abajo</string>
<string name="zoom_by_swiping_summary">Deslice el dedo hacia arriba o abajo sobre la pantalla para controlar el zoom de la cámara.</string>
<string name="auto_rotate">Reconocer códigos 1D verticales</string>
<string name="auto_rotate_summary">Rota automáticamente el marco de la cámara para reconocer los códigos de barras 1D verticales. Dependiendo del dispositivo, podría afectar al rendimiento.</string>
<string name="try_harder">Optimizar la precisión del lector</string>
<string name="try_harder_summary">Active esta opción para códigos muy difíciles de leer. Esto afectará al rendimiento.</string>
<string name="show_toast_in_bulk_mode">Mostrar datos en el modo constante</string>
<string name="show_toast_in_bulk_mode_summary">Mostrar brevemente los datos escaneados al escanear constantemente. </string>
<string name="vibrate">Vibrar al detectar</string>
<string name="vibrate_summary">Active esta opción si desea que su dispositivo vibre cuando se reconozca un código.</string>
<string name="beep">Beep on detection</string>
<string name="beep_summary">Enable this if you want your device to beep when a code is recognized.</string>
<string name="beep_tone">Beep tone</string>
<string name="tone_cdma_confirm">CDMA confirm</string>
<string name="tone_sup_confirm">Call supervisory confirm</string>
<string name="tone_sup_radio_ack">Call supervisory radio path acknowledgment</string>
<string name="tone_prop_ack">Positive acknowledgment</string>
<string name="tone_prop_beep">General beep</string>
<string name="tone_prop_beep2">General double beep</string>
<string name="vibrate">Vibración al detectar</string>
<string name="vibrate_summary">El dispositivo vibra cuando se reconoce un código.</string>
<string name="beep">Sonido al detectar</string>
<string name="beep_summary">El dispositivo emite un sonido cuando se reconoce un código.</string>
<string name="beep_tone">Sonido</string>
<string name="tone_cdma_confirm">Confirmar CDMA</string>
<string name="tone_sup_confirm">Confirmar llamada de supervisión</string>
<string name="tone_sup_radio_ack">Reconocer ruta de radio de llamada de supervisión</string>
<string name="tone_prop_ack">Reconocimiento positivo</string>
<string name="tone_prop_beep">Sonido general</string>
<string name="tone_prop_beep2">Sonido doble general</string>
<string name="use_history">Guardar historial de escaneo</string>
<string name="use_history_summary">Guardar códigos reconocidos en su dispositivo.</string>
<string name="use_history_summary">Guarda los códigos reconocidos en su dispositivo.</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">Ignorar duplicados</string>
<string name="ignore_consecutive_duplicates_summary">No guarde duplicados consecutivos en el historial de escaneo.</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">Abrir inmediatamente</string>
<string name="open_immediately_summary">Omite la inspección y abre el contenido inmediatamente. Puede abrir contenido dañino si está activado.</string>
<string name="copy_immediately">Poner en el portapapeles</string>
<string name="copy_immediately_summary">Copiar contenido al portapapeles automáticamente. Ten en cuenta que otras aplicaciones pueden husmear en tu portapapeles en segundo plano.</string>
<string name="open_immediately_summary">Omite la inspección y abre el contenido inmediatamente. Podría abrir contenido dañino si está activado.</string>
<string name="copy_immediately">Copiar en el portapapeles</string>
<string name="copy_immediately_summary">Copia automáticamente el contenido al portapapeles. Ten en cuenta que otras aplicaciones pueden husmear en tu portapapeles en segundo plano.</string>
<string name="show_meta_data">Mostrar metadatos</string>
<string name="show_meta_data_summary">Mostrar datos adicionales del código escaneado.</string>
<string name="show_hex_dump">Mostrar dump hexadecimal</string>
<string name="show_hex_dump_summary">Mostrar un dump hexadecimal del contenido escaneado.</string>
<string name="show_recreation">Show recreated barcode</string>
<string name="show_recreation_summary">Recreate and show barcode from read content if possible.</string>
<string name="close_automatically">Retroceder luego de Copiar/Compartir</string>
<string name="close_automatically_summary">Regresar automáticamente a la pantalla de escaneo luego de copiar o compartir el contenido leído.</string>
<string name="show_meta_data_summary">Muestra datos adicionales del código escaneado.</string>
<string name="show_hex_dump">Mostrar volcado hexadecimal</string>
<string name="show_hex_dump_summary">Muestra un volcado hexadecimal del contenido escaneado.</string>
<string name="show_recreation">Mostrar reconstrucción del código</string>
<string name="show_recreation_summary">Reconstruye y muestra el código de barras desde el contenido leído si es posible.</string>
<string name="close_automatically">Retroceder tras Copiar/Compartir</string>
<string name="close_automatically_summary">Retrocede automáticamente a la pantalla de escaneo después de copiar o compartir el contenido leído.</string>
<string name="default_search_engine">Abrir datos desconocidos en</string>
<string name="always_ask">Preguntar siempre</string>
<string name="open_with_url">Abrir datos desconocidos con la URL</string>
<string name="clear_network_suggestions">Borrar las sugerencias de red</string>
<string name="clear_network_suggestions_summary">Elimina todas las sugerencias de red previamente proporcionadas por esta aplicación.</string>
<string name="open_with_url">Abrir datos desconocidos en la URL</string>
<string name="clear_network_suggestions">Eliminar sugerencias de red</string>
<string name="clear_network_suggestions_summary">Elimina todas las sugerencias de red proporcionadas por esta aplicación.</string>
<string name="really_remove_all_networks">¿Realmente eliminar todas las redes?</string>
<string name="clear_network_suggestions_success">Sugerencias de red eliminadas</string>
<string name="clear_network_suggestions_nothing_to_remove">Nada que eliminar</string>
<string name="send_category">Reenvío</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_active">Enviar escaneos</string>
<string name="send_scan_active_summary">Habilita el envío de escaneos a una URL</string>
<string name="send_scan_url">Enviar todo escaneo a la URL</string>
<string name="send_scan_type">Tipo de solicitud para cada escaneo</string>
<string name="send_type_get_add_content">GET y solo añadir contenido</string>
@@ -126,20 +129,20 @@
<string name="send_type_post_json">POST application/json</string>
<string name="send_type_external_browser">Abrir en el navegador</string>
<string name="test_url">URL de prueba</string>
<string name="send_scan_bluetooth">Forward scans with Bluetooth</string>
<string name="send_scan_bluetooth_summary">Enable to forwards scans to a given Bluetooth host.</string>
<string name="send_scan_bluetooth">Enviar escaneos con Bluetooth</string>
<string name="send_scan_bluetooth_summary">Habilita el envío de escaneos a un host Bluetooth.</string>
<string name="send_scan_bluetooth_host">Host</string>
<string name="no_bluetooth_hosts_paired">No Hosts Paired</string>
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
<string name="bluetooth_send_success">Successful bluetooth send.</string>
<string name="really_remove_scan">¿Realmente desea borrar el escaneo seleccionado?</string>
<string name="really_remove_all_scans">¿Realmente desea borrar todo lo escaneado?</string>
<string name="really_remove_selected_scans">¿Realmente desea borrar los escaneos seleccionados?</string>
<string name="clear_history">Borrar el historial</string>
<string name="no_bluetooth_hosts_paired">Ningún host emparejado</string>
<string name="bluetooth_connect_fail">No se pudo conectar a un dispositivo bluetooth.</string>
<string name="bluetooth_send_fail">No se pudo enviar a un dispositivo bluetooth.</string>
<string name="bluetooth_send_success">Envío bluetooth completado.</string>
<string name="really_remove_scan">¿Eliminar el escaneo seleccionado?</string>
<string name="really_remove_all_scans">¿Eliminar todos los escaneos?</string>
<string name="really_remove_selected_scans">¿Eliminar los escaneos seleccionados?</string>
<string name="clear_history">Eliminar el historial</string>
<string name="copy_scan">Copiar escaneo</string>
<string name="edit_scan">Editar etiqueta</string>
<string name="remove_scan">Borrar escaneo</string>
<string name="edit_label">Editar etiqueta</string>
<string name="remove_scan">Eliminar escaneo</string>
<string name="enter_name">Introduzca un nombre para describir el escaneo</string>
<string name="enter_name_hint">Nombre del escaneo</string>
<string name="no_barcode_found">No se encontró ningún código de barras</string>
@@ -154,7 +157,7 @@
<string name="wifi_config_failed">No se pudo configurar el Wifi</string>
<string name="wifi_added">Wifi añadido</string>
<string name="sms_send">Enviar SMS</string>
<string name="sms_error">No se puedo enviar SMS</string>
<string name="sms_error">No se pudo enviar SMS</string>
<string name="tel_dial">Marcar número</string>
<string name="tel_error">No se pudo marcar el número</string>
<string name="mail_send">Enviar correo</string>
@@ -166,6 +169,8 @@
<string name="otpauth_add">Añadir 2FA</string>
<string name="search_web">Buscar en la web</string>
<string name="search_scan">Buscar escaneo</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">Exportar a archivo</string>
<string name="export_as">¿Exportar como?</string>
<string name="export_csv_comma">Archivo CSV con comas</string>
@@ -174,16 +179,16 @@
<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">Pick a file</string>
<string name="toggle_free_rotation">Activar rotación libre</string>
<string name="pick_file">Seleccionar archivo</string>
<string name="pick_image_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>
<string name="shortcut_encode">Crear un código</string>
<string name="shortcut_preferences">Ajustes</string>
<string name="background_request_failed">Solicitud de fondo fallida</string>
<string name="entry_type">Type</string>
<string name="wifi_network">Red wi-fi</string>
<string name="entry_type">Tipo</string>
<string name="wifi_network">Red WiFi</string>
<string name="wifi_ssid">Nombre</string>
<string name="wifi_type">Tipo de autenticación</string>
<string name="wifi_password">Contraseña</string>
@@ -191,7 +196,7 @@
<string name="wifi_eap">Método EAP</string>
<string name="wifi_anonymous_identity">Identidad anónima</string>
<string name="wifi_identity">Identidad</string>
<string name="wifi_phase2">Phase 2 method</string>
<string name="network_suggestions">Network suggestions</string>
<string name="remove_suggestion">Remove suggestion</string>
<string name="wifi_phase2">Método Phase 2</string>
<string name="network_suggestions">Sugerencias de red</string>
<string name="remove_suggestion">Eliminar sugerencia</string>
</resources>
@@ -2,6 +2,7 @@
<string-array name="search_engines_names">
<item>@string/always_ask</item>
<item>گوگل</item>
<item>Brave Search</item>
<item>داک‌داک‌گو</item>
<item>Qwant</item>
<item>بینگ</item>
@@ -16,6 +17,7 @@
<string-array name="search_engines_values">
<item></item>
<item>https://www.google.com/search?q=</item>
<item>https://search.brave.com/search?q=</item>
<item>https://duckduckgo.com/?q=</item>
<item>https://www.qwant.com/?q=</item>
<item>https://bing.com/?q=</item>
+7 -2
View File
@@ -14,6 +14,7 @@
<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="label">Label</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>
@@ -93,8 +94,10 @@
<string name="tone_prop_beep2">General double beep</string>
<string name="use_history">ذخیرهٔ تاریخچهٔ پویش</string>
<string name="use_history_summary">کدهای شناسایی شده را در همین دستگاه ذخیره می‌کند.</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">نادیده گرفتن موارد تکراری</string>
<string name="ignore_consecutive_duplicates_summary">موارد تکراری متوالی را در تاریخچهٔ پویش ذخیره نمی‌کند.</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">گشودن بلافاصله</string>
<string name="open_immediately_summary">بازرسی را رها کنید و محتویات را فورا باز کنید. در صورت فعال بودن ممکن است محتوای مضر را باز کند.</string>
<string name="copy_immediately">قرار دادن در تخته‌گیره</string>
@@ -138,7 +141,7 @@
<string name="really_remove_selected_scans">برای برداشتن پویش‌های برگزیده شده مطمئنید؟</string>
<string name="clear_history">پاک کردن تاریخچه</string>
<string name="copy_scan">رونوشت پویش</string>
<string name="edit_scan">ویرایش عنوان</string>
<string name="edit_label">ویرایش عنوان</string>
<string name="remove_scan">برداشتن پویش</string>
<string name="enter_name">یک نام برای توضیح پویش وارد کنید</string>
<string name="enter_name_hint">نام پویش</string>
@@ -166,6 +169,8 @@
<string name="otpauth_add">افزودن احراز هویت چندعاملی(2FA)</string>
<string name="search_web">جست‌وجوی وب</string>
<string name="search_scan">جست‌وجوی پویش</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">برون‌ریزی به پرونده</string>
<string name="export_as">برون‌ریزی به عنوان؟</string>
<string name="export_csv_comma">پروندهٔ سی‌اس‌وی با ویرگول</string>
+7 -3
View File
@@ -7,7 +7,6 @@
<string name="binary_data">(données binaires)</string>
<plurals name="barcode_info">
<item quantity="one">%2$d caractère, %1$s</item>
<item quantity="many">%2$d caractères, %1$s</item>
<item quantity="other">%2$d caractères, %1$s</item>
</plurals>
<string name="error_correction_level">Niveau de correction d\'erreur</string>
@@ -15,6 +14,7 @@
<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="label">Label</string>
<string name="colors">Premier plan et arrière-plan</string>
<string name="colors_black_on_white">Noir sur blanc</string>
<string name="colors_white_on_black">Blanc sur noir</string>
@@ -94,8 +94,10 @@
<string name="tone_prop_beep2">General double beep</string>
<string name="use_history">Sauvegarder l\'historique des scans</string>
<string name="use_history_summary">Sauvegarder les codes reconnus sur votre appareil.</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">Ignorer les doublons</string>
<string name="ignore_consecutive_duplicates_summary">Ne pas sauvegarder les doublons dans l\'historique des scans.</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">Ouvrir immédiatement</string>
<string name="open_immediately_summary">Ignorer l\'inspection et ouvrir le contenu immédiatement. Si cette option est activée, cela peut ouvrir un contenu nocif.</string>
<string name="copy_immediately">Copier dans le presse-papiers</string>
@@ -139,7 +141,7 @@
<string name="really_remove_selected_scans">Supprimer les scans sélectionnés ?</string>
<string name="clear_history">Supprimer l\'historique</string>
<string name="copy_scan">Copier le scan</string>
<string name="edit_scan">Modifier l\'étiquette</string>
<string name="edit_label">Modifier l\'étiquette</string>
<string name="remove_scan">Supprimer le scan</string>
<string name="enter_name">Saisir un nom décrivant le scan</string>
<string name="enter_name_hint">Nom du scan</string>
@@ -167,6 +169,8 @@
<string name="otpauth_add">Ajouter l\'authentification à deux facteurs</string>
<string name="search_web">Rechercher sur internet</string>
<string name="search_scan">Rechercher un scan</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">Exporter en tant que fichier</string>
<string name="export_as">Exporter en tant que ?</string>
<string name="export_csv_comma">CSV avec virgules</string>
+7 -2
View File
@@ -14,6 +14,7 @@
<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="label">Label</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>
@@ -93,8 +94,10 @@
<string name="tone_prop_beep2">General double beep</string>
<string name="use_history">Beolvasási előzmények mentése</string>
<string name="use_history_summary">Felismert kódok mentése a saját eszközén.</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">Ne mentsen egymást követő azonos adatokat</string>
<string name="ignore_consecutive_duplicates_summary">Ne mentse az egymást követő azonos adatokat a beolvasási előzményekbe.</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">Vizsgálat kihagyása és a tartalom azonnali megnyitása</string>
<string name="open_immediately_summary">Vizsgálat kihagyása és a tartalom azonnali megnyitása. Ártalmas tartalmat is megnyithat, ha engedélyezve van.</string>
<string name="copy_immediately">Tartalom automatikus másolása a vágólapra</string>
@@ -138,7 +141,7 @@
<string name="really_remove_selected_scans">Valóban eltávolítja a kijelölt beolvasásokat?</string>
<string name="clear_history">Előzmények törlése</string>
<string name="copy_scan">Beolvasás másolása</string>
<string name="edit_scan">Címke szerkesztése</string>
<string name="edit_label">Címke szerkesztése</string>
<string name="remove_scan">Beolvasás eltávolítása</string>
<string name="enter_name">Adjon meg egy nevet a beolvasás leírásához</string>
<string name="enter_name_hint">A beolvasás neve</string>
@@ -166,6 +169,8 @@
<string name="otpauth_add">Kétlépcsős hitelesítés hozzáadása</string>
<string name="search_web">Keresés a weben</string>
<string name="search_scan">Beolvasás keresése</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">Exportálás fájlba</string>
<string name="export_as">Exportálja másként?</string>
<string name="export_csv_comma">CSV-fájl vesszővel</string>
+7 -2
View File
@@ -13,6 +13,7 @@
<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="label">Label</string>
<string name="colors">Muka dan latar belakang</string>
<string name="colors_black_on_white">Hitam di atas putih</string>
<string name="colors_white_on_black">Putih di atas hitam</string>
@@ -92,8 +93,10 @@
<string name="tone_prop_beep2">General double beep</string>
<string name="use_history">Simpan riwayat pemindaian</string>
<string name="use_history_summary">Simpan kode yang berhasil dipindai pada perangkat anda.</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">Abaikan duplikat</string>
<string name="ignore_consecutive_duplicates_summary">Jangan simpan duplikat yang berturutan di dalam riwayat pemindaian.</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">Buka segera</string>
<string name="open_immediately_summary">Lewati inspeksi dan segera buka konten. Mungkin membuka konten berbahaya jika diaktifkan.</string>
<string name="copy_immediately">Simpan ke dalam clipboard</string>
@@ -137,7 +140,7 @@
<string name="really_remove_selected_scans">Yakin menghapus pindaian yang dipilih?</string>
<string name="clear_history">Hapus riwayat</string>
<string name="copy_scan">Salin pindaian</string>
<string name="edit_scan">Sunting label</string>
<string name="edit_label">Sunting label</string>
<string name="remove_scan">Buang pindaian</string>
<string name="enter_name">Masukkan keterangan pindaian</string>
<string name="enter_name_hint">Nama pindaian</string>
@@ -165,6 +168,8 @@
<string name="otpauth_add">Tambahkan 2FA</string>
<string name="search_web">Cari secara daring</string>
<string name="search_scan">Cari pindaian</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">Ekspor ke berkas</string>
<string name="export_as">Ekspor sebagai?</string>
<string name="export_csv_comma">CSV dengan koma</string>
+7 -2
View File
@@ -14,6 +14,7 @@
<string name="error_correction_level_m" formatted="false">Medio (correzione ~15&#37;)</string>
<string name="error_correction_level_q" formatted="false">Quartile (correzione ~25&#37;)</string>
<string name="error_correction_level_h" formatted="false">Alto (correzione ~30&#37;)</string>
<string name="label">Label</string>
<string name="colors">Colore primo piano/sfondo</string>
<string name="colors_black_on_white">Nero su bianco</string>
<string name="colors_white_on_black">Bianco su nero</string>
@@ -93,8 +94,10 @@
<string name="tone_prop_beep2">Doppio beep generale</string>
<string name="use_history">Salva cronologia scansioni</string>
<string name="use_history_summary">Salva i codici riconosciuti nel dispositivo.</string>
<string name="ignore_duplicates">Ignore duplicates</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="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</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>
@@ -138,7 +141,7 @@
<string name="really_remove_selected_scans">Vuoi rimuovere le scansioni selezionate?</string>
<string name="clear_history">Azzera cronologia</string>
<string name="copy_scan">Copia scansione</string>
<string name="edit_scan">Modifica etichetta</string>
<string name="edit_label">Modifica etichetta</string>
<string name="remove_scan">Rimuovi scansione</string>
<string name="enter_name">Inserisci un nome per descrivere la scansione</string>
<string name="enter_name_hint">Nome scansione</string>
@@ -166,6 +169,8 @@
<string name="otpauth_add">Aggiungi 2FA</string>
<string name="search_web">Cerca nel web</string>
<string name="search_scan">Cerca scansione</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">Esporta su file</string>
<string name="export_as">Come esportare?</string>
<string name="export_csv_comma">CSV con virgole</string>
+7 -2
View File
@@ -13,6 +13,7 @@
<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="label">Label</string>
<string name="colors">背面と前面</string>
<string name="colors_black_on_white">白地に黒色</string>
<string name="colors_white_on_black">黒地に白色</string>
@@ -92,8 +93,10 @@
<string name="tone_prop_beep2">一般的なダブルビープ音</string>
<string name="use_history">スキャン履歴を保存する</string>
<string name="use_history_summary">認識されたバーコードを端末に保存しておきます。</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">重複を破棄する</string>
<string name="ignore_consecutive_duplicates_summary">重複したスキャン履歴を保存しないようにします。</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">すぐにコンテンツを開く</string>
<string name="open_immediately_summary">確認画面なしでコンテンツをすぐに開くようにします。有害なコンテンツを開いてしまうリスクがあります。</string>
<string name="copy_immediately">自動的にクリップボードにコピー</string>
@@ -137,7 +140,7 @@
<string name="really_remove_selected_scans">選択されたスキャン履歴を削除しても宜しいですか?</string>
<string name="clear_history">履歴を消去</string>
<string name="copy_scan">スキャン結果をコピー</string>
<string name="edit_scan">ラベルを編集</string>
<string name="edit_label">ラベルを編集</string>
<string name="remove_scan">スキャン結果を削除</string>
<string name="enter_name">スキャン結果を識別できる名前を入力してください</string>
<string name="enter_name_hint">ここに名前を入力</string>
@@ -165,6 +168,8 @@
<string name="otpauth_add">二段階認証を追加</string>
<string name="search_web">ウェブで検索</string>
<string name="search_scan">スキャン結果を検索</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">ファイルにエクスポート</string>
<string name="export_as">ファイル形式を選択</string>
<string name="export_csv_comma">コンマ区切りのCSVファイル</string>
+7 -2
View File
@@ -14,6 +14,7 @@
<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="label">Label</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>
@@ -93,8 +94,10 @@
<string name="tone_prop_beep2">General double beep</string>
<string name="use_history">სკანირების ისტორიის შენახვა</string>
<string name="use_history_summary">ამოცნობილი შტრიხ-კოდების მოწყობილობაზე შენახვა.</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">არ შევინახოთ შემდგომი ასლები</string>
<string name="ignore_consecutive_duplicates_summary">არ შევინახოთ შემდგომი ასლები სკანირების ისტორიაში.</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">შემოწმების გამოტოვება და მყისიერი გახსნა</string>
<string name="open_immediately_summary">შემოწმების გამოტოვება და მყისიერი გახსნა. შესაძლოა გამოიწვიოს არასასარგებლო კონტენტის ჩვენება.</string>
<string name="copy_immediately">გაცვლის ბუფერში ავტომატური კოპირება</string>
@@ -138,7 +141,7 @@
<string name="really_remove_selected_scans">ნამდვილად გსურთ შერჩეული შტრიხ-კოდების წაშლა?</string>
<string name="clear_history">ისტორიის გასუფთავება</string>
<string name="copy_scan">კოპირება</string>
<string name="edit_scan">რედაქტირება</string>
<string name="edit_label">რედაქტირება</string>
<string name="remove_scan">სკანირების წაშლა</string>
<string name="enter_name">მიანიჭეთ სახელი სკანირებას</string>
<string name="enter_name_hint">სკანირების სახელი</string>
@@ -166,6 +169,8 @@
<string name="otpauth_add">დავამატოთ 2FA</string>
<string name="search_web">ქსელში მოძებნა</string>
<string name="search_scan">სკანირების ძიება</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">ექსპორტი ფაილში</string>
<string name="export_as">შესანახი ფაილის ფორმატი</string>
<string name="export_csv_comma">CSV (გამყოფი - მძიმე)</string>
+7 -2
View File
@@ -13,6 +13,7 @@
<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="label">Label</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>
@@ -92,8 +93,10 @@
<string name="tone_prop_beep2">General double beep</string>
<string name="use_history">Save scan history</string>
<string name="use_history_summary">Save recognized codes on your device.</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates_summary">Do not save consecutive duplicates in the scan history.</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">Open immediately</string>
<string name="open_immediately_summary">Skip inspection and open contents immediately. May open harmful content if enabled.</string>
<string name="copy_immediately">Put into clipboard</string>
@@ -137,7 +140,7 @@
<string name="really_remove_selected_scans">Really remove selected scans?</string>
<string name="clear_history">Clear history</string>
<string name="copy_scan">Copy scan</string>
<string name="edit_scan">Edit label</string>
<string name="edit_label">Edit label</string>
<string name="remove_scan">Remove scan</string>
<string name="enter_name">Enter a name to describe the scan</string>
<string name="enter_name_hint">Name of the scan</string>
@@ -165,6 +168,8 @@
<string name="otpauth_add">Add 2FA</string>
<string name="search_web">Search the web</string>
<string name="search_scan">Search scan</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">Export to file</string>
<string name="export_as">Export as?</string>
<string name="export_csv_comma">CSV file with commas</string>
+7 -2
View File
@@ -14,6 +14,7 @@
<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="label">Label</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>
@@ -93,8 +94,10 @@
<string name="tone_prop_beep2">General double beep</string>
<string name="use_history">Scancodes bewaren</string>
<string name="use_history_summary">Bewaar herkende codes op je toestel.</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">Duplicaten negeren</string>
<string name="ignore_consecutive_duplicates_summary">Bewaar geen opeenvolgende duplicaten in de scangeschiedenis.</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">Inhoud direct tonen, zonder inspectie</string>
<string name="open_immediately_summary">Sla inspectie over en open meteen de inhoud. Indien geactiveerd, kan schadelijke inhoud worden geopend.</string>
<string name="copy_immediately">Meteen op klembord zetten</string>
@@ -138,7 +141,7 @@
<string name="really_remove_selected_scans">Geselecteerde scans verwijderen?</string>
<string name="clear_history">Wis opgeslagen codes</string>
<string name="copy_scan">Scan kopiëren</string>
<string name="edit_scan">Label bewerken</string>
<string name="edit_label">Label bewerken</string>
<string name="remove_scan">Scan verwijderen</string>
<string name="enter_name">Naam van de scan</string>
<string name="enter_name_hint">Voer een naam in om de scan te beschrijven</string>
@@ -166,6 +169,8 @@
<string name="otpauth_add">2FA toevoegen</string>
<string name="search_web">Zoeken op internet</string>
<string name="search_scan">Scan op internet zoeken</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">Uitvoer naar bestand</string>
<string name="export_as">Exporteren als?</string>
<string name="export_csv_comma">CSV bestand met komma\'s</string>
+7 -2
View File
@@ -15,6 +15,8 @@
<string name="compose_barcode">Utwórz kod kreskowy</string>
<string name="history">Historia</string>
<string name="format">Format</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">Eksportuj do pliku</string>
<string name="file_name">Nazwa pliku</string>
<string name="export_json">Eksportuj jako JSON</string>
@@ -32,6 +34,7 @@
<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="label">Label</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>
@@ -53,7 +56,7 @@
<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="edit_label">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>
<string name="copy_scan">Skopiuj skan</string>
@@ -124,8 +127,10 @@
<string name="search_web">Szukaj w sieci</string>
<string name="search_scan">Szukaj skanu</string>
<string name="export_database">Eksportuj do bazy danych SQLite</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">Nie zapisuj kolejnych duplikatów</string>
<string name="ignore_consecutive_duplicates_summary">Nie zapisuj kolejnych duplikatów w historii skanowania.</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="default_search_engine">Otwórz nieznane dane w</string>
<string name="always_ask">Zawsze pytaj</string>
<string name="open_with_url">Otwieraj nieznane dane za pomocą adresu URL</string>
+13 -8
View File
@@ -14,6 +14,7 @@
<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="label">Label</string>
<string name="colors">Modo de exibição</string>
<string name="colors_black_on_white">Preto sobre fundo branco</string>
<string name="colors_white_on_black">Branco sobre fundo preto</string>
@@ -31,7 +32,7 @@
<string name="toggle_flash">Ligar lanterna</string>
<string name="error_flash">Falha ao ligar a lanterna</string>
<string name="share">Compartilhe</string>
<string name="share_file">Share as file</string>
<string name="share_file">Compartilhar como arquivo</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>
@@ -41,8 +42,8 @@
<string name="cannot_resolve_action">Nenhum app pode abrir isto</string>
<string name="pick_search_engine">Escolha site de busca</string>
<string name="format">Formato</string>
<string name="size_width_by_height">Tamanho em píxeis: %1$d×%2$d</string>
<string name="margin_size">Margin in pixels: %1$d</string>
<string name="size_width_by_height">Tamanho em pixels: %1$d×%2$d</string>
<string name="margin_size">Margem em pixels: %1$d</string>
<string name="input_content_here">Digite algum conteúdo aqui</string>
<string name="unescape">Expandir sequências de escape</string>
<string name="encode">CODIFICAR</string>
@@ -93,8 +94,10 @@
<string name="tone_prop_beep2">Bipe duplo comum</string>
<string name="use_history">Ativar histórico de digitalizações</string>
<string name="use_history_summary">Salve códigos reconhecidos no dispositivo.</string>
<string name="ignore_duplicates">Ignore duplicates</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 digitalizações.</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">Abrir imediatamente</string>
<string name="open_immediately_summary">Pular a inspeção e abrir um conteúdo no mesmo instante. Quando ativado, pode abrir conteúdo perigoso.</string>
<string name="copy_immediately">Copiar ao clipboard</string>
@@ -127,7 +130,7 @@
<string name="send_type_external_browser">Abrir em navegador externo</string>
<string name="test_url">Testar a URL</string>
<string name="send_scan_bluetooth">Encaminhar para Bluetooth</string>
<string name="send_scan_bluetooth_summary">Ativar isto para encaminhar digitalizações ao determinado host de Bluetooth.</string>
<string name="send_scan_bluetooth_summary">Ative para encaminhar digitalizações ao determinado host de Bluetooth.</string>
<string name="send_scan_bluetooth_host">Host</string>
<string name="no_bluetooth_hosts_paired">Não emparelhado com host</string>
<string name="bluetooth_connect_fail">Não foi possível conectar com dispositivo Bluetooth.</string>
@@ -138,7 +141,7 @@
<string name="really_remove_selected_scans">Deseja excluir as digitalizações selecionadas?</string>
<string name="clear_history">Apagar histórico</string>
<string name="copy_scan">Copiar digitalização</string>
<string name="edit_scan">Editar identificação</string>
<string name="edit_label">Editar identificação</string>
<string name="remove_scan">Excluir digitalização</string>
<string name="enter_name">Digite um nome para identificar esta digitalização</string>
<string name="enter_name_hint">Nome de digitalização</string>
@@ -166,6 +169,8 @@
<string name="otpauth_add">Adicionar 2FA</string>
<string name="search_web">Buscar na internet</string>
<string name="search_scan">Buscar nas digitalizações salvas</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">Exportar para arquivo</string>
<string name="export_as">Exportar em qual formato?</string>
<string name="export_csv_comma">Arquivo CSV com vírgulas</string>
@@ -174,8 +179,8 @@
<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">Ativar rotação livre</string>
<string name="pick_file">Pick a file</string>
<string name="toggle_free_rotation">Girar livremente</string>
<string name="pick_file">Escolha arquivo</string>
<string name="pick_image_file">Escolha imagem</string>
<string name="pick_code_to_scan">Escolha código para digitalizar</string>
<string name="shortcut_decode">Digitalizar código</string>
+9 -4
View File
@@ -16,6 +16,7 @@
<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="label">Метка</string>
<string name="colors">Цвета</string>
<string name="colors_black_on_white">Чёрный на белом</string>
<string name="colors_white_on_black">Белый на чёрном</string>
@@ -95,8 +96,10 @@
<string name="tone_prop_beep2">Обычный двойной сигнал</string>
<string name="use_history">Сохранять историю сканирования</string>
<string name="use_history_summary">Сохранять распознанные штрих-коды на устройстве.</string>
<string name="ignore_consecutive_duplicates">Не хранить дубликаты</string>
<string name="ignore_consecutive_duplicates_summary">Не сохранять повторяющиеся штрих-коды в истории сканирования.</string>
<string name="ignore_duplicates">Действие с дубликатами</string>
<string name="ignore_consecutive_duplicates">Не сохранять последовательные дубликаты</string>
<string name="ignore_any_duplicates">Не сохранять никакие дубликаты</string>
<string name="accept_duplicates">Сохранять дубликаты</string>
<string name="open_immediately">Сразу открывать содержимое</string>
<string name="open_immediately_summary">Пропускать проверку и сразу открыть содержимое. Может привести к открытию небезопасного содержимого.</string>
<string name="copy_immediately">Автокопирование в буфер обмена</string>
@@ -109,7 +112,7 @@
<string name="show_recreation_summary">Показывать штрих-код, восстановленный из считанного содержимого.</string>
<string name="close_automatically">Возврат после копирования/обмена</string>
<string name="close_automatically_summary">Автоматически возвращаться к экрану сканирования после копирования или передачу через функцию «Поделиться» считанного содержимого.</string>
<string name="default_search_engine">Поиск неизвестных данных в</string>
<string name="default_search_engine">Поиск неизвестных данных</string>
<string name="always_ask">Всегда спрашивать</string>
<string name="open_with_url">Открывать неизвестные данные по URL</string>
<string name="clear_network_suggestions">Удалить сетевые предложения</string>
@@ -140,7 +143,7 @@
<string name="really_remove_selected_scans">Удалить выбранные штрих-коды?</string>
<string name="clear_history">Очистить историю</string>
<string name="copy_scan">Копировать</string>
<string name="edit_scan">Редактировать</string>
<string name="edit_label">Редактировать</string>
<string name="remove_scan">Удалить сканирование</string>
<string name="enter_name">Укажите название сканирования</string>
<string name="enter_name_hint">Название сканирования</string>
@@ -168,6 +171,8 @@
<string name="otpauth_add">Добавить 2FA</string>
<string name="search_web">Поиск в сети</string>
<string name="search_scan">Поиск сканирования</string>
<string name="add_to_history">Добавить в историю</string>
<string name="added_to_history">Добавлено в историю</string>
<string name="export_to_file">Экспортировать в файл</string>
<string name="export_as">Формат файла экспорта</string>
<string name="export_csv_comma">CSV (разделитель – запятая)</string>
@@ -2,6 +2,7 @@
<string-array name="search_engines_names">
<item>@string/always_ask</item>
<item>Google</item>
<item>Brave Search</item>
<item>DuckDuckGo</item>
<item>Qwant</item>
<item>Bing</item>
@@ -16,6 +17,7 @@
<string-array name="search_engines_values">
<item></item>
<item>https://www.google.com.tr/search?q=</item>
<item>https://search.brave.com/search?q=</item>
<item>https://duckduckgo.com/?q=</item>
<item>https://www.qwant.com/?q=</item>
<item>https://bing.com/?q=</item>
+32 -27
View File
@@ -1,7 +1,7 @@
<resources>
<string name="camera_error">Kameraya erişilemiyor, lütfen yeniden deneyin</string>
<string name="scan_code">Kod tara</string>
<string name="compose_barcode">Barkod yarat</string>
<string name="compose_barcode">Barkod oluştur</string>
<string name="decode_barcode">Barkod çöz</string>
<string name="content">İçerik</string>
<string name="binary_data">(ikili veri)</string>
@@ -14,6 +14,7 @@
<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="label">Etiket</string>
<string name="colors">Ön ve arka plan</string>
<string name="colors_black_on_white">Beyaz üzerine siyah</string>
<string name="colors_white_on_black">Siyah üzerine beyaz</string>
@@ -31,7 +32,7 @@
<string name="toggle_flash">Flaşı aç</string>
<string name="error_flash">Flaş açılırken hata oluştu</string>
<string name="share">Paylaş</string>
<string name="share_file">Share as file</string>
<string name="share_file">Dosya olarak paylaş</string>
<string name="share_as">Şöyle paylaş:</string>
<string name="copy_to_clipboard">Panoya kopyala</string>
<string name="copied_to_clipboard">Panoya kopyalandı</string>
@@ -42,12 +43,12 @@
<string name="pick_search_engine">Arama motoru seç</string>
<string name="format">Biçim</string>
<string name="size_width_by_height">Piksel türünde boyut: %1$d×%2$d</string>
<string name="margin_size">Margin in pixels: %1$d</string>
<string name="margin_size">Piksel türünde kenar boşluğu: %1$d</string>
<string name="input_content_here">İçeriği buraya gir</string>
<string name="unescape">Expand escape sequences</string>
<string name="unescape">Kaçış dizilerini genişlet</string>
<string name="encode">KODLA</string>
<string name="error_no_content">İçerik eksik</string>
<string name="error_encoding_barcode">Barkod yaratılamadı</string>
<string name="error_encoding_barcode">Barkod oluşturulamadı</string>
<string name="view_barcode">Barkodu gör</string>
<string name="info">Bilgi</string>
<string name="switch_camera">Kamerayı değiştir</string>
@@ -82,19 +83,21 @@
<string name="show_toast_in_bulk_mode_summary">Sürekli tarama yaparken taranan verileri kısaca göster.</string>
<string name="vibrate">Tanıyınca titre</string>
<string name="vibrate_summary">Kod tanındığında aygıtınızın titremesini istiyorsanız bunu etkinleştirin.</string>
<string name="beep">Beep on detection</string>
<string name="beep_summary">Enable this if you want your device to beep when a code is recognized.</string>
<string name="beep_tone">Beep tone</string>
<string name="tone_cdma_confirm">CDMA confirm</string>
<string name="tone_sup_confirm">Call supervisory confirm</string>
<string name="tone_sup_radio_ack">Call supervisory radio path acknowledgment</string>
<string name="tone_prop_ack">Positive acknowledgment</string>
<string name="tone_prop_beep">General beep</string>
<string name="tone_prop_beep2">General double beep</string>
<string name="beep">Tanıyınca ses çal</string>
<string name="beep_summary">Kod tanındığında aygıtınızın bip sesi çıkarmasını istiyorsanız bunu etkinleştirin.</string>
<string name="beep_tone">Ses tonu</string>
<string name="tone_cdma_confirm">CDMA onaylaması</string>
<string name="tone_sup_confirm">Çağrı denetleme onayı</string>
<string name="tone_sup_radio_ack">Çağrı denetleme radyo yolu onayı</string>
<string name="tone_prop_ack">Olumlu onay</string>
<string name="tone_prop_beep">Genel bip sesi</string>
<string name="tone_prop_beep2">Genel çift bip sesi</string>
<string name="use_history">Tarama geçmişini kaydet</string>
<string name="use_history_summary">Tanınan kodları aygıtınızda saklayın.</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">Yinelemeleri göz ardı et</string>
<string name="ignore_consecutive_duplicates_summary">Ardışık yinelemeleri tarama geçmişine kaydetme.</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">Hemen aç</string>
<string name="open_immediately_summary">İncelemeyi atla ve içeriği hemen aç. Eğer etkinse zararlı içerik açılabilir.</string>
<string name="copy_immediately">Panoya koy</string>
@@ -126,19 +129,19 @@
<string name="send_type_post_json">POST application/json</string>
<string name="send_type_external_browser">Harici tarayıcıda aç</string>
<string name="test_url">URL\'yi sına</string>
<string name="send_scan_bluetooth">Forward scans with Bluetooth</string>
<string name="send_scan_bluetooth_summary">Enable to forwards scans to a given Bluetooth host.</string>
<string name="send_scan_bluetooth_host">Host</string>
<string name="no_bluetooth_hosts_paired">No Hosts Paired</string>
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
<string name="bluetooth_send_success">Successful bluetooth send.</string>
<string name="send_scan_bluetooth">Taramaları Bluetooth ile ilet</string>
<string name="send_scan_bluetooth_summary">Taramaları belirtilen bir Bluetooth aygıtına iletmeyi etkinleştirin</string>
<string name="send_scan_bluetooth_host">Aygıt</string>
<string name="no_bluetooth_hosts_paired">Eşleştirilen Aygıt Yok</string>
<string name="bluetooth_connect_fail">Bluetooth aygıtına bağlanılamadı.</string>
<string name="bluetooth_send_fail">Bluetooth aygıtına gönderilemedi.</string>
<string name="bluetooth_send_success">Bluetooth aygıtına gönderildi.</string>
<string name="really_remove_scan">Tarama gerçekten silinsin mi?</string>
<string name="really_remove_all_scans">Tüm taramalar gerçekten silinsin mi?</string>
<string name="really_remove_selected_scans">Seçili taramalar gerçekten silinsin mi?</string>
<string name="clear_history">Geçmişi temizle</string>
<string name="copy_scan">Taramayı kopyala</string>
<string name="edit_scan">Etiketi düzenle</string>
<string name="edit_label">Etiketi düzenle</string>
<string name="remove_scan">Taramayı sil</string>
<string name="enter_name">Taramayı açıklayacak ad gir</string>
<string name="enter_name_hint">Taramanın adı</string>
@@ -166,6 +169,8 @@
<string name="otpauth_add">2FA\'ya ekle</string>
<string name="search_web">Web\'i ara</string>
<string name="search_scan">Taramayı ara</string>
<string name="add_to_history">Geçmişe ekle</string>
<string name="added_to_history">Geçmişe eklendi</string>
<string name="export_to_file">Dosyaya dışa aktar</string>
<string name="export_as">Ne olarak dışa aktarılsın?</string>
<string name="export_csv_comma">Virgüller ile CSV</string>
@@ -175,11 +180,11 @@
<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">Serbest dönüşü değiştir</string>
<string name="pick_file">Pick a file</string>
<string name="pick_file">Dosya seç</string>
<string name="pick_image_file">Görüntü dosyası seç</string>
<string name="pick_code_to_scan">Taranacak kod seç</string>
<string name="shortcut_decode">Barkod tara</string>
<string name="shortcut_encode">Barkod yarat</string>
<string name="shortcut_encode">Barkod oluştur</string>
<string name="shortcut_preferences">Ayarlar</string>
<string name="background_request_failed">Arka plan isteği başarısız</string>
<string name="entry_type">Tür</string>
@@ -192,6 +197,6 @@
<string name="wifi_anonymous_identity">Anonim kimlik</string>
<string name="wifi_identity">Kimlik</string>
<string name="wifi_phase2">2. aşama yöntemi</string>
<string name="network_suggestions">Network suggestions</string>
<string name="remove_suggestion">Remove suggestion</string>
<string name="network_suggestions">Ağ önerileri</string>
<string name="remove_suggestion">Öneriyi kaldır</string>
</resources>
+12 -7
View File
@@ -15,6 +15,7 @@
<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="label">Мітка</string>
<string name="colors">Кольори</string>
<string name="colors_black_on_white">Чорний на білому</string>
<string name="colors_white_on_black">Білий на чорному</string>
@@ -32,7 +33,7 @@
<string name="toggle_flash">Увімкнути спалах</string>
<string name="error_flash">Помилка під час увімкнення спалаху</string>
<string name="share">Поділитися</string>
<string name="share_file">Share as file</string>
<string name="share_file">Поділитися файлом</string>
<string name="share_as">Поділитися як?</string>
<string name="copy_to_clipboard">Копіювати у буфер обміну</string>
<string name="copied_to_clipboard">Скопійовано у буфер обміну</string>
@@ -43,7 +44,7 @@
<string name="pick_search_engine">Вибрати пошукову систему</string>
<string name="format">Формат</string>
<string name="size_width_by_height">Розмір у пікселях: %1$d×%2$d</string>
<string name="margin_size">Margin in pixels: %1$d</string>
<string name="margin_size">Відступ у пікселях: %1$d</string>
<string name="input_content_here">Введіть вміст сюди</string>
<string name="unescape">Розгорнути спеціальні послідовності</string>
<string name="encode">КОДУВАТИ</string>
@@ -84,7 +85,7 @@
<string name="vibrate">Вібрувати при виявленні</string>
<string name="vibrate_summary">Увімкніть це, якщо хочете, щоб пристрій вібрував, коли код розпізнано.</string>
<string name="beep">Звук при виявленні</string>
<string name="beep_summary">Enable this if you want your device to beep when a code is recognized.</string>
<string name="beep_summary">Увімкніть це, якщо хочете, щоб пристрій подавав звуковий сигнал, коли код розпізнано.</string>
<string name="beep_tone">Тон звуку</string>
<string name="tone_cdma_confirm">Підтвердження CDMA</string>
<string name="tone_sup_confirm">Підтвердження диспетчерського виклику</string>
@@ -94,8 +95,10 @@
<string name="tone_prop_beep2">Звичайний подвійний сигнал</string>
<string name="use_history">Зберігати історію сканування</string>
<string name="use_history_summary">Збережіть розпізнані коди на своєму пристрої.</string>
<string name="ignore_consecutive_duplicates">Ігнорувати дублікати</string>
<string name="ignore_consecutive_duplicates_summary">Не зберігати послідовні дублікати в історії сканування.</string>
<string name="ignore_duplicates">Ігнорувати дублікати</string>
<string name="ignore_consecutive_duplicates">Послідовні дублікати</string>
<string name="ignore_any_duplicates">Будь-які дублікати</string>
<string name="accept_duplicates">Приймати дублікати</string>
<string name="open_immediately">Відкривати негайно</string>
<string name="open_immediately_summary">Пропустити перегляд та негайно відкрити вміст. Якщо увімкнено, може відкрити шкідливий вміст.</string>
<string name="copy_immediately">Помістити в буфер обміну</string>
@@ -139,7 +142,7 @@
<string name="really_remove_selected_scans">Дійсно видалити вибрані сканування?</string>
<string name="clear_history">Очистити історію</string>
<string name="copy_scan">Скопіювати сканування</string>
<string name="edit_scan">Редагувати мітку</string>
<string name="edit_label">Редагувати мітку</string>
<string name="remove_scan">Видалити сканування</string>
<string name="enter_name">Введіть ім\'я щоб описати сканування</string>
<string name="enter_name_hint">Ім\'я сканування</string>
@@ -167,6 +170,8 @@
<string name="otpauth_add">Додати 2FA</string>
<string name="search_web">Шукати в мережі</string>
<string name="search_scan">Шукати сканування</string>
<string name="add_to_history">Додати до історії</string>
<string name="added_to_history">Додано до історії</string>
<string name="export_to_file">Експортувати в файл</string>
<string name="export_as">Експортувати як?</string>
<string name="export_csv_comma">CSV із комами</string>
@@ -176,7 +181,7 @@
<string name="saved_in_downloads">Збережено в Завантаженнях</string>
<string name="rotate_image_cw">Повернути зображення за годинниковою стрілкою</string>
<string name="toggle_free_rotation">Увімкнути вільне обертання</string>
<string name="pick_file">Pick a file</string>
<string name="pick_file">Вибрати файл</string>
<string name="pick_image_file">Вибрати файл зображення</string>
<string name="pick_code_to_scan">Вибрати код для сканування</string>
<string name="shortcut_decode">Сканувати штрих-код</string>
+7 -2
View File
@@ -13,6 +13,7 @@
<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="label">Label</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>
@@ -92,8 +93,10 @@
<string name="tone_prop_beep2">General double beep</string>
<string name="use_history">Lưu lịch sử quét</string>
<string name="use_history_summary">Lưu mã đã nhận dạng được trên máy của bạn.</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">Bỏ qua trùng lặp</string>
<string name="ignore_consecutive_duplicates_summary">Không lưu các kết quả quét trùng lặp liên tục vào lịch sử.</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">Mở ngay</string>
<string name="open_immediately_summary">Bỏ qua kiểm tra và mở ngay nội dung. Có thể mở nội dung nguy hiểm nếu kích hoạt.</string>
<string name="copy_immediately">Sao chép kết quả</string>
@@ -137,7 +140,7 @@
<string name="really_remove_selected_scans">Thật sự xoá các lần quét được chọn?</string>
<string name="clear_history">Xoá lịch sử</string>
<string name="copy_scan">Sao chép lần quét</string>
<string name="edit_scan">Sửa nhãn</string>
<string name="edit_label">Sửa nhãn</string>
<string name="remove_scan">Xoá lần quét</string>
<string name="enter_name">Nhập tên để miêu tả lần quét</string>
<string name="enter_name_hint">Tên lần quét</string>
@@ -165,6 +168,8 @@
<string name="otpauth_add">Thêm xác thực hai bước</string>
<string name="search_web">Tìm kiếm web</string>
<string name="search_scan">Tìm kiếm lần quét</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">Xuất thành tệp</string>
<string name="export_as">Xuất dưói dạng?</string>
<string name="export_csv_comma">Tệp CSV với dấu phẩy</string>
+7 -2
View File
@@ -13,6 +13,7 @@
<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="label">Label</string>
<string name="colors">前景和背景</string>
<string name="colors_black_on_white">白底黑字</string>
<string name="colors_white_on_black">黑底白字</string>
@@ -92,8 +93,10 @@
<string name="tone_prop_beep2">General double beep</string>
<string name="use_history">保存扫描历史</string>
<string name="use_history_summary">在本地保存扫描历史</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">不保存重复历史</string>
<string name="ignore_consecutive_duplicates_summary">在扫描历史中不保存重复项</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">不检查内容立即打开链接</string>
<string name="open_immediately_summary">可能会打开有害内容</string>
<string name="copy_immediately">自动复制扫描结果到剪贴板</string>
@@ -137,7 +140,7 @@
<string name="really_remove_selected_scans">确定删除所选记录?</string>
<string name="clear_history">清空记录</string>
<string name="copy_scan">复制扫描记录</string>
<string name="edit_scan">编辑名称</string>
<string name="edit_label">编辑名称</string>
<string name="remove_scan">删除所选记录</string>
<string name="enter_name">输入名称</string>
<string name="enter_name_hint">扫描描述</string>
@@ -165,6 +168,8 @@
<string name="otpauth_add">添加两步验证</string>
<string name="search_web">在互联网中搜索</string>
<string name="search_scan">搜索扫描记录</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">导出为文件</string>
<string name="export_as">另存为?</string>
<string name="export_csv_comma">逗号分隔的 CSV</string>
@@ -1,25 +0,0 @@
<resources>
<string-array name="locale_names">
<item>@string/follow_system_settings</item>
<item>英文</item>
<item>德文</item>
<item>西班牙</item>
<item>法文</item>
<item>匈牙利</item>
<item>印尼</item>
<item>義大利</item>
<item>喬治亞</item>
<item>荷蘭</item>
<item>波斯</item>
<item>波蘭</item>
<item>巴西 (葡萄牙)</item>
<item>俄羅斯</item>
<item>土耳其</item>
<item>烏克蘭</item>
<item>中文</item>
<item>繁體中文</item>
<item>簡體中文</item>
<item>日文</item>
<item>捷克</item>
</string-array>
</resources>
+10 -5
View File
@@ -13,6 +13,7 @@
<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="label">名稱</string>
<string name="colors">前景與背景</string>
<string name="colors_black_on_white">白底黑字</string>
<string name="colors_white_on_black">黑底白字</string>
@@ -30,7 +31,7 @@
<string name="toggle_flash">控制閃光燈</string>
<string name="error_flash">控制閃光燈時發生錯誤</string>
<string name="share">分享</string>
<string name="share_file">Share as file</string>
<string name="share_file">分享檔案</string>
<string name="share_as">您要以何種方式分享?</string>
<string name="copy_to_clipboard">複製到剪貼簿</string>
<string name="copied_to_clipboard">已複製到剪貼簿</string>
@@ -41,7 +42,7 @@
<string name="pick_search_engine">選擇一個搜尋引擎</string>
<string name="format">格式</string>
<string name="size_width_by_height">圖片尺寸: %1$d×%2$d</string>
<string name="margin_size">Margin in pixels: %1$d</string>
<string name="margin_size">間距大小: %1$d</string>
<string name="input_content_here">請在這裡輸入內容</string>
<string name="unescape">展開逸出序列</string>
<string name="encode">編碼</string>
@@ -92,8 +93,10 @@
<string name="tone_prop_beep2">標準連續嗶聲</string>
<string name="use_history">儲存掃描記錄</string>
<string name="use_history_summary">在本機儲存掃描記錄</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">不儲存重複歷史記錄</string>
<string name="ignore_consecutive_duplicates_summary">掃描記錄中不儲存連續的重複項目</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">立即開啟</string>
<string name="open_immediately_summary">跳過檢查並立即開啟。可能會開啟有害內容</string>
<string name="copy_immediately">自動複製掃描結果到剪貼簿</string>
@@ -137,7 +140,7 @@
<string name="really_remove_selected_scans">確定要刪除選擇的掃描記錄?</string>
<string name="clear_history">清空記錄</string>
<string name="copy_scan">複製掃描記錄</string>
<string name="edit_scan">編輯名稱</string>
<string name="edit_label">編輯名稱</string>
<string name="remove_scan">刪除所選記錄</string>
<string name="enter_name">輸入名稱</string>
<string name="enter_name_hint">掃描描述</string>
@@ -165,6 +168,8 @@
<string name="otpauth_add">加入雙重驗證 (2FA)</string>
<string name="search_web">在網路上搜尋</string>
<string name="search_scan">搜尋掃描記錄</string>
<string name="add_to_history">儲存記錄</string>
<string name="added_to_history">已新增至記錄</string>
<string name="export_to_file">匯出檔案</string>
<string name="export_as">另存為?</string>
<string name="export_csv_comma">逗號分隔的 CSV 檔案</string>
@@ -174,7 +179,7 @@
<string name="saved_in_downloads">已儲存至下載資料夾</string>
<string name="rotate_image_cw">順時針旋轉圖片</string>
<string name="toggle_free_rotation">切換自由旋轉</string>
<string name="pick_file">Pick a file</string>
<string name="pick_file">選擇檔案</string>
<string name="pick_image_file">選擇圖片檔案</string>
<string name="pick_code_to_scan">選擇要掃描的條碼</string>
<string name="shortcut_decode">掃描條碼</string>
@@ -8,6 +8,7 @@
<item>DATA BAR</item>
<item>DATA BAR EXPANDED</item>
<item>DATA MATRIX</item>
<item>DX FILM EDGE</item>
<item>EAN 8</item>
<item>EAN 13</item>
<item>ITF</item>
@@ -15,6 +16,7 @@
<item>PDF 417</item>
<item>QR CODE</item>
<item>MICRO QR CODE</item>
<item>rMQR CODE</item>
<item>UPC A</item>
<item>UPC E</item>
</string-array>
@@ -27,6 +29,7 @@
<item>DATA_BAR</item>
<item>DATA_BAR_EXPANDED</item>
<item>DATA_MATRIX</item>
<item>DX_FILM_EDGE</item>
<item>EAN_8</item>
<item>EAN_13</item>
<item>ITF</item>
@@ -34,6 +37,7 @@
<item>PDF_417</item>
<item>QR_CODE</item>
<item>MICRO_QR_CODE</item>
<item>RMQR_CODE</item>
<item>UPC_A</item>
<item>UPC_E</item>
</string-array>
@@ -0,0 +1,12 @@
<resources>
<string-array name="ignore_duplicates_names">
<item>@string/ignore_consecutive_duplicates</item>
<item>@string/ignore_any_duplicates</item>
<item>@string/accept_duplicates</item>
</string-array>
<string-array name="ignore_duplicates_values">
<item>ignore_consecutive_duplicates</item>
<item>ignore_any_duplicates</item>
<item>accept_duplicates</item>
</string-array>
</resources>
+10 -5
View File
@@ -1,4 +1,4 @@
<resources>
<resources xmlns:tools="http://schemas.android.com/tools">
<string name="camera_error">Can\'t access camera, please try again</string>
<string name="scan_code">Scan code</string>
<string name="compose_barcode">Compose barcode</string>
@@ -14,6 +14,7 @@
<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="label">Label</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>
@@ -27,7 +28,7 @@
<string name="gtin_price">Suggested price</string>
<string name="gtin_add_on">UPC EAN extension</string>
<string name="barcode_version_number">Version</string>
<string name="qr_version_and_modules">%1$s (%2$d modules)</string>
<string name="qr_version_and_modules" tools:ignore="PluralsCandidate">%1$s (%2$d modules)</string>
<string name="toggle_flash">Toggle flash</string>
<string name="error_flash">Error toggling flash</string>
<string name="share">Share</string>
@@ -93,8 +94,10 @@
<string name="tone_prop_beep2">General double beep</string>
<string name="use_history">Save scan history</string>
<string name="use_history_summary">Save recognized codes on your device.</string>
<string name="ignore_consecutive_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates_summary">Do not save consecutive duplicates in the scan history.</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">Consecutive duplicates</string>
<string name="ignore_any_duplicates">Any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">Open immediately</string>
<string name="open_immediately_summary">Skip inspection and open contents immediately. May open harmful content if enabled.</string>
<string name="copy_immediately">Put into clipboard</string>
@@ -138,7 +141,7 @@
<string name="really_remove_selected_scans">Really remove selected scans?</string>
<string name="clear_history">Clear history</string>
<string name="copy_scan">Copy scan</string>
<string name="edit_scan">Edit label</string>
<string name="edit_label">Edit label</string>
<string name="remove_scan">Remove scan</string>
<string name="enter_name">Enter a name to describe the scan</string>
<string name="enter_name_hint">Name of the scan</string>
@@ -166,6 +169,8 @@
<string name="otpauth_add">Add 2FA</string>
<string name="search_web">Search the web</string>
<string name="search_scan">Search scan</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">Export to file</string>
<string name="export_as">Export as?</string>
<string name="export_csv_comma">CSV file with commas</string>
+6 -5
View File
@@ -65,11 +65,12 @@
android:key="use_history"
android:title="@string/use_history"
android:summary="@string/use_history_summary"/>
<android.support.v7.preference.SwitchPreferenceCompat
android:defaultValue="true"
android:key="ignore_consecutive_duplicates"
android:title="@string/ignore_consecutive_duplicates"
android:summary="@string/ignore_consecutive_duplicates_summary"/>
<ListPreference
android:key="ignore_duplicates_name"
android:title="@string/ignore_duplicates"
android:entries="@array/ignore_duplicates_names"
android:entryValues="@array/ignore_duplicates_values"
android:defaultValue="ignore_consecutive_duplicates"/>
<android.support.v7.preference.SwitchPreferenceCompat
android:defaultValue="false"
android:key="copy_immediately"
+6 -5
View File
@@ -65,11 +65,12 @@
android:key="use_history"
android:title="@string/use_history"
android:summary="@string/use_history_summary"/>
<android.support.v7.preference.SwitchPreferenceCompat
android:defaultValue="true"
android:key="ignore_consecutive_duplicates"
android:title="@string/ignore_consecutive_duplicates"
android:summary="@string/ignore_consecutive_duplicates_summary"/>
<ListPreference
android:key="ignore_duplicates_name"
android:title="@string/ignore_duplicates"
android:entries="@array/ignore_duplicates_names"
android:entryValues="@array/ignore_duplicates_values"
android:defaultValue="ignore_consecutive_duplicates"/>
<android.support.v7.preference.SwitchPreferenceCompat
android:defaultValue="false"
android:key="copy_immediately"
+6 -5
View File
@@ -60,11 +60,12 @@
android:key="use_history"
android:title="@string/use_history"
android:summary="@string/use_history_summary"/>
<android.support.v7.preference.SwitchPreferenceCompat
android:defaultValue="true"
android:key="ignore_consecutive_duplicates"
android:title="@string/ignore_consecutive_duplicates"
android:summary="@string/ignore_consecutive_duplicates_summary"/>
<ListPreference
android:key="ignore_duplicates_name"
android:title="@string/ignore_duplicates"
android:entries="@array/ignore_duplicates_names"
android:entryValues="@array/ignore_duplicates_values"
android:defaultValue="ignore_consecutive_duplicates"/>
<android.support.v7.preference.SwitchPreferenceCompat
android:defaultValue="false"
android:key="copy_immediately"
+7 -11
View File
@@ -1,7 +1,7 @@
buildscript {
ext {
kotlin_version = '1.8.22'
tools_version = '7.4.2'
kotlin_version = '1.9.22'
tools_version = '8.3.1'
sdk_version = 34
support_version = '25.3.1'
}
@@ -18,19 +18,15 @@ buildscript {
}
allprojects {
repositories {
google()
mavenCentral()
maven { url 'https://jitpack.io' }
}
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked"
tasks.withType(JavaCompile).tap {
configureEach {
options.compilerArgs << "-Xlint:unchecked"
}
}
}
}
task clean(type: Delete) {
tasks.register('clean', Delete) {
delete rootProject.buildDir
}
@@ -0,0 +1,4 @@
* Add support for rMQR (rectangular Micro QR) Code
* Share history as a file
* Only share selected scans from history
@@ -0,0 +1,2 @@
* Make rMQR Code selectable
@@ -0,0 +1,2 @@
* Include rMQR Code for updates
@@ -0,0 +1,3 @@
* Extend selection with single taps in history listing
* Update Brazilian Portuguese translation
@@ -0,0 +1,9 @@
* Edit scan label in decoding screen
* Add a button to add generated codes to the history
* Improve scanning from images
* Improve asking for camera permission
* Fix margin for recreated barcodes
* Limit duration of error beep to 1s
* Update Ukrainian translation
* Update Spanish translation
@@ -0,0 +1,3 @@
* Include scan label in exports/shares
* Update Russian translation
@@ -0,0 +1,4 @@
* Add DX Film Edge barcode format
* Update Turkish translation
* Update Ukrainian translation
@@ -0,0 +1,3 @@
* Update Chinese translation
* Improve support for old devices
@@ -0,0 +1,5 @@
* Add an option to ignore any duplicates
* Fix invalid bluetooth connection
* Update Russian translation
* Update Ukrainian translation
+3
View File
@@ -1,2 +1,5 @@
org.gradle.jvmargs=-Xmx1536m
kotlin.code.style=official
android.defaults.buildfeatures.buildconfig=true
android.nonTransitiveRClass=false
android.nonFinalResIds=false
+2 -1
View File
@@ -1,6 +1,7 @@
#Wed Jan 26 11:58:22 CET 2022
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
distributionPath=wrapper/dists
networkTimeout=10000
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
+17
View File
@@ -1 +1,18 @@
pluginManagement {
repositories {
google()
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
rootProject.name = "Binary Eye"
include ':app'
+4
View File
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
<path d="M 14.54 18.49 L 14.54 16.51 L 17.51 16.51 L 17.51 13.54 L 19.49 13.54 L 19.49 16.51 L 22.46 16.51 L 22.46 18.49 L 19.508 18.508 L 19.49 21.46 L 17.51 21.46 L 17.492 18.508 L 14.54 18.49 Z M 13.35 14.75 L 11 12.4 L 11 7 L 13 7 L 13 11.6 L 14.4 13 L 13.35 14.75 Z M 3 10 L 3 4 L 5 4 L 5 6.35 C 5.85 5.283 6.888 4.458 8.113 3.875 C 9.338 3.292 10.633 3 12 3 C 14.5 3 16.625 3.875 18.375 5.625 C 20.125 7.375 21 9.5 21 12 L 19 12 C 19 10.05 18.321 8.396 16.963 7.037 C 15.604 5.679 13.95 5 12 5 C 10.85 5 9.775 5.267 8.775 5.8 C 7.775 6.333 6.933 7.067 6.25 8 L 9 8 L 9 10 L 3 10 Z M 12 21 C 9.7 21 7.696 20.237 5.988 18.712 C 4.279 17.187 3.3 15.283 3.05 13 L 5.1 13 C 5.333 14.733 6.104 16.167 7.413 17.3 C 8.721 18.433 10.25 19 12 19 C 12.183 19 12.354 18.996 12.513 18.987 C 12.671 18.979 12.833 18.958 13 18.925 L 13 20.95 C 12.833 20.967 12.671 20.979 12.513 20.987 C 12.354 20.996 12.183 21 12 21 Z" style=""/>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB