diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e2f0395892c16b8bd15af1161fbbfbd73161a146..f7ae50242b2115a02fa51376396134f309b5f06e 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -13,7 +13,7 @@ android { targetSdk = 34 versionCode = 1 versionName = "1.0" - + multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } @@ -54,6 +54,7 @@ dependencies { implementation("androidx.security:security-crypto:1.0.0") implementation("org.apache.poi:poi:5.2.4") implementation("org.apache.poi:poi-ooxml:5.2.4") + implementation("com.github.PhilJay:MPAndroidChart:v3.1.0") testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 153034667596fe6cb8296d41ad3ee3209d057143..ea1f55da6151968670bba7bc6589ae268f3922ae 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,18 +1,20 @@ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> - <!-- Permissions --> <uses-permission android:name="android.permission.INTERNET" /> - <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> + <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> - <uses-permission android:name="android.permission.ACCESS_SURFACE_FLINGER" + <uses-permission + android:name="android.permission.ACCESS_SURFACE_FLINGER" tools:ignore="ProtectedPermissions" /> <queries> + <!-- Query GMail --> <intent> <action android:name="android.intent.action.SENDTO" /> + <data android:scheme="mailto" /> </intent> <!-- Add more queries for other email apps if needed --> @@ -28,9 +30,12 @@ android:supportsRtl="true" android:theme="@style/Theme.Bondoman" tools:targetApi="34"> + <activity + android:name=".TransactionDetailActivity" + android:exported="false" /> <activity android:name=".MainActivity" - android:exported="false"/> + android:exported="false" /> <activity android:name=".LoginActivity" android:exported="false" /> @@ -42,11 +47,10 @@ android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> - </activity> - - <!-- Provider --> + </activity> <!-- Provider --> <provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.provider" @@ -55,21 +59,17 @@ <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> - </provider> - <!-- Service --> - <service android:name="itb.bos.bondoman.services.JWTService" - android:exported="false" /> - - <!-- Broadcast Receiver --> + </provider> <!-- Service --> + <service + android:name=".services.JWTService" + android:exported="false" /> <!-- Broadcast Receiver --> <receiver - android:name="itb.bos.bondoman.receivers.TokenExpiryBroadcastReceiver" + android:name=".receivers.TokenExpiryBroadcastReceiver" android:exported="false"> <intent-filter> <action android:name="itb.bos.bondoman.ACTION_TOKEN_EXPIRED" /> </intent-filter> </receiver> - - </application> </manifest> \ No newline at end of file diff --git a/app/src/main/java/itb/bos/bondoman/MainActivity.kt b/app/src/main/java/itb/bos/bondoman/MainActivity.kt index bee32619274d14636054c1543526ac4e3151b917..76ee7d33535e596ffe7c680166322b5d9def5e99 100644 --- a/app/src/main/java/itb/bos/bondoman/MainActivity.kt +++ b/app/src/main/java/itb/bos/bondoman/MainActivity.kt @@ -2,14 +2,7 @@ package itb.bos.bondoman import android.os.Bundle import androidx.appcompat.app.AppCompatActivity -import androidx.navigation.ui.AppBarConfiguration -import androidx.navigation.ui.setupActionBarWithNavController import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentManager -import androidx.navigation.NavController -import androidx.navigation.findNavController -import androidx.navigation.ui.setupWithNavController -import com.google.android.material.bottomnavigation.BottomNavigationView import itb.bos.bondoman.databinding.ActivityMainBinding import itb.bos.bondoman.fragment.ui.settings.SettingsFragment import itb.bos.bondoman.fragment.ui.statistic.StatisticFragment @@ -28,7 +21,7 @@ class MainActivity : AppCompatActivity() { binding.navView.setOnItemSelectedListener { item -> when(item.itemId){ - R.id.navigation_statistic -> openFragment(QrFragment()) + R.id.navigation_statistic -> openFragment(StatisticFragment()) R.id.navigation_settings -> openFragment(SettingsFragment()) R.id.navigation_transaction -> openFragment(TransactionFragment()) } diff --git a/app/src/main/java/itb/bos/bondoman/TransactionAdapter.kt b/app/src/main/java/itb/bos/bondoman/TransactionAdapter.kt new file mode 100644 index 0000000000000000000000000000000000000000..9e7caa25896e7a9ecac2be821fd8a41c8bce2f7f --- /dev/null +++ b/app/src/main/java/itb/bos/bondoman/TransactionAdapter.kt @@ -0,0 +1,37 @@ +package itb.bos.bondoman + +import android.view.LayoutInflater +import androidx.recyclerview.widget.RecyclerView +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import itb.bos.bondoman.retrofit.data.Transaction + +class TransactionAdapter(private val listData: ArrayList<Transaction>): RecyclerView.Adapter<TransactionAdapter.DataViewHolder>(){ + + override fun onBindViewHolder(holder: DataViewHolder, position: Int) { + val currentData = listData[position] + holder.txtName.text = currentData.name + holder.txtCategory.text = currentData.category + val temp = "IDR " + currentData.price.toString() + holder.txtPrice.text = temp + holder.txtLocation.text = currentData.location + holder.txtDate.text = currentData.date + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DataViewHolder { + val view: View = LayoutInflater.from(parent.context).inflate(R.layout.row_transaction,parent,false) + return DataViewHolder(view) + } + + override fun getItemCount(): Int { + return listData.count() + } + class DataViewHolder(item: View) : RecyclerView.ViewHolder(item) { + val txtName: TextView = item.findViewById(R.id.itemName) + val txtCategory:TextView= item.findViewById(R.id.category) + val txtDate: TextView= item.findViewById(R.id.itemDate) + val txtPrice : TextView= item.findViewById(R.id.itemPrice) + val txtLocation : TextView = item.findViewById(R.id.itemLocation) + } +} diff --git a/app/src/main/java/itb/bos/bondoman/TransactionDetailActivity.kt b/app/src/main/java/itb/bos/bondoman/TransactionDetailActivity.kt new file mode 100644 index 0000000000000000000000000000000000000000..bb857d89ba88fea55c5b882b8a9b7a1068a0b1b8 --- /dev/null +++ b/app/src/main/java/itb/bos/bondoman/TransactionDetailActivity.kt @@ -0,0 +1,14 @@ +package itb.bos.bondoman + +import android.os.Bundle +import androidx.activity.enableEdgeToEdge +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat + +class TransactionDetailActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_transaction_detail) + } +} diff --git a/app/src/main/java/itb/bos/bondoman/fragment/ui/statistic/StatisticFragment.kt b/app/src/main/java/itb/bos/bondoman/fragment/ui/statistic/StatisticFragment.kt index f8bed221f9e39901044e9871470638519df5066b..7f6ec271c277f63199cc8bf1318fd6ec77fa8bc8 100644 --- a/app/src/main/java/itb/bos/bondoman/fragment/ui/statistic/StatisticFragment.kt +++ b/app/src/main/java/itb/bos/bondoman/fragment/ui/statistic/StatisticFragment.kt @@ -10,33 +10,19 @@ import androidx.lifecycle.ViewModelProvider import itb.bos.bondoman.databinding.FragmentStatisticBinding class StatisticFragment : Fragment() { - - private var _binding: FragmentStatisticBinding? = null - - // This property is only valid between onCreateView and - // onDestroyView. - private val binding get() = _binding!! + private lateinit var binding : FragmentStatisticBinding override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { - val statisticViewModel = - ViewModelProvider(this).get(StatisticViewModel::class.java) - - _binding = FragmentStatisticBinding.inflate(inflater, container, false) - val root: View = binding.root - - val textView: TextView = binding.textStatistic - statisticViewModel.text.observe(viewLifecycleOwner) { - textView.text = it - } - return root + binding = FragmentStatisticBinding.inflate(inflater, container, false) + return binding.root } - override fun onDestroyView() { - super.onDestroyView() - _binding = null + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + } } \ No newline at end of file diff --git a/app/src/main/java/itb/bos/bondoman/fragment/ui/transaction/TransactionFragment.kt b/app/src/main/java/itb/bos/bondoman/fragment/ui/transaction/TransactionFragment.kt index 8a214b97d6953574d61c0d15507d8cbb17ead5cc..f79a7015c7b40d6ab56a92b9ca2d5a312817ba75 100644 --- a/app/src/main/java/itb/bos/bondoman/fragment/ui/transaction/TransactionFragment.kt +++ b/app/src/main/java/itb/bos/bondoman/fragment/ui/transaction/TransactionFragment.kt @@ -1,42 +1,85 @@ package itb.bos.bondoman.fragment.ui.transaction import android.os.Bundle +import android.text.Editable +import android.text.TextWatcher import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.fragment.app.Fragment -import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import itb.bos.bondoman.TransactionAdapter import itb.bos.bondoman.databinding.FragmentTransactionBinding +import itb.bos.bondoman.retrofit.data.Transaction class TransactionFragment : Fragment() { - private var _binding: FragmentTransactionBinding? = null - - // This property is only valid between onCreateView and - // onDestroyView. - private val binding get() = _binding!! - + private lateinit var binding : FragmentTransactionBinding + private lateinit var transactionData : RecyclerView + private val listTransaction= ArrayList<Transaction>() + private lateinit var searchBar: TextView override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { - val transactionViewModel = - ViewModelProvider(this).get(TransactionViewModel::class.java) + binding = FragmentTransactionBinding.inflate(inflater, container, false) + return binding.root + } - _binding = FragmentTransactionBinding.inflate(inflater, container, false) - val root: View = binding.root + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + transactionData = binding.itemTransaction + transactionData.setHasFixedSize(true) + transactionData.layoutManager = LinearLayoutManager(requireContext()) + + 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 + } + }) - val textView: TextView = binding.textTransaction - transactionViewModel.text.observe(viewLifecycleOwner) { - textView.text = it - } - return root - } - override fun onDestroyView() { - super.onDestroyView() - _binding = null } + } \ No newline at end of file diff --git a/app/src/main/java/itb/bos/bondoman/helper/SpreadsheetHelper.kt b/app/src/main/java/itb/bos/bondoman/helper/SpreadsheetHelper.kt index 40a8b182e1d4fb770fe208ea9084b76f73f78b1d..6728a479a27b2392824975e2c4c5914c3aec2cdf 100644 --- a/app/src/main/java/itb/bos/bondoman/helper/SpreadsheetHelper.kt +++ b/app/src/main/java/itb/bos/bondoman/helper/SpreadsheetHelper.kt @@ -27,17 +27,17 @@ class SpreadsheetHelper { } // Populate data rows - for ((index, transaction) in transactionList.withIndex()) { - val row = sheet.createRow(index + 1) - row.createCell(0).setCellValue(transaction.id) - row.createCell(1).setCellValue(transaction.name) - row.createCell(2).setCellValue(transaction.amount) - // Set values for additional fields (Tanggal, Kategori Transaksi, Lokasi) - // Example: - row.createCell(3).setCellValue(transaction.date) - row.createCell(4).setCellValue(transaction.category) - row.createCell(5).setCellValue(transaction.location) - } +// for ((index, transaction) in transactionList.withIndex()) { +// val row = sheet.createRow(index + 1) +// row.createCell(0).setCellValue(transaction.id) +// row.createCell(1).setCellValue(transaction.name) +// row.createCell(2).setCellValue(transaction.amount) +// // Set values for additional fields (Tanggal, Kategori Transaksi, Lokasi) +// // Example: +// row.createCell(3).setCellValue(transaction.date) +// row.createCell(4).setCellValue(transaction.category) +// row.createCell(5).setCellValue(transaction.location) +// } // Write the workbook to a file val fileName = "transaction_list.$fileFormat" diff --git a/app/src/main/java/itb/bos/bondoman/retrofit/data/TransactionData.kt b/app/src/main/java/itb/bos/bondoman/retrofit/data/TransactionData.kt index ac40e0b720b0c425621b18721f887f131acb4902..8a3108a20a4e7b18d4165c0b4cd833f7d234a22a 100644 --- a/app/src/main/java/itb/bos/bondoman/retrofit/data/TransactionData.kt +++ b/app/src/main/java/itb/bos/bondoman/retrofit/data/TransactionData.kt @@ -3,11 +3,47 @@ package itb.bos.bondoman.retrofit.data import java.util.Date // Dummy Transaction -data class Transaction( - val id: String, - val name: String, - val amount: Double, - val date: Date, - val category: String, - val location: String -) \ No newline at end of file +//data class Transaction( +// val id: String, +// val name: String, +// val amount: Double, +// val date: Date, +// val category: String, +// val location: String +//) + +import android.os.Parcel +import android.os.Parcelable + +data class Transaction(val name: String?, val date: String?, val category: String?, val price: Int?, val location: String?) : Parcelable { + constructor(parcel: Parcel) : this( + parcel.readString(), + parcel.readString(), + parcel.readString(), + parcel.readValue(Int::class.java.classLoader) as? Int, + parcel.readString() + ) + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeString(name) + parcel.writeString(date) + parcel.writeString(category) + parcel.writeValue(price) + parcel.writeString(location) + } + + override fun describeContents(): Int { + return 0 + } + + companion object CREATOR : Parcelable.Creator<Transaction> { + override fun createFromParcel(parcel: Parcel): Transaction { + return Transaction(parcel) + } + + override fun newArray(size: Int): Array<Transaction?> { + return arrayOfNulls(size) + } + } +} + diff --git a/app/src/main/res/drawable/bg_transaction.xml b/app/src/main/res/drawable/bg_transaction.xml new file mode 100644 index 0000000000000000000000000000000000000000..fa6bbc9a306ee9d6b6c509dd99403538124f02f8 --- /dev/null +++ b/app/src/main/res/drawable/bg_transaction.xml @@ -0,0 +1,12 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="430dp" + android:height="859dp" + android:viewportWidth="430" + android:viewportHeight="859"> + <path + android:pathData="M212.29,966.03C175.41,957.71 148.96,924.19 125.64,894.61C113.14,878.78 101.33,863.82 88.71,853.08C60.18,828.83 34.74,819.61 10.14,810.71C-29.64,796.33 -70.77,781.44 -115.03,706.23C-159.59,630.49 -176.3,558.4 -166.11,485.81C-156.12,414.63 -120.55,353.09 -90.69,307.46C-71.2,277.65 -57.58,240.78 -43.19,201.74C-30.66,167.79 -17.71,132.69 -0.15,100.85C44.9,19.24 88.76,-10.06 146.51,2.97C168.78,7.99 191.68,18.8 215.9,30.26C237.33,40.36 259.47,50.82 284.28,59.04C286.67,59.83 289.22,60.54 291.82,61.13C304.44,63.98 317.74,64.05 331.8,64.16C346.82,64.26 362.32,64.36 378.1,67.92C396.97,72.17 413.21,80.85 427.7,94.42C472.51,136.33 476.62,184.2 480.59,230.47C482.21,249.33 483.89,268.8 488.36,289.03C494.07,314.84 504.35,338.63 515.24,363.86C531.9,402.39 549.12,442.24 550.84,492.35C554.13,588.81 507.25,642.38 471.72,674.29C460.32,684.55 449.09,692.62 438.24,700.43C415.67,716.67 493.39,757.72 480.59,786C476.77,794.45 377.53,781.9 375.57,795.89C373.21,812.69 370.77,830.07 364.76,845.7C343.01,902.3 295.45,961.93 238.23,967.63C229.41,968.45 220.69,967.91 212.29,966.03Z" + android:fillColor="#1C4A5A"/> + <path + android:pathData="M-43.51,777.98C23.28,891.48 77.28,852.57 155.51,919.1C200.09,956.99 239.64,980.71 302.35,974.5C349.51,969.82 392.39,921.26 413.53,866.24C423.4,840.53 426.73,801.77 437.49,777.98C459.7,728.88 491.68,716.9 526.79,685.39C567.24,649.05 600.12,602.4 597.5,525.82C594.96,451.12 551.15,398.19 535.78,328.61C519.68,255.77 536.98,198.66 482.45,147.6C439.08,107.01 390.35,130.99 345.27,116.05C230.01,77.9 167.04,-8.58 80.43,148.37C44.19,214.03 27.82,297.12 -11.11,356.6C-80.29,462.4 -132.12,627.39 -43.51,777.98Z" + android:fillColor="#1C4A5A"/> +</vector> diff --git a/app/src/main/res/drawable/cornered_box.xml b/app/src/main/res/drawable/cornered_box.xml new file mode 100644 index 0000000000000000000000000000000000000000..2ba77577b8df9a0880b81f8af3b5464bc24985c9 --- /dev/null +++ b/app/src/main/res/drawable/cornered_box.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android"> + <solid android:color="@color/cardview_dark_background" /> + <corners android:radius="20dp" /> +</shape> diff --git a/app/src/main/res/drawable/icon_edit.xml b/app/src/main/res/drawable/icon_edit.xml new file mode 100644 index 0000000000000000000000000000000000000000..e72b0abfb5475f15e63bc99161ce60f96f247497 --- /dev/null +++ b/app/src/main/res/drawable/icon_edit.xml @@ -0,0 +1,19 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="30dp" + android:height="30dp" + android:viewportWidth="30" + android:viewportHeight="30"> + <path + android:pathData="M24.991,23.692H17.873C17.179,23.692 16.614,24.265 16.614,24.971C16.614,25.678 17.179,26.25 17.873,26.25H24.991C25.685,26.25 26.25,25.678 26.25,24.971C26.25,24.265 25.685,23.692 24.991,23.692Z" + android:strokeAlpha="0.4" + android:fillColor="#1C4A5A" + android:fillAlpha="0.4"/> + <path + android:pathData="M12.886,8.63L19.631,14.08C19.794,14.21 19.822,14.45 19.695,14.616L11.698,25.035C11.196,25.679 10.455,26.043 9.661,26.056L5.296,26.11C5.063,26.113 4.86,25.952 4.807,25.721L3.815,21.407C3.643,20.615 3.815,19.795 4.317,19.163L12.353,8.694C12.483,8.526 12.722,8.497 12.886,8.63Z" + android:fillColor="#1C4A5A"/> + <path + android:pathData="M22.651,10.832L21.35,12.455C21.219,12.62 20.984,12.647 20.821,12.516C19.24,11.236 15.193,7.954 14.07,7.044C13.906,6.909 13.883,6.67 14.016,6.504L15.269,4.946C16.407,3.482 18.391,3.347 19.992,4.624L21.83,6.088C22.584,6.68 23.087,7.459 23.259,8.279C23.458,9.18 23.246,10.066 22.651,10.832Z" + android:strokeAlpha="0.4" + android:fillColor="#1C4A5A" + android:fillAlpha="0.4"/> +</vector> diff --git a/app/src/main/res/drawable/icon_filter.xml b/app/src/main/res/drawable/icon_filter.xml new file mode 100644 index 0000000000000000000000000000000000000000..37aa56eec8f16a9c49faf3a78d119fe9b0d437aa --- /dev/null +++ b/app/src/main/res/drawable/icon_filter.xml @@ -0,0 +1,25 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="50dp" + android:height="50dp" + android:viewportWidth="50" + android:viewportHeight="50"> + <path + android:pathData="M15,0L35,0A15,15 0,0 1,50 15L50,35A15,15 0,0 1,35 50L15,50A15,15 0,0 1,0 35L0,15A15,15 0,0 1,15 0z" + android:fillColor="#1C4A5A"/> + <path + android:pathData="M22.604,29.947H14.385C13.344,29.947 12.5,30.777 12.5,31.799C12.5,32.82 13.344,33.651 14.385,33.651H22.604C23.644,33.651 24.489,32.82 24.489,31.799C24.489,30.777 23.644,29.947 22.604,29.947Z" + android:strokeAlpha="0.4" + android:fillColor="#FAFAFA" + android:fillAlpha="0.4"/> + <path + android:pathData="M37.5,17.973C37.5,16.952 36.655,16.123 35.617,16.123H27.397C26.357,16.123 25.513,16.952 25.513,17.973C25.513,18.995 26.357,19.825 27.397,19.825H35.617C36.655,19.825 37.5,18.995 37.5,17.973Z" + android:strokeAlpha="0.4" + android:fillColor="#FAFAFA" + android:fillAlpha="0.4"/> + <path + android:pathData="M21.097,17.973C21.097,20.306 19.174,22.198 16.799,22.198C14.425,22.198 12.5,20.306 12.5,17.973C12.5,15.641 14.425,13.75 16.799,13.75C19.174,13.75 21.097,15.641 21.097,17.973Z" + android:fillColor="#FAFAFA"/> + <path + android:pathData="M37.5,31.749C37.5,34.081 35.576,35.972 33.201,35.972C30.828,35.972 28.903,34.081 28.903,31.749C28.903,29.416 30.828,27.524 33.201,27.524C35.576,27.524 37.5,29.416 37.5,31.749Z" + android:fillColor="#FAFAFA"/> +</vector> diff --git a/app/src/main/res/drawable/icon_search.xml b/app/src/main/res/drawable/icon_search.xml new file mode 100644 index 0000000000000000000000000000000000000000..c1b963a69450d246b59fe14c5145a23992486d66 --- /dev/null +++ b/app/src/main/res/drawable/icon_search.xml @@ -0,0 +1,14 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="30dp" + android:height="30dp" + android:viewportWidth="30" + android:viewportHeight="30"> + <path + android:pathData="M2.5,13.317a10.749,10.817 0,1 0,21.498 0a10.749,10.817 0,1 0,-21.498 0z" + android:fillColor="#9DB2CE"/> + <path + android:pathData="M25.843,27.444C25.426,27.431 25.029,27.259 24.732,26.963L22.186,23.988C21.64,23.489 21.596,22.64 22.086,22.086C22.316,21.854 22.628,21.723 22.953,21.723C23.279,21.723 23.591,21.854 23.82,22.086L27.022,24.648C27.483,25.12 27.625,25.82 27.385,26.437C27.145,27.053 26.567,27.469 25.91,27.5L25.843,27.444Z" + android:strokeAlpha="0.4" + android:fillColor="#9DB2CE" + android:fillAlpha="0.4"/> +</vector> diff --git a/app/src/main/res/drawable/searcbar_rec.xml b/app/src/main/res/drawable/searcbar_rec.xml new file mode 100644 index 0000000000000000000000000000000000000000..cb4ac54f975e81d5656c37ebc341a1e35b227359 --- /dev/null +++ b/app/src/main/res/drawable/searcbar_rec.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="318dp" + android:height="58dp" + android:viewportWidth="318" + android:viewportHeight="58"> + <path + android:pathData="M24,0L294,0A20,20 0,0 1,314 20L314,30A20,20 0,0 1,294 50L24,50A20,20 0,0 1,4 30L4,20A20,20 0,0 1,24 0z" + android:fillColor="#ffffff"/> +</vector> diff --git a/app/src/main/res/drawable/transaction_detail_box.xml b/app/src/main/res/drawable/transaction_detail_box.xml new file mode 100644 index 0000000000000000000000000000000000000000..b2be28c978d512396ef29a2e04df52fa23e57249 --- /dev/null +++ b/app/src/main/res/drawable/transaction_detail_box.xml @@ -0,0 +1,10 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="390dp" + android:height="666dp" + android:viewportWidth="390" + android:viewportHeight="666"> + <path + android:pathData="M40,6L350,6A30,30 0,0 1,380 36L380,622A30,30 0,0 1,350 652L40,652A30,30 0,0 1,10 622L10,36A30,30 0,0 1,40 6z" + android:fillColor="#ffffff"/> +</vector> + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index bc80cdc7995b4c712604ab4e389a1c8b40e72c1f..0e13c19ae82d2bf7cccf3b2d70ad79af49de7457 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -8,12 +8,6 @@ android:layout_height="match_parent" tools:context=".MainActivity" > - <fragment - android:id="@+id/header" - android:layout_width="match_parent" - android:layout_height="wrap_content" - app:layout_constraintTop_toTopOf="parent"/> - <fragment android:id="@+id/fragments" diff --git a/app/src/main/res/layout/activity_transaction_detail.xml b/app/src/main/res/layout/activity_transaction_detail.xml new file mode 100644 index 0000000000000000000000000000000000000000..bbeb850f3169355255c138cfad209e8848abc4d9 --- /dev/null +++ b/app/src/main/res/layout/activity_transaction_detail.xml @@ -0,0 +1,306 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/container" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:paddingTop="?attr/actionBarSize"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@drawable/bg_transaction" + android:orientation="vertical" + android:gravity="top"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:gravity="top"> + <ImageView + android:id="@+id/btn_back" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="32dp" + android:layout_marginStart="40dp" + android:src="@drawable/btn_back" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <ImageView + android:id="@+id/editButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="" + android:layout_marginStart="280dp" + android:layout_marginTop="25dp" + android:src="@drawable/icon_edit" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + </LinearLayout> + + <LinearLayout + android:layout_width="340dp" + android:layout_height="500dp" + android:layout_gravity="center" + android:layout_marginTop="10dp" + android:paddingTop="10dp" + android:orientation="vertical" + android:background="@drawable/transaction_detail_box"> + + <TextView + android:layout_marginTop="10dp" + android:id="@+id/itemName" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center|top" + android:text="Semen Tiga Roda" + android:textSize="20sp"> + + </TextView> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:paddingTop="10dp" + android:paddingStart="20dp" + android:paddingEnd="20dp" + android:orientation="horizontal"> + + <TextView + android:layout_marginTop="10dp" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center|top" + android:text="Kategori" + android:textSize="15sp"> + + </TextView> + + <TextView + android:id="@+id/category" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginTop="10dp" + android:gravity="end" + android:layout_weight="1" + android:text="Pemasukan" + android:textSize="15sp" + android:textStyle="bold"> + + </TextView> + + + </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:paddingTop="10dp" + android:paddingStart="20dp" + android:paddingEnd="20dp" + android:orientation="horizontal"> + + <TextView + android:layout_marginTop="10dp" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center|top" + android:text="Kode Transaksi" + android:textSize="15sp"> + + </TextView> + + <TextView + android:id="@+id/transactioncode" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginTop="10dp" + android:gravity="end" + android:layout_weight="1" + android:text="ID-01" + android:textSize="15sp" + android:textStyle="bold"> + + </TextView> + + + </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:paddingTop="10dp" + android:paddingStart="20dp" + android:paddingEnd="20dp" + android:orientation="horizontal"> + + <TextView + android:layout_marginTop="10dp" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center|top" + android:text="Time" + android:textSize="15sp"> + + </TextView> + + <TextView + android:id="@+id/time" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginTop="10dp" + android:gravity="end" + android:layout_weight="1" + android:text="2:00 PM, Jul 21, 2021" + android:textSize="15sp" + android:textStyle="bold"> + + </TextView> + + + </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:paddingTop="10dp" + android:paddingStart="20dp" + android:paddingEnd="20dp" + android:orientation="horizontal"> + + <TextView + android:layout_marginTop="10dp" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center|top" + android:text="Jumlah" + android:textSize="15sp"> + + </TextView> + + <TextView + android:id="@+id/amount" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginTop="10dp" + android:gravity="end" + android:layout_weight="1" + android:text="4" + android:textSize="15sp" + android:textStyle="bold"> + + </TextView> + + + </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:paddingTop="10dp" + android:paddingStart="20dp" + android:paddingEnd="20dp" + android:orientation="horizontal"> + + <TextView + android:layout_marginTop="10dp" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center|top" + android:text="Tipe" + android:textSize="15sp"> + + </TextView> + + <TextView + android:id="@+id/type" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginTop="10dp" + android:gravity="end" + android:layout_weight="1" + android:text="Bahan" + android:textSize="15sp" + android:textStyle="bold"> + + </TextView> + + + </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:paddingTop="10dp" + android:paddingStart="20dp" + android:paddingEnd="20dp" + android:orientation="horizontal"> + + <TextView + android:layout_marginTop="10dp" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center|top" + android:text="Harga" + android:textSize="15sp"> + + </TextView> + + <TextView + android:id="@+id/price" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginTop="10dp" + android:gravity="end" + android:layout_weight="1" + android:text="IDR 200.000" + android:textSize="15sp" + android:textStyle="bold"> + + </TextView> + + + </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:paddingTop="10dp" + android:paddingStart="20dp" + android:paddingEnd="20dp" + android:orientation="horizontal"> + + <TextView + android:layout_marginTop="10dp" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center|top" + android:text="Lokasi" + android:textSize="15sp"> + + </TextView> + + <TextView + android:id="@+id/location" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginTop="10dp" + android:gravity="end" + android:layout_weight="1" + android:text="Jakarta" + android:textSize="15sp" + android:textStyle="bold"> + + </TextView> + + + </LinearLayout> + + + </LinearLayout> + </LinearLayout> + +</androidx.constraintlayout.widget.ConstraintLayout> diff --git a/app/src/main/res/layout/fragment_statistic.xml b/app/src/main/res/layout/fragment_statistic.xml index 5cab5663afbc0e8e7d366da1dc5f5a22965ae149..43bb16d8e145ccfbaba20768e2d1b35b43b28c0d 100644 --- a/app/src/main/res/layout/fragment_statistic.xml +++ b/app/src/main/res/layout/fragment_statistic.xml @@ -21,4 +21,5 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_transaction.xml b/app/src/main/res/layout/fragment_transaction.xml index 24bc63da79b2a1e81fe5e4788a88ddd4960473a7..3e98237387e001f3c3012a7f71c8101cf3f0ad7b 100644 --- a/app/src/main/res/layout/fragment_transaction.xml +++ b/app/src/main/res/layout/fragment_transaction.xml @@ -4,22 +4,67 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/base" android:id="@+id/transaction_fragment" - tools:context=".fragment.ui.transaction.TransactionFragment"> + tools:context=".fragment.ui.transaction.TransactionFragment" + android:paddingTop="?attr/actionBarSize"> - <TextView - android:id="@+id/text_transaction" + <LinearLayout android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginStart="8dp" - android:layout_marginTop="8dp" - android:layout_marginEnd="8dp" - android:textAlignment="center" - android:textSize="20sp" - android:background="@color/orange" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + android:layout_height="587dp" + android:layout_gravity="top" + android:orientation="vertical" + app:layout_constraintTop_toTopOf="parent"> + + + <LinearLayout + android:layout_width="360dp" + android:layout_height="50dp" + android:layout_gravity="center" + android:orientation="horizontal" + android:paddingHorizontal="20dp"> + + <LinearLayout + android:layout_width="250dp" + android:layout_height="50dp" + android:layout_gravity="center" + android:layout_marginEnd="10dp" + android:background="@drawable/bg_input_text" + android:orientation="horizontal" + android:paddingHorizontal="20dp"> + + <ImageView + android:layout_width="24dp" + android:layout_height="24dp" + android:layout_gravity="center" + android:src="@drawable/icon_search" /> + + <EditText + android:id="@+id/searchBar" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@android:color/transparent" + android:hint="Search" + android:inputType="textEmailAddress" + android:paddingHorizontal="20dp" /> + + </LinearLayout> + + <ImageView + android:layout_width="50dp" + android:layout_height="50dp" + android:layout_gravity="center" + android:layout_marginStart="0dp" + android:src="@drawable/icon_filter" /> + + </LinearLayout> + + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/itemTransaction" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_margin="8dp" + tools:listitem="@layout/row_transaction" /> + + </LinearLayout> + </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/row_transaction.xml b/app/src/main/res/layout/row_transaction.xml new file mode 100644 index 0000000000000000000000000000000000000000..97cf8e847c2a270899fe038aa04f93b3ce09395a --- /dev/null +++ b/app/src/main/res/layout/row_transaction.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_margin="8dp" + android:orientation="horizontal"> + <LinearLayout + android:layout_width="230dp" + android:layout_height="wrap_content" + android:orientation="vertical" + android:layout_margin="8dp"> + <TextView + android:id="@+id/category" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:background="@drawable/cornered_box" + android:textColor="@color/light_grey" + android:padding="4dp" + android:textSize="12sp" + /> + <TextView + android:id="@+id/itemName" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="2dp" + android:textSize="16sp" + /> + <TextView + android:id="@+id/itemDate" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="2dp" + android:textSize="12sp" + /> + </LinearLayout> + <LinearLayout + android:layout_width="90dp" + android:layout_height="match_parent" + android:layout_marginEnd="5dp" + android:orientation="vertical" + android:gravity="end"> + <TextView + android:id="@+id/itemPrice" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="2dp" + android:textSize="16sp" + android:layout_weight="1"/> + <TextView + android:id="@+id/itemLocation" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="2dp" + android:textSize="12sp" + android:layout_weight="2"/> + </LinearLayout> +</LinearLayout> diff --git a/build.gradle.kts b/build.gradle.kts index a0985efc88dec705956b74f5d6e9ac23c8daebb8..ea5fa98f18bd9ed171cc2d6991539d10f372a5e3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,20 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + repositories { + google() + maven{ + url = uri("https://jitpack.io") + + } + } + dependencies { + classpath("androidx.navigation:navigation-safe-args-gradle-plugin:2.7.7") + classpath("com.github.dcendents:android-maven-gradle-plugin:2.0") + } +} + plugins { alias(libs.plugins.androidApplication) apply false alias(libs.plugins.jetbrainsKotlinAndroid) apply false -} \ No newline at end of file +} + diff --git a/settings.gradle.kts b/settings.gradle.kts index 9878f4d663b51ce40d632a938df8b233ff84cd5c..fd69e79ed7e300dc4c8c6e81d2d51ffd02cbe03c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,3 +1,4 @@ + pluginManagement { repositories { google { @@ -8,6 +9,9 @@ pluginManagement { } } mavenCentral() + maven { + url = uri("https://jitpack.io") + } gradlePluginPortal() } } @@ -16,6 +20,9 @@ dependencyResolutionManagement { repositories { google() mavenCentral() + maven { + url = uri("https://jitpack.io") + } } }