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