Some UI
This commit is contained in:
parent
ea102c87a2
commit
50da2955e8
|
@ -1,7 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
<uses-feature android:name="android.hardware.camera" android:required="false"/>
|
||||
<uses-feature android:name="android.hardware.camera" android:required="true"/>
|
||||
<uses-permission android:name="android.permission.CAMERA" />
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
|
|
|
@ -1,11 +1,16 @@
|
|||
package org.foxarmy.barcodescannerforemployees
|
||||
|
||||
//import com.google.mlkit.vision.codescanner.GmsBarcodeScannerOptions
|
||||
import android.app.Activity
|
||||
import android.content.Intent
|
||||
import android.graphics.Bitmap
|
||||
import android.os.Bundle
|
||||
import android.provider.MediaStore
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.Toast
|
||||
import androidx.activity.result.contract.ActivityResultContracts
|
||||
import androidx.fragment.app.Fragment
|
||||
import com.google.mlkit.vision.barcode.common.Barcode
|
||||
import com.google.mlkit.vision.codescanner.GmsBarcodeScannerOptions
|
||||
|
@ -15,7 +20,9 @@ import org.foxarmy.barcodescannerforemployees.databinding.AddProductFragmentBind
|
|||
/**
|
||||
* A simple [Fragment] subclass as the default destination in the navigation.
|
||||
*/
|
||||
class addProductFragment : Fragment() {
|
||||
|
||||
|
||||
class AddProductFragment : Fragment() {
|
||||
|
||||
private var _binding: AddProductFragmentBinding? = null
|
||||
|
||||
|
@ -33,25 +40,56 @@ class addProductFragment : Fragment() {
|
|||
|
||||
}
|
||||
|
||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||
super.onActivityResult(requestCode, resultCode, data)
|
||||
when (requestCode) {
|
||||
200 -> {
|
||||
if (resultCode == Activity.RESULT_OK && data != null) {
|
||||
binding.imageView.setImageBitmap(data.extras?.get("data") as Bitmap)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val requestPermissionLauncher = registerForActivityResult(
|
||||
ActivityResultContracts.RequestPermission()
|
||||
) { isGranted ->
|
||||
if (isGranted) {
|
||||
val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
|
||||
startActivityForResult(cameraIntent, 200)
|
||||
} else {
|
||||
Toast.makeText(
|
||||
requireContext(),
|
||||
"I need permission for camera in order to take a picture!",
|
||||
Toast.LENGTH_LONG
|
||||
).show()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
|
||||
binding.takePictureButton.setOnClickListener {
|
||||
requestPermissionLauncher.launch(android.Manifest.permission.CAMERA)
|
||||
}
|
||||
|
||||
binding.scanButton.setOnClickListener {
|
||||
// findNavController().navigate(R.id.action_FirstFragment_to_SecondFragment)
|
||||
// Toast.makeText(requireContext(), "Test", Toast.LENGTH_LONG).show()
|
||||
val options = GmsBarcodeScannerOptions.Builder()
|
||||
.setBarcodeFormats(
|
||||
Barcode.FORMAT_EAN_13)
|
||||
Barcode.FORMAT_EAN_13
|
||||
)
|
||||
.build()
|
||||
val scanner = GmsBarcodeScanning.getClient(requireContext())
|
||||
scanner.startScan()
|
||||
.addOnSuccessListener { barcode ->
|
||||
// Task completed successfully
|
||||
//Toast.makeText(requireContext(), barcode.rawValue, Toast.LENGTH_LONG).show()
|
||||
binding.productName.setText(barcode.rawValue)
|
||||
}
|
||||
.addOnFailureListener { e ->
|
||||
Toast.makeText(requireContext(), "Failed to scan barcode. Please, try again", Toast.LENGTH_LONG).show()
|
||||
Toast.makeText(
|
||||
requireContext(),
|
||||
"Failed to scan barcode. Please, try again or enter data manually",
|
||||
Toast.LENGTH_LONG
|
||||
).show()
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
package org.foxarmy.barcodescannerforemployees
|
||||
|
||||
import android.content.Context
|
||||
import android.database.sqlite.SQLiteDatabase
|
||||
import android.database.sqlite.SQLiteOpenHelper
|
||||
import android.provider.BaseColumns
|
||||
|
||||
object ProductContract {
|
||||
object ProductEntry :BaseColumns {
|
||||
const val TABLE_NAME = "products"
|
||||
const val PRODUCT_NAME = "name"
|
||||
const val PRODUCT_NET_WEIGHT = "net_weight"
|
||||
const val IMAGE_FILENAME = "image_filename"
|
||||
}
|
||||
}
|
||||
|
||||
const val SQL_CREATE_ENTRIES =
|
||||
"CREATE TABLE ${ProductContract.ProductEntry.TABLE_NAME} (" +
|
||||
"${BaseColumns._ID} INTEGER PRIMARY KEY," +
|
||||
"${ProductContract.ProductEntry.PRODUCT_NAME} TEXT," +
|
||||
"${ProductContract.ProductEntry.PRODUCT_NET_WEIGHT} TEXT" +
|
||||
"${ProductContract.ProductEntry.IMAGE_FILENAME} TEXT)"
|
||||
|
||||
class DBStorageController(context: Context) : SQLiteOpenHelper (context, DATABASE_NAME, null, DATABASE_VERSION) {
|
||||
|
||||
override fun onCreate(db: SQLiteDatabase) {
|
||||
db.execSQL(SQL_CREATE_ENTRIES)
|
||||
}
|
||||
|
||||
override fun onUpgrade(p0: SQLiteDatabase?, p1: Int, p2: Int) {
|
||||
TODO("Not yet implemented")
|
||||
}
|
||||
|
||||
companion object {
|
||||
// If you change the database schema, you must increment the database version.
|
||||
const val DATABASE_VERSION = 1
|
||||
const val DATABASE_NAME = "FeedReader.db"
|
||||
}
|
||||
}
|
|
@ -1,15 +1,14 @@
|
|||
package org.foxarmy.barcodescannerforemployees
|
||||
|
||||
import android.os.Bundle
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
import android.provider.BaseColumns
|
||||
import android.view.Menu
|
||||
import android.view.MenuItem
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.navigation.findNavController
|
||||
import androidx.navigation.ui.AppBarConfiguration
|
||||
import androidx.navigation.ui.navigateUp
|
||||
import androidx.navigation.ui.setupActionBarWithNavController
|
||||
import android.view.Menu
|
||||
import android.view.MenuItem
|
||||
import android.widget.Toast
|
||||
import org.foxarmy.barcodescannerforemployees.databinding.ActivityMainBinding
|
||||
|
||||
class MainActivity : AppCompatActivity() {
|
||||
|
@ -20,6 +19,34 @@ class MainActivity : AppCompatActivity() {
|
|||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
val dbHelper = DBStorageController(applicationContext)
|
||||
// val db = dbHelper.writableDatabase
|
||||
//
|
||||
// val values = ContentValues().apply {
|
||||
// put(ProductContract.ProductEntry.PRODUCT_NAME, "Имя продукта")
|
||||
// put(ProductContract.ProductEntry.PRODUCT_NET_WEIGHT, "0г")
|
||||
// put(ProductContract.ProductEntry.IMAGE_FILENAME, "image.png")
|
||||
// }
|
||||
//
|
||||
// val netRowId = db?.insert(ProductContract.ProductEntry.TABLE_NAME, null, values)
|
||||
|
||||
val db2 = dbHelper.readableDatabase
|
||||
|
||||
val projection = arrayOf(BaseColumns._ID, ProductContract.ProductEntry.PRODUCT_NAME, ProductContract.ProductEntry.PRODUCT_NET_WEIGHT, ProductContract.ProductEntry.IMAGE_FILENAME)
|
||||
|
||||
val selection = "${ProductContract.ProductEntry.PRODUCT_NAME} = ?"
|
||||
val selectionArgs = arrayOf("Имя продукта")
|
||||
|
||||
val cursor = db2.query(
|
||||
ProductContract.ProductEntry.TABLE_NAME,
|
||||
null,
|
||||
selection,
|
||||
selectionArgs,
|
||||
null,
|
||||
null,
|
||||
null
|
||||
)
|
||||
|
||||
binding = ActivityMainBinding.inflate(layoutInflater)
|
||||
setContentView(binding.root)
|
||||
|
||||
|
@ -33,7 +60,8 @@ class MainActivity : AppCompatActivity() {
|
|||
// Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
|
||||
// .setAction("Action", null)
|
||||
// .setAnchorView(R.id.add_product_fab).show()
|
||||
Toast.makeText(applicationContext, "Test", Toast.LENGTH_SHORT)
|
||||
// Toast.makeText(applicationContext, "Test", Toast.LENGTH_SHORT).show()
|
||||
navController.navigate(R.id.AddProductFragment)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ import org.foxarmy.barcodescannerforemployees.databinding.FragmentSecondBinding
|
|||
/**
|
||||
* A simple [Fragment] subclass as the second destination in the navigation.
|
||||
*/
|
||||
class SecondFragment : Fragment() {
|
||||
class MainScreenFragment : Fragment() {
|
||||
|
||||
private var _binding: FragmentSecondBinding? = null
|
||||
|
|
@ -41,4 +41,5 @@ fun main () {
|
|||
val p = Parser("""\<table\s*class\=\"randomBarcodes\"\s*>""", """\<\/table\>""", """[ёЁ\u0401\u0451\u0410-\u044f\d\w\s]{16,}""")
|
||||
p.parse(Requester("https://barcode-list.ru", "barcode/RU/Поиск.htm?barcode=4680036915828", ).request("4680036915828"))
|
||||
// println(Requester("https://barcode-list.ru", "barcode/RU/Поиск.htm?barcode=4680036915828", ).request("4680036915828"))
|
||||
|
||||
}
|
|
@ -1,28 +0,0 @@
|
|||
package org.foxarmy.barcodescannerforemployees
|
||||
|
||||
import android.content.Context
|
||||
import android.provider.BaseColumns
|
||||
|
||||
object ProductContract {
|
||||
object ProductEntry :BaseColumns {
|
||||
const val TABLE_NAME = "products"
|
||||
const val PRODUCT_NAME = "name"
|
||||
const val PRODUCT_NET_WEIGHT = "net_weight"
|
||||
const val IMAGE_FILENAME = "image_filename"
|
||||
}
|
||||
}
|
||||
|
||||
class StorageController(context: Context) {
|
||||
val context = context
|
||||
|
||||
fun initStorage() {
|
||||
val productContract = ProductContract
|
||||
val SQL_CREATE_ENTRIES =
|
||||
"CREATE TABLE ${ProductContract.ProductEntry.TABLE_NAME} (" +
|
||||
"${BaseColumns._ID} INTEGER PRIMARY KEY," +
|
||||
"${ProductContract.ProductEntry.PRODUCT_NAME} TEXT," +
|
||||
"${ProductContract.ProductEntry.PRODUCT_NET_WEIGHT} TEXT" +
|
||||
"${ProductContract.ProductEntry.IMAGE_FILENAME} TEXT)"
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
package org.foxarmy.barcodescannerforemployees
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.fragment.app.Fragment
|
||||
|
||||
/**
|
||||
* A simple [Fragment] subclass.
|
||||
* Use the [StorageFragment.newInstance] factory method to
|
||||
* create an instance of this fragment.
|
||||
*/
|
||||
class StorageFragment : Fragment() {
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
}
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater, container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View? {
|
||||
// Inflate the layout for this fragment
|
||||
return inflater.inflate(R.layout.fragment_storage, container, false)
|
||||
}
|
||||
}
|
|
@ -5,29 +5,66 @@
|
|||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".addProductFragment">
|
||||
tools:context=".AddProductFragment">
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="16dp">
|
||||
<Button
|
||||
android:id="@+id/scan_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="100dp"
|
||||
android:layout_height="50dp"
|
||||
android:text="@string/scan_label"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"/>
|
||||
app:layout_constraintTop_toBottomOf="@+id/editTextText"
|
||||
android:layout_marginTop="25dp"/>
|
||||
<ImageView
|
||||
android:src="@android:drawable/ic_menu_camera"
|
||||
android:layout_width="356dp"
|
||||
android:layout_height="303dp" android:id="@+id/imageView"
|
||||
android:layout_marginBottom="25dp"
|
||||
app:layout_constraintBottom_toTopOf="@+id/productName" app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent"
|
||||
android:layout_marginTop="15dp"/>
|
||||
<EditText
|
||||
android:layout_width="365dp"
|
||||
android:layout_height="42dp"
|
||||
android:layout_width="350dp"
|
||||
android:layout_height="50dp"
|
||||
android:inputType="text"
|
||||
android:text="@string/product_name_label"
|
||||
android:ems="10"
|
||||
android:id="@+id/productName"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
android:layout_marginTop="162dp" app:layout_constraintStart_toStartOf="parent"
|
||||
android:layout_marginStart="11dp"/>
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
android:layout_marginStart="8dp" android:layout_marginEnd="8dp"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintBottom_toTopOf="@+id/editTextText"
|
||||
app:layout_constraintHorizontal_bias="0.5"
|
||||
android:visibility="visible" android:hint="@string/product_name_label" android:textColorHint="#737373"
|
||||
app:layout_constraintTop_toBottomOf="@+id/imageView"/>
|
||||
<EditText
|
||||
android:layout_width="350dp"
|
||||
android:layout_height="50dp"
|
||||
android:inputType="text"
|
||||
android:ems="10"
|
||||
android:id="@+id/editTextText"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
android:layout_marginStart="8dp"
|
||||
android:layout_marginEnd="8dp"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
android:visibility="visible" android:hint="@string/netWeight" android:textColorHint="#737373"
|
||||
app:layout_constraintTop_toBottomOf="@+id/productName"/>
|
||||
<Button
|
||||
android:text="@string/saveButton"
|
||||
android:layout_width="100dp"
|
||||
android:layout_height="50dp" android:id="@+id/saveButton"
|
||||
app:layout_constraintTop_toBottomOf="@+id/editTextText"
|
||||
android:layout_marginTop="25dp" app:layout_constraintEnd_toEndOf="parent"/>
|
||||
<Button
|
||||
android:text="@string/takePicture"
|
||||
android:layout_width="100dp"
|
||||
android:layout_height="55dp" android:id="@+id/takePictureButton"
|
||||
app:layout_constraintTop_toBottomOf="@+id/editTextText"
|
||||
android:layout_marginTop="24dp" app:layout_constraintStart_toEndOf="@+id/scan_button"
|
||||
android:layout_marginStart="33dp" app:layout_constraintEnd_toStartOf="@+id/saveButton"
|
||||
android:layout_marginEnd="6dp" app:layout_constraintHorizontal_bias="0.0"/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</androidx.core.widget.NestedScrollView>
|
|
@ -5,7 +5,7 @@
|
|||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".SecondFragment">
|
||||
tools:context=".MainScreenFragment">
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".StorageFragment">
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</FrameLayout>
|
|
@ -3,26 +3,31 @@
|
|||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/nav_graph"
|
||||
app:startDestination="@id/FirstFragment">
|
||||
app:startDestination="@id/storageFragment">
|
||||
|
||||
<fragment
|
||||
android:id="@+id/FirstFragment"
|
||||
android:name="org.foxarmy.barcodescannerforemployees.addProductFragment"
|
||||
android:id="@+id/AddProductFragment"
|
||||
android:name="org.foxarmy.barcodescannerforemployees.AddProductFragment"
|
||||
android:label="@string/first_fragment_label"
|
||||
tools:layout="@layout/add_product_fragment">
|
||||
|
||||
<action
|
||||
android:id="@+id/action_FirstFragment_to_SecondFragment"
|
||||
app:destination="@id/SecondFragment"/>
|
||||
app:destination="@id/MainScreenFragment"/>
|
||||
</fragment>
|
||||
<fragment
|
||||
android:id="@+id/SecondFragment"
|
||||
android:name="org.foxarmy.barcodescannerforemployees.SecondFragment"
|
||||
android:id="@+id/MainScreenFragment"
|
||||
android:name="org.foxarmy.barcodescannerforemployees.MainScreenFragment"
|
||||
android:label="@string/second_fragment_label"
|
||||
tools:layout="@layout/fragment_second">
|
||||
|
||||
<action
|
||||
android:id="@+id/action_SecondFragment_to_FirstFragment"
|
||||
app:destination="@id/FirstFragment"/>
|
||||
app:destination="@id/AddProductFragment"/>
|
||||
</fragment>
|
||||
<fragment android:id="@+id/storageFragment" android:name="org.foxarmy.barcodescannerforemployees.StorageFragment"
|
||||
android:label="fragment_storage" tools:layout="@layout/fragment_storage">
|
||||
<action android:id="@+id/action_storageFragment_to_AddProductFragment"
|
||||
app:destination="@id/AddProductFragment"/>
|
||||
</fragment>
|
||||
</navigation>
|
|
@ -7,4 +7,9 @@
|
|||
<string name="scan_label">Scan</string>
|
||||
<string name="previous">Previous</string>
|
||||
<string name="product_name_label">Product name</string>
|
||||
<string name="netWeight">Net weight</string>
|
||||
<string name="saveButton">Save</string>
|
||||
<string name="takePicture">Take picture</string>
|
||||
<!-- TODO: Remove or change this placeholder text -->
|
||||
<string name="hello_blank_fragment">Hello blank fragment</string>
|
||||
</resources>
|
Loading…
Reference in New Issue