diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 37c7e49930d44b3c5461da6f86f32ae3a5d2e1b1..8ae03e12297b83b59f3c1bf2ef1e8c2db52d0f86 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,6 +1,7 @@ plugins { id("com.android.application") id("org.jetbrains.kotlin.android") + id("com.google.devtools.ksp") } android { @@ -38,15 +39,38 @@ android { } dependencies { + implementation("com.google.android.gms:play-services-location:21.2.0") + val room_version = "2.6.1" + implementation("androidx.room:room-runtime:$room_version") + ksp("androidx.room:room-compiler:$room_version") + + // optional - RxJava2 support for Room + implementation("androidx.room:room-rxjava2:$room_version") + + // optional - RxJava3 support for Room + implementation ("androidx.room:room-rxjava3:$room_version") + + // optional - Guava support for Room, including Optional and ListenableFuture + implementation ("androidx.room:room-guava:$room_version") + + // optional - Test helpers + testImplementation ("androidx.room:room-testing:$room_version") + + // optional - Paging 3 Integration + implementation ("androidx.room:room-paging:$room_version") + implementation ("androidx.camera:camera-core:1.2.2") implementation ("androidx.camera:camera-camera2:1.2.2") implementation ("androidx.camera:camera-lifecycle:1.2.2") implementation ("androidx.camera:camera-video:1.2.2") - + implementation("androidx.fragment:fragment-ktx:1.6.2") implementation ("androidx.camera:camera-view:1.2.2") implementation ("androidx.camera:camera-extensions:1.2.2") implementation("androidx.core:core-ktx:1.10.1") implementation("androidx.appcompat:appcompat:1.6.1") + implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0") + implementation("androidx.activity:activity-ktx:1.3.3") + implementation ("com.squareup.retrofit2:retrofit:2.9.0") implementation ("com.squareup.retrofit2:converter-gson:2.9.0") @@ -57,4 +81,7 @@ 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("com.github.PhilJay:MPAndroidChart:v3.1.0") + } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 326df95d756d958680c6f6a32c15173983dfc900..bb502cea9ae4a8e885ac732232014cb695d8c227 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,6 +10,14 @@ <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> + <!-- Always include this permission --> + <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> + + <!-- Include only if your app benefits from precise location access. --> + <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> + + <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> + <application android:allowBackup="true" @@ -21,16 +29,28 @@ android:supportsRtl="true" android:theme="@style/Theme.BondoMan" tools:targetApi="31"> + + <service + android:name="location" + android:foregroundServiceType="location" > + <!-- Any inner elements would go here. --> + </service> <activity android:name=".MainActivity"/> <activity android:name=".LoginActivity" android:exported="true" - android:theme="@style/Theme.AppCompat.Light.NoActionBar"> + android:theme="@style/Theme.AppCompat.Light.NoActionBar" + > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> + + <intent-filter> + <action android:name="android.intent.action.SEND" /> + <category android:name="android.intent.category.DEFAULT" /> + </intent-filter> </activity> </application> diff --git a/app/src/main/java/com/example/bondoman/MainActivity.kt b/app/src/main/java/com/example/bondoman/MainActivity.kt index 2bd31288e0714cbd36e89a055e0f6c517ebc9b89..7229152a018354814f6062b8061c789facd4de60 100644 --- a/app/src/main/java/com/example/bondoman/MainActivity.kt +++ b/app/src/main/java/com/example/bondoman/MainActivity.kt @@ -1,5 +1,7 @@ package com.example.bondoman +import android.Manifest.permission.ACCESS_COARSE_LOCATION +import android.Manifest.permission.ACCESS_FINE_LOCATION import android.app.AlertDialog import android.content.Context import androidx.appcompat.app.AppCompatActivity @@ -18,7 +20,14 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import android.net.ConnectivityManager import android.net.NetworkCapabilities +import android.util.Log.d +import androidx.activity.result.contract.ActivityResultContracts +import androidx.activity.viewModels +import com.example.bondoman.models.TransactionViewModel +import com.example.bondoman.room.BondomanDatabase import android.os.Build +import android.util.Log.w +import androidx.appcompat.widget.Toolbar import com.example.bondoman.ui.nointernet.NoInternetFragment import retrofit2.HttpException @@ -26,31 +35,59 @@ class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding + private val db by lazy { + BondomanDatabase.getDatabase(applicationContext) + } + + private val viewModel: TransactionViewModel by viewModels { + TransactionViewModel.provideFactory(db.dao,this) + } + + private val locationPermissionRequest = this.registerForActivityResult( + ActivityResultContracts.RequestMultiplePermissions() + ) { permissions -> + when { + permissions.getOrDefault(ACCESS_FINE_LOCATION, false) -> { + // Precise location access granted. + } + permissions.getOrDefault(ACCESS_COARSE_LOCATION, false) -> { + // Only approximate location access granted. + } else -> { + // No location access granted. + w("Location Access","Not Granted") + } + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - + d("OKE",viewModel.state.value.toString()) + locationPermissionRequest.launch(arrayOf( + ACCESS_FINE_LOCATION, + ACCESS_COARSE_LOCATION + )) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) - replaceFragment(ChartFragment(), NoInternetFragment()) + replaceFragment(CartFragment(), NoInternetFragment(), "Cart") binding.bottomNavigationView.menu.findItem(R.id.bottom_nav_cart).isChecked = true binding.bottomNavigationView.setOnItemSelectedListener { when(it.itemId){ R.id.bottom_nav_chart -> { - replaceFragment(ChartFragment(), NoInternetFragment()) + replaceFragment(ChartFragment(), NoInternetFragment(), "Chart") } R.id.bottom_nav_scan -> { - replaceFragment(ScanFragment(), NoInternetFragment()) + replaceFragment(ScanFragment(), NoInternetFragment(), "Scan") } R.id.bottom_nav_cart -> { - replaceFragment(CartFragment(), NoInternetFragment()) + replaceFragment(CartFragment(), NoInternetFragment(),"Cart") } R.id.bottom_nav_twibbon -> { - replaceFragment(TwibbonFragment(), NoInternetFragment()) + replaceFragment(TwibbonFragment(), NoInternetFragment(),"Twibbon") } R.id.bottom_nav_settings -> { - replaceFragment(SettingsFragment(), NoInternetFragment()) + replaceFragment(SettingsFragment(), NoInternetFragment(),"Settings") } else -> { @@ -120,7 +157,7 @@ class MainActivity : AppCompatActivity() { dialog.show() } - private fun replaceFragment(fragment: Fragment, noInternetFragment: Fragment){ + private fun replaceFragment(fragment: Fragment, noInternetFragment: Fragment, headerTitle : String){ val fragmentManager = supportFragmentManager val fragmentTransaction = fragmentManager.beginTransaction() if (this.isNetworkConnected(this)){ @@ -129,6 +166,7 @@ class MainActivity : AppCompatActivity() { showNoInternetDialog(this) fragmentTransaction.replace(R.id.main_frame_layout,noInternetFragment) } + setTitle(headerTitle) fragmentTransaction.commit() } } \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoman/models/Transaction.kt b/app/src/main/java/com/example/bondoman/models/Transaction.kt index 2293041b3c1c5d349baa80f0929ea1e85d1def0f..f6f51a725a1356c2cf3d2f461d81fa4c157c2d1c 100644 --- a/app/src/main/java/com/example/bondoman/models/Transaction.kt +++ b/app/src/main/java/com/example/bondoman/models/Transaction.kt @@ -2,18 +2,28 @@ package com.example.bondoman.models import android.location.Location import androidx.room.* +import java.math.BigDecimal +import java.time.LocalDate @Entity( tableName = "transaction" ) data class Transaction( - @PrimaryKey val id : String, + @PrimaryKey(autoGenerate = true) + val id : Int = 0, val judul: String, - val nominal: Float, + val nominal: BigDecimal, val kategori: Category, val lokasi: Location, + val tanggal: LocalDate ){ enum class Category { PEMBELIAN, PENJUALAN } } + +data class TransactionStats( + val kategori: Transaction.Category, + val count: Int, + val totalNominal: Float +) diff --git a/app/src/main/java/com/example/bondoman/models/TransactionViewModel.kt b/app/src/main/java/com/example/bondoman/models/TransactionViewModel.kt new file mode 100644 index 0000000000000000000000000000000000000000..e0164ebabfabc1ee3eeec28be2caea9a0f2ea32c --- /dev/null +++ b/app/src/main/java/com/example/bondoman/models/TransactionViewModel.kt @@ -0,0 +1,122 @@ +package com.example.bondoman.models + +import android.location.Location +import android.os.Bundle +import androidx.lifecycle.AbstractSavedStateViewModelFactory +import androidx.lifecycle.SavedStateHandle +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion.APPLICATION_KEY +import androidx.lifecycle.createSavedStateHandle +import androidx.lifecycle.viewModelScope +import androidx.lifecycle.viewmodel.CreationExtras +import com.example.bondoman.models.Transaction.Category +import com.example.bondoman.room.TransactionDao +import com.example.bondoman.services.TransactionEvent +import com.example.bondoman.services.TransactionState +import com.google.android.material.search.SearchView.TransitionState +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import java.math.BigDecimal +import java.time.LocalDate +import androidx.lifecycle.createSavedStateHandle +import androidx.savedstate.SavedStateRegistryOwner +import com.example.bondoman.MainActivity + +class TransactionViewModel(private val dao : TransactionDao) : ViewModel() { + + + private val _state = MutableStateFlow(TransactionState()) + private val _transactions = MutableStateFlow(dao.observeAll() ) + + val state = _transactions.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), TransactionState()) + + + + + fun _onEvent(event : TransactionEvent){ + when(event){ + TransactionEvent.SaveTransaction -> { + val judul = _state.value.judul + val nominal = _state.value.nominal + val kategori = _state.value.kategori + val tanggal = _state.value.tanggal + val lokasi = _state.value.lokasi + + if(judul.isBlank()) { return } + + val transaction = Transaction( + judul = judul, + nominal = nominal, + kategori = kategori, + tanggal = tanggal, + lokasi = lokasi + ) + viewModelScope.launch { + dao.upsert(transaction) + } + + _state.update { + it.copy( + judul = "", + kategori = Category.PEMBELIAN, + nominal = BigDecimal(0), + lokasi = Location(""), + tanggal = LocalDate.now(), + ) + } + } + is TransactionEvent.SetJudul -> { + _state.update { + it.copy( + judul = event.Judul + ) + } + } + is TransactionEvent.SetKategori -> { + _state.update { + it.copy( + kategori = event.Kategori + ) + } + } + is TransactionEvent.SetLokasi -> { + _state.update { + it.copy( + lokasi = event.Lokasi + ) + } + } + is TransactionEvent.SetNominal -> { + _state.update { + it.copy( + nominal = event.Nominal + ) + } + } + } + } + + // Define ViewModel factory in a companion object + companion object { + fun provideFactory( + dao: TransactionDao, + owner: SavedStateRegistryOwner, + defaultArgs: Bundle? = null, + ): AbstractSavedStateViewModelFactory = + object : AbstractSavedStateViewModelFactory(owner, defaultArgs) { + @Suppress("UNCHECKED_CAST") + override fun <T : ViewModel> create( + key: String, + modelClass: Class<T>, + handle: SavedStateHandle + ): T { + return TransactionViewModel(dao) as T + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoman/room/BondomanDatabase.kt b/app/src/main/java/com/example/bondoman/room/BondomanDatabase.kt index 766b50070e7dbb2c74fc6d3811a76ef130f3c5c3..758c5f73d775853553ea67b2bb4bcbaa1a7a8960 100644 --- a/app/src/main/java/com/example/bondoman/room/BondomanDatabase.kt +++ b/app/src/main/java/com/example/bondoman/room/BondomanDatabase.kt @@ -1,11 +1,15 @@ package com.example.bondoman.room +import com.example.bondoman.models.Transaction import android.content.Context import androidx.room.* -@Database(entities = [Transaction::class], version = 1, exportSchema = false) +@Database(entities = [Transaction::class], + version = 1, + exportSchema = false) +@TypeConverters(Converters::class) abstract class BondomanDatabase : RoomDatabase(){ - abstract fun transactionDao() : TransactionDao + abstract val dao : TransactionDao companion object { @Volatile private var INSTANCE: BondomanDatabase? = null diff --git a/app/src/main/java/com/example/bondoman/room/Converter.kt b/app/src/main/java/com/example/bondoman/room/Converter.kt new file mode 100644 index 0000000000000000000000000000000000000000..332acbc8c064631abb2d839703ef000fd04fe659 --- /dev/null +++ b/app/src/main/java/com/example/bondoman/room/Converter.kt @@ -0,0 +1,41 @@ +package com.example.bondoman.room + +import android.location.Location +import androidx.room.TypeConverter +import com.google.gson.Gson +import java.math.BigDecimal +import java.time.LocalDate + +class Converters { + private val gson = Gson() + + @TypeConverter + fun fromBigDecimal(value: BigDecimal): String { + return value.toString() + } + + @TypeConverter + fun toBigDecimal(value: String): BigDecimal { + return BigDecimal(value) + } + @TypeConverter + fun fromLocation(location: Location): String { + return gson.toJson(location) + } + + @TypeConverter + fun toLocation(json: String): Location { + return gson.fromJson(json, Location::class.java) + } + + @TypeConverter + fun fromLocalDate(localDate: LocalDate): String { + return localDate.toString() + } + + @TypeConverter + fun toLocalDate(dateString: String): LocalDate { + return LocalDate.parse(dateString) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoman/room/TransactionDao.kt b/app/src/main/java/com/example/bondoman/room/TransactionDao.kt index 73ffed4253acd310137b84e51f3221195bae2a71..187f1b68133c119c2f4e72b8dadfb1f1bfb23ad3 100644 --- a/app/src/main/java/com/example/bondoman/room/TransactionDao.kt +++ b/app/src/main/java/com/example/bondoman/room/TransactionDao.kt @@ -2,11 +2,13 @@ package com.example.bondoman.room import android.location.Location import androidx.room.* +import com.example.bondoman.models.TransactionStats import kotlinx.coroutines.flow.Flow +import com.example.bondoman.models.Transaction @Dao interface TransactionDao { - @Query("SELECT * FROM `transaction`") + @Query("SELECT * FROM `transaction` ORDER BY tanggal DESC") fun observeAll(): Flow<List<Transaction>> @Upsert @@ -26,4 +28,8 @@ interface TransactionDao { @Query("DELETE FROM `transaction`") suspend fun deleteAll() + + @Query("SELECT kategori, COUNT(id) AS count, SUM(nominal) AS totalNominal FROM `transaction` GROUP BY kategori") + fun getTransactionStats(): Flow<List<TransactionStats>> + } \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoman/services/ApiService.kt b/app/src/main/java/com/example/bondoman/services/ApiService.kt index 1d3ea96da2e6d180b01f61817044c38dd08c6ac5..3b761c1186aa3d0bac8c19478737ca379bc77782 100644 --- a/app/src/main/java/com/example/bondoman/services/ApiService.kt +++ b/app/src/main/java/com/example/bondoman/services/ApiService.kt @@ -1,4 +1,4 @@ -package com.example.bondoman.services +package com.example.bondoman.service import com.example.bondoman.models.ItemsResponse diff --git a/app/src/main/java/com/example/bondoman/services/LocationDefault.kt b/app/src/main/java/com/example/bondoman/services/LocationDefault.kt new file mode 100644 index 0000000000000000000000000000000000000000..e3397536ad08f459647c63c71b2baad7ba93f924 --- /dev/null +++ b/app/src/main/java/com/example/bondoman/services/LocationDefault.kt @@ -0,0 +1,4 @@ +package com.example.bondoman.services + +class LocationDefault { +} \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoman/services/RetrofitInstance.kt b/app/src/main/java/com/example/bondoman/services/RetrofitInstance.kt index 8e399979ab1ae0e36bf69f154c29aac3ba1cb790..f7abcc7a544270da5c3eca0f5dfd5f0b373c12a9 100644 --- a/app/src/main/java/com/example/bondoman/services/RetrofitInstance.kt +++ b/app/src/main/java/com/example/bondoman/services/RetrofitInstance.kt @@ -2,6 +2,7 @@ package com.example.bondoman.services import android.content.Context import android.content.SharedPreferences +import com.example.bondoman.service.ApiService import okhttp3.Interceptor import okhttp3.OkHttpClient import okhttp3.Request diff --git a/app/src/main/java/com/example/bondoman/services/TransactionEvent.kt b/app/src/main/java/com/example/bondoman/services/TransactionEvent.kt new file mode 100644 index 0000000000000000000000000000000000000000..36667f5f5d156a8462eac46568e683cc16c4ca99 --- /dev/null +++ b/app/src/main/java/com/example/bondoman/services/TransactionEvent.kt @@ -0,0 +1,13 @@ +package com.example.bondoman.services + +import android.location.Location +import com.example.bondoman.models.Transaction.Category +import java.math.BigDecimal + +sealed interface TransactionEvent { + object SaveTransaction : TransactionEvent + data class SetJudul(val Judul: String) : TransactionEvent + data class SetNominal(val Nominal: BigDecimal) : TransactionEvent + data class SetKategori(val Kategori: Category) : TransactionEvent + data class SetLokasi(val Lokasi: Location) : TransactionEvent +} \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoman/services/TransactionState.kt b/app/src/main/java/com/example/bondoman/services/TransactionState.kt new file mode 100644 index 0000000000000000000000000000000000000000..df4080c776c23b968d3c333508331314167395cb --- /dev/null +++ b/app/src/main/java/com/example/bondoman/services/TransactionState.kt @@ -0,0 +1,15 @@ +package com.example.bondoman.services +import android.location.Location +import com.example.bondoman.models.Transaction +import com.example.bondoman.models.Transaction.Category +import java.math.BigDecimal +import java.time.LocalDate + +data class TransactionState ( + val transactions : List<Transaction> = emptyList(), + val judul: String = "", + val nominal: BigDecimal = BigDecimal(0), + val kategori: Category = Category.PEMBELIAN, + val lokasi: Location = Location(""), + val tanggal: LocalDate = LocalDate.now() +) \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoman/ui/cart/CartAdapter.kt b/app/src/main/java/com/example/bondoman/ui/cart/CartAdapter.kt new file mode 100644 index 0000000000000000000000000000000000000000..2936f87ec8f46a1788541872e77cf2dd3915d661 --- /dev/null +++ b/app/src/main/java/com/example/bondoman/ui/cart/CartAdapter.kt @@ -0,0 +1,46 @@ +package com.example.bondoman.ui.cart + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.example.bondoman.R +import com.example.bondoman.models.Transaction + +class CartAdapter( + private val listData : List<Transaction> +) : RecyclerView.Adapter<CartAdapter.ViewHolder>(){ + class ViewHolder(item: View) : RecyclerView.ViewHolder(item) { + fun bind(data : Transaction){ + itemView.apply { + val date = itemView.findViewById<TextView>(R.id.textDate) + val title = itemView.findViewById<TextView>(R.id.textTitle) + val nominal = itemView.findViewById<TextView>(R.id.textNominal) + val category = itemView.findViewById<TextView>(R.id.textCategory) + val location = itemView.findViewById<TextView>(R.id.textLocation) + + date.text = data.tanggal.toString(); + title.text = data.judul; + nominal.text = data.nominal.toString() + category.text = data.kategori.toString() + location.text = "${data.lokasi.longitude} ${data.lokasi.latitude}" + } + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CartAdapter.ViewHolder { + val layoutInflanter = LayoutInflater.from(parent.context) + val view = layoutInflanter.inflate(R.layout.item_chart, parent, false) + return ViewHolder(view) + } + + override fun onBindViewHolder(holder: CartAdapter.ViewHolder, position: Int) { + holder.bind(listData[position]) + } + + override fun getItemCount(): Int { + return listData.size + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoman/ui/cart/CartFragment.kt b/app/src/main/java/com/example/bondoman/ui/cart/CartFragment.kt index 510dbacc67a555bc3e297b14240667825509bcc4..c46e2a10589b17c307bf66acd287947d7cafcd5d 100644 --- a/app/src/main/java/com/example/bondoman/ui/cart/CartFragment.kt +++ b/app/src/main/java/com/example/bondoman/ui/cart/CartFragment.kt @@ -1,16 +1,74 @@ package com.example.bondoman.ui.cart +import android.Manifest +import android.content.pm.PackageManager +import android.location.Location import android.os.Bundle -import androidx.fragment.app.Fragment +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.app.ActivityCompat +import androidx.fragment.app.Fragment +import androidx.fragment.app.activityViewModels +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import com.example.bondoman.R +import com.example.bondoman.models.Transaction +import com.example.bondoman.models.TransactionViewModel +import com.google.android.gms.location.FusedLocationProviderClient +import com.google.android.gms.location.LocationServices +import java.math.BigDecimal +import java.time.LocalDate -class CartFragment : Fragment() { +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" +/** + * A simple [Fragment] subclass. + * Use the [CartFragment.newInstance] factory method to + * create an instance of this fragment. + */ +class CartFragment : Fragment() { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + private var transactions : ArrayList<Transaction> = ArrayList() + private val viewModel by activityViewModels<TransactionViewModel>() + private lateinit var fusedLocationClient: FusedLocationProviderClient override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + } + } + + fun initDummy() { + val local = Location("") + Log.d( + "DEBUG LOKASI", "Current location is \n" + "lat : ${local.latitude}\n" + + "long : ${local.longitude}\n" + "fetched at ${System.currentTimeMillis()}" + ) + transactions.add( + Transaction( + 1, "Warteg", BigDecimal(10000), Transaction.Category.PEMBELIAN, local, + LocalDate.now() + ) + ) + transactions.add( + Transaction( + 2, "Warteg123", BigDecimal(10000), Transaction.Category.PEMBELIAN, local, + LocalDate.now() + ) + ) + transactions.add( + Transaction( + 3, "Warteg456", BigDecimal(10000), Transaction.Category.PEMBELIAN, local, + LocalDate.now() + ) + ) +// d("DEBUG",viewModel.state.value.toString()) } override fun onCreateView( @@ -20,4 +78,36 @@ class CartFragment : Fragment() { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_cart, container, false) } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initDummy() + var adapter = CartAdapter(transactions) + var layoutManager : RecyclerView.LayoutManager = LinearLayoutManager(context) + val rclist = view.findViewById<RecyclerView>(R.id.rclist) + rclist.layoutManager = layoutManager + rclist.adapter = adapter + + } + + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment CartFragment. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + CartFragment().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoman/ui/chart/ChartFragment.kt b/app/src/main/java/com/example/bondoman/ui/chart/ChartFragment.kt index 241d291e9ab9ea8596fc047eec00753edd5ee8be..714627195eb4916f53ab8ad5e382110d790f7f36 100644 --- a/app/src/main/java/com/example/bondoman/ui/chart/ChartFragment.kt +++ b/app/src/main/java/com/example/bondoman/ui/chart/ChartFragment.kt @@ -1,33 +1,27 @@ package com.example.bondoman.ui.chart +import android.graphics.Color import android.os.Bundle import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.example.bondoman.R +import com.example.bondoman.databinding.FragmentChartBinding +import com.example.bondoman.databinding.FragmentLoginBinding +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.data.PieData +import com.github.mikephil.charting.data.PieDataSet +import com.github.mikephil.charting.data.PieEntry +import com.github.mikephil.charting.utils.ColorTemplate -// TODO: Rename parameter arguments, choose names that match -// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER -private const val ARG_PARAM1 = "param1" -private const val ARG_PARAM2 = "param2" - -/** - * A simple [Fragment] subclass. - * Use the [ChartFragment.newInstance] factory method to - * create an instance of this fragment. - */ class ChartFragment : Fragment() { - // TODO: Rename and change types of parameters - private var param1: String? = null - private var param2: String? = null + + private lateinit var binding: FragmentChartBinding + lateinit var pieChart: PieChart override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - arguments?.let { - param1 = it.getString(ARG_PARAM1) - param2 = it.getString(ARG_PARAM2) - } } override fun onCreateView( @@ -38,23 +32,32 @@ class ChartFragment : Fragment() { return inflater.inflate(R.layout.fragment_chart, container, false) } - companion object { - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @param param1 Parameter 1. - * @param param2 Parameter 2. - * @return A new instance of fragment ChartFragment. - */ - // TODO: Rename and change types and number of parameters - @JvmStatic - fun newInstance(param1: String, param2: String) = - ChartFragment().apply { - arguments = Bundle().apply { - putString(ARG_PARAM1, param1) - putString(ARG_PARAM2, param2) - } - } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + binding = FragmentChartBinding.bind(view) + + var pieChart = binding.chart + + val list:ArrayList<PieEntry> = ArrayList() + + list.add(PieEntry(30f,"Pembelian")) + list.add(PieEntry(50f,"Penjualan")) + + val pieDataSet= PieDataSet(list,"Chart") + + pieDataSet.setColors(ColorTemplate.MATERIAL_COLORS,255) + pieDataSet.valueTextColor= Color.BLACK + pieDataSet.valueTextSize=15f + + val pieData= PieData(pieDataSet) + + pieChart.data= pieData + + pieChart.description.text= "Pie Chart" + + pieChart.centerText="List" + + pieChart.animateY(2000) } } \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoman/ui/login/LoginFragment.kt b/app/src/main/java/com/example/bondoman/ui/login/LoginFragment.kt index 89176e507e22c9df9e8f90ca11c73571110a1fc7..b4bebcc4e98708ebf8d7398c03ca0d76203effec 100644 --- a/app/src/main/java/com/example/bondoman/ui/login/LoginFragment.kt +++ b/app/src/main/java/com/example/bondoman/ui/login/LoginFragment.kt @@ -13,7 +13,6 @@ import com.example.bondoman.R import com.example.bondoman.databinding.FragmentLoginBinding import com.example.bondoman.models.LoginRequest import com.example.bondoman.services.RetrofitClient -import com.example.bondoman.services.ApiService import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.withContext import retrofit2.HttpException @@ -103,7 +102,7 @@ class LoginFragment : Fragment() { * * @param param1 Parameter 1. * @param param2 Parameter 2. - * @return A new instance of fragment ChartFragment. + * @return A new instance of fragment CartFragment. */ // TODO: Rename and change types and number of parameters @JvmStatic diff --git a/app/src/main/java/com/example/bondoman/ui/nointernet/NoInternetFragment.kt b/app/src/main/java/com/example/bondoman/ui/nointernet/NoInternetFragment.kt index c4a351b337f43bdd0ecacde4f72cb5bbdbc88166..8de5a3e2e64fa78b473d04e37cbf4351abefe46e 100644 --- a/app/src/main/java/com/example/bondoman/ui/nointernet/NoInternetFragment.kt +++ b/app/src/main/java/com/example/bondoman/ui/nointernet/NoInternetFragment.kt @@ -45,7 +45,7 @@ class NoInternetFragment : Fragment() { * * @param param1 Parameter 1. * @param param2 Parameter 2. - * @return A new instance of fragment ChartFragment. + * @return A new instance of fragment CartFragment. */ // TODO: Rename and change types and number of parameters @JvmStatic diff --git a/app/src/main/java/com/example/bondoman/ui/scan/ItemAdapter.kt b/app/src/main/java/com/example/bondoman/ui/scan/ItemAdapter.kt index b6fece3755b7d3c8bab1b1b336d140e2fbfed693..c57c90ed839b0e1aa58017dc1e1f4749162408fa 100644 --- a/app/src/main/java/com/example/bondoman/ui/scan/ItemAdapter.kt +++ b/app/src/main/java/com/example/bondoman/ui/scan/ItemAdapter.kt @@ -13,14 +13,14 @@ class ItemAdapter(private val items: List<Item>?) : RecyclerView.Adapter<ItemAdapter.ItemViewHolder>() { class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - val itemName: TextView = itemView.findViewById(R.id.itemName) - val itemQty: TextView = itemView.findViewById(R.id.itemQty) - val itemPrice: TextView = itemView.findViewById(R.id.itemPrice) + val itemName: TextView = itemView.findViewById<TextView>(R.id.textTitle) + val itemQty: TextView = itemView.findViewById<TextView>(R.id.textNominal) + val itemPrice: TextView = itemView.findViewById(R.id.textNominal) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { val itemView = - LayoutInflater.from(parent.context).inflate(R.layout.item_list, parent, false) + LayoutInflater.from(parent.context).inflate(R.layout.item_chart, parent, false) return ItemViewHolder(itemView) } diff --git a/app/src/main/java/com/example/bondoman/ui/settings/SettingsFragment.kt b/app/src/main/java/com/example/bondoman/ui/settings/SettingsFragment.kt index 6656b403d22167210abfee06772b4d5a1e39e1d7..86d783020f0a2b1d5938e5247cb54c81545717f7 100644 --- a/app/src/main/java/com/example/bondoman/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/com/example/bondoman/ui/settings/SettingsFragment.kt @@ -1,11 +1,17 @@ package com.example.bondoman.ui.settings +import android.content.Intent import android.os.Bundle import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.Button +import android.widget.Toast +import com.example.bondoman.MainActivity import com.example.bondoman.R +import com.example.bondoman.databinding.FragmentChartBinding +import com.example.bondoman.databinding.FragmentSettingsBinding // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER @@ -18,16 +24,13 @@ private const val ARG_PARAM2 = "param2" * create an instance of this fragment. */ class SettingsFragment : Fragment() { - // TODO: Rename and change types of parameters - private var param1: String? = null - private var param2: String? = null + private lateinit var binding: FragmentSettingsBinding + private lateinit var saveButton: Button + private lateinit var sendButton: Button + private lateinit var logoutButton: Button override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - arguments?.let { - param1 = it.getString(ARG_PARAM1) - param2 = it.getString(ARG_PARAM2) - } } override fun onCreateView( @@ -38,23 +41,46 @@ class SettingsFragment : Fragment() { return inflater.inflate(R.layout.fragment_settings, container, false) } - companion object { - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @param param1 Parameter 1. - * @param param2 Parameter 2. - * @return A new instance of fragment SettingsFragment. - */ - // TODO: Rename and change types and number of parameters - @JvmStatic - fun newInstance(param1: String, param2: String) = - SettingsFragment().apply { - arguments = Bundle().apply { - putString(ARG_PARAM1, param1) - putString(ARG_PARAM2, param2) - } - } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + binding = FragmentSettingsBinding.bind(view) + + saveButton = binding.settingsSaveButton + sendButton = binding.settingSendButton + logoutButton = binding.settingsLogoutButton + + saveButton.setOnClickListener { + Toast.makeText(requireContext(), "save",Toast.LENGTH_SHORT).show() + } + + sendButton.setOnClickListener { + // Create an Intent with ACTION_SEND to send an email + val emailIntent = Intent(Intent.ACTION_SEND) + + // Set the type to 'message/rfc822' MIME type, which is the standard MIME type for email messages + emailIntent.type = "message/rfc822" + + // Set recipients (to whom you want to send the email) + emailIntent.putExtra(Intent.EXTRA_EMAIL, arrayOf("13521106@std.stei.itb.ac.id")) + + // Set subject of the email + emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Transaction Data") + + // Set body of the email + emailIntent.putExtra(Intent.EXTRA_TEXT, "This is your data transaction") + + // Start the activity with the emailIntent + startActivity(Intent.createChooser(emailIntent, "Send Email")) + + // Display a toast indicating the action + Toast.makeText(requireContext(), "Sending email...", Toast.LENGTH_SHORT).show() + } + + logoutButton.setOnClickListener { + Toast.makeText(requireContext(), "logout",Toast.LENGTH_SHORT).show() + } + } + } \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoman/ui/splash/SplashScreenFragment.kt b/app/src/main/java/com/example/bondoman/ui/splash/SplashScreenFragment.kt index 54f5a3bcf68c1e6ec1a3d08b51e659e473aaa43d..5ca143876129af546612bfeb69389ac12f676904 100644 --- a/app/src/main/java/com/example/bondoman/ui/splash/SplashScreenFragment.kt +++ b/app/src/main/java/com/example/bondoman/ui/splash/SplashScreenFragment.kt @@ -45,7 +45,7 @@ class SplashScreenFragment : Fragment() { * * @param param1 Parameter 1. * @param param2 Parameter 2. - * @return A new instance of fragment ChartFragment. + * @return A new instance of fragment CartFragment. */ // TODO: Rename and change types and number of parameters @JvmStatic diff --git a/app/src/main/res/drawable/take_photo_button.xml b/app/src/main/res/drawable/take_photo_button.xml index 15594d98b42e7458206c874fe3397963b65198ad..f8c52371980679bd6018e065e2031de712dec409 100644 --- a/app/src/main/res/drawable/take_photo_button.xml +++ b/app/src/main/res/drawable/take_photo_button.xml @@ -1,4 +1,4 @@ <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> - <solid android:color="@color/red" /> + <solid android:color="@color/red.500" /> </shape> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index fc48df1bc0b4d8dde28d0635e50f384ab1aa7183..0eef30b51ebbe9cab671e0e5890096e72e7689c7 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -7,8 +7,6 @@ android:id="@+id/main_frame_layout" tools:context=".MainActivity"> - - <com.google.android.material.bottomnavigation.BottomNavigationView android:id="@+id/bottomNavigationView" android:layout_width="0dp" diff --git a/app/src/main/res/layout/fragment_cart.xml b/app/src/main/res/layout/fragment_cart.xml index 16550b047863bd6b20baa0d19ae7e9091f12fcca..aa56e30c9db13a3a6684b4a65beb1e800d1c93db 100644 --- a/app/src/main/res/layout/fragment_cart.xml +++ b/app/src/main/res/layout/fragment_cart.xml @@ -5,11 +5,13 @@ android:layout_height="match_parent" tools:context=".ui.cart.CartFragment"> - <TextView + <!-- TODO: Update blank fragment layout --> + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/rclist" android:layout_width="match_parent" android:layout_height="match_parent" - android:gravity="center" - android:text="Cart Fragment" - android:textSize="26sp" /> + tools:listitem="@layout/item_chart" + tools:itemCount="1" + /> </FrameLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_chart.xml b/app/src/main/res/layout/fragment_chart.xml index 49d4584d84cffb60b6c297c3c53ddb2e04cde384..c4f4655b1165d7a8f6072cdc39202b15658fbeb9 100644 --- a/app/src/main/res/layout/fragment_chart.xml +++ b/app/src/main/res/layout/fragment_chart.xml @@ -1,17 +1,16 @@ <?xml version="1.0" encoding="utf-8"?> -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/ConstraintLayout" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".ui.chart.ChartFragment"> + android:padding="10dp" + tools:context=".ui.chart.ChartFragment" > - <!-- TODO: Update blank fragment layout --> - <TextView + <com.github.mikephil.charting.charts.PieChart android:layout_width="match_parent" android:layout_height="match_parent" - android:text="Chart Fragment" - android:textSize="26sp" - android:layout_gravity="center" - /> + android:id="@+id/chart"> -</FrameLayout> \ No newline at end of file + </com.github.mikephil.charting.charts.PieChart> +</androidx.constraintlayout.widget.ConstraintLayout> diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index 4493e46a171c8daf5716b588a78f28b8c70e0c27..f02883c27643546ac18e2533afeaca653675ed4c 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -1,16 +1,47 @@ <?xml version="1.0" encoding="utf-8"?> -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" +<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/ConstraintLayout" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".ui.settings.SettingsFragment"> + android:padding="10dp" + tools:context=".ui.settings.SettingsFragment" > - <!-- TODO: Update blank fragment layout --> - <TextView - android:layout_width="match_parent" - android:layout_height="match_parent" - android:text="Settings Fragment" - android:textSize="26sp" - android:layout_gravity="center" /> + <Button + android:id="@+id/settingsSaveButton" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginTop="4dp" + android:backgroundTint="@color/green.500" + android:text="@string/settings_save_button_title" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="1.0" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> -</FrameLayout> \ No newline at end of file + <Button + android:id="@+id/settingSendButton" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:backgroundTint="@color/green.500" + android:text="@string/settings_send_button_title" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/settingsSaveButton" /> + + <Button + android:id="@+id/settingsLogoutButton" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginTop="28dp" + android:backgroundTint="@color/red.200" + android:text="@string/settings_logout_button_title" + android:textColor="@color/white" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="1.0" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/settingSendButton" /> + + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/item_chart.xml b/app/src/main/res/layout/item_chart.xml new file mode 100644 index 0000000000000000000000000000000000000000..c37887b62c2ff5a9f491149dd1bc20edef2888cd --- /dev/null +++ b/app/src/main/res/layout/item_chart.xml @@ -0,0 +1,61 @@ +<?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:layout_width="match_parent" + android:layout_height="wrap_content"> + + <TextView + android:id="@+id/textDate" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="28dp" + android:layout_marginTop="24dp" + android:text="20/03/2023" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <TextView + android:id="@+id/textTitle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="28dp" + android:layout_marginTop="16dp" + android:text="Warteg" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/textDate" /> + + <TextView + android:id="@+id/textNominal" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="28dp" + android:layout_marginTop="16dp" + android:layout_marginBottom="16dp" + android:text="IDR15000" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/textTitle" + app:layout_constraintVertical_bias="0.0" /> + + <TextView + android:id="@+id/textCategory" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="24dp" + android:layout_marginEnd="28dp" + android:text="Pembelian" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <TextView + android:id="@+id/textLocation" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="32dp" + android:layout_marginEnd="28dp" + android:text="Bandung, Dago" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toBottomOf="@+id/textCategory" /> + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/item_list.xml b/app/src/main/res/layout/item_list.xml deleted file mode 100644 index 8b3fffc2da1c8fb9fe1226052856cbfb93549d80..0000000000000000000000000000000000000000 --- a/app/src/main/res/layout/item_list.xml +++ /dev/null @@ -1,37 +0,0 @@ -<?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:paddingStart="16dp" - android:paddingEnd="16dp" - android:paddingTop="8dp" - android:paddingBottom="8dp" - android:layout_marginStart="8dp" - android:layout_marginEnd="8dp" - android:layout_marginTop="4dp" - android:layout_marginBottom="4dp"> - - <!-- Your TextViews for item name, quantity, and price --> - <TextView - android:id="@+id/itemName" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textSize="18sp" - android:textColor="@color/black"/> - - <TextView - android:id="@+id/itemQty" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textSize="14sp" - android:textColor="@color/black"/> - - <TextView - android:id="@+id/itemPrice" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textSize="16sp" - android:textColor="@color/black"/> - -</LinearLayout> diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index 8111560848797c9c2dba96310f97f8d0415f575f..d88d6d50ac6d8cf6039db9b4e672e18a93aafa7d 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -1,7 +1,9 @@ <resources xmlns:tools="http://schemas.android.com/tools"> <!-- Base application theme. --> - <style name="Base.Theme.BondoMan" parent="Theme.Material3.DayNight.NoActionBar"> + <style name="Base.Theme.BondoMan" parent="Theme.Material3.DayNight"> <!-- Customize your dark theme here. --> <!-- <item name="colorPrimary">@color/my_dark_primary</item> --> + <item name="colorPrimary">#4CAF50</item> + <item name="android:statusBarColor">?attr/colorPrimary</item> </style> </resources> \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 7a4c95b2fb7a917498376463c34ea6eedc5a3303..08f60c953cbf8e9fc908c3bfa5ddcafcb209a42c 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -2,5 +2,8 @@ <resources> <color name="black">#FF000000</color> <color name="white">#FFFFFFFF</color> - <color name="red">#FFED1515</color> + <color name="green.500">#4CAF50</color> + <color name="green.200">#A5D6A7</color> + <color name="red.500">#F44336</color> + <color name="red.200">#EF9A9A</color> </resources> \ 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 508df8180b0f84fa7228f843499a3f72e049c0e1..ae9dec8a6782bbfb750d001d606f41b7c8580347 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5,4 +5,7 @@ <string name="bottom_nav_cart_title">Cart</string> <string name="bottom_nav_twibbon_title">Twibbon</string> <string name="bottom_nav_settings_title">Settings</string> + <string name="settings_save_button_title">Save Transaction</string> + <string name="settings_send_button_title">Send Transaction to Email</string> + <string name="settings_logout_button_title">Logout</string> </resources> \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 4f3ed1ef0dab9c06604f9b50bd1015baf4608f0f..1d197d0d446e703725b574cddf255754f9d2e0cb 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,8 +1,12 @@ <resources xmlns:tools="http://schemas.android.com/tools"> <!-- Base application theme. --> - <style name="Base.Theme.BondoMan" parent="Theme.Material3.DayNight.NoActionBar"> + <style name="Base.Theme.BondoMan" parent="Theme.Material3.DayNight"> <!-- Customize your light theme here. --> <!-- <item name="colorPrimary">@color/my_light_primary</item> --> + <item name="colorPrimary">@color/green.500</item> + <item name="colorSecondary">@color/green.200</item> + <item name="android:statusBarColor">?attr/colorPrimary</item> + <item name="actionBarItemBackground">?attr/colorSecondary</item> </style> <style name="Theme.BondoMan" parent="Base.Theme.BondoMan" /> diff --git a/build.gradle.kts b/build.gradle.kts index 31ed43cc99341f5b95f5b15fd54f84d14a585002..efefc9f92965c46843951be887e193b0a7c5743c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,4 +2,5 @@ plugins { id("com.android.application") version "8.3.0" apply false id("org.jetbrains.kotlin.android") version "1.9.22" apply false + id("com.google.devtools.ksp") version "1.9.21-1.0.15" apply false } \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 1151a8a8c6011d230cce7a785c669ead68bf9be8..f321e45123aa3299f55ff577d3437de032b1c43a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -10,6 +10,7 @@ dependencyResolutionManagement { repositories { google() mavenCentral() + maven(url = "https://jitpack.io") } }