package edu.mit.mitmobile2.tour; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.content.Intent; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.view.KeyEvent; import android.view.ViewGroup.LayoutParams; import android.widget.LinearLayout; import edu.mit.mitmobile2.AudioPlayer; import edu.mit.mitmobile2.MITMenuItem; import edu.mit.mitmobile2.NewModule; import edu.mit.mitmobile2.R; import edu.mit.mitmobile2.SliderListAdapter; import edu.mit.mitmobile2.SliderListNewModuleActivity; import edu.mit.mitmobile2.tour.Tour.Site; import edu.mit.mitmobile2.tour.Tour.StartLocation; import edu.mit.mitmobile2.tour.Tour.TourItem; import edu.mit.mitmobile2.tour.Tour.TourMapItem; public class TourStopSliderActivity extends SliderListNewModuleActivity { private static final String BEGIN_GUID_KEY = "start_guid"; private static final String SITE_GUID_KEY = "site_guid"; // this key is only used in on newIntent, largely because // we can only give directions if we already know where the user is on the tour private static final String START_WITH_DIRECTIONS_KEY = "start_with_directions"; private List<TourItem> mTourItems; private Tour mTour; private TourProgressBar progbar; private AudioPlayer ap; private LocationManager mLocationManager; private String mLocationProviderName; public static void launchFromSiteGuid(Context context, String guid, boolean startWithDirections) { Intent intent = new Intent(context, TourStopSliderActivity.class); intent.putExtra(SITE_GUID_KEY, guid); intent.putExtra(START_WITH_DIRECTIONS_KEY, startWithDirections); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); context.startActivity(intent); } @Override protected void onStop() { super.onStop(); ap.stop(); } @Override protected void onCreate(Bundle savedInstance) { super.onCreate(savedInstance); setScreenCaching(false); mTour = TourModel.getTour(this); if(getIntent().hasExtra(BEGIN_GUID_KEY)) { String startLocationGuid = getIntent().getStringExtra(BEGIN_GUID_KEY); StartLocation startLocation = mTour.getStartLocation(startLocationGuid); mTourItems = mTour.getTourList(startLocation); } else if(getIntent().hasExtra(SITE_GUID_KEY)) { String siteGuid = getIntent().getStringExtra(SITE_GUID_KEY); Site site = mTour.getSite(siteGuid); mTourItems = mTour.getTourList(site); } refreshTitleBarOptions(); // TODO need to remember what stops we visited if we leave Activity // Progress Bar mSliderView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT, 1f)); LinearLayout sliderTop = (LinearLayout) findViewById(R.id.newSlider_ll_top); progbar = new TourProgressBar(this); progbar.init(mTour.getSites().size(), 0); sliderTop.addView(progbar); // Audio ap = new AudioPlayer(); ap.init(this, null); createView(); this.setOnPositionChangedListener(new SliderListAdapter.OnPositionChangedListener() { @Override public void onPositionChanged(int newPosition, int oldPosition) { ap.setPage(newPosition); ap.stop(); if((newPosition % 2) == 0) { progbar.setProgress(newPosition/2); } refreshTitleBarOptions(); } }); mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE); Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); mLocationProviderName = mLocationManager.getBestProvider(criteria, true); } List<TourStopSliderInterface> mTourStopSliderInterfaces; private Location lastKnownLocation; @Override protected void onResume() { super.onResume(); if(mLocationProviderName != null) { lastKnownLocation = mLocationManager.getLastKnownLocation(mLocationProviderName); if (lastKnownLocation != null) { mLocationListener.onLocationChanged(lastKnownLocation); } mLocationManager.requestLocationUpdates(mLocationProviderName, 5 * 1000, 0, mLocationListener); } } @Override protected void onPause() { super.onPause(); mLocationManager.removeUpdates(mLocationListener); } LocationListener mLocationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { for(TourStopSliderInterface tourStopSliderInterface: mTourStopSliderInterfaces) { tourStopSliderInterface.onLocationChanged(location); } } @Override public void onProviderDisabled(String provider) { } // TODO Auto-generated method stub @Override public void onProviderEnabled(String provider) { } // TODO Auto-generated method stub @Override public void onStatusChanged(String provider, int status, Bundle extras) { } // TODO Auto-generated method stub }; private void createView() { mTourStopSliderInterfaces = new ArrayList<TourStopSliderInterface>(); for(TourItem tourItem : mTourItems) { boolean isSite = (tourItem.getClass() == Site.class); TourStopSliderInterface sliderInterface = new TourStopSliderInterface(this, mTour, tourItem, ap, progbar, isSite); addScreen(sliderInterface, tourItem.getLabel()); mTourStopSliderInterfaces.add(sliderInterface); } //Log.v("tour_debug", "tour_debug: getPositionValue="+String.valueOf(getPositionValue())); addScreen(new TourThankYouSliderInterface(this, mTour.getFooter()), "Thank You"); setPosition(getPositionValue()); progbar.setProgress(getPositionValue()/2); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); if(intent.hasExtra(SITE_GUID_KEY)) { String siteGuid = intent.getStringExtra(SITE_GUID_KEY); int position = getTourItemIndex(siteGuid); boolean startOnPreviousDirections = intent.getBooleanExtra(START_WITH_DIRECTIONS_KEY, false); if(startOnPreviousDirections) { position--; } setPosition(position); progbar.setProgress(position/2); } } private int getTourItemIndex(String siteGuid) { for(int i=0; i < mTourItems.size(); i++) { TourItem tourItem = mTourItems.get(i); if(tourItem.getClass() == Site.class) { Site site = (Site) tourItem; if(site.getSiteGuid().equals(siteGuid)) { // found the site to move the tour to return i; } } } return -1; } @Override protected NewModule getNewModule() { return new TourModule(); } @Override public boolean isModuleHomeActivity() { return false; } private static String MENU_SHOW_TOUR_MAP = "showmap"; private static String MENU_REFRESH_IMAGES = "refreshimages"; private boolean isRefreshableScreen() { if (getPosition() < 0) { return false; } return getPosition() < mTourItems.size(); } @Override protected List<MITMenuItem> getSecondaryMenuItems() { ArrayList<MITMenuItem> items = new ArrayList<MITMenuItem>(); items.add(new MITMenuItem(MENU_SHOW_TOUR_MAP, "Tour Map")); if (isRefreshableScreen()) { items.add(new MITMenuItem(MENU_REFRESH_IMAGES, "Refresh")); } return items; } @Override protected void onOptionSelected(String optionId) { if (optionId == MENU_SHOW_TOUR_MAP) { int tourItemPosition; if(getPosition() < mTourItems.size()) { tourItemPosition = getPosition(); } else { // must be on the thank you screen, just use the last stop tourItemPosition = mTourItems.size()-1; } ArrayList<TourMapItem> tourMapItems = Tour.getTourMapItems(mTourItems, tourItemPosition); TourMapActivity.launch(this, tourMapItems, mTour.getPathGeoPoints(), true); } if (optionId == MENU_REFRESH_IMAGES) { if(isRefreshableScreen()) { int position = getPosition(); mTourStopSliderInterfaces.get(position).refreshImages(); } } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { if(getPosition() > 0) { mSliderView.slideLeft(); return true; } } return super.onKeyDown(keyCode, event); } @Override protected String getHeaderTitle(int position) { if (position < 0) { return ""; } if (position < mTourItems.size()) { return "" + (position+1) + " of " + mTourItems.size(); } else { return ""; } } }