import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
-import android.content.SharedPreferences;
import android.database.Cursor;
-import android.database.DatabaseUtils;
import android.net.Uri;
import android.os.AsyncTask;
-import android.preference.PreferenceManager;
import android.util.Log;
-import android.widget.ArrayAdapter;
import org.json.JSONArray;
import org.json.JSONException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
-import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Vector;
*/
-public class FetchWeatherTask extends AsyncTask<String, Void, String[]> {
+public class FetchWeatherTask extends AsyncTask<String, Void, Void> {
private final String LOG_TAG = FetchWeatherTask.class.getSimpleName();
- private ArrayAdapter<String> mForecastAdapter;
private final Context mContext;
- public FetchWeatherTask(Context context, ArrayAdapter<String> forecastAdapter) {
+ public FetchWeatherTask(Context context) {
mContext = context;
- mForecastAdapter = forecastAdapter;
- }
-
- private boolean DEBUG = true;
-
- /* The date/time conversion code is going to be moved outside the asynctask later,
- * so for convenience we're breaking it out into its own method now.
- */
- private String getReadableDateString(long time) {
- // Because the API returns a unix timestamp (measured in seconds),
- // it must be converted to milliseconds in order to be converted to valid date.
- Date date = new Date(time * 1000);
- SimpleDateFormat format = new SimpleDateFormat("E, MMM d");
- return format.format(date).toString();
- }
-
- /**
- * Prepare the weather high/lows for presentation.
- */
- private String formatHighLows(double high, double low) {
- // Data is fetched in Celsius by default.
- // If user prefers to see in Fahrenheit, convert the values here.
- // We do this rather than fetching in Fahrenheit so that the user can
- // change this option without us having to re-fetch the data once
- // we start storing the values in a database.
- SharedPreferences sharedPrefs =
- PreferenceManager.getDefaultSharedPreferences(mContext);
- String unitType = sharedPrefs.getString(
- mContext.getString(R.string.pref_units_key),
- mContext.getString(R.string.pref_units_metric));
-
- if (unitType.equals(mContext.getString(R.string.pref_units_imperial))) {
- high = (high * 1.8) + 32;
- low = (low * 1.8) + 32;
- } else if (!unitType.equals(mContext.getString(R.string.pref_units_metric))) {
- Log.d(LOG_TAG, "Unit type not found: " + unitType);
- }
-
- // For presentation, assume the user doesn't care about tenths of a degree.
- long roundedHigh = Math.round(high);
- long roundedLow = Math.round(low);
-
- String highLowStr = roundedHigh + "/" + roundedLow;
- return highLowStr;
}
/**
*/
private long addLocation(String locationSetting, String cityName, double lat, double lon) {
- Log.v(LOG_TAG, "inserting " + cityName + ", with coord: " + lat + ", " + lon);
+ // Log.v(LOG_TAG, "inserting " + cityName + ", with coord: " + lat + ", " + lon);
// First, check if the location with this city name exists in the db
Cursor cursor = mContext.getContentResolver().query(
null);
if (cursor.moveToFirst()) {
- Log.v(LOG_TAG, "Found it in the database!");
+ // Log.v(LOG_TAG, "Found it in the database!");
int locationIdIndex = cursor.getColumnIndex(LocationEntry._ID);
return cursor.getLong(locationIdIndex);
} else {
- Log.v(LOG_TAG, "Didn't find it in the database, inserting now!");
+// Log.v(LOG_TAG, "Didn't find it in the database, inserting now!");
ContentValues locationValues = new ContentValues();
locationValues.put(LocationEntry.COLUMN_LOCATION_SETTING, locationSetting);
locationValues.put(LocationEntry.COLUMN_CITY_NAME, cityName);
* Fortunately parsing is easy: constructor takes the JSON string and converts it
* into an Object hierarchy for us.
*/
- private String[] getWeatherDataFromJson(String forecastJsonStr, int numDays,
+ private void getWeatherDataFromJson(String forecastJsonStr, int numDays,
String locationSetting)
throws JSONException {
double cityLatitude = coordJSON.getLong(OWM_COORD_LAT);
double cityLongitude = coordJSON.getLong(OWM_COORD_LONG);
- Log.v(LOG_TAG, cityName + ", with coord: " + cityLatitude + " " + cityLongitude);
+// Log.v(LOG_TAG, cityName + ", with coord: " + cityLatitude + " " + cityLongitude);
// Insert the location into the database.
long locationID = addLocation(locationSetting, cityName, cityLatitude, cityLongitude);
// Get and insert the new weather information into the database
Vector<ContentValues> cVVector = new Vector<ContentValues>(weatherArray.length());
- String[] resultStrs = new String[numDays];
+// String[] resultStrs = new String[numDays];
for (int i = 0; i < weatherArray.length(); i++) {
// These are the values that will be collected.
weatherValues.put(WeatherEntry.COLUMN_WEATHER_ID, weatherId);
cVVector.add(weatherValues);
-
- String highAndLow = formatHighLows(high, low);
- String day = getReadableDateString(dateTime);
- resultStrs[i] = day + " - " + description + " - " + highAndLow;
}
if (cVVector.size() > 0) {
ContentValues[] cvArray = new ContentValues[cVVector.size()];
cVVector.toArray(cvArray);
- int rowsInserted = mContext.getContentResolver()
- .bulkInsert(WeatherEntry.CONTENT_URI, cvArray);
- Log.v(LOG_TAG, "inserted " + rowsInserted + " rows of weather data");
- // Use a DEBUG variable to gate whether or not you do this, so you can easily
- // turn it on and off, and so that it's easy to see what you can rip out if
- // you ever want to remove it.
- if (DEBUG) {
- Cursor weatherCursor = mContext.getContentResolver().query(
- WeatherEntry.CONTENT_URI,
- null,
- null,
- null,
- null
- );
-
- if (weatherCursor.moveToFirst()) {
- ContentValues resultValues = new ContentValues();
- DatabaseUtils.cursorRowToContentValues(weatherCursor, resultValues);
- Log.v(LOG_TAG, "Query succeeded! **********");
- for (String key : resultValues.keySet()) {
- Log.v(LOG_TAG, key + ": " + resultValues.getAsString(key));
- }
- } else {
- Log.v(LOG_TAG, "Query failed! :( **********");
- }
- }
+ mContext.getContentResolver().bulkInsert(WeatherEntry.CONTENT_URI, cvArray);
}
- return resultStrs;
}
@Override
- protected String[] doInBackground(String... params) {
+ protected Void doInBackground(String... params) {
// If there's no zip code, there's nothing to look up. Verify size of params.
if (params.length == 0) {
}
try {
- return getWeatherDataFromJson(forecastJsonStr, numDays, locationQuery);
+ getWeatherDataFromJson(forecastJsonStr, numDays, locationQuery);
} catch (JSONException e) {
Log.e(LOG_TAG, e.getMessage(), e);
e.printStackTrace();
return null;
}
- @Override
- protected void onPostExecute(String[] result) {
- if (result != null) {
- mForecastAdapter.clear();
- for (String dayForecastStr : result) {
- mForecastAdapter.add(dayForecastStr);
- }
- // New data is back from the server. Hooray!
- }
- }
-
}
\ No newline at end of file