Livro 4 - Projeto da Previsão do Tempo

6. Adicionando a Lógica da Aplicação

6.1. Classe Weather

A classe Weather possui como variáveis os valores usados para representar as condições climáticas de um dia. Ela usará classes dos pacotes java.text e java.util para converter o carimbo de data/hora no nome do dia e também para formatar os números lidos em strings adequadas.

Adicione uma nova classe ao projeto e configura suas importações e variáveis como:

import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimeZone;

public class Weather {
public final String dayOfWeek;
public final String minTemp;
public final String maxTemp;
public final String humidity;
public final String description;
public final String iconURL;

6.1.1 Construtor

O construtor da classe inicializa as variáveis de instancia da classe.

public Weather(long timeStamp, double minTemp, double maxTemp, double himidity, String description, String iconName){
// NumberFormat para formatar temperaturas em double
// arredondadas para inteiros
NumberFormat numberFormat = NumberFormat.getInstance();
numberFormat.setMaximumFractionDigits(0);
this.dayOfWeek = convertTimeStampToDay(timeStamp);
this.minTemp = numberFormat.format(minTemp) + " \u00b0C";
this.maxTemp = numberFormat.format(maxTemp) + " \u00b0C";
this.humidity = NumberFormat.getPercentInstance().format( himidity/100.0);
this.description = description;
this.iconURL = "https://openweathermap.org/img/w/" + iconName + ".png";
}

O método convertTimeStampToDay será implementado logo a seguir. O objeto NumberFormat é usado para formatar o valor lido para as temperaturas em ºC sem vírgulas e a umidade para porcentagem (%). O caractere especial º é representado pelo código UTF-8 “\u00b0’. A variável iconURL usa uma template padrão para a criação da string. Essa string pré-definida é o endereço web onde a OpenWeatherMap disponibiliza os ícones usados para representar as condições climáticas. Por exemplo, uma imagem de nuvens com chuva, dia ensolarado, etc.

6.1.2 Método convertTimeStampToDay

O método convertTimeStampToDay serve para fazer a leitura de valor long, representando o número de segundos decorridos desde 1º de janeiro de 1970, GMT. A maneira padrão de representar tempo em sistemas Linux e, portanto, Android. 

private static String convertTimeStampToDay(long timeStamp) {
// Cria um objeto Calendar com os dados atuais
Calendar calendar = Calendar.getInstance();
// Configura a hora
calendar.setTimeInMillis(timeStamp * 1000);
// obtem o fuso horário do dispositivo
TimeZone tz = TimeZone.getDefault(); // ajusta a hora com o fuso horário obtido
calendar.add(Calendar.MILLISECOND, tz.getOffset(calendar.getTimeInMillis()));
// SimpleDataFormat retorna o nome do dia
SimpleDateFormat dataFormatter = new SimpleDateFormat("EEEE");
return dataFormatter.format(calendar.getTime());
}

Para fazer a conversão usamos um objeto Calendar. Assimilamos ao calendário a localização atual (método getInstance) para retornar as datas no idioma da localização atual do dispositivo e configurarmos o fuso horário para uma variável tz. Dizemos ao calendário em que dias estamos (método add) e usamos a classe SimpleDataFormat para obter apenas o nome do dia (parâmetro “EEEE”) onde se encontra o calendário.