diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 1c1e3726accbfd644fb93cc96b67bd8154e8063c..3f71f6b5fd700b4a0e0c9adeb5bb41925dad3374 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -53,4 +53,43 @@ dependencies { testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") + + implementation("androidx.room:room-runtime:2.6.1") + annotationProcessor("androidx.room:room-compiler:2.6.1") + + kapt("androidx.room:room-compiler:2.6.1") + + implementation("androidx.lifecycle:lifecycle-extensions:2.2.0") + implementation("com.google.android.material:material:1.11.0") + implementation("com.google.code.gson:gson:2.10") + implementation("androidx.constraintlayout:constraintlayout:2.1.4") + testImplementation("junit:junit:4.13.2") + androidTestImplementation("androidx.test.ext:junit:1.1.5") + androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") + implementation("com.squareup.retrofit2:converter-gson:2.9.0") + implementation("com.squareup.retrofit2:retrofit:2.9.0") + implementation("com.squareup.retrofit2:converter-gson:2.9.0") + implementation("com.squareup.retrofit2:converter-scalars:2.1.0") + implementation("com.squareup.okhttp3:logging-interceptor:4.4.0") + implementation("org.apache.poi:poi:3.17") + implementation("org.apache.poi:poi-ooxml:3.17") + implementation("javax.xml.stream:stax-api:1.0") + implementation("org.apache.xmlbeans:xmlbeans:3.1.0") + implementation("com.fasterxml:aalto-xml:1.2.2") + implementation("com.github.bumptech.glide:glide:4.12.0") + implementation("com.github.bumptech.glide:complier:4.12.0") + + + + + + + + + + + + + + } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8beb467f97e42f1076585f61954e3ac9ff8c3419..134140e48207243b53b1849046752bd230022e5b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,7 +2,11 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> - <uses-permission android:name="android.permission.INTERNET" /> + <uses-permission android:name="android.permission.INTERNET"/> + <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> + <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> + <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application android:name=".BondowowoApp" diff --git a/app/src/main/java/com/atm/bondowowo/adapter/TransactionAdapter.kt b/app/src/main/java/com/atm/bondowowo/adapter/TransactionAdapter.kt new file mode 100644 index 0000000000000000000000000000000000000000..d1c5c5ca5b066e8631b919b59ef2a57e05753258 --- /dev/null +++ b/app/src/main/java/com/atm/bondowowo/adapter/TransactionAdapter.kt @@ -0,0 +1,59 @@ +package com.atm.bondowowo.adapter + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.atm.bondowowo.R +import com.atm.bondowowo.data.entity.Transaction +class TransactionAdapter(var list: List<Transaction>) : RecyclerView.Adapter<TransactionAdapter.ViewHolder>() { + + private lateinit var dialog: Dialog + + fun setDialog(dialog: Dialog){ + this.dialog = dialog + } + interface Dialog{ + fun onClick(position: Int) + } + + inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view){ + var nama_transaksi: TextView + var nominal_transaksi: TextView + var kategori_transaksi: TextView + var tgl_transaksi: TextView + var lokasi_transaksi: TextView + init{ + nama_transaksi = view.findViewById(R.id.transaction_name) + nominal_transaksi = view.findViewById(R.id.transaction_nominal) + kategori_transaksi = view.findViewById(R.id.transaction_cat) + tgl_transaksi = view.findViewById(R.id.transaction_date) + lokasi_transaksi = view.findViewById(R.id.transaction_loc) + + view.setOnClickListener{ + dialog.onClick(layoutPosition) + } + + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val view = LayoutInflater.from(parent.context).inflate(R.layout.row_transaction, parent, false) + return ViewHolder(view) + } + + override fun getItemCount(): Int { + return list.size + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.nama_transaksi.text = list[position].nama + holder.nominal_transaksi.text = list[position].nominal.toString() + holder.kategori_transaksi.text = list[position].kategori + holder.lokasi_transaksi.text = list[position].lokasi + holder.tgl_transaksi.text = list[position].date.toString() + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/atm/bondowowo/data/AppDatabase.kt b/app/src/main/java/com/atm/bondowowo/data/AppDatabase.kt new file mode 100644 index 0000000000000000000000000000000000000000..37884407c02db6d46dc72c9fd1754f0a9a9cdc1a --- /dev/null +++ b/app/src/main/java/com/atm/bondowowo/data/AppDatabase.kt @@ -0,0 +1,31 @@ +package com.atm.bondowowo.data + +import android.content.Context +import androidx.room.Database +import androidx.room.Room +import androidx.room.RoomDatabase +import androidx.room.TypeConverters +import com.atm.bondowowo.data.dao.TransactionDao +import com.atm.bondowowo.data.entity.Transaction + +@Database(entities = [Transaction::class], version = 1) +@TypeConverters(Converters::class) +abstract class AppDatabase: RoomDatabase() { + abstract fun transactionDao(): TransactionDao + + companion object{ + private var instance: AppDatabase? = null + + fun getInstance(context: Context): AppDatabase{ + if(instance == null){ + instance = Room.databaseBuilder(context, AppDatabase::class.java, name = "app-database") + .fallbackToDestructiveMigration() + .allowMainThreadQueries() + .build() + } + return instance!! + } + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/atm/bondowowo/data/Converters.kt b/app/src/main/java/com/atm/bondowowo/data/Converters.kt new file mode 100644 index 0000000000000000000000000000000000000000..49e875102c36ae663a8da798dbf3049319c6bda4 --- /dev/null +++ b/app/src/main/java/com/atm/bondowowo/data/Converters.kt @@ -0,0 +1,16 @@ +package com.atm.bondowowo.data + +import androidx.room.TypeConverter +import java.time.LocalDateTime + +class Converters { + @TypeConverter + fun fromTimestamp(value: String?): LocalDateTime? { + return value?.let { LocalDateTime.parse(it) } + } + + @TypeConverter + fun dateToTimestamp(date: LocalDateTime?): String? { + return date?.toString() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/atm/bondowowo/data/dao/TransactionDao.kt b/app/src/main/java/com/atm/bondowowo/data/dao/TransactionDao.kt new file mode 100644 index 0000000000000000000000000000000000000000..bc0dd890c52b99ea23a13a83507a3c90d58b22ab --- /dev/null +++ b/app/src/main/java/com/atm/bondowowo/data/dao/TransactionDao.kt @@ -0,0 +1,26 @@ +package com.atm.bondowowo.data.dao + +import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.Query +import androidx.room.Update +import com.atm.bondowowo.data.entity.Transaction + +@Dao +interface TransactionDao { + @Query("SELECT * FROM `Transaction`") + fun getAll(): List<Transaction> + + @Insert + fun insertAll(vararg transactions: Transaction) + + @Delete + fun delete(transaction: Transaction) + + @Query("SELECT * FROM `Transaction` WHERE id = :id") + fun get(id: Int): Transaction + + @Update + fun update(transaction: Transaction) +} \ No newline at end of file diff --git a/app/src/main/java/com/atm/bondowowo/data/entity/Transaction.kt b/app/src/main/java/com/atm/bondowowo/data/entity/Transaction.kt new file mode 100644 index 0000000000000000000000000000000000000000..2f35c3300fb03ebcb8bb7a99d0dd3a01a4b9e246 --- /dev/null +++ b/app/src/main/java/com/atm/bondowowo/data/entity/Transaction.kt @@ -0,0 +1,18 @@ +package com.atm.bondowowo.data.entity + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey +import java.sql.Date +import java.time.LocalDateTime + +@Entity +data class Transaction( + @PrimaryKey(autoGenerate = true) var id: Int? = null, + @ColumnInfo(name = "date") var date: LocalDateTime?, + @ColumnInfo(name = "nama") var nama: String?, + @ColumnInfo(name = "kategori") var kategori: String?, + @ColumnInfo(name = "nominal") var nominal: Double?, + @ColumnInfo(name = "lokasi") var lokasi: String? + +) \ No newline at end of file diff --git a/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionActivity.kt b/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionActivity.kt new file mode 100644 index 0000000000000000000000000000000000000000..1249c07397ce1cc4ac6003679346cc8e22040369 --- /dev/null +++ b/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionActivity.kt @@ -0,0 +1,34 @@ +package com.atm.bondowowo.ui.transaction + +import android.content.Intent +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import com.atm.bondowowo.R +import com.atm.bondowowo.ui.transaction.TransactionFragment.TransactionInteractionListener + +class TransactionActivity : AppCompatActivity(), TransactionInteractionListener { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.fragment_transaction) + + val fragment = TransactionFragment() + fragment.setListener(this) + + supportFragmentManager.beginTransaction() + .replace(R.id.transactionFragment, fragment) + .commit() + } + + override fun onTransactionItemClick(transactionId: Int?) { + val intent = Intent(this, TransactionInputFragment::class.java) + intent.putExtra("id", transactionId) + startActivity(intent) + } + + override fun onAddTransactionButtonClick() { + // Navigasi ke TransactionInputFragment + val intent = Intent(this, TransactionInputFragment::class.java) + startActivity(intent) + } +} diff --git a/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionFragment.kt b/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionFragment.kt index d41b87ec9e1536f93b12882f02f7f9587e5c9148..1ee53cf7439f25a7677b3bd322885acc94f0f52a 100644 --- a/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionFragment.kt +++ b/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionFragment.kt @@ -1,11 +1,22 @@ package com.atm.bondowowo.ui.transaction +import android.app.AlertDialog +import android.content.DialogInterface import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import com.atm.bondowowo.R +import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.atm.bondowowo.R +import com.atm.bondowowo.adapter.TransactionAdapter +import com.atm.bondowowo.data.AppDatabase +import com.atm.bondowowo.data.entity.Transaction +import com.google.android.material.floatingactionbutton.FloatingActionButton + class TransactionFragment : Fragment() { @@ -15,4 +26,76 @@ class TransactionFragment : Fragment() { return inflater.inflate(R.layout.fragment_transaction, container, false) } + private lateinit var recyclerView: RecyclerView + private lateinit var fab: FloatingActionButton + private var list = mutableListOf<Transaction>() + private lateinit var adapter: TransactionAdapter + private lateinit var database: AppDatabase + private lateinit var listener: TransactionInteractionListener + + interface TransactionInteractionListener { + fun onTransactionItemClick(transactionId: Int?) + fun onAddTransactionButtonClick() + } + + fun setListener(listener: TransactionInteractionListener) { + this.listener = listener + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val view = inflater.inflate(R.layout.fragment_transaction, container, false) + recyclerView = view.findViewById(R.id.cart_list) + fab = view.findViewById(R.id.fab) + + val context = requireActivity().applicationContext + database = AppDatabase.getInstance(context) + adapter = TransactionAdapter(list) + + adapter.setDialog(object : TransactionAdapter.Dialog { + override fun onClick(position: Int) { + val dialog = AlertDialog.Builder(requireContext()) + dialog.setTitle(list[position].nama) + dialog.setItems(R.array.transaction_option, + DialogInterface.OnClickListener { dialog, which -> + if (which == 0) { + listener.onTransactionItemClick(list[position].id) + } else if (which == 1) { + database.transactionDao().delete(list[position]) + getData() + } else { + dialog.dismiss() + } + }) + val dialogView = dialog.create() + dialogView.show() + } + }) + + recyclerView.adapter = adapter + recyclerView.layoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, false) + recyclerView.addItemDecoration( + DividerItemDecoration(context, RecyclerView.VERTICAL) + ) + + fab.setOnClickListener { + listener.onAddTransactionButtonClick() + } + + return view + } + + override fun onResume() { + super.onResume() + getData() + } + + private fun getData() { + list.clear() + list.addAll(database.transactionDao().getAll()) + adapter.notifyDataSetChanged() + } } diff --git a/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionInputFragment.kt b/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionInputFragment.kt new file mode 100644 index 0000000000000000000000000000000000000000..92f03587636e2c9b1d8a0d16bf3c2b8572b6ad18 --- /dev/null +++ b/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionInputFragment.kt @@ -0,0 +1,80 @@ +package com.atm.bondowowo.ui.transaction + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import android.widget.EditText +import android.widget.Toast +import androidx.fragment.app.Fragment +import androidx.navigation.fragment.findNavController +import com.atm.bondowowo.R +import com.atm.bondowowo.data.AppDatabase +import com.atm.bondowowo.data.entity.Transaction +import java.time.LocalDateTime + +class TransactionInputFragment : Fragment() { + private lateinit var nama_transaksi: EditText + private lateinit var nominal_transaksi: EditText + private lateinit var kategori_transaksi: EditText + private lateinit var lokasi_transaksi: EditText + private lateinit var btnSave: Button + private lateinit var database: AppDatabase + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + val view = inflater.inflate(R.layout.fragment_transaction_input, container, false) + + nama_transaksi = view.findViewById(R.id.nama_transaksi) + nominal_transaksi = view.findViewById(R.id.nomimal_transaksi) + kategori_transaksi = view.findViewById(R.id.kategori_transaksi) + lokasi_transaksi = view.findViewById(R.id.lokasi_transaksi) + btnSave = view.findViewById(R.id.btn_save) + + database = AppDatabase.getInstance(requireContext()) + + val args = arguments + if (args != null) { + val id = args.getInt("id", 0) + val transaction = database.transactionDao().get(id) + + nama_transaksi.setText(transaction.nama) + nominal_transaksi.setText(transaction.nominal.toString()) + kategori_transaksi.setText(transaction.kategori) + lokasi_transaksi.setText(transaction.lokasi) + } + + btnSave.setOnClickListener { + if (nama_transaksi.text.isNotEmpty() && nominal_transaksi.text.isNotEmpty() && kategori_transaksi.text.isNotEmpty() && lokasi_transaksi.text.isNotEmpty()) { + if (args != null) { + database.transactionDao().update( + Transaction( + args.getInt("id", 0), + LocalDateTime.now(), + nama_transaksi.text.toString(), + kategori_transaksi.text.toString(), + nominal_transaksi.text.toString().toDouble(), + lokasi_transaksi.text.toString() + ) + ) + } else { + database.transactionDao().insertAll( + Transaction( + null, + LocalDateTime.now(), + nama_transaksi.text.toString(), + kategori_transaksi.text.toString(), + nominal_transaksi.text.toString().toDouble(), + lokasi_transaksi.text.toString() + ) + ) + findNavController().navigate(R.id.action_transactionInputFragment_to_transactionFragment) + } + } else { + Toast.makeText(requireContext(), "Input invalid", Toast.LENGTH_SHORT).show() + } + } + + return view + } +} diff --git a/app/src/main/res/layout/fragment_transaction_input.xml b/app/src/main/res/layout/fragment_transaction_input.xml new file mode 100644 index 0000000000000000000000000000000000000000..865f4347455d620558a4971929679d507d2a9c5c --- /dev/null +++ b/app/src/main/res/layout/fragment_transaction_input.xml @@ -0,0 +1,98 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout 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:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + tools:context="com.atm.bondowowo.ui.transaction.TransactionInputFragment"> + + <com.google.android.material.appbar.AppBarLayout + android:id="@+id/header" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" + app:layout_constraintTop_toTopOf="parent"> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:layout_marginVertical="8dp" + android:text="@string/transaksi" + android:textColor="@color/black" + android:textSize="20sp" + android:textStyle="bold" /> + </com.google.android.material.appbar.AppBarLayout> + + <com.google.android.material.textfield.TextInputLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="20dp" + android:layout_marginTop="130dp" + android:layout_marginRight="30dp" + android:layout_marginLeft="30dp" + > + <EditText + android:id="@+id/nama_transaksi" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:inputType="text" + android:hint="Nama transaksi"/> + </com.google.android.material.textfield.TextInputLayout> + + <com.google.android.material.textfield.TextInputLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="20dp" + android:layout_marginTop="5dp" + android:layout_marginRight="30dp" + android:layout_marginLeft="30dp"> + <EditText + android:id="@+id/nomimal_transaksi" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:inputType="number" + android:hint="Nominal"/> + </com.google.android.material.textfield.TextInputLayout> + + <com.google.android.material.textfield.TextInputLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="20dp" + android:layout_marginTop="5dp" + android:layout_marginRight="30dp" + android:layout_marginLeft="30dp"> + <EditText + android:id="@+id/kategori_transaksi" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:inputType="text" + android:hint="Kategori (pengeluaran/pemasukan)"/> + </com.google.android.material.textfield.TextInputLayout> + + <com.google.android.material.textfield.TextInputLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="20dp" + android:layout_marginTop="5dp" + android:layout_marginRight="30dp" + android:layout_marginLeft="30dp"> + <EditText + android:id="@+id/lokasi_transaksi" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:inputType="text" + android:hint="Lokasi"/> + </com.google.android.material.textfield.TextInputLayout> + + <Button + android:id="@+id/btn_save" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="Save" + android:layout_marginLeft="70dp" + android:layout_marginRight="70dp" + /> + +</LinearLayout> \ 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..d56ea0a350e5a23196c7619e6ccd5372bf2020d8 --- /dev/null +++ b/app/src/main/res/layout/row_transaction.xml @@ -0,0 +1,34 @@ +<?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:orientation="vertical" + android:padding="13dp" + android:layout_marginTop="20dp"> + <TextView + android:id="@+id/transaction_name" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textStyle="bold"/> + <TextView + android:id="@+id/transaction_date" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + /> + <TextView + android:id="@+id/transaction_cat" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + /> + <TextView + android:id="@+id/transaction_nominal" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + /> + <TextView + android:id="@+id/transaction_loc" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + /> + +</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index c10d9c4870dc825cf47cd290f3657593957828b5..6019c4af464918d581bd04835109170ad7e7aa1a 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -8,8 +8,14 @@ <fragment android:id="@+id/transactionFragment" android:name="com.atm.bondowowo.ui.transaction.TransactionFragment" - android:label="Transaksi" - tools:layout="@layout/fragment_transaction" /> + android:label="TransactionFragment"> + + <action + android:id="@+id/action_transactionFragment_to_transactionInputFragment" + app:destination="@id/transactionInputFragment" /> + + </fragment> + <fragment android:id="@+id/scanFragment" @@ -29,4 +35,14 @@ android:label="Pengaturan" tools:layout="@layout/fragment_settings" /> + <fragment + android:id="@+id/transactionInputFragment" + android:name="com.atm.bondowowo.ui.transaction.TransactionInputFragment" + android:label="fragment_transaction_input" + tools:layout="@layout/fragment_transaction_input" > + <action + android:id="@+id/action_transactionInputFragment_to_transactionFragment" + app:destination="@id/transactionFragment" /> + </fragment> + </navigation> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0756b211cd6bccd1caaa42af429bb02ad7f4c697..5cc739c92f594ecffb54970a2b231c4a7debca03 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,4 +6,9 @@ <string name="pengaturan">Pengaturan</string> <string name="add">+</string> <string name="capture">Capture</string> + <string-array name="transaction_option"> + <item>Edit</item> + <item>Delete</item> + <item>Cancel</item> + </string-array> </resources> \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index a6711ae4bb2aa2ece2ee114e6a81933141669b25..3893b8309e82cda878bd47d6c643304e6c98b23d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,4 +2,5 @@ plugins { id("com.android.application") version "8.2.1" apply false id("org.jetbrains.kotlin.android") version "1.9.22" apply false + } \ No newline at end of file