AndroidND.java :  » Database-Persistance » objectdinner » com » androidstartup » view » Android Open Source

Android Open Source » Database Persistance » objectdinner 
objectdinner » com » androidstartup » view » AndroidND.java
package com.androidstartup.view;

import java.io.IOException;
import java.util.List;
import java.util.Locale;

import android.content.Context;
import android.content.Intent;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Message;
import android.view.ContextMenu;
import android.view.GestureDetector;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.SubMenu;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnCreateContextMenuListener;
import android.view.View.OnTouchListener;
import android.widget.Toast;

import com.androidstartup.view.R;
import com.androidstartup.model.Dinner;
import com.androidstartup.model.MapBookmark;
import com.androidstartup.provider.DinnerProvider;
import com.androidstartup.provider.RSVPProvider;
import com.db4o.android.Db4oHelper;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.MyLocationOverlay;
import com.google.android.maps.Overlay;
import com.google.android.maps.Projection;

public class AndroidND extends MapActivity implements LocationListener {
  protected MapView mMapView;
  protected Db4oHelper<Dinner> db4oHelper;
  private MyLocationOverlay myLocationOverlay;
  private BookmarkOverlay bookmarkOverlay;

  private static final int GET_SEARCH_TEXT = 0;
  private static final int SET_DINNER_INFO = 1;
  private static final int RESULT_GOTO_MAP = 2;
  private static final int SEARCH_RESULTS = 3;
  private static final int DB4O_CLIENT_RESULT = 4;

  public static int MAX_RESULTS = 5;
  public static final String NAME = "name";
  public static final String DESC = "desc";
  public static final String DATE = "date";
  public static final String HOST = "host";
  public static final String CONTACT = "contact";
  public static final String ADDRESS = "address";
  public static final String COUNTRY = "country";
  public static final String DB4OSERVICE = "LOCAL";
  
  private boolean ONSEARCH = false;

  Geocoder mGeocoder = null;
  static List<Dinner> foundDinners;
  static String keyword;

  // Menu Item order
  public static final int ZOOM_IN_INDEX = Menu.FIRST;
  public static final int ZOOM_OUT_INDEX = Menu.FIRST + 1;
  public static final int FIND_INDEX = Menu.FIRST + 2;
  public static final int SAVE_INDEX = Menu.FIRST + 3;
  public static final int EDIT_INDEX = Menu.FIRST + 4;
  public static final int MAP_MODE_INDEX = Menu.FIRST + 5;
  public static final int SATELLITE_INDEX = Menu.FIRST + 6;
  public static final int TRAFFIC_INDEX = Menu.FIRST + 7;
  public static final int STREETVIEW_INDEX = Menu.FIRST + 8;
  public static final int BOOKMARK_VIEW_INDEX = Menu.FIRST + 9;
  public static final int COMPASS_INDEX = Menu.FIRST + 10;
  public static final int CENTER_LOCATION_INDEX = Menu.FIRST + 11;
  public static final int TRACK_LOCATION_INDEX = Menu.FIRST + 12;
  public static final int SETTINGS_INDEX = Menu.FIRST + 13;
  public static final int ADD_DINNER = Menu.FIRST + 14;
  public static final int DB4O_CLIENT = Menu.FIRST + 15;

  protected static boolean TRACKING_MODE = false;
  protected static boolean COMPASS_MODE = false;
  protected static boolean BOOKMARK_MODE = true;

  public static MapBookmark bookmark;
  protected DinnerProvider dinnerProvider = DinnerProvider.getInstance(this);
  protected RSVPProvider rsvpProvider = RSVPProvider.getInstance(this);

  protected static final GeoPoint HOME_POINT = new GeoPoint(
      (int) (37.799800872802734 * 1E6), (int) (-122.40699768066406 * 1E6));

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mapview);
    mMapView = (MapView) findViewById(R.id.mapview);
    mMapView.setBuiltInZoomControls(true);
    mMapView.setClickable(true);
    // Initialize db4o
    dbHelper();
    configureBookmarkOverlay();
    // Adds a MyLocationOverlay
    configureTracking();
    configureCompass();
    resetToHomePoint();
  }

  private void configureTracking() {
    myLocationOverlay = new MyLocationOverlay(this, mMapView);
    myLocationOverlay.runOnFirstFix(new Runnable() {
      public void run() {
        mapController().animateTo(myLocationOverlay.getMyLocation());
      }
    });
    mapOverlays().add(myLocationOverlay);
    performTrackLocation(TRACKING_MODE);
  }

  private void configureCompass() {
    performCompassMode(COMPASS_MODE);
  }

  private void configureBookmarkOverlay() {
    bookmarkOverlay = new BookmarkOverlay(this);
    performBookmarkView(BOOKMARK_MODE);
  }

  protected List<Overlay> mapOverlays() {
    return mMapView.getOverlays();
  }

  protected void animateTo(GeoPoint point) {
    mapController().animateTo(point);
  }

  protected void animateTo(GeoPoint point, Message msg) {
    mapController().animateTo(point, msg);
  }

  protected void resetToHomePoint() {
    mMapView.setSatellite(false);
    mMapView.setTraffic(false);
    mMapView.setStreetView(false);
    animateTo(HOME_POINT);
    mapController().setZoom(15);
  }

  protected MapController mapController() {
    return mMapView.getController();
  }

  public Projection getProjection() {
    return mMapView.getProjection();
  }

  protected Db4oHelper<Dinner> dbHelper() {
    if (db4oHelper == null) {
      db4oHelper = new Db4oHelper<Dinner>(this);
      db4oHelper.db();
    }
    return db4oHelper;
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    menu.add(0, FIND_INDEX, FIND_INDEX, R.string.find).setIcon(
        R.drawable.findonmap);
    menu.add(0, SAVE_INDEX, SAVE_INDEX, R.string.add_dinner).setIcon(
        R.drawable.save);
    menu.add(0, EDIT_INDEX, EDIT_INDEX, R.string.dinners).setIcon(
        R.drawable.bookmarks);
    menu.add(0, DB4O_CLIENT, DB4O_CLIENT, "DB Service").setIcon(
        R.drawable.stat_sample);
    // Map Mode submenu
    SubMenu subMenu = menu.addSubMenu(0, MAP_MODE_INDEX, MAP_MODE_INDEX,
        R.string.map_mode).setIcon(R.drawable.mapmode);
    subMenu.add(0, SATELLITE_INDEX, SATELLITE_INDEX, R.string.satellite);
    subMenu.add(0, TRAFFIC_INDEX, TRAFFIC_INDEX, R.string.traffic);
    subMenu.add(0, STREETVIEW_INDEX, STREETVIEW_INDEX, R.string.streetview);
    subMenu.setGroupCheckable(0, true, true);
    // Settings submenu
    SubMenu subMenu2 = menu.addSubMenu(0, SETTINGS_INDEX, SETTINGS_INDEX,
        R.string.settings).setIcon(R.drawable.settings);
    subMenu2.add(0, BOOKMARK_VIEW_INDEX, BOOKMARK_VIEW_INDEX,
        R.string.bookmarkview).setChecked(BOOKMARK_MODE);
    subMenu2.add(0, TRACK_LOCATION_INDEX, TRACK_LOCATION_INDEX,
        R.string.track_gps).setIcon(R.drawable.trackme).setChecked(
        TRACKING_MODE);
    subMenu2.add(0, COMPASS_INDEX, COMPASS_INDEX, R.string.compass)
        .setChecked(COMPASS_MODE);
    subMenu.setGroupCheckable(0, true, true);
    return super.onCreateOptionsMenu(menu);
  }

  public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case ZOOM_IN_INDEX:
      return performZoomIn();
    case ZOOM_OUT_INDEX:
      return performZoomOut();
    case SATELLITE_INDEX:
      item.setChecked(!item.isChecked());
      return performToggleSatellite();
    case TRAFFIC_INDEX:
      item.setChecked(!item.isChecked());
      return performToggleTraffic();
    case STREETVIEW_INDEX:
      item.setChecked(!item.isChecked());
      return performToggleStreetView();
    case FIND_INDEX:
      return performFindLocation();
    case CENTER_LOCATION_INDEX:
      return performCenterOnLocation();
    case BOOKMARK_VIEW_INDEX:
      item.setChecked(!item.isChecked());
      return performBookmarkView(item.isChecked());
    case TRACK_LOCATION_INDEX:
      item.setChecked(!item.isChecked());
      return performTrackLocation(item.isChecked());
    case COMPASS_INDEX:
      item.setChecked(!item.isChecked());
      performCompassMode(item.isChecked());
      return true;
    case SAVE_INDEX:
      return performAddDinner(null);
    case EDIT_INDEX:
      return performViewDinners();
    case DB4O_CLIENT:
      return performDb4oClient();
    }
    return super.onOptionsItemSelected(item);
  }

  public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_I) {
      return performZoomIn();
    } else if (keyCode == KeyEvent.KEYCODE_O) {
      return performZoomOut();
    } else if (keyCode == KeyEvent.KEYCODE_S) {
      return performToggleSatellite();
    } else if (keyCode == KeyEvent.KEYCODE_T) {
      return performToggleTraffic();
    } else if (keyCode == KeyEvent.KEYCODE_V) {
      return performToggleStreetView();
    } else if (keyCode == KeyEvent.KEYCODE_F) {
      return performFindLocation();
    } else if (keyCode == KeyEvent.KEYCODE_G) {
      return performCenterOnLocation();
    } else if (keyCode == KeyEvent.KEYCODE_C) {
      return performAddDinner(null);
    } else if (keyCode == KeyEvent.KEYCODE_E) {
      return performViewDinners();
    } else if (keyCode == KeyEvent.KEYCODE_P) {
      return performFindPizza();
    } else if (keyCode >= KeyEvent.KEYCODE_1
        && keyCode <= KeyEvent.KEYCODE_9) {
    }
    return super.onKeyDown(keyCode, event);
  }

  public List<Dinner> getDinners() {
    return foundDinners;
  }

  @Override
  public boolean onContextItemSelected(MenuItem item) {
    return true;
  }

  public void addContextMenu() {
    // mMapView.setLongClickable(true);
    registerForContextMenu(mMapView);
    mMapView
        .setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
          public void onCreateContextMenu(ContextMenu menu, View v,
              ContextMenuInfo menuInfo) {
            MenuInflater cntmenu = getMenuInflater();
            cntmenu.inflate(R.menu.map_menu, menu);
          }
        });
    handleLongPress();
  }

  private void handleLongPress() {
    final GestureDetector gd = new GestureDetector(
        new GestureDetector.SimpleOnGestureListener() {
          @Override
          public void onLongPress(MotionEvent e) {
            openContextMenu(mMapView);
          }
        });
    gd.setIsLongpressEnabled(true);
    mMapView.setOnTouchListener(new OnTouchListener() {
      public boolean onTouch(View v, MotionEvent ev) {
        return gd.onTouchEvent(ev);
      }
    });
  }

  public boolean performZoomIn() {
    int level = mMapView.getZoomLevel();
    mapController().setZoom(level + 1);
    return true;
  }

  public boolean performZoomOut() {
    int level = mMapView.getZoomLevel();
    mapController().setZoom(level - 1);
    return true;
  }

  public boolean performToggleSatellite() {
    mMapView.setSatellite(!mMapView.isSatellite());
    return true;
  }

  public boolean performToggleTraffic() {
    mMapView.setTraffic(!mMapView.isTraffic());
    return true;
  }

  public boolean performToggleStreetView() {
    mMapView.setStreetView(!mMapView.isStreetView());
    return true;
  }

  public boolean performFindLocation() {
    Intent intent = new Intent(AndroidND.this,
        com.androidstartup.view.Search.class);
    startActivityForResult(intent, GET_SEARCH_TEXT);
    return true;
  }

  // Get last known location and center map on it
  public boolean performCenterOnLocation() {
    // Get location manager
    LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    // Register this as location listener
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
        3000, 1, this);// 3 secs, 10m
    // Select best provider (will try GPS first, then network triangulation)
    String provider = locationManager.getBestProvider(new Criteria(), true);
    if (provider == null) {
      notifyUser("No location provider found");
      return false;
    }
    if (!locationManager.isProviderEnabled(provider)) {
      notifyUser(provider + " is disabled");
      return false;
    }
    Location currentLocation = locationManager
        .getLastKnownLocation(provider);
    if (currentLocation == null) {
      notifyUser("Unknown location");// Usual response in the emulator if
      // there's no mock location
      return false;
    }
    // Get point
    GeoPoint point = new GeoPoint(
        (int) (currentLocation.getLatitude() * 1E6),
        (int) (currentLocation.getLongitude() * 1E6));
    // Center on map
    animateTo(point);
    return true;
  }

  public void onLocationChanged(Location location) {
    if (location != null) {
      int lat = (int) (location.getLatitude() * 1E6);
      int lon = (int) (location.getLongitude() * 1E6);
      GeoPoint p = new GeoPoint(lat, lon);
      animateTo(p);
    }
  }

  public boolean performCompassMode(boolean isChecked) {
    COMPASS_MODE = isChecked;
    if (isChecked)
      myLocationOverlay.enableCompass();
    else
      myLocationOverlay.disableCompass();
    mMapView.invalidate();
    return true;
  }

  public boolean performTrackLocation(boolean isChecked) {
    TRACKING_MODE = isChecked;
    if (isChecked)
      myLocationOverlay.enableMyLocation();
    else {
      myLocationOverlay.disableMyLocation();
      // Get location manager
      LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
      locationManager.removeUpdates(this);
    }
    mMapView.invalidate();
    return true;
  }

  public boolean performBookmarkView(boolean isChecked) {
    BOOKMARK_MODE = isChecked;
    if (isChecked)
      mapOverlays().add(bookmarkOverlay);
    else
      mapOverlays().remove(bookmarkOverlay);
    mMapView.invalidate();
    return true;
  }

  public boolean performAddDinner(GeoPoint point) {
    Intent intent = new Intent(AndroidND.this,
        com.androidstartup.view.AddDinner.class);
    setBookmark(point);
    startActivityForResult(intent, SET_DINNER_INFO);
    return true;
  }
  
  public boolean performDb4oClient() {
    Intent intent = new Intent(AndroidND.this,
        com.db4o.android.Db4oClient.class);
    startActivityForResult(intent, DB4O_CLIENT_RESULT);
    return true;
  }

  private void setBookmark(GeoPoint point) {
    if (point == null) {
      point = mMapView.getMapCenter();
    }
    MapBookmark mb = new MapBookmark();
    mb.setLatitude(point.getLatitudeE6());
    mb.setLongitude(point.getLongitudeE6());
    mb.setZoomLevel(mMapView.getZoomLevel());
    mb.setSatellite(mMapView.isSatellite());
    mb.setTraffic(mMapView.isTraffic());
    AndroidND.bookmark = mb;
  }

  public boolean performViewDinners() {
    Intent intent = new Intent(AndroidND.this,
        com.androidstartup.view.DinnerList.class);
    startActivity(intent);
    return true;
  }

  public boolean performEditSearchResults() {
    Intent intent = new Intent(AndroidND.this,
        com.androidstartup.view.SearchList.class);
    startActivityForResult(intent, SEARCH_RESULTS);
    return true;
  }

  public boolean performViewDinner(Dinner dinner) {
    Intent intent = new Intent(AndroidND.this,
        com.androidstartup.view.ViewDinner.class);
    intent.putExtra(NAME, dinner.getName());
    startActivity(intent);
    return true;
  }

  // Example
  public boolean performFindPizza() {
    startSearch("Pizza");
    return true;
  }

  private void startSearch(final String text) {
      keyword = text;
      performEditSearchResults();
  }

  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == GET_SEARCH_TEXT) {
      if (data != null) {
        String searchString = data.getStringExtra("searchString");
        startSearch(searchString);
      }
    } else if (requestCode == SET_DINNER_INFO) {
      if (data != null) {
        String address = data.getStringExtra(ADDRESS);
        refreshPointTo(address);
      }
    } else if (requestCode == SEARCH_RESULTS) {
      if (resultCode == RESULT_GOTO_MAP) {
        ONSEARCH = true;
        if (mMapView.isSatellite() != AndroidND.bookmark.isSatellite())
          mMapView.setSatellite(true);
        if (mMapView.isTraffic() != AndroidND.bookmark.isTraffic())
          mMapView.setTraffic(true);
        // Add permanent map overlays
        // mapOverlays().add(new SearchOverlay(this));
        // Navigate to point
        GeoPoint p = new GeoPoint(AndroidND.bookmark.getLatitude(),
            AndroidND.bookmark.getLongitude());
        animateTo(p);
        mapController().setZoom(AndroidND.bookmark.getZoomLevel());
      }
    } else if (requestCode == DB4O_CLIENT_RESULT) {
      notifyUser(DB4OSERVICE);
      //db4oHelper.setDb(Db4oClient.objectContainer);
    }
  }

  private void refreshPointTo(String address) {
    mGeocoder = new Geocoder(this.getApplicationContext(), Locale
        .getDefault());
    try {
      List<Address> foundAddresses = mGeocoder.getFromLocationName(address, 1);
      Address addr = foundAddresses.get(0);
      GeoPoint p = new GeoPoint(((int) (1E6 * addr.getLatitude())),
          ((int) (1E6 * addr.getLongitude())));
      setBookmark(p);
      animateTo(p);
    } catch (IOException e) {
      notifyUser("Search failed: " + e.getMessage());
    }
  }

  /* Utility methods */

  // Popup window to quickly pass user notifications
  void notifyUser(Context ctx, String message) {
    Toast.makeText(ctx, message, Toast.LENGTH_SHORT).show();
  }

  void notifyUser(String message) {
    notifyUser(AndroidND.this, message);
  }

  /* Lifecycle methods */

  @Override
  protected void onPause() {
    super.onPause();
    if (TRACKING_MODE)
      myLocationOverlay.disableMyLocation();
    if (COMPASS_MODE)
      myLocationOverlay.disableCompass();
    dbHelper().close();
    db4oHelper = null;
  }

  @Override
  protected void onResume() {
    super.onResume();
    if (TRACKING_MODE && !myLocationOverlay.isMyLocationEnabled())
      myLocationOverlay.enableMyLocation();
    if (COMPASS_MODE && !myLocationOverlay.isCompassEnabled())
      myLocationOverlay.enableCompass();
    //mMapView.invalidate();
    if(!ONSEARCH)
      resetToHomePoint();
    else
      ONSEARCH = false;
  }

  @Override
  protected boolean isRouteDisplayed() {
    return false;
  }

  public void onProviderDisabled(String arg0) {
    // TODO Auto-generated method stub
  }

  public void onProviderEnabled(String provider) {
    // TODO Auto-generated method stub
  }

  public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub
  }

}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.