Drone3D-Team/Drone3D

View on GitHub
app/src/main/java/ch/epfl/sdp/drone3d/ui/weather/WeatherInfoActivity.kt

Summary

Maintainability
A
0 mins
Test Coverage
B
84%
/*
 * Copyright (C) 2021  Drone3D-Team
 * The license can be found in LICENSE at root of the repository
 */

package ch.epfl.sdp.drone3d.ui.weather

import android.graphics.Color
import android.os.Bundle
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import ch.epfl.sdp.drone3d.R
import ch.epfl.sdp.drone3d.model.weather.WeatherReport
import ch.epfl.sdp.drone3d.service.api.weather.WeatherService
import ch.epfl.sdp.drone3d.service.impl.weather.WeatherUtils
import ch.epfl.sdp.drone3d.ui.mission.ItineraryShowActivity
import com.mapbox.mapboxsdk.geometry.LatLng
import com.squareup.picasso.Picasso
import dagger.hilt.android.AndroidEntryPoint
import java.text.SimpleDateFormat
import java.util.*
import javax.inject.Inject


/**
 * An activity showing information about the weather for a mapping mission
 */
@AndroidEntryPoint
class WeatherInfoActivity : AppCompatActivity() {

    companion object {
        private const val KILOMETER = 1000
    }

    @Inject
    lateinit var weatherService: WeatherService

    private lateinit var dateInfo: TextView
    private lateinit var weatherDescription: TextView
    private lateinit var temperatureInfo: TextView
    private lateinit var humidityInfo: TextView
    private lateinit var windSpeedInfo: TextView
    private lateinit var visibilityInfo: TextView
    private lateinit var iconView: ImageView


    private lateinit var nonExistentMission: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_weather_info)

        dateInfo = findViewById(R.id.lastUpdated)
        weatherDescription = findViewById(R.id.infoWeatherDescription)
        temperatureInfo = findViewById(R.id.infoTemperature)
        humidityInfo = findViewById(R.id.infoHumidity)
        windSpeedInfo = findViewById(R.id.infoWindSpeed)
        visibilityInfo = findViewById(R.id.infoVisibility)
        iconView = findViewById(R.id.weather_icon)

        nonExistentMission = findViewById(R.id.nonExistentMission)
        nonExistentMission.visibility = View.GONE

        val location = intent.extras?.get(ItineraryShowActivity.LOCATION_INTENT_PATH) as LatLng?

        if (location != null) {
            weatherService.getWeatherReport(location).observe(this) { report ->
                setupWeatherInfo(report)
            }
        } else {
            setupInvalidMission()
        }
    }

    /**
     * Setup the weather information
     */
    private fun setupWeatherInfo(weatherReport: WeatherReport) {
        nonExistentMission.visibility = View.GONE

        setupTimeInfo(weatherReport)

        if(weatherReport.iconId != null) {
            val iconUrl = "http://openweathermap.org/img/w/" + weatherReport.iconId + ".png"
            Picasso.get().load(iconUrl).into(iconView)
        }

        weatherDescription.apply {
            text = weatherReport.description.capitalize(Locale.getDefault())
            if (!WeatherUtils.SAFE_CONDITIONS.contains(weatherReport.keywordDescription)) {
                setTextColor(Color.RED)
            }
        }

        temperatureInfo.apply {
            val temperature = weatherReport.temperature
            text = getString(R.string.info_temperature, temperature.toString())
            if (temperature <= WeatherUtils.MIN_TEMPERATURE) {
                setTextColor(Color.RED)
            }
        }

        humidityInfo.text = getString(R.string.info_humidity, weatherReport.humidity.toString())

        windSpeedInfo.apply {
            val windSpeed = weatherReport.windSpeed
            text = getString(R.string.info_wind_speed, windSpeed.toString())
            if (windSpeed >= WeatherUtils.MAX_WIND_SPEED) {
                setTextColor(Color.RED)
            }
        }

        visibilityInfo.apply {
            val visibility = weatherReport.visibility
            text = if (visibility >= KILOMETER) {
                getString(R.string.info_visibility_km, (visibility / KILOMETER).toString())
            } else {
                getString(R.string.info_visibility, visibility.toString())
            }
            if (visibility <= WeatherUtils.MIN_VISIBILITY) {
                setTextColor(Color.RED)
            }
        }
    }

    /**
     * Setup the time of the [weatherReport] with right format
     */
    private fun setupTimeInfo(weatherReport: WeatherReport){
        val updatedAt = weatherReport.updatedAt
        //Will show it in English. If we made the app available in all language, should use Locale.getDefault()
        val formatter = SimpleDateFormat("E dd MMM HH:mm:ss", Locale.US)
        dateInfo.text = formatter.format(updatedAt)
    }

    /**
     * Setup the view when weather checked for an invalid mission
     */
    private fun setupInvalidMission() {
        dateInfo.visibility = View.GONE
        weatherDescription.visibility = View.GONE
        temperatureInfo.visibility = View.GONE
        humidityInfo.visibility = View.GONE
        windSpeedInfo.visibility = View.GONE
        visibilityInfo.visibility = View.GONE
        nonExistentMission.visibility = View.VISIBLE
    }
}