diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 534fd6f8b27b87cad3d3cdacdd66d550b8c2ed55..ac9740ef99aa043ef84dea2d2b40e1bee641cc1f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -25,6 +25,15 @@ android:permission="android.permission.INTERNET"> </service> + <receiver + android:name=".ui.transactions.TransactionsBroadcastReceiver" + android:enabled="true" + android:exported="false"> + <intent-filter> + <action android:name="com.BondoYap.transactions.randomize" /> + </intent-filter> + </receiver> + <activity android:name=".ui.login.LoginActivity" android:screenOrientation="portrait" @@ -41,6 +50,8 @@ android:exported="true"> </activity> + + </application> </manifest> \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoyap/MainActivity.kt b/app/src/main/java/com/example/bondoyap/MainActivity.kt index 45bd03acce96fb18184ec41c63a83e7262d0af71..f99a955ca06223a0f5dc78aba72f6cc75a909984 100644 --- a/app/src/main/java/com/example/bondoyap/MainActivity.kt +++ b/app/src/main/java/com/example/bondoyap/MainActivity.kt @@ -2,23 +2,38 @@ package com.example.bondoyap import android.content.Context import android.content.Intent +import android.content.IntentFilter import android.content.SharedPreferences import android.os.Bundle +import androidx.activity.viewModels import com.google.android.material.bottomnavigation.BottomNavigationView import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContentProviderCompat.requireContext +import androidx.fragment.app.viewModels +import androidx.localbroadcastmanager.content.LocalBroadcastManager import androidx.navigation.findNavController import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.setupActionBarWithNavController import androidx.navigation.ui.setupWithNavController import com.example.bondoyap.service.api.Constants.SHARED_PREFS_NAME import com.example.bondoyap.databinding.ActivityMainBinding +import com.example.bondoyap.service.api.Constants import com.example.bondoyap.service.jwt.JwtService import com.example.bondoyap.ui.login.LoginActivity +import com.example.bondoyap.ui.transactions.TransactionsApplication +import com.example.bondoyap.ui.transactions.TransactionsBroadcastReceiver +import com.example.bondoyap.ui.transactions.TransactionsViewModel +import com.example.bondoyap.ui.transactions.TransactionsViewModelFactory class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding private lateinit var sharedPreferences: SharedPreferences + private lateinit var transactionsBroadcastReceiver: TransactionsBroadcastReceiver + + private val transactionsViewModel: TransactionsViewModel by viewModels { + TransactionsViewModelFactory((applicationContext as TransactionsApplication).repository) + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -48,6 +63,10 @@ class MainActivity : AppCompatActivity() { setupActionBarWithNavController(navController, appBarConfiguration) navView.setupWithNavController(navController) + + transactionsBroadcastReceiver = TransactionsBroadcastReceiver(transactionsViewModel) + val filter = IntentFilter(Constants.ACTION_RANDOMIZE_TRANSACTIONS) + LocalBroadcastManager.getInstance(this).registerReceiver(transactionsBroadcastReceiver, filter) } override fun onSupportNavigateUp(): Boolean { @@ -57,4 +76,9 @@ class MainActivity : AppCompatActivity() { private fun isLoggedIn(): Boolean { return sharedPreferences.getBoolean("isLoggedIn", false) } + + override fun onDestroy() { + super.onDestroy() + LocalBroadcastManager.getInstance(this).unregisterReceiver(transactionsBroadcastReceiver) + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoyap/service/api/Constants.kt b/app/src/main/java/com/example/bondoyap/service/api/Constants.kt index 76fb345217e505ad47427a35808c9e2a256b86ef..897daedea631dae9a33ff6c0eca3671394eb39df 100644 --- a/app/src/main/java/com/example/bondoyap/service/api/Constants.kt +++ b/app/src/main/java/com/example/bondoyap/service/api/Constants.kt @@ -3,4 +3,5 @@ package com.example.bondoyap.service.api object Constants { const val BASE_URL: String = "https://pbd-backend-2024.vercel.app/api/" const val SHARED_PREFS_NAME = "BondoYap" + const val ACTION_RANDOMIZE_TRANSACTIONS = "com.BondoYap.transactions.randomize" } \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoyap/ui/settings/SettingsFragment.kt b/app/src/main/java/com/example/bondoyap/ui/settings/SettingsFragment.kt index 8018684cc1dabee268479d5c16e1e2029ee1dba6..26e124b1865ee2317362cdf3300a906f46b81386 100644 --- a/app/src/main/java/com/example/bondoyap/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/com/example/bondoyap/ui/settings/SettingsFragment.kt @@ -2,13 +2,16 @@ package com.example.bondoyap.ui.settings import android.content.Intent import android.os.Bundle +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager import com.example.bondoyap.databinding.FragmentSettingsBinding +import com.example.bondoyap.service.api.Constants.ACTION_RANDOMIZE_TRANSACTIONS import com.example.bondoyap.ui.login.LoginActivity class SettingsFragment : Fragment() { @@ -25,6 +28,7 @@ class SettingsFragment : Fragment() { _binding = FragmentSettingsBinding.inflate(inflater, container, false) return binding.root } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -60,15 +64,20 @@ class SettingsFragment : Fragment() { randomButton.setOnClickListener { Toast.makeText(appContext, "Membuat transaksi random ...", Toast.LENGTH_SHORT).show() - //todo + + val intent = Intent(ACTION_RANDOMIZE_TRANSACTIONS) + intent.putExtra("message", "Randomize from setting!") + LocalBroadcastManager.getInstance(requireContext()).sendBroadcast(intent) + + Log.d("BroadcastDebug", "Sending broadcast from SettingsFragment") } - saveButton.setOnClickListener{ + saveButton.setOnClickListener { Toast.makeText(appContext, "Menyimpan transaksi...", Toast.LENGTH_SHORT).show() //todo } - sendButton.setOnClickListener{ + sendButton.setOnClickListener { Toast.makeText(appContext, "Mengirimkan transaksi ...", Toast.LENGTH_SHORT).show() //todo } diff --git a/app/src/main/java/com/example/bondoyap/ui/transactions/AddTransactionsFragment.kt b/app/src/main/java/com/example/bondoyap/ui/transactions/AddTransactionsFragment.kt index 88d64ef36a124fb2e7a944540da9f4ca8a2a2dd2..6463fa0928a6487d79dfda7d59da716d1f735aed 100644 --- a/app/src/main/java/com/example/bondoyap/ui/transactions/AddTransactionsFragment.kt +++ b/app/src/main/java/com/example/bondoyap/ui/transactions/AddTransactionsFragment.kt @@ -1,17 +1,23 @@ package com.example.bondoyap.ui.transactions import android.R +import android.content.Context +import android.content.IntentFilter import android.content.pm.PackageManager +import android.os.Build import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ArrayAdapter import android.widget.Toast +import androidx.annotation.RequiresApi import androidx.core.app.ActivityCompat import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels +import androidx.localbroadcastmanager.content.LocalBroadcastManager import com.example.bondoyap.databinding.FragmentAddTransactionsBinding +import com.example.bondoyap.service.api.Constants.ACTION_RANDOMIZE_TRANSACTIONS import com.example.bondoyap.ui.transactions.data.Transactions import com.google.android.gms.location.FusedLocationProviderClient import com.google.android.gms.location.LocationServices @@ -85,7 +91,7 @@ class AddTransactionsFragment : Fragment() { 0.0 } - val location = fusedLocationProviderClient.lastLocation + val location = fusedLocationProviderClient.lastLocation location.addOnSuccessListener { if(it != null) { latitude = it.latitude.toString() diff --git a/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsBroadcastReceiver.kt b/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsBroadcastReceiver.kt new file mode 100644 index 0000000000000000000000000000000000000000..01ec56df32f5ede55d12ea840944d5e1704bbe31 --- /dev/null +++ b/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsBroadcastReceiver.kt @@ -0,0 +1,74 @@ +package com.example.bondoyap.ui.transactions + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.util.Log +import android.widget.Toast +import androidx.core.app.ActivityCompat +import com.example.bondoyap.ui.transactions.data.Transactions +import com.google.android.gms.location.FusedLocationProviderClient +import com.google.android.gms.location.LocationServices +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale +import kotlin.random.Random + +class TransactionsBroadcastReceiver(private val transactionsViewModel: TransactionsViewModel) : BroadcastReceiver() { + private lateinit var fusedLocationProviderClient: FusedLocationProviderClient + private lateinit var latitude: String + private lateinit var longitude: String + override fun onReceive(context: Context?, intent: Intent?) { + Log.d("BroadcastDebug", "Broadcast received in AddTransactionsFragment") + + context ?: return + + val randomJudul = "Random Judul ${Random.nextInt(1000)}" + val randomNominal = Random.nextDouble(1000000000000000.0) + val randomIsPemasukan = Random.nextBoolean() + val dateFormat = SimpleDateFormat("dd/MM/yyyy", Locale.getDefault()) + val currentDate = dateFormat.format(Date()) + + fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(context) + val location = fusedLocationProviderClient.lastLocation + location.addOnSuccessListener { + if(it != null) { + latitude = it.latitude.toString() + longitude = it.longitude.toString() + + val transaction: Transactions = Transactions( + judul = randomJudul, + nominal = randomNominal, + isPemasukan = randomIsPemasukan, + tanggal = currentDate, + longitude = longitude, + latitude = latitude + ) + transactionsViewModel.upsert(transaction) + } + } + + if( + ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_FINE_LOCATION) + != PackageManager.PERMISSION_GRANTED + && ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_COARSE_LOCATION) + != PackageManager.PERMISSION_GRANTED + ) { + val transaction: Transactions = Transactions( + judul = randomJudul, + nominal = randomNominal, + isPemasukan = randomIsPemasukan, + tanggal = currentDate, + longitude = "", + latitude = "" + ) + transactionsViewModel.upsert(transaction) + Toast.makeText(context.applicationContext, + "Izinkan location permission untuk membuat transaksi random dengan lokasi", + Toast.LENGTH_SHORT).show() + } + + Toast.makeText(context.applicationContext, "Transaksi random telah dibuat", Toast.LENGTH_SHORT).show() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsFragment.kt b/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsFragment.kt index 036cd83e1724a379928591b30b629adc6a195603..f928b30d81367d99044359eca8ad4d5c8754020a 100644 --- a/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsFragment.kt +++ b/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsFragment.kt @@ -2,6 +2,7 @@ package com.example.bondoyap.ui.transactions import android.content.pm.PackageManager import android.os.Bundle +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -15,12 +16,11 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.example.bondoyap.R import com.example.bondoyap.databinding.FragmentTransactionsBinding +import com.example.bondoyap.service.api.Constants.ACTION_RANDOMIZE_TRANSACTIONS class TransactionsFragment: Fragment() { private var _binding: FragmentTransactionsBinding? = null - // This property is only valid between onCreateView and - // onDestroyView. private val binding get() = _binding!! private val transactionsViewModel: TransactionsViewModel by viewModels { @@ -52,6 +52,7 @@ class TransactionsFragment: Fragment() { return binding.root } + override fun onDestroyView() { super.onDestroyView() _binding = null