0
0
mirror of https://github.com/markusfisch/BinaryEye.git synced 2024-09-20 03:52:16 +02:00

Show a hex dump of decoded contents

And update character count when contents are edited too.
This commit is contained in:
Markus Fisch 2019-04-10 21:48:33 +02:00
parent 80c65a48a0
commit 1e3f1c553c
3 changed files with 119 additions and 30 deletions

View File

@ -12,7 +12,6 @@ import de.markusfisch.android.binaryeye.R
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.Toolbar

View File

@ -12,6 +12,8 @@ import android.os.Build
import android.os.Bundle
import android.support.v4.app.Fragment
import android.text.ClipboardManager
import android.text.Editable
import android.text.TextWatcher
import android.view.LayoutInflater
import android.view.Menu
import android.view.MenuInflater
@ -25,6 +27,7 @@ import android.widget.Toast
class DecodeFragment : Fragment() {
private lateinit var contentView: EditText
private lateinit var formatView: TextView
private lateinit var hexView: TextView
private lateinit var format: BarcodeFormat
override fun onCreate(state: Bundle?) {
@ -50,19 +53,44 @@ class DecodeFragment : Fragment() {
contentView = view.findViewById(R.id.content)
contentView.setText(content)
contentView.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable?) {
updateFormatAndHex(contentView.text.toString())
}
override fun beforeTextChanged(
s: CharSequence?,
start: Int,
count: Int,
after: Int
) {}
override fun onTextChanged(
s: CharSequence?,
start: Int,
before: Int,
count: Int
) {}
})
formatView = view.findViewById(R.id.format)
hexView = view.findViewById(R.id.hex)
view.findViewById<View>(R.id.share).setOnClickListener {
share(getContent())
}
updateFormatAndHex(content)
return view
}
private fun updateFormatAndHex(content: String) {
formatView.text = resources.getQuantityString(
R.plurals.barcode_info,
content.length,
format.toString(),
content.length
)
view.findViewById<View>(R.id.share).setOnClickListener {
share(getContent())
}
return view
hexView.text = hexDump(content, 33)
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
@ -135,6 +163,48 @@ class DecodeFragment : Fragment() {
startActivity(intent)
}
private fun hexDump(content: String, charsPerLine: Int): String {
if (charsPerLine < 4 || content.isEmpty()) {
return ""
}
val dump = StringBuilder()
val hex = StringBuilder()
val ascii = StringBuilder()
val itemsPerLine = (charsPerLine - 1) / 4
val len = content.length
var i = 0
while (true) {
val chr = content[i]
val ord = chr.toInt()
hex.append(String.format("%02X ", ord))
ascii.append(if (ord > 31) chr else " ")
++i
val posInLine = i % itemsPerLine
val atEnd = i >= len
var atLineEnd = posInLine == 0
if (atEnd && !atLineEnd) {
for (j in posInLine until itemsPerLine) {
hex.append(" ")
}
atLineEnd = true
}
if (atLineEnd) {
dump.append(hex.toString())
dump.append(" ")
dump.append(ascii.toString())
dump.append("\n")
hex.setLength(0)
ascii.setLength(0)
}
if (atEnd) {
break
}
}
return dump.toString()
}
companion object {
private const val CONTENT = "content"
private const val FORMAT = "format"

View File

@ -4,30 +4,50 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
tools:targetApi="o"
android:id="@+id/content"
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:gravity="start|top"
android:imeOptions="flagNoExtractUi"
android:inputType="textMultiLine"
android:typeface="monospace"
android:hint="@string/content"
android:importantForAutofill="no"/>
<TextView
android:id="@+id/format"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/content"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:layout_marginBottom="16dp"
android:gravity="end|top"
android:textSize="14sp"/>
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
tools:targetApi="o"
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:gravity="start|top"
android:imeOptions="flagNoExtractUi"
android:inputType="textMultiLine"
android:typeface="monospace"
android:hint="@string/content"
android:importantForAutofill="no"/>
<TextView
android:id="@+id/format"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/content"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:layout_marginBottom="16dp"
android:gravity="end|top"
android:textSize="14sp"/>
<TextView
android:id="@+id/hex"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/format"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:layout_marginBottom="16dp"
android:typeface="monospace"
android:textSize="12sp"/>
</RelativeLayout>
</ScrollView>
<android.support.design.widget.FloatingActionButton
tools:ignore="UnusedAttribute"
android:id="@+id/share"