diff --git a/app/src/main/java/com/example/bondoyap/MainActivity.kt b/app/src/main/java/com/example/bondoyap/MainActivity.kt index 5dccf720c62fa19893068bd478242e6466492047..5ac8d1fb73b41a0e5ace944a96de93b533fa7169 100644 --- a/app/src/main/java/com/example/bondoyap/MainActivity.kt +++ b/app/src/main/java/com/example/bondoyap/MainActivity.kt @@ -14,6 +14,7 @@ import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.setupActionBarWithNavController import androidx.navigation.ui.setupWithNavController import com.example.bondoyap.databinding.ActivityMainBinding +import com.example.bondoyap.service.NetworkObserver import com.example.bondoyap.service.api.Constants import com.example.bondoyap.service.api.Constants.SHARED_PREFS_NAME import com.example.bondoyap.service.jwt.JwtService @@ -22,7 +23,6 @@ import com.example.bondoyap.ui.transactions.TransactionsApplication import com.example.bondoyap.ui.transactions.TransactionsBroadcastReceiver import com.example.bondoyap.ui.transactions.TransactionsViewModel import com.example.bondoyap.ui.transactions.TransactionsViewModelFactory -import com.example.bondoyap.service.NetworkObserver import com.google.android.material.bottomnavigation.BottomNavigationView class MainActivity : AppCompatActivity() { diff --git a/app/src/main/java/com/example/bondoyap/ui/scanner/ScannerFragment.kt b/app/src/main/java/com/example/bondoyap/ui/scanner/ScannerFragment.kt index 94353b0bae865f894553b87498625e90e009a073..f2049e0bd499ad41bbae2e8f2960ad0bfd4720cc 100644 --- a/app/src/main/java/com/example/bondoyap/ui/scanner/ScannerFragment.kt +++ b/app/src/main/java/com/example/bondoyap/ui/scanner/ScannerFragment.kt @@ -11,6 +11,7 @@ import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.Toast import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.camera.core.CameraSelector @@ -25,6 +26,7 @@ import androidx.navigation.NavController import androidx.navigation.fragment.findNavController import com.example.bondoyap.R import com.example.bondoyap.databinding.FragmentScannerBinding +import com.example.bondoyap.service.NetworkObserver import com.example.bondoyap.service.api.ApiClient import com.example.bondoyap.service.api.data.BillResponse import com.example.bondoyap.service.api.data.Items @@ -44,6 +46,7 @@ class ScannerFragment : Fragment() { private var _binding: FragmentScannerBinding? = null private val binding get() = _binding!! private lateinit var navController: NavController + private lateinit var networkObserver: NetworkObserver // Camera private var isBackCamera = true @@ -71,6 +74,8 @@ class ScannerFragment : Fragment() { val root: View = binding.root navController = findNavController() + networkObserver = NetworkObserver(requireContext()) + cacheDir = requireContext().cacheDir contentResolver = requireContext().contentResolver apiClient = ApiClient() @@ -86,7 +91,9 @@ class ScannerFragment : Fragment() { changeImage = registerForActivityResult( ActivityResultContracts.StartActivityForResult() ) { - if (it.resultCode == Activity.RESULT_OK) { + if (networkObserver.isConnected.value == false) { + Toast.makeText(requireContext(), "Tidak ada koneksi", Toast.LENGTH_SHORT).show() + } else if (it.resultCode == Activity.RESULT_OK) { try { val data = it.data val imgUri = data?.data ?: throw Exception("Image Uri is null") @@ -136,7 +143,11 @@ class ScannerFragment : Fragment() { binding.uploadButton.isClickable = false binding.uploadButton.setOnClickListener { - cameraImageFile?.let { it1 -> uploadPhoto(it1) } + if (networkObserver.isConnected.value == false) { + Toast.makeText(requireContext(), "Tidak ada koneksi", Toast.LENGTH_SHORT).show() + } else { + cameraImageFile?.let { it1 -> uploadPhoto(it1) } + } } return root diff --git a/app/src/main/java/com/example/bondoyap/ui/settings/SettingsFragment.kt b/app/src/main/java/com/example/bondoyap/ui/settings/SettingsFragment.kt index 4f415981d062e9ffd6f5e1af86636b4a812c704d..2f4af36937a36b9053169cffa0d4f60724940616 100644 --- a/app/src/main/java/com/example/bondoyap/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/com/example/bondoyap/ui/settings/SettingsFragment.kt @@ -1,137 +1,145 @@ -package com.example.bondoyap.ui.settings - -import android.app.AlertDialog -import android.content.DialogInterface -import android.content.Intent -import android.content.pm.PackageManager -import android.os.Bundle -import android.util.Log -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.Toast -import androidx.core.app.ActivityCompat -import androidx.core.content.ContextCompat -import androidx.fragment.app.Fragment -import androidx.fragment.app.viewModels -import androidx.lifecycle.ViewModelProvider -import androidx.localbroadcastmanager.content.LocalBroadcastManager -import com.example.bondoyap.databinding.FragmentSettingsBinding -import com.example.bondoyap.service.api.Constants.ACTION_RANDOMIZE_TRANSACTIONS -import com.example.bondoyap.ui.login.LoginActivity -import com.example.bondoyap.ui.transactions.TransactionsApplication -import com.example.bondoyap.ui.transactions.TransactionsViewModel -import com.example.bondoyap.ui.transactions.TransactionsViewModelFactory -import android.Manifest - -class SettingsFragment : Fragment() { - - private var _binding: FragmentSettingsBinding? = null - private val binding get() = _binding!! - private lateinit var settingsViewModel: SettingsViewModel - - private val transactionsViewModel: TransactionsViewModel by viewModels { - TransactionsViewModelFactory((requireContext().applicationContext as TransactionsApplication).repository) - } - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - _binding = FragmentSettingsBinding.inflate(inflater, container, false) - - if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(requireActivity(), arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), PERMISSION_REQUEST_CODE) - } - - return binding.root - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - val factory = context?.let { SettingsViewModelFactory(it) } - if (factory != null) { - settingsViewModel = ViewModelProvider(this, factory)[SettingsViewModel::class.java] - } else { - throw IllegalStateException("Context is null. Cannot create SettingsViewModelFactory.") - } - val textView = binding.textSettings - val logoutButton = binding.logoutButton - val randomButton = binding.randomTransactions - val saveButton = binding.saveTransactions - val sendButton = binding.sendTransactions - - settingsViewModel.getUser()?.let { user -> - val loggedInUserText = "Masuk dengan akun:\n ${user.email}" - textView.text = loggedInUserText - } - val appContext = context?.applicationContext - - logoutButton.setOnClickListener { - settingsViewModel.getUser() - settingsViewModel.logout() -// findNavController().navigate(R.id.navigation_login) - - val activity = requireActivity() - val intent = Intent(activity, LoginActivity::class.java) - Toast.makeText(appContext, "Logout Sukses!", Toast.LENGTH_SHORT).show() - activity.startActivity(intent) - activity.finish() - } - - randomButton.setOnClickListener { - Toast.makeText(appContext, "Membuat transaksi random ...", Toast.LENGTH_SHORT).show() - - val intent = Intent(ACTION_RANDOMIZE_TRANSACTIONS) - intent.putExtra("message", "Randomize from setting!") - LocalBroadcastManager.getInstance(requireContext()).sendBroadcast(intent) - - Log.d("BroadcastDebug", "Sending broadcast from SettingsFragment") - } - - val exporter = TransactionsExporter(transactionsViewModel, requireContext()) - - saveButton.setOnClickListener { - if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { - Toast.makeText(appContext, "Allow storage permission untuk menyimpan transaksi ke file xls/xlsx", Toast.LENGTH_SHORT).show() - } else { - val formats = arrayOf("XLS", "XLSX") - val builder = AlertDialog.Builder(requireContext()) - builder.setTitle("Pilih Format File") - builder.setItems(formats) { dialog: DialogInterface, which: Int -> - when (which) { - 0 -> { - Toast.makeText(appContext, "Menyimpan transaksi ke xls...", Toast.LENGTH_SHORT).show() - exporter.exportToXLS() - Toast.makeText(appContext, "Penyimpanan xls pada folder Documents berhasil...", Toast.LENGTH_SHORT).show() - } - 1 -> { - Toast.makeText(appContext, "Menyimpan transaksi ke xlsx...", Toast.LENGTH_SHORT).show() - exporter.exportToXLSX() - Toast.makeText(appContext, "Penyimpanan xlsx pada folder Documents berhasil...", Toast.LENGTH_SHORT).show() - } - } - dialog.dismiss() - } - builder.create().show() - } - } - - sendButton.setOnClickListener { - Toast.makeText(appContext, "Mengirimkan transaksi ...", Toast.LENGTH_SHORT).show() - //todo - } - - } - - companion object { - private const val PERMISSION_REQUEST_CODE = 1001 - } - - override fun onDestroyView() { - super.onDestroyView() - _binding = null - } +package com.example.bondoyap.ui.settings + +import android.app.AlertDialog +import android.content.DialogInterface +import android.content.Intent +import android.content.pm.PackageManager +import android.os.Bundle +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat +import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.example.bondoyap.databinding.FragmentSettingsBinding +import com.example.bondoyap.service.api.Constants.ACTION_RANDOMIZE_TRANSACTIONS +import com.example.bondoyap.service.NetworkObserver +import com.example.bondoyap.ui.login.LoginActivity +import com.example.bondoyap.ui.transactions.TransactionsApplication +import com.example.bondoyap.ui.transactions.TransactionsViewModel +import com.example.bondoyap.ui.transactions.TransactionsViewModelFactory +import android.Manifest + +class SettingsFragment : Fragment() { + + private var _binding: FragmentSettingsBinding? = null + private val binding get() = _binding!! + + private lateinit var settingsViewModel: SettingsViewModel + private lateinit var networkObserver: NetworkObserver + + private val transactionsViewModel: TransactionsViewModel by viewModels { + TransactionsViewModelFactory((requireContext().applicationContext as TransactionsApplication).repository) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentSettingsBinding.inflate(inflater, container, false) + networkObserver = NetworkObserver(requireContext()) + + if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(requireActivity(), arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), PERMISSION_REQUEST_CODE) + } + + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + val factory = context?.let { SettingsViewModelFactory(it) } + if (factory != null) { + settingsViewModel = ViewModelProvider(this, factory)[SettingsViewModel::class.java] + } else { + throw IllegalStateException("Context is null. Cannot create SettingsViewModelFactory.") + } + val textView = binding.textSettings + val logoutButton = binding.logoutButton + val randomButton = binding.randomTransactions + val saveButton = binding.saveTransactions + val sendButton = binding.sendTransactions + + settingsViewModel.getUser()?.let { user -> + val loggedInUserText = "Masuk dengan akun:\n ${user.email}" + textView.text = loggedInUserText + } + val appContext = context?.applicationContext + + logoutButton.setOnClickListener { + settingsViewModel.getUser() + settingsViewModel.logout() +// findNavController().navigate(R.id.navigation_login) + + val activity = requireActivity() + val intent = Intent(activity, LoginActivity::class.java) + Toast.makeText(appContext, "Logout Sukses!", Toast.LENGTH_SHORT).show() + activity.startActivity(intent) + activity.finish() + } + + randomButton.setOnClickListener { + Toast.makeText(appContext, "Membuat transaksi random ...", Toast.LENGTH_SHORT).show() + + val intent = Intent(ACTION_RANDOMIZE_TRANSACTIONS) + intent.putExtra("message", "Randomize from setting!") + LocalBroadcastManager.getInstance(requireContext()).sendBroadcast(intent) + + Log.d("BroadcastDebug", "Sending broadcast from SettingsFragment") + } + + val exporter = TransactionsExporter(transactionsViewModel, requireContext()) + + saveButton.setOnClickListener { + if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + Toast.makeText(appContext, "Allow storage permission untuk menyimpan transaksi ke file xls/xlsx", Toast.LENGTH_SHORT).show() + } else { + val formats = arrayOf("XLS", "XLSX") + val builder = AlertDialog.Builder(requireContext()) + builder.setTitle("Pilih Format File") + builder.setItems(formats) { dialog: DialogInterface, which: Int -> + when (which) { + 0 -> { + Toast.makeText(appContext, "Menyimpan transaksi ke xls...", Toast.LENGTH_SHORT).show() + exporter.exportToXLS() + Toast.makeText(appContext, "Penyimpanan xls pada folder Documents berhasil...", Toast.LENGTH_SHORT).show() + } + 1 -> { + Toast.makeText(appContext, "Menyimpan transaksi ke xlsx...", Toast.LENGTH_SHORT).show() + exporter.exportToXLSX() + Toast.makeText(appContext, "Penyimpanan xlsx pada folder Documents berhasil...", Toast.LENGTH_SHORT).show() + } + } + dialog.dismiss() + } + builder.create().show() + } + } + + sendButton.setOnClickListener { + if (networkObserver.isConnected.value == false) { + Toast.makeText(requireContext(), "Tidak ada koneksi", Toast.LENGTH_SHORT).show() + } else { + Toast.makeText(appContext, "Mengirimkan transaksi ...", Toast.LENGTH_SHORT).show() + //todo + } + } + + } + + companion object { + private const val PERMISSION_REQUEST_CODE = 1001 + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } } \ No newline at end of file