0
0
mirror of https://github.com/markusfisch/BinaryEye.git synced 2024-09-19 19:42:18 +02:00

Support encoding binary data from a file

So binary data can finally be re-encoded too.
This commit is contained in:
Markus Fisch 2023-10-12 21:39:30 +02:00
parent ab8c993a81
commit 72d839c6e2
5 changed files with 139 additions and 32 deletions

View File

@ -65,5 +65,5 @@ dependencies {
implementation "com.android.support:preference-v14:$support_version"
implementation 'com.github.markusfisch:CameraView:1.9.2'
implementation 'com.github.markusfisch:ScalingImageView:1.4.1'
implementation 'com.github.markusfisch:zxing-cpp:v2.1.0.1'
implementation 'com.github.markusfisch:zxing-cpp:v2.1.0.2'
}

View File

@ -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,7 +110,7 @@ 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(
@ -261,7 +261,8 @@ 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"
@ -271,8 +272,8 @@ class BarcodeFragment : Fragment() {
private const val MIME_SVG = "image/svg+xmg"
private const val MIME_TXT = "text/plain"
fun newInstance(
content: String,
fun <T> newInstance(
content: T,
format: Format,
size: Int,
margin: Int,
@ -280,7 +281,21 @@ class BarcodeFragment : Fragment() {
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)
@ -293,8 +308,8 @@ class BarcodeFragment : Fragment() {
}
}
private data class Barcode(
val content: String,
private data class Barcode<T>(
val content: T,
val format: Format,
val size: Int,
val margin: Int,

View File

@ -299,9 +299,6 @@ class DecodeFragment : Fragment() {
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.fragment_decode, menu)
if (isBinary) {
menu.findItem(R.id.create).isVisible = false
}
if (id > 0L) {
menu.findItem(R.id.remove).isVisible = true
}
@ -334,7 +331,10 @@ class DecodeFragment : Fragment() {
R.id.create -> {
fragmentManager?.addFragment(
EncodeFragment.newInstance(content, format)
EncodeFragment.newInstance(
if (isBinary) originalBytes else content,
format
)
)
true
}

View File

@ -1,10 +1,15 @@
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.AdapterView
@ -54,6 +59,35 @@ class EncodeFragment : Fragment() {
)
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.readBytes()
} ?: return
setEncodeByteArray()
}
}
}
}
override fun onCreate(state: Bundle?) {
super.onCreate(state)
setHasOptionsMenu(true)
}
override fun onCreateView(
inflater: LayoutInflater,
@ -156,9 +190,13 @@ class EncodeFragment : Fragment() {
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) {
@ -181,6 +219,29 @@ 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
@ -189,20 +250,25 @@ class EncodeFragment : Fragment() {
}
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(
@ -289,16 +355,33 @@ class EncodeFragment : Fragment() {
return true
}
companion object {
private const val CONTENT = "content"
private const val FORMAT = "format"
private fun setEncodeByteArray() {
contentView.text = null
contentView.hint = getString(R.string.binary_data)
contentView.isEnabled = false
unescapeCheckBox.isEnabled = false
}
fun newInstance(
content: String? = null,
companion object {
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 <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

View File

@ -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>