diff --git a/app/src/main/java/com/example/bandung_bondowoso/view/scan/ScanResultAdapter.kt b/app/src/main/java/com/example/bandung_bondowoso/view/scan/ScanResultAdapter.kt new file mode 100644 index 0000000000000000000000000000000000000000..5dbc23851049ce167a5cdcb1e55d017d73c1b183 --- /dev/null +++ b/app/src/main/java/com/example/bandung_bondowoso/view/scan/ScanResultAdapter.kt @@ -0,0 +1,43 @@ +package com.example.bandung_bondowoso.view.scan + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.example.bandung_bondowoso.R +import com.example.bandung_bondowoso.model.Item + +class ScanResultAdapter(var itemList: List<Item>): + RecyclerView.Adapter<ScanResultAdapter.ScanResultViewHolder>() { + + inner class ScanResultViewHolder(view: View) : RecyclerView.ViewHolder(view) { + val tvImageIcon: View = view.findViewById(R.id.img_icon_result_transaction) + val tvScanItem : TextView = view.findViewById(R.id.tv_scan_transaction_item) + val tvQuantity: TextView = view.findViewById(R.id.tv_transaction_quantity) + val tvPrice : TextView = view.findViewById(R.id.tv_scan_transaction_amount) + } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ScanResultAdapter.ScanResultViewHolder { + val view = LayoutInflater.from(parent.context). + inflate(R.layout.scan_result_item, parent, false) + return ScanResultViewHolder(view) + } + + override fun onBindViewHolder(holder: ScanResultAdapter.ScanResultViewHolder, position: Int) { + val item = itemList[position] + val imageResource = R.drawable.ic_money_bill_wave + Glide.with(holder.itemView.context) + .load(imageResource) + .into(holder.tvImageIcon as ImageView) + holder.tvScanItem.text = item.name + holder.tvPrice.text = item.price.toString() + holder.tvQuantity.text = (item.qty.toString() + " item") + } + + override fun getItemCount(): Int { + return itemList.size + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/bandung_bondowoso/view/scan/ScanResultFragment.kt b/app/src/main/java/com/example/bandung_bondowoso/view/scan/ScanResultFragment.kt index 8166750b5276a128d25a5b380df37f867a311996..d2d6513c964b7d47ad24fd4a3796f2d250238c48 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/view/scan/ScanResultFragment.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/view/scan/ScanResultFragment.kt @@ -12,10 +12,12 @@ import androidx.fragment.app.viewModels import androidx.lifecycle.ViewModelProvider import androidx.localbroadcastmanager.content.LocalBroadcastManager import androidx.navigation.Navigation +import androidx.recyclerview.widget.LinearLayoutManager import com.example.bandung_bondowoso.BandungBondowosoApp import com.example.bandung_bondowoso.R import com.example.bandung_bondowoso.broadcast.randomize_transaction.RandomizeTransactionReceiver import com.example.bandung_bondowoso.databinding.FragmentScanResultBinding +import com.example.bandung_bondowoso.model.Item import com.example.bandung_bondowoso.model.TransactionCategory import com.example.bandung_bondowoso.viewmodel.login.LoginViewModel import com.example.bandung_bondowoso.viewmodel.login.LoginViewModelFactory @@ -29,6 +31,8 @@ import java.io.File class ScanResultFragment: Fragment() { private var _binding: FragmentScanResultBinding ? = null private val binding get() = _binding!! + private var itemList = listOf<Item>() + private lateinit var adapter: ScanResultAdapter private lateinit var randomizeTransactionViewModel: RandomizeTransactionViewModel @@ -56,7 +60,8 @@ class ScanResultFragment: Fragment() { binding.buttonUlang.setOnClickListener { Navigation.findNavController(root).navigate(R.id.action_navigation_result_to_scan) } - binding.testAja.text = "Waiting for result..." + binding.repeatContainer.visibility = View.GONE + binding.rvTransactionScan.visibility = View.GONE binding.buttonTidakUlang.setOnClickListener{ var tempName= "" var tempAmount = 0.00 @@ -84,14 +89,27 @@ class ScanResultFragment: Fragment() { var token: String? var file: File? + adapter = ScanResultAdapter(itemList) + binding.rvTransactionScan.adapter= adapter + binding.rvTransactionScan.layoutManager = LinearLayoutManager(context) + binding.repeatContainer.visibility = View.GONE + binding.rvTransactionScan.visibility = View.GONE + scanViewModel.uploadResult.observe(viewLifecycleOwner) { uploadResult -> - var temp = "" - uploadResult?.items?.items?.forEach { item -> - temp += "Item : ${item.name} \n" - temp += "Quantity : ${item.qty} \n" - temp += "Price : ${item.price} \n \n" + itemList = uploadResult?.items?.items!! + if(itemList.isEmpty()){ + binding.clEmptyRvScan.visibility = View.VISIBLE + binding.rvTransactionScan.visibility = View.GONE + + }else{ + adapter = ScanResultAdapter(itemList) + binding.rvTransactionScan.adapter = adapter + } - binding.testAja.text = temp.trim() + binding.repeatContainer.visibility = View.VISIBLE + binding.testAja.visibility = View.GONE + binding.rvTransactionScan.visibility = View.VISIBLE + } file = scanViewModel.getUploadFile() loginViewModel.getToken().observe(viewLifecycleOwner) { userToken -> @@ -104,6 +122,13 @@ class ScanResultFragment: Fragment() { } } + override fun onResume(){ + super.onResume() + binding.repeatContainer.visibility = View.GONE + binding.testAja.visibility = View.VISIBLE + binding.rvTransactionScan.visibility = View.GONE + } + override fun onDestroyView() { super.onDestroyView() diff --git a/app/src/main/java/com/example/bandung_bondowoso/view/setting/SettingFragment.kt b/app/src/main/java/com/example/bandung_bondowoso/view/setting/SettingFragment.kt index d2b94d06821cde8722b613ed8852793a86ae8f97..83bca950e4c6f0c44c5f8ef5ea9b9633c5e6f67d 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/view/setting/SettingFragment.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/view/setting/SettingFragment.kt @@ -37,6 +37,9 @@ import kotlinx.coroutines.withContext import org.apache.poi.xssf.usermodel.XSSFWorkbook import java.io.File import java.io.FileOutputStream +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale class SettingFragment : Fragment(), ConnectionChangeListener { private var _binding: FragmentSettingsBinding? = null @@ -103,7 +106,7 @@ class SettingFragment : Fragment(), ConnectionChangeListener { } - fun saveFile(workbook:XSSFWorkbook, fileName: String, isXls: Boolean) { + fun saveFile(workbook:XSSFWorkbook, isXls: Boolean) { lifecycleScope.launch { withContext(Dispatchers.IO) { @@ -111,6 +114,10 @@ class SettingFragment : Fragment(), ConnectionChangeListener { if (!isXls) { type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" } + val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmssSSS", Locale.getDefault()).format(Date()) + // Append the timestamp to the base file name or replace it entirely + val fileName = "excel_file$timeStamp" + val contentValues = ContentValues().apply { put(MediaStore.MediaColumns.DISPLAY_NAME, "$fileName") @@ -172,10 +179,10 @@ class SettingFragment : Fragment(), ConnectionChangeListener { } binding.buttonSaveExcelXls.setOnClickListener { - saveFile(createFile(), "test", true) + saveFile(createFile(), true) } binding.buttonSaveExcelXlsx.setOnClickListener { - saveFile(createFile(), "test", false) + saveFile(createFile(), false) } binding.buttonLogOut.setOnClickListener { diff --git a/app/src/main/res/layout/fragment_scan_result.xml b/app/src/main/res/layout/fragment_scan_result.xml index 9f41487f8f3f8b330af17012d275b69ad02ec09b..60d9bac56570070158a20d6cfbcc21dc449e8ab0 100644 --- a/app/src/main/res/layout/fragment_scan_result.xml +++ b/app/src/main/res/layout/fragment_scan_result.xml @@ -15,7 +15,7 @@ android:layout_height="wrap_content" android:layout_marginStart="30dp" android:layout_marginTop="20dp" - android:text="Hasil Scan" + android:text="@string/hasil_scan" android:textColor="@color/white" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -25,7 +25,7 @@ android:layout_height="430dp" android:layout_marginStart="30dp" android:layout_marginEnd="30dp" - android:layout_marginTop="20dp" + android:layout_marginTop="15dp" android:orientation="vertical" app:layout_constraintStart_toStartOf="parent" @@ -34,21 +34,23 @@ android:id= "@+id/test_aja" android:textColor="@color/white" android:layout_width="match_parent" - android:layout_height="match_parent" + android:layout_height="wrap_content" + android:text = "@string/waiting_for_result" /> -<!-- <androidx.recyclerview.widget.RecyclerView--> -<!-- android:id="@+id/rvTransaction"--> -<!-- android:layout_width="match_parent"--> -<!-- android:layout_height="match_parent"--> -<!-- app:layout_constraintEnd_toEndOf="parent"--> -<!-- app:layout_constraintStart_toStartOf="parent"--> -<!-- app:layout_constraintTop_toTopOf="parent" />--> + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/rvTransactionScan" + android:layout_width="match_parent" + android:layout_height="match_parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> </LinearLayout> <LinearLayout + android:id= "@+id/repeat_container" android:layout_width="match_parent" - android:layout_height="180dp" + android:layout_height="120dp" android:orientation="vertical" android:background="@color/md_theme_background" app:layout_constraintBottom_toBottomOf="parent" @@ -56,7 +58,7 @@ <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text = "Apakah anda ingin mengulang pengambilan foto?" + android:text = "@string/repeat_question" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:textColor="@color/md_theme_onBackground" @@ -80,7 +82,7 @@ android:layout_marginTop="0dp" android:layout_marginEnd="30dp" style="@style/buttonStylePrimary" - android:text="Tidak" + android:text="@string/tidak" app:layout_constraintStart_toStartOf="parent" /> <Button @@ -90,9 +92,41 @@ android:layout_marginStart="30dp" android:layout_marginTop="0dp" style="@style/buttonStylePrimary" - android:text="Ya" + android:text="@string/ya" app:layout_constraintEnd_toEndOf="parent" /> </LinearLayout> </LinearLayout> + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/cl_empty_rv_scan" + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:layout_constraintTop_toBottomOf="@+id/tv_scan_result_title" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" + android:visibility="gone" + > + + <ImageView + android:id="@+id/iv_no_data" + android:layout_width="300dp" + android:layout_height="300dp" + android:layout_marginTop="20dp" + android:contentDescription="@string/cd_transaction_empty" + android:src="@drawable/no_data_cuate" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" /> + + <TextView + style="@style/TextAppearance.LabelLarge" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:text="@string/msg_empty_transaction" + android:textColor="@color/md_theme_tertiary" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/iv_no_data" + /> + </androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/scan_result_item.xml b/app/src/main/res/layout/scan_result_item.xml new file mode 100644 index 0000000000000000000000000000000000000000..1c5f15af031e5d79108a8053b422131fa8efac1d --- /dev/null +++ b/app/src/main/res/layout/scan_result_item.xml @@ -0,0 +1,66 @@ +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/vertical_gap" + android:background="@drawable/bg_transaction_card" + android:padding="@dimen/card_padding"> + + <ImageView + android:id="@+id/img_icon_result_transaction" + android:layout_width="32dp" + android:layout_height="32dp" + android:background="@drawable/bg_transaction_icon" + android:contentDescription="@string/transaction_category" + android:padding="5dp" + android:src="@drawable/ic_money_bill_wave" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:tint="@color/md_theme_primary" /> + + <TextView + android:id="@+id/tv_scan_transaction_item" + style="@style/TextAppearance.TitleSmall" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:maxWidth="140dp" + android:layout_marginStart="10dp" + android:ellipsize="end" + android:maxLines="2" + android:text="@string/item_name" + android:textColor="@color/md_theme_primary" + android:textStyle="bold" + app:layout_constraintStart_toEndOf="@+id/img_icon_result_transaction" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_chainStyle="packed" /> + + <TextView + android:id="@+id/tv_transaction_quantity" + style="@style/TextAppearance.LabelMedium" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="10dp" + android:ellipsize="end" + android:maxLines="1" + android:text="@string/number_of_items" + android:textColor="@color/md_theme_primary" + app:layout_constraintStart_toEndOf="@+id/img_icon_result_transaction" + app:layout_constraintTop_toBottomOf="@+id/tv_scan_transaction_item" /> + + + <TextView + android:id="@+id/tv_scan_transaction_amount" + style="@style/TextAppearance.LabelMedium" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:gravity="start" + android:singleLine="true" + android:text="@string/transaction_price" + android:textColor="@color/md_theme_primary" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.5" + app:layout_constraintTop_toTopOf="parent" /> + + + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 86878f5f882971fffe3c4626335d13432ceca58a..9b1c2f302d1fc39bd82b597139d0f10d5f83c9cf 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -104,4 +104,11 @@ <string name="xlsx">xlsx</string> <string name="xls">xls</string> <string name="cd_btn_twibbon_soobin">Tombol untuk ganti menjadi twibbon Soobin</string> + <string name="number_of_items">number of items</string> + <string name="item_name">Item name</string> + <string name="hasil_scan">Hasil Scan</string> + <string name="repeat_question">Apakah anda ingin mengulang pengambilan foto?</string> + <string name="tidak">Tidak</string> + <string name="ya">Ya</string> + <string name="waiting_for_result">Menunggu hasil...</string> </resources> \ No newline at end of file