package course.labs.contentproviderlab; import android.app.ListActivity; import android.app.LoaderManager.LoaderCallbacks; import android.content.Context; import android.content.CursorLoader; import android.content.Loader; import android.database.Cursor; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Toast; import course.labs.contentproviderlab.provider.PlaceBadgesContract; public class PlaceViewActivity extends ListActivity implements LocationListener, LoaderCallbacks<Cursor> { private static final long FIVE_MINS = 5 * 60 * 1000; private static String TAG = "Lab-ContentProvider"; // False if you don't have network access // Use this variable when starting a PlaceDownloaderTask public static boolean sHasNetwork = false; private boolean mMockLocationOn = false; // The last valid location reading private Location mLastLocationReading; // The ListView's adapter // private PlaceViewAdapter mAdapter; private PlaceViewAdapter mCursorAdapter; // default minimum time between new location readings private long mMinTime = 5000; // default minimum distance between old and new readings. private float mMinDistance = 1000.0f; // Reference to the LocationManager private LocationManager mLocationManager; // A fake location provider used for testing private MockLocationProvider mMockLocationProvider; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (!Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { Toast.makeText(getApplicationContext(), "External Storage is not available.", Toast.LENGTH_LONG) .show(); finish(); } mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); // TODO - add a footerView to the ListView // You can use footer_view.xml to define the footer View footerView = null; // TODO remove after completing TODO immediately above if (null == footerView ) { return; } // TODO - footerView must respond to user clicks, handling 3 cases: // There is no current location - response is up to you. The best // solution is to always disable the footerView until you have a // location. // There is a current location, but the user has already acquired a // PlaceBadge for this location - issue a Toast message with the text - // "You already have this location badge." // Use the PlaceRecord class' intersects() method to determine whether // a PlaceBadge already exists for a given location // There is a current location for which the user does not already have // a PlaceBadge. In this case download the information needed to make a new // PlaceBadge. footerView.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { Log.i(TAG, "Entered footerView.OnClickListener.onClick()"); } }); getListView().addFooterView(footerView); // TODO - Create and set empty PlaceViewAdapter mCursorAdapter = null; // TODO - Initialize the loader } @Override protected void onResume() { super.onResume(); startMockLocationManager(); // TODO - Check NETWORK_PROVIDER for an existing location reading. // Only keep this last reading if it is fresh - less than 5 minutes old // TODO - register to receive location updates from NETWORK_PROVIDER } @Override protected void onPause() { // TODO - unregister for location updates mLocationManager.removeUpdates(this); shutdownMockLocationManager(); super.onPause(); } public void addNewPlace(PlaceRecord place) { Log.i(TAG, "Entered addNewPlace()"); // TODO - Attempt to add place to the adapter, considering the following cases // A PlaceBadge for this location already exists - issue a Toast message // with the text - "You already have this location badge." Use the PlaceRecord // class' intersects() method to determine whether a PlaceBadge already exists // for a given location. Do not add the PlaceBadge to the adapter // The place is null - issue a Toast message with the text // "PlaceBadge could not be acquired" // Do not add the PlaceBadge to the adapter // The place has no country name - issue a Toast message // with the text - "There is no country at this location". // Do not add the PlaceBadge to the adapter // Otherwise - add the PlaceBadge to the adapter } // LocationListener methods @Override public void onLocationChanged(Location currentLocation) { // TODO - Update location considering the following cases. // 1) If there is no last location, set the last location to the current // location. // 2) If the current location is older than the last location, ignore // the current location // 3) If the current location is newer than the last locations, keep the // current location. } @Override public void onProviderDisabled(String provider) { // not implemented } @Override public void onProviderEnabled(String provider) { // not implemented } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // not implemented } // LoaderCallback methods @Override public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) { Log.i(TAG, "Entered onCreateLoader()"); // TODO - Create a new CursorLoader and return it return null; } @Override public void onLoadFinished(Loader<Cursor> newLoader, Cursor newCursor) { Log.i(TAG, "Entered onLoadFinished()"); // TODO - Swap in the newCursor } @Override public void onLoaderReset(Loader<Cursor> newLoader) { Log.i(TAG, "Entered onLoaderReset()"); // TODO - swap in a null Cursor } // Returns age of location in milliseconds private long ageInMilliseconds(Location location) { return System.currentTimeMillis() - location.getTime(); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.delete_badges: if (null != mCursorAdapter) { mCursorAdapter.removeAllViews(); } return true; case R.id.place_one: mMockLocationProvider.pushLocation(37.422, -122.084); return true; case R.id.place_no_country: mMockLocationProvider.pushLocation(0, 0); return true; case R.id.place_two: mMockLocationProvider.pushLocation(38.996667, -76.9275); return true; default: return super.onOptionsItemSelected(item); } } private void shutdownMockLocationManager() { if (mMockLocationOn) { mMockLocationProvider.shutdown(); } } private void startMockLocationManager() { if (!mMockLocationOn) { mMockLocationProvider = new MockLocationProvider( LocationManager.NETWORK_PROVIDER, this); } } }