diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 8ae03e12297b83b59f3c1bf2ef1e8c2db52d0f86..6efccf1e3e7943600c92a5da175a0e05f5332baf 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -40,6 +40,8 @@ android {
 
 dependencies {
     implementation("com.google.android.gms:play-services-location:21.2.0")
+    implementation("androidx.legacy:legacy-support-v4:1.0.0")
+    implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.7.0")
     val room_version = "2.6.1"
     implementation("androidx.room:room-runtime:$room_version")
     ksp("androidx.room:room-compiler:$room_version")
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 97ab26b7d0d7e4ef830dbd0a634434d90ab0dd44..57c2e7338eabc669c126c43cd79abe5c59212ca4 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -10,10 +10,8 @@
 
     <!-- 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.FOREGROUND_SERVICE"/>
     <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
 
 
@@ -26,13 +24,9 @@
         android:roundIcon="@mipmap/ic_launcher_round"
         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>
+        tools:targetApi="31"
+        tools:ignore="ForegroundServicePermission">
+        <service android:name="LocationService" android:foregroundServiceType="location" android:enabled="true" android:exported="false"/>
         <activity android:name=".LoginActivity"/>
         <activity
             android:name=".MainActivity"
diff --git a/app/src/main/java/com/example/bondoman/MainActivity.kt b/app/src/main/java/com/example/bondoman/MainActivity.kt
index 7229152a018354814f6062b8061c789facd4de60..1a5653c8ec250e304eda4d6a4c9acd2f6f682a90 100644
--- a/app/src/main/java/com/example/bondoman/MainActivity.kt
+++ b/app/src/main/java/com/example/bondoman/MainActivity.kt
@@ -25,10 +25,8 @@ 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 kotlinx.coroutines.flow.collect
 import retrofit2.HttpException
 
 class MainActivity : AppCompatActivity() {
@@ -43,29 +41,11 @@ class MainActivity : AppCompatActivity() {
         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)
+        locationPermission()
         d("OKE",viewModel.state.value.toString())
-        locationPermissionRequest.launch(arrayOf(
-            ACCESS_FINE_LOCATION,
-            ACCESS_COARSE_LOCATION
-        ))
         binding = ActivityMainBinding.inflate(layoutInflater)
         setContentView(binding.root)
         replaceFragment(CartFragment(), NoInternetFragment(), "Cart")
@@ -102,6 +82,32 @@ class MainActivity : AppCompatActivity() {
         startBackgroundWorker()
     }
 
+    private fun locationPermission(){
+        val locationPermissionRequest = 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.
+            }
+            }
+        }
+
+// ...
+
+// Before you perform the actual permission request, check whether your app
+// already has the permissions, and whether your app needs to show a permission
+// rationale dialog. For more details, see Request permissions.
+        locationPermissionRequest.launch(arrayOf(
+            ACCESS_FINE_LOCATION,
+            ACCESS_COARSE_LOCATION))
+    }
+
     private fun startBackgroundWorker() {
         // Create a handler
         val handler = Handler()
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 f6f51a725a1356c2cf3d2f461d81fa4c157c2d1c..2ba7784ed7334a921d2b8bfe3112e5ac122fb205 100644
--- a/app/src/main/java/com/example/bondoman/models/Transaction.kt
+++ b/app/src/main/java/com/example/bondoman/models/Transaction.kt
@@ -14,12 +14,16 @@ data class Transaction(
     val judul: String,
     val nominal: BigDecimal,
     val kategori: Category,
-    val lokasi: Location,
+    val lokasi: Position,
     val tanggal: LocalDate
 ){
     enum class Category {
         PEMBELIAN, PENJUALAN
     }
+
+    class Position(val latitude: Double, val longitude: Double) {
+
+    }
 }
 
 data class TransactionStats(
diff --git a/app/src/main/java/com/example/bondoman/models/TransactionViewModel.kt b/app/src/main/java/com/example/bondoman/models/TransactionViewModel.kt
index e0164ebabfabc1ee3eeec28be2caea9a0f2ea32c..083618758f5e3579ebd30d6dbc3631feab164c9d 100644
--- a/app/src/main/java/com/example/bondoman/models/TransactionViewModel.kt
+++ b/app/src/main/java/com/example/bondoman/models/TransactionViewModel.kt
@@ -2,6 +2,7 @@ package com.example.bondoman.models
 
 import android.location.Location
 import android.os.Bundle
+import android.util.Log.d
 import androidx.lifecycle.AbstractSavedStateViewModelFactory
 import androidx.lifecycle.SavedStateHandle
 import androidx.lifecycle.ViewModel
@@ -26,18 +27,19 @@ import java.time.LocalDate
 import androidx.lifecycle.createSavedStateHandle
 import androidx.savedstate.SavedStateRegistryOwner
 import com.example.bondoman.MainActivity
+import kotlinx.coroutines.flow.asStateFlow
+import kotlinx.coroutines.flow.collect
 
 class TransactionViewModel(private  val dao : TransactionDao) : ViewModel() {
 
 
     private val _state = MutableStateFlow(TransactionState())
     private val _transactions = MutableStateFlow(dao.observeAll() )
-
+    val transactions = _transactions.asStateFlow()
     val state = _transactions.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), TransactionState())
 
 
 
-
     fun _onEvent(event : TransactionEvent){
         when(event){
             TransactionEvent.SaveTransaction -> {
@@ -56,8 +58,12 @@ class TransactionViewModel(private  val dao : TransactionDao) : ViewModel() {
                     tanggal = tanggal,
                     lokasi = lokasi
                 )
+
                 viewModelScope.launch {
                     dao.upsert(transaction)
+                    _transactions.value.collect { transactions ->
+                        d("TRANSACTION", transactions.toString())
+                    }
                 }
 
                 _state.update {
@@ -65,7 +71,7 @@ class TransactionViewModel(private  val dao : TransactionDao) : ViewModel() {
                         judul = "",
                         kategori = Category.PEMBELIAN,
                         nominal = BigDecimal(0),
-                        lokasi = Location(""),
+                        lokasi = Transaction.Position(0.0,0.0),
                         tanggal = LocalDate.now(),
                     )
                 }
@@ -76,27 +82,34 @@ class TransactionViewModel(private  val dao : TransactionDao) : ViewModel() {
                         judul = event.Judul
                     )
                 }
+                d("EVENT TRANSACTION","${_state.value.judul}")
             }
             is TransactionEvent.SetKategori -> {
+
                 _state.update {
                     it.copy(
                         kategori = event.Kategori
                     )
                 }
+                d("EVENT TRANSACTION","${_state.value.kategori}")
             }
             is TransactionEvent.SetLokasi -> {
+
                 _state.update {
                     it.copy(
                         lokasi = event.Lokasi
                     )
                 }
+                d("EVENT TRANSACTION","${_state.value.lokasi.latitude} ${_state.value.lokasi.longitude}")
             }
             is TransactionEvent.SetNominal -> {
+
                 _state.update {
                     it.copy(
                         nominal = event.Nominal
                     )
                 }
+                d("EVENT TRANSACTION","${_state.value.nominal.toString()}")
             }
         }
     }
