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

Support for saving binary data into external file

Since sharing binary data doesn't make much sense.
This commit is contained in:
Markus Fisch 2019-05-26 15:57:55 +02:00
parent 96e1ef5a52
commit ea9e29b98c
13 changed files with 164 additions and 45 deletions

View File

@ -6,6 +6,7 @@ import com.google.zxing.ResultMetadataType
import de.markusfisch.android.cameraview.widget.CameraView
import de.markusfisch.android.binaryeye.app.db
import de.markusfisch.android.binaryeye.app.hasCameraPermission
import de.markusfisch.android.binaryeye.app.initSystemBars
import de.markusfisch.android.binaryeye.app.prefs
import de.markusfisch.android.binaryeye.rs.Preprocessor
@ -22,8 +23,6 @@ import android.os.Bundle
import android.os.Parcelable
import android.os.Vibrator
import android.provider.MediaStore
import android.support.v4.app.ActivityCompat
import android.support.v4.content.ContextCompat
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.Toolbar
import android.view.Menu
@ -109,7 +108,7 @@ class CameraActivity : AppCompatActivity() {
super.onResume()
System.gc()
returnResult = "com.google.zxing.client.android.SCAN" == intent.action
if (hasCameraPermission()) {
if (hasCameraPermission(this, REQUEST_CAMERA)) {
openCamera()
}
}
@ -227,22 +226,6 @@ class CameraActivity : AppCompatActivity() {
finish()
}
private fun hasCameraPermission(): Boolean {
val permission = android.Manifest.permission.CAMERA
if (ContextCompat.checkSelfPermission(this, permission) !=
PackageManager.PERMISSION_GRANTED
) {
ActivityCompat.requestPermissions(
this, arrayOf(permission),
REQUEST_CAMERA
)
return false
}
return true
}
private fun initCameraView() {
cameraView.setUseOrientationListener(true)
cameraView.setTapToFocus()

View File

@ -0,0 +1,38 @@
package de.markusfisch.android.binaryeye.app
import android.app.Activity
import android.content.pm.PackageManager
import android.support.v4.app.ActivityCompat
import android.support.v4.content.ContextCompat
import android.Manifest
fun hasCameraPermission(activity: Activity, requestCode: Int): Boolean {
return hasPermission(activity, Manifest.permission.CAMERA, requestCode)
}
fun hasWritePermission(activity: Activity, requestCode: Int = 1): Boolean {
return hasPermission(
activity,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
requestCode
)
}
fun hasPermission(
activity: Activity,
permission: String,
requestCode: Int
): Boolean {
return if (ContextCompat.checkSelfPermission(activity, permission) !=
PackageManager.PERMISSION_GRANTED
) {
ActivityCompat.requestPermissions(
activity,
arrayOf(permission),
requestCode
)
false
} else {
true
}
}

View File

@ -1,9 +1,15 @@
package de.markusfisch.android.binaryeye.app
import de.markusfisch.android.binaryeye.BuildConfig
import android.content.Context
import android.content.Intent
import android.os.Build
import android.support.v4.content.FileProvider
import android.net.Uri
import java.io.File
fun shareText(context: Context, text: String, type: String = "text/plain") {
val intent = Intent(Intent.ACTION_SEND)
intent.putExtra(Intent.EXTRA_TEXT, text)
@ -18,3 +24,19 @@ fun shareUri(context: Context, uri: Uri, type: String) {
intent.type = type
context.startActivity(intent)
}
fun shareFile(context: Context, file: File, type: String) {
shareUri(context, getUriForFile(context, file), type)
}
fun getUriForFile(context: Context, file: File): Uri {
return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
Uri.fromFile(file)
} else {
FileProvider.getUriForFile(
context,
BuildConfig.APPLICATION_ID + ".provider",
file
)
}
}

View File

@ -2,17 +2,13 @@ package de.markusfisch.android.binaryeye.fragment
import com.google.zxing.BarcodeFormat
import de.markusfisch.android.binaryeye.app.shareUri
import de.markusfisch.android.binaryeye.app.shareFile
import de.markusfisch.android.binaryeye.zxing.Zxing
import de.markusfisch.android.binaryeye.BuildConfig
import de.markusfisch.android.binaryeye.R
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.graphics.Bitmap
import android.support.v4.app.Fragment
import android.support.v4.content.FileProvider
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
@ -81,11 +77,7 @@ class BarcodeFragment : Fragment() {
val file = saveBitmap(bitmap)
GlobalScope.launch(Main) {
file?.let {
shareUri(
context,
getUriForFile(file),
"image/png"
)
shareFile(context, file, "image/png")
}
}
}
@ -106,18 +98,6 @@ class BarcodeFragment : Fragment() {
}
}
private fun getUriForFile(file: File): Uri {
return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
Uri.fromFile(file)
} else {
FileProvider.getUriForFile(
context,
BuildConfig.APPLICATION_ID + ".provider",
file
)
}
}
companion object {
private const val CONTENT = "content"
private const val FORMAT = "format"

View File

@ -4,14 +4,17 @@ import com.google.zxing.BarcodeFormat
import de.markusfisch.android.binaryeye.app.addFragment
import de.markusfisch.android.binaryeye.app.hasNonPrintableCharacters
import de.markusfisch.android.binaryeye.app.hasWritePermission
import de.markusfisch.android.binaryeye.app.shareText
import de.markusfisch.android.binaryeye.R
import android.app.AlertDialog
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.Environment
import android.support.v4.app.Fragment
import android.text.ClipboardManager
import android.text.Editable
@ -23,9 +26,13 @@ import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import java.io.File
import java.io.IOException
class DecodeFragment : Fragment() {
private lateinit var contentView: EditText
private lateinit var formatView: TextView
@ -53,6 +60,7 @@ class DecodeFragment : Fragment() {
)
val content = arguments?.getString(CONTENT) ?: ""
val raw = arguments?.getByteArray(RAW) ?: content.toByteArray()
isBinary = hasNonPrintableCharacters(content)
format = arguments?.getSerializable(FORMAT) as BarcodeFormat? ?: BarcodeFormat.QR_CODE
@ -88,15 +96,16 @@ class DecodeFragment : Fragment() {
} else {
contentView.setText(R.string.binary_data)
contentView.isEnabled = false
shareFab.visibility = View.GONE
(shareFab as ImageView).setImageResource(R.drawable.ic_action_save)
shareFab.setOnClickListener {
askForFileNameAndSave(raw)
}
}
formatView = view.findViewById(R.id.format)
hexView = view.findViewById(R.id.hex)
updateFormatAndHex(
arguments?.getByteArray(RAW) ?: content.toByteArray()
)
updateFormatAndHex(raw)
return view
}
@ -179,6 +188,28 @@ class DecodeFragment : Fragment() {
}
}
private fun askForFileNameAndSave(raw: ByteArray) {
val ac = activity
ac ?: return
val view = ac.layoutInflater.inflate(R.layout.dialog_save_file, null)
val editText = view.findViewById(R.id.file_name) as EditText
AlertDialog.Builder(ac)
.setView(view)
.setPositiveButton(android.R.string.ok) { _, _ ->
if (hasWritePermission(ac)) {
val messageId = saveByteArray(
ac,
editText.text.toString(),
raw
)
if (messageId > 0) {
Toast.makeText(ac, messageId, Toast.LENGTH_SHORT).show()
}
}
}
.show()
}
companion object {
private const val CONTENT = "content"
private const val FORMAT = "format"
@ -242,3 +273,21 @@ private fun hexDump(bytes: ByteArray, charsPerLine: Int): String {
}
return dump.toString()
}
fun saveByteArray(context: Context, name: String, raw: ByteArray): Int {
return try {
val file = File(
Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DOWNLOADS
),
name
)
if (file.exists()) {
return R.string.error_file_exists
}
file.writeBytes(raw)
0
} catch (e: IOException) {
R.string.error_saving_binary_data
}
}

