Created
May 22, 2015 22:25
-
-
Save haristhohir/063c5112783ff53d244d 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
public class DetailFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> { | |
private static final String LOG_TAG = DetailFragment.class.getSimpleName(); | |
private static final String FORECAST_SHARE_HASHTAG = " #SunshineApp"; | |
private ShareActionProvider mShareActionProvider; | |
private String mForecast; | |
private static final int DETAIL_LOADER = 0; | |
private static final String[] DETAIL_COLUMNS = { | |
WeatherEntry.TABLE_NAME + "." + WeatherEntry._ID, | |
WeatherEntry.COLUMN_DATE, | |
WeatherEntry.COLUMN_SHORT_DESC, | |
WeatherEntry.COLUMN_MAX_TEMP, | |
WeatherEntry.COLUMN_MIN_TEMP, | |
WeatherEntry.COLUMN_HUMIDITY, | |
WeatherEntry.COLUMN_PRESSURE, | |
WeatherEntry.COLUMN_WIND_SPEED, | |
WeatherEntry.COLUMN_DEGREES, | |
WeatherEntry.COLUMN_WEATHER_ID, | |
// This works because the WeatherProvider returns location data joined with | |
// weather data, even though they're stored in two different tables. | |
WeatherContract.LocationEntry.COLUMN_LOCATION_SETTING | |
}; | |
// These indices are tied to DETAIL_COLUMNS. If DETAIL_COLUMNS changes, these | |
// must change. | |
public static final int COL_WEATHER_ID = 0; | |
public static final int COL_WEATHER_DATE = 1; | |
public static final int COL_WEATHER_DESC = 2; | |
public static final int COL_WEATHER_MAX_TEMP = 3; | |
public static final int COL_WEATHER_MIN_TEMP = 4; | |
public static final int COL_WEATHER_HUMIDITY = 5; | |
public static final int COL_WEATHER_PRESSURE = 6; | |
public static final int COL_WEATHER_WIND_SPEED = 7; | |
public static final int COL_WEATHER_DEGREES = 8; | |
public static final int COL_WEATHER_CONDITION_ID = 9; | |
private ImageView mIconView; | |
private TextView mFriendlyDateView; | |
private TextView mDateView; | |
private TextView mDescriptionView; | |
private TextView mHighTempView; | |
private TextView mLowTempView; | |
private TextView mHumidityView; | |
private TextView mWindView; | |
private TextView mPressureView; | |
public DetailFragment() { | |
setHasOptionsMenu(true); | |
} | |
@Override | |
public View onCreateView(LayoutInflater inflater, ViewGroup container, | |
Bundle savedInstanceState) { | |
View rootView = inflater.inflate(R.layout.fragment_detail, container, false); | |
mIconView = (ImageView) rootView.findViewById(R.id.detail_icon); | |
mDateView = (TextView) rootView.findViewById(R.id.detail_date_textview); | |
mFriendlyDateView = (TextView) rootView.findViewById(R.id.detail_day_textview); | |
mDescriptionView = (TextView) rootView.findViewById(R.id.detail_forecast_textview); | |
mHighTempView = (TextView) rootView.findViewById(R.id.detail_high_textview); | |
mLowTempView = (TextView) rootView.findViewById(R.id.detail_low_textview); | |
mHumidityView = (TextView) rootView.findViewById(R.id.detail_humidity_textview); | |
mWindView = (TextView) rootView.findViewById(R.id.detail_wind_textview); | |
mPressureView = (TextView) rootView.findViewById(R.id.detail_pressure_textview); | |
return rootView; | |
} | |
@Override | |
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { | |
// Inflate the menu; this adds items to the action bar if it is present. | |
inflater.inflate(R.menu.detailfragment, menu); | |
// Retrieve the share menu item | |
MenuItem menuItem = menu.findItem(R.id.action_share); | |
// Get the provider and hold onto it to set/change the share intent. | |
mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(menuItem); | |
// If onLoadFinished happens before this, we can go ahead and set the share intent now. | |
if (mForecast != null) { | |
mShareActionProvider.setShareIntent(createShareForecastIntent()); | |
} | |
} | |
private Intent createShareForecastIntent() { | |
Intent shareIntent = new Intent(Intent.ACTION_SEND); | |
shareIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); | |
shareIntent.setType("text/plain"); | |
shareIntent.putExtra(Intent.EXTRA_TEXT, mForecast + FORECAST_SHARE_HASHTAG); | |
return shareIntent; | |
} | |
@Override | |
public void onActivityCreated(Bundle savedInstanceState) { | |
getLoaderManager().initLoader(DETAIL_LOADER, null, this); | |
super.onActivityCreated(savedInstanceState); | |
} | |
@Override | |
public Loader<Cursor> onCreateLoader(int id, Bundle args) { | |
Log.v(LOG_TAG, "In onCreateLoader"); | |
Intent intent = getActivity().getIntent(); | |
if (intent == null) { | |
return null; | |
} | |
// Now create and return a CursorLoader that will take care of | |
// creating a Cursor for the data being displayed. | |
return new CursorLoader( | |
getActivity(), | |
intent.getData(), | |
DETAIL_COLUMNS, | |
null, | |
null, | |
null | |
); | |
} | |
@Override | |
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { | |
if (data != null && data.moveToFirst()) { | |
// Read weather condition ID from cursor | |
int weatherId = data.getInt(COL_WEATHER_CONDITION_ID); | |
// Use placeholder Image | |
mIconView.setImageResource(R.drawable.ic_launcher); | |
// Read date from cursor and update views for day of week and date | |
long date = data.getLong(COL_WEATHER_DATE); | |
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(COL_WEATHER_DESC); | |
mDescriptionView.setText(description); | |
// Read high temperature from cursor and update view | |
boolean isMetric = Utility.isMetric(getActivity()); | |
double high = data.getDouble(COL_WEATHER_MAX_TEMP); | |
String highString = Utility.formatTemperature(getActivity(), high, isMetric); | |
mHighTempView.setText(highString); | |
// Read low temperature from cursor and update view | |
double low = data.getDouble(COL_WEATHER_MIN_TEMP); | |
String lowString = Utility.formatTemperature(getActivity(), low, isMetric); | |
mLowTempView.setText(lowString); | |
// Read humidity from cursor and update view | |
float humidity = data.getFloat(COL_WEATHER_HUMIDITY); | |
mHumidityView.setText(getActivity().getString(R.string.format_humidity, humidity)); | |
// Read wind speed and direction from cursor and update view | |
float windSpeedStr = data.getFloat(COL_WEATHER_WIND_SPEED); | |
float windDirStr = data.getFloat(COL_WEATHER_DEGREES); | |
mWindView.setText(Utility.getFormattedWind(getActivity(), windSpeedStr, windDirStr)); | |
// Read pressure from cursor and update view | |
float pressure = data.getFloat(COL_WEATHER_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()); | |
} | |
} | |
} | |
@Override | |
public void onLoaderReset(Loader<Cursor> loader) { } | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment