Added clearing list
This commit is contained in:
@ -1,7 +1,9 @@
|
||||
package net.helcel.fidelity.activity
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
import android.content.pm.ActivityInfo
|
||||
import android.os.Bundle
|
||||
import androidx.activity.addCallback
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
@ -10,38 +12,38 @@ import net.helcel.fidelity.activity.fragment.Launcher
|
||||
import net.helcel.fidelity.databinding.ActMainBinding
|
||||
import net.helcel.fidelity.tools.CacheManager
|
||||
|
||||
@SuppressLint("SourceLockedOrientationActivity")
|
||||
class MainActivity : AppCompatActivity() {
|
||||
|
||||
private lateinit var binding: ActMainBinding
|
||||
|
||||
private lateinit var sharedPreferences: SharedPreferences
|
||||
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
sharedPreferences =
|
||||
this.getSharedPreferences(CacheManager.PREF_NAME, Context.MODE_PRIVATE)
|
||||
CacheManager.loadFidelity(sharedPreferences)
|
||||
|
||||
|
||||
binding = ActMainBinding.inflate(layoutInflater)
|
||||
setContentView(binding.root)
|
||||
|
||||
onBackPressedDispatcher.addCallback(this) {
|
||||
if (supportFragmentManager.backStackEntryCount > 0) {
|
||||
supportFragmentManager.popBackStackImmediate()
|
||||
loadLauncher()
|
||||
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
|
||||
} else {
|
||||
finish()
|
||||
}
|
||||
}
|
||||
|
||||
if (savedInstanceState == null)
|
||||
loadLauncher()
|
||||
|
||||
}
|
||||
|
||||
private fun loadLauncher() {
|
||||
supportFragmentManager.beginTransaction()
|
||||
.add(R.id.container, Launcher())
|
||||
.replace(R.id.container, Launcher())
|
||||
.commit()
|
||||
}
|
||||
}
|
||||
|
@ -67,7 +67,7 @@ class CreateEntry : Fragment() {
|
||||
ErrorToaster.formIncomplete(requireActivity())
|
||||
|
||||
} else {
|
||||
val kpentry = KeepassWrapper.entryCreate(
|
||||
val kpEntry = KeepassWrapper.entryCreate(
|
||||
this,
|
||||
binding.editTextTitle.text.toString(),
|
||||
binding.editTextCode.text.toString(),
|
||||
@ -77,8 +77,8 @@ class CreateEntry : Fragment() {
|
||||
try {
|
||||
resultLauncherAdd.launch(
|
||||
Kp2aControl.getAddEntryIntent(
|
||||
kpentry.first,
|
||||
kpentry.second
|
||||
kpEntry.first,
|
||||
kpEntry.second
|
||||
)
|
||||
)
|
||||
} catch (e: ActivityNotFoundException) {
|
||||
@ -108,23 +108,21 @@ class CreateEntry : Fragment() {
|
||||
binding.editTextCode.error = e.message
|
||||
} catch (e: Exception) {
|
||||
binding.imageViewPreview.setImageBitmap(null)
|
||||
println(e.javaClass)
|
||||
println(e.message)
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
|
||||
private fun isValid(): Boolean {
|
||||
var valid = true
|
||||
if (binding.editTextTitle.text!!.isEmpty()) {
|
||||
if (binding.editTextTitle.text.isNullOrEmpty()) {
|
||||
valid = false
|
||||
binding.editTextTitle.error = "Title cannot be empty"
|
||||
}
|
||||
if (binding.editTextCode.text!!.isEmpty()) {
|
||||
if (binding.editTextCode.text.isNullOrEmpty()) {
|
||||
valid = false
|
||||
binding.editTextCode.error = "Code cannot be empty"
|
||||
}
|
||||
if (binding.editTextFormat.text!!.isEmpty()) {
|
||||
if (binding.editTextFormat.text.isNullOrEmpty()) {
|
||||
valid = false
|
||||
binding.editTextFormat.error = "Format cannot be empty"
|
||||
}
|
||||
|
@ -27,7 +27,6 @@ class Scanner : Fragment() {
|
||||
|
||||
private var code: String = ""
|
||||
private var fmt: String = ""
|
||||
private var valid: Boolean = false
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater,
|
||||
@ -35,13 +34,14 @@ class Scanner : Fragment() {
|
||||
savedInstanceState: Bundle?
|
||||
): View {
|
||||
binding = FragScannerBinding.inflate(layoutInflater)
|
||||
binding.bottomText.setOnClickListener {
|
||||
binding.btnScanDone.setOnClickListener {
|
||||
startCreateEntry()
|
||||
}
|
||||
when (hasCameraPermission()) {
|
||||
true -> bindCameraUseCases()
|
||||
else -> requestPermission()
|
||||
}
|
||||
binding.btnScanDone.isEnabled = false
|
||||
return binding.root
|
||||
}
|
||||
|
||||
@ -92,9 +92,10 @@ class Scanner : Fragment() {
|
||||
if (code != null && format != null) {
|
||||
this.code = code
|
||||
this.fmt = format
|
||||
this.valid = true
|
||||
binding.btnScanDone.isEnabled = true
|
||||
|
||||
} else {
|
||||
this.valid = false
|
||||
binding.btnScanDone.isEnabled = false
|
||||
}
|
||||
}
|
||||
try {
|
||||
@ -111,6 +112,4 @@ class Scanner : Fragment() {
|
||||
}
|
||||
}, ContextCompat.getMainExecutor(requireContext()))
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -1,10 +1,14 @@
|
||||
package net.helcel.fidelity.activity.fragment
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.pm.ActivityInfo
|
||||
import android.content.res.Configuration
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.view.WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_FULL
|
||||
import android.view.WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE
|
||||
import androidx.fragment.app.Fragment
|
||||
import com.google.zxing.FormatException
|
||||
import net.helcel.fidelity.databinding.FragViewEntryBinding
|
||||
@ -12,16 +16,14 @@ import net.helcel.fidelity.tools.BarcodeGenerator.generateBarcode
|
||||
import net.helcel.fidelity.tools.ErrorToaster
|
||||
import net.helcel.fidelity.tools.KeepassWrapper
|
||||
|
||||
|
||||
@SuppressLint("SourceLockedOrientationActivity")
|
||||
class ViewEntry : Fragment() {
|
||||
|
||||
private lateinit var binding: FragViewEntryBinding
|
||||
|
||||
private var title: String? = null
|
||||
private var code: String? = null
|
||||
private var fmt: String? = null
|
||||
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater,
|
||||
container: ViewGroup?,
|
||||
@ -33,8 +35,15 @@ class ViewEntry : Fragment() {
|
||||
code = res.second
|
||||
fmt = res.third
|
||||
|
||||
adjustLayout()
|
||||
updatePreview()
|
||||
updateLayout()
|
||||
|
||||
binding.imageViewPreview.setOnClickListener {
|
||||
requireActivity().requestedOrientation =
|
||||
if (isLandscape()) ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
|
||||
else ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
|
||||
}
|
||||
|
||||
return binding.root
|
||||
}
|
||||
|
||||
@ -42,7 +51,7 @@ class ViewEntry : Fragment() {
|
||||
binding.title.text = title
|
||||
try {
|
||||
val barcodeBitmap = generateBarcode(
|
||||
code!!, fmt!!, 1024
|
||||
code, fmt, 1024
|
||||
)
|
||||
binding.imageViewPreview.setImageBitmap(barcodeBitmap)
|
||||
} catch (e: FormatException) {
|
||||
@ -53,23 +62,25 @@ class ViewEntry : Fragment() {
|
||||
ErrorToaster.invalidFormat(requireActivity())
|
||||
} catch (e: Exception) {
|
||||
binding.imageViewPreview.setImageBitmap(null)
|
||||
println(e.javaClass)
|
||||
println(e.message)
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
override fun onConfigurationChanged(newConfig: Configuration) {
|
||||
super.onConfigurationChanged(newConfig)
|
||||
adjustLayout()
|
||||
}
|
||||
|
||||
private fun adjustLayout() {
|
||||
if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) {
|
||||
private fun updateLayout() {
|
||||
if (isLandscape()) {
|
||||
binding.title.visibility = View.GONE
|
||||
setScreenBrightness(BRIGHTNESS_OVERRIDE_FULL)
|
||||
} else {
|
||||
binding.title.visibility = View.VISIBLE
|
||||
setScreenBrightness(BRIGHTNESS_OVERRIDE_NONE)
|
||||
}
|
||||
}
|
||||
|
||||
private fun isLandscape(): Boolean {
|
||||
return (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE)
|
||||
}
|
||||
|
||||
private fun setScreenBrightness(brightness: Float?) {
|
||||
requireActivity().window?.attributes?.screenBrightness = brightness
|
||||
}
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
package net.helcel.fidelity.activity.view
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Canvas
|
||||
import android.graphics.Color
|
||||
import android.graphics.Paint
|
||||
import android.graphics.PorterDuff
|
||||
import android.graphics.PorterDuffXfermode
|
||||
import android.util.AttributeSet
|
||||
import android.view.View
|
||||
|
||||
class ScannerView : View {
|
||||
|
||||
private val overlayPaint = Paint().apply {
|
||||
color = Color.parseColor("#80000000") // Semi-transparent black
|
||||
style = Paint.Style.FILL
|
||||
}
|
||||
|
||||
private val clearPaint = Paint().apply {
|
||||
xfermode = PorterDuffXfermode(PorterDuff.Mode.CLEAR)
|
||||
}
|
||||
|
||||
constructor(context: Context) : super(context)
|
||||
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
|
||||
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
|
||||
context,
|
||||
attrs,
|
||||
defStyleAttr
|
||||
)
|
||||
|
||||
override fun onDraw(canvas: Canvas) {
|
||||
super.onDraw(canvas)
|
||||
|
||||
canvas.drawRect(0f, 0f, width.toFloat(), height.toFloat(), overlayPaint)
|
||||
|
||||
val centerX = width / 2f
|
||||
val centerY = height / 2f
|
||||
val squareSize = 0.75f * width.coerceAtMost(height)
|
||||
canvas.drawRect(
|
||||
centerX - squareSize / 2, centerY - squareSize / 2,
|
||||
centerX + squareSize / 2, centerY + squareSize / 2, clearPaint
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -15,9 +15,9 @@ import net.helcel.fidelity.tools.BarcodeFormatConverter.formatToString
|
||||
import java.util.concurrent.Executors
|
||||
|
||||
|
||||
@OptIn(ExperimentalGetImage::class)
|
||||
object BarcodeScanner {
|
||||
|
||||
@OptIn(ExperimentalGetImage::class)
|
||||
private fun processImageProxy(
|
||||
barcodeScanner: BarcodeScanner,
|
||||
imageProxy: ImageProxy,
|
||||
@ -33,8 +33,6 @@ object BarcodeScanner {
|
||||
|
||||
barcodeScanner.process(inputImage)
|
||||
.addOnSuccessListener { barcodeList ->
|
||||
println(barcodeList.map { e -> e.displayValue })
|
||||
println(barcodeList.map { e -> e.format })
|
||||
val barcode =
|
||||
barcodeList.getOrNull(0)
|
||||
if (barcode != null)
|
||||
|
@ -20,7 +20,6 @@ object BarcodeFormatConverter {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fun formatToString(f: Int): String {
|
||||
return when (f) {
|
||||
Barcode.FORMAT_CODE_128 -> "CODE_128"
|
||||
|
@ -19,8 +19,8 @@ object BarcodeGenerator {
|
||||
android.graphics.Color.WHITE
|
||||
}
|
||||
|
||||
fun generateBarcode(content: String, f: String, width: Int): Bitmap? {
|
||||
if (content.isEmpty() || f.isEmpty()) {
|
||||
fun generateBarcode(content: String?, f: String?, width: Int): Bitmap? {
|
||||
if (content.isNullOrEmpty() || f.isNullOrEmpty()) {
|
||||
return null
|
||||
}
|
||||
try {
|
||||
@ -33,11 +33,8 @@ object BarcodeGenerator {
|
||||
for (x in 0 until width) {
|
||||
for (y in 0 until height) {
|
||||
bitmap.setPixel(
|
||||
x,
|
||||
y,
|
||||
getPixelColor(bitMatrix, x, y)
|
||||
x, y, getPixelColor(bitMatrix, x, y)
|
||||
)
|
||||
|
||||
}
|
||||
}
|
||||
return bitmap
|
||||
|
@ -42,12 +42,11 @@ object KeepassWrapper {
|
||||
callback: (HashMap<String, String>) -> Unit
|
||||
): ActivityResultLauncher<Intent> {
|
||||
return fragment.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
|
||||
|
||||
println(result.toString())
|
||||
if (result.resultCode == Activity.RESULT_OK) {
|
||||
val data: Intent? = result.data
|
||||
val credentials = Kp2aControl.getEntryFieldsFromIntent(
|
||||
data!!
|
||||
)
|
||||
println(credentials)
|
||||
val credentials = Kp2aControl.getEntryFieldsFromIntent(result.data)
|
||||
println(credentials.toList().toString())
|
||||
callback(credentials)
|
||||
}
|
||||
}
|
||||
@ -59,11 +58,8 @@ object KeepassWrapper {
|
||||
): ActivityResultLauncher<Intent> {
|
||||
return fragment.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
|
||||
if (result.resultCode == Activity.RESULT_OK) {
|
||||
val data: Intent? = result.data
|
||||
val credentials = Kp2aControl.getEntryFieldsFromIntent(
|
||||
data!!
|
||||
)
|
||||
println(credentials)
|
||||
val credentials = Kp2aControl.getEntryFieldsFromIntent(result.data)
|
||||
println(credentials.toList().toString())
|
||||
callback(credentials)
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user