@Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { if (data.moveToFirst()) { detailString = convertCursorRowToUXFormat(data); if (shareProvider != null) { shareProvider.setShareIntent(createForecastShareIntent()); } mWeatherId = data.getInt(COL_WEATHER_ID); long date = data.getLong(ForecastFragment.COL_WEATHER_DATE); // POPULATE THE text views mDay.setText(Utility.getDayName(getActivity(), date)); mDate.setText(Utility.getFormattedMonthDay(getActivity(), date)); mHigh.setText( getString(R.string.format_degrees, data.getFloat(ForecastFragment.COL_WEATHER_MAX_TEMP))); mLow.setText( getString(R.string.format_degrees, data.getFloat(ForecastFragment.COL_WEATHER_MIN_TEMP))); mHumidity.setText(getString(R.string.format_humidity, data.getFloat(COL_HUMIDITY))); mPressure.setText(getString(R.string.format_pressure, data.getFloat(COL_PRESSURE))); mIcon.setImageResource(Utility.weatherCodeToArtPath(mWeatherId)); float windSpeed = data.getFloat(COL_WIND_SPEED); String windDirection = getWindDirection(data.getFloat(COL_DEGREES)); mWind.setText(getString(R.string.format_wind_kmh, windSpeed, windDirection)); if (mCompass != null) { mCompass.setAngle(degreesToRadians(data.getFloat(COL_DEGREES))); } mDescription.setText(data.getString(ForecastFragment.COL_WEATHER_DESC)); } }
@Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { if (data != null && data.moveToFirst()) { // Read weather condition ID from cursor int weatherId = data.getInt(data.getColumnIndex(WeatherEntry.COLUMN_WEATHER_ID)); // Use placeholder Image mIconView.setImageResource(Utility.getArtResourceForWeatherCondition(weatherId)); // Read date from cursor and update views for day of week and date String date = data.getString(data.getColumnIndex(WeatherEntry.COLUMN_DATETEXT)); String friendlyDateText = Utility.getDayName(getActivity(), date); String dateText = Utility.getFormattedMonthDay(getActivity(), date); mFriendlyDateView.setText(friendlyDateText); mDateView.setText(dateText); // Read description from cursor and update view String description = data.getString(data.getColumnIndex(WeatherEntry.COLUMN_SHORT_DESC)); mDescriptionView.setText(description); // For accessibility, add a content description to the icon field. mIconView.setContentDescription(description); // Read high temperature from cursor and update view boolean isMetric = Utility.isMetric(getActivity()); double high = data.getDouble(data.getColumnIndex(WeatherEntry.COLUMN_MAX_TEMP)); String highString = Utility.formatTemperature(getActivity(), high, isMetric); mHighTempView.setText(highString); // Read low temperature from cursor and update view double low = data.getDouble(data.getColumnIndex(WeatherEntry.COLUMN_MIN_TEMP)); String lowString = Utility.formatTemperature(getActivity(), low, isMetric); mLowTempView.setText(lowString); // Read humidity from cursor and update view float humidity = data.getFloat(data.getColumnIndex(WeatherEntry.COLUMN_HUMIDITY)); mHumidityView.setText(getActivity().getString(R.string.format_humidity, humidity)); // Read wind speed and direction from cursor and update view float windSpeedStr = data.getFloat(data.getColumnIndex(WeatherEntry.COLUMN_WIND_SPEED)); float windDirStr = data.getFloat(data.getColumnIndex(WeatherEntry.COLUMN_DEGREES)); mWindView.setText(Utility.getFormattedWind(getActivity(), windSpeedStr, windDirStr)); // Read pressure from cursor and update view float pressure = data.getFloat(data.getColumnIndex(WeatherEntry.COLUMN_PRESSURE)); mPressureView.setText(getActivity().getString(R.string.format_pressure, pressure)); // We still need this for the share intent mForecast = String.format("%s - %s - %s/%s", dateText, description, high, low); // If onCreateOptionsMenu has already happened, we need to update the share intent now. if (mShareActionProvider != null) { mShareActionProvider.setShareIntent(createShareForecastIntent()); } } }
/** * Take the String representing the complete forecast in JSON Format and pull out the data we * need to construct the Strings needed for the wireframes. * * <p>Fortunately parsing is easy: constructor takes the JSON string and converts it into an * Object hierarchy for us. */ private ForeCastObj[] getWeatherDataFromJson(String forecastJsonStr, int numDays) throws JSONException { // These are the names of the JSON objects that need to be extracted. final String OWM_LIST = "list"; final String OWM_WEATHER = "weather"; final String OWM_TEMPERATURE = "temp"; final String OWM_MAX = "max"; final String OWM_MIN = "min"; final String OWM_DESCRIPTION = "main"; JSONObject forecastJson = new JSONObject(forecastJsonStr); JSONArray weatherArray = forecastJson.getJSONArray(OWM_LIST); // OWM returns daily forecasts based upon the local time of the city that is being // asked for, which means that we need to know the GMT offset to translate this data // properly. // Since this data is also sent in-order and the first day is always the // current day, we're going to take advantage of that to get a nice // normalized UTC date for all of our weather. Time dayTime = new Time(); dayTime.setToNow(); // we start at the day returned by local time. Otherwise this is a mess. int julianStartDay = Time.getJulianDay(System.currentTimeMillis(), dayTime.gmtoff); // now we work exclusively in UTC dayTime = new Time(); ForeCastObj[] resultStrs = new ForeCastObj[numDays]; for (int i = 0; i < weatherArray.length(); i++) { // For now, using the format "Day, description, hi/low" String day; String description; String highAndLow; // Get the JSON object representing the day JSONObject dayForecast = weatherArray.getJSONObject(i); // The date/time is returned as a long. We need to convert that // into something human-readable, since most people won't read "1400356800" as // "this saturday". long dateTime; // Cheating to convert this to UTC time, which is what we want anyhow dateTime = dayTime.setJulianDay(julianStartDay + i); // day = getReadableDateString(dateTime); day = Utility.getDayName(getApplicationContext(), dateTime); // description is in a child array called "weather", which is 1 element long. JSONObject weatherObject = dayForecast.getJSONArray(OWM_WEATHER).getJSONObject(0); description = weatherObject.getString(OWM_DESCRIPTION); // Temperatures are in a child object called "temp". Try not to name variables // "temp" when working with temperature. It confuses everybody. JSONObject temperatureObject = dayForecast.getJSONObject(OWM_TEMPERATURE); double high = temperatureObject.getDouble(OWM_MAX); double low = temperatureObject.getDouble(OWM_MIN); ForeCastObj tmpObj = new ForeCastObj(); tmpObj.day = day; tmpObj.description = description; Log.d(LOG_TAG, Unit); tmpObj.hight = Utility.formatTemperature( getApplicationContext(), high, (Unit == "metric" ? false : true)); tmpObj.low = Utility.formatTemperature( getApplicationContext(), low, (Unit == "metric" ? false : true)); resultStrs[i] = tmpObj; } return resultStrs; }