diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0a842620b0d1eb4d5e5e51fdcbb05d8ed2da7063..6ed4aa1ed232a6886cec4a2c213be4e3f5b8aceb 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 d4e2f2c92d7bf0026309cfc33a94cba50c6c9f05..935b334ce82ac1725ba4c0c6eea055dbe0982543 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 @@ -31,6 +31,7 @@ import com.example.bondoman.database.repository.TransactionRepository import com.example.bondoman.databinding.FragmentScanBinding 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 @@ -46,6 +47,9 @@ class ScanFragment : Fragment() { private lateinit var cameraExecutor: ExecutorService private val scanDialog: ScanDialogFragment = ScanDialogFragment() + private lateinit var networkManager: NetworkManager + + private lateinit var snackbar: Snackbar private val activityResultLauncher = registerForActivityResult( ActivityResultContracts.RequestPermission() @@ -73,6 +77,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 @@ -91,10 +111,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() return binding.root @@ -118,10 +156,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 bac7cfc971ae67e9d7276145316c606bce9958ee..4ff1fa0402ba7f24d0bbad25a98faab57752aa7b 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): List<TransactionEntity> { return repository.postUploadNota(imageReqBody) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 691cd10ed1acd8bc4b13b50cded288c03989d4d4..6497dfad1943110a4b6b2ff15610b5e1eecb6e5f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -76,4 +76,6 @@ <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> </resources>