diff --git a/app/src/main/java/com/example/bondoman/room/Converter.kt b/app/src/main/java/com/example/bondoman/room/Converter.kt
index 332acbc8c064631abb2d839703ef000fd04fe659..fedc348eeb605f91c2d2a21c126d25b2d7cb7dfe 100644
--- a/app/src/main/java/com/example/bondoman/room/Converter.kt
+++ b/app/src/main/java/com/example/bondoman/room/Converter.kt
@@ -1,7 +1,9 @@
 package com.example.bondoman.room
 
 import android.location.Location
+import android.util.Log.d
 import androidx.room.TypeConverter
+import com.example.bondoman.models.Transaction
 import com.google.gson.Gson
 import java.math.BigDecimal
 import java.time.LocalDate
@@ -19,13 +21,14 @@ class Converters {
         return BigDecimal(value)
     }
     @TypeConverter
-    fun fromLocation(location: Location): String {
+    fun fromLocation(location: Transaction.Position): String {
+        val json = "{'latitude' : '${location.latitude},'longitude' : '${location.longitude}'}"
         return gson.toJson(location)
     }
 
     @TypeConverter
-    fun toLocation(json: String): Location {
-        return gson.fromJson(json, Location::class.java)
+    fun toLocation(json: String): Transaction.Position {
+        return gson.fromJson(json, Transaction.Position::class.java)
     }
 
     @TypeConverter
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 187f1b68133c119c2f4e72b8dadfb1f1bfb23ad3..307a5c030a1539c2f1559567ec9ac17caba08f85 100644
--- a/app/src/main/java/com/example/bondoman/room/TransactionDao.kt
+++ b/app/src/main/java/com/example/bondoman/room/TransactionDao.kt
@@ -12,7 +12,7 @@ interface TransactionDao {
     fun observeAll(): Flow<List<Transaction>>
 
     @Upsert
-    suspend fun upsert(transation: Transaction)
+    suspend fun upsert(transaction: Transaction)
 
     @Upsert
     suspend fun upsertAll(transactions: List<Transaction>)
@@ -24,7 +24,7 @@ interface TransactionDao {
     suspend fun updateNominal(taskId: String, nominal: Float)
 
     @Query("UPDATE `transaction` SET lokasi = :lokasi WHERE id = :taskId")
-    suspend fun updateLokasi(taskId: String, lokasi: Location)
+    suspend fun updateLokasi(taskId: String, lokasi: Transaction.Position)
 
     @Query("DELETE FROM `transaction`")
     suspend fun deleteAll()
diff --git a/app/src/main/java/com/example/bondoman/services/ContextExt.kt b/app/src/main/java/com/example/bondoman/services/ContextExt.kt
new file mode 100644
index 0000000000000000000000000000000000000000..571d7dc62f7ce9f951e37a912f05cd262acf61b9
--- /dev/null
+++ b/app/src/main/java/com/example/bondoman/services/ContextExt.kt
@@ -0,0 +1,18 @@
+package com.example.bondoman.services
+
+import android.Manifest.permission.ACCESS_COARSE_LOCATION
+import android.Manifest.permission.ACCESS_FINE_LOCATION
+import android.content.Context
+import android.content.pm.PackageManager
+import androidx.core.content.ContextCompat
+
+fun Context.hasLocationPermission(): Boolean {
+    return ContextCompat.checkSelfPermission(
+        this,
+        ACCESS_COARSE_LOCATION
+    ) == PackageManager.PERMISSION_GRANTED &&
+            ContextCompat.checkSelfPermission(
+        this,
+        ACCESS_FINE_LOCATION
+    ) == PackageManager.PERMISSION_GRANTED
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/bondoman/services/LocationClient.kt b/app/src/main/java/com/example/bondoman/services/LocationClient.kt
new file mode 100644
index 0000000000000000000000000000000000000000..13d938f67ac9734f70469e1793eaabbe2a867ba9
--- /dev/null
+++ b/app/src/main/java/com/example/bondoman/services/LocationClient.kt
@@ -0,0 +1,12 @@
+package com.example.bondoman.services
+
+import android.location.Location
+import kotlinx.coroutines.flow.Flow
+
+interface LocationClient {
+    suspend fun getLocationUpdates(): Location
+    fun getLocationFromName(locationName: String) : Location?
+
+    class LocationException(message: String) : Exception()
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/bondoman/services/LocationDefault.kt b/app/src/main/java/com/example/bondoman/services/LocationDefault.kt
index e3397536ad08f459647c63c71b2baad7ba93f924..c663de9e138db99e62ff412d7b5e0e25b82e0e26 100644
--- a/app/src/main/java/com/example/bondoman/services/LocationDefault.kt
+++ b/app/src/main/java/com/example/bondoman/services/LocationDefault.kt
@@ -1,4 +1,54 @@
 package com.example.bondoman.services
 
-class LocationDefault {
+import android.annotation.SuppressLint
+import android.content.Context
+import android.location.Address
+import android.location.Geocoder
+import android.location.Location
+import com.google.android.gms.location.FusedLocationProviderClient
+import com.google.android.gms.tasks.Task
+import kotlinx.coroutines.suspendCancellableCoroutine
+import java.io.IOException
+import kotlin.coroutines.resume
+import kotlin.coroutines.resumeWithException
+
+class LocationDefault(
+    private val context: Context,
+    private val client: FusedLocationProviderClient
+) : LocationClient {
+
+
+    @SuppressLint("MissingPermission")
+    override suspend fun getLocationUpdates(): Location {
+        return suspendCancellableCoroutine { continuation ->
+            val locationTask: Task<Location> = client.lastLocation
+            locationTask.addOnSuccessListener { location ->
+                if (location != null) {
+                    continuation.resume(location)
+                } else {
+                    continuation.resumeWithException(NullPointerException("Last location is null"))
+                }
+            }
+            locationTask.addOnFailureListener { exception ->
+                continuation.resumeWithException(exception)
+            }
+        }
+    }
+
+    override fun getLocationFromName(locationName: String) : Location? {
+        val geocoder = Geocoder(context)
+        try {
+            val address = geocoder.getFromLocationName(locationName, 1)
+            if (address != null && address.isNotEmpty()) {
+                val location = Location("")
+                location.latitude = address[0].latitude
+                location.longitude = address[0].longitude
+
+                return location
+            }
+        } catch (e: IOException) {
+            e.printStackTrace()
+        }
+        return null
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/example/bondoman/services/TransactionEvent.kt b/app/src/main/java/com/example/bondoman/services/TransactionEvent.kt
index 36667f5f5d156a8462eac46568e683cc16c4ca99..f11901724afaaefaaa9715ce2d1102243d1d3616 100644
--- a/app/src/main/java/com/example/bondoman/services/TransactionEvent.kt
+++ b/app/src/main/java/com/example/bondoman/services/TransactionEvent.kt
@@ -1,6 +1,7 @@
 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
 
@@ -9,5 +10,5 @@ sealed interface 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
+    data class SetLokasi(val Lokasi: Transaction.Position) : 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
index df4080c776c23b968d3c333508331314167395cb..436c94ff8edb6464b5913c566649e7c9a5b900e3 100644
--- a/app/src/main/java/com/example/bondoman/services/TransactionState.kt
+++ b/app/src/main/java/com/example/bondoman/services/TransactionState.kt
@@ -10,6 +10,6 @@ data class TransactionState (
     val judul: String = "",
     val nominal: BigDecimal = BigDecimal(0),
     val kategori: Category = Category.PEMBELIAN,
-    val lokasi: Location =  Location(""),
+    val lokasi: Transaction.Position =  Transaction.Position(0.0,0.0),
     val tanggal: LocalDate = LocalDate.now()
 )
\ No newline at end of file
diff --git a/app/src/main/java/com/example/bondoman/ui/cart/AddFragment.kt b/app/src/main/java/com/example/bondoman/ui/cart/AddFragment.kt
new file mode 100644
index 0000000000000000000000000000000000000000..f7e5f1c59b44415f82498e55380ea45b2016bcd5
--- /dev/null
+++ b/app/src/main/java/com/example/bondoman/ui/cart/AddFragment.kt
@@ -0,0 +1,117 @@
+package com.example.bondoman.ui.cart
+
+import android.content.Context
+import android.location.Location
+import androidx.lifecycle.ViewModelProvider
+import android.os.Bundle
+import android.util.Log.d
+import androidx.fragment.app.Fragment
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.AdapterView
+import android.widget.ArrayAdapter
+import android.widget.Spinner
+import androidx.fragment.app.activityViewModels
+import com.example.bondoman.R
+import com.example.bondoman.databinding.FragmentAddBinding
+import com.example.bondoman.databinding.FragmentLoginBinding
+import com.example.bondoman.models.Transaction
+import com.example.bondoman.models.TransactionViewModel
+import com.example.bondoman.services.LocationClient
+import com.example.bondoman.services.LocationDefault
+import com.example.bondoman.services.TransactionEvent
+import com.google.android.gms.location.LocationServices
+import java.math.BigDecimal
+
+class AddFragment : Fragment() {
+
+    companion object {
+        fun newInstance() = AddFragment()
+    }
+
+    private val viewModel by activityViewModels<TransactionViewModel>()
+    private lateinit var client : LocationClient
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+    }
+
+    override fun onAttach(context: Context) {
+        super.onAttach(context)
+        client = LocationDefault(context,LocationServices.getFusedLocationProviderClient(requireActivity()))
+    }
+
+    override fun onCreateView(
+        inflater: LayoutInflater, container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? {
+
+        return inflater.inflate(R.layout.fragment_add, container, false)
+
+    }
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+
+        val binding = FragmentAddBinding.bind(view)
+        val spinner = binding.spinner
+        var category : Transaction.Category = Transaction.Category.PEMBELIAN
+        val spinnerItems = resources.getStringArray(R.array.spinner_items)
+        val adapter = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_item, spinnerItems)
+        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
+        spinner.adapter = adapter
+
+        spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
+            override fun onItemSelected(parent: AdapterView<*>, view: View?, position: Int, id: Long) {
+                val selectedItem = spinnerItems[position]
+                when(selectedItem){
+                    "Pembelian" -> category = Transaction.Category.PEMBELIAN
+                    "Penjualan" -> category = Transaction.Category.PENJUALAN
+                }
+                d("SELECTED FRAGMET","Selected item: $selectedItem")
+            }
+
+            override fun onNothingSelected(parent: AdapterView<*>) {
+                // Do nothing
+            }
+        }
+
+        binding.submitButton.setOnClickListener{
+
+            val judul = binding.judulTransaksiInput.text.toString()
+            val nominalText = binding.nominalTransaksiInput.text.toString()
+            try{
+                val nominalNum = BigDecimal(nominalText)
+                viewModel._onEvent(TransactionEvent.SetNominal(nominalNum))
+
+            }catch (e : NumberFormatException){
+                e.printStackTrace()
+            }
+
+            val lokasiText = binding.lokasiInput.text.toString()
+
+            val location : Location? = client.getLocationFromName(lokasiText)
+            if(location != null){
+                d("ADD FRAGMENT","${location.longitude} ${location.latitude}")
+                viewModel._onEvent(TransactionEvent.SetLokasi(Transaction.Position(location.latitude,location.longitude)))
+
+            }
+
+
+            viewModel._onEvent(TransactionEvent.SetJudul(judul))
+            viewModel._onEvent(TransactionEvent.SetKategori(category))
+            viewModel._onEvent(TransactionEvent.SaveTransaction)
+
+            d("FRAGMENT STATE","${viewModel.state.value.toString()}")
+        }
+
+    }
+
+    override fun onActivityCreated(savedInstanceState: Bundle?) {
+        super.onActivityCreated(savedInstanceState)
+        // TODO: Use the ViewModel
+
+    }
+
+}
\ 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 c46e2a10589b17c307bf66acd287947d7cafcd5d..81cc47e3f6885ef7f200c1b0b26e06c959f2bde5 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,25 +1,36 @@
 package com.example.bondoman.ui.cart
 
-import android.Manifest
-import android.content.pm.PackageManager
+import android.annotation.SuppressLint
+import android.content.Context
 import android.location.Location
 import android.os.Bundle
 import android.util.Log
+import android.util.Log.d
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
-import androidx.core.app.ActivityCompat
+import android.widget.Button
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.activityViewModels
+import androidx.lifecycle.lifecycleScope
 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.example.bondoman.services.LocationClient
+import com.example.bondoman.services.LocationDefault
+import com.example.bondoman.services.TransactionState
 import com.google.android.gms.location.LocationServices
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.MainScope
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.flow.observeOn
+import kotlinx.coroutines.launch
 import java.math.BigDecimal
 import java.time.LocalDate
+import kotlin.coroutines.CoroutineContext
 
 
 private const val ARG_PARAM1 = "param1"
@@ -33,23 +44,49 @@ 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  var transactions = ArrayList<Transaction>()
     private val viewModel by activityViewModels<TransactionViewModel>()
-    private lateinit var fusedLocationClient: FusedLocationProviderClient
+    private lateinit var client : LocationClient
+    private lateinit var adapter: CartAdapter
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         arguments?.let {
             param1 = it.getString(ARG_PARAM1)
             param2 = it.getString(ARG_PARAM2)
         }
+        adapter = CartAdapter(transactions)
+        CoroutineScope(lifecycleScope.coroutineContext).launch{
+            runningBackgroundUpdateUI(adapter)
+        }
+
+    }
+
+
+    override fun onAttach(context: Context) {
+        super.onAttach(context)
+        client = LocationDefault(requireContext(),LocationServices.getFusedLocationProviderClient(requireActivity()))
+
+    }
+
+    @SuppressLint("NotifyDataSetChanged")
+    suspend fun runningBackgroundUpdateUI(adapter: CartAdapter){
+        viewModel.transactions.value.collect { transactions ->
+            this.transactions.clear()
+            this.transactions.addAll(
+                ArrayList(transactions)
+            )
+            d("ON CREATED FROM FRAGMENT", transactions.toString())
+        }
+        adapter.notifyDataSetChanged()
     }
 
     fun initDummy() {
-        val local = Location("")
+        val local = Transaction.Position(0.0,0.0)
         Log.d(
             "DEBUG LOKASI", "Current location is \n" + "lat : ${local.latitude}\n" +
                     "long : ${local.longitude}\n" + "fetched at ${System.currentTimeMillis()}"
         )
+        d("From Fragment",transactions.toString())
         transactions.add(
             Transaction(
                 1, "Warteg", BigDecimal(10000), Transaction.Category.PEMBELIAN, local,
@@ -71,23 +108,35 @@ class CartFragment : Fragment() {
 //        d("DEBUG",viewModel.state.value.toString())
     }
 
+
     override fun onCreateView(
         inflater: LayoutInflater, container: ViewGroup?,
         savedInstanceState: Bundle?
     ): View? {
         // Inflate the layout for this fragment
+
         return inflater.inflate(R.layout.fragment_cart, container, false)
     }
 
+    suspend fun printLocation() {
+        val loc : Location = client.getLocationUpdates()
+        d("Location","${loc.longitude} ${loc.latitude}")
+    }
+
     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
-
+        val button: Button = view.findViewById<Button>(R.id.addtrans)
+        button.setOnClickListener {
+            val fragmentManager = parentFragmentManager
+            fragmentManager
+                .beginTransaction()
+                .replace(R.id.main_frame_layout, AddFragment())
+                .commit();
+        }
     }
 
 
diff --git a/app/src/main/res/drawable/ic_my_icon.xml b/app/src/main/res/drawable/ic_my_icon.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a8b409b1d1a67ab9d6be93a1920501644837a571
--- /dev/null
+++ b/app/src/main/res/drawable/ic_my_icon.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+</selector>
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_add.xml b/app/src/main/res/layout/fragment_add.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ca10141c8e2d0d4fc3b0e7df5999883e6fba1e9c
--- /dev/null
+++ b/app/src/main/res/layout/fragment_add.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".ui.cart.AddFragment">
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical"
+        android:gravity="center"
+        >
+        <EditText
+            android:id="@+id/judulTransaksiInput"
+            android:layout_width="276dp"
+            android:layout_height="48dp"
+            android:background="@drawable/rounded_div"
+            android:text="Judul Transaksi"
+        />
+
+        <Spinner
+            android:id="@+id/spinner"
+            android:layout_width="276dp"
+            android:layout_height="48dp"
+            android:prompt="@string/spinner_prompt"/>
+
+        <EditText
+            android:id="@+id/nominalTransaksiInput"
+            android:layout_width="276dp"
+            android:layout_height="48dp"
+            android:background="@drawable/rounded_div"
+            android:text="Nominal"
+        />
+
+        <EditText
+            android:id="@+id/lokasiInput"
+            android:layout_width="276dp"
+            android:layout_height="48dp"
+            android:background="@drawable/rounded_div"
+            android:text="Lokasi"
+        />
+        <Button
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Submit"
+            android:layout_marginTop="12dp"
+            android:id="@+id/submitButton"
+            />
+
+
+
+    </LinearLayout>
+
+</FrameLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_cart.xml b/app/src/main/res/layout/fragment_cart.xml
index aa56e30c9db13a3a6684b4a65beb1e800d1c93db..2591d9d88c509688543aaf86c9d6624f727050be 100644
--- a/app/src/main/res/layout/fragment_cart.xml
+++ b/app/src/main/res/layout/fragment_cart.xml
@@ -4,14 +4,28 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     tools:context=".ui.cart.CartFragment">
-
-    <!-- TODO: Update blank fragment layout -->
-    <androidx.recyclerview.widget.RecyclerView
-        android:id="@+id/rclist"
+    <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        tools:listitem="@layout/item_chart"
-        tools:itemCount="1"
+        android:orientation="vertical"
+        android:id="@+id/main"
+        >
+        <Button
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="add"
+            android:id="@+id/addtrans"
+            />
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/rclist"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            tools:listitem="@layout/item_chart"
+            tools:itemCount="1"
+            android:layout_marginBottom="60dp"
 
-        />
+            />
+
+    </LinearLayout>
+    <!-- TODO: Update blank fragment layout -->
 </FrameLayout>
\ 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 ae9dec8a6782bbfb750d001d606f41b7c8580347..5bd3bf257bbdfe76fe04c2278c9a2d66d7eb41ac 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -8,4 +8,10 @@
     <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>
+    <string name="spinner_prompt">Select an item</string>
+
+    <string-array name="spinner_items">
+        <item>Pembelian</item>
+        <item>Penjualan</item>
+    </string-array>
 </resources>
\ No newline at end of file