diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ff29bd341581f4d3114504c489618663fe93acb8..7420bfc9ccb5ff852b1842a15e8c4b52382da24d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -51,6 +51,7 @@ dependencies { testImplementation("junit:junit:4.13.2") implementation("androidx.navigation:navigation-fragment-ktx:2.7.7") implementation("androidx.navigation:navigation-ui-ktx:2.7.7") + implementation("org.greenrobot:eventbus:3.2.0") testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") diff --git a/app/src/main/java/com/example/bondoman/AddTransactionFragment.kt b/app/src/main/java/com/example/bondoman/AddTransactionFragment.kt index c3130ad649164a9cc70ccba91cb13d7a5d3452b2..24872007eae5beef58ff7041836fec5bf713390b 100644 --- a/app/src/main/java/com/example/bondoman/AddTransactionFragment.kt +++ b/app/src/main/java/com/example/bondoman/AddTransactionFragment.kt @@ -18,9 +18,14 @@ import android.widget.ArrayAdapter import android.widget.Spinner import androidx.core.app.ActivityCompat import androidx.lifecycle.ViewModelProvider +import com.example.bondoman.services.RandomTransactionEvent +import com.example.bondoman.services.RandomizeTransaction +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode -class AddTransactionFragment : Fragment() { +class AddTransactionFragment : Fragment(){ private lateinit var binding: FragmentAddTransactionBinding private lateinit var geocoder: Geocoder private lateinit var fusedLocationClient: FusedLocationProviderClient @@ -28,10 +33,16 @@ class AddTransactionFragment : Fragment() { private var isFetched : Boolean = false private lateinit var db: DBViewModel + private var pendingTransaction: MutableList<Pair<String, Double>> = mutableListOf() + companion object { private const val LOCATION_PERMISSION_REQUEST_CODE = 1001 } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -39,12 +50,20 @@ class AddTransactionFragment : Fragment() { binding = FragmentAddTransactionBinding.inflate(inflater, container, false) geocoder = Geocoder(requireContext(), Locale.getDefault()) fusedLocationClient = LocationServices.getFusedLocationProviderClient(requireActivity()) + db = ViewModelProvider(requireActivity())[DBViewModel::class.java] + + if (pendingTransaction.isNotEmpty()){ + pendingTransaction.forEach { pair -> + db.addTransaksi(pair.first, "Pengeluaran", pair.second, "Unknown") + } + pendingTransaction.clear() + } + return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - db = ViewModelProvider(requireActivity())[DBViewModel::class.java] val categorySpinner: Spinner = binding.addCategoryField val categories = resources.getStringArray(R.array.category_array) @@ -52,7 +71,6 @@ class AddTransactionFragment : Fragment() { adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) categorySpinner.adapter = adapter - if (ContextCompat.checkSelfPermission(requireContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(requireContext(), android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { Log.e("fetchLocation", "Both fine and coarse location permissions granted") @@ -79,9 +97,9 @@ class AddTransactionFragment : Fragment() { Log.d("addTransactionWoi", "Button clicked") - val amount: Int + val amount: Double try { - amount = amountText.toInt() + amount = amountText.toDouble() } catch (e: NumberFormatException) { Toast.makeText(requireContext(), "Amount must be a valid number", Toast.LENGTH_SHORT).show() return@setOnClickListener @@ -101,6 +119,16 @@ class AddTransactionFragment : Fragment() { } } + override fun onDestroyView() { + super.onDestroyView() + EventBus.getDefault().unregister(this) + } + @Subscribe(threadMode = ThreadMode.MAIN) + fun onRandomTransactionReceived(event: com.example.bondoman.services.RandomTransactionEvent) { + val transactionName = event.transactionName + val price = event.price + pendingTransaction.add(Pair(transactionName, price)) + } private fun fetchLocation(callback: (String) -> Unit) { var address = "Unknown" diff --git a/app/src/main/java/com/example/bondoman/DBViewModel.kt b/app/src/main/java/com/example/bondoman/DBViewModel.kt index b76bb25a0bbb3d6747d8e742ea0ba12170bcfcd8..d0898cb4c566b5d4dc233056e42226aeb5170947 100644 --- a/app/src/main/java/com/example/bondoman/DBViewModel.kt +++ b/app/src/main/java/com/example/bondoman/DBViewModel.kt @@ -5,22 +5,29 @@ import androidx.lifecycle.AndroidViewModel import com.example.bondoman.retrofit.data.TransactionDB import com.example.bondoman.retrofit.data.entity.Category import com.example.bondoman.retrofit.data.entity.TransactionEntity +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import java.text.SimpleDateFormat import java.util.Date import java.util.Locale class DBViewModel(application: Application) : AndroidViewModel(application) { private val db = TransactionDB.getInstance(application) + private val viewModelScope = CoroutineScope(Dispatchers.IO) - fun addTransaksi(name: String, category: String, price: Int, location: String = "") { - val currentDate = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(Date()) - val newTransaction = TransactionEntity( - name = name, - category = Category.valueOf(category), - date = currentDate, - price = price, - location = location - ) - db.transactionDao().insertAll(newTransaction) + fun addTransaksi(name: String, category: String, price: Double, location: String = "") { + viewModelScope.launch { + val currentDate = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(Date()) + var tempLocation = location + val newTransaction = TransactionEntity( + name = name, + category = Category.valueOf(category), + date = currentDate, + price = price, + location = tempLocation + ) + db.transactionDao().insertAll(newTransaction) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoman/EditTransactionFragment.kt b/app/src/main/java/com/example/bondoman/EditTransactionFragment.kt index 22f43392091f507aafd5d92b043aaf1ec7d6ed85..abda7cf9dbf7ce41f5c8574afc895a56e364ad2d 100644 --- a/app/src/main/java/com/example/bondoman/EditTransactionFragment.kt +++ b/app/src/main/java/com/example/bondoman/EditTransactionFragment.kt @@ -1,7 +1,6 @@ package com.example.bondoman import android.app.AlertDialog -import android.content.DialogInterface import android.os.Bundle import androidx.fragment.app.Fragment import android.view.LayoutInflater @@ -46,12 +45,12 @@ class EditTransactionFragment : Fragment() { AlertDialog.Builder(requireContext()) .setTitle("Delete Transaction") .setMessage("Are you sure you want to delete this transaction?") - .setPositiveButton("Yes") { dialog, which -> + .setPositiveButton("Yes") { _, _ -> val transaction = db.transactionDao().getId(id) db.transactionDao().delete(transaction) requireActivity().onBackPressed() } - .setNegativeButton("No") { dialog, which -> } + .setNegativeButton("No") { _, _ -> } .show() } @@ -60,7 +59,7 @@ class EditTransactionFragment : Fragment() { val kategori = db.transactionDao().getId(id).category val date = db.transactionDao().getId(id).date val nama = binding.nameField.text.toString() - val nominal = binding.priceField.text.toString().toInt() + val nominal = binding.priceField.text.toString().toDouble() val lokasi = binding.locationField.text.toString() val newTransaction = TransactionEntity( diff --git a/app/src/main/java/com/example/bondoman/GraphFragment.kt b/app/src/main/java/com/example/bondoman/GraphFragment.kt index 39756ce0696417c9e03e1b6b92a31fec426ba7d0..6f2ee6ca948c3b3d6412eae40bb6b943a9a99217 100644 --- a/app/src/main/java/com/example/bondoman/GraphFragment.kt +++ b/app/src/main/java/com/example/bondoman/GraphFragment.kt @@ -1,9 +1,18 @@ package com.example.bondoman +import android.content.res.Configuration +import android.graphics.Color import android.os.Bundle +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.animation.AnimationUtils +import android.widget.ImageButton +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import com.github.mikephil.charting.charts.PieChart import com.github.mikephil.charting.data.PieData @@ -20,6 +29,23 @@ class GraphFragment : Fragment() { val view = inflater.inflate(R.layout.fragment_grafik, container, false) val pieChart: PieChart = view.findViewById(R.id.pieChart) + val navbar = requireActivity().findViewById<LinearLayout>(R.id.navbar_main) + val toolbar = requireActivity().findViewById<RelativeLayout>(R.id.toolbar) + navbar.setBackgroundResource(R.drawable.navbar_background) + toolbar.setBackgroundColor( + Color.parseColor("#000113") + ) + val textView = toolbar.findViewById<TextView>(R.id.toolbar_text) + val transactionButton = requireActivity().findViewById<ImageButton>(R.id.transaction_button) + val graphButton = requireActivity().findViewById<ImageButton>(R.id.graph_button) + val settingButton = requireActivity().findViewById<ImageButton>(R.id.setting_button) + textView.text = "Grafik" + textView.setTextColor(Color.WHITE) + toolbar.findViewById<ImageButton>(R.id.toolbar_back_button).setImageResource(R.drawable.ic_arrow_left_white) + transactionButton.isSelected = false + graphButton.isSelected = true + settingButton.isSelected = false + // Dummy data val income = 5000f val outcome = 3000f @@ -53,4 +79,39 @@ class GraphFragment : Fragment() { return view } + + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + + if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { + val transactionButton = requireActivity().findViewById<ImageButton>(R.id.transaction_button) + val graphButton = requireActivity().findViewById<ImageButton>(R.id.graph_button) + val settingButton = requireActivity().findViewById<ImageButton>(R.id.setting_button) + val scanButton = requireActivity().findViewById<ImageButton>(R.id.scan_button) + + val animation = AnimationUtils.loadAnimation(requireContext(), R.anim.rotate_90_deg) + + transactionButton.startAnimation(animation) + graphButton.startAnimation(animation) + settingButton.startAnimation(animation) + scanButton.startAnimation(animation) + + Log.d("ORIENTATION CHANGED", "rotate 90") + } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { + val transactionButton = requireActivity().findViewById<ImageButton>(R.id.transaction_button) + val graphButton = requireActivity().findViewById<ImageButton>(R.id.graph_button) + val settingButton = requireActivity().findViewById<ImageButton>(R.id.setting_button) + val scanButton = requireActivity().findViewById<ImageButton>(R.id.scan_button) + + val animation = AnimationUtils.loadAnimation(requireContext(), R.anim.rotate_270_deg) + + transactionButton.startAnimation(animation) + graphButton.startAnimation(animation) + settingButton.startAnimation(animation) + scanButton.startAnimation(animation) + + Log.d("ORIENTATION CHANGED", "rotate 270") + + } + } } diff --git a/app/src/main/java/com/example/bondoman/MainActivity.kt b/app/src/main/java/com/example/bondoman/MainActivity.kt index 2b9b963216ac8d53a01f969b3985ef7b2cc2aa1e..7c096ed0618b98d3d44c285a0c9994b6908325e0 100644 --- a/app/src/main/java/com/example/bondoman/MainActivity.kt +++ b/app/src/main/java/com/example/bondoman/MainActivity.kt @@ -3,6 +3,7 @@ package com.example.bondoman import android.content.Intent import android.graphics.Rect import android.os.Bundle +import android.util.Log import android.view.MenuItem import android.view.View import android.widget.ImageButton @@ -17,11 +18,14 @@ import androidx.navigation.findNavController import androidx.navigation.fragment.NavHostFragment import com.example.bondoman.services.JWTExpiry import android.widget.Toast +import androidx.core.content.ContentProviderCompat.requireContext import androidx.lifecycle.lifecycleScope +import com.example.bondoman.retrofit.data.TransactionDB import com.example.bondoman.services.ConnectivityObserver import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import com.example.bondoman.services.NetworkSensing +import org.greenrobot.eventbus.EventBus class MainActivity : AppCompatActivity() { private lateinit var service: Intent @@ -31,7 +35,6 @@ class MainActivity : AppCompatActivity() { private lateinit var settingButton: ImageButton private lateinit var scanButton: ImageButton private lateinit var navController: NavController - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) @@ -39,6 +42,9 @@ class MainActivity : AppCompatActivity() { startService(service) networkSensing = NetworkSensing(this) + EventBus.getDefault().register(TransactionFragment()) + Log.d("EventBus", "Registered fragment as subscriber") + val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment val toolbarButton = findViewById<ImageButton>(R.id.toolbar_back_button) navController = navHostFragment.navController @@ -131,5 +137,8 @@ class MainActivity : AppCompatActivity() { override fun onDestroy() { super.onDestroy() stopService(service) + EventBus.getDefault().unregister(AddTransactionFragment()) + } + } diff --git a/app/src/main/java/com/example/bondoman/ScanFragment.kt b/app/src/main/java/com/example/bondoman/ScanFragment.kt index a0f7a5741608c50daa0ad79d5a45da47de0720ee..3b30d62792bfa71fe7997d3ae104918ed46f7ce0 100644 --- a/app/src/main/java/com/example/bondoman/ScanFragment.kt +++ b/app/src/main/java/com/example/bondoman/ScanFragment.kt @@ -39,6 +39,7 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import com.example.bondoman.utils.RetrofitInstance import kotlinx.coroutines.CoroutineScope @@ -69,7 +70,7 @@ class ScanFragment : Fragment() { private lateinit var recaptureButton: ImageButton private lateinit var galleryButton: ImageButton private lateinit var confirmButton: ImageButton - + private lateinit var db: DBViewModel private lateinit var imageFile: File @@ -86,16 +87,19 @@ class ScanFragment : Fragment() { galleryButton = view.findViewById(R.id.galleryButton) confirmButton = view.findViewById(R.id.confirmButton) + db = ViewModelProvider(requireActivity())[DBViewModel::class.java] + val navbar = requireActivity().findViewById<LinearLayout>(R.id.navbar_main) val toolbar = requireActivity().findViewById<RelativeLayout>(R.id.toolbar) + toolbar.setBackgroundColor(Color.parseColor("#1B1A55")) + navbar.setBackgroundResource(R.drawable.navbar_bordered_background) val textView = toolbar.findViewById<TextView>(R.id.toolbar_text) val transactionButton = requireActivity().findViewById<ImageButton>(R.id.transaction_button) val graphButton = requireActivity().findViewById<ImageButton>(R.id.graph_button) val settingButton = requireActivity().findViewById<ImageButton>(R.id.setting_button) - toolbar.setBackgroundColor(Color.parseColor("#1B1A55")) - navbar.setBackgroundResource(R.drawable.navbar_bordered_background) - textView.text = "Scan Nota" + textView.setTextColor(Color.WHITE) + toolbar.findViewById<ImageButton>(R.id.toolbar_back_button).setImageResource(R.drawable.ic_arrow_left_white) transactionButton.isSelected = false graphButton.isSelected = false settingButton.isSelected = false @@ -371,6 +375,7 @@ class ScanFragment : Fragment() { } confirmButton.setOnClickListener { + println("UDAH DIKLIK") job = CoroutineScope(Dispatchers.IO).launch { val sharedPreferences = requireActivity().getSharedPreferences( @@ -393,10 +398,13 @@ class ScanFragment : Fragment() { println("Bearer $token") if (response.isSuccessful) { val responseBody = response.body() - println(responseBody) + val items = responseBody?.items + items?.items?.forEach { + db.addTransaksi(it.name, "Pengeluaran", it.qty*it.price, "Unknown") + } createPopUp( "Berhasil", - "Transaksi berhasil ditambahkan" + "Berhasil menambahkan transaksi" ) } else { createPopUp( diff --git a/app/src/main/java/com/example/bondoman/SettingFragment.kt b/app/src/main/java/com/example/bondoman/SettingFragment.kt index 943f9a77fc6c14e4434dc861ab22a84da6590d9a..f3858cc21959ef6ea362c6a0698b41599bdae777 100644 --- a/app/src/main/java/com/example/bondoman/SettingFragment.kt +++ b/app/src/main/java/com/example/bondoman/SettingFragment.kt @@ -3,19 +3,29 @@ import android.app.AlertDialog import android.content.ActivityNotFoundException import android.content.Context.MODE_PRIVATE import android.content.Intent +import android.graphics.Color import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ImageButton +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView import android.widget.Toast +import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import com.example.bondoman.databinding.FragmentSettingBinding import com.example.bondoman.helper.Xls import com.example.bondoman.models.SqlTransaction +import com.example.bondoman.retrofit.data.TransactionDB +import com.example.bondoman.services.RandomizeTransaction +import kotlin.random.Random class SettingFragment: Fragment() { private lateinit var binding : FragmentSettingBinding + private lateinit var database: TransactionDB private var savedFilePath: String? = null // private lateinit var sendEmailButton: Button @@ -24,16 +34,26 @@ class SettingFragment: Fragment() { savedInstanceState: Bundle? ): View? { val navController = findNavController() - // Inflate the layout for this fragment -// val view = inflater.inflate(R.layout.fragment_setting, container, false) -// sendEmailButton = view.findViewById(R.id.sendEmailButton) -// -// // Set OnClickListener -// sendEmailButton.setOnClickListener { -// sendEmail() -// } -// -// return view + database = TransactionDB.getInstance(requireContext()) + val navbar = requireActivity().findViewById<LinearLayout>(R.id.navbar_main) + val toolbar = requireActivity().findViewById<RelativeLayout>(R.id.toolbar) + navbar.setBackgroundResource(R.drawable.navbar_background) + toolbar.setBackgroundColor( + ContextCompat.getColor( + requireContext(), + R.color.broken_white + ) + ) + val textView = toolbar.findViewById<TextView>(R.id.toolbar_text) + val transactionButton = requireActivity().findViewById<ImageButton>(R.id.transaction_button) + val graphButton = requireActivity().findViewById<ImageButton>(R.id.graph_button) + val settingButton = requireActivity().findViewById<ImageButton>(R.id.setting_button) + textView.text = "Pengaturan" + textView.setTextColor(Color.BLACK) + toolbar.findViewById<ImageButton>(R.id.toolbar_back_button).setImageResource(R.drawable.ic_arrow_left_black) + transactionButton.isSelected = false + graphButton.isSelected = false + settingButton.isSelected = true binding = FragmentSettingBinding.inflate(inflater, container, false) return binding.root @@ -43,20 +63,7 @@ class SettingFragment: Fragment() { super.onViewCreated(view, savedInstanceState) binding.saveButton.setOnClickListener{ - // Retrieve transactions from the database -// val dbTransaction = TransactionSQL(requireContext()) -// dbTransaction.open() -// val listTransaction = dbTransaction.findAll() - -// if (listTransaction.isNotEmpty()) { -// // If there are transactions, show the format selection dialog -// showFormatSelectionDialog(listTransaction) -// } else { -// // Handle case when there are no transactions in the database -// Toast.makeText(requireContext(), "No transactions found in the database", Toast.LENGTH_SHORT).show() -// } } -// binding.sendEmailButton.setOnClickListener { sendEmail() } @@ -65,39 +72,21 @@ class SettingFragment: Fragment() { logout() } binding.randomizeButton.setOnClickListener { - sendEmail() + val listRandomText = listOf("MacBook Pro", "MacBook Air", "Mac Mini", "Mac Pro", "iMac") + val randomText = listRandomText.random() + val randomPrice: Double = String.format("%.2f", Random.nextDouble(0.0, 500.0)).toDouble() + val randomizeTransactionIntent = Intent(requireContext(), RandomizeTransaction::class.java) + randomizeTransactionIntent.putExtra("transactionName", randomText) + randomizeTransactionIntent.putExtra("price", randomPrice) + randomizeTransactionIntent.setAction("com.example.bondoman.services.RandomizeTransaction") + requireContext().sendBroadcast(randomizeTransactionIntent) } } -// private fun showFormatSelectionDialog(listTransaction: List<SqlTransaction>) { -// val formatOptions = arrayOf("XLS", "XLSX") -// -// val builder = AlertDialog.Builder(requireContext()) -// builder.setTitle("Select File Format") -// .setItems(formatOptions) { dialog, which -> -// val fileFormat = if (which == 0) "xls" else "xlsx" -// savedFilePath = Xls.saveXls(requireContext(), listTransaction, fileFormat) -// showMassage("File has been saved successfully") -// dialog.dismiss() -// } -// .setNegativeButton("Cancel") { dialog, _ -> -// dialog.dismiss() -// } -// val dialog = builder.create() -// dialog.show() -// } -// -// private fun showMassage(message: String) { -// val alertDialogBuilder = AlertDialog.Builder(requireContext()) -// alertDialogBuilder -// .setMessage(message) -// .setPositiveButton("OK") { dialog, _ -> -// // Do something when OK button is clicked -// dialog.dismiss() -// } -// .create() -// .show() -// } + override fun onDestroy() { + super.onDestroy() + database.close() + } private fun sendEmail() { // Create an intent to send an email @@ -132,4 +121,6 @@ class SettingFragment: Fragment() { editor.clear() editor.apply() } + + } \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoman/TransactionFragment.kt b/app/src/main/java/com/example/bondoman/TransactionFragment.kt index ca27a39113aaf7e8ff8da2ce9466ffcb7e339bd7..32c455c45274ec818519807b0bd4d4933dce18d5 100644 --- a/app/src/main/java/com/example/bondoman/TransactionFragment.kt +++ b/app/src/main/java/com/example/bondoman/TransactionFragment.kt @@ -1,11 +1,18 @@ package com.example.bondoman import android.content.Intent +import android.graphics.Color import android.os.Bundle +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ImageButton +import android.widget.LinearLayout +import android.widget.RelativeLayout import android.widget.TextView +import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -13,102 +20,105 @@ import com.example.bondoman.retrofit.data.TransactionDB import com.example.bondoman.databinding.FragmentTransaksiBinding import com.example.bondoman.retrofit.data.entity.TransactionEntity import com.example.bondoman.retrofit.adapter.TransactionAdapter +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode -class TransactionFragment : Fragment() { +var pendingTransaction: MutableList<Pair<String, Double>> = mutableListOf() +class TransactionFragment : Fragment() { private lateinit var binding: FragmentTransaksiBinding private lateinit var transactionData: RecyclerView private val listTransaction = ArrayList<TransactionEntity>() private lateinit var searchBar: TextView lateinit var adapter: TransactionAdapter - private lateinit var database: TransactionDB -// private lateinit var dbTransaction: DbTransaction -// private var receiver = TransactionRandomizerReceiver() + private lateinit var database: TransactionDB + private lateinit var db: DBViewModel override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { + database = TransactionDB.getInstance(requireContext()) binding = FragmentTransaksiBinding.inflate(inflater, container, false) + val navbar = requireActivity().findViewById<LinearLayout>(R.id.navbar_main) + val toolbar = requireActivity().findViewById<RelativeLayout>(R.id.toolbar) + navbar.setBackgroundResource(R.drawable.navbar_background) + toolbar.setBackgroundColor( + ContextCompat.getColor( + requireContext(), + R.color.black + ) + ) + val textView = toolbar.findViewById<TextView>(R.id.toolbar_text) + val transactionButton = requireActivity().findViewById<ImageButton>(R.id.transaction_button) + val graphButton = requireActivity().findViewById<ImageButton>(R.id.graph_button) + val settingButton = requireActivity().findViewById<ImageButton>(R.id.setting_button) + textView.text = "Transaksi" + textView.setTextColor(Color.WHITE) + toolbar.findViewById<ImageButton>(R.id.toolbar_back_button) + .setImageResource(R.drawable.ic_arrow_left_white) + transactionButton.isSelected = true + graphButton.isSelected = false + settingButton.isSelected = false + + + return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - database = TransactionDB.getInstance(requireContext()) - - -// val filter = IntentFilter("itb.bos.bondoman.ACTION_RANDOMIZE_TRANSACTION") -// requireContext().registerReceiver(receiver, filter) - -// dbTransaction = DbTransaction(requireContext()) -// dbTransaction.open() - -// dbTransaction.deleteAll() adapter = TransactionAdapter(listTransaction) transactionData = binding.itemTransaction transactionData.adapter = adapter - transactionData.layoutManager = LinearLayoutManager(requireContext(), RecyclerView.VERTICAL, false) - transactionData.addItemDecoration(DividerItemDecoration(requireContext(), RecyclerView.VERTICAL)) - + transactionData.layoutManager = + LinearLayoutManager(requireContext(), RecyclerView.VERTICAL, false) + transactionData.addItemDecoration( + DividerItemDecoration( + requireContext(), + RecyclerView.VERTICAL + ) + ) + + db = ViewModelProvider(requireActivity())[DBViewModel::class.java] + + Log.d("PENDING LIST NOT EMPTY?", pendingTransaction.isNotEmpty().toString()) + if (pendingTransaction.isNotEmpty()) { + if (!database.isOpen){ + database.openHelper.writableDatabase + } + pendingTransaction.forEach { pair -> + Log.d("ADDED TO DB", pair.first) + db.addTransaksi(pair.first, "Pengeluaran", pair.second, "Unknown") + } + pendingTransaction.clear() + } binding.addButton.setOnClickListener { val intent = Intent(requireContext(), ContainerActivity::class.java) startActivity(intent) } -// transactionData.setHasFixedSize(true) -// transactionData.layoutManager = LinearLayoutManager(requireContext()) -// loadDatas() - -// val filteredList: ArrayList<SqlTransaction> = ArrayList(listTransaction) -// var transactionAdapter = TransactionAdapter(filteredList) -// transactionData.adapter = transactionAdapter binding.addButton.setOnClickListener { val intent = Intent(requireContext(), ContainerActivity::class.java) startActivity(intent) } -// searchBar = binding.searchBar -// -// searchBar.addTextChangedListener(object : TextWatcher { -// override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { -// // Not used -// } -// -// override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { -// // Update the filteredList based on the search text -// val searchText = s.toString().trim() -// filteredList.clear() -// -// if (searchText.isEmpty()) { -// // If search text is empty, show all items -// filteredList.addAll(listTransaction) -// } else { -// // Filter the list based on the search text -// filteredList.addAll(listTransaction.filter { transaction -> -// transaction.name != null && transaction.name!!.contains(searchText, ignoreCase = true) -// }) -// } -// -// // Notify the adapter about the updated list -// transactionAdapter = TransactionAdapter(filteredList) -// transactionData.adapter = transactionAdapter -// } -// -// override fun afterTextChanged(s: Editable?) { -// // Not used -// } -// }) + } + + @Subscribe(threadMode = ThreadMode.MAIN) + fun onRandomTransactionReceived(event: com.example.bondoman.services.RandomTransactionEvent) { + val transactionName = event.transactionName + val price = event.price + Log.d("TRANSACTION", transactionName+ "ADDED TO PENDING TRANSACTION") + pendingTransaction.add(Pair(transactionName, price)) } override fun onDestroyView() { super.onDestroyView() - // Unregister the BroadcastReceiver when the fragment's view is destroyed -// requireContext().unregisterReceiver(receiver) database.close() } @@ -122,150 +132,5 @@ class TransactionFragment : Fragment() { listTransaction.addAll(database.transactionDao().getAll()) adapter.notifyDataSetChanged() - -// val datas = dbTransaction.findAll() -// -// datas.forEach { item -> -// val categoryString = item.category?.toString() ?: "PENGELUARAN" -// val category = TransactionCategory.valueOf(categoryString) -// val transaction = SqlTransaction(item.id, item.name, category, item.date, item.price, item.location) -// listTransaction.add(transaction) -// } } -// private lateinit var binding : FragmentTransaksiBinding -// private lateinit var transactionData : RecyclerView -// private val listTransaction= ArrayList<Transaction>() -// private lateinit var searchBar: TextView -// private lateinit var dbTransaction: TransactionSQL -// override fun onCreateView( -// inflater: LayoutInflater, -// container: ViewGroup?, -// savedInstanceState: Bundle? -// ): View { -// binding = FragmentTransaksiBinding.inflate(inflater, container, false) -// return binding.root -// } -// -// override fun onViewCreated(view: View, savedInstanceState: Bundle?) { -// super.onViewCreated(view, savedInstanceState) -// dbTransaction = TransactionSQL(requireContext()) -// dbTransaction.open() -// -//// // Delete all data -//// dbTransaction.deleteAll() -//// -//// // Dummy data insertion -//// insertDummyTransactions() -// -// transactionData = binding.itemTransaction -// transactionData.setHasFixedSize(true) -// transactionData.layoutManager = LinearLayoutManager(requireContext()) -// loadDatas(view) -//// listTransaction.add(Transaction("Semen Tiga Roda","22 Maret 2024", "Pengeluaran", 200000, "Jakarta")) -//// listTransaction.add(Transaction("Semen Tiga Roda","22 Maret 2024", "Pengeluaran", 300000, "Jakarta")) -//// listTransaction.add(Transaction("Semen Tiga Roda","22 Maret 2024", "Pengeluaran", 300000, "Jakarta")) -//// listTransaction.add(Transaction("Mapel Sirup","22 Maret 2024", "Pengeluaran", 100000, "Jakarta")) -//// listTransaction.add(Transaction("Jeruks","22 Maret 2024", "Pengeluaran", 200000, "Jakarta")) -//// listTransaction.add(Transaction("Apel","22 Maret 2024", "Pengeluaran", 300000, "Jakarta")) -// -// -// val filteredList: ArrayList<Transaction> = ArrayList(listTransaction) -// var transactionAdapter = TransactionAdapter(filteredList) -// transactionData.adapter = transactionAdapter -// -// searchBar = binding.searchBar -// -// searchBar.addTextChangedListener(object : TextWatcher { -// override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { -// // Not used -// } -// -// override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { -// // Update the filteredList based on the search text -// val searchText = s.toString().trim() -// filteredList.clear() -// -// if (searchText.isEmpty()) { -// // If search text is empty, show all items -// filteredList.addAll(listTransaction) -// } else { -// // Filter the list based on the search text -// filteredList.addAll(listTransaction.filter { transaction -> -// transaction.name != null && transaction.name.contains(searchText, ignoreCase = true) -// }) -// } -// -// // Notify the adapter about the updated list -// transactionAdapter = TransactionAdapter(filteredList) -// transactionData.adapter = transactionAdapter -// } -// -// override fun afterTextChanged(s: Editable?) { -// // Not used -// } -// }) -// -// -// } -// -// private fun insertDummyTransactions() { -// val dummyTransaction1 = ContentValues().apply { -// put(Kontraktor.TransactionTable.NAME, "Transaction 1") -// put(Kontraktor.TransactionTable.CATEGORY, "Category 1") -// put(Kontraktor.TransactionTable.DATE, "2024-04-01") -// put(Kontraktor.TransactionTable.PRICE, 100) -// put(Kontraktor.TransactionTable.LOCATION, "Location 1") -// } -// -// val dummyTransaction2 = ContentValues().apply { -// put(Kontraktor.TransactionTable.NAME, "Transaction 2") -// put(Kontraktor.TransactionTable.CATEGORY, "Category 2") -// put(Kontraktor.TransactionTable.DATE, "2024-04-02") -// put(Kontraktor.TransactionTable.PRICE, 200) -// put(Kontraktor.TransactionTable.LOCATION, "Location 2") -// } -// -// val dummyTransaction3 = ContentValues().apply { -// put(Kontraktor.TransactionTable.NAME, "Transaction 3") -// put(Kontraktor.TransactionTable.CATEGORY, "Category 3") -// put(Kontraktor.TransactionTable.DATE, "2024-04-03") -// put(Kontraktor.TransactionTable.PRICE, 300) -// put(Kontraktor.TransactionTable.LOCATION, "Location 3") -// } -// -// val dummyTransaction4 = ContentValues().apply { -// put(Kontraktor.TransactionTable.NAME, "Transaction 4") -// put(Kontraktor.TransactionTable.CATEGORY, "Category 4") -// put(Kontraktor.TransactionTable.DATE, "2024-04-04") -// put(Kontraktor.TransactionTable.PRICE, 400) -// put(Kontraktor.TransactionTable.LOCATION, "Location 4") -// } -// -// val dummyTransaction5 = ContentValues().apply { -// put(Kontraktor.TransactionTable.NAME, "Transaction 5") -// put(Kontraktor.TransactionTable.CATEGORY, "Category 5") -// put(Kontraktor.TransactionTable.DATE, "2024-04-05") -// put(Kontraktor.TransactionTable.PRICE, 500) -// put(Kontraktor.TransactionTable.LOCATION, "Location 5") -// } -// -// // Insert dummy transactions into the database -// dbTransaction.insert(dummyTransaction1) -// dbTransaction.insert(dummyTransaction2) -// dbTransaction.insert(dummyTransaction3) -// dbTransaction.insert(dummyTransaction4) -// dbTransaction.insert(dummyTransaction5) -// -// } -// -// fun loadDatas(view: View) { -// -// insertDummyTransactions() -// val datas = dbTransaction.findAll() -// -// datas.forEach { -// item -> -// listTransaction.add(Transaction(item.id,item.name,item.date,item.category, item.price,item.location)) -// } -// } } \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoman/api/ApiInterface.kt b/app/src/main/java/com/example/bondoman/appInterface/api/ApiInterface.kt similarity index 94% rename from app/src/main/java/com/example/bondoman/api/ApiInterface.kt rename to app/src/main/java/com/example/bondoman/appInterface/api/ApiInterface.kt index e30da982079fde174120e03f0c33008bb1663349..62b7a1cc47ec6a75c6a5562b3a600f72d1393e41 100644 --- a/app/src/main/java/com/example/bondoman/api/ApiInterface.kt +++ b/app/src/main/java/com/example/bondoman/appInterface/api/ApiInterface.kt @@ -1,4 +1,4 @@ -package com.example.bondoman.api +package com.example.bondoman.appInterface.api import com.example.bondoman.models.LoginRequest import com.example.bondoman.models.LoginResponse diff --git a/app/src/main/java/com/example/bondoman/models/SqlTransaction.kt b/app/src/main/java/com/example/bondoman/models/SqlTransaction.kt index 518665319b22648c1cff28005f3bbd2edc207fe4..173de943075c0779eeee6ed09f02baa15c2ecf48 100644 --- a/app/src/main/java/com/example/bondoman/models/SqlTransaction.kt +++ b/app/src/main/java/com/example/bondoman/models/SqlTransaction.kt @@ -3,14 +3,14 @@ package com.example.bondoman.models import android.os.Parcel import android.os.Parcelable -data class SqlTransaction(var id: Int=0, var name: String? = null, var category: String? =null, var date: String? =null, var price: Int? = null, var location : String? =null) : +data class SqlTransaction(var id: Int=0, var name: String? = null, var category: String? =null, var date: String? =null, var price: Double? = null, var location : String? =null) : Parcelable { constructor(parcel: Parcel) : this( parcel.readInt(), parcel.readString(), parcel.readString(), parcel.readString(), - parcel.readValue(Int::class.java.classLoader) as? Int, + parcel.readValue(Int::class.java.classLoader) as? Double, parcel.readString() ) diff --git a/app/src/main/java/com/example/bondoman/retrofit/data/Transaction.kt b/app/src/main/java/com/example/bondoman/retrofit/data/Transaction.kt index 2e1c5d14203139055b9d22fb59ce708b8dc12fc0..9938b83cfdf0180aff48150d6b1cd1bec177bd48 100644 --- a/app/src/main/java/com/example/bondoman/retrofit/data/Transaction.kt +++ b/app/src/main/java/com/example/bondoman/retrofit/data/Transaction.kt @@ -3,13 +3,13 @@ package com.example.bondoman.retrofit.data import android.os.Parcel import android.os.Parcelable -data class Transaction(val id: Int?,val name: String?, val date: String?, val category: String?, val price: Int?, val location: String?) : Parcelable { +data class Transaction(val id: Int?,val name: String?, val date: String?, val category: String?, val price: Double?, val location: String?) : Parcelable { constructor(parcel: Parcel) : this( parcel.readValue(Int::class.java.classLoader) as? Int, parcel.readString(), parcel.readString(), parcel.readString(), - parcel.readValue(Int::class.java.classLoader) as? Int, + parcel.readValue(Int::class.java.classLoader) as? Double, parcel.readString() ) diff --git a/app/src/main/java/com/example/bondoman/retrofit/data/TransactionDB.kt b/app/src/main/java/com/example/bondoman/retrofit/data/TransactionDB.kt index a08188c8942955b19a57bf08151b7bca15d257e7..30d45e837d1c8111b26cf5fd7dffb69ca7be29e7 100644 --- a/app/src/main/java/com/example/bondoman/retrofit/data/TransactionDB.kt +++ b/app/src/main/java/com/example/bondoman/retrofit/data/TransactionDB.kt @@ -7,7 +7,7 @@ import androidx.room.RoomDatabase import com.example.bondoman.retrofit.data.dao.TransactionDao import com.example.bondoman.retrofit.data.entity.TransactionEntity -@Database(entities = [TransactionEntity::class], version = 2) +@Database(entities = [TransactionEntity::class], version = 3) abstract class TransactionDB : RoomDatabase() { abstract fun transactionDao(): TransactionDao @@ -18,6 +18,7 @@ abstract class TransactionDB : RoomDatabase() { if (instance==null){ instance = Room.databaseBuilder(context, TransactionDB::class.java, "db") .allowMainThreadQueries() + .fallbackToDestructiveMigration() .build() } diff --git a/app/src/main/java/com/example/bondoman/retrofit/data/entity/TransactionEntitiy.kt b/app/src/main/java/com/example/bondoman/retrofit/data/entity/TransactionEntitiy.kt index efed10853ea363b2e51aba1f131c5a98120a199d..8661e9ab757cf45d4756020b7475fa1f5f185e32 100644 --- a/app/src/main/java/com/example/bondoman/retrofit/data/entity/TransactionEntitiy.kt +++ b/app/src/main/java/com/example/bondoman/retrofit/data/entity/TransactionEntitiy.kt @@ -15,6 +15,6 @@ data class TransactionEntity( @ColumnInfo(name = "nama_transaksi") var name: String? = null, @ColumnInfo(name = "kategori_transaksi") var category: Category? = null, @ColumnInfo(name = "tanggal_transaksi") var date: String? = null, - @ColumnInfo(name = "nominal_transaksi") var price: Int? = null, + @ColumnInfo(name = "nominal_transaksi") var price: Double? = null, @ColumnInfo(name = "lokasi_transaksi") var location: String? = null ) \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoman/services/RandomTransactionEvent.kt b/app/src/main/java/com/example/bondoman/services/RandomTransactionEvent.kt new file mode 100644 index 0000000000000000000000000000000000000000..5056bcf1f2d9eea42d44d69a8ed6e2b46f0b20cb --- /dev/null +++ b/app/src/main/java/com/example/bondoman/services/RandomTransactionEvent.kt @@ -0,0 +1,3 @@ +package com.example.bondoman.services + +class RandomTransactionEvent (val transactionName: String, val price: Double) \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoman/services/RandomizeTransaction.kt b/app/src/main/java/com/example/bondoman/services/RandomizeTransaction.kt index 9f0e0539e4070e5664382cd71802012630ddd8a6..33326fac8b2fa315b70fb46be966b5dd2efd3afa 100644 --- a/app/src/main/java/com/example/bondoman/services/RandomizeTransaction.kt +++ b/app/src/main/java/com/example/bondoman/services/RandomizeTransaction.kt @@ -10,18 +10,15 @@ import androidx.appcompat.app.AppCompatActivity import com.example.bondoman.LogoutFragment import com.example.bondoman.R + import org.greenrobot.eventbus.EventBus class RandomizeTransaction : BroadcastReceiver() { - private var text: String = "" + private var transactionName: String = "" + private var price: Double = 0.0 override fun onReceive(context: Context?, intent: Intent?) { - text = intent?.getStringExtra("transactionName").toString() - - Log.d("BroadcastRandomizeTransaction", "Random text: $text") - -// val activity = context as? AppCompatActivity -// activity?.runOnUiThread { -// val fragment = activity.supportFragmentManager.findFragmentById(R.id.fragment_container) as? LogoutFragment -// fragment?.updateEditText(randomText) -// } + transactionName = intent?.getStringExtra("transactionName") ?: "" + price = intent?.getDoubleExtra("price", 0.0 ) ?: 0.0 + Log.d("BroadcastRandomizeTransaction", "Random text: $transactionName $price") + EventBus.getDefault().post(RandomTransactionEvent(transactionName, price)) } } \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoman/utils/RetrofitInstance.kt b/app/src/main/java/com/example/bondoman/utils/RetrofitInstance.kt index b9bee5f00a0815157b618706909992f3cb7d8626..6f71f155f7cc36b05212e5515c07fa0bfb47de59 100644 --- a/app/src/main/java/com/example/bondoman/utils/RetrofitInstance.kt +++ b/app/src/main/java/com/example/bondoman/utils/RetrofitInstance.kt @@ -1,6 +1,6 @@ package com.example.bondoman.utils -import com.example.bondoman.api.ApiInterface +import com.example.bondoman.appInterface.api.ApiInterface import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory diff --git a/app/src/main/res/drawable/navbar_background_vertical.xml b/app/src/main/res/drawable/navbar_background_vertical.xml new file mode 100644 index 0000000000000000000000000000000000000000..f7870684f1164affa92c72b9b0bf63766516a313 --- /dev/null +++ b/app/src/main/res/drawable/navbar_background_vertical.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="58dp" + android:height="202dp" + android:viewportWidth="58" + android:viewportHeight="202"> + <path + android:pathData="M0,182L0,20A20,20 0,0 1,20 0L38,0A20,20 0,0 1,58 20L58,182A20,20 0,0 1,38 202L20,202A20,20 0,0 1,0 182z" + android:fillColor="#1B1A55"/> +</vector> diff --git a/app/src/main/res/layout-land/navbar_layout.xml b/app/src/main/res/layout-land/navbar_layout.xml new file mode 100644 index 0000000000000000000000000000000000000000..165f0cc1e9f6a881ff899ce7d2b0b669544f8a28 --- /dev/null +++ b/app/src/main/res/layout-land/navbar_layout.xml @@ -0,0 +1,81 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + xmlns:app="http://schemas.android.com/apk/res-auto"> + <LinearLayout + android:layout_width="98dp" + android:layout_height="340dp" + android:background="@android:color/transparent" + android:orientation="vertical" + android:layout_marginTop="?attr/actionBarSize" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent"> + <LinearLayout + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_marginBottom="60dp" + android:layout_marginTop="60dp" + android:layout_marginEnd="40dp" + android:orientation="vertical" + android:background="@android:color/transparent" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" > + <LinearLayout + android:id="@+id/navbar_scanner" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:background="@android:color/transparent" + android:orientation="vertical" + app:layout_constraintBottom_toTopOf="@+id/navbar_scanner" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent"> + <ImageButton + android:id="@+id/scan_button" + android:layout_width="wrap_content" + android:layout_height="0dp" + android:layout_weight="1" + android:background="@drawable/scanner_background" + android:contentDescription="@string/scan_button_description" + android:src="@drawable/ic_scanner_white" /> + </LinearLayout> + <LinearLayout + android:id="@+id/navbar_main" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="18dp" + android:background="@drawable/navbar_background_vertical" + android:orientation="vertical" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toBottomOf="@+id/navbar_scanner" + app:layout_constraintBottom_toBottomOf="parent"> + <ImageButton + android:id="@+id/setting_button" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_weight="1" + android:background="@android:color/transparent" + android:contentDescription="@string/setting_button_description" + android:src="@drawable/ic_setting" /> + <ImageButton + android:id="@+id/graph_button" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_weight="1" + android:background="@android:color/transparent" + android:contentDescription="@string/graph_button_description" + android:src="@drawable/ic_grafik" /> + <ImageButton + android:id="@+id/transaction_button" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_weight="1" + android:background="@android:color/transparent" + android:contentDescription="@string/transaction_button_description" + android:src="@drawable/ic_transaksi" /> + </LinearLayout> + </LinearLayout> + </LinearLayout> +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/navbar_layout.xml b/app/src/main/res/layout/navbar_layout.xml index 59eb3e438134096ba4696275c1b55392e251da66..17f712eaf2fc533ed7e2ee64142e59f699fb6c10 100644 --- a/app/src/main/res/layout/navbar_layout.xml +++ b/app/src/main/res/layout/navbar_layout.xml @@ -3,7 +3,6 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> - <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" @@ -12,20 +11,17 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"> - <LinearLayout - android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="60dp" android:layout_marginEnd="60dp" android:layout_marginBottom="40dp" - android:background="@android:color/transparent" android:orientation="horizontal" + android:background="@android:color/transparent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"> - <LinearLayout android:id="@+id/navbar_main" android:layout_width="wrap_content" @@ -36,17 +32,14 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/navbar_scanner" app:layout_constraintStart_toStartOf="parent"> - <ImageButton android:id="@+id/transaction_button" - android:clickable="true" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" android:background="@android:color/transparent" android:contentDescription="@string/transaction_button_description" android:src="@drawable/ic_transaksi" /> - <ImageButton android:id="@+id/graph_button" android:layout_width="wrap_content" @@ -55,7 +48,6 @@ android:background="@android:color/transparent" android:contentDescription="@string/graph_button_description" android:src="@drawable/ic_grafik" /> - <ImageButton android:id="@+id/setting_button" android:layout_width="wrap_content" @@ -65,7 +57,6 @@ android:contentDescription="@string/setting_button_description" android:src="@drawable/ic_setting" /> </LinearLayout> - <LinearLayout android:id="@+id/navbar_scanner" android:layout_width="wrap_content" @@ -75,7 +66,6 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/navbar_main"> - <ImageButton android:id="@+id/scan_button" android:layout_width="0dp" @@ -87,12 +77,4 @@ </LinearLayout> </LinearLayout> </LinearLayout> - - - <androidx.constraintlayout.widget.Guideline - android:id="@+id/guideline" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:orientation="horizontal" - app:layout_constraintGuide_begin="20dp" /> </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file