package com.itbox.grzl.activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;
import com.baidu.location.BDLocation;
import com.baidu.mapapi.map.LocationData;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationOverlay;
import com.baidu.mapapi.map.OverlayItem;
import com.baidu.mapapi.search.MKAddrInfo;
import com.baidu.mapapi.search.MKBusLineResult;
import com.baidu.mapapi.search.MKDrivingRouteResult;
import com.baidu.mapapi.search.MKPoiInfo;
import com.baidu.mapapi.search.MKPoiResult;
import com.baidu.mapapi.search.MKSearch;
import com.baidu.mapapi.search.MKSearchListener;
import com.baidu.mapapi.search.MKShareUrlResult;
import com.baidu.mapapi.search.MKSuggestionResult;
import com.baidu.mapapi.search.MKTransitRouteResult;
import com.baidu.mapapi.search.MKWalkingRouteResult;
import com.baidu.platform.comapi.basestruct.GeoPoint;
import com.baidu.platform.comapi.map.Projection;
import com.itbox.fx.core.L;
import com.itbox.fx.location.LocManager;
import com.itbox.fx.location.LocReceiver;
import com.itbox.fx.util.NetUtil;
import com.itbox.fx.util.Utils;
import com.itbox.grzl.AppContext;
import com.itbox.grzl.Const.Extra;
import com.zhaoliewang.grzl.R;
import com.itbox.grzl.common.util.AddressUtil;
import com.itbox.grzl.map.AddrInfoModel;
import com.itbox.grzl.map.DistanceUtils;
import com.itbox.grzl.map.MapManager;
import com.itbox.grzl.map.OnLongTouchListener;
import com.itbox.grzl.map.TouchPoiOverlay;
/**
* poi搜索功能
*/
public class SelectMapPointActivity extends BaseActivity implements
OnClickListener, TextWatcher {
private MapView mMapView = null;
private MKSearch mSearch = null; // 搜索模块,也可去掉地图模块独立使用
/**
* 搜索关键字输入窗口
*/
private InputMethodManager imm;
protected BDLocation location;
private LocReceiver locReceiver;
private MyLocationOverlay myLoc;
private TouchPoiOverlay touchOverlay;
private String cityName = "北京";
protected OverlayItem touchItem;
private String msgTemple;
// private LoadingDialog loading;
private boolean isTag;
private LocationData locData;
private View vInfo;
private TextView tvInfo;
private EditText etDesc;
private TextView btnEnter;
private ImageButton btnMyLoacl;
protected boolean isGoToMyLoc;
protected GeoPoint curGP;
private AddrInfoModel addrInfo;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MapManager app = MapManager.getInstance();
setContentView(R.layout.activity_select_map_point);
Intent intent = getIntent();
// TODO 如果intent中指定左边,则不去自己的位置(isGoToMyLoc = false)
msgTemple = intent.getStringExtra(Extra.Snippet);
addrInfo = (AddrInfoModel) intent.getSerializableExtra(Extra.AddrModel);
if (addrInfo == null
|| (addrInfo.getLatitudeE6() == 0 && addrInfo.getLongitudeE6() == 0)) {
isGoToMyLoc = true;
}
initView();
initMapView();
initSearch(app);
if (null != AppContext.location) {
cityName = AppContext.location.getCity();
} else if (null != AppContext.getInstance().getAccount()) {
cityName = AddressUtil.getSimpleAddr(Integer.parseInt(AppContext
.getInstance().getAccount().getUserdistrict()));
}
}
private void initView() {
vInfo = findViewById(R.id.select_map_ll_info);
tvInfo = (TextView) findViewById(R.id.select_map_tv_info);
etDesc = (EditText) findViewById(R.id.select_map_et_desc);
btnEnter = (TextView) findViewById(R.id.text_right);
btnEnter.setVisibility(View.VISIBLE);
btnEnter.setText(" 确定 ");
btnMyLoacl = (ImageButton) findViewById(R.id.select_map_ibtn_local);
setTitle("选择地点");
showLeftBackButton();
findViewById(R.id.text_left).setOnClickListener(this);
btnEnter.setOnClickListener(this);
btnEnter.setEnabled(false);
btnMyLoacl.setOnClickListener(this);
etDesc.addTextChangedListener(this);
imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
}
private void initSearch(MapManager app) {
// 初始化搜索模块,注册搜索事件监听
mSearch = new MKSearch();
mSearch.init(app, new MKSearchListener() {
// 在此处理详情页结果
@Override
public void onGetPoiDetailSearchResult(int type, int error) {
if (error != 0) {
showToast("抱歉,未找到结果");
} else {
showToast("成功,查看详情页面");
}
}
/**
* 在此处理poi搜索结果
*/
public void onGetPoiResult(MKPoiResult res, int type, int error) {
// 错误号可参考MKEvent中的定义
L.i("onGetPoiResult");
if (error != 0 || res == null) {
showToast("抱歉,未找到结果");
return;
}
// 将地图移动到第一个POI中心点
if (res.getCurrentNumPois() > 0) {
int indexOf = mMapView.getOverlays().indexOf(touchOverlay);
if (-1 != indexOf) {
mMapView.getOverlays().remove(indexOf);
}
// TODO touchOverlay.setData(res.getAllPoi());
mMapView.getOverlays().clear();
if (null != myLoc) {
mMapView.getOverlays().add(myLoc);
}
mMapView.getOverlays().add(touchOverlay);
mMapView.refresh();
// 当ePoiType为2(公交线路)或4(地铁线路)时, poi坐标为空
for (MKPoiInfo info : res.getAllPoi()) {
if (info.pt != null) {
mMapView.getController().animateTo(info.pt);
break;
}
}
} else if (res.getCityListNum() > 0) {
// 当输入关键字在本市没有找到,但在其他城市找到时,返回包含该关键字信息的城市列表
String strInfo = "在";
for (int i = 0; i < res.getCityListNum(); i++) {
strInfo += res.getCityListInfo(i).city;
strInfo += ",";
}
strInfo += "找到结果";
showToast(strInfo);
}
}
public void onGetDrivingRouteResult(MKDrivingRouteResult res,
int error) {
L.i("1");
}
public void onGetTransitRouteResult(MKTransitRouteResult res,
int error) {
L.i("2");
}
public void onGetWalkingRouteResult(MKWalkingRouteResult res,
int error) {
L.i("3");
}
public void onGetAddrResult(MKAddrInfo result, int error) {
L.i("onGetAddrResult");
if (error != 0 || result == null) {// 加载失败
if (!isTag) {
addrInfo = null;
showInfoLayout();
tvInfo.setText("加载失败");
btnEnter.setEnabled(false);
}
return;
}
L.i("Result: " + result.geoPt.getLatitudeE6() + " "
+ result.geoPt.getLongitudeE6());
L.i("Current: " + curGP.getLatitudeE6() + " "
+ curGP.getLongitudeE6());
if (isTag) {
Intent intent = new Intent();
intent.putExtra(Extra.AddrModel, new AddrInfoModel(result));
setResult(RESULT_OK, intent);
finish();
} else {
// if (DistanceUtils.CompareGeoPoint(result.geoPt, curGP)) {
// Toast.show("equal");
if (null == addrInfo) {
addrInfo = new AddrInfoModel(result);
} else {
addrInfo.setInfo(result, "");
}
// addrInfo.geoPt = result.geoPt;
// addrInfo.addressComponents =
// result.addressComponents;
// addrInfo.strAddr = result.strAddr;
// addrInfo.strBusiness = result.strBusiness;
// addrInfo.poiList = result.poiList;
// addrInfo.type = result.type;
touchOverlay.setTouchPoint(result.geoPt,
result.strAddr, result.strAddr);
setInfoLayout(result.strAddr);
// }
}
}
public void onGetBusDetailResult(MKBusLineResult result, int iError) {
L.i("4");
}
@Override
public void onGetSuggestionResult(MKSuggestionResult res, int arg1) {
L.i("5");
}
@Override
public void onGetShareUrlResult(MKShareUrlResult arg0, int arg1,
int arg2) {
L.i("6");
}
});
}
private void initMapView() {
mMapView = (MapView) findViewById(R.id.bmapEventView);
// markerHeight =
// getResources().getDrawable(R.drawable.poi_marker_active).getIntrinsicHeight();
touchOverlay = new TouchPoiOverlay(mMapView);
mMapView.getController().enableClick(true);
mMapView.getController().setZoom(12);
mMapView.setLongClickable(true);
mMapView.setBuiltInZoomControls(false);
mMapView.setOnTouchListener(new OnLongTouchListener(this) {
@Override
public boolean onSingleTapUp(MotionEvent e) {
onLongPress(e);
return super.onSingleTapUp(e);
}
@Override
public void onLongPress(MotionEvent e) {
e.getRawX();
e.getRawY();
int x = (int) e.getX();
int y = (int) e.getY();
// mapTips.setVisibility(View.GONE);
Projection fromPixelspProjection = mMapView.getProjection();
GeoPoint touchGeoPoint = fromPixelspProjection.fromPixels(x, y);
curGP = touchGeoPoint;
if (-1 == mMapView.getOverlays().indexOf(touchOverlay)) {
mMapView.getOverlays().add(touchOverlay);
}
touchOverlay.setTouchPoint(touchGeoPoint,
getString(R.string.loading),
getString(R.string.loading));
showInfoLayout();
if (NetUtil.isNetAvailable()) {
mSearch.reverseGeocode(touchGeoPoint);
} else {
addrInfo = null;
hideInfoLayout();
btnEnter.setEnabled(false);
showToast("网络不可用");
}
}
});
locReceiver = new LocReceiver(LocReceiver.Success_And_Fail) {
@Override
public void onReceive(Context context, Intent intent) {
location = AppContext.location;
if (null != location) {
if (null == myLoc) {
myLoc = new MyLocationOverlay(mMapView);
} else {
mMapView.getOverlays().remove(myLoc);
}
locData = new LocationData();
locData.latitude = location.getLatitude();
locData.longitude = location.getLongitude();
// 如果不显示定位精度圈,将accuracy赋值为0即可
locData.accuracy = location.getRadius();
locData.direction = location.getDerect();
myLoc.setData(locData);
// myLoc.setMarker(AppContext.getRes().getDrawable(R.drawable.btn_footbar_mid));
mMapView.getOverlays().add(myLoc);
myLoc.enableCompass();
mMapView.refresh();
if (isGoToMyLoc) {
mMapView.getController().animateTo(
new GeoPoint((int) (locData.latitude * 1e6),
(int) (locData.longitude * 1e6)));
isGoToMyLoc = false;
}
}
}
}.register();
LocManager.getInstance().refresh();
if (null != addrInfo
&& (addrInfo.getLatitudeE6() != 0 && addrInfo.getLongitudeE6() != 0)) {
if (-1 == mMapView.getOverlays().indexOf(touchOverlay)) {
mMapView.getOverlays().add(touchOverlay);
}
touchOverlay.setTouchPoint(addrInfo.getGeoPoint(),
addrInfo.getStrAddr(), addrInfo.getStrAddr());
mMapView.getController().setCenter(addrInfo.getGeoPoint());
setInfoLayout(addrInfo.getStrAddr());
etDesc.setText(addrInfo.getDesc());
btnEnter.setEnabled(false);
}
}
@Override
protected void onPause() {
mMapView.onPause();
locReceiver.unRegister();
super.onPause();
}
@Override
protected void onResume() {
mMapView.onResume();
locReceiver.register();
super.onResume();
}
@Override
protected void onDestroy() {
mMapView.destroy();
super.onDestroy();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mMapView.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mMapView.onRestoreInstanceState(savedInstanceState);
}
// 下一组数据 已删除
// public void goToNextPage(View v) {
// // 搜索下一组poi
// int flag = mSearch.goToPoiPage(++load_Index);
// if (flag != 0) {
// Toast.show("先搜索开始,然后再搜索下一组数据");
// }
// }
private void showInfoLayout() {
vInfo.setVisibility(View.VISIBLE);
tvInfo.setText(getString(R.string.loading));
etDesc.setVisibility(View.GONE);
}
private void setInfoLayout(String addrStr) {
vInfo.setVisibility(View.VISIBLE);
tvInfo.setText(addrStr);
etDesc.setVisibility(View.VISIBLE);
etDesc.setText("");
btnEnter.setEnabled(true);
}
private void hideInfoLayout() {
vInfo.setVisibility(View.GONE);
btnEnter.setEnabled(false);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.text_left:
Utils.hideSoftKeyboard(this);
finish();
break;
case R.id.text_right:
if (null != addrInfo) {
String desc = etDesc.getText().toString();
if (desc.length() > 20) {
showToast("详细地址最多20字");// TODO
}
Intent intent = new Intent();
addrInfo.setDesc(etDesc.getText().toString());
addrInfo.setGeoPint(null);
intent.putExtra(Extra.AddrModel, addrInfo);
setResult(RESULT_OK, intent);
Utils.hideSoftKeyboard(this);
finish();
} else {
v.setEnabled(false);
}
break;
case R.id.select_map_ibtn_local:
if (null != AppContext.location) {
isGoToMyLoc = true;
locReceiver.onReceive(AppContext.getInstance(), null);
} else {
isGoToMyLoc = true;
LocManager.getInstance().refresh();
}
break;
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (!btnEnter.isEnabled()) {
btnEnter.setEnabled(true);
}
if (s.length() > 20) {
etDesc.setText(s.toString().subSequence(0, 20));
etDesc.setSelection(20);
}
}
@Override
public void afterTextChanged(Editable s) {
}
}