diff --git a/app/src/main/java/com/example/pbd_jwr/MainActivity.kt b/app/src/main/java/com/example/pbd_jwr/MainActivity.kt index c588d3aea47dcd018c1b33bf5aeb11197105f99e..41c08c2080863bca4df63084b5e71eaa65e743ec 100644 --- a/app/src/main/java/com/example/pbd_jwr/MainActivity.kt +++ b/app/src/main/java/com/example/pbd_jwr/MainActivity.kt @@ -10,6 +10,11 @@ import android.content.pm.PackageManager import android.widget.Toast import android.Manifest import android.app.Activity +import android.content.BroadcastReceiver +import android.content.IntentFilter +import android.util.Log +import android.view.Menu +import android.view.MenuItem import androidx.activity.result.contract.ActivityResultContracts import com.google.android.material.bottomnavigation.BottomNavigationView @@ -17,6 +22,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager import androidx.navigation.findNavController import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.setupActionBarWithNavController @@ -29,6 +35,11 @@ import com.example.pbd_jwr.encryptedSharedPref.EncryptedSharedPref import com.example.pbd_jwr.network.NetworkCallbackImplementation import com.example.pbd_jwr.ui.transaction.TransactionViewModel import com.google.android.material.floatingactionbutton.FloatingActionButton +import org.json.JSONObject +import java.util.Date +import kotlin.math.roundToInt +import androidx.appcompat.widget.Toolbar +import com.example.pbd_jwr.ui.transaction.TransactionAddFragment class MainActivity : AppCompatActivity() { @@ -41,9 +52,32 @@ class MainActivity : AppCompatActivity() { private lateinit var mTransactionViewModel: TransactionViewModel + private lateinit var receiver: BroadcastReceiver + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + val serviceIntent = Intent(this, JWTValidationService::class.java) + startService(serviceIntent) + + // Inisialisasi receiver + val receiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + if (intent.action == "com.example.pbd_jwr.RANDOMIZE_TRANSACTION") { + val sharedPreferences = context.getSharedPreferences("randomize_data", Context.MODE_PRIVATE) + val editor = sharedPreferences.edit() + editor.putBoolean("randomize_intent_received", true) + editor.apply() + + } + } + } + + val filter = IntentFilter().apply { + addAction("com.example.pbd_jwr.RANDOMIZE_TRANSACTION") + } + LocalBroadcastManager.getInstance(this).registerReceiver(receiver, filter) + sharedPreferences = EncryptedSharedPref.create(applicationContext,"login") sharedPreferencesEditor = sharedPreferences.edit() binding = ActivityMainBinding.inflate(layoutInflater) @@ -186,6 +220,9 @@ class MainActivity : AppCompatActivity() { override fun onDestroy() { super.onDestroy() + val serviceIntent = Intent(this, JWTValidationService::class.java) + stopService(serviceIntent) + LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver) } private fun registerNetworkCallback() { @@ -196,6 +233,40 @@ class MainActivity : AppCompatActivity() { connectivityManager.unregisterNetworkCallback(networkCallback) } + private val startScanActivityForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == Activity.RESULT_OK) { + + sharedPreferences = EncryptedSharedPref.create(applicationContext, "login") + val currentUserEmail = sharedPreferences.getString("email", "") ?: "" + + val data = result.data + val transactionDummyData = data?.getStringExtra("transactionDummyData") + + transactionDummyData?.let { + + val jsonObject = JSONObject(transactionDummyData) + val itemsArray = jsonObject.getJSONObject("items").getJSONArray("items") + + for (i in 0 until itemsArray.length()) { + val itemObject = itemsArray.getJSONObject(i) + val name = itemObject.getString("name") + val category = Category.EXPENSE + val price = itemObject.getDouble("price") + val qty = itemObject.getInt("qty") + val amount = (qty * price * 1000).roundToInt() / 1000.0 + val latitude = 6.8915 + val longitude = 107.6107 + val location = "Latitude: $latitude, Longitude: $longitude" + val date = Date().time + + mTransactionViewModel.addTransaction(Transaction(email = currentUserEmail, title = name, category = category, amount = amount, latitude = latitude, longitude = longitude, date = date)) + } + + + } + } + } + companion object { private const val LOCATION_PERMISSION_REQUEST_CODE = 1001 } diff --git a/app/src/main/java/com/example/pbd_jwr/ui/settings/SettingsFragment.kt b/app/src/main/java/com/example/pbd_jwr/ui/settings/SettingsFragment.kt index 8904abe133f1d1de17dc762d133eb79cb1e20169..1876e51403444d9a384d02b1deeedf2a42ec5a73 100644 --- a/app/src/main/java/com/example/pbd_jwr/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/com/example/pbd_jwr/ui/settings/SettingsFragment.kt @@ -57,6 +57,7 @@ class SettingsFragment : Fragment() { intent.setAction("com.example.pbd_jwr.RANDOMIZE_TRANSACTION") LocalBroadcastManager.getInstance(requireContext()).sendBroadcast(intent) + } binding.twibbonButton.setOnClickListener { diff --git a/app/src/main/java/com/example/pbd_jwr/ui/transaction/TransactionAddFragment.kt b/app/src/main/java/com/example/pbd_jwr/ui/transaction/TransactionAddFragment.kt index 66c8b15388e0b6598337ad7892c50677c3a15810..e80e414569dbe8a893e281c681f56dc67f9b4587 100644 --- a/app/src/main/java/com/example/pbd_jwr/ui/transaction/TransactionAddFragment.kt +++ b/app/src/main/java/com/example/pbd_jwr/ui/transaction/TransactionAddFragment.kt @@ -10,7 +10,11 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager import android.content.pm.PackageManager import android.os.Build import android.os.Bundle +import android.util.Log import android.view.LayoutInflater +import android.view.Menu +import android.view.MenuInflater +import android.view.MenuItem import android.view.View import android.view.ViewGroup import android.widget.AdapterView @@ -27,9 +31,7 @@ import com.example.pbd_jwr.databinding.FragmentTransactionAddBinding import com.example.pbd_jwr.encryptedSharedPref.EncryptedSharedPref import com.google.android.gms.location.FusedLocationProviderClient import com.google.android.gms.location.LocationServices -import com.google.android.gms.location.LocationRequest -import com.google.android.gms.location.LocationCallback -import com.google.android.gms.location.LocationResult +import com.example.pbd_jwr.R import java.util.Date class TransactionAddFragment : Fragment() { @@ -43,6 +45,8 @@ class TransactionAddFragment : Fragment() { private lateinit var encryptedSharedPref: SharedPreferences + private lateinit var receiver: BroadcastReceiver + @RequiresApi(Build.VERSION_CODES.TIRAMISU) override fun onCreateView( inflater: LayoutInflater, @@ -54,8 +58,27 @@ class TransactionAddFragment : Fragment() { _binding = FragmentTransactionAddBinding.inflate(inflater, container, false) val root: View = binding.root - val filter = IntentFilter(TransactionAddFragment.ACTION_RANDOMIZE_TRANSACTION) - LocalBroadcastManager.getInstance(requireContext()).registerReceiver(randomizeTransactionReceiver, filter) + mTransactionViewModel.transactionSubmitted.observe(viewLifecycleOwner) { success -> + if (success) { + Toast.makeText(requireContext(), "Transaction submitted successfully", Toast.LENGTH_SHORT).show() + } else { + Toast.makeText(requireContext(), "Transaction submission failed", Toast.LENGTH_SHORT).show() + } + } + + val sharedPreferences = requireContext().getSharedPreferences("randomize_data", Context.MODE_PRIVATE) + val randomIntentReceived = sharedPreferences.getBoolean("randomize_intent_received", false) + if (randomIntentReceived) { + println("masuk random") + // Lakukan randomisasi transaksi di sini + handleRandomizeTransaction() + // Hapus status intent yang sudah diterima agar tidak diproses lagi + val editor = sharedPreferences.edit() + editor.putBoolean("randomize_intent_received", false) + editor.apply() + } +// +// setupListeners() fusedLocationClient = LocationServices.getFusedLocationProviderClient(requireActivity()) showCurrentLocation() @@ -106,26 +129,30 @@ class TransactionAddFragment : Fragment() { } + return root } - private fun handleRandomizeTransaction() { - val editMode = arguments?.getBoolean("editMode", false) ?: false - if (!editMode) { - println("random random") - fillRandomField() - } + + fun handleRandomizeTransaction() { + val randomTitle = generateRandomTitle() + val randomAmount = generateRandomAmount() + + binding.editTextTitle.setText(randomTitle) + binding.editTextAmount.setText(randomAmount.toString()) + + saveRandomData(randomTitle, randomAmount) } - private val randomizeTransactionReceiver = object : BroadcastReceiver() { - override fun onReceive(context: Context?, intent: Intent?) { - println("Intent diterima oleh broadcast receiver") - if (intent?.action == "com.example.pbd_jwr.RANDOMIZE_TRANSACTION") { - handleRandomizeTransaction() - } - } + private fun saveRandomData(randomTitle: String, randomAmount: Double) { + val sharedPreferences = requireContext().getSharedPreferences("randomize_data", Context.MODE_PRIVATE) + val editor = sharedPreferences.edit() + editor.putString("random_title", randomTitle) + editor.putFloat("random_amount", randomAmount.toFloat()) // Menggunakan putFloat karena SharedPreferences tidak mendukung Double secara langsung + editor.apply() } + private fun showCurrentLocation() { if (ContextCompat.checkSelfPermission( requireContext(), @@ -240,24 +267,21 @@ class TransactionAddFragment : Fragment() { Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show() } - private fun fillRandomField() { - val randomTitle = generateRandomTitle() - binding.editTextTitle.setText(randomTitle) + private fun generateRandomAmount(): Double { + return (0..300).random().toDouble() } private fun generateRandomTitle(): String { - return "Random Transaction ${System.currentTimeMillis()}" + return "Random Transaction" } override fun onDestroyView() { super.onDestroyView() - LocalBroadcastManager.getInstance(requireContext()).unregisterReceiver(randomizeTransactionReceiver) } companion object { private const val LOCATION_PERMISSION_REQUEST_CODE = 1001 - const val ACTION_RANDOMIZE_TRANSACTION = "com.example.pbd_jwr.RANDOMIZE_TRANSACTION" } } diff --git a/app/src/main/java/com/example/pbd_jwr/ui/transaction/TransactionDetailFragment.kt b/app/src/main/java/com/example/pbd_jwr/ui/transaction/TransactionDetailFragment.kt index 8dae7d0244890ff2f16c9a40dd2fb33852df3a41..9f6696a15b62aa4673a5a248e1eac7a194d61026 100644 --- a/app/src/main/java/com/example/pbd_jwr/ui/transaction/TransactionDetailFragment.kt +++ b/app/src/main/java/com/example/pbd_jwr/ui/transaction/TransactionDetailFragment.kt @@ -68,7 +68,6 @@ class TransactionDetailFragment : Fragment(), OnMapReadyCallback { findNavController().popBackStack() } - return root } @@ -97,6 +96,19 @@ class TransactionDetailFragment : Fragment(), OnMapReadyCallback { return sdf.format(calendar.time) } + private fun showDeleteConfirmationDialog(transaction: Transaction) { + AlertDialog.Builder(requireContext(), AlertDialog.THEME_DEVICE_DEFAULT_LIGHT) + .setTitle("Delete Transaction") + .setMessage("Are you sure you want to delete this transaction?") + .setPositiveButton("Yes") { _, _ -> + transaction?.let { deleteTransaction(it) } + } + .setNegativeButton("No") { dialog, _ -> + dialog.dismiss() + } + .show() + } + private fun deleteTransaction(transaction: Transaction) { mTransactionViewModel.deleteTransaction(transaction) findNavController().popBackStack() diff --git a/app/src/main/java/com/example/pbd_jwr/ui/transaction/TransactionViewModel.kt b/app/src/main/java/com/example/pbd_jwr/ui/transaction/TransactionViewModel.kt index 7928d1090c3a0789db9f6cac8669801109b71c7d..083fc41341d6043e708d336ce6aa126b4ab20c2c 100644 --- a/app/src/main/java/com/example/pbd_jwr/ui/transaction/TransactionViewModel.kt +++ b/app/src/main/java/com/example/pbd_jwr/ui/transaction/TransactionViewModel.kt @@ -15,7 +15,6 @@ import kotlinx.coroutines.launch class TransactionViewModel(application: Application) : AndroidViewModel(application) { - private val readAllTransactions: LiveData<List<Transaction>> private val repository: TransactionRepository private val _transactionSubmitted = MutableLiveData<Boolean>() @@ -23,7 +22,6 @@ class TransactionViewModel(application: Application) : AndroidViewModel(applicat init { val transactionDao = AppDatabase.getDatabase(application).transactionDao() repository = TransactionRepository(transactionDao) - readAllTransactions = repository.getAllTransactions() } fun getAllTransactions(): LiveData<List<Transaction>> { return repository.getAllTransactions()