diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6af41e4fa34f937edf91380e09889c5b58b90660..fdb9b01539681a4b95909795555e96fe9797427f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,6 +10,8 @@ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> + <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> + <application android:name=".BondomanApp" diff --git a/app/src/main/java/com/example/bondoman/ui/hub/scan/NetworkManager.kt b/app/src/main/java/com/example/bondoman/ui/hub/scan/NetworkManager.kt new file mode 100644 index 0000000000000000000000000000000000000000..efa52868be3c43cde19c2ab1d0a2ceded5264c93 --- /dev/null +++ b/app/src/main/java/com/example/bondoman/ui/hub/scan/NetworkManager.kt @@ -0,0 +1,46 @@ +package com.example.bondoman.ui.hub.scan + +import android.content.Context +import android.net.ConnectivityManager +import android.net.Network +import android.net.NetworkCapabilities +import android.net.NetworkRequest +import com.example.bondoman.viewmodel.scan.ScanViewModel + +class NetworkManager(private val context: Context, private val viewModel: ScanViewModel) : + ConnectivityManager.NetworkCallback() { + private val connectivityManager: ConnectivityManager by lazy { + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + } + + private fun isConnected(): Boolean = connectivityManager.activeNetworkInfo != null + + private fun updateViewModel() { + viewModel.isCameraBtnEnabled.postValue(isConnected()) + viewModel.isSelectBtnEnabled.postValue(isConnected()) + viewModel.showSnackbar.postValue(!isConnected()) + } + + fun activate() { + updateViewModel() + + connectivityManager.registerNetworkCallback( + NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) + .addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build(), this + ) + } + + fun deactivate() { + connectivityManager.unregisterNetworkCallback(this) + } + + override fun onLost(network: Network) { + super.onLost(network) + updateViewModel() + } + + override fun onAvailable(network: Network) { + super.onAvailable(network) + updateViewModel() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoman/ui/hub/scan/ScanFragment.kt b/app/src/main/java/com/example/bondoman/ui/hub/scan/ScanFragment.kt index 7cf78242d83b2fcfabf2cdb9c5eb8ab873a6de81..0c04485019659a207442a2f500f206677a6b3ddf 100644 --- a/app/src/main/java/com/example/bondoman/ui/hub/scan/ScanFragment.kt +++ b/app/src/main/java/com/example/bondoman/ui/hub/scan/ScanFragment.kt @@ -32,6 +32,7 @@ import com.example.bondoman.databinding.FragmentScanBinding import com.example.bondoman.services.SessionManager import com.example.bondoman.viewmodel.scan.ScanViewModel import com.example.bondoman.viewmodel.scan.ScanViewModelFactory +import com.google.android.material.snackbar.Snackbar import okhttp3.MediaType import okhttp3.RequestBody import java.io.ByteArrayOutputStream @@ -48,6 +49,9 @@ class ScanFragment : Fragment() { private lateinit var sessionManager: SessionManager private val scanDialog: ScanDialogFragment = ScanDialogFragment() + private lateinit var networkManager: NetworkManager + + private lateinit var snackbar: Snackbar private val activityResultLauncher = registerForActivityResult( ActivityResultContracts.RequestPermission() @@ -75,6 +79,22 @@ class ScanFragment : Fragment() { } } + private val cameraBtnObserver = Observer<Boolean> { + binding.imageCaptureButton.isEnabled = it + } + + private val selectBtnObserver = Observer<Boolean> { + binding.selectPhotoButton.isEnabled = it + } + + private val snackbarObserver = Observer<Boolean> { + if (it && this::snackbar.isInitialized) { + snackbar.show() + } else if (!it && this::snackbar.isInitialized) { + snackbar.dismiss() + } + } + companion object { private const val TAG = "ScanFragment" private const val CAMERA_PERMISSION = Manifest.permission.CAMERA @@ -93,10 +113,28 @@ class ScanFragment : Fragment() { scanViewModel.isCameraPermissionGranted.observe( viewLifecycleOwner, cameraPermissionObserver ) + scanViewModel.isSelectBtnEnabled.observe( + viewLifecycleOwner, cameraBtnObserver + ) + scanViewModel.isSelectBtnEnabled.observe( + viewLifecycleOwner, selectBtnObserver + ) + scanViewModel.showSnackbar.observe( + viewLifecycleOwner, snackbarObserver + ) binding.imageCaptureButton.setOnClickListener(::onImageCaptureClick) binding.selectPhotoButton.setOnClickListener(::onSelectPhotoClick) + snackbar = Snackbar.make( + requireActivity().findViewById(android.R.id.content), + getString(R.string.connection_lost), + Snackbar.LENGTH_INDEFINITE + ) + + networkManager = NetworkManager(requireContext(), scanViewModel) + networkManager.activate() + cameraExecutor = Executors.newSingleThreadExecutor() sessionManager = SessionManager(requireActivity()) @@ -122,10 +160,12 @@ class ScanFragment : Fragment() { override fun onDestroyView() { super.onDestroyView() + networkManager.deactivate() cameraExecutor.shutdown() } + @Deprecated("") override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { if (requestCode == 1) { val image = data?.data diff --git a/app/src/main/java/com/example/bondoman/viewmodel/scan/ScanViewModel.kt b/app/src/main/java/com/example/bondoman/viewmodel/scan/ScanViewModel.kt index 6388817829373a27f7b4739be89db647d12db0ec..7cb3760e3325ae673b4e017d68a91cda1ebf36f0 100644 --- a/app/src/main/java/com/example/bondoman/viewmodel/scan/ScanViewModel.kt +++ b/app/src/main/java/com/example/bondoman/viewmodel/scan/ScanViewModel.kt @@ -8,6 +8,9 @@ import okhttp3.RequestBody class ScanViewModel(private val repository: TransactionRepository) : ViewModel() { val isCameraPermissionGranted = MutableLiveData(false) + val isCameraBtnEnabled = MutableLiveData(false) + val isSelectBtnEnabled = MutableLiveData(false) + val showSnackbar = MutableLiveData(false) suspend fun uploadNota(imageReqBody: RequestBody, token: String): List<TransactionEntity> { return repository.postUploadNota(imageReqBody, token) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b1c61b468ea5a87f6ba1e1fe76a8492890de43bb..a1aaa41b9829917e02c3f4b87972195917cea65f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -76,6 +76,8 @@ <string name="get_latest_location">Get latest location</string> <string name="delete_location">Delete location</string> <string name="no_location_data">No location data</string> + + <string name="connection_lost">Connection Lost</string> <string name="type_your_email">Type your email...</string> <string name="type_your_password">Type your password...</string> <string name="type_transaction_title">Type transaction title...</string>