diff --git a/bondoman/app/build.gradle.kts b/bondoman/app/build.gradle.kts index cea3e25506803501e9b55df62bebc67cb2c05a60..8c20d05f24cff94ec9de2420d3699a4106040f47 100644 --- a/bondoman/app/build.gradle.kts +++ b/bondoman/app/build.gradle.kts @@ -53,6 +53,7 @@ dependencies { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9") implementation("androidx.room:room-ktx:2.6.1") implementation("androidx.room:room-common:2.6.1") + implementation ("com.google.android.gms:play-services-location:18.0.0") kapt("androidx.room:room-compiler:2.6.1") testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") diff --git a/bondoman/app/src/main/AndroidManifest.xml b/bondoman/app/src/main/AndroidManifest.xml index 8c247b9c0976e8c5eb0f3e6e0a7e2252ebd84faf..46489d07c6392a30b1dd5c169103b33b3de2a672 100644 --- a/bondoman/app/src/main/AndroidManifest.xml +++ b/bondoman/app/src/main/AndroidManifest.xml @@ -9,6 +9,8 @@ <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.INTERNET" /> + <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> + <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <application android:allowBackup="true" diff --git a/bondoman/app/src/main/java/com/example/bondoman/AddTransactionPage.kt b/bondoman/app/src/main/java/com/example/bondoman/AddTransactionPage.kt index e1b5be27b436195d6a1eb1e3f2b3be17d02d7fe0..da4ce6081dc0c8ed4268ba2680af8aec8af0ea28 100644 --- a/bondoman/app/src/main/java/com/example/bondoman/AddTransactionPage.kt +++ b/bondoman/app/src/main/java/com/example/bondoman/AddTransactionPage.kt @@ -1,9 +1,18 @@ package com.example.bondoman +import android.annotation.SuppressLint import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter +import android.content.pm.PackageManager +import android.Manifest +import android.location.Address +import android.location.Geocoder +import android.provider.Settings +import android.location.Location +import androidx.core.content.ContextCompat +import android.location.LocationManager import android.os.Bundle import android.util.Log import android.view.View @@ -12,16 +21,21 @@ import android.widget.Button import android.widget.EditText import android.widget.RadioButton import android.widget.RadioGroup -import androidx.core.content.ContentProviderCompat +import android.widget.Toast +import androidx.constraintlayout.motion.widget.Debug.getLocation +import androidx.core.app.ActivityCompat +import androidx.core.location.LocationManagerCompat.requestLocationUpdates import androidx.fragment.app.FragmentTransaction import androidx.localbroadcastmanager.content.LocalBroadcastManager -import com.example.bondoman.retrofit.Retrofit -import com.example.bondoman.retrofit.endpoint.EndpointCheckExpiry -import com.example.bondoman.retrofit.request.CheckExpiryRequest import com.example.bondoman.room.Transaction import com.example.bondoman.room.TransactionDB import com.example.bondoman.utils.AuthManager import com.example.bondoman.utils.RandomizeTransaction +import com.google.android.gms.location.FusedLocationProviderClient +import com.google.android.gms.location.LocationCallback +import com.google.android.gms.location.LocationRequest +import com.google.android.gms.location.LocationResult +import com.google.android.gms.location.LocationServices import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @@ -53,7 +67,11 @@ class AddTransactionPage : Fragment(R.layout.fragment_add_transaction) { private lateinit var field_kategori: RadioGroup private lateinit var field_lokasi: EditText private lateinit var back_add: Button + private lateinit var curr_loc: Button val db by lazy { TransactionDB(requireContext()) } + private lateinit var fusedLocationClient: FusedLocationProviderClient + private val permissionId = 123 + private val randomizeReceiver = RandomizeTransaction() @@ -66,6 +84,10 @@ class AddTransactionPage : Fragment(R.layout.fragment_add_transaction) { field_kategori = view.findViewById(R.id.field_kategori) as RadioGroup field_lokasi = view.findViewById(R.id.field_lokasi) as EditText back_add = view.findViewById(R.id.back_add) + curr_loc = view.findViewById(R.id.curr_loc) + fusedLocationClient = LocationServices.getFusedLocationProviderClient(requireContext()) + + requestLocationUpdates() if (RandomizeTransaction.shouldRandomizePrice) field_nominal.setText(RandomizeTransaction.randomPrice.toString()) setUpListener() @@ -86,7 +108,104 @@ class AddTransactionPage : Fragment(R.layout.fragment_add_transaction) { LocalBroadcastManager.getInstance(requireContext()).unregisterReceiver(randomizeReceiver) } + @SuppressLint("MissingPermission", "SetTextI18n") + private fun getLocation() { + if (checkPermissions()) { + Log.d("Address", "check permission ok") + if (isLocationEnabled()) { + Log.d("Address", "location ok") + fusedLocationClient.lastLocation.addOnCompleteListener(requireActivity()) { task -> + val location: Location? = task.result +// Log.d("Address", "Task: ${task.result}") + if (location != null) { +// Log.d("Address", "check location not null ok") + val geocoder = Geocoder(requireContext(), Locale.getDefault()) + val list: List<Address>? = + geocoder.getFromLocation(location.latitude, location.longitude, 1) + if (list != null && list.isNotEmpty()) { +// Log.d("Address", "check not empty ok") + val address = list[0] + view?.apply { + field_lokasi.setText(address.getAddressLine(0)) +// Log.d("Address", "Latitdue: ${address.latitude}") + Log.d("Address", "Lokasi: ${address.getAddressLine(0)}") + } + } else { +// Log.d("Address", "gapunya permission ok") + Toast.makeText(requireContext(), "Address not found", Toast.LENGTH_SHORT).show() + } + } + } + } else { + Log.d("Address", "chayon ok") + Toast.makeText(requireContext(), "Please turn on location", Toast.LENGTH_LONG).show() + val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS) + startActivity(intent) + } + } else { + Log.d("Address", "clohk") + requestPermissions() + } + } + + private fun checkPermissions(): Boolean { + return (ContextCompat.checkSelfPermission( + requireContext(), + Manifest.permission.ACCESS_COARSE_LOCATION + ) == PackageManager.PERMISSION_GRANTED && + ContextCompat.checkSelfPermission( + requireContext(), + Manifest.permission.ACCESS_FINE_LOCATION + ) == PackageManager.PERMISSION_GRANTED) + } + + private fun requestPermissions() { + requestPermissions( + arrayOf( + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION + ), + permissionId + ) + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array<String>, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + if (requestCode == permissionId) { + if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) { + getLocation() + } + } + } + @SuppressLint("MissingPermission") + private fun requestLocationUpdates() { + val locationRequest = LocationRequest.create()?.apply { + interval = 10000 // Update interval in milliseconds + fastestInterval = 5000 // Fastest update interval in milliseconds + priority = LocationRequest.PRIORITY_HIGH_ACCURACY + } + + fusedLocationClient.requestLocationUpdates(locationRequest, object : LocationCallback() { + override fun onLocationResult(locationResult: LocationResult?) { + locationResult ?: return + for (location in locationResult.locations) { + // Handle location updates here + Log.d("Location", "New Location: ${location.latitude}, ${location.longitude}") + } + } + }, null) + } + private fun isLocationEnabled(): Boolean { + val locationManager = requireContext().getSystemService(Context.LOCATION_SERVICE) as LocationManager + return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled( + LocationManager.NETWORK_PROVIDER + ) + } private fun setUpListener() { add_button.setOnClickListener { @@ -134,6 +253,12 @@ class AddTransactionPage : Fragment(R.layout.fragment_add_transaction) { .replace(R.id.frame_layout, transactionPageFragment) .commit() } + + curr_loc.setOnClickListener { + getLocation() + Log.d("Button", "udah di klik") + } + } override fun onDestroyView() { diff --git a/bondoman/app/src/main/java/com/example/bondoman/EditPage.kt b/bondoman/app/src/main/java/com/example/bondoman/EditPage.kt index c47388416a97655793db2954421b3773d336d1ab..df0e984a27d71e54682d749f244750d91ca927d3 100644 --- a/bondoman/app/src/main/java/com/example/bondoman/EditPage.kt +++ b/bondoman/app/src/main/java/com/example/bondoman/EditPage.kt @@ -51,6 +51,7 @@ private lateinit var db: TransactionDB } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + update_button = view.findViewById(R.id.update_button) delete_button = view.findViewById(R.id.delete_button) field_judul = view.findViewById(R.id.field_judul) as EditText @@ -92,7 +93,6 @@ private lateinit var db: TransactionDB fun setUpListener(){ update_button.setOnClickListener { - if (isNetworkAvailable()) { CoroutineScope(Dispatchers.IO).launch { val transaction = db.transactionDao().findIdTrans(idTrans) if (transaction != null) { @@ -112,17 +112,12 @@ private lateinit var db: TransactionDB } } else { Log.d("EditPage", "Transaction not found for id: $idTrans") - } } - } else { - Log.d("EditPage", "Network not available. Cannot update transaction.") - Toast.makeText(requireContext(), "Prikso jaringan internet sampeyan", Toast.LENGTH_SHORT).show() } } delete_button.setOnClickListener { - if (isNetworkAvailable()) { CoroutineScope(Dispatchers.IO).launch { val transaction = db.transactionDao().findIdTrans(idTrans) if (transaction != null) { @@ -135,11 +130,7 @@ private lateinit var db: TransactionDB Log.d("EditPage", "Transaction not found for id: $idTrans") } } - } else { - Log.d("EditPage", "Network not available. Cannot delete transaction.") - Toast.makeText(requireContext(), "Prikso jaringan internet sampeyan", Toast.LENGTH_SHORT).show() } - } back_edit.setOnClickListener { navigateBackToTransactionPage() @@ -152,12 +143,7 @@ private lateinit var db: TransactionDB requireActivity().supportFragmentManager.beginTransaction() .replace(R.id.frame_layout, transactionPageFragment) .commit() } - private fun isNetworkAvailable(): Boolean { - val connectivityManager = requireContext().getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager - val networkCapabilities = connectivityManager.activeNetwork ?: return false - val networkInfo = connectivityManager.getNetworkCapabilities(networkCapabilities) - return networkInfo != null && networkInfo.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - } + diff --git a/bondoman/app/src/main/java/com/example/bondoman/MainActivity.kt b/bondoman/app/src/main/java/com/example/bondoman/MainActivity.kt index 3db88f4e8e118477a3f2ef0fb84531ead1ac450b..4bf169159f7941f6749787a3790b4d1a3cd13548 100644 --- a/bondoman/app/src/main/java/com/example/bondoman/MainActivity.kt +++ b/bondoman/app/src/main/java/com/example/bondoman/MainActivity.kt @@ -1,5 +1,6 @@ package com.example.bondoman +import android.app.AlertDialog import android.content.BroadcastReceiver import android.content.Context import android.content.Intent @@ -10,6 +11,7 @@ import android.os.Build import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log +import android.widget.Button import android.widget.Toast import androidx.core.content.ContentProviderCompat.requireContext import com.example.bondoman.databinding.ActivityMainBinding @@ -27,12 +29,12 @@ import java.util.Base64 class MainActivity : AppCompatActivity() { lateinit var binding: ActivityMainBinding - private val db by lazy { TransactionDB(this) } - private lateinit var transactionRepository: TransactionRepository - private val networkChangeReceiver = object : BroadcastReceiver() { + private val networkStatusReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { - checkNetworkAndLoadTransactions() + if (!isNetworkAvailable()) { + showLostConnectionDialog() + } } } @@ -48,7 +50,8 @@ class MainActivity : AppCompatActivity() { binding.bottomNavigationView.setOnNavigationItemSelectedListener { menuItem -> when (menuItem.itemId) { - R.id.scan_cam -> replaceFragment(ScanPage(), HeaderScan()) + R.id.scan_cam -> {if(!isNetworkAvailable()){replaceFragment(NetworkLostPage(), HeaderScan())} + else{replaceFragment(ScanPage(), HeaderScan())}} R.id.graph -> replaceFragment(GraphPage(), HeaderGraf()) R.id.settings -> replaceFragment(SettingsPage(), HeaderSettings()) R.id.bill -> replaceFragment(TransactionPage(), HeaderTransaction()) @@ -58,62 +61,21 @@ class MainActivity : AppCompatActivity() { } } - override fun onStart() { - super.onStart() - registerNetworkChangeReceiver() - checkNetworkAndLoadTransactions() - } - - override fun onStop() { - super.onStop() - unregisterNetworkChangeReceiver() - } - - private fun registerNetworkChangeReceiver() { - registerReceiver(networkChangeReceiver, IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)) - } - - private fun unregisterNetworkChangeReceiver() { - unregisterReceiver(networkChangeReceiver) - } - - private fun checkNetworkAndLoadTransactions() { + private fun isNetworkAvailable(): Boolean { val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager - val networkCapabilities = connectivityManager.activeNetwork ?: return + val networkCapabilities = connectivityManager.activeNetwork ?: return false val networkInfo = connectivityManager.getNetworkCapabilities(networkCapabilities) - - if (networkInfo != null && networkInfo.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) { - loadTransactions() - } else { - Toast.makeText(this, "Koneksimu ilang. Nuduhake cache tumbas.", Toast.LENGTH_SHORT).show() - loadCachedTransactions() - } + return networkInfo != null && networkInfo.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) } - private fun loadTransactions() { - transactionRepository = TransactionRepositoryImplement(db.transactionDao(), this) - transactionRepository.setNIM() - CoroutineScope(Dispatchers.IO).launch { - try { - val transc = transactionRepository.getAllTransactions() - Log.d("MainActivity", "dbResponse: $transc") - } catch (e: Exception) { - Log.e("MainActivity", "Error loading transactions: ${e.message}") - } - } + override fun onStart() { + super.onStart() + registerReceiver(networkStatusReceiver, IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)) } - private fun loadCachedTransactions() { - transactionRepository = TransactionRepositoryImplement(db.transactionDao(), this) - transactionRepository.setNIM() - CoroutineScope(Dispatchers.IO).launch { - try { - val transc = transactionRepository.getAllTransactions() - Log.d("MainActivity", "Cached transactions: $transc") - } catch (e: Exception) { - Log.e("MainActivity", "Error loading cached transactions: ${e.message}") - } - } + override fun onStop() { + super.onStop() + unregisterReceiver(networkStatusReceiver) } fun replaceFragment(fragment: Fragment, header: Fragment) { @@ -127,4 +89,21 @@ class MainActivity : AppCompatActivity() { supportFragmentManager.executePendingTransactions() } + + fun showLostConnectionDialog(){ + val builder = AlertDialog.Builder(this) + val inflater = layoutInflater + val dialogView = inflater.inflate(R.layout.dialog_network_lost, null) + + val tryAgainButton = dialogView.findViewById<Button>(R.id.close_popup) + builder.setView(dialogView) + + val dialog = builder.create() + dialog.show() + + tryAgainButton.setOnClickListener { + dialog.dismiss() + } + } + } \ No newline at end of file diff --git a/bondoman/app/src/main/java/com/example/bondoman/NetworkLostPage.kt b/bondoman/app/src/main/java/com/example/bondoman/NetworkLostPage.kt new file mode 100644 index 0000000000000000000000000000000000000000..c6f787372d772b9fe52a5b5e1cde7daa4d18a50f --- /dev/null +++ b/bondoman/app/src/main/java/com/example/bondoman/NetworkLostPage.kt @@ -0,0 +1,44 @@ +package com.example.bondoman + +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 + +class NetworkLostPage : Fragment() { + // TODO: Rename and change types of parameters + private lateinit var back_transc: Button + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_network_lost_page, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + back_transc = view.findViewById(R.id.back_transc) + + setUpListener() + } + + fun setUpListener(){ + back_transc.setOnClickListener { + val transactionPageFragment = TransactionPage() + requireActivity().supportFragmentManager.beginTransaction() + .replace(R.id.frame_layout, transactionPageFragment) + .commit() + } + } + + +} \ No newline at end of file diff --git a/bondoman/app/src/main/java/com/example/bondoman/ScanPage.kt b/bondoman/app/src/main/java/com/example/bondoman/ScanPage.kt index 575da536a2a278fde4d86131826591b277d4d462..9a61635054660cc79558e1566dd2f91f2c256658 100644 --- a/bondoman/app/src/main/java/com/example/bondoman/ScanPage.kt +++ b/bondoman/app/src/main/java/com/example/bondoman/ScanPage.kt @@ -2,10 +2,13 @@ package com.example.bondoman import android.app.Activity import android.content.ContentValues +import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.graphics.Bitmap import android.graphics.Matrix +import android.net.ConnectivityManager +import android.net.NetworkCapabilities import android.net.Uri import android.os.Build import android.os.Bundle @@ -247,60 +250,72 @@ class ScanPage : Fragment() { } private fun sendImageToAPI(pathname: String) { - val token = getToken(requireContext()) - Log.d("Scan", "Token: $token") + if(isNetworkAvailable()) { - val retro = Retrofit.getInstance().create(EndpointScan::class.java) - Log.d("Scan", "pathname: ${pathname}") + val token = getToken(requireContext()) + Log.d("Scan", "Token: $token") - val file = File(pathname) - val requestBody = RequestBody.create(MediaType.parse("image/jpeg"), file) - val filePart = MultipartBody.Part.createFormData("file", file.name, requestBody) - Log.d("Scan", "filePart: ${filePart}") + val retro = Retrofit.getInstance().create(EndpointScan::class.java) + Log.d("Scan", "pathname: ${pathname}") - Toast.makeText(requireContext(), "Mroses gambar..", Toast.LENGTH_SHORT).show() + val file = File(pathname) + val requestBody = RequestBody.create(MediaType.parse("image/jpeg"), file) + val filePart = MultipartBody.Part.createFormData("file", file.name, requestBody) + Log.d("Scan", "filePart: ${filePart}") - lifecycleScope.launch { - try { - val response = retro.scan("Bearer $token", filePart) - Log.d("Scan", "Response: ${response}") - if (response.isSuccessful) { - val data = response.body() - if (data != null) { + Toast.makeText(requireContext(), "Mroses gambar..", Toast.LENGTH_SHORT).show() + + lifecycleScope.launch { + try { + val response = retro.scan("Bearer $token", filePart) + Log.d("Scan", "Response: ${response}") + if (response.isSuccessful) { + val data = response.body() + if (data != null) { // Log.d("Scan", "Success: ${data.items}") // Log.d("Scan", "Success: ${data}") - val items = data.items.items + val items = data.items.items // val singleItem = listOf(items) - val cleanedItems = mutableListOf<Item>() - for (item in items) { - val name = item.name + val cleanedItems = mutableListOf<Item>() + for (item in items) { + val name = item.name // Log.d("Scan", "Name: $name") - val price = item.price + val price = item.price // Log.d("Scan", "Price: $price") - val qty = item.qty + val qty = item.qty // Log.d("Scan", "Qty: $qty") - val newItem = Item(name, qty, price) - cleanedItems.add(newItem) + val newItem = Item(name, qty, price) + cleanedItems.add(newItem) + } + addToDatabase(cleanedItems) + } + } else { + val errorBody = response.errorBody()?.string() + if (!errorBody.isNullOrEmpty()) { + val errorMessage = errorBody + Toast.makeText(requireContext(), errorMessage, Toast.LENGTH_SHORT) + .show() } - addToDatabase(cleanedItems) - } - } - else { - val errorBody = response.errorBody()?.string() - if (!errorBody.isNullOrEmpty()) { - val errorMessage = errorBody - Toast.makeText(requireContext(), errorMessage, Toast.LENGTH_SHORT).show() } - } - } - catch (e: java.lang.Exception){ - Log.e("Scan", "Error: ${e.message}") - Toast.makeText(requireContext(), "Ana sing salah: ${e.message}", Toast.LENGTH_SHORT).show() + } catch (e: java.lang.Exception) { + Log.e("Scan", "Error: ${e.message}") + Toast.makeText( + requireContext(), + "Ana sing salah: ${e.message}", + Toast.LENGTH_SHORT + ).show() + } } } + else{ + val networkLostFragment = NetworkLostPage() + requireActivity().supportFragmentManager.beginTransaction() + .replace(R.id.frame_layout, networkLostFragment) + .commit() + } } @@ -353,6 +368,13 @@ class ScanPage : Fragment() { } } } + fun isNetworkAvailable(): Boolean { + val connectivityManager = requireContext().getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + val networkCapabilities = connectivityManager.activeNetwork ?: return false + val networkInfo = connectivityManager.getNetworkCapabilities(networkCapabilities) + + return networkInfo != null && networkInfo.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + } override fun onDestroyView() { super.onDestroyView() diff --git a/bondoman/app/src/main/java/com/example/bondoman/SettingsPage.kt b/bondoman/app/src/main/java/com/example/bondoman/SettingsPage.kt index 229367fdf0113c868924f72edeef161feb7fa499..326e196fd914e7abcdd1e72cfb059c8d884b13ac 100644 --- a/bondoman/app/src/main/java/com/example/bondoman/SettingsPage.kt +++ b/bondoman/app/src/main/java/com/example/bondoman/SettingsPage.kt @@ -40,6 +40,7 @@ class SettingsPage : Fragment() { private val randomizeReceiver = RandomizeTransaction() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } diff --git a/bondoman/app/src/main/java/com/example/bondoman/TransactionPage.kt b/bondoman/app/src/main/java/com/example/bondoman/TransactionPage.kt index 60340ee120747f8ae7081a46aa29698864cc06e8..8b461df0380eb25b3fd7543425c1cc0d0373daf8 100644 --- a/bondoman/app/src/main/java/com/example/bondoman/TransactionPage.kt +++ b/bondoman/app/src/main/java/com/example/bondoman/TransactionPage.kt @@ -13,6 +13,7 @@ import android.view.ViewGroup import android.widget.Button import android.widget.TextView import android.widget.Toast +import androidx.core.content.ContentProviderCompat.requireContext import androidx.fragment.app.FragmentTransaction import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.RecyclerView @@ -65,7 +66,6 @@ class TransactionPage : Fragment(R.layout.fragment_transaction_page), Transactio recyclerView.requestLayout() lifecycleScope.launch { - if (isNetworkAvailable()) { val transactions = withContext(Dispatchers.IO) { transactionRepository.getAllTransactions() } @@ -83,20 +83,12 @@ class TransactionPage : Fragment(R.layout.fragment_transaction_page), Transactio recyclerView.adapter = TransactionAdapter(transactions, this@TransactionPage) Log.d("TransactionPage", "recyclerView: ${recyclerView.adapter}") - } else { - Toast.makeText(requireContext(), "Koneksimu ilang. Nuduhake cahce tumbas.", Toast.LENGTH_SHORT).show() - loadCachedTransactions() - } } button.setOnClickListener { - if (isNetworkAvailable()) { val fragment = AddTransactionPage() val transaction : FragmentTransaction = requireFragmentManager().beginTransaction() transaction.replace(R.id.frame_layout, fragment).commit() - } else { - Toast.makeText(requireContext(), "Koneksimu ilang. Ora isa nambahke tumbas.", Toast.LENGTH_SHORT).show() - } } } fun saldo(list : List<Transaction>) : Double { @@ -137,48 +129,5 @@ class TransactionPage : Fragment(R.layout.fragment_transaction_page), Transactio .commit() } - fun isNetworkAvailable(): Boolean { - val connectivityManager = requireContext().getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager - val networkCapabilities = connectivityManager.activeNetwork ?: return false - val networkInfo = connectivityManager.getNetworkCapabilities(networkCapabilities) - - return networkInfo != null && networkInfo.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - } - - fun loadCachedTransactions() { - transactionRepository = TransactionRepositoryImplement(db.transactionDao(), requireContext()) - transactionRepository.setNIM() - lifecycleScope.launch { - try { - val transactions = withContext(Dispatchers.IO) { - transactionRepository.getAllTransactions() - } - Log.d("TransactionPage", "Cached transactions: $transactions") - - // Update UI on the main thread - withContext(Dispatchers.Main) { - updateUI(transactions) - } - } catch (e: Exception) { - Log.e("TransactionPage", "Error loading cached transactions: ${e.message}") - } - } - } - - private fun updateUI(transactions: List<Transaction>) { - val saldoText : TextView = requireView().findViewById<TextView>(R.id.duit) - val recyclerView: RecyclerView = requireView().findViewById(R.id.recyclerViewTransaction) - - val balance = saldo(transactions) - val text: String = if (balance >= 0) { - "Rp${balance.convert()}" - } else { - "-Rp${balance.convert().substring(1)}" - } - - saldoText.text = text - - recyclerView.adapter = TransactionAdapter(transactions, this@TransactionPage) - } } \ No newline at end of file diff --git a/bondoman/app/src/main/res/drawable/baseline_close_24.xml b/bondoman/app/src/main/res/drawable/baseline_close_24.xml new file mode 100644 index 0000000000000000000000000000000000000000..844b6b62ef1077c2d7e9c80107ebf7f47b432caf --- /dev/null +++ b/bondoman/app/src/main/res/drawable/baseline_close_24.xml @@ -0,0 +1,5 @@ +<vector android:height="24dp" android:tint="#000000" + android:viewportHeight="24" android:viewportWidth="24" + android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> + <path android:fillColor="@android:color/white" android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z"/> +</vector> diff --git a/bondoman/app/src/main/res/drawable/ic_launcher.png b/bondoman/app/src/main/res/drawable/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c525deb85570540669160d5f0bfd2f323ec4143a Binary files /dev/null and b/bondoman/app/src/main/res/drawable/ic_launcher.png differ diff --git a/bondoman/app/src/main/res/drawable/network_lost.png b/bondoman/app/src/main/res/drawable/network_lost.png new file mode 100644 index 0000000000000000000000000000000000000000..2c8e83f51b937b4c774786bbb0b349d18cdab23d Binary files /dev/null and b/bondoman/app/src/main/res/drawable/network_lost.png differ diff --git a/bondoman/app/src/main/res/layout/dialog_network_lost.xml b/bondoman/app/src/main/res/layout/dialog_network_lost.xml new file mode 100644 index 0000000000000000000000000000000000000000..900fed3d7cf66d3e80d0fcb8e171700031bd5cb3 --- /dev/null +++ b/bondoman/app/src/main/res/layout/dialog_network_lost.xml @@ -0,0 +1,48 @@ +<?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" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:background="@drawable/custom_popup" + android:padding="16dp" + > + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + android:id="@+id/dialogLayout" + android:orientation="vertical" + > + + <Button + android:id="@+id/close_popup" + android:layout_width="30dp" + android:layout_height="30dp" + android:background="@drawable/baseline_close_24" + android:layout_gravity="right"/> + <ImageView + android:id="@+id/img_lost" + android:layout_width="100dp" + android:layout_height="100dp" + android:layout_gravity="center" + android:src="@drawable/network_lost"/> + + <TextView + android:id="@+id/dialogTitle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/lost_network" + android:textAppearance="?android:attr/textAppearanceLarge" + android:textColor="@color/secondary" + android:fontFamily="@font/font_poppins" + android:layout_marginTop="16dp" + android:layout_gravity="center_horizontal"/> + + </LinearLayout> + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/bondoman/app/src/main/res/layout/fragment_add_transaction.xml b/bondoman/app/src/main/res/layout/fragment_add_transaction.xml index 8aef2e4ab82373a508961322e21b8d230c5b0018..1356715d8ca12fc65c628f46690f47a10ce550f6 100644 --- a/bondoman/app/src/main/res/layout/fragment_add_transaction.xml +++ b/bondoman/app/src/main/res/layout/fragment_add_transaction.xml @@ -79,7 +79,7 @@ android:background="@drawable/custom_field" android:fontFamily="@font/font_poppins" android:hint="Masukkan judul nominal transaksi Anda" - android:inputType="text" + android:inputType="number" android:padding="12sp" android:textSize="14sp" app:layout_constraintEnd_toEndOf="parent" @@ -166,8 +166,26 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/label_lokasi" /> + </androidx.constraintlayout.widget.ConstraintLayout> + <Button + android:id="@+id/curr_loc" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="1dp" + android:background="@android:color/transparent" + android:fontFamily="@font/font_poppins" + android:textColor="@color/button" + android:text="Nggunakake lokasiku saiki" + android:textAllCaps="false" + app:layout_constraintBottom_toTopOf="@+id/add_button" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.136" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/constraintLayout" + app:layout_constraintVertical_bias="0.0" /> + <Button android:id="@+id/add_button" android:layout_width="wrap_content" diff --git a/bondoman/app/src/main/res/layout/fragment_edit_page.xml b/bondoman/app/src/main/res/layout/fragment_edit_page.xml index 750fb7fd54ae32610e4489b1b8edb82463073dc6..efa5a06ed3752900478ab78e01ca09374fbc6e75 100644 --- a/bondoman/app/src/main/res/layout/fragment_edit_page.xml +++ b/bondoman/app/src/main/res/layout/fragment_edit_page.xml @@ -59,7 +59,7 @@ android:background="@drawable/custom_field" android:fontFamily="@font/font_poppins" android:hint="Masukkan nominal transaksi Anda" - android:inputType="text" + android:inputType="number" android:padding="12dp" android:textSize="14sp" app:layout_constraintEnd_toEndOf="parent" diff --git a/bondoman/app/src/main/res/layout/fragment_network_lost_page.xml b/bondoman/app/src/main/res/layout/fragment_network_lost_page.xml new file mode 100644 index 0000000000000000000000000000000000000000..7b1d477a24081ef52ed45d5c9a1c806279d1e3e0 --- /dev/null +++ b/bondoman/app/src/main/res/layout/fragment_network_lost_page.xml @@ -0,0 +1,50 @@ +<?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="match_parent" + android:background="@color/primary" + tools:context=".NetworkLostPage"> + + <!-- TODO: Update blank fragment layout --> + + <ImageView + android:id="@+id/imageView" + android:layout_width="200dp" + android:layout_height="200dp" + android:layout_marginTop="160dp" + android:src="@drawable/network_lost" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.497" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <TextView + android:id="@+id/textView" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:fontFamily="@font/font_poppins" + android:text="Koneksi sampeyan ilang" + android:textSize="24sp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/imageView" /> + + <Button + android:id="@+id/back_transc" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:background="@drawable/custom_button" + android:fontFamily="@font/font_poppins" + android:padding="10dp" + android:text="Balik ke Tumbas" + android:textColor="@color/white" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.498" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/textView" + app:layout_constraintVertical_bias="0.289" /> + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/bondoman/app/src/main/res/mipmap-anydpi/ic_launcher.xml b/bondoman/app/src/main/res/mipmap-anydpi/ic_launcher.xml index 6f3b755bf50c6b03d8714a9c6184705e6a08389f..cd2e56314f1140f2481fff038c01d0abbe56ece6 100644 --- a/bondoman/app/src/main/res/mipmap-anydpi/ic_launcher.xml +++ b/bondoman/app/src/main/res/mipmap-anydpi/ic_launcher.xml @@ -1,6 +1,4 @@ <?xml version="1.0" encoding="utf-8"?> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> - <background android:drawable="@drawable/ic_launcher_background" /> - <foreground android:drawable="@drawable/ic_launcher_foreground" /> - <monochrome android:drawable="@drawable/ic_launcher_foreground" /> + <foreground android:drawable="@drawable/ic_launcher" /> </adaptive-icon> \ No newline at end of file diff --git a/bondoman/app/src/main/res/values/strings.xml b/bondoman/app/src/main/res/values/strings.xml index 94f0cdf9abe4c833e81e4a5e9c29dda73fd431f3..a85bb599fe702954842fedef90abdf19ae9f7977 100644 --- a/bondoman/app/src/main/res/values/strings.xml +++ b/bondoman/app/src/main/res/values/strings.xml @@ -56,5 +56,6 @@ <!-- Transaction Page --> <string name="transaction_balance">Arta Sampeyan</string> <string name="transaction_add">+</string> + <string name="lost_network">Koneksi sampeyan ilang</string> </resources> \ No newline at end of file