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