package carnero.cgeo;
import gnu.android.app.appmanualclient.*;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.net.Uri;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import com.google.android.apps.analytics.GoogleAnalyticsTracker;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class cgeopoint extends Activity {
private Resources res = null;
private cgeoapplication app = null;
private cgSettings settings = null;
private SharedPreferences prefs = null;
private cgBase base = null;
private cgWarning warning = null;
private Activity activity = null;
private GoogleAnalyticsTracker tracker = null;
private cgGeo geo = null;
private cgUpdateLoc geoUpdate = new update();
private EditText latEdit = null;
private EditText lonEdit = null;
private boolean changed = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// init
activity = this;
app = (cgeoapplication) this.getApplication();
res = this.getResources();
settings = new cgSettings(activity, activity.getSharedPreferences(cgSettings.preferences, 0));
prefs = getSharedPreferences(cgSettings.preferences, 0);
base = new cgBase(app, settings, activity.getSharedPreferences(cgSettings.preferences, 0));
warning = new cgWarning(activity);
// set layout
if (settings.skin == 1) {
setTheme(R.style.light);
} else {
setTheme(R.style.dark);
}
setContentView(R.layout.point);
base.setTitle(activity, res.getString(R.string.search_destination));
// google analytics
tracker = GoogleAnalyticsTracker.getInstance();
tracker.start(cgSettings.analytics, this);
tracker.dispatch();
base.sendAnal(activity, tracker, "/point");
init();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
init();
}
@Override
public void onResume() {
super.onResume();
settings.load();
init();
}
@Override
public void onDestroy() {
if (geo != null) {
geo = app.removeGeo();
}
if (tracker != null) {
tracker.stop();
}
super.onDestroy();
}
@Override
public void onStop() {
if (geo != null) {
geo = app.removeGeo();
}
super.onStop();
}
@Override
public void onPause() {
if (geo != null) {
geo = app.removeGeo();
}
super.onPause();
}
private void init() {
if (geo == null) {
geo = app.startGeo(activity, geoUpdate, base, settings, warning, 0, 0);
}
EditText latitudeEdit = (EditText) findViewById(R.id.latitude);
latitudeEdit.setOnKeyListener(new View.OnKeyListener() {
public boolean onKey(View v, int i, KeyEvent k) {
changed = true;
return false;
}
});
EditText longitudeEdit = (EditText) findViewById(R.id.longitude);
longitudeEdit.setOnKeyListener(new View.OnKeyListener() {
public boolean onKey(View v, int i, KeyEvent k) {
changed = true;
return false;
}
});
if (prefs.contains("anylatitude") == true && prefs.contains("anylongitude") == true) {
latitudeEdit.setText(base.formatCoordinate(new Double(prefs.getFloat("anylatitude", 0f)), "lat", true));
longitudeEdit.setText(base.formatCoordinate(new Double(prefs.getFloat("anylongitude", 0f)), "lon", true));
}
Button buttonCurrent = (Button) findViewById(R.id.current);
buttonCurrent.setOnClickListener(new currentListener());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, 2, 0, res.getString(R.string.cache_menu_compass)).setIcon(android.R.drawable.ic_menu_compass); // compass
SubMenu subMenu = menu.addSubMenu(1, 0, 0, res.getString(R.string.cache_menu_navigate)).setIcon(android.R.drawable.ic_menu_more);
subMenu.add(0, 3, 0, res.getString(R.string.cache_menu_radar)); // radar
subMenu.add(0, 1, 0, res.getString(R.string.cache_menu_map)); // c:geo map
if (base.isLocus(activity)) {
subMenu.add(0, 20, 0, res.getString(R.string.cache_menu_locus)); // ext.: locus
}
if (base.isRmaps(activity)) {
subMenu.add(0, 21, 0, res.getString(R.string.cache_menu_rmaps)); // ext.: rmaps
}
subMenu.add(0, 23, 0, res.getString(R.string.cache_menu_map_ext)); // ext.: other
subMenu.add(0, 4, 0, res.getString(R.string.cache_menu_tbt)); // turn-by-turn
menu.add(0, 5, 0, res.getString(R.string.cache_menu_around)).setIcon(android.R.drawable.ic_menu_rotate); // caches around
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
try {
ArrayList<Double> coords = getDestination();
if (coords != null && coords.get(0) != null && coords.get(1) != null) {
menu.findItem(0).setVisible(true);
menu.findItem(2).setVisible(true);
menu.findItem(5).setVisible(true);
} else {
menu.findItem(0).setVisible(false);
menu.findItem(2).setVisible(false);
menu.findItem(5).setVisible(false);
}
} catch (Exception e) {
// nothing
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
final int menuItem = item.getItemId();
ArrayList<Double> coords = getDestination();
if (menuItem == 1) {
showOnMap();
return true;
} else if (menuItem == 2) {
navigateTo();
return true;
} else if (menuItem == 3) {
radarTo();
return true;
} else if (menuItem == 4) {
if (geo != null) {
base.runNavigation(activity, res, settings, warning, tracker, coords.get(0), coords.get(1), geo.latitudeNow, geo.longitudeNow);
} else {
base.runNavigation(activity, res, settings, warning, tracker, coords.get(0), coords.get(1));
}
return true;
} else if (menuItem == 5) {
cachesAround();
return true;
} else if (menuItem == 20) {
base.runExternalMap(cgBase.mapAppLocus, activity, res, warning, tracker, coords.get(0), coords.get(1)); // locus
return true;
} else if (menuItem == 21) {
base.runExternalMap(cgBase.mapAppRmaps, activity, res, warning, tracker, coords.get(0), coords.get(1)); // rmaps
return true;
} else if (menuItem == 23) {
base.runExternalMap(cgBase.mapAppAny, activity, res, warning, tracker, coords.get(0), coords.get(1)); // rmaps
return true;
}
return false;
}
private void showOnMap() {
ArrayList<Double> coords = getDestination();
if (coords == null || coords.get(0) == null || coords.get(1) == null) {
warning.showToast(res.getString(R.string.err_location_unknown));
}
Intent mapIntent = new Intent(activity, settings.getMapFactory().getMapClass());
mapIntent.putExtra("latitude", coords.get(0));
mapIntent.putExtra("longitude", coords.get(1));
activity.startActivity(mapIntent);
}
private void navigateTo() {
ArrayList<Double> coords = getDestination();
if (coords == null || coords.get(0) == null || coords.get(1) == null) {
warning.showToast(res.getString(R.string.err_location_unknown));
}
cgeonavigate navigateActivity = new cgeonavigate();
Intent navigateIntent = new Intent(activity, navigateActivity.getClass());
navigateIntent.putExtra("latitude", coords.get(0));
navigateIntent.putExtra("longitude", coords.get(1));
navigateIntent.putExtra("geocode", "");
navigateIntent.putExtra("name", "Some destination");
activity.startActivity(navigateIntent);
}
private void radarTo() {
ArrayList<Double> coords = getDestination();
if (coords == null || coords.get(0) == null || coords.get(1) == null) {
warning.showToast(res.getString(R.string.err_location_unknown));
}
try {
if (cgBase.isIntentAvailable(activity, "com.google.android.radar.SHOW_RADAR") == true) {
Intent radarIntent = new Intent("com.google.android.radar.SHOW_RADAR");
radarIntent.putExtra("latitude", new Float(coords.get(0)));
radarIntent.putExtra("longitude", new Float(coords.get(1)));
activity.startActivity(radarIntent);
} else {
AlertDialog.Builder dialog = new AlertDialog.Builder(activity);
dialog.setTitle(res.getString(R.string.err_radar_title));
dialog.setMessage(res.getString(R.string.err_radar_message));
dialog.setCancelable(true);
dialog.setPositiveButton("yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
try {
activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://search?q=pname:com.eclipsim.gpsstatus2")));
dialog.cancel();
} catch (Exception e) {
warning.showToast(res.getString(R.string.err_radar_market));
Log.e(cgSettings.tag, "cgeopoint.radarTo.onClick: " + e.toString());
}
}
});
dialog.setNegativeButton("no", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = dialog.create();
alert.show();
}
} catch (Exception e) {
warning.showToast(res.getString(R.string.err_radar_generic));
Log.e(cgSettings.tag, "cgeopoint.radarTo: " + e.toString());
}
}
private void cachesAround() {
ArrayList<Double> coords = getDestination();
if (coords == null || coords.get(0) == null || coords.get(1) == null) {
warning.showToast(res.getString(R.string.err_location_unknown));
}
cgeocaches cachesActivity = new cgeocaches();
Intent cachesIntent = new Intent(activity, cachesActivity.getClass());
cachesIntent.putExtra("type", "coordinate");
cachesIntent.putExtra("latitude", coords.get(0));
cachesIntent.putExtra("longitude", coords.get(1));
cachesIntent.putExtra("cachetype", settings.cacheType);
activity.startActivity(cachesIntent);
finish();
}
private class update extends cgUpdateLoc {
@Override
public void updateLoc(cgGeo geo) {
if (geo == null) {
return;
}
try {
if (latEdit == null) {
latEdit = (EditText) findViewById(R.id.latitude);
}
if (lonEdit == null) {
lonEdit = (EditText) findViewById(R.id.longitude);
}
latEdit.setHint(base.formatCoordinate(geo.latitudeNow, "lat", false));
lonEdit.setHint(base.formatCoordinate(geo.longitudeNow, "lon", false));
} catch (Exception e) {
Log.w(cgSettings.tag, "Failed to update location.");
}
}
}
private class currentListener implements View.OnClickListener {
public void onClick(View arg0) {
if (geo == null || geo.latitudeNow == null || geo.longitudeNow == null) {
warning.showToast(res.getString(R.string.err_point_unknown_position));
return;
}
((EditText) findViewById(R.id.latitude)).setText(base.formatCoordinate(geo.latitudeNow, "lat", true));
((EditText) findViewById(R.id.longitude)).setText(base.formatCoordinate(geo.longitudeNow, "lon", true));
changed = false;
}
}
private ArrayList<Double> getDestination() {
ArrayList<Double> coords = new ArrayList<Double>();
Double latitude = null;
Double longitude = null;
String bearingText = ((EditText) findViewById(R.id.bearing)).getText().toString();
String distanceText = ((EditText) findViewById(R.id.distance)).getText().toString();
String latText = ((EditText) findViewById(R.id.latitude)).getText().toString();
String lonText = ((EditText) findViewById(R.id.longitude)).getText().toString();
if ((bearingText == null || bearingText.length() == 0) && (distanceText == null || distanceText.length() == 0)
&& (latText == null || latText.length() == 0) && (lonText == null || lonText.length() == 0)) {
warning.helpDialog(res.getString(R.string.err_point_no_position_given_title), res.getString(R.string.err_point_no_position_given));
return null;
}
if (latText != null && latText.length() > 0 && lonText != null && lonText.length() > 0) {
// latitude & longitude
HashMap<String, Object> latParsed = base.parseCoordinate(latText, "lat");
HashMap<String, Object> lonParsed = base.parseCoordinate(lonText, "lat");
if (latParsed == null || latParsed.get("coordinate") == null || latParsed.get("string") == null) {
warning.showToast(res.getString(R.string.err_parse_lat));
return null;
}
if (lonParsed == null || lonParsed.get("coordinate") == null || lonParsed.get("string") == null) {
warning.showToast(res.getString(R.string.err_parse_lon));
return null;
}
latitude = (Double) latParsed.get("coordinate");
longitude = (Double) lonParsed.get("coordinate");
} else {
if (geo == null || geo.latitudeNow == null || geo.longitudeNow == null) {
warning.showToast(res.getString(R.string.err_point_curr_position_unavailable));
return null;
}
latitude = geo.latitudeNow;
longitude = geo.longitudeNow;
}
if (bearingText != null && bearingText.length() > 0 && distanceText != null && distanceText.length() > 0) {
// bearing & distance
Double bearing = null;
try {
bearing = new Double(bearingText);
} catch (Exception e) {
// probably not a number
}
if (bearing == null) {
warning.helpDialog(res.getString(R.string.err_point_bear_and_dist_title), res.getString(R.string.err_point_bear_and_dist));
return null;
}
Double distance = null; // km
final Pattern patternA = Pattern.compile("^([0-9\\.\\,]+)[ ]*m$", Pattern.CASE_INSENSITIVE); // m
final Pattern patternB = Pattern.compile("^([0-9\\.\\,]+)[ ]*km$", Pattern.CASE_INSENSITIVE); // km
final Pattern patternC = Pattern.compile("^([0-9\\.\\,]+)[ ]*ft$", Pattern.CASE_INSENSITIVE); // ft - 0.3048m
final Pattern patternD = Pattern.compile("^([0-9\\.\\,]+)[ ]*yd$", Pattern.CASE_INSENSITIVE); // yd - 0.9144m
final Pattern patternE = Pattern.compile("^([0-9\\.\\,]+)[ ]*mi$", Pattern.CASE_INSENSITIVE); // mi - 1609.344m
Matcher matcherA = patternA.matcher(distanceText);
Matcher matcherB = patternB.matcher(distanceText);
Matcher matcherC = patternC.matcher(distanceText);
Matcher matcherD = patternD.matcher(distanceText);
Matcher matcherE = patternE.matcher(distanceText);
if (matcherA.find() == true && matcherA.groupCount() > 0) {
distance = (new Double(matcherA.group(1))) * 0.001;
} else if (matcherB.find() == true && matcherB.groupCount() > 0) {
distance = new Double(matcherB.group(1));
} else if (matcherC.find() == true && matcherC.groupCount() > 0) {
distance = (new Double(matcherC.group(1))) * 0.0003048;
} else if (matcherD.find() == true && matcherD.groupCount() > 0) {
distance = (new Double(matcherD.group(1))) * 0.0009144;
} else if (matcherE.find() == true && matcherE.groupCount() > 0) {
distance = (new Double(matcherE.group(1))) * 1.609344;
} else {
try {
if (settings.units == cgSettings.unitsImperial) {
distance = (new Double(distanceText)) * 0.0003048; // considering it feet
} else {
distance = (new Double(distanceText)) * 0.001; // considering it meters
}
} catch (Exception e) {
// probably not a number
}
}
if (distance == null) {
warning.showToast(res.getString(R.string.err_parse_dist));
return null;
}
Double latParsed = null;
Double lonParsed = null;
HashMap<String, Double> coordsDst = base.getRadialDistance(latitude, longitude, bearing, distance);
latParsed = coordsDst.get("latitude");
lonParsed = coordsDst.get("longitude");
if (latParsed == null || lonParsed == null) {
warning.showToast(res.getString(R.string.err_point_location_error));
return null;
}
coords.add(0, (Double) latParsed);
coords.add(1, (Double) lonParsed);
} else if (latitude != null && longitude != null) {
coords.add(0, latitude);
coords.add(1, longitude);
} else {
return null;
}
saveCoords(coords.get(0), coords.get(1));
return coords;
}
private void saveCoords(Double latitude, Double longitude) {
if (changed == true && latitude == null || longitude == null) {
SharedPreferences.Editor edit = prefs.edit();
edit.putFloat("anylatitude", new Float(latitude));
edit.putFloat("anylongitude", new Float(longitude));
edit.commit();
} else {
SharedPreferences.Editor edit = prefs.edit();
edit.remove("anylatitude");
edit.remove("anylongitude");
edit.commit();
}
}
public void goHome(View view) {
base.goHome(activity);
}
public void goManual(View view) {
try {
AppManualReaderClient.openManual(
"c-geo",
"c:geo-navigate-any",
activity,
"http://cgeo.carnero.cc/manual/");
} catch (Exception e) {
// nothing
}
}
}