Advertisement
FernandoWarBr

Untitled

Jun 27th, 2025
957
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 6.79 KB | None | 0 0
  1. package com.fernando.locationweather.ui
  2.  
  3. import android.Manifest
  4. import android.content.Intent
  5. import android.content.pm.PackageManager
  6. import android.net.Uri
  7. import android.os.Build
  8. import android.os.Bundle
  9. import android.provider.Settings
  10. import android.widget.Toast
  11. import androidx.activity.enableEdgeToEdge
  12. import androidx.activity.result.contract.ActivityResultContracts.RequestPermission
  13. import androidx.activity.viewModels
  14. import androidx.annotation.RequiresApi
  15. import androidx.annotation.RequiresPermission
  16. import androidx.appcompat.app.AlertDialog
  17. import androidx.appcompat.app.AppCompatActivity
  18. import androidx.core.view.ViewCompat
  19. import androidx.core.view.WindowInsetsCompat
  20. import com.fernando.locationweather.R
  21. import com.fernando.locationweather.databinding.ActivityMainBinding
  22. import com.fernando.locationweather.model.Coordinates
  23. import com.fernando.locationweather.ui.adapters.WeatherItemAdapter
  24. import com.fernando.locationweather.ui.viewmodels.WeatherViewModel
  25. import com.fernando.locationweather.ui.viewmodels.WeatherViewModel.PermissionState
  26. import com.google.android.gms.location.FusedLocationProviderClient
  27. import com.google.android.gms.location.LocationServices
  28. import dagger.hilt.android.AndroidEntryPoint
  29. import kotlin.math.roundToInt
  30.  
  31. @AndroidEntryPoint
  32. @RequiresApi(Build.VERSION_CODES.O)
  33. class MainActivity : AppCompatActivity() {
  34.     private var binding: ActivityMainBinding? = null
  35.     private val weatherViewModel: WeatherViewModel by viewModels()
  36.     private var fusedLocationProviderClient : FusedLocationProviderClient? = null
  37.     private var locationPermissionLauncher = registerForActivityResult(RequestPermission()) { isGranted ->
  38.         val isShowRequestPermissionDialog = shouldShowRequestPermissionRationale(LOCATION_PERMISSION)
  39.         weatherViewModel.onRequestLocationPermission(isGranted, isShowRequestPermissionDialog)
  40.     }
  41.  
  42.     companion object {
  43.         private const val LOCATION_PERMISSION = Manifest.permission.ACCESS_FINE_LOCATION
  44.     }
  45.  
  46.     @RequiresPermission(Manifest.permission.ACCESS_FINE_LOCATION)
  47.     override fun onCreate(savedInstanceState: Bundle?) {
  48.         super.onCreate(savedInstanceState)
  49.         enableEdgeToEdge()
  50.         binding = ActivityMainBinding.inflate(layoutInflater)
  51.         setContentView(binding?.root)
  52.         setupViewCompat()
  53.         initFusedLocationProviderClient()
  54.     }
  55.  
  56.     private fun initFusedLocationProviderClient() {
  57.         fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)
  58.     }
  59.  
  60.     private fun hasLocationPermission() : Boolean {
  61.         val hasAccessFineLocationPermission = checkSelfPermission(
  62.             Manifest.permission.ACCESS_FINE_LOCATION
  63.         ) == PackageManager.PERMISSION_GRANTED
  64.  
  65.         return hasAccessFineLocationPermission
  66.     }
  67.  
  68.     @RequiresPermission(Manifest.permission.ACCESS_FINE_LOCATION)
  69.     override fun onStart() {
  70.         super.onStart()
  71.         initObservers()
  72.         if (!hasLocationPermission()) {
  73.             requestLocationPermission()
  74.             return
  75.         }
  76.  
  77.         weatherViewModel.updateLocationPermissionToGranted()
  78.     }
  79.  
  80.     private fun requestLocationPermission() {
  81.         locationPermissionLauncher.launch(LOCATION_PERMISSION)
  82.     }
  83.  
  84.     private fun openAppSettings() {
  85.         val settingsIntent = Intent(
  86.             Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
  87.             Uri.fromParts("package", packageName, null))
  88.  
  89.         startActivity(settingsIntent)
  90.     }
  91.  
  92.     @RequiresPermission(Manifest.permission.ACCESS_FINE_LOCATION)
  93.     private fun initObservers() {
  94.         weatherViewModel.permissionState.observe(this) { permissionState ->
  95.             permissionState?.let { permissionStateNotNull ->
  96.                 when(permissionStateNotNull) {
  97.                     PermissionState.GRANTED -> {
  98.                         updateWeatherLocationInfo()
  99.                     }
  100.                     PermissionState.REQUEST_AGAIN -> {
  101.                         showRequestPermissionAgainDialog()
  102.                     }
  103.                     PermissionState.GO_TO_APP_SETTINGS -> {
  104.                         showGoToAppSettingsDialog()
  105.                     }
  106.                 }
  107.             }
  108.         }
  109.         weatherViewModel.weathers.observe(this) { weathers ->
  110.             val weatherItemAdapter = WeatherItemAdapter(weathers)
  111.             binding?.weathersRecyclerview?.adapter = weatherItemAdapter
  112.         }
  113.         weatherViewModel.weather.observe(this) { weather ->
  114.             binding?.apply {
  115.                 with(weather) {
  116.                     dayOfWeekText.text = dayOfWeek.fullName
  117.                     temperatureText.text = "${temperature.roundToInt()}º"
  118.                     locationText.text = location.formatWithStateAndCity()
  119.                 }
  120.             }
  121.         }
  122.     }
  123.  
  124.     private fun showGoToAppSettingsDialog() {
  125.         AlertDialog.Builder(this)
  126.             .setTitle("Permissão de localizção negada")
  127.             .setMessage("Para você usar o app, você precisa ativar a permissão de localização nas configurações do app")
  128.             .setCancelable(false)
  129.             .setPositiveButton("Abrir configurações") { dialog, _ ->
  130.                 dialog.dismiss()
  131.                 openAppSettings()
  132.             }
  133.             .setNegativeButton("Fechar o app") { dialog, _ ->
  134.                 dialog.dismiss()
  135.                 finish()
  136.             }.show()
  137.     }
  138.  
  139.     private fun showRequestPermissionAgainDialog() {
  140.         AlertDialog.Builder(this)
  141.             .setTitle("Permissão de localizção negada")
  142.             .setMessage("Para você usar o app, você precisa ter a permissão de localização ativada")
  143.             .setCancelable(false)
  144.             .setPositiveButton("Permitir") { dialog, _ ->
  145.                 dialog.dismiss()
  146.                 requestLocationPermission()
  147.             }
  148.             .setNegativeButton("Cancelar") { dialog, _ ->
  149.                 dialog.dismiss()
  150.                 weatherViewModel.onShowAlertAppSettings()
  151.             }.show()
  152.     }
  153.  
  154.  
  155.     @RequiresPermission(LOCATION_PERMISSION)
  156.     private fun updateWeatherLocationInfo() {
  157.         fusedLocationProviderClient?.lastLocation?.addOnSuccessListener { location ->
  158.             with(location) {
  159.                 weatherViewModel.onLocationCoordinatesChange(Coordinates(latitude, longitude))
  160.             }
  161.         }
  162.     }
  163.  
  164.     private fun setupViewCompat() {
  165.         ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
  166.             val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
  167.             v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
  168.             insets
  169.         }
  170.     }
  171.  
  172.     override fun onDestroy() {
  173.         super.onDestroy()
  174.         binding = null
  175.         fusedLocationProviderClient = null
  176.     }
  177. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement