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 = ""; | |
} |
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(); | |
} | |
} |
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 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); | |
} | |
} |
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.
لطالما كانت ناسا السباقة في اكتشاف هذا الكون ولطالما تحملو على عاتقهم الإجابة عن كل التساؤولات .
بدورنا بها التحدي نريد ان نستغل الإمكانات الهائلة لناسا والبيانات التي تم توفيرها من قبلهم لتحمل مسؤولية انقاذ البشر من الكوارث المحتملة
كل عام يموت الاف البشر نتيجة لضعف البنية الحتية لبعض الدول في مواضيع الانذار المبكر
لذلك قمنا بخلق فكرة عمل نظام ذكاء اصطناعي لمعالجة بيانات ناسا وتحليلها لمعرفة الكوارث قبل حدوثها وارسال تنبية للاشخاص الواقعين في مناطق تلك الكوارث .
SpaceApps is a NASA incubator innovation program.