From bc3c334bd5df04aef144ac6148b089b64c7f9b72 Mon Sep 17 00:00:00 2001
From: Ghazi Akmal Fauzan <13521058@std.stei.itb.ac.id>
Date: Tue, 2 Apr 2024 18:21:49 +0700
Subject: [PATCH] feat: broadcast receiver randomize transaction

---
 .../transaction/TransactionFragment.kt        |  82 +++++++++++++++++-
 .../transaction/TransactionReceiver.kt        |  15 ++++
 app/src/main/res/drawable/random.png          | Bin 0 -> 4646 bytes
 .../main/res/layout/fragment_transaction.xml  |  11 +++
 app/src/main/res/values/strings.xml           |   5 +-
 5 files changed, 110 insertions(+), 3 deletions(-)
 create mode 100644 app/src/main/java/com/example/nerbos/fragments/transaction/TransactionReceiver.kt
 create mode 100644 app/src/main/res/drawable/random.png

diff --git a/app/src/main/java/com/example/nerbos/fragments/transaction/TransactionFragment.kt b/app/src/main/java/com/example/nerbos/fragments/transaction/TransactionFragment.kt
index be27dae..cd11db3 100644
--- a/app/src/main/java/com/example/nerbos/fragments/transaction/TransactionFragment.kt
+++ b/app/src/main/java/com/example/nerbos/fragments/transaction/TransactionFragment.kt
@@ -1,9 +1,11 @@
 package com.example.nerbos.fragments.transaction
 
 import android.Manifest
+import android.annotation.SuppressLint
 import android.app.Dialog
 import android.content.ActivityNotFoundException
 import android.content.Intent
+import android.content.IntentFilter
 import android.content.pm.PackageManager
 import android.content.pm.ResolveInfo
 import android.location.Geocoder
@@ -49,7 +51,8 @@ import java.util.Locale
 
 class TransactionFragment : Fragment() {
 
-    private  lateinit var transactionViewModel: TransactionViewModel
+    private lateinit var transactionViewModel: TransactionViewModel
+    private lateinit var transactionReceiver: TransactionReceiver
     private lateinit var authentication: Authentication
     private var currentLocation: Location? = null
     private var networkManagerService: NetworkManagerService = NetworkManagerService()
@@ -162,9 +165,27 @@ class TransactionFragment : Fragment() {
             xlsxSend.visibility = View.GONE
         }
 
+        // Randomize Transactionq
+        view.findViewById<ImageView>(R.id.randomizeTransactionButton).setOnClickListener {
+            val intent = Intent("ACTION_RANDOMIZE_TRANSACTION")
+            requireContext().sendBroadcast(intent)
+        }
+
         return view
     }
 
