From ae94c733797e4850d0f6e008c413ef177f80ed06 Mon Sep 17 00:00:00 2001
From: Altair1618 <farhannabilsuryono3@gmail.com>
Date: Fri, 29 Mar 2024 13:49:09 +0700
Subject: [PATCH] feat: implement randomize transaction

---
 .../receivers/ExpiryBroadcastReceiver.kt      |  3 --
 .../services/services/ExpiryService.kt        | 11 +++---
 .../views/activities/LoginActivity.kt         |  2 +-
 .../bondoman/views/activities/MainActivity.kt | 36 ++++++++++++++++++-
 .../views/fragments/SettingsFragment.kt       | 11 +++---
 .../fragments/TransactionFormFragment.kt      | 29 +++++++++++++++
 6 files changed, 78 insertions(+), 14 deletions(-)

diff --git a/app/src/main/java/com/example/bondoman/services/receivers/ExpiryBroadcastReceiver.kt b/app/src/main/java/com/example/bondoman/services/receivers/ExpiryBroadcastReceiver.kt
index f50288f..ba96f99 100644
--- a/app/src/main/java/com/example/bondoman/services/receivers/ExpiryBroadcastReceiver.kt
+++ b/app/src/main/java/com/example/bondoman/services/receivers/ExpiryBroadcastReceiver.kt
@@ -3,13 +3,10 @@ package com.example.bondoman.services.receivers
 import android.content.BroadcastReceiver
 import android.content.Context
 import android.content.Intent
