Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.fernando.locationweather.ui
- import android.Manifest
- import android.content.Intent
- import android.content.pm.PackageManager
- import android.net.Uri
- import android.os.Build
- import android.os.Bundle
- import android.provider.Settings
- import android.widget.Toast
- import androidx.activity.enableEdgeToEdge
- import androidx.activity.result.contract.ActivityResultContracts.RequestPermission
- import androidx.activity.viewModels
- import androidx.annotation.RequiresApi
- import androidx.annotation.RequiresPermission
- import androidx.appcompat.app.AlertDialog
- import androidx.appcompat.app.AppCompatActivity
- import androidx.core.view.ViewCompat
- import androidx.core.view.WindowInsetsCompat
- import com.fernando.locationweather.R
- import com.fernando.locationweather.databinding.ActivityMainBinding
- import com.fernando.locationweather.model.Coordinates
- import com.fernando.locationweather.ui.adapters.WeatherItemAdapter
- import com.fernando.locationweather.ui.viewmodels.WeatherViewModel
- import com.fernando.locationweather.ui.viewmodels.WeatherViewModel.PermissionState
- import com.google.android.gms.location.FusedLocationProviderClient
- import com.google.android.gms.location.LocationServices
- import dagger.hilt.android.AndroidEntryPoint
- import kotlin.math.roundToInt
- @AndroidEntryPoint
- @RequiresApi(Build.VERSION_CODES.O)
- class MainActivity : AppCompatActivity() {
- private var binding: ActivityMainBinding? = null
- private val weatherViewModel: WeatherViewModel by viewModels()
- private var fusedLocationProviderClient : FusedLocationProviderClient? = null
- private var locationPermissionLauncher = registerForActivityResult(RequestPermission()) { isGranted ->
- val isShowRequestPermissionDialog = shouldShowRequestPermissionRationale(LOCATION_PERMISSION)
- weatherViewModel.onRequestLocationPermission(isGranted, isShowRequestPermissionDialog)
- }
- companion object {
- private const val LOCATION_PERMISSION = Manifest.permission.ACCESS_FINE_LOCATION
- }
- @RequiresPermission(Manifest.permission.ACCESS_FINE_LOCATION)
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- enableEdgeToEdge()
- binding = ActivityMainBinding.inflate(layoutInflater)
- setContentView(binding?.root)
- setupViewCompat()
- initFusedLocationProviderClient()
- }
- private fun initFusedLocationProviderClient() {
- fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)
- }
- private fun hasLocationPermission() : Boolean {
- val hasAccessFineLocationPermission = checkSelfPermission(
- Manifest.permission.ACCESS_FINE_LOCATION
- ) == PackageManager.PERMISSION_GRANTED
- return hasAccessFineLocationPermission
- }
- @RequiresPermission(Manifest.permission.ACCESS_FINE_LOCATION)
- override fun onStart() {
- super.onStart()
- initObservers()
- if (!hasLocationPermission()) {
- requestLocationPermission()
- return
- }
- weatherViewModel.updateLocationPermissionToGranted()
- }
- private fun requestLocationPermission() {
- locationPermissionLauncher.launch(LOCATION_PERMISSION)
- }
- private fun openAppSettings() {
- val settingsIntent = Intent(
- Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
- Uri.fromParts("package", packageName, null))
- startActivity(settingsIntent)
- }
- @RequiresPermission(Manifest.permission.ACCESS_FINE_LOCATION)
- private fun initObservers() {
- weatherViewModel.permissionState.observe(this) { permissionState ->
- permissionState?.let { permissionStateNotNull ->
- when(permissionStateNotNull) {
- PermissionState.GRANTED -> {
- updateWeatherLocationInfo()
- }
- PermissionState.REQUEST_AGAIN -> {
- showRequestPermissionAgainDialog()
- }
- PermissionState.GO_TO_APP_SETTINGS -> {
- showGoToAppSettingsDialog()
- }
- }
- }
- }
- weatherViewModel.weathers.observe(this) { weathers ->
- val weatherItemAdapter = WeatherItemAdapter(weathers)
- binding?.weathersRecyclerview?.adapter = weatherItemAdapter
- }
- weatherViewModel.weather.observe(this) { weather ->
- binding?.apply {
- with(weather) {
- dayOfWeekText.text = dayOfWeek.fullName
- temperatureText.text = "${temperature.roundToInt()}º"
- locationText.text = location.formatWithStateAndCity()
- }
- }
- }
- }
- private fun showGoToAppSettingsDialog() {
- AlertDialog.Builder(this)
- .setTitle("Permissão de localizção negada")
- .setMessage("Para você usar o app, você precisa ativar a permissão de localização nas configurações do app")
- .setCancelable(false)
- .setPositiveButton("Abrir configurações") { dialog, _ ->
- dialog.dismiss()
- openAppSettings()
- }
- .setNegativeButton("Fechar o app") { dialog, _ ->
- dialog.dismiss()
- finish()
- }.show()
- }
- private fun showRequestPermissionAgainDialog() {
- AlertDialog.Builder(this)
- .setTitle("Permissão de localizção negada")
- .setMessage("Para você usar o app, você precisa ter a permissão de localização ativada")
- .setCancelable(false)
- .setPositiveButton("Permitir") { dialog, _ ->
- dialog.dismiss()
- requestLocationPermission()
- }
- .setNegativeButton("Cancelar") { dialog, _ ->
- dialog.dismiss()
- weatherViewModel.onShowAlertAppSettings()
- }.show()
- }
- @RequiresPermission(LOCATION_PERMISSION)
- private fun updateWeatherLocationInfo() {
- fusedLocationProviderClient?.lastLocation?.addOnSuccessListener { location ->
- with(location) {
- weatherViewModel.onLocationCoordinatesChange(Coordinates(latitude, longitude))
- }
- }
- }
- private fun setupViewCompat() {
- ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
- val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
- v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
- insets
- }
- }
- override fun onDestroy() {
- super.onDestroy()
- binding = null
- fusedLocationProviderClient = null
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement