Team Updates

package nasa.spaceapps.dsos.activities;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.DashPathEffect;
import android.graphics.Paint;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import com.db.chart.Tools;
import com.db.chart.model.LineSet;
import com.db.chart.view.ChartView;
import com.db.chart.view.LineChartView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.TimeZone;
import nasa.spaceapps.dsos.R;
import nasa.spaceapps.dsos.models.Weather;
import nasa.spaceapps.dsos.tasks.ParseResult;
import nasa.spaceapps.dsos.utils.UnitConvertor;
public class GraphActivity extends AppCompatActivity {
SharedPreferences sp;
int theme;
ArrayList<Weather> weatherList = new ArrayList<>();
float minTemp = 100000;
float maxTemp = 0;
float minRain = 100000;
float maxRain = 0;
float minPressure = 100000;
float maxPressure = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
setTheme(theme = getTheme(prefs.getString("theme", "fresh")));
boolean darkTheme = theme == R.style.AppTheme_NoActionBar_Dark ||
theme == R.style.AppTheme_NoActionBar_Classic_Dark;
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_graph);
Toolbar toolbar = (Toolbar) findViewById(R.id.graph_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
if (darkTheme) {
toolbar.setPopupTheme(R.style.AppTheme_PopupOverlay_Dark);
}
sp = PreferenceManager.getDefaultSharedPreferences(GraphActivity.this);
String lastLongterm = sp.getString("lastLongterm", "");
if (parseLongTermJson(lastLongterm) == ParseResult.OK) {
temperatureGraph();
rainGraph();
pressureGraph();
} else {
Snackbar.make(findViewById(android.R.id.content), R.string.msg_err_parsing_json, Snackbar.LENGTH_LONG).show();
}
}
private void temperatureGraph() {
LineChartView lineChartView = (LineChartView) findViewById(R.id.graph_temperature);
// Data
LineSet dataset = new LineSet();
for (int i = 0; i < weatherList.size(); i++) {
float temperature = UnitConvertor.convertTemperature(Float.parseFloat(weatherList.get(i).getTemperature()), sp);
if (temperature < minTemp) {
minTemp = temperature;
}
if (temperature > maxTemp) {
maxTemp = temperature;
}
dataset.addPoint(getDateLabel(weatherList.get(i), i), (float) temperature);
}
dataset.setSmooth(false);
dataset.setColor(Color.parseColor("#FF5722"));
dataset.setThickness(4);
lineChartView.addData(dataset);
// Grid
Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setAntiAlias(true);
paint.setColor(Color.parseColor("#333333"));
paint.setPathEffect(new DashPathEffect(new float[]{10, 10}, 0));
paint.setStrokeWidth(1);
lineChartView.setGrid(ChartView.GridType.HORIZONTAL, paint);
lineChartView.setBorderSpacing(Tools.fromDpToPx(10));
lineChartView.setAxisBorderValues((int) (Math.round(minTemp)) - 1, (int) (Math.round(maxTemp)) + 1);
lineChartView.setStep(2);
lineChartView.setXAxis(false);
lineChartView.setYAxis(false);
lineChartView.show();
}
private void rainGraph() {
LineChartView lineChartView = (LineChartView) findViewById(R.id.graph_rain);
// Data
LineSet dataset = new LineSet();
for (int i = 0; i < weatherList.size(); i++) {
float rain = Float.parseFloat(weatherList.get(i).getRain());
if (rain < minRain) {
minRain = rain;
}
if (rain > maxRain) {
maxRain = rain;
}
dataset.addPoint(getDateLabel(weatherList.get(i), i), rain);
}
dataset.setSmooth(false);
dataset.setColor(Color.parseColor("#2196F3"));
dataset.setThickness(4);
lineChartView.addData(dataset);
// Grid
Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setAntiAlias(true);
paint.setColor(Color.parseColor("#333333"));
paint.setPathEffect(new DashPathEffect(new float[]{10, 10}, 0));
paint.setStrokeWidth(1);
lineChartView.setGrid(ChartView.GridType.HORIZONTAL, paint);
lineChartView.setBorderSpacing(Tools.fromDpToPx(10));
lineChartView.setAxisBorderValues(0, (int) (Math.round(maxRain)) + 1);
lineChartView.setStep(1);
lineChartView.setXAxis(false);
lineChartView.setYAxis(false);
lineChartView.show();
}
private void pressureGraph() {
LineChartView lineChartView = (LineChartView) findViewById(R.id.graph_pressure);
// Data
LineSet dataset = new LineSet();
for (int i = 0; i < weatherList.size(); i++) {
float pressure = UnitConvertor.convertPressure(Float.parseFloat(weatherList.get(i).getPressure()), sp);
if (pressure < minPressure) {
minPressure = pressure;
}
if (pressure > maxPressure) {
maxPressure = pressure;
}
dataset.addPoint(getDateLabel(weatherList.get(i), i), pressure);
}
dataset.setSmooth(true);
dataset.setColor(Color.parseColor("#4CAF50"));
dataset.setThickness(4);
lineChartView.addData(dataset);
// Grid
Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setAntiAlias(true);
paint.setColor(Color.parseColor("#333333"));
paint.setPathEffect(new DashPathEffect(new float[]{10, 10}, 0));
paint.setStrokeWidth(1);
lineChartView.setGrid(ChartView.GridType.HORIZONTAL, paint);
lineChartView.setBorderSpacing(Tools.fromDpToPx(10));
lineChartView.setAxisBorderValues((int) minPressure - 1, (int) maxPressure + 1);
lineChartView.setStep(2);
lineChartView.setXAxis(false);
lineChartView.setYAxis(false);
lineChartView.show();
}
public ParseResult parseLongTermJson(String result) {
int i;
try {
JSONObject reader = new JSONObject(result);
final String code = reader.optString("cod");
if ("404".equals(code)) {
return ParseResult.CITY_NOT_FOUND;
}
JSONArray list = reader.getJSONArray("list");
for (i = 0; i < list.length(); i++) {
Weather weather = new Weather();
JSONObject listItem = list.getJSONObject(i);
JSONObject main = listItem.getJSONObject("main");
JSONObject windObj = listItem.optJSONObject("wind");
weather.setWind(windObj.getString("speed"));
weather.setPressure(main.getString("pressure"));
weather.setHumidity(main.getString("humidity"));
JSONObject rainObj = listItem.optJSONObject("rain");
JSONObject snowObj = listItem.optJSONObject("snow");
if (rainObj != null) {
weather.setRain(MainActivity.getRainString(rainObj));
} else {
weather.setRain(MainActivity.getRainString(snowObj));
}
weather.setDate(listItem.getString("dt"));
weather.setTemperature(main.getString("temp"));
weatherList.add(weather);
}
} catch (JSONException e) {
Log.e("JSONException Data", result);
e.printStackTrace();
return ParseResult.JSON_EXCEPTION;
}
return ParseResult.OK;
}
String previous = "";
public String getDateLabel(Weather weather, int i) {
if ((i + 4) % 4 == 0) {
SimpleDateFormat resultFormat = new SimpleDateFormat("E");
resultFormat.setTimeZone(TimeZone.getDefault());
String output = resultFormat.format(weather.getDate());
if (!output.equals(previous)) {
previous = output;
return output;
} else {
return "";
}
} else {
return "";
}
}
private int getTheme(String themePref) {
switch (themePref) {
case "dark":
return R.style.AppTheme_NoActionBar_Dark;
case "black":
return R.style.AppTheme_NoActionBar_Black;
case "classic":
return R.style.AppTheme_NoActionBar_Classic;
case "classicdark":
return R.style.AppTheme_NoActionBar_Classic_Dark;
case "classicblack":
return R.style.AppTheme_NoActionBar_Classic_Black;
default:
return R.style.AppTheme_NoActionBar;
}
}
}
package nasa.spaceapps.dsos.activities;
import android.app.ProgressDialog;
import android.graphics.Typeface;
import android.location.LocationManager;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import nasa.spaceapps.dsos.models.Weather;
public class Main {
protected static final int MY_PERMISSIONS_ACCESS_FINE_LOCATION = 1;
// Time in milliseconds; only reload weather if last update is longer ago than this value
private static final int NO_UPDATE_REQUIRED_THRESHOLD = 300000;
private static Map<String, Integer> speedUnits = new HashMap<>(3);
private static Map<String, Integer> pressUnits = new HashMap<>(3);
private static boolean mappingsInitialised = false;
Typeface weatherFont;
Weather todayWeather = new Weather();
TextView todayTemperature;
TextView todayDescription;
TextView todayWind;
TextView todayPressure;
TextView todayHumidity;
TextView todaySunrise;
TextView todaySunset;
TextView lastUpdate;
TextView todayIcon;
ViewPager viewPager;
TabLayout tabLayout;
View appView;
LocationManager locationManager;
ProgressDialog progressDialog;
int theme;
boolean destroyed = false;
private List<Weather> longTermWeather = new ArrayList<>();
private List<Weather> longTermTodayWeather = new ArrayList<>();
private List<Weather> longTermTomorrowWeather = new ArrayList<>();
public String recentCity = "";
}
view raw Main.java hosted with ❤ by GitHub
package nasa.spaceapps.dsos.activities;
import android.Manifest;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.Typeface;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.provider.Settings;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TabLayout;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.text.InputType;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebView;
import android.widget.EditText;
import android.widget.TextView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import nasa.spaceapps.dsos.AlarmReceiver;
import nasa.spaceapps.dsos.Constants;
import nasa.spaceapps.dsos.R;
import nasa.spaceapps.dsos.adapters.ViewPagerAdapter;
import nasa.spaceapps.dsos.adapters.WeatherRecyclerAdapter;
import nasa.spaceapps.dsos.fragments.RecyclerViewFragment;
import nasa.spaceapps.dsos.models.Weather;
import nasa.spaceapps.dsos.tasks.GenericRequestTask;
import nasa.spaceapps.dsos.tasks.ParseResult;
import nasa.spaceapps.dsos.tasks.TaskOutput;
import nasa.spaceapps.dsos.utils.UnitConvertor;
import nasa.spaceapps.dsos.widgets.AbstractWidgetProvider;
import nasa.spaceapps.dsos.widgets.DashClockWeatherExtension;
public class MainActivity extends AppCompatActivity implements LocationListener {
protected static final int MY_PERMISSIONS_ACCESS_FINE_LOCATION = 1;
// Time in milliseconds; only reload weather if last update is longer ago than this value
private static final int NO_UPDATE_REQUIRED_THRESHOLD = 300000;
private static Map<String, Integer> speedUnits = new HashMap<>(3);
private static Map<String, Integer> pressUnits = new HashMap<>(3);
private static boolean mappingsInitialised = false;
Typeface weatherFont;
Weather todayWeather = new Weather();
TextView todayTemperature;
TextView todayDescription;
TextView todayWind;
TextView todayPressure;
TextView todayHumidity;
TextView todaySunrise;
TextView todaySunset;
TextView lastUpdate;
TextView todayIcon;
ViewPager viewPager;
TabLayout tabLayout;
TextView soslable;
TextView sosstat;
View appView;
LocationManager locationManager;
ProgressDialog progressDialog;
int theme;
boolean destroyed = false;
private List<Weather> longTermWeather = new ArrayList<>();
private List<Weather> longTermTodayWeather = new ArrayList<>();
private List<Weather> longTermTomorrowWeather = new ArrayList<>();
public String recentCity = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
// Initialize the associated SharedPreferences file with default values
PreferenceManager.setDefaultValues(this, R.xml.prefs, false);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
setTheme(theme = getTheme(prefs.getString("theme", "fresh")));
boolean darkTheme = theme == R.style.AppTheme_NoActionBar_Dark ||
theme == R.style.AppTheme_NoActionBar_Classic_Dark;
boolean blackTheme = theme == R.style.AppTheme_NoActionBar_Black ||
theme == R.style.AppTheme_NoActionBar_Classic_Black;
// Initiate activity
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scrolling);
appView = findViewById(R.id.viewApp);
progressDialog = new ProgressDialog(MainActivity.this);
// Load toolbar
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
if (darkTheme) {
toolbar.setPopupTheme(R.style.AppTheme_PopupOverlay_Dark);
} else if (blackTheme) {
toolbar.setPopupTheme(R.style.AppTheme_PopupOverlay_Black);
}
// Initialize textboxes
todayTemperature = (TextView) findViewById(R.id.todayTemperature);
todayDescription = (TextView) findViewById(R.id.todayDescription);
todayWind = (TextView) findViewById(R.id.todayWind);
todayPressure = (TextView) findViewById(R.id.todayPressure);
todayHumidity = (TextView) findViewById(R.id.todayHumidity);
todaySunrise = (TextView) findViewById(R.id.todaySunrise);
todaySunset = (TextView) findViewById(R.id.todaySunset);
lastUpdate = (TextView) findViewById(R.id.lastUpdate);
todayIcon = (TextView) findViewById(R.id.todayIcon);
weatherFont = Typeface.createFromAsset(this.getAssets(), "fonts/weather.ttf");
todayIcon.setTypeface(weatherFont);
soslable = (TextView) findViewById(R.id.soslbl);
sosstat = (TextView) findViewById(R.id.sos_statos);
// Initialize viewPager
viewPager = (ViewPager) findViewById(R.id.viewPager);
tabLayout = (TabLayout) findViewById(R.id.tabs);
destroyed = false;
initMappings();
// Preload data from cache
preloadWeather();
updateLastUpdateTime();
// Set autoupdater
AlarmReceiver.setRecurringAlarm(this);
}
public WeatherRecyclerAdapter getAdapter(int id) {
WeatherRecyclerAdapter weatherRecyclerAdapter;
if (id == 0) {
weatherRecyclerAdapter = new WeatherRecyclerAdapter(this, longTermTodayWeather);
} else if (id == 1) {
weatherRecyclerAdapter = new WeatherRecyclerAdapter(this, longTermTomorrowWeather);
} else {
weatherRecyclerAdapter = new WeatherRecyclerAdapter(this, longTermWeather);
}
return weatherRecyclerAdapter;
}
@Override
public void onStart() {
super.onStart();
updateTodayWeatherUI();
updateLongTermWeatherUI();
}
@Override
public void onResume() {
super.onResume();
if (getTheme(PreferenceManager.getDefaultSharedPreferences(this).getString("theme", "fresh")) != theme) {
// Restart activity to apply theme
overridePendingTransition(0, 0);
finish();
overridePendingTransition(0, 0);
startActivity(getIntent());
} else if (shouldUpdate() && isNetworkAvailable()) {
getTodayWeather();
getLongTermWeather();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
destroyed = true;
if (locationManager != null) {
try {
locationManager.removeUpdates(MainActivity.this);
} catch (SecurityException e) {
e.printStackTrace();
}
}
}
private void preloadWeather() {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
String lastToday = sp.getString("lastToday", "");
if (!lastToday.isEmpty()) {
new TodayWeatherTask(this, this, progressDialog).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "cachedResponse", lastToday);
}
String lastLongterm = sp.getString("lastLongterm", "");
if (!lastLongterm.isEmpty()) {
new LongTermWeatherTask(this, this, progressDialog).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "cachedResponse", lastLongterm);
}
}
private void getTodayWeather() {
new TodayWeatherTask(this, this, progressDialog).execute();
}
private void getLongTermWeather() {
new LongTermWeatherTask(this, this, progressDialog).execute();
}
private void searchCities() {
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle(this.getString(R.string.search_title));
final EditText input = new EditText(this);
input.setInputType(InputType.TYPE_CLASS_TEXT);
input.setMaxLines(1);
input.setSingleLine(true);
alert.setView(input, 32, 0, 32, 0);
alert.setPositiveButton(R.string.dialog_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
String result = input.getText().toString();
if (!result.isEmpty()) {
saveLocation(result);
}
}
});
alert.setNegativeButton(R.string.dialog_cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
// Cancelled
}
});
alert.show();
}
private void saveLocation(String result) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
recentCity = preferences.getString("city", Constants.DEFAULT_CITY);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("city", result);
editor.commit();
if (!recentCity.equals(result)) {
// New location, update weather
getTodayWeather();
getLongTermWeather();
}
}
private void aboutDialog() {
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("Forecastie");
final WebView webView = new WebView(this);
String about = "<p>1.6.1</p>" +
"<p>Developed for NASA Challange</p>" +
"<p>By <a href='mailto:gunaid@ymail.com'>Gunaid Bawazir</a> & Abdulaziz Alqahtani</p>" +
"<p>By using source of Tomas Martykan</p>" +
"<p>Data provided by <a href='https://openweathermap.org/'>OpenWeatherMap</a>, under the <a href='http://creativecommons.org/licenses/by-sa/2.0/'>Creative Commons license</a>" +
"<p>Icons are <a href='https://erikflowers.github.io/weather-icons/'>Weather Icons</a>, by <a href='http://www.twitter.com/artill'>Lukas Bischoff</a> and <a href='http://www.twitter.com/Erik_UX'>Erik Flowers</a>, under the <a href='http://scripts.sil.org/OFL'>SIL OFL 1.1</a> licence.";
TypedArray ta = obtainStyledAttributes(new int[]{android.R.attr.textColorPrimary, R.attr.colorAccent});
String textColor = String.format("#%06X", (0xFFFFFF & ta.getColor(0, Color.BLACK)));
String accentColor = String.format("#%06X", (0xFFFFFF & ta.getColor(1, Color.BLUE)));
ta.recycle();
about = "<style media=\"screen\" type=\"text/css\">" +
"body {\n" +
" color:" + textColor + ";\n" +
"}\n" +
"a:link {color:" + accentColor + "}\n" +
"</style>" +
about;
webView.setBackgroundColor(Color.TRANSPARENT);
webView.loadData(about, "text/html", "UTF-8");
alert.setView(webView, 32, 0, 32, 0);
alert.setPositiveButton(R.string.dialog_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
}
});
alert.show();
}
private String setWeatherIcon(int actualId, int hourOfDay) {
int id = actualId / 100;
String icon = "";
if (actualId == 800) {
if (hourOfDay >= 7 && hourOfDay < 20) {
icon = this.getString(R.string.weather_sunny);
} else {
icon = this.getString(R.string.weather_clear_night);
}
} else {
switch (id) {
case 2:
icon = this.getString(R.string.weather_thunder);
break;
case 3:
icon = this.getString(R.string.weather_drizzle);
break;
case 7:
icon = this.getString(R.string.weather_foggy);
break;
case 8:
icon = this.getString(R.string.weather_cloudy);
break;
case 6:
icon = this.getString(R.string.weather_snowy);
break;
case 5:
icon = this.getString(R.string.weather_rainy);
break;
}
}
return icon;
}
public static String getRainString(JSONObject rainObj) {
String rain = "0";
if (rainObj != null) {
rain = rainObj.optString("3h", "fail");
if ("fail".equals(rain)) {
rain = rainObj.optString("1h", "0");
}
}
return rain;
}
private ParseResult parseTodayJson(String result) {
try {
JSONObject reader = new JSONObject(result);
final String code = reader.optString("cod");
if ("404".equals(code)) {
return ParseResult.CITY_NOT_FOUND;
}
String city = reader.getString("name");
String country = "";
JSONObject countryObj = reader.optJSONObject("sys");
if (countryObj != null) {
country = countryObj.getString("country");
todayWeather.setSunrise(countryObj.getString("sunrise"));
todayWeather.setSunset(countryObj.getString("sunset"));
}
todayWeather.setCity(city);
todayWeather.setCountry(country);
JSONObject coordinates = reader.getJSONObject("coord");
if (coordinates != null) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
sp.edit().putFloat("latitude", (float) coordinates.getDouble("lon")).putFloat("longitude", (float) coordinates.getDouble("lat")).commit();
}
JSONObject main = reader.getJSONObject("main");
todayWeather.setTemperature(main.getString("temp"));
todayWeather.setDescription(reader.getJSONArray("weather").getJSONObject(0).getString("description"));
JSONObject windObj = reader.getJSONObject("wind");
todayWeather.setWind(windObj.getString("speed"));
if (windObj.has("deg")) {
todayWeather.setWindDirectionDegree(windObj.getDouble("deg"));
} else {
Log.e("parseTodayJson", "No wind direction available");
todayWeather.setWindDirectionDegree(null);
}
todayWeather.setPressure(main.getString("pressure"));
todayWeather.setHumidity(main.getString("humidity"));
JSONObject rainObj = reader.optJSONObject("rain");
String rain;
if (rainObj != null) {
rain = getRainString(rainObj);
} else {
JSONObject snowObj = reader.optJSONObject("snow");
if (snowObj != null) {
rain = getRainString(snowObj);
} else {
rain = "0";
}
}
todayWeather.setRain(rain);
final String idString = reader.getJSONArray("weather").getJSONObject(0).getString("id");
todayWeather.setId(idString);
todayWeather.setIcon(setWeatherIcon(Integer.parseInt(idString), Calendar.getInstance().get(Calendar.HOUR_OF_DAY)));
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(MainActivity.this).edit();
editor.putString("lastToday", result);
editor.commit();
} catch (JSONException e) {
Log.e("JSONException Data", result);
e.printStackTrace();
return ParseResult.JSON_EXCEPTION;
}
return ParseResult.OK;
}
private void updateTodayWeatherUI() {
try {
if (todayWeather.getCountry().isEmpty()) {
preloadWeather();
return;
}
} catch (Exception e) {
preloadWeather();
return;
}
String city = todayWeather.getCity();
String country = todayWeather.getCountry();
DateFormat timeFormat = android.text.format.DateFormat.getTimeFormat(getApplicationContext());
getSupportActionBar().setTitle(city + (country.isEmpty() ? "" : ", " + country));
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
// Temperature
float temperature = UnitConvertor.convertTemperature(Float.parseFloat(todayWeather.getTemperature()), sp);
if (sp.getBoolean("temperatureInteger", false)) {
temperature = Math.round(temperature);
}
// Rain
double rain = Double.parseDouble(todayWeather.getRain());
String rainString = UnitConvertor.getRainString(rain, sp);
// Wind
double wind;
try {
wind = Double.parseDouble(todayWeather.getWind());
} catch (Exception e) {
e.printStackTrace();
wind = 0;
}
wind = UnitConvertor.convertWind(wind, sp);
// Pressure
double pressure = UnitConvertor.convertPressure((float) Double.parseDouble(todayWeather.getPressure()), sp);
todayTemperature.setText(new DecimalFormat("0.#").format(temperature) + " " + sp.getString("unit", "°C"));
todayDescription.setText(todayWeather.getDescription().substring(0, 1).toUpperCase() +
todayWeather.getDescription().substring(1) + rainString);
if (sp.getString("speedUnit", "m/s").equals("bft")) {
todayWind.setText(getString(R.string.wind) + ": " +
UnitConvertor.getBeaufortName((int) wind) +
(todayWeather.isWindDirectionAvailable() ? " " + getWindDirectionString(sp, this, todayWeather) : ""));
} else {
todayWind.setText(getString(R.string.wind) + ": " + new DecimalFormat("0.0").format(wind) + " " +
localize(sp, "speedUnit", "m/s") +
(todayWeather.isWindDirectionAvailable() ? " " + getWindDirectionString(sp, this, todayWeather) : ""));
}
todayPressure.setText(getString(R.string.pressure) + ": " + new DecimalFormat("0.0").format(pressure) + " " +
localize(sp, "pressureUnit", "hPa"));
todayHumidity.setText(getString(R.string.humidity) + ": " + todayWeather.getHumidity() + " %");
todaySunrise.setText(getString(R.string.sunrise) + ": " + timeFormat.format(todayWeather.getSunrise()));
todaySunset.setText(getString(R.string.sunset) + ": " + timeFormat.format(todayWeather.getSunset()));
todayIcon.setText(todayWeather.getIcon());
}
public ParseResult parseLongTermJson(String result) {
int i;
try {
JSONObject reader = new JSONObject(result);
final String code = reader.optString("cod");
if ("404".equals(code)) {
if (longTermWeather == null) {
longTermWeather = new ArrayList<>();
longTermTodayWeather = new ArrayList<>();
longTermTomorrowWeather = new ArrayList<>();
}
return ParseResult.CITY_NOT_FOUND;
}
longTermWeather = new ArrayList<>();
longTermTodayWeather = new ArrayList<>();
longTermTomorrowWeather = new ArrayList<>();
JSONArray list = reader.getJSONArray("list");
for (i = 0; i < list.length(); i++) {
Weather weather = new Weather();
JSONObject listItem = list.getJSONObject(i);
JSONObject main = listItem.getJSONObject("main");
weather.setDate(listItem.getString("dt"));
weather.setTemperature(main.getString("temp"));
weather.setDescription(listItem.optJSONArray("weather").getJSONObject(0).getString("description"));
JSONObject windObj = listItem.optJSONObject("wind");
if (windObj != null) {
weather.setWind(windObj.getString("speed"));
weather.setWindDirectionDegree(windObj.getDouble("deg"));
}
weather.setPressure(main.getString("pressure"));
weather.setHumidity(main.getString("humidity"));
JSONObject rainObj = listItem.optJSONObject("rain");
String rain = "";
if (rainObj != null) {
rain = getRainString(rainObj);
} else {
JSONObject snowObj = listItem.optJSONObject("snow");
if (snowObj != null) {
rain = getRainString(snowObj);
} else {
rain = "0";
}
}
weather.setRain(rain);
final String idString = listItem.optJSONArray("weather").getJSONObject(0).getString("id");
weather.setId(idString);
final String dateMsString = listItem.getString("dt") + "000";
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(Long.parseLong(dateMsString));
weather.setIcon(setWeatherIcon(Integer.parseInt(idString), cal.get(Calendar.HOUR_OF_DAY)));
Calendar today = Calendar.getInstance();
if (cal.get(Calendar.DAY_OF_YEAR) == today.get(Calendar.DAY_OF_YEAR)) {
longTermTodayWeather.add(weather);
} else if (cal.get(Calendar.DAY_OF_YEAR) == today.get(Calendar.DAY_OF_YEAR) + 1) {
longTermTomorrowWeather.add(weather);
} else {
longTermWeather.add(weather);
}
}
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(MainActivity.this).edit();
editor.putString("lastLongterm", result);
editor.commit();
} catch (JSONException e) {
Log.e("JSONException Data", result);
e.printStackTrace();
return ParseResult.JSON_EXCEPTION;
}
return ParseResult.OK;
}
private void updateLongTermWeatherUI() {
if (destroyed) {
return;
}
ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
Bundle bundleToday = new Bundle();
bundleToday.putInt("day", 0);
RecyclerViewFragment recyclerViewFragmentToday = new RecyclerViewFragment();
recyclerViewFragmentToday.setArguments(bundleToday);
viewPagerAdapter.addFragment(recyclerViewFragmentToday, getString(R.string.today));
Bundle bundleTomorrow = new Bundle();
bundleTomorrow.putInt("day", 1);
RecyclerViewFragment recyclerViewFragmentTomorrow = new RecyclerViewFragment();
recyclerViewFragmentTomorrow.setArguments(bundleTomorrow);
viewPagerAdapter.addFragment(recyclerViewFragmentTomorrow, getString(R.string.tomorrow));
Bundle bundle = new Bundle();
bundle.putInt("day", 2);
RecyclerViewFragment recyclerViewFragment = new RecyclerViewFragment();
recyclerViewFragment.setArguments(bundle);
viewPagerAdapter.addFragment(recyclerViewFragment, getString(R.string.later));
int currentPage = viewPager.getCurrentItem();
viewPagerAdapter.notifyDataSetChanged();
viewPager.setAdapter(viewPagerAdapter);
tabLayout.setupWithViewPager(viewPager);
if (currentPage == 0 && longTermTodayWeather.isEmpty()) {
currentPage = 1;
}
viewPager.setCurrentItem(currentPage, false);
}
private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
private boolean shouldUpdate() {
long lastUpdate = PreferenceManager.getDefaultSharedPreferences(this).getLong("lastUpdate", -1);
boolean cityChanged = PreferenceManager.getDefaultSharedPreferences(this).getBoolean("cityChanged", false);
// Update if never checked or last update is longer ago than specified threshold
return cityChanged || lastUpdate < 0 || (Calendar.getInstance().getTimeInMillis() - lastUpdate) > NO_UPDATE_REQUIRED_THRESHOLD;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_refresh) {
if (isNetworkAvailable()) {
getTodayWeather();
getLongTermWeather();
} else {
Snackbar.make(appView, getString(R.string.msg_connection_not_available), Snackbar.LENGTH_LONG).show();
}
return true;
}
if (id == R.id.action_map) {
Intent intent = new Intent(MainActivity.this, MapActivity.class);
startActivity(intent);
}
if (id == R.id.NASA_map) {
Intent intent = new Intent(MainActivity.this, MapAcivityNWV.class);
startActivity(intent);
}
if (id == R.id.WIND_map) {
Intent intent = new Intent(MainActivity.this, MapActivityWind.class);
startActivity(intent);
}
if (id == R.id.Dis_map) {
Intent intent = new Intent(MainActivity.this, MapActivityDis.class);
startActivity(intent);
}
if (id == R.id.EQH_map) {
Intent intent = new Intent(MainActivity.this, MapActivityQH.class);
startActivity(intent);
}
if (id == R.id.action_graphs) {
Intent intent = new Intent(MainActivity.this, GraphActivity.class);
startActivity(intent);
}
if (id == R.id.action_search) {
searchCities();
return true;
}
if (id == R.id.action_location) {
getCityByLocation();
return true;
}
if (id == R.id.action_settings) {
Intent intent = new Intent(MainActivity.this, SettingsActivity.class);
startActivity(intent);
}
if (id == R.id.action_about) {
aboutDialog();
return true;
}
return super.onOptionsItemSelected(item);
}
public static void initMappings() {
if (mappingsInitialised)
return;
mappingsInitialised = true;
speedUnits.put("m/s", R.string.speed_unit_mps);
speedUnits.put("kph", R.string.speed_unit_kph);
speedUnits.put("mph", R.string.speed_unit_mph);
speedUnits.put("kn", R.string.speed_unit_kn);
pressUnits.put("hPa", R.string.pressure_unit_hpa);
pressUnits.put("kPa", R.string.pressure_unit_kpa);
pressUnits.put("mm Hg", R.string.pressure_unit_mmhg);
}
private String localize(SharedPreferences sp, String preferenceKey, String defaultValueKey) {
return localize(sp, this, preferenceKey, defaultValueKey);
}
public static String localize(SharedPreferences sp, Context context, String preferenceKey, String defaultValueKey) {
String preferenceValue = sp.getString(preferenceKey, defaultValueKey);
String result = preferenceValue;
if ("speedUnit".equals(preferenceKey)) {
if (speedUnits.containsKey(preferenceValue)) {
result = context.getString(speedUnits.get(preferenceValue));
}
} else if ("pressureUnit".equals(preferenceKey)) {
if (pressUnits.containsKey(preferenceValue)) {
result = context.getString(pressUnits.get(preferenceValue));
}
}
return result;
}
public static String getWindDirectionString(SharedPreferences sp, Context context, Weather weather) {
try {
if (Double.parseDouble(weather.getWind()) != 0) {
String pref = sp.getString("windDirectionFormat", null);
if ("arrow".equals(pref)) {
return weather.getWindDirection(8).getArrow(context);
} else if ("abbr".equals(pref)) {
return weather.getWindDirection().getLocalizedString(context);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
void getCityByLocation() {
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.ACCESS_FINE_LOCATION)) {
// Explanation not needed, since user requests this themmself
} else {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
MY_PERMISSIONS_ACCESS_FINE_LOCATION);
}
} else if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) ||
locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
progressDialog = new ProgressDialog(this);
progressDialog.setMessage(getString(R.string.getting_location));
progressDialog.setCancelable(false);
progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getString(R.string.dialog_cancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
try {
locationManager.removeUpdates(MainActivity.this);
} catch (SecurityException e) {
e.printStackTrace();
}
}
});
progressDialog.show();
if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
}
if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
}
} else {
showLocationSettingsDialog();
}
}
private void showLocationSettingsDialog() {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
alertDialog.setTitle(R.string.location_settings);
alertDialog.setMessage(R.string.location_settings_message);
alertDialog.setPositiveButton(R.string.location_settings_button, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(intent);
}
});
alertDialog.setNegativeButton(R.string.dialog_cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
alertDialog.show();
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_ACCESS_FINE_LOCATION: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
getCityByLocation();
}
return;
}
}
}
@Override
public void onLocationChanged(Location location) {
progressDialog.hide();
try {
locationManager.removeUpdates(this);
} catch (SecurityException e) {
Log.e("LocationManager", "Error while trying to stop listening for location updates. This is probably a permissions issue", e);
}
Log.i("LOCATION (" + location.getProvider().toUpperCase() + ")", location.getLatitude() + ", " + location.getLongitude());
double latitude = location.getLatitude();
double longitude = location.getLongitude();
new ProvideCityNameTask(this, this, progressDialog).execute("coords", Double.toString(latitude), Double.toString(longitude));
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
class TodayWeatherTask extends GenericRequestTask {
public TodayWeatherTask(Context context, MainActivity activity, ProgressDialog progressDialog) {
super(context, activity, progressDialog);
}
@Override
protected void onPreExecute() {
loading = 0;
super.onPreExecute();
}
@Override
protected void onPostExecute(TaskOutput output) {
super.onPostExecute(output);
// Update widgets
AbstractWidgetProvider.updateWidgets(MainActivity.this);
DashClockWeatherExtension.updateDashClock(MainActivity.this);
}
@Override
protected ParseResult parseResponse(String response) {
return parseTodayJson(response);
}
@Override
protected String getAPIName() {
return "weather";
}
@Override
protected void updateMainUI() {
updateTodayWeatherUI();
updateLastUpdateTime();
}
}
class LongTermWeatherTask extends GenericRequestTask {
public LongTermWeatherTask(Context context, MainActivity activity, ProgressDialog progressDialog) {
super(context, activity, progressDialog);
}
@Override
protected ParseResult parseResponse(String response) {
return parseLongTermJson(response);
}
@Override
protected String getAPIName() {
return "forecast";
}
@Override
protected void updateMainUI() {
updateLongTermWeatherUI();
}
}
class ProvideCityNameTask extends GenericRequestTask {
public ProvideCityNameTask(Context context, MainActivity activity, ProgressDialog progressDialog) {
super(context, activity, progressDialog);
}
@Override
protected void onPreExecute() { /*Nothing*/ }
@Override
protected String getAPIName() {
return "weather";
}
@Override
protected ParseResult parseResponse(String response) {
Log.i("RESULT", response.toString());
try {
JSONObject reader = new JSONObject(response);
final String code = reader.optString("cod");
if ("404".equals(code)) {
Log.e("Geolocation", "No city found");
return ParseResult.CITY_NOT_FOUND;
}
String city = reader.getString("name");
String country = "";
JSONObject countryObj = reader.optJSONObject("sys");
if (countryObj != null) {
country = ", " + countryObj.getString("country");
}
saveLocation(city + country);
} catch (JSONException e) {
Log.e("JSONException Data", response);
e.printStackTrace();
return ParseResult.JSON_EXCEPTION;
}
return ParseResult.OK;
}
@Override
protected void onPostExecute(TaskOutput output) {
/* Handle possible errors only */
handleTaskOutput(output);
}
}
public static long saveLastUpdateTime(SharedPreferences sp) {
Calendar now = Calendar.getInstance();
sp.edit().putLong("lastUpdate", now.getTimeInMillis()).apply();
return now.getTimeInMillis();
}
private void updateLastUpdateTime() {
updateLastUpdateTime(
PreferenceManager.getDefaultSharedPreferences(this).getLong("lastUpdate", -1)
);
}
private void updateLastUpdateTime(long timeInMillis) {
if (timeInMillis < 0) {
// No time
lastUpdate.setText("");
} else {
lastUpdate.setText(getString(R.string.last_update, formatTimeWithDayIfNotToday(this, timeInMillis)));
}
}
public static String formatTimeWithDayIfNotToday(Context context, long timeInMillis) {
Calendar now = Calendar.getInstance();
Calendar lastCheckedCal = new GregorianCalendar();
lastCheckedCal.setTimeInMillis(timeInMillis);
Date lastCheckedDate = new Date(timeInMillis);
String timeFormat = android.text.format.DateFormat.getTimeFormat(context).format(lastCheckedDate);
if (now.get(Calendar.YEAR) == lastCheckedCal.get(Calendar.YEAR) &&
now.get(Calendar.DAY_OF_YEAR) == lastCheckedCal.get(Calendar.DAY_OF_YEAR)) {
// Same day, only show time
return timeFormat;
} else {
return android.text.format.DateFormat.getDateFormat(context).format(lastCheckedDate) + " " + timeFormat;
}
}
private int getTheme(String themePref) {
switch (themePref) {
case "dark":
return R.style.AppTheme_NoActionBar_Dark;
case "black":
return R.style.AppTheme_NoActionBar_Black;
case "classic":
return R.style.AppTheme_NoActionBar_Classic;
case "classicdark":
return R.style.AppTheme_NoActionBar_Classic_Dark;
case "classicblack":
return R.style.AppTheme_NoActionBar_Classic_Black;
default:
return R.style.AppTheme_NoActionBar;
}
}
}
package nasa.spaceapps.dsos.activities;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.IdRes;
import android.support.v7.app.AppCompatActivity;
import android.webkit.WebView;
import com.roughike.bottombar.BottomBar;
import com.roughike.bottombar.OnMenuTabClickListener;
import nasa.spaceapps.dsos.R;
public class MapAcivityNWV extends AppCompatActivity {
private BottomBar mBottomBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
String apiKey = sp.getString("apiKey", getResources().getString(R.string.apiKey));
final WebView webView = (WebView) findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
// webView.loadUrl("file:///android_asset/map.html?lat=" + prefs.getFloat("latitude", 0) + "&lon=" + prefs.getFloat("longitude", 0) + "&appid=" + apiKey);
webView.loadUrl("https://worldview.earthdata.nasa.gov/");
mBottomBar = BottomBar.attach(this, savedInstanceState);
mBottomBar.setItems(R.menu.menu_map_bottom);
mBottomBar.setOnMenuTabClickListener(new OnMenuTabClickListener() {
@Override
public void onMenuTabSelected(@IdRes int menuItemId) {
if (menuItemId == R.id.map_rain) {
webView.loadUrl("javascript:map.removeLayer(windLayer);map.removeLayer(tempLayer);map.addLayer(rainLayer);");
} else if (menuItemId == R.id.map_wind) {
webView.loadUrl("javascript:map.removeLayer(rainLayer);map.removeLayer(tempLayer);map.addLayer(windLayer);");
} else if (menuItemId == R.id.map_temperature) {
webView.loadUrl("javascript:map.removeLayer(windLayer);map.removeLayer(rainLayer);map.addLayer(tempLayer);");
}
}
@Override
public void onMenuTabReSelected(@IdRes int menuItemId) {
}
});
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mBottomBar.onSaveInstanceState(outState);
}
}
package nasa.spaceapps.dsos.activities;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.IdRes;
import android.support.v7.app.AppCompatActivity;
import android.webkit.WebView;
import com.roughike.bottombar.BottomBar;
import com.roughike.bottombar.OnMenuTabClickListener;
import nasa.spaceapps.dsos.R;
public class MapActivity extends AppCompatActivity {
private BottomBar mBottomBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
String apiKey = sp.getString("apiKey", getResources().getString(R.string.apiKey));
final WebView webView = (WebView) findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("file:///android_asset/map.html?lat=" + prefs.getFloat("latitude", 0) + "&lon=" + prefs.getFloat("longitude", 0) + "&appid=" + apiKey);
mBottomBar = BottomBar.attach(this, savedInstanceState);
mBottomBar.setItems(R.menu.menu_map_bottom);
mBottomBar.setOnMenuTabClickListener(new OnMenuTabClickListener() {
@Override
public void onMenuTabSelected(@IdRes int menuItemId) {
if (menuItemId == R.id.map_rain) {
webView.loadUrl("javascript:map.removeLayer(windLayer);map.removeLayer(tempLayer);map.addLayer(rainLayer);");
} else if (menuItemId == R.id.map_wind) {
webView.loadUrl("javascript:map.removeLayer(rainLayer);map.removeLayer(tempLayer);map.addLayer(windLayer);");
} else if (menuItemId == R.id.map_temperature) {
webView.loadUrl("javascript:map.removeLayer(windLayer);map.removeLayer(rainLayer);map.addLayer(tempLayer);");
}
}
@Override
public void onMenuTabReSelected(@IdRes int menuItemId) {
}
});
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mBottomBar.onSaveInstanceState(outState);
}
}
package nasa.spaceapps.dsos.activities;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.IdRes;
import android.support.v7.app.AppCompatActivity;
import android.webkit.WebView;
import com.roughike.bottombar.BottomBar;
import com.roughike.bottombar.OnMenuTabClickListener;
import nasa.spaceapps.dsos.R;
public class MapActivityDis extends AppCompatActivity {
private BottomBar mBottomBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
String apiKey = sp.getString("apiKey", getResources().getString(R.string.apiKey));
final WebView webView = (WebView) findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("https://maps.disasters.nasa.gov/arcgis/apps/webappviewer/index.html?id=64c5bc2e969e4dfab9a0391fe49cce51");
mBottomBar = BottomBar.attach(this, savedInstanceState);
mBottomBar.setItems(R.menu.menu_map_bottom);
mBottomBar.setOnMenuTabClickListener(new OnMenuTabClickListener() {
@Override
public void onMenuTabSelected(@IdRes int menuItemId) {
if (menuItemId == R.id.map_rain) {
webView.loadUrl("javascript:map.removeLayer(windLayer);map.removeLayer(tempLayer);map.addLayer(rainLayer);");
} else if (menuItemId == R.id.map_wind) {
webView.loadUrl("javascript:map.removeLayer(rainLayer);map.removeLayer(tempLayer);map.addLayer(windLayer);");
} else if (menuItemId == R.id.map_temperature) {
webView.loadUrl("javascript:map.removeLayer(windLayer);map.removeLayer(rainLayer);map.addLayer(tempLayer);");
}
}
@Override
public void onMenuTabReSelected(@IdRes int menuItemId) {
}
});
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mBottomBar.onSaveInstanceState(outState);
}
}
package nasa.spaceapps.dsos.activities;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.IdRes;
import android.support.v7.app.AppCompatActivity;
import android.webkit.WebView;
import com.roughike.bottombar.BottomBar;
import com.roughike.bottombar.OnMenuTabClickListener;
import nasa.spaceapps.dsos.R;
public class MapActivityQH extends AppCompatActivity {
private BottomBar mBottomBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
String apiKey = sp.getString("apiKey", getResources().getString(R.string.apiKey));
final WebView webView = (WebView) findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
// webView.loadUrl("file:///android_asset/map.html?lat=" + prefs.getFloat("latitude", 0) + "&lon=" + prefs.getFloat("longitude", 0) + "&appid=" + apiKey);
webView.loadUrl("https://worldwind.arc.nasa.gov/quakehunter/");
mBottomBar = BottomBar.attach(this, savedInstanceState);
mBottomBar.setItems(R.menu.menu_map_bottom);
mBottomBar.setOnMenuTabClickListener(new OnMenuTabClickListener() {
@Override
public void onMenuTabSelected(@IdRes int menuItemId) {
if (menuItemId == R.id.map_rain) {
webView.loadUrl("javascript:map.removeLayer(windLayer);map.removeLayer(tempLayer);map.addLayer(rainLayer);");
} else if (menuItemId == R.id.map_wind) {
webView.loadUrl("javascript:map.removeLayer(rainLayer);map.removeLayer(tempLayer);map.addLayer(windLayer);");
} else if (menuItemId == R.id.map_temperature) {
webView.loadUrl("javascript:map.removeLayer(windLayer);map.removeLayer(rainLayer);map.addLayer(tempLayer);");
}
}
@Override
public void onMenuTabReSelected(@IdRes int menuItemId) {
}
});
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mBottomBar.onSaveInstanceState(outState);
}
}
package nasa.spaceapps.dsos.activities;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.IdRes;
import android.support.v7.app.AppCompatActivity;
import android.webkit.WebView;
import com.roughike.bottombar.BottomBar;
import com.roughike.bottombar.OnMenuTabClickListener;
import nasa.spaceapps.dsos.R;
public class MapActivityWind extends AppCompatActivity {
private BottomBar mBottomBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
String apiKey = sp.getString("apiKey", getResources().getString(R.string.apiKey));
final WebView webView = (WebView) findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
// webView.loadUrl("file:///android_asset/map.html?lat=" + prefs.getFloat("latitude", 0) + "&lon=" + prefs.getFloat("longitude", 0) + "&appid=" + apiKey);
webView.loadUrl(" https://earth.nullschool.net/#current/wind/surface/level/orthographic=-270.56,52.36,296");
mBottomBar = BottomBar.attach(this, savedInstanceState);
mBottomBar.setItems(R.menu.menu_map_bottom);
mBottomBar.setOnMenuTabClickListener(new OnMenuTabClickListener() {
@Override
public void onMenuTabSelected(@IdRes int menuItemId) {
if (menuItemId == R.id.map_rain) {
webView.loadUrl("javascript:map.removeLayer(windLayer);map.removeLayer(tempLayer);map.addLayer(rainLayer);");
} else if (menuItemId == R.id.map_wind) {
webView.loadUrl("javascript:map.removeLayer(rainLayer);map.removeLayer(tempLayer);map.addLayer(windLayer);");
} else if (menuItemId == R.id.map_temperature) {
webView.loadUrl("javascript:map.removeLayer(windLayer);map.removeLayer(rainLayer);map.addLayer(tempLayer);");
}
}
@Override
public void onMenuTabReSelected(@IdRes int menuItemId) {
}
});
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mBottomBar.onSaveInstanceState(outState);
}
}
package nasa.spaceapps.dsos.activities;
import android.Manifest;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import java.text.SimpleDateFormat;
import java.util.Date;
import nasa.spaceapps.dsos.AlarmReceiver;
import nasa.spaceapps.dsos.R;
public class SettingsActivity extends PreferenceActivity
implements SharedPreferences.OnSharedPreferenceChangeListener {
// Thursday 2016-01-14 16:00:00
Date SAMPLE_DATE = new Date(1452805200000l);
@Override
public void onCreate(Bundle savedInstanceState) {
setTheme(getTheme(PreferenceManager.getDefaultSharedPreferences(this).getString("theme", "fresh")));
super.onCreate(savedInstanceState);
LinearLayout root = (LinearLayout) findViewById(android.R.id.list).getParent().getParent().getParent();
View bar = LayoutInflater.from(this).inflate(R.layout.settings_toolbar, root, false);
root.addView(bar, 0);
Toolbar toolbar = (Toolbar) findViewById(R.id.settings_toolbar);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
addPreferencesFromResource(R.xml.prefs);
}
@Override
public void onResume(){
super.onResume();
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
setCustomDateEnabled();
updateDateFormatList();
// Set summaries to current value
setListPreferenceSummary("unit");
setListPreferenceSummary("lengthUnit");
setListPreferenceSummary("speedUnit");
setListPreferenceSummary("pressureUnit");
setListPreferenceSummary("refreshInterval");
setListPreferenceSummary("windDirectionFormat");
setListPreferenceSummary("theme");
}
@Override
public void onPause(){
super.onPause();
getPreferenceScreen().getSharedPreferences()
.unregisterOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
switch (key) {
case "unit":
case "lengthUnit":
case "speedUnit":
case "pressureUnit":
case "windDirectionFormat":
setListPreferenceSummary(key);
break;
case "refreshInterval":
setListPreferenceSummary(key);
AlarmReceiver.setRecurringAlarm(this);
break;
case "dateFormat":
setCustomDateEnabled();
setListPreferenceSummary(key);
break;
case "dateFormatCustom":
updateDateFormatList();
break;
case "theme":
// Restart activity to apply theme
overridePendingTransition(0, 0);
finish();
overridePendingTransition(0, 0);
startActivity(getIntent());
break;
case "updateLocationAutomatically":
if (sharedPreferences.getBoolean(key, false) == true) {
requestReadLocationPermission();
}
break;
case "apiKey":
checkKey(key);
}
}
private void requestReadLocationPermission() {
System.out.println("Calling request location permission");
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.ACCESS_FINE_LOCATION)) {
// Explanation not needed, since user requests this themself
} else {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
MainActivity.MY_PERMISSIONS_ACCESS_FINE_LOCATION);
}
} else {
privacyGuardWorkaround();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == MainActivity.MY_PERMISSIONS_ACCESS_FINE_LOCATION) {
boolean permissionGranted = grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;
CheckBoxPreference checkBox = (CheckBoxPreference) findPreference("updateLocationAutomatically");
checkBox.setChecked(permissionGranted);
if (permissionGranted) {
privacyGuardWorkaround();
}
}
}
private void privacyGuardWorkaround() {
// Workaround for CM privacy guard. Register for location updates in order for it to ask us for permission
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
try {
DummyLocationListener dummyLocationListener = new DummyLocationListener();
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, dummyLocationListener);
locationManager.removeUpdates(dummyLocationListener);
} catch (SecurityException e) {
// This will most probably not happen, as we just got granted the permission
}
}
private void setListPreferenceSummary(String preferenceKey) {
ListPreference preference = (ListPreference) findPreference(preferenceKey);
preference.setSummary(preference.getEntry());
}
private void setCustomDateEnabled() {
SharedPreferences sp = getPreferenceScreen().getSharedPreferences();
Preference customDatePref = findPreference("dateFormatCustom");
customDatePref.setEnabled("custom".equals(sp.getString("dateFormat", "")));
}
private void updateDateFormatList() {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
Resources res = getResources();
ListPreference dateFormatPref = (ListPreference) findPreference("dateFormat");
String[] dateFormatsValues = res.getStringArray(R.array.dateFormatsValues);
String[] dateFormatsEntries = new String[dateFormatsValues.length];
EditTextPreference customDateFormatPref = (EditTextPreference) findPreference("dateFormatCustom");
customDateFormatPref.setDefaultValue(dateFormatsValues[0]);
SimpleDateFormat sdformat = new SimpleDateFormat();
for (int i=0; i<dateFormatsValues.length; i++) {
String value = dateFormatsValues[i];
if ("custom".equals(value)) {
String renderedCustom;
try {
sdformat.applyPattern(sp.getString("dateFormatCustom", dateFormatsValues[0]));
renderedCustom = sdformat.format(SAMPLE_DATE);
} catch (IllegalArgumentException e) {
renderedCustom = res.getString(R.string.error_dateFormat);
}
dateFormatsEntries[i] = String.format("%s:\n%s",
res.getString(R.string.setting_dateFormatCustom),
renderedCustom);
} else {
sdformat.applyPattern(value);
dateFormatsEntries[i] = sdformat.format(SAMPLE_DATE);
}
}
dateFormatPref.setDefaultValue(dateFormatsValues[0]);
dateFormatPref.setEntries(dateFormatsEntries);
setListPreferenceSummary("dateFormat");
}
private void checkKey(String key){
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
if (sp.getString(key, "").equals("")){
sp.edit().remove(key).apply();
}
}
private int getTheme(String themePref) {
switch (themePref) {
case "dark":
return R.style.AppTheme_Dark;
case "black":
return R.style.AppTheme_Black;
case "classic":
return R.style.AppTheme_Classic;
case "classicdark":
return R.style.AppTheme_Classic_Dark;
case "classicblack":
return R.style.AppTheme_Classic_Black;
default:
return R.style.AppTheme;
}
}
public class DummyLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location location) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
}
}
package nasa.spaceapps.dsos.activities;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
public class SplashActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
}
}
gunaidGunaid Ahmed Bawazir
package nasa.spaceapps.dsos.activities;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.IdRes;
import android.support.v7.app.AppCompatActivity;
import android.webkit.WebView;
import com.roughike.bottombar.BottomBar;
import com.roughike.bottombar.OnMenuTabClickListener;
import nasa.spaceapps.dsos.R;
public class MapActivity extends AppCompatActivity {
private BottomBar mBottomBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
String apiKey = sp.getString("apiKey", getResources().getString(R.string.apiKey));
final WebView webView = (WebView) findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("file:///android_asset/map.html?lat=" + prefs.getFloat("latitude", 0) + "&lon=" + prefs.getFloat("longitude", 0) + "&appid=" + apiKey);
mBottomBar = BottomBar.attach(this, savedInstanceState);
mBottomBar.setItems(R.menu.menu_map_bottom);
mBottomBar.setOnMenuTabClickListener(new OnMenuTabClickListener() {
@Override
public void onMenuTabSelected(@IdRes int menuItemId) {
if (menuItemId == R.id.map_rain) {
webView.loadUrl("javascript:map.removeLayer(windLayer);map.removeLayer(tempLayer);map.addLayer(rainLayer);");
} else if (menuItemId == R.id.map_wind) {
webView.loadUrl("javascript:map.removeLayer(rainLayer);map.removeLayer(tempLayer);map.addLayer(windLayer);");
} else if (menuItemId == R.id.map_temperature) {
webView.loadUrl("javascript:map.removeLayer(windLayer);map.removeLayer(rainLayer);map.addLayer(tempLayer);");
}
}
@Override
public void onMenuTabReSelected(@IdRes int menuItemId) {
}
});
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mBottomBar.onSaveInstanceState(outState);
}
}
gunaidGunaid Ahmed Bawazir
package nasa.spaceapps.dsos.activities;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.IdRes;
import android.support.v7.app.AppCompatActivity;
import android.webkit.WebView;
import com.roughike.bottombar.BottomBar;
import com.roughike.bottombar.OnMenuTabClickListener;
import nasa.spaceapps.dsos.R;
public class MapActivity extends AppCompatActivity {
private BottomBar mBottomBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
String apiKey = sp.getString("apiKey", getResources().getString(R.string.apiKey));
final WebView webView = (WebView) findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("file:///android_asset/map.html?lat=" + prefs.getFloat("latitude", 0) + "&lon=" + prefs.getFloat("longitude", 0) + "&appid=" + apiKey);
mBottomBar = BottomBar.attach(this, savedInstanceState);
mBottomBar.setItems(R.menu.menu_map_bottom);
mBottomBar.setOnMenuTabClickListener(new OnMenuTabClickListener() {
@Override
public void onMenuTabSelected(@IdRes int menuItemId) {
if (menuItemId == R.id.map_rain) {
webView.loadUrl("javascript:map.removeLayer(windLayer);map.removeLayer(tempLayer);map.addLayer(rainLayer);");
} else if (menuItemId == R.id.map_wind) {
webView.loadUrl("javascript:map.removeLayer(rainLayer);map.removeLayer(tempLayer);map.addLayer(windLayer);");
} else if (menuItemId == R.id.map_temperature) {
webView.loadUrl("javascript:map.removeLayer(windLayer);map.removeLayer(rainLayer);map.addLayer(tempLayer);");
}
}
@Override
public void onMenuTabReSelected(@IdRes int menuItemId) {
}
});
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mBottomBar.onSaveInstanceState(outState);
}
}
gunaidGunaid Ahmed Bawazir
Team Stream Item
gunaidGunaid Ahmed Bawazir
Team Stream Item
gunaidGunaid Ahmed Bawazir
Team Stream Item
gunaidGunaid Ahmed Bawazir
Team Stream Item
gunaidGunaid Ahmed Bawazir
main screen
main screen
gunaidGunaid Ahmed Bawazir
logo
logo
gunaidGunaid Ahmed Bawazir

NASA has long been a pioneer in the discovery of this universe and has always had to answer all the questions.

In our challenge, we want to take advantage of NASA's enormous potential and the data that has been provided by them to take responsibility for saving people from potential disasters

Every year, thousands of people die as a result of the weak infrastructure of some countries in early warning issues

So we created the idea of an artificial intelligence system to process and analyze NASA data to learn about disasters before they occur and to send an alert to people in those disaster areas.


لطالما كانت ناسا السباقة في اكتشاف هذا الكون ولطالما تحملو على عاتقهم الإجابة عن كل التساؤولات .

بدورنا بها التحدي نريد ان نستغل الإمكانات الهائلة لناسا والبيانات التي تم توفيرها من قبلهم لتحمل مسؤولية انقاذ البشر من الكوارث المحتملة

كل عام يموت الاف البشر نتيجة لضعف البنية الحتية لبعض الدول في مواضيع الانذار المبكر

لذلك قمنا بخلق فكرة عمل نظام ذكاء اصطناعي لمعالجة بيانات ناسا وتحليلها لمعرفة الكوارث قبل حدوثها وارسال تنبية للاشخاص الواقعين في مناطق تلك الكوارث .


gunaidGunaid Ahmed Bawazir
NASA Logo

SpaceApps is a NASA incubator innovation program.