diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 34b35f656319915b64cdbf31c189920d6d9df450..4374a8346c6ba60dcd83eb81baec70695568b3ec 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -18,22 +18,17 @@ android:supportsRtl="true" android:theme="@style/Theme.ABE" tools:targetApi="31"> - <activity - android:name=".ui.form_transaction.FormTransaction" - android:exported="false" - android:label="Add Transaction" - android:parentActivityName=".MainActivity"/> <activity android:name=".MainActivity" android:exported="true"> - </activity> - <activity - android:name=".ui.login.LoginActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> + </activity> + <activity + android:name=".ui.login.LoginActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> diff --git a/app/src/main/java/com/example/abe/MainActivity.kt b/app/src/main/java/com/example/abe/MainActivity.kt index ec6e2b6d5b2be0ffc61f03ba6a6c37c6abf5242f..05ec1ca42b5db60317a083ab3c9dfc933c31b0ff 100644 --- a/app/src/main/java/com/example/abe/MainActivity.kt +++ b/app/src/main/java/com/example/abe/MainActivity.kt @@ -2,27 +2,35 @@ package com.example.abe import android.app.Activity import android.content.BroadcastReceiver +import android.content.Context import android.content.Intent import android.content.IntentFilter import android.os.Bundle +import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.DialogFragment import androidx.lifecycle.lifecycleScope import androidx.localbroadcastmanager.content.LocalBroadcastManager +import androidx.navigation.NavController import androidx.navigation.findNavController import androidx.navigation.ui.AppBarConfiguration +import androidx.navigation.ui.navigateUp import androidx.navigation.ui.setupActionBarWithNavController import androidx.navigation.ui.setupWithNavController import com.example.abe.databinding.ActivityMainBinding +import com.example.abe.types.FragmentListener import com.example.abe.ui.transactions.ExportAlertDialogFragment import com.example.abe.ui.transactions.ExportAlertDialogTypeEnum import com.example.abe.ui.transactions.ExportLoadDialogFragment +import com.example.abe.ui.transactions.TransactionFragment import com.google.android.material.bottomnavigation.BottomNavigationView import kotlinx.coroutines.launch -class MainActivity : AppCompatActivity(), ExportAlertDialogFragment.ExportAlertDialogListener { +class MainActivity : AppCompatActivity(), ExportAlertDialogFragment.ExportAlertDialogListener, FragmentListener, TransactionFragment.ItemClickListener { + private lateinit var appBarConfiguration: AppBarConfiguration + private lateinit var navController: NavController private lateinit var binding: ActivityMainBinding private val viewModel: MainActivityViewModel by viewModels { @@ -30,7 +38,19 @@ class MainActivity : AppCompatActivity(), ExportAlertDialogFragment.ExportAlertD } private val filter = IntentFilter().apply { addAction("RANDOMIZE_TRANSACTION") } - private val br: BroadcastReceiver = TransactionBroadcastReceiver() + private val br = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when(intent.action) { + "RANDOMIZE_TRANSACTION" -> { + val randomAmount = intent.getIntExtra("random_amount", 0) + val bundle = Bundle().apply { + putInt("random_amount", randomAmount) + } + navController.navigate(R.id.action_navigation_transactions_to_navigation_form_transaction, bundle) + } + } + } + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -40,9 +60,9 @@ class MainActivity : AppCompatActivity(), ExportAlertDialogFragment.ExportAlertD val navView: BottomNavigationView = binding.navView - val navController = findNavController(R.id.nav_host_fragment_activity_main) + navController = findNavController(R.id.nav_host_fragment_activity_main) - val appBarConfiguration = AppBarConfiguration( + appBarConfiguration = AppBarConfiguration( setOf( R.id.navigation_transactions ) @@ -53,6 +73,20 @@ class MainActivity : AppCompatActivity(), ExportAlertDialogFragment.ExportAlertD LocalBroadcastManager.getInstance(this).registerReceiver(br, filter) } + override fun onIntentReceived(action: String, info: String?) { + when(action) { + "OPEN_FORM" -> { + navController.navigate(R.id.action_navigation_transactions_to_navigation_form_transaction) + } + } + } + + override fun onItemClicked(id: Int) { + val bundle = Bundle() + bundle.putBoolean("is-update", true) + bundle.putInt("idx-id", id) + navController.navigate(R.id.action_navigation_transactions_to_navigation_form_transaction, bundle) + } override fun onNewExcelFormatClick(dialog: DialogFragment, type: ExportAlertDialogTypeEnum) { viewModel.newExcelFormat = true when (type) { @@ -121,4 +155,9 @@ class MainActivity : AppCompatActivity(), ExportAlertDialogFragment.ExportAlertD super.onDestroy() LocalBroadcastManager.getInstance(this).registerReceiver(br, filter) } + + override fun onSupportNavigateUp(): Boolean { + return super.onSupportNavigateUp() || navController.navigateUp(appBarConfiguration) + } + } diff --git a/app/src/main/java/com/example/abe/TransactionBroadcastReceiver.kt b/app/src/main/java/com/example/abe/TransactionBroadcastReceiver.kt deleted file mode 100644 index 6a03bd6805856ee620e351778b83f6612a0402ea..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/example/abe/TransactionBroadcastReceiver.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.example.abe - -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import com.example.abe.ui.form_transaction.FormTransaction - - -private const val TAG = "TransactionBroadcastReceiver" - -class TransactionBroadcastReceiver : BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) { - when(intent.action) { - "RANDOMIZE_TRANSACTION" -> { - val newIntent = Intent(context, FormTransaction::class.java) - newIntent.putExtra("random_amount", intent.getIntExtra("random_amount", 10000)) - - newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - context.startActivity(newIntent) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/example/abe/types/FragmentListener.kt b/app/src/main/java/com/example/abe/types/FragmentListener.kt new file mode 100644 index 0000000000000000000000000000000000000000..5c75c38656aaabdc7e79b1092046090209b0f41e --- /dev/null +++ b/app/src/main/java/com/example/abe/types/FragmentListener.kt @@ -0,0 +1,6 @@ +package com.example.abe.types + + +interface FragmentListener { + fun onIntentReceived(action: String, info: String?) +} \ No newline at end of file diff --git a/app/src/main/java/com/example/abe/ui/form_transaction/FormTransaction.kt b/app/src/main/java/com/example/abe/ui/form_transaction/FormTransaction.kt index c5355db51adad4f66f3d258d7a791f2911919431..d22f32ee28399cf6cd8acb10692ff4cc8c50db2c 100644 --- a/app/src/main/java/com/example/abe/ui/form_transaction/FormTransaction.kt +++ b/app/src/main/java/com/example/abe/ui/form_transaction/FormTransaction.kt @@ -12,68 +12,67 @@ import android.location.LocationManager import android.os.Bundle import android.provider.Settings import android.util.Log +import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup import android.widget.AdapterView import android.widget.ArrayAdapter import android.widget.Toast -import androidx.activity.enableEdgeToEdge -import androidx.activity.viewModels -import androidx.appcompat.app.AppCompatActivity +import androidx.activity.addCallback import androidx.core.app.ActivityCompat -import androidx.core.view.ViewCompat -import androidx.core.view.WindowInsetsCompat +import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import androidx.navigation.fragment.findNavController import com.example.abe.ABEApplication import com.example.abe.R -import com.example.abe.databinding.ActivityFormTransactionBinding +import com.example.abe.databinding.FragmentFormTransactionBinding import com.google.android.gms.location.FusedLocationProviderClient import com.google.android.gms.location.LocationServices import java.util.Locale -class FormTransaction : AppCompatActivity() { - private lateinit var binding: ActivityFormTransactionBinding +class FormTransaction : Fragment() { + private var _binding: FragmentFormTransactionBinding? = null + + private val binding get() = _binding!! + + private lateinit var fusedLocationProviderClient: FusedLocationProviderClient private val permissionId = 2 private val viewModel: FormTransactionViewModel by viewModels { - FormTransactionViewModelFactory((this.application as ABEApplication).repository) + FormTransactionViewModelFactory((activity?.application as ABEApplication).repository) } - private lateinit var user:String + private lateinit var user: String - override fun onCreate(savedInstanceState: Bundle?) { + private var id: Int? = null + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { super.onCreate(savedInstanceState) - enableEdgeToEdge() - binding = ActivityFormTransactionBinding.inflate(layoutInflater) - setContentView(binding.root) + _binding = FragmentFormTransactionBinding.inflate(inflater, container, false) binding.viewModel = viewModel binding.lifecycleOwner = this - viewModel.amountNumber.observe(this, {}) + viewModel.amountNumber.observe(viewLifecycleOwner, {}) - fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this) + fusedLocationProviderClient = + LocationServices.getFusedLocationProviderClient(requireActivity()) - ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> - val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) - v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) - insets + if (requireActivity().intent.hasExtra("random_amount")) { + viewModel.setRandomAmount(requireActivity().intent.getIntExtra("random_amount", 10000)) } - supportActionBar?.setDisplayHomeAsUpEnabled(true) - if (intent.hasExtra("id")) { - intent.getStringExtra("id")?.let { viewModel.getTransaction(it.toInt()) } - binding.categoryAutocomplete.isEnabled = false - } - else { - binding.btnDelete.visibility = View.GONE + requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) { + findNavController().navigateUp() } - if (intent.hasExtra("random_amount")) { - viewModel.setRandomAmount(intent.getIntExtra("random_amount", 10000)) - } val categories = resources.getStringArray(R.array.Categories) - val adapterItems = ArrayAdapter<String>(this, R.layout.list_item, categories) + val adapterItems = ArrayAdapter<String>(requireContext(), R.layout.list_item, categories) binding.categoryAutocomplete.setAdapter(adapterItems) binding.categoryAutocomplete.onItemClickListener = AdapterView.OnItemClickListener { parent, view, position, id -> @@ -89,8 +88,33 @@ class FormTransaction : AppCompatActivity() { getLocation() - val sharedPref = getSharedPreferences(getString(R.string.preference_file_key), Context.MODE_PRIVATE) + val sharedPref = requireActivity().getSharedPreferences( + getString(R.string.preference_file_key), + Context.MODE_PRIVATE + ) user = sharedPref.getString("user", "").toString() + + if (arguments != null) { + val args = Bundle(arguments) + if (args.containsKey("idx-id")) { + val trxId = args.getInt("idx-id") + displayTrx(trxId) + } else if (args.containsKey("random_amount")) { + viewModel.setRandomAmount(args.getInt("random_amount")) + binding.btnDelete.visibility = View.GONE + } + } else { + binding.btnDelete.visibility = View.GONE + } + + return binding.root + } + + + private fun displayTrx(idTrx: Int) { + id = idTrx + viewModel.getTransaction(idTrx) + binding.categoryAutocomplete.isEnabled = false } private fun titleFocusListener() { @@ -144,27 +168,26 @@ class FormTransaction : AppCompatActivity() { .isNotEmpty() && binding.categoryAutocomplete.text.toString() .isNotEmpty() && binding.formLocationEditText.text.toString().isNotEmpty() ) { - if (intent.hasExtra("id")) { - intent.getStringExtra("id")?.let { viewModel.updateTransaction(it.toInt()) } - } - else { + if (id != null) { + viewModel.updateTransaction(id!!) + } else { viewModel.insertTransaction(user) } - finish() + findNavController().navigateUp() } } } private fun deleteButtonListener() { binding.btnDelete.setOnClickListener { - intent.getStringExtra("id")?.let { viewModel.deleteTransaction(it.toInt()) } - finish() + id?.let { viewModel.deleteTransaction(id!!) } + findNavController().navigateUp() } } private fun isLocationEnabled(): Boolean { val locationManager: LocationManager = - getSystemService(Context.LOCATION_SERVICE) as LocationManager + requireActivity().getSystemService(Context.LOCATION_SERVICE) as LocationManager return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled( LocationManager.NETWORK_PROVIDER ) @@ -172,11 +195,11 @@ class FormTransaction : AppCompatActivity() { private fun checkPermissions(): Boolean { if (ActivityCompat.checkSelfPermission( - this, + requireActivity(), Manifest.permission.ACCESS_COARSE_LOCATION ) == PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission( - this, + requireActivity(), Manifest.permission.ACCESS_FINE_LOCATION ) == PackageManager.PERMISSION_GRANTED ) { @@ -187,7 +210,7 @@ class FormTransaction : AppCompatActivity() { private fun requestPermissions() { ActivityCompat.requestPermissions( - this, + requireActivity(), arrayOf( Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION @@ -213,10 +236,10 @@ class FormTransaction : AppCompatActivity() { private fun getLocation() { if (checkPermissions()) { if (isLocationEnabled()) { - fusedLocationProviderClient.lastLocation.addOnCompleteListener(this) { task -> + fusedLocationProviderClient.lastLocation.addOnCompleteListener(requireActivity()) { task -> val location: Location? = task.result if (location != null) { - val geocoder = Geocoder(this, Locale.getDefault()) + val geocoder = Geocoder(requireContext(), Locale.getDefault()) val list: MutableList<Address>? = geocoder.getFromLocation(location.latitude, location.longitude, 1) Log.v( @@ -230,11 +253,12 @@ class FormTransaction : AppCompatActivity() { binding.formLocationEditText.setText(list[0].getAddressLine(0)) } } else { - Log.v("ABECEKUT", "location kg ada") + Log.v("ABECEKUT", "location not available") } } } else { - Toast.makeText(this, "Please turn on location", Toast.LENGTH_LONG).show() + Toast.makeText(requireActivity(), "Please turn on location", Toast.LENGTH_LONG) + .show() val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS) startActivity(intent) } diff --git a/app/src/main/java/com/example/abe/ui/transactions/TransactionFragment.kt b/app/src/main/java/com/example/abe/ui/transactions/TransactionFragment.kt index 5e5b432dc1590d3617e7e6b57d6079b290105484..9f9b8eb63407d44195b0fb75ca7353e4511dfe80 100644 --- a/app/src/main/java/com/example/abe/ui/transactions/TransactionFragment.kt +++ b/app/src/main/java/com/example/abe/ui/transactions/TransactionFragment.kt @@ -1,5 +1,6 @@ package com.example.abe.ui.transactions +import android.content.Context import android.content.Intent import android.os.Bundle import android.view.LayoutInflater @@ -11,12 +12,13 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager import androidx.recyclerview.widget.LinearLayoutManager import com.example.abe.ABEApplication import com.example.abe.databinding.FragmentTransactionsBinding -import com.example.abe.ui.form_transaction.FormTransaction +import com.example.abe.types.FragmentListener class TransactionFragment : Fragment() { private var _binding: FragmentTransactionsBinding? = null + private lateinit var listener: ItemClickListener // This property is only valid between onCreateView and // onDestroyView. @@ -26,6 +28,10 @@ class TransactionFragment : Fragment() { fun newInstance() = TransactionFragment() } + interface ItemClickListener { + fun onItemClicked(id: Int) + } + private val viewModel: TransactionViewModel by viewModels { TransactionViewModelFactory((activity?.application as ABEApplication).repository) } @@ -36,7 +42,7 @@ class TransactionFragment : Fragment() { ): View { _binding = FragmentTransactionsBinding.inflate(inflater, container, false) - val transactionsAdapter = TransactionsAdapter() + val transactionsAdapter = TransactionsAdapter(listener) binding.rvTransactions.adapter = transactionsAdapter binding.rvTransactions.layoutManager = LinearLayoutManager(context) @@ -65,13 +71,19 @@ class TransactionFragment : Fragment() { } binding.addTransactionBtn.setOnClickListener { - val intent = Intent(requireContext(), FormTransaction::class.java) - startActivity(intent) + (activity as FragmentListener).onIntentReceived("OPEN_FORM", "") } return binding.root } + override fun onAttach(context: Context) { + super.onAttach(context) + if (context is ItemClickListener) { + listener = context + } + } + override fun onDestroyView() { super.onDestroyView() _binding = null diff --git a/app/src/main/java/com/example/abe/ui/transactions/TransactionsAdapter.kt b/app/src/main/java/com/example/abe/ui/transactions/TransactionsAdapter.kt index 4aa01e82a686d1d22c212f03fe953bfb9cb34719..da1ba890916ffe5f792b599e2df53560dfe18d83 100644 --- a/app/src/main/java/com/example/abe/ui/transactions/TransactionsAdapter.kt +++ b/app/src/main/java/com/example/abe/ui/transactions/TransactionsAdapter.kt @@ -17,7 +17,7 @@ import com.example.abe.ui.form_transaction.FormTransaction import java.text.SimpleDateFormat import java.util.Locale -class TransactionsAdapter: ListAdapter<Transaction, TransactionsAdapter.TransactionViewHolder>(TransactionComparator()) { +class TransactionsAdapter(private val itemClickListener: TransactionFragment.ItemClickListener): ListAdapter<Transaction, TransactionsAdapter.TransactionViewHolder>(TransactionComparator()) { class TransactionViewHolder(val view: View): RecyclerView.ViewHolder(view) { val clImageContainer: ConstraintLayout val ivTrxIcon: ImageView @@ -73,9 +73,10 @@ class TransactionsAdapter: ListAdapter<Transaction, TransactionsAdapter.Transact tvAmount.text = amountText view.setOnClickListener { - val intent = Intent(it.context, FormTransaction::class.java) - intent.putExtra("id", trx.id.toString()) - it.context.startActivity(intent) +// val intent = Intent(it.context, FormTransaction::class.java) +// intent.putExtra("id", trx.id.toString()) +// it.context.startActivity(intent) + itemClickListener.onItemClicked(trx.id) } } } diff --git a/app/src/main/res/layout/activity_form_transaction.xml b/app/src/main/res/layout/fragment_form_transaction.xml similarity index 98% rename from app/src/main/res/layout/activity_form_transaction.xml rename to app/src/main/res/layout/fragment_form_transaction.xml index 9a4285749544192be080c663b25cda203cad118c..b3c08de536f52f69764affdbd37965f40e197c93 100644 --- a/app/src/main/res/layout/activity_form_transaction.xml +++ b/app/src/main/res/layout/fragment_form_transaction.xml @@ -8,7 +8,7 @@ type="com.example.abe.ui.form_transaction.FormTransactionViewModel" /> </data> <androidx.constraintlayout.widget.ConstraintLayout - android:id="@+id/main" + android:id="@+id/formTransaction" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".ui.form_transaction.FormTransaction"> @@ -18,7 +18,6 @@ style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingTop="?attr/actionBarSize" android:layout_marginHorizontal="20dp" app:helperTextTextColor="@color/destructive" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index 8343e0dcce4b4652749e84fa38aa4adf8e899f17..efbfcf608eb0bb590fe8af4888c1019967b59c3b 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -11,6 +11,19 @@ android:label="Transactions" android:name="com.example.abe.ui.transactions.TransactionFragment" tools:layout="@layout/fragment_transactions" + > + <action + android:id="@+id/action_navigation_transactions_to_navigation_form_transaction" + app:destination="@id/navigation_form_transaction" + app:popUpTo="@id/navigation_form_transaction" + app:popUpToInclusive="true"/> + </fragment> + + <fragment + android:id="@+id/navigation_form_transaction" + android:label="Add Transaction" + android:name="com.example.abe.ui.form_transaction.FormTransaction" + tools:layout="@layout/fragment_form_transaction" /> <!-- <fragment-->