+    @SuppressLint("UnspecifiedRegisterReceiverFlag")
+    override fun onResume() {
+        super.onResume()
+        transactionReceiver = TransactionReceiver(this)
+        requireContext().registerReceiver(transactionReceiver, IntentFilter("ACTION_RANDOMIZE_TRANSACTION"))
+    }
+
+    override fun onPause() {
+        super.onPause()
+        requireContext().unregisterReceiver(transactionReceiver)
+    }
+
     private fun createExcelFile(transactions : List<Transaction>, extension: String) : Workbook{
         val workbook : Workbook
         val sheet : Sheet
@@ -306,6 +327,65 @@ class TransactionFragment : Fragment() {
         dialog.window!!.setBackgroundDrawableResource(R.drawable.round_corner_transparent)
         dialog.window!!.attributes = layoutParams
     }
+
+    internal fun showRandomAddTransactionDialog() {
+        val dialog = Dialog(requireContext())
+
+        dialog.setContentView(R.layout.add_transaction)
+        dialog.setCancelable(true)
+
+        val layoutParams = WindowManager.LayoutParams()
+        layoutParams.copyFrom(dialog.window!!.attributes)
+        layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT
+        layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT
+
+        // Getting reference from elements in the dialog
+        val nameInput = dialog.findViewById<EditText>(R.id.nameInput)
+        val nominalInput = dialog.findViewById<EditText>(R.id.nominalInput)
+        val locationInput = dialog.findViewById<EditText>(R.id.locationInput)
+        val incomeRadioButton = dialog.findViewById<RadioButton>(R.id.incomeInput)
+        val outcomeRadioButton = dialog.findViewById<RadioButton>(R.id.outcomeInput)
+
+        // Randomize
+        val randomName = "Transaction " + (1..1000).random()
+        val randomNominal = (1..1000000).random().toFloat()
+        val randomLocation = "Location " + (1..1000).random()
+        val randomCategory = (0..1).random() // 0 for income, 1 for outcome
+
+        // Setting the random content
+        nameInput.setText(randomName)
+        nominalInput.setText(randomNominal.toString())
+        locationInput.setText(randomLocation)
+
+        if (randomCategory == 0) {
+            incomeRadioButton.isChecked = true
+        } else {
+            outcomeRadioButton.isChecked = true
+        }
+
+        dialog.findViewById<Button>(R.id.addButton).setOnClickListener {
+            if (insertDataToDatabase(dialog)) {
+                dialog.dismiss()
+            }
+        }
+
+        dialog.findViewById<Button>(R.id.cancelButton).setOnClickListener {
+            dialog.dismiss()
+        }
+
+        dialog.findViewById<ImageView>(R.id.autoFillLocationButton).setOnClickListener {
+            if (!networkManagerService.isNetworkAvailable(requireContext())) {
+                Toast.makeText(requireContext(), "No internet connection, this feature requires internet connection", Toast.LENGTH_SHORT).show()
+            } else {
+                locationInput.setText(getAddressName())
+            }
+        }
+
+        dialog.show()
+        dialog.window!!.setBackgroundDrawableResource(R.drawable.round_corner_transparent)
+        dialog.window!!.attributes = layoutParams
+    }
+
     private fun showModifyTransactionDialog(transaction: Transaction) {
         val dialog = Dialog(requireContext())
 
diff --git a/app/src/main/java/com/example/nerbos/fragments/transaction/TransactionReceiver.kt b/app/src/main/java/com/example/nerbos/fragments/transaction/TransactionReceiver.kt
new file mode 100644
index 0000000..81e9924
--- /dev/null
+++ b/app/src/main/java/com/example/nerbos/fragments/transaction/TransactionReceiver.kt
@@ -0,0 +1,15 @@
+package com.example.nerbos.fragments.transaction
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.widget.Toast
+
+class TransactionReceiver(private val fragment: TransactionFragment) : BroadcastReceiver() {
+    override fun onReceive(context: Context?, intent: Intent?) {
+        if (intent?.action == "ACTION_RANDOMIZE_TRANSACTION") {
+            fragment.showRandomAddTransactionDialog()
+            Toast.makeText(context, "Broadcast Received: Randomize Transaction", Toast.LENGTH_SHORT).show()
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/random.png b/app/src/main/res/drawable/random.png
new file mode 100644
index 0000000000000000000000000000000000000000..8442456fd33c9e24ae3f6db98b31de51d7420c38
GIT binary patch
literal 4646
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

literal 0
HcmV?d00001

diff --git a/app/src/main/res/layout/fragment_transaction.xml b/app/src/main/res/layout/fragment_transaction.xml
index 10f6f89..5958b05 100644
--- a/app/src/main/res/layout/fragment_transaction.xml
+++ b/app/src/main/res/layout/fragment_transaction.xml
@@ -49,6 +49,17 @@
             app:layout_constraintTop_toBottomOf="@+id/saveTransactionsButton"
         />
 
+        <ImageView
+            android:id="@+id/randomizeTransactionButton"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="30dp"
+            android:layout_marginEnd="50dp"
+            android:background="@drawable/random"
+            android:contentDescription="@string/randomize_transaction_button"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/sendTransactionsButton" />
+
         <ImageView
             android:id="@+id/addTransactionButton"
             android:layout_width="wrap_content"
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index cc66f87..ebab2ec 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,4 +1,4 @@
-<resources>
+<resources xmlns:tools="http://schemas.android.com/tools">
     <string name="app_name">NerbOS</string>
     <string name="hello_blank_fragment">Hello blank fragment</string>
     <string name="navbar_transaction">Transactions</string>
@@ -17,7 +17,7 @@
     <string name="password">password</string>
     <string name="token">token</string>
     <string name="key_alias">key13521000</string>
-    <string name="cipher_transformation">RSA/ECB/PKCS1Padding</string>
+    <string name="cipher_transformation" tools:ignore="Typos">RSA/ECB/PKCS1Padding</string>
     <string name="android_key_store">AndroidKeyStore</string>
     <string name="authorization">Authorization</string>
     <string name="bearer">Bearer</string>
@@ -69,5 +69,6 @@
     <string name="logo">Logo</string>
     <string name="back_button">Back Button</string>
     <string name="autofill_location_button">AutoFill Location Button</string>
+    <string name="randomize_transaction_button">Randomize Transaction Button</string>
 
 </resources>
\ No newline at end of file
-- 
GitLab