Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4048314cf7 | ||
|
|
3dbd772847 | ||
|
|
3a08465c35 | ||
|
|
92e3669ee5 | ||
|
|
8b297f4768 | ||
|
|
42b7f1179b | ||
|
|
9d6854c282 | ||
|
|
d943b7deff | ||
|
|
a138da9d9b | ||
|
|
194338a0d2 | ||
|
|
7eb8fdcce1 | ||
|
|
2bf1796340 | ||
|
|
cc42015da2 | ||
|
|
648c39c439 | ||
|
|
8c25b05cda | ||
|
|
780bebc9d1 | ||
|
|
bf7eb7efd5 | ||
|
|
d00d08bae3 | ||
|
|
379256a7fe | ||
|
|
180339269f | ||
|
|
49af17cba8 | ||
|
|
a03a187d2d | ||
|
|
84806e70d7 | ||
|
|
058de5a141 | ||
|
|
d330fbd195 | ||
|
|
f5bc6f664f | ||
|
|
464279807c | ||
|
|
f7e5ef473a | ||
|
|
ff733ef59e | ||
|
|
35b110a472 | ||
|
|
58eabf4754 | ||
|
|
1f273a48a5 | ||
|
|
785a64725d | ||
|
|
7a42e1de73 | ||
|
|
9856ab7b6b | ||
|
|
746ff143d8 | ||
|
|
b0d4d94973 | ||
|
|
c604ad5ef2 | ||
|
|
91c2b324ac | ||
|
|
df59fd7446 | ||
|
|
449fd1f26c | ||
|
|
72d839c6e2 | ||
|
|
ab8c993a81 | ||
|
|
5f5bd913d6 | ||
|
|
92fe4dd55f | ||
|
|
dab95176f0 | ||
|
|
650503ba70 | ||
|
|
61078f214e | ||
|
|
a4b639edfe | ||
|
|
f37878dbb8 | ||
|
|
10fde7c3d6 | ||
|
|
a098fcb48c | ||
|
|
f162977640 | ||
|
|
66cab58d7b | ||
|
|
e99e2d7dcc | ||
|
|
9045a27a5d | ||
|
|
9e1208c72b | ||
|
|
90410f232a | ||
|
|
6769fa7e37 | ||
|
|
72444f5081 | ||
|
|
9a3ca4ffa3 | ||
|
|
f572923720 |
@@ -1,5 +1,37 @@
|
||||
# Change Log
|
||||
|
||||
## 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
|
||||
* Update French translation
|
||||
* Update Czech translation
|
||||
* Update Russian translation
|
||||
|
||||
## 1.61.1
|
||||
* Share scanned contents as a file
|
||||
* Recreate binary barcodes too
|
||||
* Add Bulgarian translation and Brave search engine
|
||||
* Update Russian translation
|
||||
* Fix general format restriction from preferences
|
||||
|
||||
## 1.61.0
|
||||
* Support encoding binary data
|
||||
* Add margin parameter for encoding
|
||||
* Add copying binary data as hex dump
|
||||
* Fix parsing TYPE argument in VCARDs
|
||||
* Update Russian translation
|
||||
* Update Brazilian Portuguese translation
|
||||
* Update Ukrainian translation
|
||||
* Update Chinese translation
|
||||
|
||||
## 1.60.3
|
||||
* Fix saving custom language
|
||||
* Update Brazilian Portuguese translation
|
||||
|
||||
@@ -33,6 +33,11 @@ testurl:
|
||||
-c android.intent.category.BROWSABLE \
|
||||
-d 'http://markusfisch.de/BinaryEye?ret=http%3A%2F%2Fmarkusfisch.de%2F%3Fresult%3D{RESULT}'
|
||||
|
||||
testxiaomi:
|
||||
adb shell am start -a android.intent.action.VIEW \
|
||||
-c android.intent.category.BROWSABLE \
|
||||
-d 'market://details?id=com.xiaomi.scanner'
|
||||
|
||||
install:
|
||||
adb $(TARGET) install -r app/build/outputs/apk/debug/app-debug.apk
|
||||
|
||||
|
||||
@@ -43,6 +43,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]
|
||||
@@ -150,6 +151,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
|
||||
|
||||
+12
-5
@@ -8,8 +8,8 @@ android {
|
||||
minSdkVersion 9
|
||||
targetSdkVersion sdk_version
|
||||
|
||||
versionCode 120
|
||||
versionName '1.60.3'
|
||||
versionCode 125
|
||||
versionName '1.62.1'
|
||||
}
|
||||
|
||||
signingConfigs {
|
||||
@@ -52,18 +52,25 @@ android {
|
||||
enableSplit = false
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
compileOptions {
|
||||
// Required for Gradle 8.
|
||||
sourceCompatibility = 17
|
||||
targetCompatibility = 17
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
testImplementation 'junit:junit:4.13.2'
|
||||
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
||||
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1"
|
||||
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4"
|
||||
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.1'
|
||||
implementation 'com.github.markusfisch:CameraView:1.9.2'
|
||||
implementation 'com.github.markusfisch:ScalingImageView:1.4.1'
|
||||
implementation 'com.github.markusfisch:zxing-cpp:v2.0.0.1'
|
||||
implementation 'com.github.markusfisch:zxing-cpp:v2.2.0.1'
|
||||
}
|
||||
|
||||
Vendored
-2
@@ -3,5 +3,3 @@
|
||||
-dontwarn android.support.v8.**
|
||||
|
||||
-keep class android.support.v7.widget.SearchView { *; }
|
||||
|
||||
-keep class de.markusfisch.android.zxingcpp.** { *; }
|
||||
|
||||
@@ -68,6 +68,13 @@
|
||||
<action android:name="com.google.zxing.client.android.SCAN"/>
|
||||
<category android:name="android.intent.category.DEFAULT"/>
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW"/>
|
||||
<category android:name="android.intent.category.DEFAULT"/>
|
||||
<category android:name="android.intent.category.BROWSABLE"/>
|
||||
<data android:host="details" android:scheme="market"
|
||||
android:pathSuffix="id=com.xiaomi.scanner"/>
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW"/>
|
||||
<category android:name="android.intent.category.DEFAULT"/>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package de.markusfisch.android.binaryeye.actions.vtype
|
||||
|
||||
import java.util.*
|
||||
import java.util.Locale
|
||||
|
||||
object VTypeParser {
|
||||
private const val BACKSLASH_R_LEGACY =
|
||||
@@ -39,6 +39,6 @@ data class VTypeProperty(
|
||||
} ?: this.info.firstOrNull()
|
||||
|
||||
companion object {
|
||||
private val typeRegex = """^(?:TYPE=)(.+?)[:;]?.*$""".toRegex(RegexOption.IGNORE_CASE)
|
||||
private val typeRegex = """^TYPE=([A-Z_]+)[:;]?.*$""".toRegex(RegexOption.IGNORE_CASE)
|
||||
}
|
||||
}
|
||||
|
||||
+8
-2
@@ -8,7 +8,7 @@ import android.provider.ContactsContract
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.actions.IntentAction
|
||||
import de.markusfisch.android.binaryeye.actions.vtype.VTypeParser
|
||||
import java.util.*
|
||||
import java.util.Locale
|
||||
|
||||
object VCardAction : IntentAction() {
|
||||
override val iconResId: Int
|
||||
@@ -45,10 +45,13 @@ object VCardAction : IntentAction() {
|
||||
val (extraPhoneType, extraPhone) = when (index) {
|
||||
0 -> ContactsContract.Intents.Insert.PHONE_TYPE to
|
||||
ContactsContract.Intents.Insert.PHONE
|
||||
|
||||
1 -> ContactsContract.Intents.Insert.SECONDARY_PHONE_TYPE to
|
||||
ContactsContract.Intents.Insert.SECONDARY_PHONE
|
||||
|
||||
2 -> ContactsContract.Intents.Insert.TERTIARY_PHONE_TYPE to
|
||||
ContactsContract.Intents.Insert.TERTIARY_PHONE_TYPE
|
||||
|
||||
else -> return@forEachIndexed
|
||||
}
|
||||
phoneProperty.firstTypeOrFirstInfo?.also {
|
||||
@@ -65,10 +68,13 @@ object VCardAction : IntentAction() {
|
||||
val (extraMailType, extraMail) = when (index) {
|
||||
0 -> ContactsContract.Intents.Insert.EMAIL_TYPE to
|
||||
ContactsContract.Intents.Insert.EMAIL
|
||||
|
||||
1 -> ContactsContract.Intents.Insert.SECONDARY_EMAIL_TYPE to
|
||||
ContactsContract.Intents.Insert.SECONDARY_EMAIL
|
||||
|
||||
2 -> ContactsContract.Intents.Insert.TERTIARY_EMAIL_TYPE to
|
||||
ContactsContract.Intents.Insert.TERTIARY_EMAIL
|
||||
|
||||
else -> return@forEachIndexed
|
||||
}
|
||||
mailProperty.firstTypeOrFirstInfo?.also {
|
||||
@@ -184,7 +190,7 @@ object VCardAction : IntentAction() {
|
||||
}
|
||||
|
||||
private val String.addressType: Int?
|
||||
get() = when (this.toUpperCase(Locale.US)) {
|
||||
get() = when (this.uppercase()) {
|
||||
"HOME" -> ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME
|
||||
"WORK" -> ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK
|
||||
"OTHER" -> ContactsContract.CommonDataKinds.StructuredPostal.TYPE_OTHER
|
||||
|
||||
@@ -22,10 +22,9 @@ object WifiAction : IAction {
|
||||
context: Context,
|
||||
data: ByteArray
|
||||
) = withContext(Dispatchers.IO) {
|
||||
val wifiConfig = WifiConnector.parse(
|
||||
String(data)
|
||||
) ?: return@withContext
|
||||
val message = WifiConnector.addNetwork(context, wifiConfig)
|
||||
val message = WifiConnector.parse(String(data))?.let {
|
||||
WifiConnector.addNetwork(context, it)
|
||||
} ?: R.string.wifi_config_failed
|
||||
withContext(Dispatchers.Main) {
|
||||
context.toast(message)
|
||||
}
|
||||
|
||||
@@ -44,14 +44,21 @@ object WifiConnector {
|
||||
passwordBlock?.apply {
|
||||
invoke(parsedData.password)
|
||||
}
|
||||
return if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q) {
|
||||
// WifiConfiguration is deprecated in Android Q but
|
||||
// because it's only possible in R to query network
|
||||
// suggestions, we still use the deprecated API on Q.
|
||||
@Suppress("DEPRECATION")
|
||||
WifiConfiguration().apply(parsedData)
|
||||
} else {
|
||||
WifiNetworkSuggestion.Builder().apply(parsedData)
|
||||
return try {
|
||||
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q) {
|
||||
// WifiConfiguration is deprecated in Android Q but
|
||||
// because it's only possible in R to query network
|
||||
// suggestions, we still use the deprecated API on Q.
|
||||
@Suppress("DEPRECATION")
|
||||
WifiConfiguration().apply(parsedData)
|
||||
} else {
|
||||
WifiNetworkSuggestion.Builder().apply(parsedData)
|
||||
}
|
||||
} catch (e: IllegalArgumentException) {
|
||||
// Some arguments may be out of range, e.g. SSIDs cannot
|
||||
// be longer than 32 characters in some versions of Android.
|
||||
// See: https://github.com/markusfisch/BinaryEye/issues/402
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
@@ -169,6 +176,7 @@ object WifiConnector {
|
||||
"WPA", "WPA2" -> {
|
||||
data.password?.let { setWpa2Passphrase(it) }
|
||||
}
|
||||
|
||||
"WPA2-EAP" -> {
|
||||
setWpa2EnterpriseConfig(WifiEnterpriseConfig().apply {
|
||||
identity = data.identity
|
||||
@@ -178,9 +186,11 @@ object WifiConnector {
|
||||
data.phase2Method?.let { phase2Method = it }
|
||||
})
|
||||
}
|
||||
|
||||
"WPA3" -> {
|
||||
data.password?.let { setWpa3Passphrase(it) }
|
||||
}
|
||||
|
||||
"WPA3-EAP" -> {
|
||||
setWpa3EnterpriseConfig(WifiEnterpriseConfig().apply {
|
||||
identity = data.identity
|
||||
@@ -240,6 +250,7 @@ object WifiConnector {
|
||||
allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40)
|
||||
allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104)
|
||||
}
|
||||
|
||||
"WPA" -> {
|
||||
passwordWithQuotes?.let {
|
||||
preSharedKey = it
|
||||
@@ -256,6 +267,7 @@ object WifiConnector {
|
||||
allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP)
|
||||
allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP)
|
||||
}
|
||||
|
||||
"WPA2-EAP" -> requireSdk(Build.VERSION_CODES.JELLY_BEAN_MR2) {
|
||||
passwordWithQuotes?.let {
|
||||
preSharedKey = it
|
||||
|
||||
@@ -43,10 +43,9 @@ 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.Binarizer
|
||||
import de.markusfisch.android.zxingcpp.ZxingCpp.DecodeHints
|
||||
import de.markusfisch.android.zxingcpp.ZxingCpp.Format
|
||||
import de.markusfisch.android.zxingcpp.ZxingCpp.ReaderOptions
|
||||
import de.markusfisch.android.zxingcpp.ZxingCpp.BarcodeFormat
|
||||
import de.markusfisch.android.zxingcpp.ZxingCpp.Result
|
||||
import java.nio.charset.Charset
|
||||
import kotlin.math.max
|
||||
import kotlin.math.min
|
||||
import kotlin.math.roundToInt
|
||||
@@ -60,7 +59,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
|
||||
@@ -169,7 +168,7 @@ class CameraActivity : AppCompatActivity() {
|
||||
} else {
|
||||
setTitle(R.string.scan_code)
|
||||
prefs.barcodeFormats
|
||||
}
|
||||
}.toFormatSet()
|
||||
}
|
||||
|
||||
private fun setReturnTarget(intent: Intent?) {
|
||||
@@ -177,6 +176,7 @@ class CameraActivity : AppCompatActivity() {
|
||||
intent?.action == "com.google.zxing.client.android.SCAN" -> {
|
||||
returnResult = true
|
||||
}
|
||||
|
||||
intent?.dataString?.isReturnUrl() == true -> {
|
||||
finishAfterShowingResult = true
|
||||
returnUrlTemplate = intent.data?.getQueryParameter("ret")
|
||||
@@ -245,44 +245,52 @@ class CameraActivity : AppCompatActivity() {
|
||||
createBarcode()
|
||||
true
|
||||
}
|
||||
|
||||
R.id.history -> {
|
||||
startActivity(MainActivity.getHistoryIntent(this))
|
||||
true
|
||||
}
|
||||
|
||||
R.id.pick_file -> {
|
||||
startActivityForResult(
|
||||
Intent.createChooser(
|
||||
Intent(Intent.ACTION_GET_CONTENT).apply {
|
||||
type = "image/*"
|
||||
},
|
||||
getString(R.string.pick_file)
|
||||
getString(R.string.pick_image_file)
|
||||
),
|
||||
PICK_FILE_RESULT_CODE
|
||||
)
|
||||
true
|
||||
}
|
||||
|
||||
R.id.switch_camera -> {
|
||||
switchCamera()
|
||||
true
|
||||
}
|
||||
|
||||
R.id.bulk_mode -> {
|
||||
bulkMode = bulkMode xor true
|
||||
item.isChecked = bulkMode
|
||||
ignoreNext = null
|
||||
true
|
||||
}
|
||||
|
||||
R.id.restrict_format -> {
|
||||
showRestrictionDialog()
|
||||
true
|
||||
}
|
||||
|
||||
R.id.preferences -> {
|
||||
startActivity(MainActivity.getPreferencesIntent(this))
|
||||
true
|
||||
}
|
||||
|
||||
R.id.info -> {
|
||||
openReadme()
|
||||
true
|
||||
}
|
||||
|
||||
else -> super.onOptionsItemSelected(item)
|
||||
}
|
||||
}
|
||||
@@ -351,6 +359,7 @@ class CameraActivity : AppCompatActivity() {
|
||||
progress = zoomBar.progress
|
||||
return true
|
||||
}
|
||||
|
||||
MotionEvent.ACTION_MOVE -> {
|
||||
if (prefs.zoomBySwiping) {
|
||||
v ?: return false
|
||||
@@ -364,6 +373,7 @@ class CameraActivity : AppCompatActivity() {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
MotionEvent.ACTION_UP -> {
|
||||
// Stop calling focusTo() as soon as it returns false
|
||||
// to avoid throwing and catching future exceptions.
|
||||
@@ -423,7 +433,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,
|
||||
@@ -440,7 +450,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.
|
||||
@@ -449,7 +459,7 @@ class CameraActivity : AppCompatActivity() {
|
||||
} else {
|
||||
Binarizer.GLOBAL_HISTOGRAM
|
||||
}
|
||||
formats = formatsToRead.joinToString()
|
||||
formats = formatsToRead
|
||||
}
|
||||
)?.let { results ->
|
||||
val result = results.first()
|
||||
@@ -590,9 +600,11 @@ class CameraActivity : AppCompatActivity() {
|
||||
setResult(Activity.RESULT_OK, getReturnIntent(result))
|
||||
finish()
|
||||
}
|
||||
|
||||
returnUri != null -> execShareIntent(
|
||||
Intent(Intent.ACTION_VIEW, returnUri)
|
||||
)
|
||||
|
||||
else -> {
|
||||
showResult(result, bulkMode)
|
||||
// If this app was invoked via a deep link but without
|
||||
@@ -627,6 +639,10 @@ class CameraActivity : AppCompatActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
fun Set<String>.toFormatSet(): Set<BarcodeFormat> = map {
|
||||
BarcodeFormat.valueOf(it)
|
||||
}.toSet()
|
||||
|
||||
fun Activity.showResult(
|
||||
result: Result,
|
||||
bulkMode: Boolean = false,
|
||||
@@ -672,10 +688,12 @@ fun Activity.showResult(
|
||||
errorFeedback()
|
||||
R.string.bluetooth_connect_fail
|
||||
}
|
||||
|
||||
!sent -> {
|
||||
errorFeedback()
|
||||
R.string.bluetooth_send_fail
|
||||
}
|
||||
|
||||
else -> R.string.bluetooth_send_success
|
||||
}
|
||||
)
|
||||
@@ -708,9 +726,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())
|
||||
)
|
||||
|
||||
@@ -9,7 +9,12 @@ import android.support.v4.app.Fragment
|
||||
import android.support.v7.app.AppCompatActivity
|
||||
import android.support.v7.widget.Toolbar
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.app.*
|
||||
import de.markusfisch.android.binaryeye.app.PERMISSION_LOCATION
|
||||
import de.markusfisch.android.binaryeye.app.PERMISSION_WRITE
|
||||
import de.markusfisch.android.binaryeye.app.applyLocale
|
||||
import de.markusfisch.android.binaryeye.app.permissionGrantedCallback
|
||||
import de.markusfisch.android.binaryeye.app.prefs
|
||||
import de.markusfisch.android.binaryeye.app.setFragment
|
||||
import de.markusfisch.android.binaryeye.database.Scan
|
||||
import de.markusfisch.android.binaryeye.fragment.DecodeFragment
|
||||
import de.markusfisch.android.binaryeye.fragment.EncodeFragment
|
||||
@@ -83,9 +88,11 @@ class MainActivity : AppCompatActivity() {
|
||||
intent.hasExtra(ENCODE) -> EncodeFragment.newInstance(
|
||||
intent.getStringExtra(ENCODE)
|
||||
)
|
||||
|
||||
intent.hasExtra(DECODED) -> DecodeFragment.newInstance(
|
||||
intent.getParcelableExtra(DECODED)!!
|
||||
)
|
||||
|
||||
else -> PreferencesFragment()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,15 +21,23 @@ import de.markusfisch.android.binaryeye.graphics.fixTransparency
|
||||
import de.markusfisch.android.binaryeye.graphics.loadImageUri
|
||||
import de.markusfisch.android.binaryeye.graphics.mapPosition
|
||||
import de.markusfisch.android.binaryeye.media.releaseToneGenerators
|
||||
import de.markusfisch.android.binaryeye.view.*
|
||||
import de.markusfisch.android.binaryeye.view.colorSystemAndToolBars
|
||||
import de.markusfisch.android.binaryeye.view.initSystemBars
|
||||
import de.markusfisch.android.binaryeye.view.recordToolbarHeight
|
||||
import de.markusfisch.android.binaryeye.view.scanFeedback
|
||||
import de.markusfisch.android.binaryeye.view.setPaddingFromWindowInsets
|
||||
import de.markusfisch.android.binaryeye.widget.CropImageView
|
||||
import de.markusfisch.android.binaryeye.widget.DetectorView
|
||||
import de.markusfisch.android.binaryeye.widget.toast
|
||||
import de.markusfisch.android.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.*
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.Job
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import kotlin.math.max
|
||||
import kotlin.math.min
|
||||
import kotlin.math.roundToInt
|
||||
@@ -38,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
|
||||
@@ -171,7 +179,7 @@ class PickActivity : AppCompatActivity() {
|
||||
0, 0,
|
||||
width, height,
|
||||
0,
|
||||
decodeHints.apply {
|
||||
options.apply {
|
||||
binarizer = Binarizer.LOCAL_AVERAGE
|
||||
}
|
||||
) ?: ZxingCpp.readBitmap(
|
||||
@@ -179,7 +187,7 @@ class PickActivity : AppCompatActivity() {
|
||||
0, 0,
|
||||
width, height,
|
||||
0,
|
||||
decodeHints.apply {
|
||||
options.apply {
|
||||
binarizer = Binarizer.GLOBAL_HISTOGRAM
|
||||
}
|
||||
)
|
||||
@@ -205,12 +213,14 @@ class PickActivity : AppCompatActivity() {
|
||||
rotateClockwise()
|
||||
true
|
||||
}
|
||||
|
||||
R.id.toggle_free -> {
|
||||
prefs.freeRotation = prefs.freeRotation xor true
|
||||
cropImageView.freeRotation = prefs.freeRotation
|
||||
freeRotationItem.updateFreeRotationIcon()
|
||||
true
|
||||
}
|
||||
|
||||
else -> super.onOptionsItemSelected(item)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ import de.markusfisch.android.binaryeye.database.Database
|
||||
import java.text.DateFormat
|
||||
import java.text.ParseException
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
import java.util.Locale
|
||||
|
||||
class ScansAdapter(context: Context, cursor: Cursor) :
|
||||
CursorAdapter(context, cursor, false) {
|
||||
@@ -99,9 +99,11 @@ class ScansAdapter(context: Context, cursor: Cursor) :
|
||||
icon = R.drawable.ic_label
|
||||
name
|
||||
}
|
||||
content?.isEmpty() == true -> context.getString(
|
||||
|
||||
content.isNullOrEmpty() -> context.getString(
|
||||
R.string.binary_data
|
||||
)
|
||||
|
||||
else -> content
|
||||
}
|
||||
contentView.setCompoundDrawablesWithIntrinsicBounds(
|
||||
|
||||
@@ -11,7 +11,7 @@ import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import java.io.IOException
|
||||
import java.io.OutputStreamWriter
|
||||
import java.util.*
|
||||
import java.util.UUID
|
||||
|
||||
fun Scan.sendBluetoothAsync(
|
||||
host: String,
|
||||
|
||||
@@ -10,6 +10,8 @@ import de.markusfisch.android.binaryeye.BuildConfig
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.widget.toast
|
||||
import java.io.File
|
||||
import java.io.FileOutputStream
|
||||
import java.io.IOException
|
||||
|
||||
fun Context.execShareIntent(intent: Intent): Boolean = if (
|
||||
!startIntent(intent)
|
||||
@@ -59,6 +61,44 @@ fun Context.shareText(text: String, mimeType: String = "text/plain") {
|
||||
})
|
||||
}
|
||||
|
||||
private var lastShareFile: File? = null
|
||||
fun wipeLastShareFile() {
|
||||
lastShareFile?.let {
|
||||
it.delete()
|
||||
lastShareFile = null
|
||||
}
|
||||
}
|
||||
|
||||
fun <T> Context.shareAsFile(content: T, fileName: String) {
|
||||
val (bytes, mimeType) = when (content) {
|
||||
is ByteArray -> Pair(
|
||||
content,
|
||||
"text/plain"
|
||||
)
|
||||
|
||||
is String -> Pair(
|
||||
content.toByteArray(),
|
||||
"application/octet-stream"
|
||||
)
|
||||
|
||||
else -> throw IllegalArgumentException(
|
||||
"Unsupported content text for shareAsFile()"
|
||||
)
|
||||
}
|
||||
wipeLastShareFile()
|
||||
val file = File(externalCacheDir, fileName)
|
||||
try {
|
||||
FileOutputStream(file).use {
|
||||
it.write(bytes)
|
||||
}
|
||||
} catch (e: IOException) {
|
||||
toast(R.string.error_saving_file)
|
||||
return
|
||||
}
|
||||
lastShareFile = file
|
||||
shareFile(file, mimeType)
|
||||
}
|
||||
|
||||
fun Context.shareFile(file: File, mimeType: String) {
|
||||
getUriForFile(file)?.let {
|
||||
shareUri(it, mimeType)
|
||||
|
||||
@@ -6,6 +6,7 @@ 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.zxingcpp.ZxingCpp.BarcodeFormat
|
||||
|
||||
class Database {
|
||||
private lateinit var db: SQLiteDatabase
|
||||
@@ -69,6 +70,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 +118,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),
|
||||
@@ -117,14 +141,11 @@ class Database {
|
||||
null,
|
||||
ContentValues().apply {
|
||||
put(SCANS_DATETIME, scan.dateTime)
|
||||
val isRaw = scan.raw != null
|
||||
if (isRaw) {
|
||||
put(SCANS_CONTENT, "")
|
||||
put(SCANS_CONTENT, scan.content)
|
||||
if (scan.raw != null) {
|
||||
put(SCANS_RAW, scan.raw)
|
||||
} else {
|
||||
put(SCANS_CONTENT, scan.content)
|
||||
}
|
||||
put(SCANS_FORMAT, scan.format)
|
||||
put(SCANS_FORMAT, scan.format.name)
|
||||
scan.errorCorrectionLevel?.let {
|
||||
put(SCANS_ERROR_CORRECTION_LEVEL, it)
|
||||
}
|
||||
@@ -139,7 +160,7 @@ class Database {
|
||||
if (prefs.ignoreConsecutiveDuplicates) {
|
||||
val id = getIdOfLastScan(
|
||||
get(SCANS_CONTENT) as String,
|
||||
if (isRaw) get(SCANS_RAW) as ByteArray else null,
|
||||
get(SCANS_RAW) as ByteArray?,
|
||||
scan.format
|
||||
)
|
||||
if (id > 0L) {
|
||||
@@ -152,7 +173,7 @@ class Database {
|
||||
private fun getIdOfLastScan(
|
||||
content: String,
|
||||
raw: ByteArray?,
|
||||
format: String
|
||||
format: BarcodeFormat
|
||||
): Long = db.rawQuery(
|
||||
"""SELECT
|
||||
$SCANS_ID,
|
||||
@@ -169,7 +190,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 {
|
||||
|
||||
@@ -7,13 +7,13 @@ import android.os.Parcelable
|
||||
import android.text.format.DateFormat
|
||||
import de.markusfisch.android.zxingcpp.ZxingCpp
|
||||
import de.markusfisch.android.zxingcpp.ZxingCpp.ContentType
|
||||
import de.markusfisch.android.zxingcpp.ZxingCpp.Format
|
||||
import de.markusfisch.android.zxingcpp.ZxingCpp.BarcodeFormat
|
||||
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,
|
||||
@@ -78,7 +78,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(),
|
||||
@@ -96,7 +96,7 @@ data class Scan(
|
||||
parcel.apply {
|
||||
writeString(content)
|
||||
writeSizedByteArray(raw)
|
||||
writeString(format)
|
||||
writeString(format.name)
|
||||
writeString(errorCorrectionLevel)
|
||||
writeString(version)
|
||||
writeInt(sequenceSize)
|
||||
@@ -123,23 +123,15 @@ data class Scan(
|
||||
}
|
||||
|
||||
fun Result.toScan(): Scan {
|
||||
val content: String
|
||||
val raw: ByteArray?
|
||||
when (contentType) {
|
||||
ContentType.GS1,
|
||||
ContentType.ISO15434,
|
||||
ContentType.TEXT -> {
|
||||
content = text
|
||||
raw = null
|
||||
}
|
||||
else -> {
|
||||
content = ""
|
||||
raw = rawBytes
|
||||
}
|
||||
}
|
||||
return Scan(
|
||||
content,
|
||||
raw,
|
||||
when (contentType) {
|
||||
ContentType.GS1,
|
||||
ContentType.ISO15434,
|
||||
ContentType.TEXT -> text
|
||||
|
||||
else -> ""
|
||||
},
|
||||
rawBytes,
|
||||
format,
|
||||
ecLevel,
|
||||
version,
|
||||
@@ -154,12 +146,12 @@ fun Result.toScan(): Scan {
|
||||
}
|
||||
|
||||
data class Recreation(
|
||||
val format: Format,
|
||||
val format: BarcodeFormat,
|
||||
val ecLevel: Int,
|
||||
val size: Int,
|
||||
val margin: Int
|
||||
) {
|
||||
fun encode(content: String): Bitmap? = try {
|
||||
fun <T> encode(content: T): Bitmap? = try {
|
||||
ZxingCpp.encodeAsBitmap(
|
||||
content, format, size, size, margin, ecLevel
|
||||
)
|
||||
@@ -171,22 +163,18 @@ data class Recreation(
|
||||
fun Scan.toRecreation(
|
||||
size: Int = 128,
|
||||
margin: Int = -1
|
||||
) = if (content.isEmpty()) {
|
||||
null
|
||||
} else {
|
||||
Recreation(
|
||||
Format.valueOf(format),
|
||||
when (errorCorrectionLevel) {
|
||||
"L" -> 0
|
||||
"M" -> 4
|
||||
"Q" -> 6
|
||||
"H" -> 8
|
||||
else -> -1
|
||||
},
|
||||
size,
|
||||
margin
|
||||
)
|
||||
}
|
||||
) = Recreation(
|
||||
format,
|
||||
when (errorCorrectionLevel) {
|
||||
"L" -> 0
|
||||
"M" -> 4
|
||||
"Q" -> 6
|
||||
"H" -> 8
|
||||
else -> -1
|
||||
},
|
||||
size,
|
||||
margin
|
||||
)
|
||||
|
||||
private fun getDateTime(
|
||||
time: Long = System.currentTimeMillis()
|
||||
|
||||
@@ -24,7 +24,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
|
||||
@@ -41,7 +41,7 @@ class BarcodeFragment : Fragment() {
|
||||
private val parentJob = Job()
|
||||
private val scope = CoroutineScope(Dispatchers.IO + parentJob)
|
||||
|
||||
private lateinit var barcode: Barcode
|
||||
private lateinit var barcode: Barcode<*>
|
||||
|
||||
override fun onCreate(state: Bundle?) {
|
||||
super.onCreate(state)
|
||||
@@ -71,7 +71,7 @@ class BarcodeFragment : Fragment() {
|
||||
bitmap = barcode.bitmap()
|
||||
} catch (e: Exception) {
|
||||
var message = e.message
|
||||
if (message == null || message.isEmpty()) {
|
||||
if (message.isNullOrEmpty()) {
|
||||
message = getString(R.string.error_encoding_barcode)
|
||||
}
|
||||
message?.let {
|
||||
@@ -110,15 +110,16 @@ class BarcodeFragment : Fragment() {
|
||||
}
|
||||
|
||||
private fun Bundle.toBarcode() = Barcode(
|
||||
getString(CONTENT) ?: throw IllegalArgumentException(
|
||||
getString(CONTENT_TEXT) ?: getByteArray(CONTENT_RAW) ?: throw IllegalArgumentException(
|
||||
"content cannot be null"
|
||||
),
|
||||
Format.valueOf(
|
||||
BarcodeFormat.valueOf(
|
||||
getString(FORMAT) ?: throw IllegalArgumentException(
|
||||
"format cannot be null"
|
||||
)
|
||||
),
|
||||
getInt(SIZE),
|
||||
getInt(MARGIN),
|
||||
getInt(EC_LEVEL),
|
||||
Colors.values()[getInt(COLORS)]
|
||||
)
|
||||
@@ -141,12 +142,14 @@ class BarcodeFragment : Fragment() {
|
||||
}
|
||||
true
|
||||
}
|
||||
|
||||
R.id.export_to_file -> {
|
||||
context.pickFileType(R.string.export_as) {
|
||||
askForFileNameAndSave(it)
|
||||
}
|
||||
true
|
||||
}
|
||||
|
||||
else -> super.onOptionsItemSelected(item)
|
||||
}
|
||||
}
|
||||
@@ -190,12 +193,14 @@ class BarcodeFragment : Fragment() {
|
||||
) {
|
||||
barcode.bitmap().saveAsPng(it)
|
||||
}
|
||||
|
||||
FileType.SVG -> saveAs(
|
||||
addSuffixIfNotGiven(fileName, ".svg"),
|
||||
MIME_SVG
|
||||
) { outputStream ->
|
||||
outputStream.write(barcode.svg().toByteArray())
|
||||
}
|
||||
|
||||
FileType.TXT -> saveAs(
|
||||
addSuffixIfNotGiven(fileName, ".txt"),
|
||||
MIME_TXT
|
||||
@@ -256,26 +261,44 @@ class BarcodeFragment : Fragment() {
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val CONTENT = "content"
|
||||
private const val CONTENT_TEXT = "content_text"
|
||||
private const val CONTENT_RAW = "content_raw"
|
||||
private const val FORMAT = "format"
|
||||
private const val SIZE = "size"
|
||||
private const val MARGIN = "margin"
|
||||
private const val EC_LEVEL = "ec_level"
|
||||
private const val COLORS = "colors"
|
||||
private const val MIME_PNG = "image/png"
|
||||
private const val MIME_SVG = "image/svg+xmg"
|
||||
private const val MIME_TXT = "text/plain"
|
||||
|
||||
fun newInstance(
|
||||
content: String,
|
||||
format: Format,
|
||||
fun <T> newInstance(
|
||||
content: T,
|
||||
format: BarcodeFormat,
|
||||
size: Int,
|
||||
margin: Int,
|
||||
ecLevel: Int = -1,
|
||||
colors: Int = 0
|
||||
): Fragment {
|
||||
val args = Bundle()
|
||||
args.putString(CONTENT, content)
|
||||
when (content) {
|
||||
is String -> {
|
||||
args.putString(CONTENT_TEXT, content)
|
||||
}
|
||||
|
||||
is ByteArray -> {
|
||||
args.putByteArray(CONTENT_RAW, content)
|
||||
}
|
||||
|
||||
else -> {
|
||||
throw IllegalArgumentException(
|
||||
"content must be a String of a ByteArray"
|
||||
)
|
||||
}
|
||||
}
|
||||
args.putString(FORMAT, format.name)
|
||||
args.putInt(SIZE, size)
|
||||
args.putInt(MARGIN, margin)
|
||||
args.putInt(EC_LEVEL, ecLevel)
|
||||
args.putInt(COLORS, colors)
|
||||
val fragment = BarcodeFragment()
|
||||
@@ -285,17 +308,18 @@ class BarcodeFragment : Fragment() {
|
||||
}
|
||||
}
|
||||
|
||||
private data class Barcode(
|
||||
val content: String,
|
||||
val format: Format,
|
||||
private data class Barcode<T>(
|
||||
val content: T,
|
||||
val format: BarcodeFormat,
|
||||
val size: Int,
|
||||
val margin: Int,
|
||||
val ecLevel: Int,
|
||||
val colors: Colors
|
||||
) {
|
||||
private var _bitmap: Bitmap? = null
|
||||
fun bitmap(): Bitmap {
|
||||
val b = _bitmap ?: ZxingCpp.encodeAsBitmap(
|
||||
content, format, size, size, -1, ecLevel,
|
||||
content, format, size, size, margin, ecLevel,
|
||||
setColor = colors.foregroundColor(),
|
||||
unsetColor = colors.backgroundColor()
|
||||
)
|
||||
@@ -306,7 +330,7 @@ private data class Barcode(
|
||||
private var _svg: String? = null
|
||||
fun svg(): String {
|
||||
val s = _svg ?: ZxingCpp.encodeAsSvg(
|
||||
content, format, -1, ecLevel
|
||||
content, format, margin, ecLevel
|
||||
)
|
||||
_svg = s
|
||||
return s
|
||||
@@ -315,7 +339,7 @@ private data class Barcode(
|
||||
private var _text: String? = null
|
||||
fun text(): String {
|
||||
val t = _text ?: ZxingCpp.encodeAsText(
|
||||
content, format, -1, ecLevel,
|
||||
content, format, margin, ecLevel,
|
||||
inverted = colors == Colors.BLACK_ON_WHITE
|
||||
)
|
||||
_text = t
|
||||
@@ -332,6 +356,7 @@ private enum class Colors {
|
||||
fun foregroundColor(): Int = when (this) {
|
||||
BLACK_ON_WHITE,
|
||||
BLACK_ON_TRANSPARENT -> COLOR_BLACK
|
||||
|
||||
WHITE_ON_BLACK,
|
||||
WHITE_ON_TRANSPARENT -> COLOR_WHITE
|
||||
}
|
||||
|
||||
@@ -19,8 +19,10 @@ 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.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.wipeLastShareFile
|
||||
import de.markusfisch.android.binaryeye.database.Recreation
|
||||
import de.markusfisch.android.binaryeye.database.Scan
|
||||
import de.markusfisch.android.binaryeye.database.toRecreation
|
||||
@@ -86,9 +88,9 @@ class DecodeFragment : Fragment() {
|
||||
} ?: throw IllegalArgumentException("DecodeFragment needs a Scan")
|
||||
|
||||
val originalContent = scan.content
|
||||
isBinary = scan.raw != null
|
||||
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)
|
||||
@@ -124,6 +126,7 @@ class DecodeFragment : Fragment() {
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
parentJob.cancel()
|
||||
wipeLastShareFile()
|
||||
}
|
||||
|
||||
private fun initContentAndFab(originalContent: String) {
|
||||
@@ -204,11 +207,12 @@ class DecodeFragment : Fragment() {
|
||||
}
|
||||
recreationView.showIf(prefs.showRecreation) { v ->
|
||||
val r = recreation ?: return@showIf
|
||||
v.setImageBitmap(r.encode(text))
|
||||
val content = if (isBinary) bytes else text
|
||||
v.setImageBitmap(r.encode(content))
|
||||
v.setOnClickListener {
|
||||
fragmentManager?.addFragment(
|
||||
BarcodeFragment.newInstance(
|
||||
text,
|
||||
content,
|
||||
r.format,
|
||||
r.size,
|
||||
r.ecLevel
|
||||
@@ -254,7 +258,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,
|
||||
@@ -299,10 +303,6 @@ class DecodeFragment : Fragment() {
|
||||
|
||||
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
|
||||
inflater.inflate(R.menu.fragment_decode, menu)
|
||||
if (isBinary) {
|
||||
menu.findItem(R.id.copy_to_clipboard).isVisible = false
|
||||
menu.findItem(R.id.create).isVisible = false
|
||||
}
|
||||
if (id > 0L) {
|
||||
menu.findItem(R.id.remove).isVisible = true
|
||||
}
|
||||
@@ -318,11 +318,13 @@ class DecodeFragment : Fragment() {
|
||||
maybeBackOrFinish()
|
||||
true
|
||||
}
|
||||
|
||||
R.id.copy_to_clipboard -> {
|
||||
copyToClipboard(textOrHex())
|
||||
maybeBackOrFinish()
|
||||
true
|
||||
}
|
||||
|
||||
R.id.share -> {
|
||||
context?.apply {
|
||||
shareText(textOrHex())
|
||||
@@ -330,17 +332,36 @@ class DecodeFragment : Fragment() {
|
||||
}
|
||||
true
|
||||
}
|
||||
|
||||
R.id.share_file -> {
|
||||
context?.apply {
|
||||
val (data, name) = if (isBinary) {
|
||||
Pair(originalBytes, "barcode_content.bin")
|
||||
} else {
|
||||
Pair(content, "barcode_content.txt")
|
||||
}
|
||||
shareAsFile(data, name)
|
||||
maybeBackOrFinish()
|
||||
}
|
||||
true
|
||||
}
|
||||
|
||||
R.id.create -> {
|
||||
fragmentManager?.addFragment(
|
||||
EncodeFragment.newInstance(content, format)
|
||||
EncodeFragment.newInstance(
|
||||
if (isBinary) originalBytes else content,
|
||||
format
|
||||
)
|
||||
)
|
||||
true
|
||||
}
|
||||
|
||||
R.id.remove -> {
|
||||
db.removeScan(id)
|
||||
backOrFinish()
|
||||
true
|
||||
}
|
||||
|
||||
else -> super.onOptionsItemSelected(item)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,24 @@
|
||||
package de.markusfisch.android.binaryeye.fragment
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.support.v4.app.Fragment
|
||||
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.*
|
||||
import android.widget.AdapterView
|
||||
import android.widget.ArrayAdapter
|
||||
import android.widget.CheckBox
|
||||
import android.widget.EditText
|
||||
import android.widget.SeekBar
|
||||
import android.widget.Spinner
|
||||
import android.widget.TextView
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.adapter.prettifyFormatName
|
||||
import de.markusfisch.android.binaryeye.app.addFragment
|
||||
@@ -15,7 +27,10 @@ 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
|
||||
|
||||
class EncodeFragment : Fragment() {
|
||||
private lateinit var formatView: Spinner
|
||||
@@ -25,23 +40,57 @@ class EncodeFragment : Fragment() {
|
||||
private lateinit var colorsSpinner: Spinner
|
||||
private lateinit var sizeView: TextView
|
||||
private lateinit var sizeBarView: SeekBar
|
||||
private lateinit var marginLayout: View
|
||||
private lateinit var marginView: TextView
|
||||
private lateinit var marginBarView: SeekBar
|
||||
private lateinit var contentView: EditText
|
||||
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
|
||||
private var bytes: ByteArray? = null
|
||||
|
||||
override fun onActivityResult(
|
||||
requestCode: Int,
|
||||
resultCode: Int,
|
||||
resultData: Intent?
|
||||
) {
|
||||
when (requestCode) {
|
||||
PICK_FILE_RESULT_CODE -> {
|
||||
if (resultCode == Activity.RESULT_OK &&
|
||||
resultData != null &&
|
||||
resultData.data != null
|
||||
) {
|
||||
val ac = activity ?: return
|
||||
ac.hideSoftKeyboard(contentView)
|
||||
val uri = resultData.data ?: return
|
||||
bytes = ac.contentResolver?.openInputStream(uri)?.use {
|
||||
it.readBytesMax(4096)
|
||||
} ?: return
|
||||
setEncodeByteArray()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreate(state: Bundle?) {
|
||||
super.onCreate(state)
|
||||
setHasOptionsMenu(true)
|
||||
}
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater,
|
||||
container: ViewGroup?,
|
||||
@@ -75,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) {
|
||||
@@ -91,10 +140,17 @@ class EncodeFragment : Fragment() {
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}.setVisibility(ecLabel, ecSpinner)
|
||||
format.canBeInverted().setVisibility(
|
||||
}.setVisibilityFor(ecLabel, ecSpinner)
|
||||
format.canBeInverted().setVisibilityFor(
|
||||
colorsLabel, colorsSpinner
|
||||
)
|
||||
when (format) {
|
||||
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)
|
||||
}
|
||||
|
||||
override fun onNothingSelected(parentView: AdapterView<*>?) {}
|
||||
@@ -126,14 +182,23 @@ class EncodeFragment : Fragment() {
|
||||
sizeBarView = view.findViewById(R.id.size_bar)
|
||||
initSizeBar()
|
||||
|
||||
marginLayout = view.findViewById(R.id.margin)
|
||||
marginView = view.findViewById(R.id.margin_display)
|
||||
marginBarView = view.findViewById(R.id.margin_bar)
|
||||
initMarginBar()
|
||||
|
||||
contentView = view.findViewById(R.id.content)
|
||||
unescapeCheckBox = view.findViewById(R.id.unescape)
|
||||
unescapeCheckBox.isChecked = prefs.expandEscapeSequences
|
||||
|
||||
val args = arguments
|
||||
args?.getString(CONTENT)?.let {
|
||||
args?.getString(CONTENT_TEXT)?.let {
|
||||
contentView.setText(it)
|
||||
}
|
||||
args?.getByteArray(CONTENT_RAW)?.let {
|
||||
bytes = it
|
||||
setEncodeByteArray()
|
||||
}
|
||||
|
||||
val barcodeFormat = args?.getString(FORMAT)
|
||||
if (barcodeFormat != null) {
|
||||
@@ -156,33 +221,70 @@ class EncodeFragment : Fragment() {
|
||||
return view
|
||||
}
|
||||
|
||||
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
|
||||
inflater.inflate(R.menu.fragment_encode, menu)
|
||||
}
|
||||
|
||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||
return when (item.itemId) {
|
||||
R.id.pick_file -> {
|
||||
startActivityForResult(
|
||||
Intent.createChooser(
|
||||
Intent(Intent.ACTION_GET_CONTENT).apply {
|
||||
type = "*/*"
|
||||
},
|
||||
getString(R.string.pick_file)
|
||||
),
|
||||
PICK_FILE_RESULT_CODE
|
||||
)
|
||||
true
|
||||
}
|
||||
|
||||
else -> super.onOptionsItemSelected(item)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
prefs.indexOfLastSelectedFormat = formatView.selectedItemPosition
|
||||
prefs.expandEscapeSequences = unescapeCheckBox.isChecked
|
||||
prefs.lastMargin = marginBarView.progress
|
||||
}
|
||||
|
||||
private fun Context.encode() {
|
||||
var content = contentView.text.toString()
|
||||
if (unescapeCheckBox.isChecked) {
|
||||
try {
|
||||
content = content.unescape()
|
||||
} catch (e: IllegalArgumentException) {
|
||||
toast(e.message ?: "Invalid escape sequence")
|
||||
hideSoftKeyboard(contentView)
|
||||
val content = if (bytes != null) {
|
||||
bytes
|
||||
} else {
|
||||
var text = contentView.text.toString()
|
||||
if (unescapeCheckBox.isChecked) {
|
||||
try {
|
||||
text = text.unescape()
|
||||
} catch (e: IllegalArgumentException) {
|
||||
toast(e.message ?: "Invalid escape sequence")
|
||||
return
|
||||
}
|
||||
}
|
||||
if (text.isEmpty()) {
|
||||
toast(R.string.error_no_content)
|
||||
return
|
||||
}
|
||||
text
|
||||
}
|
||||
if (content.isEmpty()) {
|
||||
toast(R.string.error_no_content)
|
||||
return
|
||||
}
|
||||
hideSoftKeyboard(contentView)
|
||||
val format = formats[formatView.selectedItemPosition]
|
||||
fragmentManager?.addFragment(
|
||||
BarcodeFragment.newInstance(
|
||||
content,
|
||||
format,
|
||||
getSize(sizeBarView.progress),
|
||||
when (format) {
|
||||
BarcodeFormat.AZTEC,
|
||||
BarcodeFormat.DATA_MATRIX,
|
||||
BarcodeFormat.QR_CODE,
|
||||
BarcodeFormat.PDF_417 -> marginBarView.progress
|
||||
|
||||
else -> -1
|
||||
},
|
||||
format.getErrorCorrectionLevel(ecSpinner.selectedItemPosition),
|
||||
if (format.canBeInverted()) {
|
||||
colorsSpinner.selectedItemPosition
|
||||
@@ -211,19 +313,77 @@ class EncodeFragment : Fragment() {
|
||||
|
||||
private fun updateSize(power: Int) {
|
||||
val size = getSize(power)
|
||||
sizeView.text = getString(R.string.width_by_height, size, size)
|
||||
sizeView.text = getString(R.string.size_width_by_height, size, size)
|
||||
}
|
||||
|
||||
private fun initMarginBar() {
|
||||
updateMargin(marginBarView.progress)
|
||||
marginBarView.setOnSeekBarChangeListener(
|
||||
object : SeekBar.OnSeekBarChangeListener {
|
||||
override fun onProgressChanged(
|
||||
seekBar: SeekBar,
|
||||
progressValue: Int,
|
||||
fromUser: Boolean
|
||||
) {
|
||||
if (progressValue >= minMargin) {
|
||||
updateMargin(progressValue)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onStartTrackingTouch(seekBar: SeekBar) {}
|
||||
|
||||
override fun onStopTrackingTouch(seekBar: SeekBar) {}
|
||||
})
|
||||
}
|
||||
|
||||
private fun updateMargin(margin: Int) {
|
||||
marginView.text = getString(R.string.margin_size, margin)
|
||||
}
|
||||
|
||||
private fun setMarginBar(minimum: Int, value: Int): Boolean {
|
||||
minMargin = minimum
|
||||
marginBarView.apply {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
min = minimum
|
||||
}
|
||||
progress = max(
|
||||
minimum, if (prefs.lastMargin > -1) {
|
||||
prefs.lastMargin
|
||||
} else {
|
||||
value
|
||||
}
|
||||
)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
private fun setEncodeByteArray() {
|
||||
contentView.text = null
|
||||
contentView.hint = getString(R.string.binary_data)
|
||||
contentView.isEnabled = false
|
||||
unescapeCheckBox.isEnabled = false
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val CONTENT = "content"
|
||||
private const val CONTENT_TEXT = "content_text"
|
||||
private const val CONTENT_RAW = "content_raw"
|
||||
private const val FORMAT = "format"
|
||||
private const val PICK_FILE_RESULT_CODE = 1
|
||||
|
||||
fun newInstance(
|
||||
content: String? = null,
|
||||
fun <T> newInstance(
|
||||
content: T? = null,
|
||||
format: String? = null
|
||||
): Fragment {
|
||||
val args = Bundle()
|
||||
content?.let { args.putString(CONTENT, content) }
|
||||
content?.let {
|
||||
when (content) {
|
||||
is String -> args.putString(CONTENT_TEXT, content)
|
||||
is ByteArray -> args.putByteArray(CONTENT_RAW, content)
|
||||
else -> throw IllegalArgumentException(
|
||||
"content must be a String or a ByteArray"
|
||||
)
|
||||
}
|
||||
}
|
||||
format?.let { args.putString(FORMAT, it) }
|
||||
val fragment = EncodeFragment()
|
||||
fragment.arguments = args
|
||||
@@ -232,45 +392,46 @@ class EncodeFragment : Fragment() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun Boolean.setVisibility(vararg views: View) {
|
||||
private fun Boolean.setVisibilityFor(vararg views: View) {
|
||||
val visibility = if (this) View.VISIBLE else View.GONE
|
||||
for (view in views) {
|
||||
view.visibility = visibility
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
|
||||
@@ -286,3 +447,18 @@ private fun Spinner.setEntries(resId: Int) = ArrayAdapter.createFromResource(
|
||||
}
|
||||
|
||||
private fun getSize(power: Int) = 128 * (power + 1)
|
||||
|
||||
private fun InputStream.readBytesMax(max: Int): ByteArray {
|
||||
var offset = 0
|
||||
var remaining = min(available(), max)
|
||||
val result = ByteArray(remaining)
|
||||
while (remaining > 0) {
|
||||
val read = read(result, offset, remaining)
|
||||
if (read < 0) {
|
||||
break
|
||||
}
|
||||
remaining -= read
|
||||
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
|
||||
@@ -79,6 +81,7 @@ class HistoryFragment : Fragment() {
|
||||
closeActionMode()
|
||||
true
|
||||
}
|
||||
|
||||
R.id.edit_scan -> {
|
||||
scansAdapter?.forSelection { id, position ->
|
||||
ac.askForName(
|
||||
@@ -90,6 +93,7 @@ class HistoryFragment : Fragment() {
|
||||
closeActionMode()
|
||||
true
|
||||
}
|
||||
|
||||
R.id.remove_scan -> {
|
||||
scansAdapter?.getSelectedIds()?.let {
|
||||
if (it.isNotEmpty()) {
|
||||
@@ -99,6 +103,7 @@ class HistoryFragment : Fragment() {
|
||||
closeActionMode()
|
||||
true
|
||||
}
|
||||
|
||||
else -> false
|
||||
}
|
||||
}
|
||||
@@ -114,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)
|
||||
@@ -156,7 +162,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)
|
||||
@@ -173,6 +179,7 @@ class HistoryFragment : Fragment() {
|
||||
super.onDestroy()
|
||||
scansAdapter?.changeCursor(null)
|
||||
parentJob.cancel()
|
||||
wipeLastShareFile()
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
@@ -182,10 +189,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?) {
|
||||
@@ -221,10 +237,17 @@ class HistoryFragment : Fragment() {
|
||||
context.askToRemoveScans()
|
||||
true
|
||||
}
|
||||
|
||||
R.id.export_history -> {
|
||||
askToExportToFile()
|
||||
true
|
||||
}
|
||||
|
||||
R.id.share_as_file -> {
|
||||
context.pickListSeparatorAndShare(true)
|
||||
true
|
||||
}
|
||||
|
||||
else -> super.onOptionsItemSelected(item)
|
||||
}
|
||||
}
|
||||
@@ -278,6 +301,7 @@ class HistoryFragment : Fragment() {
|
||||
private fun enableMenuItems(enabled: Boolean) {
|
||||
clearListMenuItem?.isEnabled = enabled
|
||||
exportHistoryMenuItem?.isEnabled = enabled
|
||||
shareAsFileMenuItem?.isEnabled = enabled
|
||||
}
|
||||
|
||||
private fun closeActionMode() {
|
||||
@@ -407,32 +431,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
-3
@@ -20,19 +20,20 @@ import de.markusfisch.android.binaryeye.activity.SplashActivity
|
||||
import de.markusfisch.android.binaryeye.app.addFragment
|
||||
import de.markusfisch.android.binaryeye.app.hasBluetoothPermission
|
||||
import de.markusfisch.android.binaryeye.app.prefs
|
||||
import de.markusfisch.android.binaryeye.bluetooth.setBluetoothHosts
|
||||
import de.markusfisch.android.binaryeye.media.beepConfirm
|
||||
import de.markusfisch.android.binaryeye.preference.UrlPreference
|
||||
import de.markusfisch.android.binaryeye.view.setPaddingFromWindowInsets
|
||||
import de.markusfisch.android.binaryeye.view.systemBarRecyclerViewScrollListener
|
||||
import de.markusfisch.android.binaryeye.widget.toast
|
||||
import de.markusfisch.android.binaryeye.bluetooth.setBluetoothHosts
|
||||
|
||||
class PreferencesFragment : PreferenceFragmentCompat() {
|
||||
private val changeListener = object : OnSharedPreferenceChangeListener {
|
||||
override fun onSharedPreferenceChanged(
|
||||
sharedPreferences: SharedPreferences,
|
||||
key: String
|
||||
sharedPreferences: SharedPreferences?,
|
||||
key: String?
|
||||
) {
|
||||
key ?: return
|
||||
val preference = findPreference(key) ?: return
|
||||
prefs.update()
|
||||
when (preference.key) {
|
||||
@@ -41,6 +42,7 @@ class PreferencesFragment : PreferenceFragmentCompat() {
|
||||
beepConfirm()
|
||||
setSummary(preference)
|
||||
}
|
||||
|
||||
"send_scan_bluetooth" -> {
|
||||
if (prefs.sendScanBluetooth &&
|
||||
activity?.hasBluetoothPermission() == false
|
||||
@@ -49,6 +51,7 @@ class PreferencesFragment : PreferenceFragmentCompat() {
|
||||
}
|
||||
setSummary(preference)
|
||||
}
|
||||
|
||||
else -> setSummary(preference)
|
||||
}
|
||||
}
|
||||
@@ -166,9 +169,11 @@ class PreferencesFragment : PreferenceFragmentCompat() {
|
||||
is UrlPreference -> {
|
||||
preference.setSummary(preference.getUrl())
|
||||
}
|
||||
|
||||
is ListPreference -> {
|
||||
preference.setSummary(preference.entry)
|
||||
}
|
||||
|
||||
is MultiSelectListPreference -> {
|
||||
preference.setSummary(
|
||||
preference.values.joinToString(", ") {
|
||||
@@ -176,6 +181,7 @@ class PreferencesFragment : PreferenceFragmentCompat() {
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
is PreferenceGroup -> {
|
||||
setSummaries(preference)
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -54,6 +54,7 @@ fun Matrix.setFrameToView(
|
||||
uprightWidth = frameMetrics.height
|
||||
uprightHeight = frameMetrics.width
|
||||
}
|
||||
|
||||
else -> {
|
||||
uprightWidth = frameMetrics.width
|
||||
uprightHeight = frameMetrics.height
|
||||
|
||||
@@ -33,6 +33,7 @@ private fun Scan.send(url: String, type: String): Response {
|
||||
"1" -> request(
|
||||
url + "?" + asUrlArguments()
|
||||
)
|
||||
|
||||
"2" -> request(url) { con ->
|
||||
con.requestMethod = "POST"
|
||||
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded")
|
||||
@@ -41,6 +42,7 @@ private fun Scan.send(url: String, type: String): Response {
|
||||
close()
|
||||
}
|
||||
}
|
||||
|
||||
"3" -> request(url) { con ->
|
||||
con.requestMethod = "POST"
|
||||
con.setRequestProperty("Content-Type", "application/json")
|
||||
@@ -49,6 +51,7 @@ private fun Scan.send(url: String, type: String): Response {
|
||||
close()
|
||||
}
|
||||
}
|
||||
|
||||
else -> request(
|
||||
url + content.urlEncode()
|
||||
)
|
||||
@@ -66,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,36 @@
|
||||
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.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) {
|
||||
@@ -192,6 +194,11 @@ class Preferences {
|
||||
apply(INDEX_OF_LAST_SELECTED_EC_LEVEL, value)
|
||||
field = value
|
||||
}
|
||||
var lastMargin: Int = -1
|
||||
set(value) {
|
||||
apply(LAST_MARGIN, value)
|
||||
field = value
|
||||
}
|
||||
var freeRotation = true
|
||||
set(value) {
|
||||
apply(FREE_ROTATION, value)
|
||||
@@ -298,6 +305,10 @@ class Preferences {
|
||||
INDEX_OF_LAST_SELECTED_EC_LEVEL,
|
||||
indexOfLastSelectedEcLevel
|
||||
)
|
||||
lastMargin = preferences.getInt(
|
||||
LAST_MARGIN,
|
||||
lastMargin
|
||||
)
|
||||
freeRotation = preferences.getBoolean(FREE_ROTATION, freeRotation)
|
||||
expandEscapeSequences = preferences.getBoolean(
|
||||
EXPAND_ESCAPE_SEQUENCES,
|
||||
@@ -332,6 +343,7 @@ class Preferences {
|
||||
preferences.edit().putInt(label, value).apply()
|
||||
}
|
||||
|
||||
@SuppressLint("ApplySharedPref")
|
||||
private fun commit(label: String, value: String) {
|
||||
preferences.edit().putString(label, value).commit()
|
||||
}
|
||||
@@ -374,6 +386,7 @@ class Preferences {
|
||||
private const val CUSTOM_LOCALE = "custom_locale"
|
||||
private const val INDEX_OF_LAST_SELECTED_FORMAT = "index_of_last_selected_format"
|
||||
private const val INDEX_OF_LAST_SELECTED_EC_LEVEL = "index_of_last_selected_ec_level"
|
||||
private const val LAST_MARGIN = "last_margin"
|
||||
private const val FREE_ROTATION = "free_rotation"
|
||||
private const val EXPAND_ESCAPE_SEQUENCES = "expand_escape_sequences"
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package de.markusfisch.android.binaryeye.service
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.PendingIntent
|
||||
import android.content.Intent
|
||||
import android.os.Build
|
||||
import android.service.quicksettings.TileService
|
||||
@@ -12,6 +14,21 @@ class ScanTileService : TileService() {
|
||||
super.onClick()
|
||||
val intent = Intent(applicationContext, CameraActivity::class.java)
|
||||
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
|
||||
startActivityAndCollapse(intent)
|
||||
// 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 {
|
||||
startActivityAndCollapse(
|
||||
PendingIntent.getActivity(
|
||||
this,
|
||||
0,
|
||||
intent,
|
||||
PendingIntent.FLAG_IMMUTABLE
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,6 +41,7 @@ fun String.unescape(): String {
|
||||
i += l
|
||||
substring(from, i).toInt(8).toChar()
|
||||
}
|
||||
|
||||
'x', 'u' -> {
|
||||
val l = if (ec == 'u') 4 else 2
|
||||
val hexCode = try {
|
||||
@@ -60,6 +61,7 @@ fun String.unescape(): String {
|
||||
i += l
|
||||
unicodeValue.toChar()
|
||||
}
|
||||
|
||||
else -> throw IllegalArgumentException(
|
||||
"Unknown escape code [$ec] at index $i"
|
||||
)
|
||||
|
||||
@@ -32,6 +32,7 @@ private fun Context.isSilent(): Boolean {
|
||||
return when (am.ringerMode) {
|
||||
AudioManager.RINGER_MODE_SILENT,
|
||||
AudioManager.RINGER_MODE_VIBRATE -> true
|
||||
|
||||
else -> false
|
||||
}
|
||||
}
|
||||
|
||||
@@ -162,6 +162,7 @@ class DetectorView : View {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
MotionEvent.ACTION_MOVE -> {
|
||||
if (handleGrabbed) {
|
||||
handlePos.set(x, y)
|
||||
@@ -176,6 +177,7 @@ class DetectorView : View {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
MotionEvent.ACTION_CANCEL -> {
|
||||
if (handleGrabbed) {
|
||||
snap(x, y)
|
||||
@@ -183,6 +185,7 @@ class DetectorView : View {
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
MotionEvent.ACTION_UP -> {
|
||||
if (handleGrabbed) {
|
||||
if (!handleActive) {
|
||||
@@ -199,6 +202,7 @@ class DetectorView : View {
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
else -> super.onTouchEvent(event)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,58 +13,6 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:padding="16dp">
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:text="@string/format"/>
|
||||
<Spinner
|
||||
android:id="@+id/format"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="16dp"/>
|
||||
<TextView
|
||||
android:id="@+id/error_correction_label"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:text="@string/error_correction_level"/>
|
||||
<Spinner
|
||||
android:id="@+id/error_correction_level"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="16dp"/>
|
||||
<TextView
|
||||
android:id="@+id/colors_label"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:text="@string/colors"/>
|
||||
<Spinner
|
||||
android:id="@+id/colors"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:entries="@array/colors"/>
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:text="@string/size"/>
|
||||
<TextView
|
||||
android:id="@+id/size_display"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:gravity="center"/>
|
||||
<SeekBar
|
||||
style="@style/Widget.AppCompat.SeekBar.Discrete"
|
||||
android:id="@+id/size_bar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:progress="4"
|
||||
android:max="7"/>
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
@@ -75,7 +23,6 @@
|
||||
android:id="@+id/content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:gravity="start|top"
|
||||
android:typeface="monospace"
|
||||
android:imeOptions="flagNoExtractUi"
|
||||
@@ -88,6 +35,72 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:text="@string/unescape"/>
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:text="@string/format"/>
|
||||
<Spinner
|
||||
style="@style/Spinner"
|
||||
android:id="@+id/format"
|
||||
android:layout_marginBottom="16dp"/>
|
||||
<TextView
|
||||
android:id="@+id/error_correction_label"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:text="@string/error_correction_level"/>
|
||||
<Spinner
|
||||
style="@style/Spinner"
|
||||
android:id="@+id/error_correction_level"
|
||||
android:layout_marginBottom="16dp"/>
|
||||
<TextView
|
||||
android:id="@+id/colors_label"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:text="@string/colors"/>
|
||||
<Spinner
|
||||
style="@style/Spinner"
|
||||
android:id="@+id/colors"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:entries="@array/colors"/>
|
||||
<TextView
|
||||
android:id="@+id/size_display"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="8dp"/>
|
||||
<SeekBar
|
||||
style="@style/Widget.AppCompat.SeekBar.Discrete"
|
||||
android:id="@+id/size_bar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:paddingTop="16dp"
|
||||
android:paddingBottom="16dp"
|
||||
android:progress="4"
|
||||
android:max="7"/>
|
||||
<LinearLayout
|
||||
android:id="@+id/margin"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:visibility="gone">
|
||||
<TextView
|
||||
android:id="@+id/margin_display"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="8dp"/>
|
||||
<SeekBar
|
||||
style="@style/Widget.AppCompat.SeekBar.Discrete"
|
||||
android:id="@+id/margin_bar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:paddingTop="16dp"
|
||||
android:paddingBottom="16dp"
|
||||
android:max="32"/>
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
</de.markusfisch.android.binaryeye.widget.ConfinedScrollView>
|
||||
<android.support.design.widget.CoordinatorLayout
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
material:showAsAction="ifRoom"/>
|
||||
<item
|
||||
android:id="@+id/pick_file"
|
||||
android:title="@string/pick_file"
|
||||
android:title="@string/pick_image_file"
|
||||
android:icon="@drawable/ic_action_pick_file"
|
||||
material:showAsAction="ifRoom"/>
|
||||
<item
|
||||
|
||||
@@ -23,6 +23,11 @@
|
||||
android:title="@string/share"
|
||||
android:icon="@drawable/ic_action_share"
|
||||
material:showAsAction="ifRoom"/>
|
||||
<item
|
||||
android:id="@+id/share_file"
|
||||
android:title="@string/share_file"
|
||||
android:icon="@drawable/ic_action_share"
|
||||
material:showAsAction="ifRoom"/>
|
||||
<item
|
||||
android:id="@+id/create"
|
||||
android:title="@string/compose_barcode"
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
<menu
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:material="http://schemas.android.com/apk/res-auto">
|
||||
<item
|
||||
android:id="@+id/pick_file"
|
||||
android:title="@string/pick_file"
|
||||
android:icon="@drawable/ic_action_pick_file"
|
||||
material:showAsAction="ifRoom"/>
|
||||
</menu>
|
||||
@@ -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>
|
||||
|
||||
@@ -0,0 +1,197 @@
|
||||
<resources>
|
||||
<string name="camera_error">Няма достъп до камерата, моля, опитайте отново</string>
|
||||
<string name="scan_code">Сканирайте код</string>
|
||||
<string name="compose_barcode">Създаване на баркод</string>
|
||||
<string name="decode_barcode">Декодиране на баркод</string>
|
||||
<string name="content">Съдържание</string>
|
||||
<string name="binary_data">(бинарни данни)</string>
|
||||
<plurals name="barcode_info">
|
||||
<item quantity="one">%2$d символ, %1$s</item>
|
||||
<item quantity="other">%2$d символа, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Ниво на коригиране на грешки</string>
|
||||
<string name="error_correction_level_l" formatted="false">Ниско (~7% корекция)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Средно (~15% корекция)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Четвъртично (~25% корекция)</string>
|
||||
<string name="error_correction_level_h" formatted="false">Високо (~30% корекция)</string>
|
||||
<string name="colors">Преден и заден план</string>
|
||||
<string name="colors_black_on_white">Черно на бяло</string>
|
||||
<string name="colors_white_on_black">Бяло на черно</string>
|
||||
<string name="colors_black_on_transparent">Черно на прозрачно</string>
|
||||
<string name="colors_white_on_transparent">Бяло на прозрачно</string>
|
||||
<string name="sequence_size">Размер на последователността</string>
|
||||
<string name="sequence_index">Индекс на последователността</string>
|
||||
<string name="sequence_id">ID на последователността</string>
|
||||
<string name="gtin_issue_number">Номер на изданието</string>
|
||||
<string name="gtin_country">Възможна страна на производство</string>
|
||||
<string name="gtin_price">Предположена цена</string>
|
||||
<string name="gtin_add_on">UPC EAN разширение</string>
|
||||
<string name="barcode_version_number">Версия</string>
|
||||
<string name="qr_version_and_modules">%1$s (%2$d модули)</string>
|
||||
<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_as">Сподели като?</string>
|
||||
<string name="copy_to_clipboard">Копиране в клипборда</string>
|
||||
<string name="copied_to_clipboard">Копирано в клипборда</string>
|
||||
<string name="copy_password">Копиране на паролата в клипборда</string>
|
||||
<string name="copied_password_to_clipboard">Паролата е копирана в клипборда</string>
|
||||
<string name="open_url">Отворете URL(Линк)</string>
|
||||
<string name="cannot_resolve_action">Няма приложение което може да отвори това</string>
|
||||
<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">Марж в пиксели: %1$d</string>
|
||||
<string name="input_content_here">Въведете съдържание тук</string>
|
||||
<string name="unescape">Разширете последователности за извеждане</string>
|
||||
<string name="encode">КОДИРАНЕ</string>
|
||||
<string name="error_no_content">Липсва съдържание</string>
|
||||
<string name="error_encoding_barcode">Баркодът не може да бъде генериран</string>
|
||||
<string name="view_barcode">Вижте баркода</string>
|
||||
<string name="info">Информация</string>
|
||||
<string name="switch_camera">Превключване на камерата</string>
|
||||
<string name="bulk_mode">Сканирайте непрекъснато</string>
|
||||
<string name="bulk_mode_summary">Винаги започвай непрекъснато сканиране.</string>
|
||||
<string name="bulk_mode_delay">Забавяне между непрекъснатите сканирания</string>
|
||||
<string name="restrict_format">Ограничаване на формат</string>
|
||||
<string name="remove_restriction">Премахване на ограничението</string>
|
||||
<string name="scan_format">Сканиране %s</string>
|
||||
<string name="quarter_second">Червърт секунда</string>
|
||||
<string name="half_second">Половин секунда</string>
|
||||
<string name="a_second">Една секунда</string>
|
||||
<string name="two_seconds">Две секунди</string>
|
||||
<string name="five_seconds">Пет секунди</string>
|
||||
<string name="history">История</string>
|
||||
<string name="preferences">Настройки</string>
|
||||
<string name="scan_category">Сканиране</string>
|
||||
<string name="content_category">Съдържание</string>
|
||||
<string name="locale_category">Език</string>
|
||||
<string name="custom_locale">Персонализиран език</string>
|
||||
<string name="follow_system_settings">Следване на системните настройки</string>
|
||||
<string name="show_crop_handle">Показване на ограничителя за изрязване</string>
|
||||
<string name="show_crop_handle_summary">Ограничете сканирането до персонализирана област.</string>
|
||||
<string name="barcode_formats">Баркодови формати</string>
|
||||
<string name="zoom_by_swiping">Плъзване нагоре/надолу, за да увеличите</string>
|
||||
<string name="zoom_by_swiping_summary">Плъзнете нагоре или надолу в екрана на камерата, за да контролирате приближаването на камерата.</string>
|
||||
<string name="auto_rotate">Разпознаване на вертикални 1D баркодове</string>
|
||||
<string name="auto_rotate_summary">Автоматично завъртете рамката на камерата, за разпознаване на вертикални 1D баркодове. В зависимост от устройството това може да повлияе на скоростта.</string>
|
||||
<string name="try_harder">Оптимизиране на четеца за точност</string>
|
||||
<string name="try_harder_summary">Активирайте тази опция за много трудни за четене кодове. Ще повлияе на скоростта.</string>
|
||||
<string name="show_toast_in_bulk_mode">Показване на данни в непрекъснат режим</string>
|
||||
<string name="show_toast_in_bulk_mode_summary">Кратко показване на сканираните данни при непрекъснато сканиране.</string>
|
||||
<string name="vibrate">Вибриране при сканиране</string>
|
||||
<string name="vibrate_summary">Активирайте това, ако искате устройството ви да вибрира при разпознаване на код.</string>
|
||||
<string name="beep">Звуков сигнал при сканиране</string>
|
||||
<string name="beep_summary">Активирайте това, ако искате вашето устройство да издава звуков сигнал при разпознаване на код.</string>
|
||||
<string name="beep_tone">Звуков сигнал</string>
|
||||
<string name="tone_cdma_confirm">CDMA потвърждение</string>
|
||||
<string name="tone_sup_confirm">Потвърждение на надзорния разговор</string>
|
||||
<string name="tone_sup_radio_ack">Потвърждение на контролния радиопът на повикване</string>
|
||||
<string name="tone_prop_ack">Положително признание</string>
|
||||
<string name="tone_prop_beep">Общ звуков сигнал</string>
|
||||
<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="open_immediately">Отваряй внезапно</string>
|
||||
<string name="open_immediately_summary">Пропуска проверката и внезапно отваря съдържанието. Може да отвори вредно съдържание, ако е активирано.</string>
|
||||
<string name="copy_immediately">Поставяй в клипборда</string>
|
||||
<string name="copy_immediately_summary">Автоматично копира сканираното съдържание в клипборда. Моля, имайте предвид, че други приложения може да подслушват вашия клипборд във фонов режим.</string>
|
||||
<string name="show_meta_data">Показване на метаданни</string>
|
||||
<string name="show_meta_data_summary">Показване на допълнителни данни за сканирания баркод.</string>
|
||||
<string name="show_hex_dump">Показване на шестнадесетичен дъмп</string>
|
||||
<string name="show_hex_dump_summary">Показване на шестнадесетичен дъмп на сканираното съдържание.</string>
|
||||
<string name="show_recreation">Показване на пресъздаден баркод</string>
|
||||
<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="always_ask">Винаги питай</string>
|
||||
<string name="open_with_url">Отворяне на неизвестни данни с URL</string>
|
||||
<string name="clear_network_suggestions">Премахнете мрежовите предложения</string>
|
||||
<string name="clear_network_suggestions_summary">Премахване на мрежовите предложения, които преди са били добавени с това приложение.</string>
|
||||
<string name="really_remove_all_networks">Наистина ли искате да премахнете всички мрежи?</string>
|
||||
<string name="clear_network_suggestions_success">Предложенията за интернет мрежи са изчистени</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">Нищо за премахване</string>
|
||||
<string name="send_category">Препращане</string>
|
||||
<string name="send_scan_active">Препращане на сканиранията</string>
|
||||
<string name="send_scan_active_summary">Включване на препращането на сканиранията към даден URL адрес.</string>
|
||||
<string name="send_scan_url">URL(Линк) за препращане</string>
|
||||
<string name="send_scan_type">Тип заявка</string>
|
||||
<string name="send_type_get_add_content">GET и просто добавяне на съдържанието</string>
|
||||
<string name="send_type_get_query_string">GET с пълен низ на заявка</string>
|
||||
<string name="send_type_post_form">POST application/x-www-form-urlencoded</string>
|
||||
<string name="send_type_post_json">POST application/json</string>
|
||||
<string name="send_type_external_browser">Отваряне във външен браузър</string>
|
||||
<string name="test_url">Тествайте URL(Линка)</string>
|
||||
<string name="send_scan_bluetooth">Препращане на сканиранията с Bluetooth</string>
|
||||
<string name="send_scan_bluetooth_summary">Активиране на препращане на сканирания към даден Bluetooth хост.</string>
|
||||
<string name="send_scan_bluetooth_host">Хост</string>
|
||||
<string name="no_bluetooth_hosts_paired">Няма сдвоени хостове</string>
|
||||
<string name="bluetooth_connect_fail">Неуспешно свързване с Bluetooth устройство.</string>
|
||||
<string name="bluetooth_send_fail">Неуспешно изпращане до Bluetooth устройство.</string>
|
||||
<string name="bluetooth_send_success">Успешно Bluetooth изпращане.</string>
|
||||
<string name="really_remove_scan">Наистина ли искате да премахнете това сканиране?</string>
|
||||
<string name="really_remove_all_scans">Наистина ли искате да премахнете всички сканирания?</string>
|
||||
<string name="really_remove_selected_scans">Наистина ли искате да премахнете избраните сканирания?</string>
|
||||
<string name="clear_history">Изчистване на историята</string>
|
||||
<string name="copy_scan">Сопиране на сканирането</string>
|
||||
<string name="edit_scan">Редактиране на етикет</string>
|
||||
<string name="remove_scan">Премахване на сканиране</string>
|
||||
<string name="enter_name">Въведете име, за да опишете сканирането</string>
|
||||
<string name="enter_name_hint">Име на сканирането</string>
|
||||
<string name="no_barcode_found">Няма намерен баркод</string>
|
||||
<string name="pick_list_separator">Как бъдат разделени елементите от списъка?</string>
|
||||
<string name="separator_line_break">Нова линия</string>
|
||||
<string name="separator_ruler">Лента</string>
|
||||
<string name="save_as_file_name">Запазване в папка за изтегляния?</string>
|
||||
<string name="file_name">Име на файл</string>
|
||||
<string name="error_saving_file">Неуспешно запазване на Файлът</string>
|
||||
<string name="error_file_exists">Файлът вече съществува</string>
|
||||
<string name="connect_to_wifi">Свържи се към Wi-Fi</string>
|
||||
<string name="wifi_config_failed">Неуспешно конфигуриране на Wi-Fi</string>
|
||||
<string name="wifi_added">Wi-Fi успешно добавен</string>
|
||||
<string name="sms_send">Изпрати SMS</string>
|
||||
<string name="sms_error">Неуспешно изпращане на SMS</string>
|
||||
<string name="tel_dial">Набери номер</string>
|
||||
<string name="tel_error">Неуспешно набиране на номера</string>
|
||||
<string name="mail_send">Изпрати писмо</string>
|
||||
<string name="mail_error">Неуспешно изпращане на имейл</string>
|
||||
<string name="vcard_add">Добавяне към контактите</string>
|
||||
<string name="vcard_failed">Неуспешно добавяне към контактите</string>
|
||||
<string name="vevent_add">Добавяне към календара</string>
|
||||
<string name="vevent_failed">Неуспешно добавяне към календара</string>
|
||||
<string name="otpauth_add">Добави 2FA</string>
|
||||
<string name="search_web">Търси в мрежата</string>
|
||||
<string name="search_scan">Търсещо сканиране</string>
|
||||
<string name="export_to_file">Извеждане в файл</string>
|
||||
<string name="export_as">Извеждане като?</string>
|
||||
<string name="export_csv_comma">CSV файл със запетаи</string>
|
||||
<string name="export_csv_semicolon">CSV файл с точки и запетаи</string>
|
||||
<string name="export_json">JSON файл</string>
|
||||
<string name="export_database">SQLite база данни</string>
|
||||
<string name="saved_in_downloads">Запазено в изтеглянията</string>
|
||||
<string name="rotate_image_cw">Завъртете изображението по часовниковата стрелка</string>
|
||||
<string name="toggle_free_rotation">Превключване на свободното въртене</string>
|
||||
<string name="pick_file">Изберете файл</string>
|
||||
<string name="pick_image_file">Изберете снимка</string>
|
||||
<string name="pick_code_to_scan">Изберете код за сканиране</string>
|
||||
<string name="shortcut_decode">Сканирай баркод</string>
|
||||
<string name="shortcut_encode">Създай баркод</string>
|
||||
<string name="shortcut_preferences">Настройки</string>
|
||||
<string name="background_request_failed">Неуспешна заявка в фонов режим</string>
|
||||
<string name="entry_type">Тип</string>
|
||||
<string name="wifi_network">Wi-Fi мрежа</string>
|
||||
<string name="wifi_ssid">Име</string>
|
||||
<string name="wifi_type">Тип удостоверяване</string>
|
||||
<string name="wifi_password">Парола</string>
|
||||
<string name="wifi_hidden">Скрита интернет мрежа</string>
|
||||
<string name="wifi_eap">EAP метод</string>
|
||||
<string name="wifi_anonymous_identity">Анонимна идентичност</string>
|
||||
<string name="wifi_identity">Идентичност</string>
|
||||
<string name="wifi_phase2">Фаза 2 метод</string>
|
||||
<string name="network_suggestions">Предложения за интернет мрежа</string>
|
||||
<string name="remove_suggestion">Премахване на предложението</string>
|
||||
</resources>
|
||||
@@ -31,6 +31,7 @@
|
||||
<string name="toggle_flash">আলো</string>
|
||||
<string name="error_flash">Error toggling flash</string>
|
||||
<string name="share">ভাগ করো</string>
|
||||
<string name="share_file">Share as file</string>
|
||||
<string name="share_as">ভাগ করার মাধ্যম</string>
|
||||
<string name="copy_to_clipboard">ক্লিপবোর্ডে অনুলিপি</string>
|
||||
<string name="copied_to_clipboard">ক্লিপবোর্ডে অনুলিপিত</string>
|
||||
@@ -40,8 +41,8 @@
|
||||
<string name="cannot_resolve_action">খোলার মতো অ্যাপ নেই</string>
|
||||
<string name="pick_search_engine">একটা সার্চ ইঞ্জিন নাও</string>
|
||||
<string name="format">ধরণ</string>
|
||||
<string name="size">পিক্সেলে আকার</string>
|
||||
<string name="width_by_height">%1$d×%2$d</string>
|
||||
<string name="size_width_by_height">পিক্সেলে আকা:%1$d×%2$d</string>
|
||||
<string name="margin_size">Margin in pixels: %1$d</string>
|
||||
<string name="input_content_here">এখানে তথ্য দাও</string>
|
||||
<string name="unescape">Expand escape sequences</string>
|
||||
<string name="encode">সংকেতকরণ</string>
|
||||
@@ -174,7 +175,8 @@
|
||||
<string name="saved_in_downloads">ডাউনলোডে সংরক্ষিত</string>
|
||||
<string name="rotate_image_cw">ছবি ঘড়ির দিকে ঘুরাও</string>
|
||||
<string name="toggle_free_rotation">Toggle free rotation</string>
|
||||
<string name="pick_file">ছবি নাও</string>
|
||||
<string name="pick_file">Pick a file</string>
|
||||
<string name="pick_image_file">ছবি নাও</string>
|
||||
<string name="pick_code_to_scan">খুঁজার জন্য কোড নাও</string>
|
||||
<string name="shortcut_decode">বারকোড খুজো</string>
|
||||
<string name="shortcut_encode">বারকোড বানাও</string>
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
<string name="toggle_flash">Přepnout blesk</string>
|
||||
<string name="error_flash">Zapnutí/vypnutí blesku selhalo</string>
|
||||
<string name="share">Sdílet</string>
|
||||
<string name="share_file">Sdílet jako soubor</string>
|
||||
<string name="share_as">Sdílet jako</string>
|
||||
<string name="copy_to_clipboard">Zkopírovat do schránky</string>
|
||||
<string name="copied_to_clipboard">Zkopírováno do schránky</string>
|
||||
@@ -42,8 +43,8 @@
|
||||
<string name="cannot_resolve_action">Nemáte aplikaci, která by toto uměla otevřít</string>
|
||||
<string name="pick_search_engine">Zvolte vyhledávač</string>
|
||||
<string name="format">Formát</string>
|
||||
<string name="size">Velikost v pixelech</string>
|
||||
<string name="width_by_height">%1$d×%2$d</string>
|
||||
<string name="size_width_by_height">Velikost v pixelech: %1$d×%2$d</string>
|
||||
<string name="margin_size">Okraje v pixelech: %1$d</string>
|
||||
<string name="input_content_here">Sem vložte obsah</string>
|
||||
<string name="unescape">Rozšířit escape sekvence</string>
|
||||
<string name="encode">ZAKÓDOVAT</string>
|
||||
@@ -115,7 +116,7 @@
|
||||
<string name="clear_network_suggestions_summary">Smazat všechny sítě, které byly navrženy touto aplikací.</string>
|
||||
<string name="really_remove_all_networks">Opravdu smazat všechny sítě?</string>
|
||||
<string name="clear_network_suggestions_success">Navrhované sítě smazány</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">Nic k smazání</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">Nic ke smazání</string>
|
||||
<string name="send_category">Předávání</string>
|
||||
<string name="send_scan_active">Předávat skeny</string>
|
||||
<string name="send_scan_active_summary">Zapnout předávání skenů na danou URL</string>
|
||||
@@ -176,7 +177,8 @@
|
||||
<string name="saved_in_downloads">Uloženo do složky Stahování</string>
|
||||
<string name="rotate_image_cw">Otočit obrázek po směru hodinových ručiček</string>
|
||||
<string name="toggle_free_rotation">Přepnout zámek natočení</string>
|
||||
<string name="pick_file">Vybrat obrázek</string>
|
||||
<string name="pick_file">Vybrat soubor</string>
|
||||
<string name="pick_image_file">Vybrat obrázek</string>
|
||||
<string name="pick_code_to_scan">Vyberte kód k naskenování</string>
|
||||
<string name="shortcut_decode">Skenovat čárový kód</string>
|
||||
<string name="shortcut_encode">Vytvořit čárový kód</string>
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
<string name="toggle_flash">Slå blitz til/fra</string>
|
||||
<string name="error_flash">Der opstod en fejl ved at slå blitz til/fra</string>
|
||||
<string name="share">Del</string>
|
||||
<string name="share_file">Share as file</string>
|
||||
<string name="share_as">Del som?</string>
|
||||
<string name="copy_to_clipboard">Kopier til udklipsholder</string>
|
||||
<string name="copied_to_clipboard">Kopieret til udklipsholder</string>
|
||||
@@ -40,8 +41,8 @@
|
||||
<string name="cannot_resolve_action">Inge applikation kan åbne det</string>
|
||||
<string name="pick_search_engine">Vælg en søgemaskine</string>
|
||||
<string name="format">Format</string>
|
||||
<string name="size">Størrelse i pixels</string>
|
||||
<string name="width_by_height">%1$d×%2$d</string>
|
||||
<string name="size_width_by_height">Størrelse i pixels: %1$d×%2$d</string>
|
||||
<string name="margin_size">Margin in pixels: %1$d</string>
|
||||
<string name="input_content_here">Indtast indhold her</string>
|
||||
<string name="unescape">Expand escape sequences</string>
|
||||
<string name="encode">INDKOD</string>
|
||||
@@ -174,7 +175,8 @@
|
||||
<string name="saved_in_downloads">Gemt i downloads</string>
|
||||
<string name="rotate_image_cw">Roter billedet med uret</string>
|
||||
<string name="toggle_free_rotation">Slå fri rotation til/fra</string>
|
||||
<string name="pick_file">Vælg billedfil</string>
|
||||
<string name="pick_file">Pick a file</string>
|
||||
<string name="pick_image_file">Vælg billedfil</string>
|
||||
<string name="pick_code_to_scan">Vælg kode til at scanne</string>
|
||||
<string name="shortcut_decode">Scan en stregkode</string>
|
||||
<string name="shortcut_encode">Opret en stregkode</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>
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
<string name="toggle_flash">Licht an/ausschalten</string>
|
||||
<string name="error_flash">Fehler beim ein/ausschalten des Lichts</string>
|
||||
<string name="share">Teilen</string>
|
||||
<string name="share_file">Als Datei teilen</string>
|
||||
<string name="share_as">Teilen als?</string>
|
||||
<string name="copy_to_clipboard">In die Zwischenablage kopieren</string>
|
||||
<string name="copied_to_clipboard">Inhalt wurde in die Zwischenablage kopiert</string>
|
||||
@@ -40,8 +41,8 @@
|
||||
<string name="cannot_resolve_action">Keine App kann das öffnen</string>
|
||||
<string name="pick_search_engine">Suchmaschine auswählen</string>
|
||||
<string name="format">Format</string>
|
||||
<string name="size">Größe in Pixel</string>
|
||||
<string name="width_by_height">%1$d×%2$d</string>
|
||||
<string name="size_width_by_height">Größe in Pixel: %1$d×%2$d</string>
|
||||
<string name="margin_size">Randgröße in Pixel: %1$d</string>
|
||||
<string name="input_content_here">Gib den Inhalt hier ein</string>
|
||||
<string name="unescape">Escape-Sequenzen interpretieren</string>
|
||||
<string name="encode">KODIEREN</string>
|
||||
@@ -174,7 +175,8 @@
|
||||
<string name="saved_in_downloads">In den Downloads gespeichert</string>
|
||||
<string name="rotate_image_cw">Bild im Uhrzeigersinn rotieren</string>
|
||||
<string name="toggle_free_rotation">Freie Rotation ein/ausschalten</string>
|
||||
<string name="pick_file">Bilddatei auswählen</string>
|
||||
<string name="pick_file">Datei auswählen</string>
|
||||
<string name="pick_image_file">Bilddatei auswählen</string>
|
||||
<string name="pick_code_to_scan">Code im Bild auswählen</string>
|
||||
<string name="shortcut_decode">Barcode lesen</string>
|
||||
<string name="shortcut_encode">Barcode erstellen</string>
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
<string name="toggle_flash">Activar el flash</string>
|
||||
<string name="error_flash">Error toggling flash</string>
|
||||
<string name="share">Compartir</string>
|
||||
<string name="share_file">Share as file</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>
|
||||
@@ -40,8 +41,8 @@
|
||||
<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="format">Formato</string>
|
||||
<string name="size">Tamaño en píxeles</string>
|
||||
<string name="width_by_height">%1$d×%2$d</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="input_content_here">Introduzca el contenido aquí</string>
|
||||
<string name="unescape">Expand escape sequences</string>
|
||||
<string name="encode">CODIFICAR</string>
|
||||
@@ -174,7 +175,8 @@
|
||||
<string name="saved_in_downloads">Guardado en Descargas</string>
|
||||
<string name="rotate_image_cw">Rotar la imagen en sentido horario</string>
|
||||
<string name="toggle_free_rotation">Toggle free rotation</string>
|
||||
<string name="pick_file">Seleccionar imagen</string>
|
||||
<string name="pick_file">Pick a file</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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -31,6 +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_as">همرسانی به عنوان؟</string>
|
||||
<string name="copy_to_clipboard">رونوشت به تخهگیره</string>
|
||||
<string name="copied_to_clipboard">به تختهگیره رونوشت شد</string>
|
||||
@@ -40,8 +41,8 @@
|
||||
<string name="cannot_resolve_action">هیچ برنامهای نمیتواند آن را بگشاید</string>
|
||||
<string name="pick_search_engine">یک موتور جستوجو برگزینید</string>
|
||||
<string name="format">قالب</string>
|
||||
<string name="size">اندازه به پیکسل</string>
|
||||
<string name="width_by_height">%1$d×%2$d</string>
|
||||
<string name="size_width_by_height">اندازه به پیکسل: %1$d×%2$d</string>
|
||||
<string name="margin_size">Margin in pixels: %1$d</string>
|
||||
<string name="input_content_here">محتویات ورودی را اینجا بنویسید</string>
|
||||
<string name="unescape">Expand escape sequences</string>
|
||||
<string name="encode">رمزگذاری</string>
|
||||
@@ -174,7 +175,8 @@
|
||||
<string name="saved_in_downloads">در بارگیریها ذخیره شد</string>
|
||||
<string name="rotate_image_cw">تصویر را در جهت ساعتگرد بچرخانید</string>
|
||||
<string name="toggle_free_rotation">Toggle free rotation</string>
|
||||
<string name="pick_file">پروندهٔ تصویری را برگزینید</string>
|
||||
<string name="pick_file">Pick a file</string>
|
||||
<string name="pick_image_file">پروندهٔ تصویری را برگزینید</string>
|
||||
<string name="pick_code_to_scan">کدی را برای پویش برگزینید</string>
|
||||
<string name="shortcut_decode">پویش یک بارکد</string>
|
||||
<string name="shortcut_encode">ایجاد یک بارکد</string>
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
<resources>
|
||||
<string name="camera_error">Impossible d\'accéder à la caméra, veuillez réessayer</string>
|
||||
<string name="scan_code">Scanner le code</string>
|
||||
<string name="scan_code">Scanner un code</string>
|
||||
<string name="compose_barcode">Créer un code-barres</string>
|
||||
<string name="decode_barcode">Décoder le code-barres</string>
|
||||
<string name="content">Contenu</string>
|
||||
<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>
|
||||
@@ -29,30 +28,31 @@
|
||||
<string name="gtin_add_on">Extension UPC EAN</string>
|
||||
<string name="barcode_version_number">Version</string>
|
||||
<string name="qr_version_and_modules">%1$s (%2$d modules)</string>
|
||||
<string name="toggle_flash">Activer le flash</string>
|
||||
<string name="error_flash">Erreur de basculement du flash</string>
|
||||
<string name="toggle_flash">Activer/Désactiver le flash</string>
|
||||
<string name="error_flash">Erreur de changement d\'état du flash</string>
|
||||
<string name="share">Partager</string>
|
||||
<string name="share_as">Partager comme ?</string>
|
||||
<string name="share_file">Partager en tant que fichier</string>
|
||||
<string name="share_as">Partager en tant que ?</string>
|
||||
<string name="copy_to_clipboard">Copier dans le presse-papiers</string>
|
||||
<string name="copied_to_clipboard">Copié dans le presse-papiers</string>
|
||||
<string name="copy_password">Copier le mot de passe dans le presse-papiers</string>
|
||||
<string name="copied_password_to_clipboard">Mot de passe copié dans le presse-papiers</string>
|
||||
<string name="open_url">Ouvrir l\'url</string>
|
||||
<string name="open_url">Ouvrir l\'URL</string>
|
||||
<string name="cannot_resolve_action">Aucune application ne peut ouvrir cela</string>
|
||||
<string name="pick_search_engine">Choisir un moteur de recherche</string>
|
||||
<string name="format">Format</string>
|
||||
<string name="size">Taille en pixels</string>
|
||||
<string name="width_by_height">%1$d×%2$d</string>
|
||||
<string name="input_content_here">Votre contenu ici</string>
|
||||
<string name="unescape">Expand escape sequences</string>
|
||||
<string name="size_width_by_height">Taille en pixels : %1$d×%2$d</string>
|
||||
<string name="margin_size">Marge en pixels : %1$d</string>
|
||||
<string name="input_content_here">Insérer le contenu ici</string>
|
||||
<string name="unescape">Étendre les caractères d\'échappement</string>
|
||||
<string name="encode">ENCODER</string>
|
||||
<string name="error_no_content">Contenu manquant</string>
|
||||
<string name="error_encoding_barcode">Le code-barres ne peut pas être généré</string>
|
||||
<string name="view_barcode">Voir le code barre</string>
|
||||
<string name="info">Info</string>
|
||||
<string name="switch_camera">Changer de camera</string>
|
||||
<string name="bulk_mode">Scan continu</string>
|
||||
<string name="bulk_mode_summary">Démarre toujours en scan continu.</string>
|
||||
<string name="view_barcode">Voir le code-barres</string>
|
||||
<string name="info">Informations</string>
|
||||
<string name="switch_camera">Changer de caméra</string>
|
||||
<string name="bulk_mode">Scanner en continu</string>
|
||||
<string name="bulk_mode_summary">Toujours démarrer avec le scan en continu.</string>
|
||||
<string name="bulk_mode_delay">Délai entre les scans continus</string>
|
||||
<string name="restrict_format">Restreindre le format</string>
|
||||
<string name="remove_restriction">Supprimer la restriction</string>
|
||||
@@ -69,22 +69,22 @@
|
||||
<string name="locale_category">Langue</string>
|
||||
<string name="custom_locale">Langue personnalisée</string>
|
||||
<string name="follow_system_settings">Suivre les réglages du système</string>
|
||||
<string name="show_crop_handle">Afficher le bouton de rognage</string>
|
||||
<string name="show_crop_handle_summary">Restreint le scan à une région personnalisée.</string>
|
||||
<string name="show_crop_handle">Afficher le contrôle du cadrage</string>
|
||||
<string name="show_crop_handle_summary">Restreindre le scan à une zone personnalisée.</string>
|
||||
<string name="barcode_formats">Formats de codes-barres</string>
|
||||
<string name="zoom_by_swiping">Balayage haut/bas pour zoomer</string>
|
||||
<string name="zoom_by_swiping_summary">Balayez vers le haut ou vers le bas dans l’écran de la caméra pour contrôler le zoom de la caméra.</string>
|
||||
<string name="zoom_by_swiping_summary">Balayer vers le haut ou vers le bas de l’écran pour contrôler le niveau de zoom de la caméra.</string>
|
||||
<string name="auto_rotate">Reconnaître les codes-barres 1D verticaux</string>
|
||||
<string name="auto_rotate_summary">Tourne automatiquement le cadre de la caméra pour reconnaître les codes-barres 1D verticaux. En fonction de l\'appareil, cela peut affecter les performances.</string>
|
||||
<string name="auto_rotate_summary">Tourner automatiquement le cadre de la caméra pour reconnaître les codes-barres 1D verticaux. En fonction de l\'appareil, cela peut affecter les performances.</string>
|
||||
<string name="try_harder">Optimiser la précision du lecteur</string>
|
||||
<string name="try_harder_summary">Activez cette option pour les codes très difficiles à lire. Affectera les performances.</string>
|
||||
<string name="try_harder_summary">Activer cette option pour les codes très difficiles à lire. Les performances seront affectées.</string>
|
||||
<string name="show_toast_in_bulk_mode">Afficher les données en mode continu</string>
|
||||
<string name="show_toast_in_bulk_mode_summary">Afficher brièvement les données lors d\'un scan en continu.</string>
|
||||
<string name="vibrate">Vibrer à la détection</string>
|
||||
<string name="vibrate_summary">Fait vibrer l\'appareil lorsqu\'un code est reconnu.</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="vibrate_summary">Faire vibrer l\'appareil lorsqu\'un code est détecté.</string>
|
||||
<string name="beep">Biper à la détection</string>
|
||||
<string name="beep_summary">Émettre un son lorsqu\'un code est détecté.</string>
|
||||
<string name="beep_tone">Tonalité du signal sonore</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>
|
||||
@@ -92,32 +92,32 @@
|
||||
<string name="tone_prop_beep">General beep</string>
|
||||
<string name="tone_prop_beep2">General double beep</string>
|
||||
<string name="use_history">Sauvegarder l\'historique des scans</string>
|
||||
<string name="use_history_summary">Sauvegarde les codes reconnus sur votre appareil.</string>
|
||||
<string name="use_history_summary">Sauvegarder les codes reconnus sur votre appareil.</string>
|
||||
<string name="ignore_consecutive_duplicates">Ignorer les doublons</string>
|
||||
<string name="ignore_consecutive_duplicates_summary">Ne sauvegarde pas les doublons dans l\'historique des scans.</string>
|
||||
<string name="ignore_consecutive_duplicates_summary">Ne pas sauvegarder les doublons dans l\'historique des scans.</string>
|
||||
<string name="open_immediately">Ouvrir immédiatement</string>
|
||||
<string name="open_immediately_summary">Saute l\'inspection et ouvre le contenu immédiatement. Si activé, cela peut ouvrir un contenu nocif.</string>
|
||||
<string name="copy_immediately">Mettre dans le presse-papiers</string>
|
||||
<string name="copy_immediately_summary">Copie automatiquement les contenus scannés dans le presse-papiers. Veuillez noter que les autres applications peuvent fouiner dans votre presse-papiers en arrière-plan.</string>
|
||||
<string name="show_meta_data">Afficher les méta-données</string>
|
||||
<string name="show_meta_data_summary">Affiche les données supplémentaires sur le code-barres scanné.</string>
|
||||
<string name="show_hex_dump">Afficher le dump hexa</string>
|
||||
<string name="show_hex_dump_summary">Affiche le dump hexadécimal du contenu scanné.</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>
|
||||
<string name="copy_immediately_summary">Copier automatiquement les contenus scannés dans le presse-papiers. Veuillez noter que d\'autres applications peuvent lire dans votre presse-papiers en arrière-plan.</string>
|
||||
<string name="show_meta_data">Afficher les métadonnées</string>
|
||||
<string name="show_meta_data_summary">Afficher des informations supplémentaires sur le code-barres scanné.</string>
|
||||
<string name="show_hex_dump">Afficher le dump hexadécimal</string>
|
||||
<string name="show_hex_dump_summary">Afficher le dump hexadécimal du contenu scanné.</string>
|
||||
<string name="show_recreation">Afficher le code-barres recréé</string>
|
||||
<string name="show_recreation_summary">Recrée et affiche, si possible, le code-barres à partir du contenu lu.</string>
|
||||
<string name="show_recreation_summary">Recréer et afficher, si possible, le code-barres à partir du contenu scanné.</string>
|
||||
<string name="close_automatically">Revenir après une copie/partage</string>
|
||||
<string name="close_automatically_summary">Revient automatiquement sur l\'écran de scan après avoir copié ou partagé le contenu lu.</string>
|
||||
<string name="close_automatically_summary">Revenir automatiquement sur l\'écran de scan après avoir copié ou partagé le contenu scanné.</string>
|
||||
<string name="default_search_engine">Ouvrir les données inconnues dans</string>
|
||||
<string name="always_ask">Toujours demander</string>
|
||||
<string name="open_with_url">Ouvrir des données inconnues avec l’URL</string>
|
||||
<string name="open_with_url">Ouvrir les données inconnues avec l’URL</string>
|
||||
<string name="clear_network_suggestions">Supprimer les suggestions de réseau</string>
|
||||
<string name="clear_network_suggestions_summary">Supprime toutes les suggestions de réseau précédemment fournies par cette application.</string>
|
||||
<string name="really_remove_all_networks">Supprimer vraiment tous les réseaux ?</string>
|
||||
<string name="clear_network_suggestions_success">Suggestions de réseau supprimées</string>
|
||||
<string name="clear_network_suggestions_summary">Supprimer toutes les suggestions de réseau précédemment fournies par cette application.</string>
|
||||
<string name="really_remove_all_networks">Vraiment supprimer tous les réseaux ?</string>
|
||||
<string name="clear_network_suggestions_success">Suggestion(s) de réseau(x) supprimée(s)</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">Rien à supprimer</string>
|
||||
<string name="send_category">Transfert</string>
|
||||
<string name="send_scan_active">Transférer les scans</string>
|
||||
<string name="send_scan_active_summary">Transfère les scans vers une URL donnée.</string>
|
||||
<string name="send_scan_active_summary">Transférer les scans vers une URL donnée.</string>
|
||||
<string name="send_scan_url">URL de transfert</string>
|
||||
<string name="send_scan_type">Type de requête</string>
|
||||
<string name="send_type_get_add_content">GET et ajouter simplement le contenu</string>
|
||||
@@ -126,19 +126,19 @@
|
||||
<string name="send_type_post_json">POST application/json</string>
|
||||
<string name="send_type_external_browser">Ouvrir dans un navigateur externe</string>
|
||||
<string name="test_url">Tester l\'URL</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">Partager les scans par Bluetooth</string>
|
||||
<string name="send_scan_bluetooth_summary">Partager les scans à un hôte Bluetooth donné.</string>
|
||||
<string name="send_scan_bluetooth_host">Hôte</string>
|
||||
<string name="no_bluetooth_hosts_paired">Aucun hôte appairé</string>
|
||||
<string name="bluetooth_connect_fail">Impossible de se connecter à l\'appareil Bluetooth.</string>
|
||||
<string name="bluetooth_send_fail">Impossible d\'envoyer à l\'appareil Bluetooth.</string>
|
||||
<string name="bluetooth_send_success">Envoi Bluetooth réussi.</string>
|
||||
<string name="really_remove_scan">Supprimer le scan ?</string>
|
||||
<string name="really_remove_all_scans">Supprimer tous les scans ?</string>
|
||||
<string name="really_remove_selected_scans">Supprimer les scans sélectionnés ?</string>
|
||||
<string name="clear_history">Effacer l\'historique</string>
|
||||
<string name="clear_history">Supprimer l\'historique</string>
|
||||
<string name="copy_scan">Copier le scan</string>
|
||||
<string name="edit_scan">Éditer l\'étiquette</string>
|
||||
<string name="edit_scan">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>
|
||||
@@ -150,9 +150,9 @@
|
||||
<string name="file_name">Nom du fichier</string>
|
||||
<string name="error_saving_file">Impossible de sauvegarder le fichier</string>
|
||||
<string name="error_file_exists">Fichier déjà existant</string>
|
||||
<string name="connect_to_wifi">Connecter au WiFi</string>
|
||||
<string name="wifi_config_failed">Impossible de configurer le WiFi</string>
|
||||
<string name="wifi_added">WiFi ajouté</string>
|
||||
<string name="connect_to_wifi">Connecter au Wi-Fi</string>
|
||||
<string name="wifi_config_failed">Impossible de configurer le Wi-Fi</string>
|
||||
<string name="wifi_added">Wi-Fi ajouté</string>
|
||||
<string name="sms_send">Envoyer SMS</string>
|
||||
<string name="sms_error">Impossible d\'envoyer le SMS</string>
|
||||
<string name="tel_dial">Numéro de téléphone</string>
|
||||
@@ -163,20 +163,21 @@
|
||||
<string name="vcard_failed">Impossible d\'ajouter aux contacts</string>
|
||||
<string name="vevent_add">Ajouter à l\'agenda</string>
|
||||
<string name="vevent_failed">Impossible d\'ajouter à l\'agenda</string>
|
||||
<string name="otpauth_add">Ajouter 2FA</string>
|
||||
<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="export_to_file">Exporter comme fichier</string>
|
||||
<string name="export_as">Exporter comme ?</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>
|
||||
<string name="export_csv_semicolon">CSV avec points-virgules</string>
|
||||
<string name="export_json">Exporter comme JSON</string>
|
||||
<string name="export_json">Exporter en tant que JSON</string>
|
||||
<string name="export_database">Exporter la base de données SQLite</string>
|
||||
<string name="saved_in_downloads">Sauvegardé dans les Téléchargements</string>
|
||||
<string name="rotate_image_cw">Tourner l\'image dans le sens horaire</string>
|
||||
<string name="toggle_free_rotation">Activer la rotation libre</string>
|
||||
<string name="pick_file">Choisir un fichier image</string>
|
||||
<string name="pick_code_to_scan">Choisissez le code à scanner</string>
|
||||
<string name="pick_file">Choisir un fichier</string>
|
||||
<string name="pick_image_file">Choisir un fichier image</string>
|
||||
<string name="pick_code_to_scan">Choisir le code à scanner</string>
|
||||
<string name="shortcut_decode">Scanner un code-barres</string>
|
||||
<string name="shortcut_encode">Créer un code-barres</string>
|
||||
<string name="shortcut_preferences">Réglages</string>
|
||||
@@ -191,6 +192,6 @@
|
||||
<string name="wifi_anonymous_identity">Identité anonyme</string>
|
||||
<string name="wifi_identity">Identité</string>
|
||||
<string name="wifi_phase2">Méthode de la phase 2</string>
|
||||
<string name="network_suggestions">Network suggestions</string>
|
||||
<string name="remove_suggestion">Remove suggestion</string>
|
||||
<string name="network_suggestions">Suggestions de réseaux</string>
|
||||
<string name="remove_suggestion">Supprimer les suggestions</string>
|
||||
</resources>
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
<string name="toggle_flash">Vaku be- vagy kikapcsolása</string>
|
||||
<string name="error_flash">Hiba a vaku be- vagy kikapcsolásakor</string>
|
||||
<string name="share">Megosztás</string>
|
||||
<string name="share_file">Share as file</string>
|
||||
<string name="share_as">Megosztja másként?</string>
|
||||
<string name="copy_to_clipboard">Másolás a vágólapra</string>
|
||||
<string name="copied_to_clipboard">Vágólapra helyezés</string>
|
||||
@@ -40,8 +41,8 @@
|
||||
<string name="cannot_resolve_action">Nincs alkalmazás, amely meg tudná nyitni azt</string>
|
||||
<string name="pick_search_engine">Válasszon keresőmotort</string>
|
||||
<string name="format">Formátum</string>
|
||||
<string name="size">Méret képpontban</string>
|
||||
<string name="width_by_height">%1$d×%2$d</string>
|
||||
<string name="size_width_by_height">Méret képpontban: %1$d×%2$d</string>
|
||||
<string name="margin_size">Margin in pixels: %1$d</string>
|
||||
<string name="input_content_here">Itt adja meg a tartalmat</string>
|
||||
<string name="unescape">Expand escape sequences</string>
|
||||
<string name="encode">KÓDOLÁS</string>
|
||||
@@ -174,7 +175,8 @@
|
||||
<string name="saved_in_downloads">Elmentve a letöltésekbe</string>
|
||||
<string name="rotate_image_cw">Kép forgatása jobbra</string>
|
||||
<string name="toggle_free_rotation">Toggle free rotation</string>
|
||||
<string name="pick_file">Képfájl kiválasztása</string>
|
||||
<string name="pick_file">Pick a file</string>
|
||||
<string name="pick_image_file">Képfájl kiválasztása</string>
|
||||
<string name="pick_code_to_scan">Kód kiválasztása a beolvasáshoz</string>
|
||||
<string name="shortcut_decode">Vonalkód beolvasása</string>
|
||||
<string name="shortcut_encode">Vonalkód létrehozása</string>
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
<string name="toggle_flash">Nyala/matikan blitz</string>
|
||||
<string name="error_flash">Galat nyala/matikan blitz</string>
|
||||
<string name="share">Bagikan</string>
|
||||
<string name="share_file">Share as file</string>
|
||||
<string name="share_as">Bagikan sebagai?</string>
|
||||
<string name="copy_to_clipboard">Salin ke clipboard</string>
|
||||
<string name="copied_to_clipboard">Disalin ke clipboard</string>
|
||||
@@ -39,8 +40,8 @@
|
||||
<string name="cannot_resolve_action">Tidak ada aplikasi yang bisa membukanya</string>
|
||||
<string name="pick_search_engine">Pilih mesin pencari</string>
|
||||
<string name="format">Format</string>
|
||||
<string name="size">Ukuran dalam piksel</string>
|
||||
<string name="width_by_height">%1$d×%2$d</string>
|
||||
<string name="size_width_by_height">Ukuran dalam piksel: %1$d×%2$d</string>
|
||||
<string name="margin_size">Margin in pixels: %1$d</string>
|
||||
<string name="input_content_here">Masukkan konten di sini</string>
|
||||
<string name="unescape">Expand escape sequences</string>
|
||||
<string name="encode">ENKODE</string>
|
||||
@@ -173,7 +174,8 @@
|
||||
<string name="saved_in_downloads">Simpan di dalam unduhan</string>
|
||||
<string name="rotate_image_cw">Putar gambar searah jarum jam</string>
|
||||
<string name="toggle_free_rotation">Nyala/matikan rotasi bebas</string>
|
||||
<string name="pick_file">Pilih berkas gambar</string>
|
||||
<string name="pick_file">Pick a file</string>
|
||||
<string name="pick_image_file">Pilih berkas gambar</string>
|
||||
<string name="pick_code_to_scan">Pilih kode untuk dipindai</string>
|
||||
<string name="shortcut_decode">Pindai barcode</string>
|
||||
<string name="shortcut_encode">Buat barcode</string>
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
<string name="toggle_flash">Attiva/disattiva flash</string>
|
||||
<string name="error_flash">Errore durante l\'attivazione/disattivazione del flash</string>
|
||||
<string name="share">Condividi</string>
|
||||
<string name="share_file">Share as file</string>
|
||||
<string name="share_as">Condividi come?</string>
|
||||
<string name="copy_to_clipboard">Copia negli Appunti</string>
|
||||
<string name="copied_to_clipboard">Copiato negli Appunti</string>
|
||||
@@ -40,8 +41,8 @@
|
||||
<string name="cannot_resolve_action">Nessuna app può aprirlo</string>
|
||||
<string name="pick_search_engine">Scegli motore di ricerca</string>
|
||||
<string name="format">Formato</string>
|
||||
<string name="size">Dimensioni (pixel)</string>
|
||||
<string name="width_by_height">%1$d×%2$d</string>
|
||||
<string name="size_width_by_height">Dimensioni (pixel): %1$d×%2$d</string>
|
||||
<string name="margin_size">Margin in pixels: %1$d</string>
|
||||
<string name="input_content_here">Inserisci qui il contenuto</string>
|
||||
<string name="unescape">Espandi sequenze escape</string>
|
||||
<string name="encode">CODIFICA</string>
|
||||
@@ -174,7 +175,8 @@
|
||||
<string name="saved_in_downloads">Salvato nei download</string>
|
||||
<string name="rotate_image_cw">Ruota immagine in senso orario</string>
|
||||
<string name="toggle_free_rotation">Abilita/disabilita rotazione libera</string>
|
||||
<string name="pick_file">Scegli file immagine</string>
|
||||
<string name="pick_file">Pick a file</string>
|
||||
<string name="pick_image_file">Scegli file immagine</string>
|
||||
<string name="pick_code_to_scan">Scegli codice da scansionare</string>
|
||||
<string name="shortcut_decode">Scansiona un codice a barre</string>
|
||||
<string name="shortcut_encode">Crea un codice a barre</string>
|
||||
|
||||
@@ -30,6 +30,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_as">画像形式を選択</string>
|
||||
<string name="copy_to_clipboard">クリップボードにコピー</string>
|
||||
<string name="copied_to_clipboard">クリップボードにコピーされました</string>
|
||||
@@ -39,8 +40,8 @@
|
||||
<string name="cannot_resolve_action">開くためのアプリがありません!</string>
|
||||
<string name="pick_search_engine">検索エンジンを選択</string>
|
||||
<string name="format">フォーマット</string>
|
||||
<string name="size">大きさ(ピクセル)</string>
|
||||
<string name="width_by_height">%1$d×%2$d</string>
|
||||
<string name="size_width_by_height">大きさ(ピクセル): %1$d×%2$d</string>
|
||||
<string name="margin_size">Margin in pixels: %1$d</string>
|
||||
<string name="input_content_here">ここに内容を入力</string>
|
||||
<string name="unescape">Expand escape sequences</string>
|
||||
<string name="encode">エンコード</string>
|
||||
@@ -173,7 +174,8 @@
|
||||
<string name="saved_in_downloads">ダウンロードフォルダに保存されました</string>
|
||||
<string name="rotate_image_cw">時計回りに回転</string>
|
||||
<string name="toggle_free_rotation">Toggle free rotation</string>
|
||||
<string name="pick_file">画像を選択して読み込み</string>
|
||||
<string name="pick_file">Pick a file</string>
|
||||
<string name="pick_image_file">画像を選択して読み込み</string>
|
||||
<string name="pick_code_to_scan">スキャンするバーコードを選択</string>
|
||||
<string name="shortcut_decode">バーコードをスキャン</string>
|
||||
<string name="shortcut_encode">バーコードを作成</string>
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
<string name="toggle_flash">განათების ჩართვა</string>
|
||||
<string name="error_flash">Error toggling flash</string>
|
||||
<string name="share">გაზიარება</string>
|
||||
<string name="share_file">Share as file</string>
|
||||
<string name="share_as">Share as?</string>
|
||||
<string name="copy_to_clipboard">გაცვლის ბუფერში კოპირება</string>
|
||||
<string name="copied_to_clipboard">კოპირებულია გაცვლის ბუფერში</string>
|
||||
@@ -40,8 +41,8 @@
|
||||
<string name="cannot_resolve_action">ამ მოქმედებისთვის აპლიკაცია ნაპოვნი არაა</string>
|
||||
<string name="pick_search_engine">აირჩიეთ საძიებო სისტემა</string>
|
||||
<string name="format">ფორმატი</string>
|
||||
<string name="size">ზომა პიქსელებში</string>
|
||||
<string name="width_by_height">%1$d×%2$d</string>
|
||||
<string name="size_width_by_height">ზომა პიქსელებში: %1$d×%2$d</string>
|
||||
<string name="margin_size">Margin in pixels: %1$d</string>
|
||||
<string name="input_content_here">შეიყვანეთ ტექსტი აქ</string>
|
||||
<string name="unescape">Expand escape sequences</string>
|
||||
<string name="encode">შექმნა"</string>
|
||||
@@ -174,7 +175,8 @@
|
||||
<string name="saved_in_downloads">შენახულია გადმოწერებში</string>
|
||||
<string name="rotate_image_cw">გამოსახულების შემობრუნება საათის ისრის მიხედვით</string>
|
||||
<string name="toggle_free_rotation">Toggle free rotation</string>
|
||||
<string name="pick_file">აირჩიეთ ფაილი გამოსახულებით</string>
|
||||
<string name="pick_file">Pick a file</string>
|
||||
<string name="pick_image_file">აირჩიეთ ფაილი გამოსახულებით</string>
|
||||
<string name="pick_code_to_scan">აირჩიეთ შტრიხ-კოდი სკანირებისთვის</string>
|
||||
<string name="shortcut_decode">შტრიხ-კოდის სკანირება</string>
|
||||
<string name="shortcut_encode">შტრიხ-კოდის შექმნა</string>
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
<string name="toggle_flash">Toggle flash</string>
|
||||
<string name="error_flash">Error toggling flash</string>
|
||||
<string name="share">Share</string>
|
||||
<string name="share_file">Share as file</string>
|
||||
<string name="share_as">Share as?</string>
|
||||
<string name="copy_to_clipboard">Copy to clipboard</string>
|
||||
<string name="copied_to_clipboard">Copied to clipboard</string>
|
||||
@@ -39,8 +40,8 @@
|
||||
<string name="cannot_resolve_action">No application can open that</string>
|
||||
<string name="pick_search_engine">Pick a search engine</string>
|
||||
<string name="format">Format</string>
|
||||
<string name="size">Size in pixels</string>
|
||||
<string name="width_by_height">%1$d×%2$d</string>
|
||||
<string name="size_width_by_height">Size in pixels: %1$d×%2$d</string>
|
||||
<string name="margin_size">Margin in pixels: %1$d</string>
|
||||
<string name="input_content_here">Input content here</string>
|
||||
<string name="unescape">Expand escape sequences</string>
|
||||
<string name="encode">ENCODE</string>
|
||||
@@ -173,7 +174,8 @@
|
||||
<string name="saved_in_downloads">Saved in downloads</string>
|
||||
<string name="rotate_image_cw">Rotate image clockwise</string>
|
||||
<string name="toggle_free_rotation">Toggle free rotation</string>
|
||||
<string name="pick_file">Pick image file</string>
|
||||
<string name="pick_file">Pick a file</string>
|
||||
<string name="pick_image_file">Pick image file</string>
|
||||
<string name="pick_code_to_scan">Pick code to scan</string>
|
||||
<string name="shortcut_decode">Scan a barcode</string>
|
||||
<string name="shortcut_encode">Create a barcode</string>
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
<string name="toggle_flash">Zaklamp aan/uit</string>
|
||||
<string name="error_flash">Error toggling flash</string>
|
||||
<string name="share">Delen</string>
|
||||
<string name="share_file">Share as file</string>
|
||||
<string name="share_as">Delen als?</string>
|
||||
<string name="copy_to_clipboard">Naar klembord kopiëren</string>
|
||||
<string name="copied_to_clipboard">Naar klembord gekopieerd</string>
|
||||
@@ -40,8 +41,8 @@
|
||||
<string name="cannot_resolve_action">Geen enkele toepassing kan dat openen</string>
|
||||
<string name="pick_search_engine">Zoekmachine kiezen</string>
|
||||
<string name="format">Format</string>
|
||||
<string name="size">Afmeting in pixels</string>
|
||||
<string name="width_by_height">%1$d×%2$d</string>
|
||||
<string name="size_width_by_height">Afmeting in pixels: %1$d×%2$d</string>
|
||||
<string name="margin_size">Margin in pixels: %1$d</string>
|
||||
<string name="input_content_here">Voer hier de inhoud in</string>
|
||||
<string name="unescape">Expand escape sequences</string>
|
||||
<string name="encode">Coderen</string>
|
||||
@@ -174,7 +175,8 @@
|
||||
<string name="saved_in_downloads">Opgeslagen in downloads</string>
|
||||
<string name="rotate_image_cw">Afbeelding rechtsom draaien</string>
|
||||
<string name="toggle_free_rotation">Toggle free rotation</string>
|
||||
<string name="pick_file">Beeldbestand kiezen</string>
|
||||
<string name="pick_file">Pick a file</string>
|
||||
<string name="pick_image_file">Beeldbestand kiezen</string>
|
||||
<string name="pick_code_to_scan">Kies code om te scannen</string>
|
||||
<string name="shortcut_decode">Een barcode scannen</string>
|
||||
<string name="shortcut_encode">Een barcode aanmaken</string>
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
<string name="vevent_add">Dodaj do kalendarza</string>
|
||||
<string name="shortcut_preferences">Ustawienia</string>
|
||||
<string name="share">Udostępnij</string>
|
||||
<string name="share_file">Share as file</string>
|
||||
<string name="share_as">Udostępnij jako?</string>
|
||||
<string name="error_saving_file">Nie można zapisać pliku</string>
|
||||
<string name="clear_history">Wyczyść historię</string>
|
||||
@@ -18,7 +19,8 @@
|
||||
<string name="file_name">Nazwa pliku</string>
|
||||
<string name="export_json">Eksportuj jako JSON</string>
|
||||
<string name="pick_search_engine">Wybierz wyszukiwarkę</string>
|
||||
<string name="pick_file">Wybierz plik obrazu</string>
|
||||
<string name="pick_file">Pick a file</string>
|
||||
<string name="pick_image_file">Wybierz plik obrazu</string>
|
||||
<string name="pick_code_to_scan">Wybierz kod do zeskanowania</string>
|
||||
<string name="sms_send">Wyślij SMS</string>
|
||||
<string name="mail_send">Wyślij e-mail</string>
|
||||
@@ -57,7 +59,6 @@
|
||||
<string name="copy_scan">Skopiuj skan</string>
|
||||
<string name="vevent_failed">Nie można dodać do kalendarza</string>
|
||||
<string name="wifi_config_failed">Nie można skonfigurować Wi-Fi</string>
|
||||
<string name="size">Rozmiar w pikselach</string>
|
||||
<string name="export_as">Eksportuj jako?</string>
|
||||
<string name="really_remove_all_scans">Czy naprawdę usunąć wszystkie skany?</string>
|
||||
<string name="really_remove_scan">Czy naprawdę usunąć skan?</string>
|
||||
@@ -172,7 +173,8 @@
|
||||
<string name="show_toast_in_bulk_mode">Pokaż dane w trybie ciągłym</string>
|
||||
<string name="show_toast_in_bulk_mode_summary">Zwięźle pokazuje zeskanowane dane podczas skanowania ciągłego.</string>
|
||||
<string name="cannot_resolve_action">Żadna aplikacja nie może tego otworzyć</string>
|
||||
<string name="width_by_height">%1$d×%2$d</string>
|
||||
<string name="size_width_by_height">Rozmiar w pikselach: %1$d×%2$d</string>
|
||||
<string name="margin_size">Margin in pixels: %1$d</string>
|
||||
<string name="input_content_here">Wprowadź zawartość tutaj</string>
|
||||
<string name="unescape">Expand escape sequences</string>
|
||||
<string name="pick_list_separator">Jak oddzielić elementy listy?</string>
|
||||
|
||||
Regular → Executable
+37
-35
@@ -9,7 +9,7 @@
|
||||
<item quantity="one">%2$d caractere, %1$s</item>
|
||||
<item quantity="other">%2$d caracteres, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Nível de correção de erros</string>
|
||||
<string name="error_correction_level">Nível de correção de erro</string>
|
||||
<string name="error_correction_level_l" formatted="false">Baixo (~7% correção)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Médio (~15% correção)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Quartil (~25% correção)</string>
|
||||
@@ -27,10 +27,11 @@
|
||||
<string name="gtin_price">Preço sugerido</string>
|
||||
<string name="gtin_add_on">Extensão UPC EAN</string>
|
||||
<string name="barcode_version_number">Versão</string>
|
||||
<string name="qr_version_and_modules">%1$s (%2$d modules)</string>
|
||||
<string name="qr_version_and_modules">%1$s (%2$d módulos)</string>
|
||||
<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_as">Compartilhar em qual formato?</string>
|
||||
<string name="copy_to_clipboard">Copiar ao clipboard</string>
|
||||
<string name="copied_to_clipboard">Copiado ao clipboard</string>
|
||||
@@ -40,8 +41,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">Tamanho em píxeis</string>
|
||||
<string name="width_by_height">%1$d×%2$d</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="input_content_here">Digite algum conteúdo aqui</string>
|
||||
<string name="unescape">Expandir sequências de escape</string>
|
||||
<string name="encode">CODIFICAR</string>
|
||||
@@ -51,7 +52,7 @@
|
||||
<string name="info">Detalhes</string>
|
||||
<string name="switch_camera">Alterar câmera</string>
|
||||
<string name="bulk_mode">Digitalização contínua</string>
|
||||
<string name="bulk_mode_summary">Sempre executar em modo contínuo.</string>
|
||||
<string name="bulk_mode_summary">Sempre iniciar em modo contínuo.</string>
|
||||
<string name="bulk_mode_delay">Adiar durante digitalização contínua</string>
|
||||
<string name="restrict_format">Limitar formato</string>
|
||||
<string name="remove_restriction">Remover limitação</string>
|
||||
@@ -62,7 +63,7 @@
|
||||
<string name="two_seconds">2 segundos</string>
|
||||
<string name="five_seconds">5 segundos</string>
|
||||
<string name="history">Histórico</string>
|
||||
<string name="preferences">Preferências</string>
|
||||
<string name="preferences">Configurações</string>
|
||||
<string name="scan_category">Digitalização</string>
|
||||
<string name="content_category">Conteúdo</string>
|
||||
<string name="locale_category">Idioma</string>
|
||||
@@ -82,7 +83,7 @@
|
||||
<string name="vibrate">Vibrar ao reconhecer</string>
|
||||
<string name="vibrate_summary">Ative esta opção se quiser que seu dispositivo vibre ao reconhecer um código.</string>
|
||||
<string name="beep">Bipar ao reconhecer</string>
|
||||
<string name="beep_summary">Ative esta opção se quiser ouvir um bip ao reconhecer um código.</string>
|
||||
<string name="beep_summary">Ative esta opção se quiser ouvir um bipe ao reconhecer um código.</string>
|
||||
<string name="beep_tone">Tipo do bipe</string>
|
||||
<string name="tone_cdma_confirm">Confirmação CDMA</string>
|
||||
<string name="tone_sup_confirm">Confirmação de controle</string>
|
||||
@@ -97,27 +98,27 @@
|
||||
<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>
|
||||
<string name="copy_immediately_summary">Copiar automaticamente um conteúdo digitalizado ao clipboard. Tem cuidado porque outros apps podem examinar seu clipboard em segundo plano.</string>
|
||||
<string name="copy_immediately_summary">Copiar automaticamente ao clipboard um conteúdo digitalizado. Tem cuidado porque outros apps podem examinar seu clipboard em segundo plano.</string>
|
||||
<string name="show_meta_data">Mostrar metadados</string>
|
||||
<string name="show_meta_data_summary">Mostrar dados adicionais de código digitalizado.</string>
|
||||
<string name="show_hex_dump">Mostrar impressão hexadecimal</string>
|
||||
<string name="show_hex_dump_summary">Mostrar impressão hexadecimal de conteúdo digitalizado.</string>
|
||||
<string name="show_recreation">Mostrar código recriado</string>
|
||||
<string name="show_recreation_summary">Se possível, recriar e mostrar código do conteúdo lido.</string>
|
||||
<string name="show_recreation">Mostrar código recuperado</string>
|
||||
<string name="show_recreation_summary">Se possível, recupere e mostre código do conteúdo lido.</string>
|
||||
<string name="close_automatically">Voltar após copiar/compartilhar</string>
|
||||
<string name="close_automatically_summary">Voltar automaticamente à tela de digitalização após copiar ou compartilhar um código examinado.</string>
|
||||
<string name="default_search_engine">Abrir dados desconhecidos em</string>
|
||||
<string name="always_ask">Sempre perguntar</string>
|
||||
<string name="open_with_url">Abrir dados desconhecidos via URL</string>
|
||||
<string name="clear_network_suggestions">Remover sugestões da rede</string>
|
||||
<string name="clear_network_suggestions_summary">Remover todas as sugestões da rede que foram anteriormente fornecidas pelo app.</string>
|
||||
<string name="really_remove_all_networks">Deseja remover todas as redes?</string>
|
||||
<string name="clear_network_suggestions_success">Sugestões da rede foram removidas</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">Nada para remover</string>
|
||||
<string name="clear_network_suggestions">Excluir sugestões de redes</string>
|
||||
<string name="clear_network_suggestions_summary">Excluir todas as sugestões de redes que foram anteriormente adicionadas ao app.</string>
|
||||
<string name="really_remove_all_networks">Deseja excluir todas as redes?</string>
|
||||
<string name="clear_network_suggestions_success">Sugestões de redes foram excluidas</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">Nada para excluir</string>
|
||||
<string name="send_category">Encaminhamento</string>
|
||||
<string name="send_scan_active">Encaminhar conteúdo digitalizado</string>
|
||||
<string name="send_scan_active_summary">Ative para encaminhar conteúdo digitalizado à URL definida</string>
|
||||
<string name="send_scan_url">URL à qual encaminhar</string>
|
||||
<string name="send_scan_url">Defina a URL para qual encaminhar</string>
|
||||
<string name="send_scan_type">Tipo de solicitação</string>
|
||||
<string name="send_type_get_add_content">GET e somente adicionar um conteúdo</string>
|
||||
<string name="send_type_get_query_string">GET com sequência completa de consulta</string>
|
||||
@@ -125,32 +126,32 @@
|
||||
<string name="send_type_post_json">POST application/json</string>
|
||||
<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 as digitalizações ao Bluetooth</string>
|
||||
<string name="send_scan_bluetooth_summary">Ativar o encaminhamento de digitalizações ao determinado host de Bluetooth.</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_host">Host</string>
|
||||
<string name="no_bluetooth_hosts_paired">Nenhum host emparelhado</string>
|
||||
<string name="bluetooth_connect_fail">Não foi possível conectar ao dispositivo de bluetooth.</string>
|
||||
<string name="bluetooth_send_fail">Não foi possível encaminhar para dispositivo de bluetooth.</string>
|
||||
<string name="bluetooth_send_success">Envio ao bluetooth concluído com sucesso.</string>
|
||||
<string name="really_remove_scan">Deseja remover esta digitalização?</string>
|
||||
<string name="really_remove_all_scans">Deseja remover todas as digitalizações?</string>
|
||||
<string name="really_remove_selected_scans">Deseja remover digitalizações selecionados?</string>
|
||||
<string name="clear_history">Limpar histórico</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>
|
||||
<string name="bluetooth_send_fail">Não foi possível encaminhar para dispositivo Bluetooth.</string>
|
||||
<string name="bluetooth_send_success">Envio ao Bluetooth concluído com sucesso.</string>
|
||||
<string name="really_remove_scan">Deseja excluir esta digitalização?</string>
|
||||
<string name="really_remove_all_scans">Deseja excluir todas as digitalizações?</string>
|
||||
<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="remove_scan">Remover digitalizaçã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 da digitalização</string>
|
||||
<string name="enter_name_hint">Nome de digitalização</string>
|
||||
<string name="no_barcode_found">Nenhum código encontrado</string>
|
||||
<string name="pick_list_separator">Como separar itens da lista?</string>
|
||||
<string name="separator_line_break">Quebra de linha</string>
|
||||
<string name="separator_ruler">Hífen</string>
|
||||
<string name="save_as_file_name">Salvar para Downloads?</string>
|
||||
<string name="save_as_file_name">Salvar na pasta de Downloads?</string>
|
||||
<string name="file_name">Nome do arquivo</string>
|
||||
<string name="error_saving_file">Não foi possível salvar este arquivo</string>
|
||||
<string name="error_file_exists">Arquivo já existe</string>
|
||||
<string name="connect_to_wifi">Conectar a WiFi</string>
|
||||
<string name="wifi_config_failed">Não foi possível configurar WiFi</string>
|
||||
<string name="wifi_config_failed">Não foi possível configurar a WiFi</string>
|
||||
<string name="wifi_added">WiFi adicionado</string>
|
||||
<string name="sms_send">Envie SMS</string>
|
||||
<string name="sms_error">Não foi possível enviar SMS</string>
|
||||
@@ -168,20 +169,21 @@
|
||||
<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>
|
||||
<string name="export_csv_semicolon">Arquivo CSV com ponto-e-vírgula</string>
|
||||
<string name="export_csv_semicolon">Arquivo CSV com ponto e vírgula</string>
|
||||
<string name="export_json">Arquivo JSON</string>
|
||||
<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">Escolha imagem</string>
|
||||
<string name="pick_file">Pick a file</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>
|
||||
<string name="shortcut_encode">Criar código</string>
|
||||
<string name="shortcut_preferences">Configurações</string>
|
||||
<string name="background_request_failed">A solicitação em segundo plano falhou</string>
|
||||
<string name="entry_type">Tipo</string>
|
||||
<string name="wifi_network">Rede Wi-Fi</string>
|
||||
<string name="wifi_network">Rede de Wi-Fi</string>
|
||||
<string name="wifi_ssid">Nome</string>
|
||||
<string name="wifi_type">Tipo de autenticação</string>
|
||||
<string name="wifi_password">Senha</string>
|
||||
@@ -190,6 +192,6 @@
|
||||
<string name="wifi_anonymous_identity">Identidade anônima</string>
|
||||
<string name="wifi_identity">Identidade</string>
|
||||
<string name="wifi_phase2">Método Phase 2</string>
|
||||
<string name="network_suggestions">Network suggestions</string>
|
||||
<string name="remove_suggestion">Remove suggestion</string>
|
||||
<string name="network_suggestions">Sugestões de redes</string>
|
||||
<string name="remove_suggestion">Apagar sugestão</string>
|
||||
</resources>
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
<string name="toggle_flash">Включить вспышку</string>
|
||||
<string name="error_flash">Ошибка при переключении вспышки</string>
|
||||
<string name="share">Поделиться</string>
|
||||
<string name="share_file">Поделиться файлом</string>
|
||||
<string name="share_as">Поделиться как?</string>
|
||||
<string name="copy_to_clipboard">Скопировать в буфер обмена</string>
|
||||
<string name="copied_to_clipboard">Скопировано в буфер обмена</string>
|
||||
@@ -42,8 +43,8 @@
|
||||
<string name="cannot_resolve_action">Не найдено приложение для этого действия</string>
|
||||
<string name="pick_search_engine">Выберите поисковую систему</string>
|
||||
<string name="format">Формат</string>
|
||||
<string name="size">Размер в пикселях</string>
|
||||
<string name="width_by_height">%1$d×%2$d</string>
|
||||
<string name="size_width_by_height">Размер в пикселях: %1$d×%2$d</string>
|
||||
<string name="margin_size">Отступ в пикселях: %1$d</string>
|
||||
<string name="input_content_here">Введите текст здесь</string>
|
||||
<string name="unescape">Раскрывать управляющие последовательности</string>
|
||||
<string name="encode">Создать</string>
|
||||
@@ -176,7 +177,8 @@
|
||||
<string name="saved_in_downloads">Сохранено в загрузках</string>
|
||||
<string name="rotate_image_cw">Повернуть изображение по часовой стрелке</string>
|
||||
<string name="toggle_free_rotation">Переключить свободный поворот</string>
|
||||
<string name="pick_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>
|
||||
<string name="shortcut_encode">Создать штрих-код</string>
|
||||
@@ -189,7 +191,7 @@
|
||||
<string name="wifi_password">Пароль</string>
|
||||
<string name="wifi_hidden">Скрытая сеть</string>
|
||||
<string name="wifi_eap">Тип EAP</string>
|
||||
<string name="wifi_anonymous_identity">Аноним</string>
|
||||
<string name="wifi_anonymous_identity">Анонимно</string>
|
||||
<string name="wifi_identity">Пользователь</string>
|
||||
<string name="wifi_phase2">Двухэтапный метод</string>
|
||||
<string name="network_suggestions">Сетевые предложения</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>
|
||||
|
||||
@@ -31,6 +31,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_as">Şöyle paylaş:</string>
|
||||
<string name="copy_to_clipboard">Panoya kopyala</string>
|
||||
<string name="copied_to_clipboard">Panoya kopyalandı</string>
|
||||
@@ -40,8 +41,8 @@
|
||||
<string name="cannot_resolve_action">Bunu açacak uygulama yok</string>
|
||||
<string name="pick_search_engine">Arama motoru seç</string>
|
||||
<string name="format">Biçim</string>
|
||||
<string name="size">Piksel türünde boyut</string>
|
||||
<string name="width_by_height">%1$d×%2$d</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="input_content_here">İçeriği buraya gir</string>
|
||||
<string name="unescape">Expand escape sequences</string>
|
||||
<string name="encode">KODLA</string>
|
||||
@@ -174,7 +175,8 @@
|
||||
<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">Görüntü dosyası seç</string>
|
||||
<string name="pick_file">Pick a file</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>
|
||||
|
||||
@@ -15,23 +15,24 @@
|
||||
<string name="error_correction_level_m" formatted="false">Середній (~15% виправлення)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Квартиль (~25% виправлення)</string>
|
||||
<string name="error_correction_level_h" formatted="false">Високий (~30% виправлення)</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="colors">Кольори</string>
|
||||
<string name="colors_black_on_white">Чорний на білому</string>
|
||||
<string name="colors_white_on_black">Білий на чорному</string>
|
||||
<string name="colors_black_on_transparent">Чорний на прозорому</string>
|
||||
<string name="colors_white_on_transparent">Білий на прозорому</string>
|
||||
<string name="sequence_size">Розмір послідовності</string>
|
||||
<string name="sequence_index">Індекс послідовності</string>
|
||||
<string name="sequence_id">ID послідовності</string>
|
||||
<string name="gtin_issue_number">Номер випуску</string>
|
||||
<string name="gtin_country">Можлива країна-виробник</string>
|
||||
<string name="gtin_price">Рекомендована ціна</string>
|
||||
<string name="gtin_add_on">Розширення UPC EAN</string>
|
||||
<string name="barcode_version_number">Version</string>
|
||||
<string name="qr_version_and_modules">%1$s (%2$d modules)</string>
|
||||
<string name="barcode_version_number">Версія</string>
|
||||
<string name="qr_version_and_modules">%1$s (%2$d модулі)</string>
|
||||
<string name="toggle_flash">Увімкнути спалах</string>
|
||||
<string name="error_flash">Error toggling flash</string>
|
||||
<string name="error_flash">Помилка під час увімкнення спалаху</string>
|
||||
<string name="share">Поділитися</string>
|
||||
<string name="share_file">Share as file</string>
|
||||
<string name="share_as">Поділитися як?</string>
|
||||
<string name="copy_to_clipboard">Копіювати у буфер обміну</string>
|
||||
<string name="copied_to_clipboard">Скопійовано у буфер обміну</string>
|
||||
@@ -41,10 +42,10 @@
|
||||
<string name="cannot_resolve_action">Жодey додаток не може цього відкрити</string>
|
||||
<string name="pick_search_engine">Вибрати пошукову систему</string>
|
||||
<string name="format">Формат</string>
|
||||
<string name="size">Розмір у пікселях</string>
|
||||
<string name="width_by_height">%1$d×%2$d</string>
|
||||
<string name="size_width_by_height">Розмір у пікселях: %1$d×%2$d</string>
|
||||
<string name="margin_size">Margin in pixels: %1$d</string>
|
||||
<string name="input_content_here">Введіть вміст сюди</string>
|
||||
<string name="unescape">Expand escape sequences</string>
|
||||
<string name="unescape">Розгорнути спеціальні послідовності</string>
|
||||
<string name="encode">КОДУВАТИ</string>
|
||||
<string name="error_no_content">Відсутній вміст</string>
|
||||
<string name="error_encoding_barcode">Неможливо створити штрих-код</string>
|
||||
@@ -54,9 +55,9 @@
|
||||
<string name="bulk_mode">Сканувати безперервно</string>
|
||||
<string name="bulk_mode_summary">Завжди починати безперервне сканування.</string>
|
||||
<string name="bulk_mode_delay">Затримка між безперервним скануванням</string>
|
||||
<string name="restrict_format">Restrict format</string>
|
||||
<string name="remove_restriction">Remove restriction</string>
|
||||
<string name="scan_format">Scan %s</string>
|
||||
<string name="restrict_format">Обмежити формат</string>
|
||||
<string name="remove_restriction">Скасувати обмеження</string>
|
||||
<string name="scan_format">Сканувати %s</string>
|
||||
<string name="quarter_second">Чверть секунди</string>
|
||||
<string name="half_second">Півсекунди</string>
|
||||
<string name="a_second">Одна секунда</string>
|
||||
@@ -82,15 +83,15 @@
|
||||
<string name="show_toast_in_bulk_mode_summary">Коротко показати відскановані дані під час безперервного сканування.</string>
|
||||
<string name="vibrate">Вібрувати при виявленні</string>
|
||||
<string name="vibrate_summary">Увімкніть це, якщо хочете, щоб пристрій вібрував, коли код розпізнано.</string>
|
||||
<string name="beep">Beep on detection</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_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_tone">Тон звуку</string>
|
||||
<string name="tone_cdma_confirm">Підтвердження CDMA</string>
|
||||
<string name="tone_sup_confirm">Підтвердження диспетчерського виклику</string>
|
||||
<string name="tone_sup_radio_ack">Підтвердження прийому по радіоканалу</string>
|
||||
<string name="tone_prop_ack">Позитивне підтвердження</string>
|
||||
<string name="tone_prop_beep">Звичайний сигнал</string>
|
||||
<string name="tone_prop_beep2">Звичайний подвійний сигнал</string>
|
||||
<string name="use_history">Зберігати історію сканування</string>
|
||||
<string name="use_history_summary">Збережіть розпізнані коди на своєму пристрої.</string>
|
||||
<string name="ignore_consecutive_duplicates">Ігнорувати дублікати</string>
|
||||
@@ -103,8 +104,8 @@
|
||||
<string name="show_meta_data_summary">Показувати додаткові дані про відскановані штрих-коди.</string>
|
||||
<string name="show_hex_dump">Показувати шістнадцятковий дамп</string>
|
||||
<string name="show_hex_dump_summary">Показувати шістнадцятковий дамп відсканованого вмісту.</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="show_recreation">Показати відновлений штрих-код</string>
|
||||
<string name="show_recreation_summary">Відтворити і показати штрих-код із прочитаного вмісту, якщо це можливо.</string>
|
||||
<string name="close_automatically">Повернутися після копіювання/поширення</string>
|
||||
<string name="close_automatically_summary">Автоматично повернутися на екран сканування після копіювання або поширення прочитаного вмісту.</string>
|
||||
<string name="default_search_engine">Відкривати невідомі дані в</string>
|
||||
@@ -116,8 +117,8 @@
|
||||
<string name="clear_network_suggestions_success">Мережеві пропозиції очищено</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">Нічого видаляти</string>
|
||||
<string name="send_category">Пересилання</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">Пересилати сканування</string>
|
||||
<string name="send_scan_active_summary">Пересилати скановані дані на вказану URL</string>
|
||||
<string name="send_scan_url">Надсилати кожне сканування на URL</string>
|
||||
<string name="send_scan_type">Тип запиту для кожного сканування</string>
|
||||
<string name="send_type_get_add_content">GET і просто додати контент</string>
|
||||
@@ -126,13 +127,13 @@
|
||||
<string name="send_type_post_json">POST application/json</string>
|
||||
<string name="send_type_external_browser">Відкрити у зовнішньому браузері</string>
|
||||
<string name="test_url">Перевірити URL</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">Пересилати сканування через Bluetooth</string>
|
||||
<string name="send_scan_bluetooth_summary">Пересилати скановані дані на вказаний хост Bluetooth</string>
|
||||
<string name="send_scan_bluetooth_host">Хост</string>
|
||||
<string name="no_bluetooth_hosts_paired">Немає сполучених хостів</string>
|
||||
<string name="bluetooth_connect_fail">Неможливо підключитися до пристрою Bluetooth.</string>
|
||||
<string name="bluetooth_send_fail">Неможливо надіслати на пристрій Bluetooth.</string>
|
||||
<string name="bluetooth_send_success">Успішно надіслано через Bluetooth.</string>
|
||||
<string name="really_remove_scan">Дійсно видалити сканування?</string>
|
||||
<string name="really_remove_all_scans">Дійсно видалити всі сканування?</string>
|
||||
<string name="really_remove_selected_scans">Дійсно видалити вибрані сканування?</string>
|
||||
@@ -174,8 +175,9 @@
|
||||
<string name="export_database">Експортувати базу даних SQLite</string>
|
||||
<string name="saved_in_downloads">Збережено в Завантаженнях</string>
|
||||
<string name="rotate_image_cw">Повернути зображення за годинниковою стрілкою</string>
|
||||
<string name="toggle_free_rotation">Toggle free rotation</string>
|
||||
<string name="pick_file">Вибрати файл зображення</string>
|
||||
<string name="toggle_free_rotation">Увімкнути вільне обертання</string>
|
||||
<string name="pick_file">Pick a file</string>
|
||||
<string name="pick_image_file">Вибрати файл зображення</string>
|
||||
<string name="pick_code_to_scan">Вибрати код для сканування</string>
|
||||
<string name="shortcut_decode">Сканувати штрих-код</string>
|
||||
<string name="shortcut_encode">Створити штрих-код</string>
|
||||
@@ -191,6 +193,6 @@
|
||||
<string name="wifi_anonymous_identity">Анонімна особа</string>
|
||||
<string name="wifi_identity">Користувач</string>
|
||||
<string name="wifi_phase2">Phase 2 метод</string>
|
||||
<string name="network_suggestions">Network suggestions</string>
|
||||
<string name="remove_suggestion">Remove suggestion</string>
|
||||
<string name="network_suggestions">Мережеві пропозиції</string>
|
||||
<string name="remove_suggestion">Видалити пропозицію</string>
|
||||
</resources>
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
<string name="toggle_flash">Bật/tắt đèn</string>
|
||||
<string name="error_flash">Error toggling flash</string>
|
||||
<string name="share">Chia sẻ</string>
|
||||
<string name="share_file">Share as file</string>
|
||||
<string name="share_as">Chia sẻ dưới định dạng?</string>
|
||||
<string name="copy_to_clipboard">Sao chép</string>
|
||||
<string name="copied_to_clipboard">Đã sao chép</string>
|
||||
@@ -39,8 +40,8 @@
|
||||
<string name="cannot_resolve_action">Không có ứng dụng nào mở được nội dung này</string>
|
||||
<string name="pick_search_engine">Chọn một trình tìm kiếm</string>
|
||||
<string name="format">Định dạng</string>
|
||||
<string name="size">Kích cỡ theo pixel</string>
|
||||
<string name="width_by_height">%1$d×%2$d</string>
|
||||
<string name="size_width_by_height">Kích cỡ theo pixel: %1$d×%2$d</string>
|
||||
<string name="margin_size">Margin in pixels: %1$d</string>
|
||||
<string name="input_content_here">Nhập nội dung vào đây</string>
|
||||
<string name="unescape">Expand escape sequences</string>
|
||||
<string name="encode">MÃ HOÁ</string>
|
||||
@@ -173,7 +174,8 @@
|
||||
<string name="saved_in_downloads">Lưu vào Downloads</string>
|
||||
<string name="rotate_image_cw">Quay ảnh theo chiều kim đồng hồ</string>
|
||||
<string name="toggle_free_rotation">Toggle free rotation</string>
|
||||
<string name="pick_file">Chọn tệp ảnh</string>
|
||||
<string name="pick_file">Pick a file</string>
|
||||
<string name="pick_image_file">Chọn tệp ảnh</string>
|
||||
<string name="pick_code_to_scan">Chọn mã để quét</string>
|
||||
<string name="shortcut_decode">Quét mã vạch</string>
|
||||
<string name="shortcut_encode">Tạo mã vạch</string>
|
||||
|
||||
@@ -30,6 +30,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_as">以何种方式分享?</string>
|
||||
<string name="copy_to_clipboard">复制到剪贴板</string>
|
||||
<string name="copied_to_clipboard">已复制到剪贴板</string>
|
||||
@@ -39,10 +40,10 @@
|
||||
<string name="cannot_resolve_action">没有应用可以打开它</string>
|
||||
<string name="pick_search_engine">选择一个搜索引擎</string>
|
||||
<string name="format">编码格式</string>
|
||||
<string name="size">图片尺寸</string>
|
||||
<string name="width_by_height">%1$d×%2$d</string>
|
||||
<string name="size_width_by_height">图片尺寸: %1$d×%2$d</string>
|
||||
<string name="margin_size">Margin in pixels: %1$d</string>
|
||||
<string name="input_content_here">在这里输入内容</string>
|
||||
<string name="unescape">Expand escape sequences</string>
|
||||
<string name="unescape">展开转义字符</string>
|
||||
<string name="encode">编码</string>
|
||||
<string name="error_no_content">缺少内容</string>
|
||||
<string name="error_encoding_barcode">无法生成条码</string>
|
||||
@@ -93,7 +94,7 @@
|
||||
<string name="use_history_summary">在本地保存扫描历史</string>
|
||||
<string name="ignore_consecutive_duplicates">不保存重复历史</string>
|
||||
<string name="ignore_consecutive_duplicates_summary">在扫描历史中不保存重复项</string>
|
||||
<string name="open_immediately">不查看内容立即打开</string>
|
||||
<string name="open_immediately">不检查内容立即打开链接</string>
|
||||
<string name="open_immediately_summary">可能会打开有害内容</string>
|
||||
<string name="copy_immediately">自动复制扫描结果到剪贴板</string>
|
||||
<string name="copy_immediately_summary">注意其他 APP 可能会在后台监控剪贴板</string>
|
||||
@@ -114,9 +115,9 @@
|
||||
<string name="clear_network_suggestions_success">网络建议已清除</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">无内容可清除</string>
|
||||
<string name="send_category">转发</string>
|
||||
<string name="send_scan_active">转发扫描</string>
|
||||
<string name="send_scan_active_summary">启用以转发扫描到给定的 URL</string>
|
||||
<string name="send_scan_url">要转发的 URL</string>
|
||||
<string name="send_scan_active">转发扫描结果</string>
|
||||
<string name="send_scan_active_summary">启用以转发扫描结果至指定的 URL</string>
|
||||
<string name="send_scan_url">转发 URL</string>
|
||||
<string name="send_scan_type">请求类型</string>
|
||||
<string name="send_type_get_add_content">GET 简单附加数据</string>
|
||||
<string name="send_type_get_query_string">GET 完整查询数据</string>
|
||||
@@ -124,13 +125,13 @@
|
||||
<string name="send_type_post_json">POST application/json</string>
|
||||
<string name="send_type_external_browser">在外部浏览器中打开</string>
|
||||
<string name="test_url">测试 URL</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">使用蓝牙转发扫描结果</string>
|
||||
<string name="send_scan_bluetooth_summary">启用以转发扫描结果至指定的蓝牙服务设备</string>
|
||||
<string name="send_scan_bluetooth_host">蓝牙服务器</string>
|
||||
<string name="no_bluetooth_hosts_paired">没有已配对的服务器</string>
|
||||
<string name="bluetooth_connect_fail">无法连接蓝牙设备。</string>
|
||||
<string name="bluetooth_send_fail">无法将结果发送至蓝牙设备</string>
|
||||
<string name="bluetooth_send_success">已通过蓝牙发送</string>
|
||||
<string name="really_remove_scan">确定删除记录?</string>
|
||||
<string name="really_remove_all_scans">确定删除全部记录?</string>
|
||||
<string name="really_remove_selected_scans">确定删除所选记录?</string>
|
||||
@@ -173,7 +174,8 @@
|
||||
<string name="saved_in_downloads">已保存到下载目录</string>
|
||||
<string name="rotate_image_cw">顺时针旋转图片</string>
|
||||
<string name="toggle_free_rotation">切换自由旋转</string>
|
||||
<string name="pick_file">选择图片文件</string>
|
||||
<string name="pick_file">Pick a file</string>
|
||||
<string name="pick_image_file">选择图片文件</string>
|
||||
<string name="pick_code_to_scan">选择扫描编码</string>
|
||||
<string name="shortcut_decode">扫描条码</string>
|
||||
<string name="shortcut_encode">创建条码</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>
|
||||
@@ -30,6 +30,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_as">您要以何種方式分享?</string>
|
||||
<string name="copy_to_clipboard">複製到剪貼簿</string>
|
||||
<string name="copied_to_clipboard">已複製到剪貼簿</string>
|
||||
@@ -39,8 +40,8 @@
|
||||
<string name="cannot_resolve_action">沒有可開啟這個項目的應用程式</string>
|
||||
<string name="pick_search_engine">選擇一個搜尋引擎</string>
|
||||
<string name="format">格式</string>
|
||||
<string name="size">圖片尺寸</string>
|
||||
<string name="width_by_height">%1$d×%2$d</string>
|
||||
<string name="size_width_by_height">圖片尺寸: %1$d×%2$d</string>
|
||||
<string name="margin_size">Margin in pixels: %1$d</string>
|
||||
<string name="input_content_here">請在這裡輸入內容</string>
|
||||
<string name="unescape">展開逸出序列</string>
|
||||
<string name="encode">編碼</string>
|
||||
@@ -173,7 +174,8 @@
|
||||
<string name="saved_in_downloads">已儲存至下載資料夾</string>
|
||||
<string name="rotate_image_cw">順時針旋轉圖片</string>
|
||||
<string name="toggle_free_rotation">切換自由旋轉</string>
|
||||
<string name="pick_file">選擇圖片檔案</string>
|
||||
<string name="pick_file">Pick a file</string>
|
||||
<string name="pick_image_file">選擇圖片檔案</string>
|
||||
<string name="pick_code_to_scan">選擇要掃描的條碼</string>
|
||||
<string name="shortcut_decode">掃描條碼</string>
|
||||
<string name="shortcut_encode">建立條碼</string>
|
||||
|
||||
@@ -15,6 +15,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>
|
||||
@@ -34,6 +35,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>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
<string-array name="locale_names">
|
||||
<item>@string/follow_system_settings</item>
|
||||
<item>English</item>
|
||||
<item>Bulgarian</item>
|
||||
<item>German</item>
|
||||
<item>Spanish</item>
|
||||
<item>French</item>
|
||||
@@ -25,6 +26,7 @@
|
||||
<string-array name="locale_values">
|
||||
<item></item>
|
||||
<item>en</item>
|
||||
<item>bg</item>
|
||||
<item>de</item>
|
||||
<item>es</item>
|
||||
<item>fr</item>
|
||||
|
||||
@@ -2,11 +2,12 @@
|
||||
<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>
|
||||
<item>Yandex</item>
|
||||
<item>ebay</item>
|
||||
<item>eBay</item>
|
||||
<item>Amazon</item>
|
||||
<item>OpenFoodFacts.org</item>
|
||||
<item>OpenBeautyFacts.org</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>
|
||||
|
||||
@@ -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>
|
||||
@@ -27,21 +27,22 @@
|
||||
<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>
|
||||
<string name="share_file">Share as file</string>
|
||||
<string name="share_as">Share as?</string>
|
||||
<string name="copy_to_clipboard">Copy to clipboard</string>
|
||||
<string name="copied_to_clipboard">Copied to clipboard</string>
|
||||
<string name="copy_password">Copy password into clipboard</string>
|
||||
<string name="copied_password_to_clipboard">Password copied to clipboard</string>
|
||||
<string name="open_url">Open url</string>
|
||||
<string name="open_url">Open URL</string>
|
||||
<string name="cannot_resolve_action">No application can open that</string>
|
||||
<string name="pick_search_engine">Pick a search engine</string>
|
||||
<string name="format">Format</string>
|
||||
<string name="size">Size in pixels</string>
|
||||
<string name="width_by_height">%1$d×%2$d</string>
|
||||
<string name="size_width_by_height">Size in pixels: %1$d×%2$d</string>
|
||||
<string name="margin_size">Margin in pixels: %1$d</string>
|
||||
<string name="input_content_here">Input content here</string>
|
||||
<string name="unescape">Expand escape sequences</string>
|
||||
<string name="encode">ENCODE</string>
|
||||
@@ -62,7 +63,7 @@
|
||||
<string name="two_seconds">Two seconds</string>
|
||||
<string name="five_seconds">Five seconds</string>
|
||||
<string name="history">History</string>
|
||||
<string name="preferences">Preferences</string>
|
||||
<string name="preferences">Settings</string>
|
||||
<string name="scan_category">Scan</string>
|
||||
<string name="content_category">Content</string>
|
||||
<string name="locale_category">Language</string>
|
||||
@@ -116,7 +117,7 @@
|
||||
<string name="clear_network_suggestions_nothing_to_remove">Nothing to remove</string>
|
||||
<string name="send_category">Forwarding</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_summary">Enable to forward scans to a given URL.</string>
|
||||
<string name="send_scan_url">URL to forward to</string>
|
||||
<string name="send_scan_type">Request type</string>
|
||||
<string name="send_type_get_add_content">GET and simply add content</string>
|
||||
@@ -126,12 +127,12 @@
|
||||
<string name="send_type_external_browser">Open in external browser</string>
|
||||
<string name="test_url">Test URL</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_summary">Enable to forward 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="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">Really remove scan?</string>
|
||||
<string name="really_remove_all_scans">Really remove all scans?</string>
|
||||
<string name="really_remove_selected_scans">Really remove selected scans?</string>
|
||||
@@ -145,13 +146,13 @@
|
||||
<string name="pick_list_separator">How to separate list items?</string>
|
||||
<string name="separator_line_break">Line break</string>
|
||||
<string name="separator_ruler">Ruler</string>
|
||||
<string name="save_as_file_name">Save as in Downloads file?</string>
|
||||
<string name="save_as_file_name">Save in Downloads folder?</string>
|
||||
<string name="file_name">File name</string>
|
||||
<string name="error_saving_file">Cannot save file</string>
|
||||
<string name="error_file_exists">File already exists</string>
|
||||
<string name="connect_to_wifi">Connect to WiFi</string>
|
||||
<string name="wifi_config_failed">Could not configure WiFi</string>
|
||||
<string name="wifi_added">WiFi added</string>
|
||||
<string name="connect_to_wifi">Connect to Wi-Fi</string>
|
||||
<string name="wifi_config_failed">Could not configure Wi-Fi</string>
|
||||
<string name="wifi_added">Wi-Fi added</string>
|
||||
<string name="sms_send">Send SMS</string>
|
||||
<string name="sms_error">Could not send SMS</string>
|
||||
<string name="tel_dial">Dial number</string>
|
||||
@@ -174,7 +175,8 @@
|
||||
<string name="saved_in_downloads">Saved in downloads</string>
|
||||
<string name="rotate_image_cw">Rotate image clockwise</string>
|
||||
<string name="toggle_free_rotation">Toggle free rotation</string>
|
||||
<string name="pick_file">Pick image file</string>
|
||||
<string name="pick_file">Pick a file</string>
|
||||
<string name="pick_image_file">Pick image file</string>
|
||||
<string name="pick_code_to_scan">Pick code to scan</string>
|
||||
<string name="shortcut_decode">Scan a barcode</string>
|
||||
<string name="shortcut_encode">Create a barcode</string>
|
||||
|
||||
@@ -26,6 +26,12 @@
|
||||
<item name="android:paddingRight">@dimen/button_padding</item>
|
||||
<item name="android:maxLines">1</item>
|
||||
</style>
|
||||
<style name="Spinner">
|
||||
<item name="android:layout_width">match_parent</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:paddingTop">4dp</item>
|
||||
<item name="android:paddingBottom">4dp</item>
|
||||
</style>
|
||||
<style name="FAB" parent="Widget.Design.FloatingActionButton">
|
||||
<!-- Silence nonsense warning about setting a custom background. -->
|
||||
<item name="android:background">@null</item>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
android:key="preferences">
|
||||
<PreferenceCategory android:title="@string/scan_category">
|
||||
<MultiSelectListPreference
|
||||
android:key="barcode_formats"
|
||||
android:key="formats"
|
||||
android:title="@string/barcode_formats"
|
||||
android:entries="@array/barcode_formats_names"
|
||||
android:entryValues="@array/barcode_formats_values"/>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
android:key="preferences">
|
||||
<PreferenceCategory android:title="@string/scan_category">
|
||||
<MultiSelectListPreference
|
||||
android:key="barcode_formats"
|
||||
android:key="formats"
|
||||
android:title="@string/barcode_formats"
|
||||
android:entries="@array/barcode_formats_names"
|
||||
android:entryValues="@array/barcode_formats_values"/>
|
||||
|
||||
@@ -8,15 +8,36 @@ class VTypeTest {
|
||||
fun vcard() {
|
||||
val content = """BEGIN:VCARD
|
||||
N:Doe;John
|
||||
TEL:511
|
||||
END:VCARD"""
|
||||
|
||||
assertEquals("VCARD", VTypeParser.parseVType(content))
|
||||
|
||||
val info = VTypeParser.parseMap(content)
|
||||
|
||||
info["N"]?.singleOrNull()?.also {
|
||||
assertEquals("Doe;John", it.value)
|
||||
}
|
||||
assertEquals("Doe;John", info["N"]?.singleOrNull()?.value)
|
||||
assertEquals("511", info["TEL"]?.singleOrNull()?.value)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun vcardWithExplicitTelType() {
|
||||
val content = """BEGIN:VCARD
|
||||
N:Doe;John
|
||||
TEL;TYPE=WORK:511
|
||||
TEL;HOME:311
|
||||
END:VCARD"""
|
||||
|
||||
assertEquals("VCARD", VTypeParser.parseVType(content))
|
||||
|
||||
val info = VTypeParser.parseMap(content)
|
||||
|
||||
assertEquals("Doe;John", info["N"]?.singleOrNull()?.value)
|
||||
val work = info["TEL"]?.get(0)
|
||||
assertEquals("511", work?.value)
|
||||
assertEquals("WORK", work?.firstTypeOrFirstInfo)
|
||||
val home = info["TEL"]?.get(1)
|
||||
assertEquals("311", home?.value)
|
||||
assertEquals("HOME", home?.firstTypeOrFirstInfo)
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -33,15 +54,18 @@ END:VCALENDAR"""
|
||||
|
||||
val info = VTypeParser.parseMap(content)
|
||||
|
||||
info["SUMMARY"]?.singleOrNull()?.also {
|
||||
assertEquals("foo", it.value)
|
||||
}
|
||||
info["DTSTART"]?.singleOrNull()?.also {
|
||||
assertEquals("20080504T123456Z", it.value)
|
||||
}
|
||||
info["DTEND"]?.singleOrNull()?.also {
|
||||
assertEquals("20080505T234555Z", it.value)
|
||||
}
|
||||
assertEquals(
|
||||
"foo",
|
||||
info["SUMMARY"]?.singleOrNull()?.value
|
||||
)
|
||||
assertEquals(
|
||||
"20080504T123456Z",
|
||||
info["DTSTART"]?.singleOrNull()?.value
|
||||
)
|
||||
assertEquals(
|
||||
"20080505T234555Z",
|
||||
info["DTEND"]?.singleOrNull()?.value
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -56,15 +80,18 @@ END:VEVENT"""
|
||||
|
||||
val info = VTypeParser.parseMap(content)
|
||||
|
||||
info["SUMMARY"]?.singleOrNull()?.also {
|
||||
assertEquals("foo", it.value)
|
||||
}
|
||||
info["DTSTART"]?.singleOrNull()?.also {
|
||||
assertEquals("20080504T123456Z", it.value)
|
||||
}
|
||||
info["DTEND"]?.singleOrNull()?.also {
|
||||
assertEquals("20080505T234555Z", it.value)
|
||||
}
|
||||
assertEquals(
|
||||
"foo",
|
||||
info["SUMMARY"]?.singleOrNull()?.value
|
||||
)
|
||||
assertEquals(
|
||||
"20080504T123456Z",
|
||||
info["DTSTART"]?.singleOrNull()?.value
|
||||
)
|
||||
assertEquals(
|
||||
"20080505T234555Z",
|
||||
info["DTEND"]?.singleOrNull()?.value
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -79,14 +106,17 @@ END:VEVENT"""
|
||||
|
||||
val info = VTypeParser.parseMap(content)
|
||||
|
||||
info["SUMMARY"]?.singleOrNull()?.also {
|
||||
assertEquals("foo", it.value)
|
||||
}
|
||||
info["DTSTART"]?.singleOrNull()?.also {
|
||||
assertEquals("20080504T123456Z", it.value)
|
||||
}
|
||||
info["DTEND"]?.singleOrNull()?.also {
|
||||
assertEquals("20080505T234555Z", it.value)
|
||||
}
|
||||
assertEquals(
|
||||
"foo",
|
||||
info["SUMMARY"]?.singleOrNull()?.value
|
||||
)
|
||||
assertEquals(
|
||||
"20080504T123456Z",
|
||||
info["DTSTART"]?.singleOrNull()?.value
|
||||
)
|
||||
assertEquals(
|
||||
"20080505T234555Z",
|
||||
info["DTEND"]?.singleOrNull()?.value
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
+4
-1
@@ -1,7 +1,10 @@
|
||||
package de.markusfisch.android.binaryeye.actions.wifi
|
||||
|
||||
import de.markusfisch.android.binaryeye.simpleFail
|
||||
import junit.framework.TestCase.*
|
||||
import junit.framework.TestCase.assertEquals
|
||||
import junit.framework.TestCase.assertFalse
|
||||
import junit.framework.TestCase.assertNull
|
||||
import junit.framework.TestCase.assertTrue
|
||||
import org.junit.Test
|
||||
|
||||
class WifiConnectorTest {
|
||||
|
||||
+3
-3
@@ -1,8 +1,8 @@
|
||||
buildscript {
|
||||
ext {
|
||||
kotlin_version = '1.8.0'
|
||||
tools_version = '7.4.2'
|
||||
sdk_version = 33
|
||||
kotlin_version = '1.9.10'
|
||||
tools_version = '8.2.0'
|
||||
sdk_version = 34
|
||||
support_version = '25.3.1'
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
* Fix saving custom language
|
||||
* Update Brazilian Portuguese translation
|
||||
* Update Chinese translation
|
||||
* Update Czech localisation
|
||||
* Update Russian translation
|
||||
* Update Italian language
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
* Support encoding binary data
|
||||
* Add margin parameter for encoding
|
||||
* Add copying binary data as hex dump
|
||||
* Fix parsing TYPE argument in VCARDs
|
||||
* Update Russian translation
|
||||
* Update Brazilian Portuguese translation
|
||||
* Update Ukrainian translation
|
||||
* Update Chinese translation
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
* Share scanned contents as a file
|
||||
* Recreate binary barcodes too
|
||||
* Add Bulgarian translation and Brave search engine
|
||||
* Update Russian translation
|
||||
* Fix general format restriction from preferences
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
* Fix quick settings tile for Android 14
|
||||
* Fix Xiaomi MIUI lockscreen barcode shortcut
|
||||
* Update French translation
|
||||
* Update Czech translation
|
||||
* Update Russian translation
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
横竖翻转都能扫,MD风格,可创建条形码。
|
||||
横竖翻转都能扫的多功能 MD 风格条码扫描器,同时也是条码生成器。
|
||||
|
||||
使用ZXing ("Zebra Crossing") 条形码扫描库。
|
||||
使用 ZXing-C++ ("Zebra Crossing") 条形码扫描库。
|
||||
支持的条形码格式:AZTEC,CODABAR,CODE 39,CODE 93,CODE 128,
|
||||
DATA MATRIX,EAN 8,EAN 13,ITF,PDF417,QR CODE,RSS 14,RSS EXPANDED,
|
||||
UPC A,UPC E 和 UPC EAN 扩展。
|
||||
|
||||
@@ -1 +1 @@
|
||||
一个Android条形码扫描器,开源、免费、无广告。
|
||||
一个 Android 条形码扫描器,开源、免费、无广告。
|
||||
|
||||
@@ -1 +1 @@
|
||||
又一个条码扫描器
|
||||
一个条码扫描器
|
||||
|
||||
@@ -1,2 +1,5 @@
|
||||
org.gradle.jvmargs=-Xmx1536m
|
||||
kotlin.code.style=official
|
||||
android.defaults.buildfeatures.buildconfig=true
|
||||
android.nonTransitiveRClass=false
|
||||
android.nonFinalResIds=false
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
#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.2-bin.zip
|
||||
distributionPath=wrapper/dists
|
||||
zipStorePath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
||||
Reference in New Issue
Block a user