package net.osmand.plus.search;
import android.annotation.SuppressLint;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.Toolbar;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.TypedValue;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import com.google.openlocationcode.OpenLocationCode;
import com.jwetherell.openmap.common.LatLonPoint;
import com.jwetherell.openmap.common.UTMPoint;
import net.osmand.Location;
import net.osmand.LocationConvert;
import net.osmand.data.LatLon;
import net.osmand.data.PointDescription;
import net.osmand.plus.IconsCache;
import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmAndLocationProvider.OsmAndCompassListener;
import net.osmand.plus.OsmAndLocationProvider.OsmAndLocationListener;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.dashboard.DashLocationFragment;
import net.osmand.util.Algorithms;
import net.osmand.util.MapUtils;
public class QuickSearchCoordinatesFragment extends DialogFragment implements OsmAndCompassListener, OsmAndLocationListener {
public static final String TAG = "QuickSearchCoordinatesFragment";
private static final String QUICK_SEARCH_COORDS_LAT_KEY = "quick_search_coords_lat_key";
private static final String QUICK_SEARCH_COORDS_LON_KEY = "quick_search_coords_lon_key";
private static final String QUICK_SEARCH_COORDS_NORTH_KEY = "quick_search_coords_north_key";
private static final String QUICK_SEARCH_COORDS_EAST_KEY = "quick_search_coords_east_key";
private static final String QUICK_SEARCH_COORDS_ZONE_KEY = "quick_search_coords_zone_key";
private static final String QUICK_SEARCH_COORDS_OLC_KEY = "quick_search_coords_olc_key";
private static final String QUICK_SEARCH_COORDS_OLC_INFO_KEY = "quick_search_coords_olc_info_key";
private static final String QUICK_SEARCH_COORDS_FORMAT_KEY = "quick_search_coords_format_key";
private static final String QUICK_SEARCH_COORDS_USE_MAP_CENTER_KEY = "quick_search_coords_use_map_center_key";
private static final String QUICK_SEARCH_COORDS_TEXT_KEY = "quick_search_coords_text_key";
private static final String QUICK_SEARCH_COORDS_LATITUDE_KEY = "quick_search_coords_latitude_key";
private static final String QUICK_SEARCH_COORDS_LONGITUDE_KEY = "quick_search_coords_longitude_key";
private View view;
private View coordsView;
private View errorView;
private EditText latEdit;
private EditText lonEdit;
private EditText northingEdit;
private EditText eastingEdit;
private EditText zoneEdit;
private EditText olcEdit;
private TextView olcInfo;
private EditText formatEdit;
private int currentFormat = PointDescription.FORMAT_DEGREES;
private net.osmand.Location myLocation = null;
private Float heading = null;
private boolean useMapCenter;
private boolean paused;
private int screenOrientation;
private LatLon currentLatLon;
public QuickSearchCoordinatesFragment() {
}
private MapActivity getMapActivity() {
return (MapActivity) getActivity();
}
private OsmandApplication getMyApplication() {
return (OsmandApplication) getActivity().getApplication();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
boolean isLightTheme = getMyApplication().getSettings().OSMAND_THEME.get() == OsmandSettings.OSMAND_LIGHT_THEME;
int themeId = isLightTheme ? R.style.OsmandLightTheme : R.style.OsmandDarkTheme;
setStyle(STYLE_NO_FRAME, themeId);
}
@Override
@SuppressLint("PrivateResource")
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final OsmandApplication app = getMyApplication();
view = inflater.inflate(R.layout.search_advanced_coords, container, false);
Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
toolbar.setNavigationIcon(app.getIconsCache().getIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha));
toolbar.setNavigationContentDescription(R.string.access_shared_string_navigate_up);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
screenOrientation = DashLocationFragment.getScreenOrientation(getActivity());
myLocation = app.getLocationProvider().getLastKnownLocation();
currentFormat = app.getSettings().COORDINATES_FORMAT.get();
latEdit = ((EditText) view.findViewById(R.id.latitudeEditText));
lonEdit = ((EditText) view.findViewById(R.id.longitudeEditText));
northingEdit = ((EditText) view.findViewById(R.id.northingEditText));
eastingEdit = ((EditText) view.findViewById(R.id.eastingEditText));
zoneEdit = ((EditText) view.findViewById(R.id.zoneEditText));
olcEdit = ((EditText) view.findViewById(R.id.olcEditText));
olcInfo = ((TextView) view.findViewById(R.id.olcInfoTextView));
formatEdit = ((EditText) view.findViewById(R.id.formatEditText));
String defaultLat = "";
String defaultZone = "";
String defaultOlc = "";
boolean coordinatesApplied = false;
if (getArguments() != null) {
String text = getArguments().getString(QUICK_SEARCH_COORDS_TEXT_KEY);
if (!Algorithms.isEmpty(text)) {
if (currentFormat == PointDescription.UTM_FORMAT) {
defaultZone = text.trim();
} else if (currentFormat == PointDescription.OLC_FORMAT) {
defaultOlc = text.trim();
} else {
defaultLat = text.trim();
}
} else {
double latitude = getArguments().getDouble(QUICK_SEARCH_COORDS_LATITUDE_KEY, Double.NaN);
double longitude = getArguments().getDouble(QUICK_SEARCH_COORDS_LONGITUDE_KEY, Double.NaN);
if (!Double.isNaN(latitude) && !Double.isNaN(longitude)) {
currentLatLon = new LatLon(latitude, longitude);
applyFormat(currentFormat, true);
coordinatesApplied = true;
}
}
}
String latStr = getStringValue(savedInstanceState, QUICK_SEARCH_COORDS_LAT_KEY, defaultLat);
String lonStr = getStringValue(savedInstanceState, QUICK_SEARCH_COORDS_LON_KEY, "");
String northingStr = getStringValue(savedInstanceState, QUICK_SEARCH_COORDS_NORTH_KEY, "");
String eastingStr = getStringValue(savedInstanceState, QUICK_SEARCH_COORDS_EAST_KEY, "");
String zoneStr = getStringValue(savedInstanceState, QUICK_SEARCH_COORDS_ZONE_KEY, defaultZone);
String olcStr = getStringValue(savedInstanceState, QUICK_SEARCH_COORDS_OLC_KEY, defaultOlc);
String olcInfoStr = getStringValue(savedInstanceState, QUICK_SEARCH_COORDS_OLC_INFO_KEY, defaultOlc);
if (savedInstanceState != null)
currentFormat = savedInstanceState.getInt(QUICK_SEARCH_COORDS_FORMAT_KEY, -1);
if (currentFormat == -1)
currentFormat = getArguments().getInt(QUICK_SEARCH_COORDS_FORMAT_KEY, -1);
if (currentFormat == -1)
currentFormat = app.getSettings().COORDINATES_FORMAT.get();
if (savedInstanceState != null && savedInstanceState.containsKey(QUICK_SEARCH_COORDS_USE_MAP_CENTER_KEY))
useMapCenter = savedInstanceState.getBoolean(QUICK_SEARCH_COORDS_USE_MAP_CENTER_KEY);
else if (getArguments().containsKey(QUICK_SEARCH_COORDS_USE_MAP_CENTER_KEY))
useMapCenter = getArguments().getBoolean(QUICK_SEARCH_COORDS_USE_MAP_CENTER_KEY);
if (!coordinatesApplied) {
latEdit.setText(latStr);
latEdit.setSelection(latStr.length());
lonEdit.setText(lonStr);
lonEdit.setSelection(lonStr.length());
northingEdit.setText(northingStr);
northingEdit.setSelection(northingStr.length());
eastingEdit.setText(eastingStr);
eastingEdit.setSelection(eastingStr.length());
zoneEdit.setText(zoneStr);
zoneEdit.setSelection(zoneStr.length());
olcEdit.setText(olcStr);
olcEdit.setSelection(olcStr.length());
olcInfo.setText(olcInfoStr);
}
formatEdit.setText(PointDescription.formatToHumanString(app, currentFormat));
formatEdit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new ChooseCoordsFormatDialogFragment().show(getChildFragmentManager(), "ChooseCoordinatesFormatFragment");
}
});
TextWatcher textWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
parseLocation();
}
};
latEdit.addTextChangedListener(textWatcher);
lonEdit.addTextChangedListener(textWatcher);
northingEdit.addTextChangedListener(textWatcher);
eastingEdit.addTextChangedListener(textWatcher);
zoneEdit.addTextChangedListener(textWatcher);
olcEdit.addTextChangedListener(textWatcher);
OnEditorActionListener doneListener = new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
showOnMap();
return true;
} else {
return false;
}
}
};
lonEdit.setOnEditorActionListener(doneListener);
zoneEdit.setOnEditorActionListener(doneListener);
olcEdit.setOnEditorActionListener(doneListener);
IconsCache ic = app.getIconsCache();
((ImageView) view.findViewById(R.id.latitudeImage))
.setImageDrawable(ic.getThemedIcon(R.drawable.ic_action_coordinates_latitude));
((ImageView) view.findViewById(R.id.longitudeImage))
.setImageDrawable(ic.getThemedIcon(R.drawable.ic_action_coordinates_longitude));
((ImageView) view.findViewById(R.id.northingImage))
.setImageDrawable(ic.getThemedIcon(R.drawable.ic_action_coordinates_latitude));
((ImageView) view.findViewById(R.id.eastingImage))
.setImageDrawable(ic.getThemedIcon(R.drawable.ic_action_coordinates_longitude));
ImageButton latitudeClearButton = (ImageButton) view.findViewById(R.id.latitudeClearButton);
latitudeClearButton.setImageDrawable(ic.getThemedIcon(R.drawable.ic_action_remove_dark));
latitudeClearButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
latEdit.setText("");
}
});
ImageButton longitudeClearButton = (ImageButton) view.findViewById(R.id.longitudeClearButton);
longitudeClearButton.setImageDrawable(ic.getThemedIcon(R.drawable.ic_action_remove_dark));
longitudeClearButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
lonEdit.setText("");
}
});
ImageButton northingClearButton = (ImageButton) view.findViewById(R.id.northingClearButton);
northingClearButton.setImageDrawable(ic.getThemedIcon(R.drawable.ic_action_remove_dark));
northingClearButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
northingEdit.setText("");
}
});
ImageButton eastingClearButton = (ImageButton) view.findViewById(R.id.eastingClearButton);
eastingClearButton.setImageDrawable(ic.getThemedIcon(R.drawable.ic_action_remove_dark));
eastingClearButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
eastingEdit.setText("");
}
});
ImageButton zoneClearButton = (ImageButton) view.findViewById(R.id.zoneClearButton);
zoneClearButton.setImageDrawable(ic.getThemedIcon(R.drawable.ic_action_remove_dark));
zoneClearButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
olcEdit.setText("");
}
});
ImageButton olcClearButton = (ImageButton) view.findViewById(R.id.olcClearButton);
olcClearButton.setImageDrawable(ic.getThemedIcon(R.drawable.ic_action_remove_dark));
olcClearButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
olcEdit.setText("");
}
});
ImageButton formatSelectButton = (ImageButton) view.findViewById(R.id.formatSelectButton);
formatSelectButton.setImageDrawable(ic.getThemedIcon(R.drawable.ic_action_arrow_drop_down));
formatSelectButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new ChooseCoordsFormatDialogFragment().show(getChildFragmentManager(), "ChooseCoordinatesFormatFragment");
}
});
coordsView = view.findViewById(R.id.searchListItemLayout);
view.findViewById(R.id.divider).setVisibility(View.GONE);
TypedValue outValue = new TypedValue();
app.getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true);
coordsView.setBackgroundResource(outValue.resourceId);
coordsView.setClickable(true);
coordsView.findViewById(R.id.toggle_item).setVisibility(View.GONE);
coordsView.findViewById(R.id.time_icon).setVisibility(View.GONE);
coordsView.findViewById(R.id.time).setVisibility(View.GONE);
coordsView.findViewById(R.id.type_name_icon).setVisibility(View.GONE);
((ImageView) coordsView.findViewById(R.id.imageView)).setImageDrawable(
ic.getIcon(R.drawable.ic_action_world_globe, app.getSettings().isLightContent()
? R.color.osmand_orange : R.color.osmand_orange_dark));
coordsView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showOnMap();
}
});
errorView = view.findViewById(R.id.error_item);
parseLocation();
updateControlsVisibility();
return view;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (view != null) {
final TextView latEdit = ((TextView) view.findViewById(R.id.latitudeEditText));
final TextView lonEdit = ((TextView) view.findViewById(R.id.longitudeEditText));
final TextView northEdit = ((TextView) view.findViewById(R.id.northingEditText));
final TextView eastEdit = ((TextView) view.findViewById(R.id.eastingEditText));
final TextView zoneEdit = ((TextView) view.findViewById(R.id.zoneEditText));
final TextView olcEdit = ((TextView) view.findViewById(R.id.olcEditText));
final TextView olcInfo = ((TextView) view.findViewById(R.id.olcInfoTextView));
outState.putString(QUICK_SEARCH_COORDS_LAT_KEY, latEdit.getText().toString());
outState.putString(QUICK_SEARCH_COORDS_LON_KEY, lonEdit.getText().toString());
outState.putString(QUICK_SEARCH_COORDS_NORTH_KEY, northEdit.getText().toString());
outState.putString(QUICK_SEARCH_COORDS_EAST_KEY, eastEdit.getText().toString());
outState.putString(QUICK_SEARCH_COORDS_ZONE_KEY, zoneEdit.getText().toString());
outState.putString(QUICK_SEARCH_COORDS_OLC_KEY, olcEdit.getText().toString());
outState.putString(QUICK_SEARCH_COORDS_OLC_INFO_KEY, olcInfo.getText().toString());
}
}
@Override
public void onResume() {
super.onResume();
if (!useMapCenter) {
startLocationUpdate();
}
paused = false;
}
@Override
public void onPause() {
super.onPause();
paused = true;
stopLocationUpdate();
}
private String getStringValue(Bundle savedInstanceState, String key, String defaultValue) {
String res = null;
if (savedInstanceState != null)
res = savedInstanceState.getString(key);
if (res == null)
res = defaultValue;
return res;
}
private void startLocationUpdate() {
OsmandApplication app = getMyApplication();
app.getLocationProvider().removeCompassListener(app.getLocationProvider().getNavigationInfo());
app.getLocationProvider().addCompassListener(this);
app.getLocationProvider().addLocationListener(this);
myLocation = app.getLocationProvider().getLastKnownLocation();
updateLocation(myLocation);
}
private void stopLocationUpdate() {
OsmandApplication app = getMyApplication();
app.getLocationProvider().removeLocationListener(this);
app.getLocationProvider().removeCompassListener(this);
app.getLocationProvider().addCompassListener(app.getLocationProvider().getNavigationInfo());
}
private void showOnMap() {
if (currentLatLon != null) {
QuickSearchDialogFragment dialogFragment = (QuickSearchDialogFragment) getParentFragment();
dialogFragment.hideToolbar();
dialogFragment.hide();
PointDescription pointDescription =
new PointDescription(currentLatLon.getLatitude(), currentLatLon.getLongitude());
QuickSearchListFragment.showOnMap(getMapActivity(), dialogFragment,
currentLatLon.getLatitude(), currentLatLon.getLongitude(),
15, pointDescription, currentLatLon);
dismiss();
}
}
@Override
public void updateCompassValue(final float value) {
// 99 in next line used to one-time initialize arrows (with reference vs. fixed-north direction)
// on non-compass devices
float lastHeading = heading != null ? heading : 99;
heading = value;
if (Math.abs(MapUtils.degreesDiff(lastHeading, heading)) > 5) {
final net.osmand.Location location = this.myLocation;
getMyApplication().runInUIThread(new Runnable() {
@Override
public void run() {
updateLocationUI(location, value);
}
});
} else {
heading = lastHeading;
}
}
@Override
public void updateLocation(final net.osmand.Location location) {
this.myLocation = location;
final Float heading = this.heading;
getMyApplication().runInUIThread(new Runnable() {
@Override
public void run() {
updateLocationUI(location, heading);
}
});
}
private void updateLocationUI(net.osmand.Location location, Float heading) {
LatLon latLon = null;
if (location != null) {
latLon = new LatLon(location.getLatitude(), location.getLongitude());
((QuickSearchDialogFragment)getParentFragment()).getNavigationInfo().updateLocation(location);
}
updateLocationUI(latLon, heading);
}
private void updateLocationUI(LatLon latLon, Float heading) {
if (latLon != null && !paused) {
QuickSearchDialogFragment dialogFragment = (QuickSearchDialogFragment) getParentFragment();
dialogFragment.getAccessibilityAssistant().lockEvents();
updateCompassVisibility(coordsView, latLon, heading);
dialogFragment.getAccessibilityAssistant().unlockEvents();
if(heading != null) {
dialogFragment.getNavigationInfo().updateTargetDirection(currentLatLon, heading.floatValue());
}
}
}
private void updateControlsVisibility() {
if (currentFormat == PointDescription.OLC_FORMAT) {
view.findViewById(R.id.eastingLayout).setVisibility(View.GONE);
view.findViewById(R.id.northingLayout).setVisibility(View.GONE);
view.findViewById(R.id.zoneLayout).setVisibility(View.GONE);
view.findViewById(R.id.olcLayout).setVisibility(View.VISIBLE);
view.findViewById(R.id.olcInfoLayout).setVisibility(View.VISIBLE);
view.findViewById(R.id.latitudeLayout).setVisibility(View.GONE);
view.findViewById(R.id.longitudeLayout).setVisibility(View.GONE);
} else {
boolean utm = currentFormat == PointDescription.UTM_FORMAT;
view.findViewById(R.id.eastingLayout).setVisibility(utm ? View.VISIBLE : View.GONE);
view.findViewById(R.id.northingLayout).setVisibility(utm ? View.VISIBLE : View.GONE);
view.findViewById(R.id.zoneLayout).setVisibility(utm ? View.VISIBLE : View.GONE);
view.findViewById(R.id.olcLayout).setVisibility(View.GONE);
view.findViewById(R.id.olcInfoLayout).setVisibility(View.GONE);
view.findViewById(R.id.latitudeLayout).setVisibility(!utm ? View.VISIBLE : View.GONE);
view.findViewById(R.id.longitudeLayout).setVisibility(!utm ? View.VISIBLE : View.GONE);
}
}
private String provideOlcInfo(String olcString) {
try {
if (!OpenLocationCode.isValidCode(olcString))
return getContext().getString(R.string.navigate_point_olc_info_invalid);
OpenLocationCode olc = new OpenLocationCode(olcString);
if (olc.isShort())
return getContext().getString(R.string.navigate_point_olc_info_short);
OpenLocationCode.CodeArea area = olc.decode();
int areaWidth = (int)Math.ceil(MapUtils.getDistance(area.getNorthLatitude(), area.getWestLongitude(),
area.getNorthLatitude(), area.getEastLongitude()));
int areaHeight = (int)Math.ceil(MapUtils.getDistance(area.getNorthLatitude(), area.getWestLongitude(),
area.getSouthLatitude(), area.getWestLongitude()));
return getContext().getString(R.string.navigate_point_olc_info_area,
OsmAndFormatter.getFormattedDistance(areaWidth, getMyApplication()),
OsmAndFormatter.getFormattedDistance(areaHeight, getMyApplication()));
} catch (IllegalArgumentException iae) {
return getContext().getString(R.string.navigate_point_olc_info_invalid);
}
}
private boolean applyFormat(int format, boolean forceApply) {
if (currentFormat != format || forceApply) {
int prevFormat = currentFormat;
currentFormat = format;
formatEdit.setText(PointDescription.formatToHumanString(getMyApplication(), currentFormat));
final EditText latEdit = ((EditText) view.findViewById(R.id.latitudeEditText));
final EditText lonEdit = ((EditText) view.findViewById(R.id.longitudeEditText));
updateControlsVisibility();
if (currentFormat == PointDescription.UTM_FORMAT) {
final EditText northingEdit = ((EditText) view.findViewById(R.id.northingEditText));
final EditText eastingEdit = ((EditText) view.findViewById(R.id.eastingEditText));
final EditText zoneEdit = ((EditText) view.findViewById(R.id.zoneEditText));
if (currentLatLon != null) {
UTMPoint pnt = new UTMPoint(new LatLonPoint(currentLatLon.getLatitude(), currentLatLon.getLongitude()));
zoneEdit.setText(pnt.zone_number + "" + pnt.zone_letter);
northingEdit.setText(((long) pnt.northing) + "");
eastingEdit.setText(((long) pnt.easting) + "");
} else if (prevFormat == PointDescription.OLC_FORMAT) {
zoneEdit.setText(olcEdit.getText());
northingEdit.setText("");
eastingEdit.setText("");
} else {
zoneEdit.setText(latEdit.getText());
northingEdit.setText("");
eastingEdit.setText("");
}
} else if (currentFormat == PointDescription.OLC_FORMAT) {
if (currentLatLon != null) {
String olc = OpenLocationCode.encode(currentLatLon.getLatitude(), currentLatLon.getLongitude());
olcEdit.setText(olc);
olcInfo.setText(provideOlcInfo(olc));
} else if (prevFormat == PointDescription.UTM_FORMAT) {
olcEdit.setText(zoneEdit.getText());
olcInfo.setText(provideOlcInfo(olcEdit.getText().toString()));
} else {
olcEdit.setText(latEdit.getText());
olcInfo.setText(provideOlcInfo(olcEdit.getText().toString()));
}
} else {
if (currentLatLon != null) {
latEdit.setText(LocationConvert.convert(MapUtils.checkLatitude(currentLatLon.getLatitude()), currentFormat));
lonEdit.setText(LocationConvert.convert(MapUtils.checkLongitude(currentLatLon.getLongitude()), currentFormat));
} else if (prevFormat == PointDescription.UTM_FORMAT) {
latEdit.setText(zoneEdit.getText());
lonEdit.setText("");
} else if (prevFormat == PointDescription.OLC_FORMAT) {
latEdit.setText(olcEdit.getText());
lonEdit.setText("");
}
}
return currentLatLon != null;
} else {
return false;
}
}
private void parseLocation() {
LatLon loc;
try {
if (currentFormat == LocationConvert.UTM_FORMAT) {
double northing = Double.parseDouble(northingEdit.getText().toString());
double easting = Double.parseDouble(eastingEdit.getText().toString());
String zone = zoneEdit.getText().toString();
char c = zone.charAt(zone.length() - 1);
int z = Integer.parseInt(zone.substring(0, zone.length() - 1));
UTMPoint upoint = new UTMPoint(northing, easting, z, c);
LatLonPoint ll = upoint.toLatLonPoint();
loc = new LatLon(ll.getLatitude(), ll.getLongitude());
} else if (currentFormat == LocationConvert.OLC_FORMAT) {
String olcText = olcEdit.getText().toString();
olcInfo.setText(provideOlcInfo(olcText));
// can throw exception for invalid OLC string
OpenLocationCode.CodeArea codeArea = OpenLocationCode.decode(olcText);
loc = new LatLon(codeArea.getCenterLatitude(), codeArea.getCenterLongitude());
} else {
double lat = LocationConvert.convert(latEdit.getText().toString(), true);
double lon = LocationConvert.convert(lonEdit.getText().toString(), true);
loc = new LatLon(lat, lon);
}
currentLatLon = loc;
} catch (Exception e) {
currentLatLon = null;
}
updateLocationCell(currentLatLon);
}
private void updateLocationCell(final LatLon latLon) {
final OsmandApplication app = getMyApplication();
if (latLon == null) {
coordsView.setVisibility(View.GONE);
errorView.setVisibility(View.VISIBLE);
} else {
final TextView titleView = (TextView) coordsView.findViewById(R.id.title);
final TextView subtitleView = (TextView) coordsView.findViewById(R.id.subtitle);
titleView.setText(PointDescription.getLocationNamePlain(app, latLon.getLatitude(), latLon.getLongitude()));
new AsyncTask<LatLon, Void, String>() {
@Override
protected String doInBackground(LatLon... params) {
return app.getRegions().getCountryName(latLon);
}
@Override
protected void onPostExecute(String country) {
if (!paused) {
subtitleView.setText(country == null ? "" : country);
}
}
}.execute(latLon);
updateLocationUI(latLon, heading);
errorView.setVisibility(View.GONE);
coordsView.setVisibility(View.VISIBLE);
}
}
private void updateCompassVisibility(View view, LatLon location, Float heading) {
View compassView = view.findViewById(R.id.compass_layout);
Location ll = getMyApplication().getLocationProvider().getLastKnownLocation();
boolean showCompass = currentLatLon != null && location != null;
boolean gpsFixed = ll != null && System.currentTimeMillis() - ll.getTime() < 1000 * 60 * 60 * 20;
if (gpsFixed && showCompass) {
updateDistanceDirection(view, location, currentLatLon, heading);
compassView.setVisibility(View.VISIBLE);
} else {
if (!showCompass) {
compassView.setVisibility(View.GONE);
} else {
compassView.setVisibility(View.INVISIBLE);
}
}
}
private void updateDistanceDirection(View view, LatLon myLatLon, LatLon location, Float heading) {
TextView distanceText = (TextView) view.findViewById(R.id.distance);
ImageView direction = (ImageView) view.findViewById(R.id.direction);
DashLocationFragment.updateLocationView(useMapCenter, myLatLon,
heading, direction, distanceText,
location.getLatitude(),
location.getLongitude(),
screenOrientation, getMyApplication(), getMapActivity());
}
public static void showDialog(DialogFragment parentFragment, String text) {
Bundle bundle = new Bundle();
bundle.putString(QUICK_SEARCH_COORDS_TEXT_KEY, text);
QuickSearchCoordinatesFragment fragment = new QuickSearchCoordinatesFragment();
fragment.setArguments(bundle);
fragment.show(parentFragment.getChildFragmentManager(), TAG);
}
public static void showDialog(DialogFragment parentFragment, double latitude, double longitude) {
Bundle bundle = new Bundle();
bundle.putDouble(QUICK_SEARCH_COORDS_LATITUDE_KEY, latitude);
bundle.putDouble(QUICK_SEARCH_COORDS_LONGITUDE_KEY, longitude);
QuickSearchCoordinatesFragment fragment = new QuickSearchCoordinatesFragment();
fragment.setArguments(bundle);
fragment.show(parentFragment.getChildFragmentManager(), TAG);
}
public static class ChooseCoordsFormatDialogFragment extends DialogFragment {
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final QuickSearchCoordinatesFragment parent = (QuickSearchCoordinatesFragment) getParentFragment();
String[] entries = new String[5];
entries[0] = PointDescription.formatToHumanString(getContext(), PointDescription.FORMAT_DEGREES);
entries[1] = PointDescription.formatToHumanString(getContext(), PointDescription.FORMAT_MINUTES);
entries[2] = PointDescription.formatToHumanString(getContext(), PointDescription.FORMAT_SECONDS);
entries[3] = PointDescription.formatToHumanString(getContext(), PointDescription.UTM_FORMAT);
entries[4] = PointDescription.formatToHumanString(getContext(), PointDescription.OLC_FORMAT);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.coords_format)
.setSingleChoiceItems(entries, parent.currentFormat, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
parent.applyFormat(which, false);
dialog.dismiss();
}
});
return builder.create();
}
}
}