-import android.content.IntentFilter
 import com.example.bondoman.data.utils.PreferencesManager
 import com.example.bondoman.views.activities.LoginActivity
 
 class ExpiryBroadcastReceiver : BroadcastReceiver() {
-	val filter = IntentFilter("com.example.bondoman.services.LOGOUT_TIMEOUT")
-
 	override fun onReceive(
 		context: Context?,
 		intent: Intent?,
diff --git a/app/src/main/java/com/example/bondoman/services/services/ExpiryService.kt b/app/src/main/java/com/example/bondoman/services/services/ExpiryService.kt
index c310549..f3972da 100644
--- a/app/src/main/java/com/example/bondoman/services/services/ExpiryService.kt
+++ b/app/src/main/java/com/example/bondoman/services/services/ExpiryService.kt
@@ -4,13 +4,10 @@ import android.app.Service
 import android.content.Intent
 import android.os.IBinder
 import android.util.Log
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.MutableLiveData
 import androidx.localbroadcastmanager.content.LocalBroadcastManager
 import com.example.bondoman.data.repositories.UserRepository
 import com.example.bondoman.data.utils.PreferencesManager
 import com.example.bondoman.networks.RetrofitClient
-import com.example.bondoman.networks.responses.TokenResponse
 import com.example.bondoman.networks.services.UserService
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
@@ -66,8 +63,12 @@ class ExpiryService : Service() {
 
 	private fun checkTokenJob(token: String) {
 		coroutineScope.launch {
-			val repository = UserRepository(RetrofitClient.getInstanceWithAuth(token).create(
-				UserService::class.java))
+			val repository =
+				UserRepository(
+					RetrofitClient.getInstanceWithAuth(token).create(
+						UserService::class.java,
+					),
+				)
 			val tokenResponse = repository.checkToken()
 
 			// If not success then sendBroadcast
diff --git a/app/src/main/java/com/example/bondoman/views/activities/LoginActivity.kt b/app/src/main/java/com/example/bondoman/views/activities/LoginActivity.kt
index 0bd6393..43a0d86 100644
--- a/app/src/main/java/com/example/bondoman/views/activities/LoginActivity.kt
+++ b/app/src/main/java/com/example/bondoman/views/activities/LoginActivity.kt
@@ -20,7 +20,7 @@ import com.google.android.material.textfield.TextInputEditText
 class LoginActivity : AppCompatActivity() {
 	private val viewModel: LoginViewModel by viewModels()
 	private val expiryDuration: Long = 300000L // 5 minutes
-//	private val expiryDuration: Long = 10000L // 10 seconds for testing
+// 	private val expiryDuration: Long = 10000L // 10 seconds for testing
 
 	private lateinit var loginLayout: ConstraintLayout
 	private lateinit var emailInput: TextInputEditText
diff --git a/app/src/main/java/com/example/bondoman/views/activities/MainActivity.kt b/app/src/main/java/com/example/bondoman/views/activities/MainActivity.kt
index 6fc7676..e53ea7d 100644
--- a/app/src/main/java/com/example/bondoman/views/activities/MainActivity.kt
+++ b/app/src/main/java/com/example/bondoman/views/activities/MainActivity.kt
@@ -1,5 +1,9 @@
 package com.example.bondoman.views.activities
 
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
 import android.os.Bundle
 import android.view.View
 import android.view.ViewGroup
@@ -51,6 +55,19 @@ class MainActivity : AppCompatActivity(), ParentActivityService {
 
 	private val expiryReceiver = ExpiryBroadcastReceiver()
 
+	var randomizeNextTransaction: Boolean = false
+	private val randomizeReceiver =
+		object : BroadcastReceiver() {
+			override fun onReceive(
+				context: Context?,
+				intent: Intent?,
+			) {
+				if (intent?.action == "com.example.bondoman.intents.RANDOMIZE_TRANSACTION") {
+					randomizeNextTransaction = true
+				}
+			}
+		}
+
 	override fun addDestinationChangedListener(listener: (Int) -> Unit) {
 		destinationListeners.add(listener)
 	}
@@ -204,6 +221,11 @@ class MainActivity : AppCompatActivity(), ParentActivityService {
 
 	override fun onCreate(savedInstanceState: Bundle?) {
 		super.onCreate(savedInstanceState)
+
+		if (savedInstanceState != null) {
+			randomizeNextTransaction = savedInstanceState.getBoolean("randomizeNextTransaction")
+		}
+
 		binding = ActivityMainBinding.inflate(layoutInflater)
 		setContentView(binding.root)
 
@@ -214,17 +236,29 @@ class MainActivity : AppCompatActivity(), ParentActivityService {
 		// initialize fragment id tracking
 		currentFragmentId = null
 
+		// IntentFilter
+		val expiryReceiverFilter = IntentFilter("com.example.bondoman.services.LOGOUT_TIMEOUT")
+		val randomizeReceiverFilter = IntentFilter("com.example.bondoman.intents.RANDOMIZE_TRANSACTION")
+
 		// Register Expiry Receiver
 		LocalBroadcastManager.getInstance(this)
-			.registerReceiver(expiryReceiver, expiryReceiver.filter)
+			.registerReceiver(expiryReceiver, expiryReceiverFilter)
+		LocalBroadcastManager.getInstance(this)
+			.registerReceiver(randomizeReceiver, randomizeReceiverFilter)
 
 		initializeComponents()
 		configureNavigation()
 	}
 
+	override fun onSaveInstanceState(outState: Bundle) {
+		super.onSaveInstanceState(outState)
+		outState.putBoolean("randomizeNextTransaction", randomizeNextTransaction)
+	}
+
 	override fun onDestroy() {
 		LocalBroadcastManager.getInstance(this)
 			.unregisterReceiver(expiryReceiver)
+		LocalBroadcastManager.getInstance(this).unregisterReceiver(randomizeReceiver)
 		super.onDestroy()
 	}
 }
diff --git a/app/src/main/java/com/example/bondoman/views/fragments/SettingsFragment.kt b/app/src/main/java/com/example/bondoman/views/fragments/SettingsFragment.kt
index 91f2b5e..24a41ef 100644
--- a/app/src/main/java/com/example/bondoman/views/fragments/SettingsFragment.kt
+++ b/app/src/main/java/com/example/bondoman/views/fragments/SettingsFragment.kt
@@ -9,6 +9,7 @@ import android.widget.Toast
 import androidx.fragment.app.Fragment
 import androidx.lifecycle.Observer
 import androidx.lifecycle.ViewModelProvider
+import androidx.localbroadcastmanager.content.LocalBroadcastManager
 import com.example.bondoman.R
 import com.example.bondoman.data.utils.PreferencesManager
 import com.example.bondoman.data.viewmodels.settings.ExportTransactionResponseContainer
@@ -58,10 +59,10 @@ class SettingsFragment : Fragment() {
 				Observer<ExportTransactionResponseContainer> {
 					when (it.status) {
 						ExportTransactionStatus.SUCCESS -> {
-							Toast.makeText(context, "Export Report Success", Toast.LENGTH_SHORT).show()
+							Toast.makeText(requireActivity(), "Export Report Success", Toast.LENGTH_SHORT).show()
 						}
 						ExportTransactionStatus.FAILED -> {
-							Toast.makeText(context, "Export Report Failed", Toast.LENGTH_SHORT).show()
+							Toast.makeText(requireActivity(), "Export Report Failed", Toast.LENGTH_SHORT).show()
 						}
 					}
 				}
@@ -71,11 +72,13 @@ class SettingsFragment : Fragment() {
 	}
 
 	private fun onSendReportButtonClick() {
-		Toast.makeText(context, "Send Report", Toast.LENGTH_SHORT).show()
+		Toast.makeText(requireActivity(), "Send Report", Toast.LENGTH_SHORT).show()
 	}
 
 	private fun onRandomizeTransactionButtonClick() {
-		Toast.makeText(context, "Randomize Transaction", Toast.LENGTH_SHORT).show()
+		val intent = Intent("com.example.bondoman.intents.RANDOMIZE_TRANSACTION")
+		LocalBroadcastManager.getInstance(requireActivity()).sendBroadcast(intent)
+// 		Toast.makeText(requireActivity(), "Add Transaction Page has been randomized", Toast.LENGTH_SHORT).show()
 	}
 
 	private fun onLogoutButtonClick() {
diff --git a/app/src/main/java/com/example/bondoman/views/fragments/TransactionFormFragment.kt b/app/src/main/java/com/example/bondoman/views/fragments/TransactionFormFragment.kt
index 139b988..0118fac 100644
--- a/app/src/main/java/com/example/bondoman/views/fragments/TransactionFormFragment.kt
+++ b/app/src/main/java/com/example/bondoman/views/fragments/TransactionFormFragment.kt
@@ -25,6 +25,7 @@ import com.example.bondoman.data.models.TransactionCategory
 import com.example.bondoman.data.models.transactionCategoryMap
 import com.example.bondoman.data.utils.TransactionParser
 import com.example.bondoman.databinding.FragmentTransactionFormBinding
+import com.example.bondoman.views.activities.MainActivity
 import com.example.bondoman.views.utils.interfaces.ParentActivityService
 import com.example.bondoman.views.utils.interfaces.SecondaryFragment
 import java.util.Date
@@ -410,6 +411,18 @@ abstract class TransactionFormFragment : Fragment(), SecondaryFragment {
 		return ValidationResult(true, null)
 	}
 
+	private fun randomizeTransaction() {
+		val randomCategory = transactionCategoryMap.keys.random()
+		val randomTitle = "Transaction " + (0..1000).random()
+		val randomAmount = (0..10000).random().times(1000L)
+		val randomLocation = null
+
+		setCategory(transactionCategoryMap[randomCategory]!!)
+		setTitle(randomTitle)
+		setAmount(randomAmount)
+		setLocation(randomLocation)
+	}
+
 	override fun onCreateView(
 		inflater: LayoutInflater,
 		container: ViewGroup?,
@@ -461,4 +474,20 @@ abstract class TransactionFormFragment : Fragment(), SecondaryFragment {
 
 		return view
 	}
+
+	override fun onViewCreated(
+		view: View,
+		savedInstanceState: Bundle?,
+	) {
+		super.onViewCreated(view, savedInstanceState)
+
+		// Randomize Transaction
+		if (activity is MainActivity) {
+			val mainActivity = activity as MainActivity
+			if (mainActivity.randomizeNextTransaction) {
+				randomizeTransaction()
+				mainActivity.randomizeNextTransaction = false
+			}
+		}
+	}
 }
-- 
GitLab