diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index 38151702dfe5d0cf31af0007d37328c974b40bce..23e166c33bb98fe569730716e984bd08c883f170 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -4,6 +4,18 @@ <value> <entry key="app"> <State> + <targetSelectedWithDropDown> + <Target> + <type value="QUICK_BOOT_TARGET" /> + <deviceKey> + <Key> + <type value="VIRTUAL_DEVICE_PATH" /> + <value value="C:\Users\lalbi\.android\avd\Pixel_3a_API_32.avd" /> + </Key> + </deviceKey> + </Target> + </targetSelectedWithDropDown> + <timeTargetWasSelectedWithDropDown value="2024-04-03T18:27:02.041955500Z" /> <runningDeviceTargetSelectedWithDropDown> <Target> <type value="RUNNING_DEVICE_TARGET" /> diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 0bb7fd673d7f9a0c7538b391eb73812b5e30efb4..56bae304b5c2e253b3592cf577d7c063e8159bc5 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -48,6 +48,7 @@ dependencies { implementation("org.apache.poi:poi:5.2.4") implementation("org.apache.poi:poi-ooxml:5.2.4") implementation("com.google.android.gms:play-services-location:21.2.0") + testImplementation("junit:junit:4.13.2") implementation("androidx.navigation:navigation-fragment-ktx:2.7.7") implementation("androidx.navigation:navigation-ui-ktx:2.7.7") testImplementation("junit:junit:4.13.2") diff --git a/app/src/main/java/com/example/bondoman/Adapter.kt b/app/src/main/java/com/example/bondoman/Adapter.kt deleted file mode 100644 index 8992a8cbe902871787cb758cbc3b1ff13eeade9c..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/example/bondoman/Adapter.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.example.bondoman - -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import com.example.bondoman.retrofit.data.Transaction - -class TransactionAdapter(private val listData: ArrayList<Transaction>): RecyclerView.Adapter<TransactionAdapter.DataViewHolder>(){ - - override fun onBindViewHolder(holder: DataViewHolder, position: Int) { - val currentData = listData[position] - holder.txtName.text = currentData.name - holder.txtCategory.text = currentData.category - val temp = "IDR " + currentData.price.toString() - holder.txtPrice.text = temp - holder.txtLocation.text = currentData.location - holder.txtDate.text = currentData.date - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DataViewHolder { - val view: View = LayoutInflater.from(parent.context).inflate(R.layout.list_transaction,parent,false) - return DataViewHolder(view) - } - - override fun getItemCount(): Int { - return listData.count() - } - class DataViewHolder(item: View) : RecyclerView.ViewHolder(item) { - val txtName: TextView = item.findViewById(R.id.itemName) - val txtCategory: TextView = item.findViewById(R.id.category) - val txtDate: TextView = item.findViewById(R.id.itemDate) - val txtPrice : TextView = item.findViewById(R.id.itemPrice) - val txtLocation : TextView = item.findViewById(R.id.itemLocation) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoman/ContainerActivity.kt b/app/src/main/java/com/example/bondoman/ContainerActivity.kt index 513b6a152f7db934ab01a5dcebb06a22256987fe..2e9d9a5aa36d07ff7cba4e5b69ff0c75131b1970 100644 --- a/app/src/main/java/com/example/bondoman/ContainerActivity.kt +++ b/app/src/main/java/com/example/bondoman/ContainerActivity.kt @@ -13,13 +13,14 @@ class ContainerActivity : AppCompatActivity() { if (savedInstanceState == null) { // Check if intent contains transaction ID - val transactionId = intent.getIntExtra("transactionId", -1) + val transactionId = intent.getIntExtra("id", -1) if (transactionId != -1) { - // Start the EditTransactionFragment -// val fragment = EditTransactionFragment.newInstance(transactionId) -// supportFragmentManager.beginTransaction() -// .replace(R.id.fragment_container, fragment) -// .commit() +// Start the EditTransactionFragment + val fragment = EditTransactionFragment.newInstance(transactionId) + supportFragmentManager.beginTransaction() + .replace(R.id.fragment_container, fragment) + .commit() + } else { // Start the AddTransactionFragment supportFragmentManager.beginTransaction() diff --git a/app/src/main/java/com/example/bondoman/DetailTransactionFragment.kt b/app/src/main/java/com/example/bondoman/DetailTransactionFragment.kt deleted file mode 100644 index 736ebcd5eaba016113a65ab3efd7816d74492c3a..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/example/bondoman/DetailTransactionFragment.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.example.bondoman - -import android.os.Bundle -import androidx.fragment.app.Fragment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import com.example.bondoman.databinding.FragmentDetailTransactionBinding -import com.example.bondoman.databinding.FragmentEditTransactionBinding - -class DetailTransactionFragment : Fragment() { - private lateinit var binding : FragmentDetailTransactionBinding - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - binding = FragmentDetailTransactionBinding.inflate(inflater, container, false) - return binding.root - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoman/EditTransactionFragment.kt b/app/src/main/java/com/example/bondoman/EditTransactionFragment.kt index f05307faecb115a672226f7f67c31b065178aabf..22f43392091f507aafd5d92b043aaf1ec7d6ed85 100644 --- a/app/src/main/java/com/example/bondoman/EditTransactionFragment.kt +++ b/app/src/main/java/com/example/bondoman/EditTransactionFragment.kt @@ -1,14 +1,33 @@ package com.example.bondoman +import android.app.AlertDialog +import android.content.DialogInterface import android.os.Bundle import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.example.bondoman.databinding.FragmentEditTransactionBinding +import com.example.bondoman.retrofit.adapter.TransactionAdapter +import com.example.bondoman.retrofit.data.TransactionDB +import com.example.bondoman.retrofit.data.entity.TransactionEntity class EditTransactionFragment : Fragment() { private lateinit var binding : FragmentEditTransactionBinding + private lateinit var db : TransactionDB + private lateinit var adapter : TransactionAdapter + private val listTransaction = ArrayList<TransactionEntity>() + companion object { + private const val ARG_TRANSACTION_ID = "id" + + fun newInstance(id: Int): EditTransactionFragment { + val fragment = EditTransactionFragment() + val args = Bundle() + args.putInt(ARG_TRANSACTION_ID, id) + fragment.arguments = args + return fragment + } + } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -19,6 +38,53 @@ class EditTransactionFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + val id = arguments?.getInt(ARG_TRANSACTION_ID) ?: -1 + db = TransactionDB.getInstance(requireContext()) + fetchTransactionDetails(id) + + binding.deleteButton.setOnClickListener { + AlertDialog.Builder(requireContext()) + .setTitle("Delete Transaction") + .setMessage("Are you sure you want to delete this transaction?") + .setPositiveButton("Yes") { dialog, which -> + val transaction = db.transactionDao().getId(id) + db.transactionDao().delete(transaction) + requireActivity().onBackPressed() + } + .setNegativeButton("No") { dialog, which -> } + .show() + } + + binding.saveButton.setOnClickListener { + db = TransactionDB.getInstance(requireContext()) + val kategori = db.transactionDao().getId(id).category + val date = db.transactionDao().getId(id).date + val nama = binding.nameField.text.toString() + val nominal = binding.priceField.text.toString().toInt() + val lokasi = binding.locationField.text.toString() + + val newTransaction = TransactionEntity( + id = id, + name = nama, + price = nominal, + location = lokasi, + category = kategori, + date = date + ) + db.transactionDao().update(newTransaction) + + requireActivity().onBackPressed() + } + } + + private fun fetchTransactionDetails(id: Int) { + val transaction = db.transactionDao().getId(id) + binding.nameField.setText(transaction.name) + binding.priceField.setText(transaction.price.toString()) + binding.locationField.setText(transaction.location) + binding.dateField.setText(transaction.date) + binding.categoryField.setText(transaction.category.toString()) } + } \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoman/TransactionFragment.kt b/app/src/main/java/com/example/bondoman/TransactionFragment.kt index 83a6326e9fa2b82f56020eb999eb83079e17472d..fd3e48013960eade45318296a7e2dc4e8c3e8f36 100644 --- a/app/src/main/java/com/example/bondoman/TransactionFragment.kt +++ b/app/src/main/java/com/example/bondoman/TransactionFragment.kt @@ -40,6 +40,7 @@ class TransactionFragment : Fragment() { database = TransactionDB.getInstance(requireContext()) + // val filter = IntentFilter("itb.bos.bondoman.ACTION_RANDOMIZE_TRANSACTION") // requireContext().registerReceiver(receiver, filter) @@ -67,6 +68,10 @@ class TransactionFragment : Fragment() { // var transactionAdapter = TransactionAdapter(filteredList) // transactionData.adapter = transactionAdapter + binding.addButton.setOnClickListener { + val intent = Intent(requireContext(), ContainerActivity::class.java) + startActivity(intent) + } // searchBar = binding.searchBar // // searchBar.addTextChangedListener(object : TextWatcher { @@ -112,6 +117,13 @@ class TransactionFragment : Fragment() { loadDatas() } + private fun loadDatas() { + listTransaction.clear() + + listTransaction.addAll(database.transactionDao().getAll()) + adapter.notifyDataSetChanged() + } + private fun loadDatas() { listTransaction.clear() diff --git a/app/src/main/java/com/example/bondoman/retrofit/adapter/TransactionAdapter.kt b/app/src/main/java/com/example/bondoman/retrofit/adapter/TransactionAdapter.kt index dda3a8b507ebced4d82ae30f2137b943ac2a8336..ea8ef8acd53b89f062c6eff24ec4544d4bfc69c3 100644 --- a/app/src/main/java/com/example/bondoman/retrofit/adapter/TransactionAdapter.kt +++ b/app/src/main/java/com/example/bondoman/retrofit/adapter/TransactionAdapter.kt @@ -12,7 +12,17 @@ import com.example.bondoman.ContainerActivity import com.example.bondoman.R import com.example.bondoman.retrofit.data.entity.TransactionEntity + class TransactionAdapter(private val list: ArrayList<TransactionEntity>): RecyclerView.Adapter<TransactionAdapter.ViewHolder>(){ + private lateinit var transactionDialog: Dialog + + fun setDialog(dialog: Dialog) { + this.transactionDialog = dialog + } + + interface Dialog{ + fun onClick(position: Int) + } override fun onBindViewHolder(holder: ViewHolder, position: Int) { val currentData = list[position] @@ -50,7 +60,7 @@ class TransactionAdapter(private val list: ArrayList<TransactionEntity>): Recycl val intent = Intent(holder.itemView.context, ContainerActivity::class.java) // Optionally, pass data to the AddTransactionActivity - intent.putExtra("transactionId", currentData.id) + intent.putExtra("id", currentData.id) // Start the activity holder.itemView.context.startActivity(intent) @@ -58,7 +68,7 @@ class TransactionAdapter(private val list: ArrayList<TransactionEntity>): Recycl } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val view: View = LayoutInflater.from(parent.context).inflate(R.layout.row_data,parent,false) + val view: View = LayoutInflater.from(parent.context).inflate(R.layout.row_data, parent, false) return ViewHolder(view) } diff --git a/app/src/main/java/com/example/bondoman/retrofit/data/TransactionDB.kt b/app/src/main/java/com/example/bondoman/retrofit/data/TransactionDB.kt index c3ed442c664dcb11fea85d48a0f56e911349fd50..bbf173ae423e2906f64d696e0fda63496df708cc 100644 --- a/app/src/main/java/com/example/bondoman/retrofit/data/TransactionDB.kt +++ b/app/src/main/java/com/example/bondoman/retrofit/data/TransactionDB.kt @@ -7,7 +7,11 @@ import androidx.room.RoomDatabase import com.example.bondoman.retrofit.data.dao.TransactionDao import com.example.bondoman.retrofit.data.entity.TransactionEntity +<<<<<<< app/src/main/java/com/example/bondoman/retrofit/data/TransactionDB.kt +@Database(entities = [TransactionEntity::class], version = 2) +======= @Database(entities = [TransactionEntity::class], version = 1) +>>>>>>> app/src/main/java/com/example/bondoman/retrofit/data/TransactionDB.kt abstract class TransactionDB : RoomDatabase() { abstract fun transactionDao(): TransactionDao @@ -16,7 +20,7 @@ abstract class TransactionDB : RoomDatabase() { fun getInstance(context: Context) : TransactionDB{ if (instance==null){ - instance = Room.databaseBuilder(context, TransactionDB::class.java, "transaction-database") + instance = Room.databaseBuilder(context, TransactionDB::class.java, "db") .allowMainThreadQueries() .build() } diff --git a/app/src/main/java/com/example/bondoman/retrofit/data/dao/TransactionDao.kt b/app/src/main/java/com/example/bondoman/retrofit/data/dao/TransactionDao.kt index 27ebc42d15503365179a3e7de04b69a9a9d433fe..8f93301768d951c03f872de36169dc31674d6363 100644 --- a/app/src/main/java/com/example/bondoman/retrofit/data/dao/TransactionDao.kt +++ b/app/src/main/java/com/example/bondoman/retrofit/data/dao/TransactionDao.kt @@ -4,19 +4,19 @@ import androidx.room.Dao import androidx.room.Delete import androidx.room.Insert import androidx.room.Query +import androidx.room.Update import com.example.bondoman.retrofit.data.entity.TransactionEntity @Dao interface TransactionDao { - @Query("SELECT * FROM transactionentity") fun getAll(): List<TransactionEntity> @Query("SELECT * FROM transactionentity WHERE id IN (:userIds)") fun loadAllByIds(userIds: IntArray): List<TransactionEntity> - @Query("SELECT * FROM transactionentity WHERE name LIKE :name AND " + - "price LIKE :nominal LIMIT 1") + @Query("SELECT * FROM transactionentity WHERE nama_transaksi LIKE :name AND " + + "nominal_transaksi LIKE :nominal LIMIT 1") fun findByName(name: String, nominal: String): TransactionEntity @Insert @@ -24,4 +24,10 @@ interface TransactionDao { @Delete fun delete(transaction: TransactionEntity) + + @Update + fun update(transaction: TransactionEntity) + @Query("SELECT * FROM transactionentity WHERE id = :id") + fun getId(id: Int): TransactionEntity + } \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoman/retrofit/data/entity/TransactionEntity.kt b/app/src/main/java/com/example/bondoman/retrofit/data/entity/TransactionEntity.kt new file mode 100644 index 0000000000000000000000000000000000000000..efed10853ea363b2e51aba1f131c5a98120a199d --- /dev/null +++ b/app/src/main/java/com/example/bondoman/retrofit/data/entity/TransactionEntity.kt @@ -0,0 +1,20 @@ +package com.example.bondoman.retrofit.data.entity + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey + +enum class Category { + Pemasukan, + Pengeluaran +} + +@Entity +data class TransactionEntity( + @PrimaryKey(autoGenerate = true) var id: Int? = null, + @ColumnInfo(name = "nama_transaksi") var name: String? = null, + @ColumnInfo(name = "kategori_transaksi") var category: Category? = null, + @ColumnInfo(name = "tanggal_transaksi") var date: String? = null, + @ColumnInfo(name = "nominal_transaksi") var price: Int? = null, + @ColumnInfo(name = "lokasi_transaksi") var location: String? = null +) \ No newline at end of file diff --git a/app/src/main/res/drawable/delete.xml b/app/src/main/res/drawable/delete.xml new file mode 100644 index 0000000000000000000000000000000000000000..3ff265b5f755197a47d3da49ba51be3833313b45 --- /dev/null +++ b/app/src/main/res/drawable/delete.xml @@ -0,0 +1,34 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="30dp" + android:height="30dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:pathData="M11.99,21.242C4.225,21.242 5.403,17.617 5.403,9.598" + android:strokeLineJoin="round" + android:strokeWidth="1.5" + android:fillColor="#00000000" + android:strokeColor="#000000" + android:strokeLineCap="round"/> + <path + android:pathData="M18.599,9.598C18.599,15.827 19.295,19.405 15.967,20.692" + android:strokeLineJoin="round" + android:strokeWidth="1.5" + android:fillColor="#00000000" + android:strokeColor="#000000" + android:strokeLineCap="round"/> + <path + android:pathData="M20.075,6.524H3.925" + android:strokeLineJoin="round" + android:strokeWidth="1.5" + android:fillColor="#00000000" + android:strokeColor="#000000" + android:strokeLineCap="round"/> + <path + android:pathData="M15.425,6.524C15.425,6.524 15.954,2.758 11.999,2.758C10.27,2.758 9.398,3.479 8.964,4.29" + android:strokeLineJoin="round" + android:strokeWidth="1.5" + android:fillColor="#00000000" + android:strokeColor="#000000" + android:strokeLineCap="round"/> +</vector> diff --git a/app/src/main/res/layout/fragment_detail_transaction.xml b/app/src/main/res/layout/fragment_detail_transaction.xml deleted file mode 100644 index d175656c33cf67c56c8203031938c0645fe35920..0000000000000000000000000000000000000000 --- a/app/src/main/res/layout/fragment_detail_transaction.xml +++ /dev/null @@ -1,14 +0,0 @@ -<?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=".DetailTransactionFragment"> - - <!-- TODO: Update blank fragment layout --> - <TextView - android:layout_width="match_parent" - android:layout_height="match_parent" - android:text="@string/hello_blank_fragment" /> - -</FrameLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_edit_transaction.xml b/app/src/main/res/layout/fragment_edit_transaction.xml index f4cb513d8c5dedad844e66325cb9b2f1fde8d4b1..1ec0c2c2fb86066927e04d19e489064b30fef605 100644 --- a/app/src/main/res/layout/fragment_edit_transaction.xml +++ b/app/src/main/res/layout/fragment_edit_transaction.xml @@ -12,16 +12,25 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/container_edit" - android:layout_marginTop="24dp" + android:layout_marginTop="75dp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent"> </ImageView> + <com.google.android.material.floatingactionbutton.FloatingActionButton + android:id="@+id/deleteButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@drawable/delete" + tools:ignore="MissingConstraints" + tools:layout_editor_absoluteX="310dp" + tools:layout_editor_absoluteY="6dp" /> + <LinearLayout android:layout_width="match_parent" android:layout_height="500dp" - android:layout_marginTop="64dp" + android:layout_marginTop="100dp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" @@ -37,10 +46,11 @@ /> <EditText + android:id="@+id/nameField" android:layout_width="match_parent" android:layout_height="48dp" android:layout_marginTop="8dp" - android:text="Nama Transaksi" + android:hint="Masukkan nama transaksi" android:textColor="@color/grey" android:paddingHorizontal="20dp" android:textSize="16sp" @@ -56,10 +66,11 @@ /> <EditText + android:id="@+id/priceField" android:layout_width="match_parent" android:layout_marginTop="8dp" android:layout_height="48dp" - android:text="Nominal" + android:hint="Masukkan nominal" android:textColor="@color/grey" android:paddingHorizontal="20dp" android:textSize="16sp" @@ -75,10 +86,11 @@ /> <EditText + android:id="@+id/locationField" android:layout_width="match_parent" android:layout_marginTop="8dp" android:layout_height="48dp" - android:text="Lokasi" + android:hint="Masukkan Lokasi" android:textColor="@color/grey" android:paddingVertical="12dp" android:paddingHorizontal="20dp" @@ -88,6 +100,7 @@ <TextView + android:id="@+id/categoryField" android:layout_width="match_parent" android:layout_marginTop="24dp" android:layout_height="48dp" @@ -100,6 +113,7 @@ /> <TextView + android:id="@+id/dateField" android:layout_width="match_parent" android:layout_marginTop="24dp" android:layout_height="48dp" @@ -112,6 +126,7 @@ /> <Button + android:id="@+id/saveButton" android:layout_width="match_parent" android:layout_height="56dp" android:layout_marginTop="24dp"