package edu.mit.mitmobile2.maps; import java.util.ArrayList; import java.util.List; import java.util.Locale; import android.app.ProgressDialog; import android.app.SearchManager; import android.content.Context; import android.content.Intent; import android.location.Location; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.Parcelable; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import com.esri.core.geometry.Point; import com.esri.core.geometry.Polygon; import edu.mit.mitmobile2.FullScreenLoader; import edu.mit.mitmobile2.HomeScreenActivity; import edu.mit.mitmobile2.MITPlainSecondaryTitleBar; import edu.mit.mitmobile2.MITSearchRecentSuggestions; import edu.mit.mitmobile2.MobileWebApi; import edu.mit.mitmobile2.NewModule; import edu.mit.mitmobile2.NewModuleActivity; import edu.mit.mitmobile2.R; import edu.mit.mitmobile2.TitleBarSwitch; import edu.mit.mitmobile2.TitleBarSwitch.OnToggledListener; import edu.mit.mitmobile2.objs.MapItem; import edu.mit.mitmobile2.objs.MapUpdater; public class MITMapActivity extends NewModuleActivity { private static final String TAG = "MITMapActivity"; public static final String KEY_VIEW_PINS = "view_pins"; public MITMapView map; private FullScreenLoader mLoadingView; protected String module; Context mContext; Location location; Bundle extras; ArrayList<MapItem> mapItems; private MapUpdater mapUpdater; // private HashMap params; private String query; protected ListView mListView; MapItemsAdapter adapter; ProgressDialog progress; TitleBarSwitch mMapListSwitch; private MITPlainSecondaryTitleBar mSecondaryTitleBar; private static String MENU_HOME = "home"; private static String MENU_MY_LOCATION = "my_location"; private static String MENU_BROWSE = "browse"; private static String MENU_BOOKMARKS = "bookmarks"; private static String MENU_SEARCH = "search"; //protected static final String MAP_ITEMS_KEY = "map_items"; //public static final String MAP_DATA_KEY = "map_data"; //public static final String MAP_ITEM_INDEX_KEY = "map_item_index"; public static final String MAP_UPDATER_KEY = "map_updater"; public static final String MAP_UPDATER_PARAMS_KEY = "map_updater_params"; public static final double INIT_RESOLUTION = 1.205; private static String LIST = "LIST"; private static String MAP = "MAP"; static int INIT_ZOOM = 17; // DELETE ? static int INIT_ZOOM_ONE_ITEM = 18; // DELETE ? @Override public void onCreate(Bundle savedInstanceState) { Log.d(TAG,"oncreate()"); super.onCreate(savedInstanceState); mContext = this; setContentView(getLayoutID()); mSecondaryTitleBar = new MITPlainSecondaryTitleBar(this); // hide the title bar initially since there are no results to display mSecondaryTitleBar.setVisibility(View.GONE); mMapListSwitch = new TitleBarSwitch(this); mMapListSwitch.setLabels(MAP, LIST); mMapListSwitch.setSelected(MAP); mMapListSwitch.setOnToggledListener(new OnToggledListener() { @Override public void onToggled(String selected) { toggleMapList(selected); } }); mSecondaryTitleBar.addActionView(mMapListSwitch); getTitleBar().addSecondaryBar(mSecondaryTitleBar); mLoadingView = (FullScreenLoader) findViewById(getMapLoadingViewID()); this.extras = this.getIntent().getExtras(); map = (MITMapView)findViewById(getMapViewID()); mListView = (ListView) findViewById(R.id.mapListView); //map.init(mContext); //Retrieve the non-configuration instance data that was previously returned. Object init = getLastNonConfigurationInstance(); if (init != null) { map.restoreState((String) init); } handleIntent(); } @Override protected boolean isScrollable() { // TODO Auto-generated method stub return false; } @Override protected boolean isModuleHomeActivity() { // TODO Auto-generated method stub return true; } /* * launches a new map activity with pins already set */ public static void launchNewMapItems(Context context, List<MapItem> mapItems) { Intent i = new Intent(context, MITMapActivity.class); i.putExtra(MITMapView.MAP_ITEMS_KEY, new ArrayList<MapItem>(mapItems)); i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); context.startActivity(i); } public static void launchNewMapItem(Context context, MapItem mapItem) { ArrayList<MapItem> mapItems = new ArrayList<MapItem>(); mapItems.add(mapItem); launchNewMapItems(context, mapItems); } @Override public void onDestroy() { Log.d(TAG, "onDestroy()"); super.onDestroy(); } @Override protected void onNewIntent(Intent intent) { Log.d(TAG,"onNewIntent"); handleIntent(intent); } // End of onN @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); Log.d(TAG,"onResume"); map.unpause(); } public MapUpdater getMapUpdater() { return mapUpdater; } public void setMapUpdater(MapUpdater mapUpdater) { this.mapUpdater = mapUpdater; } // public HashMap getParams() { // return params; // } // // public void setParams(HashMap params) { // this.params = params; // } @Override protected void onPause() { // TODO Auto-generated method stub map.pause(); super.onPause(); //Log.d(TAG,"onPause()"); } protected int getLayoutID() { return R.layout.maps; } protected int getMapViewID() { return R.id.map; } /* override this to handle the on map loaded event */ protected void onMapLoaded() { } /* override this to set the extent of the map */ protected void setExtent(double minX,double minY,double maxX, double maxY) { Polygon initialExtent = new Polygon(); // set start point initialExtent.startPath(new Point(minX,minY)); // left side initialExtent.lineTo(minX,maxY); // top initialExtent.lineTo(maxX,maxY); // right initialExtent.lineTo(maxX,minY); //bottom initialExtent.lineTo(minX,minY); map.setExtent(initialExtent); } protected int getMapLoadingViewID() { return R.id.mapLoading; } @Override protected NewModule getNewModule() { return new MapsModule(); } @Override protected void onOptionSelected(String id) { //Log.d(TAG,"option selected = " + id); if (id.equals(MENU_HOME)) { onHomeRequested(); } if (id.equals(MENU_MY_LOCATION)) { onMyLocationRequested(); } if (id.equals(MENU_BROWSE)) { onBrowseRequested(); } if (id.equals(MENU_BOOKMARKS)) { Intent i = new Intent(mContext, MapBookmarksActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); mContext.startActivity(i); } if (id.equals(MENU_SEARCH)) { onSearchRequested(); } } protected void onHomeRequested() { Intent i = new Intent(this, HomeScreenActivity.class); startActivity(i); finish(); } protected void onBrowseRequested() { if (this.getMapUpdater() != null) { this.getMapUpdater().stop(); } Intent i = new Intent(this,MITMapBrowseCatsActivity.class); startActivity(i); } protected void onMyLocationRequested() { // location is always displayed in Map. Selecting my location just centers map to that point map.centerAt(map.ls.getPoint(),true); } @Override public boolean onSearchRequested() { Log.d(TAG,"onSearchRequested"); if (this.getMapUpdater() != null) { this.getMapUpdater().stop(); } return super.onSearchRequested(); } public Handler mapSearchUiHandler = new Handler() { @SuppressWarnings("unchecked") @Override public void handleMessage(Message msg) { //Log.d(TAG,"mapSearchUiHandler success"); if (msg.arg1 == MobileWebApi.SUCCESS) { try { MITSearchRecentSuggestions suggestions = new MITSearchRecentSuggestions(mContext, MapsSearchSuggestionsProvider.AUTHORITY, MapsSearchSuggestionsProvider.MODE); suggestions.saveRecentQuery(query.toLowerCase(Locale.US), null); map.clearMapItems(); ArrayList<MapItem> mapItems = (ArrayList<MapItem>)msg.obj; mSecondaryTitleBar.setTitle("\"" + query + "\" :" + mapItems.size() + " results"); mSecondaryTitleBar.setVisibility(View.VISIBLE); adapter = new MapItemsAdapter(mContext, mapItems); mListView.setAdapter(adapter); mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { ArrayList<MapItem> mapItems = map.getMao().getGraphicsLayers().get(MITMapView.DEFAULT_GRAPHICS_LAYER).getMapItems(); Intent i = new Intent(mContext, MITMapDetailsSliderActivity.class); i.putParcelableArrayListExtra(MITMapView.MAP_ITEMS_KEY, (ArrayList<? extends Parcelable>) mapItems); i.putExtra(MITMapView.MAP_ITEM_INDEX_KEY, position); mContext.startActivity(i); } }); mLoadingView.setVisibility(View.GONE); map.pause(); map.addMapItems(mapItems); //map.syncGraphicsLayers(); map.fitMapItems(); map.unpause(); } catch (Exception e) { Log.d(TAG,"mapSearchUiHander exception"); Log.d(TAG,""+e.getStackTrace().toString()); } } else if (msg.arg1 == MobileWebApi.ERROR) { } else if (msg.arg1 == MobileWebApi.CANCELLED) { } } }; private void toggleMapList(String selected) { if(selected.equals(LIST)) { mListView.setVisibility(View.VISIBLE); map.setVisibility(View.GONE); } else if(selected.equals(MAP)) { mListView.setVisibility(View.GONE); map.setVisibility(View.VISIBLE); } } private void handleIntent() { handleIntent(getIntent()); } @SuppressWarnings({ "rawtypes", "unchecked" }) private void handleIntent(Intent intent) { this.extras = intent.getExtras(); if (Intent.ACTION_SEARCH.equals(intent.getAction())) { //Log.d(TAG,"do search"); query = intent.getStringExtra(SearchManager.QUERY); MITMapsDataModel.executeSearch(query, mapSearchUiHandler, mContext); } else if(extras != null && extras.containsKey(MITMapView.MAP_ITEMS_KEY)) { Log.d(TAG,"extras contains map_items_key"); query = ""; mapItems = (ArrayList)extras.getParcelableArrayList(MITMapView.MAP_ITEMS_KEY); mSecondaryTitleBar.setTitle(""); mSecondaryTitleBar.setVisibility(View.VISIBLE); // Update the list view adapter = new MapItemsAdapter(mContext, mapItems); mListView.setAdapter(adapter); mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { ArrayList<MapItem> mapItems = map.getMao().getGraphicsLayers().get(MITMapView.DEFAULT_GRAPHICS_LAYER).getMapItems(); Intent i = new Intent(mContext, MITMapDetailsSliderActivity.class); i.putParcelableArrayListExtra(MITMapView.MAP_ITEMS_KEY, (ArrayList<? extends Parcelable>) mapItems); i.putExtra(MITMapView.MAP_ITEM_INDEX_KEY, position); mContext.startActivity(i); } }); mLoadingView.setVisibility(View.GONE); map.pause(); map.addMapItems(mapItems); if (mapItems.size() == 1) { map.displayCallout(mContext, mapItems.get(0)); } map.fitMapItems(); map.unpause(); } } }