Created
October 20, 2018 11:06
-
-
Save gunaid/64e605585124832d761aaaf0b1730711 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 = ""; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) { | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment