Manuel Lorenzo
07/27/2022, 9:40 AM@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private val placesViewModel: PlacesViewModel by viewModels()
private val locationPermissionRequest =
registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { permissionGranted ->
when {
permissionGranted -> placesViewModel.getNearbyPlaces(locationPermissionGiven = permissionGranted)
else -> showLocationPermissionDeniedExplanationDialog(permissionGranted)
}
}
// region Activity lifecycle
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
val adapter = PlacesAdapter()
val recyclerView = findViewById<RecyclerView>(R.id.placesRecyclerView)
val loadingProgressIndicator =
findViewById<CircularProgressIndicator>(R.id.loadingProgressIndicator)
recyclerView.adapter = adapter
lifecycleScope.launch {
observeChanges(loadingProgressIndicator, adapter)
}
checkForLocationPermissionsAndHandleResult()
}
private suspend fun observeChanges(
loadingProgressIndicator: CircularProgressIndicator,
adapter: PlacesAdapter
) {
placesViewModel.uiState.collect {
when {
it.loading -> loadingProgressIndicator.visibility = View.VISIBLE
it.places?.isNotEmpty() == true -> {
loadingProgressIndicator.visibility = View.GONE
adapter.submitList(it.places)
}
}
}
}
// endregion
// region Location permission related methods
/**
* Shows a dialog explaining that the [Manifest.permission.ACCESS_FINE_LOCATION] has been denied
* and that a default location will be used in order to fetch the nearby places.
*/
private fun showLocationPermissionDeniedExplanationDialog(permissionGranted: Boolean) {
AlertDialog.Builder(this)
.setMessage(getString(R.string.permission_denied_dialog_message))
.setPositiveButton(getString(R.string.permission_denied_dialog_positive_button_text)) { _, _ ->
placesViewModel.getNearbyPlaces(locationPermissionGiven = permissionGranted)
}
.show()
}
/**
* Check for the [Manifest.permission.ACCESS_FINE_LOCATION] permission.
* If the permission is granted, fetch the user's nearby places with [placesViewModel.getNearbyPlaces()].
* Otherwise, show a dialog explaining that because of denying the location permission, a default location will be used.
*/
private fun checkForLocationPermissionsAndHandleResult() {
when {
ContextCompat.checkSelfPermission(
this,
Manifest.permission.ACCESS_FINE_LOCATION
) == PackageManager.PERMISSION_GRANTED -> {
placesViewModel.getNearbyPlaces(locationPermissionGiven = true)
}
shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION) -> {
AlertDialog.Builder(this)
.setMessage(getString(R.string.permission_dialog_message_text))
.setNegativeButton(getString(R.string.permission_dialog_negative_button_text)) { dialog, _ ->
dialog.dismiss()
placesViewModel.getNearbyPlaces(locationPermissionGiven = false)
}
.setPositiveButton(getString(R.string.permission_dialog_positive_button_text)) { dialog, _ ->
locationPermissionRequest.launch(Manifest.permission.ACCESS_FINE_LOCATION)
dialog.dismiss()
placesViewModel.getNearbyPlaces(locationPermissionGiven = true)
}.show()
}
else -> {
locationPermissionRequest.launch(Manifest.permission.ACCESS_FINE_LOCATION)
}
}
}
// endregion
}