View File

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M17,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,7l-4,-4zM12,19c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3 3,1.34 3,3 -1.34,3 -3,3zM15,9L5,9L5,5h10v4z"/>
</vector>

View File

@ -0,0 +1,18 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
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/save_as_file_name"/>
<EditText
android:id="@+id/file_name"
android:inputType="text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/file_name" />
</LinearLayout>

View File

@ -34,4 +34,8 @@
<string name="pick_list_separator">Wie sollen die Einträge getrennt werden?</string>
<string name="separator_line_break">Zeilenumbruch</string>
<string name="separator_ruler">Trennstrich</string>
<string name="save_as_file_name">Speichern als?</string>
<string name="file_name">Dateiname</string>
<string name="error_saving_binary_data">Datei konnte nicht gespeichert werden</string>
<string name="error_file_exists">Datei existiert bereits</string>
</resources>

View File

@ -34,4 +34,8 @@
<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 file?</string>
<string name="file_name">File name</string>
<string name="error_saving_binary_data">Cannot save file</string>
<string name="error_file_exists">File already exists</string>
</resources>

View File

@ -34,4 +34,8 @@
<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 file?</string>
<string name="file_name">File name</string>
<string name="error_saving_binary_data">Cannot save file</string>
<string name="error_file_exists">File already exists</string>
</resources>

View File

@ -34,4 +34,8 @@
<string name="pick_list_separator">Come separare elementi di una lista?</string>
<string name="separator_line_break">Interruzione di linea</string>
<string name="separator_ruler">Righello</string>
<string name="save_as_file_name">Save as file?</string>
<string name="file_name">File name</string>
<string name="error_saving_binary_data">Cannot save file</string>
<string name="error_file_exists">File already exists</string>
</resources>

View File

@ -34,4 +34,8 @@
<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 file?</string>
<string name="file_name">File name</string>
<string name="error_saving_binary_data">Cannot save file</string>
<string name="error_file_exists">File already exists</string>
</resources>

View File

@ -34,4 +34,8 @@
<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 file?</string>
<string name="file_name">File name</string>
<string name="error_saving_binary_data">Cannot save file</string>
<string name="error_file_exists">File already exists</string>
</resources>