/**
*
*/
package coolbuy360.searchhealth;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.LinearInterpolator;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.baidu.location.BDLocation;
import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.map.LocationData;
import com.baidu.mapapi.map.MKEvent;
import com.baidu.mapapi.map.MyLocationOverlay;
import com.baidu.mapapi.map.PopupClickListener;
import com.baidu.mapapi.map.PopupOverlay;
import com.baidu.mapapi.map.RouteOverlay;
import com.baidu.mapapi.search.MKAddrInfo;
import com.baidu.mapapi.search.MKBusLineResult;
import com.baidu.mapapi.search.MKDrivingRouteResult;
import com.baidu.mapapi.search.MKPlanNode;
import com.baidu.mapapi.search.MKPoiResult;
import com.baidu.mapapi.search.MKRoute;
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.mapapi.utils.CoordinateConvert;
import com.baidu.mapapi.utils.DistanceUtil;
import com.baidu.platform.comapi.basestruct.GeoPoint;
import coolbuy360.control.MyMapView;
import coolbuy360.control.MyPoiOverlay;
import coolbuy360.service.LocationInfo;
import coolbuy360.service.LocationProvider;
import coolbuy360.service.Util;
import coolbuy360.service.searchApp;
import coolbuy360.service.LocationProvider.OnReceiveLocationListener;
/**
* ǰ��ҩ��·��
* @author yangxc
*
*/
public class BDrugStoreRoute extends Activity {
final static String TAG = "MapActivty";
MyMapView mMapView = null;
//public MKMapViewListener mMapListener = null;
FrameLayout mMapViewContainer = null;
private LocationProvider innerLocationProvider = null;
LocationInfo.SItude station = null;
GeoPoint localpt;
GeoPoint endpt;
double endlatitude;
double endlongitude;
private MKSearch mSearch = null; // ����ģ�飬Ҳ��ȥ����ͼģ�����ʹ��
MyLocationOverlay myLocationOverlay = null;
LocationData locData = null;
TextView actionbar_page_title;
LinearLayout async_begin;
LinearLayout async_error;
TextView location_address_txt;
ImageView location_address_ico;
LinearLayout location_address_btn;
LinearLayout bdrugstoremap_route_nav;
String storename = "����ҩ��";
Animation operatingAnim;
//���·�߽ڵ����
Button mBtnPre = null;// ��һ���ڵ�
Button mBtnNext = null;// ��һ���ڵ�
int nodeIndex = -2;// �ڵ�����,������ڵ�ʱʹ��
MKRoute route = null;// ����ݳ�/����·�����ݵı�����������ڵ�ʱʹ��
RouteOverlay routeOverlay = null;
boolean useDefaultIcon = false;
int searchType = -1;// ��¼���������ͣ����ּݳ�/���к���
private PopupOverlay pop = null;// ��������ͼ�㣬����ڵ�ʱʹ��
private TextView popupText = null;// ����view
private View viewCache = null;
private Boolean isRouted = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
innerLocationProvider = searchApp.mLocationProvider;
searchApp app = (searchApp) this.getApplication();
if (app.mBMapManager == null) {
app.mBMapManager = new BMapManager(getApplicationContext());
/**
* ���BMapManagerû�г�ʼ�����ʼ��BMapManager
*/
app.mBMapManager.init(new searchApp.MyGeneralListener());
}
setContentView(R.layout.bdrugstoremap);
mMapView = (MyMapView) findViewById(R.id.bmapView);
initMapView();
mMapView.getController().setZoom(16);
mMapView.getController().enableClick(true);
mMapView.setBuiltInZoomControls(false);
//��ʼ������
mBtnPre = (Button)findViewById(R.id.pre);
mBtnNext = (Button)findViewById(R.id.next);
mBtnPre.setVisibility(View.INVISIBLE);
mBtnNext.setVisibility(View.INVISIBLE);
OnClickListener nodeClickListener = new OnClickListener(){
public void onClick(View v) {
//���·�߽ڵ�
nodeClick(v);
}
};
mBtnPre.setOnClickListener(nodeClickListener);
mBtnNext.setOnClickListener(nodeClickListener);
//���� ��������ͼ��
createPaopao();
/*mMapListener = new MKMapViewListener() {
@Override
public void onMapMoveFinish() {
// TODO Auto-generated method stub
}
@Override
public void onClickMapPoi(MapPoi mapPoiInfo) {
// TODO Auto-generated method stub
String title = "";
if (mapPoiInfo != null) {
title = mapPoiInfo.strText;
Toast.makeText(BDrugStoreMap.this, title,
Toast.LENGTH_SHORT).show();
}
}
@Override
public void onGetCurrentMap(Bitmap b) {
// TODO Auto-generated method stub
//Log.d("hjtest", "hjtest" + "getmap OK");
}
@Override
public void onMapAnimationFinish() {
// TODO Auto-generated method stub
//Log.d("hjtest", "hjtest" + "onMapAnimationFinish");
}
@Override
public void onMapLoadFinish() {
// TODO �Զ����ɵķ������
}
};
mMapView.regMapViewListener(searchApp.getInstance().mBMapManager,
mMapListener);*/
actionbar_page_title = (TextView) findViewById(R.id.actionbar_page_title);
async_begin = (LinearLayout) findViewById(R.id.async_begin);
async_begin.setVisibility(View.VISIBLE);
async_error = (LinearLayout) findViewById(R.id.async_error);
bdrugstoremap_route_nav = (LinearLayout) findViewById(R.id.bdrugstoremap_route_nav);
bdrugstoremap_route_nav.setVisibility(View.VISIBLE);
location_address_txt = (TextView) findViewById(R.id.location_address_txt);
location_address_ico = (ImageView) findViewById(R.id.location_address_ico);
location_address_btn = (LinearLayout) findViewById(R.id.location_address_btn);
operatingAnim = AnimationUtils.loadAnimation(this, R.anim.tip);
// ����������ת
LinearInterpolator lin = new LinearInterpolator();
operatingAnim.setInterpolator(lin);
location_address_btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
location_address_ico.setImageResource(R.drawable.icon_loc);
if (operatingAnim != null) {
location_address_ico.startAnimation(operatingAnim);
}
innerLocationProvider.updateListener();
}
});
innerLocationProvider.setOnReceiveLocationListener(new MyOnReceiveLocationListener());
ImageButton actionbar_pre_btn = (ImageButton) this
.findViewById(R.id.actionbar_pre_btn);
actionbar_pre_btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
BDrugStoreRoute.this.finish();
}
});
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
endlatitude = bundle.getDouble("endlatitude", 0);
endlongitude = bundle.getDouble("endlongitude", 0);
endpt = new GeoPoint((int) (endlatitude * 1E6),
(int) (endlongitude * 1E6));
storename = bundle.getString("storename");
if (storename == null || storename.equals("")) {
storename = "����ҩ��";
}
}
actionbar_page_title.setText("ǰ��" + storename);
// ��ʼ������ģ�飬ע�������¼�����
mSearch = new MKSearch();
mSearch.init(searchApp.getInstance().mBMapManager, new DrugStoreRouteListener());
refreshData();
}
/**
* ������������ͼ��
*/
public void createPaopao(){
//���ݵ����Ӧ�ص�
PopupClickListener popListener = new PopupClickListener(){
@Override
public void onClickedPopup(int index) {
}
};
pop = new PopupOverlay(mMapView,popListener);
mMapView.pop = pop;
}
/**
* �ڵ����ʾ��
* @param v
*/
public void nodeClick(View v){
viewCache = getLayoutInflater().inflate(R.layout.s_popview, null);
popupText = (TextView) viewCache.findViewById(R.id.s_map_pop_txt);
if (searchType == 0 || searchType == 2){
//�ݳ�������ʹ�õ����ݽṹ��ͬ���������Ϊ�ݳ����У��ڵ����������ͬ
if (nodeIndex < -1 || route == null || nodeIndex >= route.getNumSteps())
return;
//��һ���ڵ�
if (mBtnPre.equals(v) && nodeIndex > 0){
//������
nodeIndex--;
GeoPoint steppt = route.getStep(nodeIndex).getPoint();
String messageString = route.getStep(nodeIndex).getContent();
showPop(steppt, messageString);
}
//��һ���ڵ�
if (mBtnNext.equals(v) && nodeIndex < (route.getNumSteps()-1)){
//������
nodeIndex++;
GeoPoint steppt = route.getStep(nodeIndex).getPoint();
String messageString = route.getStep(nodeIndex).getContent();
if (nodeIndex == route.getNumSteps() - 1) {
messageString = "�����յ�" + storename;
}
showPop(steppt, messageString);
}
}
}
/**
* @param steppt
* @param message
*/
private void showPop(GeoPoint steppt, String message) {
//�ƶ���ָ������������
mMapView.getController().animateTo(steppt);
//��������
popupText.setText(message);
pop.showPopup(viewCache,
route.getStep(nodeIndex).getPoint(),
0);
}
private class MyOnReceiveLocationListener implements OnReceiveLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
if (location == null) {
setLocaltionError();
} else {
//async_error.setVisibility(View.GONE);
station = innerLocationProvider.getLocation();
localpt = new GeoPoint((int) (station.latitude * 1E6),
(int) (station.longitude * 1E6));
localpt = CoordinateConvert.fromGcjToBaidu(localpt);
showMyLocation();
//mSearch.poiSearchNearBy(searchkey, localpt, searchrange);
if (!isRouted) {
SearchRouteProcess(localpt, endpt);
}
}
}
}
private class DrugStoreRouteListener implements MKSearchListener {
public void onGetDrivingRouteResult(MKDrivingRouteResult res,
int error) {
async_begin.setVisibility(View.GONE);
// �����յ������壬��Ҫѡ�����ij����б���ַ�б�
if (error == MKEvent.ERROR_ROUTE_ADDR) {
// �������е�ַ
// ArrayList<MKPoiInfo> stPois =
// res.getAddrResult().mStartPoiList;
// ArrayList<MKPoiInfo> enPois =
// res.getAddrResult().mEndPoiList;
// ArrayList<MKCityListInfo> stCities =
// res.getAddrResult().mStartCityList;
// ArrayList<MKCityListInfo> enCities =
// res.getAddrResult().mEndCityList;
return;
}
// ����ſɲο�MKEvent�еĶ���
if (error != 0 || res == null) {
Toast.makeText(BDrugStoreRoute.this, "��Ǹ��δ�ҵ����",
Toast.LENGTH_SHORT).show();
return;
}
searchType = 0;
if (routeOverlay == null) {
routeOverlay = new RouteOverlay(BDrugStoreRoute.this, mMapView);
// ���·��ͼ��
mMapView.getOverlays().add(routeOverlay);
}
// �˴���չʾһ��������Ϊʾ��
routeOverlay.setData(res.getPlan(0).getRoute(0));
// ִ��ˢ��ʹ��Ч
mMapView.refresh();
/*// ʹ��zoomToSpan()���ŵ�ͼ��ʹ·������ȫ��ʾ�ڵ�ͼ��
mMapView.getController().zoomToSpan(routeOverlay.getLatSpanE6(),
routeOverlay.getLonSpanE6());*/
// �ƶ���ͼ�����
mMapView.getController().animateTo(res.getStart().pt);
// ��·�����ݱ����ȫ�ֱ���
route = res.getPlan(0).getRoute(0);
// ����·�߽ڵ��������ڵ����ʱʹ��
nodeIndex = -1;
mBtnPre.setVisibility(View.VISIBLE);
mBtnNext.setVisibility(View.VISIBLE);
isRouted = true;
}
public void onGetTransitRouteResult(MKTransitRouteResult res,
int error) {
}
public void onGetWalkingRouteResult(MKWalkingRouteResult res,
int error) {
async_begin.setVisibility(View.GONE);
// �����յ������壬��Ҫѡ�����ij����б���ַ�б�
if (error == MKEvent.ERROR_ROUTE_ADDR) {
// �������е�ַ
// ArrayList<MKPoiInfo> stPois =
// res.getAddrResult().mStartPoiList;
// ArrayList<MKPoiInfo> enPois =
// res.getAddrResult().mEndPoiList;
// ArrayList<MKCityListInfo> stCities =
// res.getAddrResult().mStartCityList;
// ArrayList<MKCityListInfo> enCities =
// res.getAddrResult().mEndCityList;
return;
}
if (error != 0 || res == null) {
Toast.makeText(BDrugStoreRoute.this, "��Ǹ��δ�ҵ����",
Toast.LENGTH_SHORT).show();
return;
}
searchType = 2;
if (routeOverlay == null) {
routeOverlay = new RouteOverlay(BDrugStoreRoute.this, mMapView);
// ���·��ͼ��
mMapView.getOverlays().add(routeOverlay);
}
// �˴���չʾһ��������Ϊʾ��
routeOverlay.setData(res.getPlan(0).getRoute(0));
// ִ��ˢ��ʹ��Ч
mMapView.refresh();
/*// ʹ��zoomToSpan()���ŵ�ͼ��ʹ·������ȫ��ʾ�ڵ�ͼ��
mMapView.getController().zoomToSpan(routeOverlay.getLatSpanE6(),
routeOverlay.getLonSpanE6());*/
// �ƶ���ͼ�����
mMapView.getController().animateTo(res.getStart().pt);
// ��·�����ݱ����ȫ�ֱ���
route = res.getPlan(0).getRoute(0);
// ����·�߽ڵ��������ڵ����ʱʹ��
nodeIndex = -1;
mBtnPre.setVisibility(View.VISIBLE);
mBtnNext.setVisibility(View.VISIBLE);
isRouted = true;
}
public void onGetAddrResult(MKAddrInfo res, int error) {
}
public void onGetPoiResult(MKPoiResult res, int arg1, int arg2) {
}
public void onGetBusDetailResult(MKBusLineResult result, int iError) {
}
@Override
public void onGetSuggestionResult(MKSuggestionResult res, int arg1) {
}
@Override
public void onGetPoiDetailSearchResult(int type, int iError) {
}
@Override
public void onGetShareUrlResult(MKShareUrlResult result, int type,
int error) {
}
}
/**
* ����·�߹滮����ʾ��
* @param v
*/
void SearchRouteProcess(GeoPoint frompt, GeoPoint topt) {
//��������ڵ��·������
route = null;
routeOverlay = null;
mBtnPre.setVisibility(View.INVISIBLE);
mBtnNext.setVisibility(View.INVISIBLE);
// ������յ��name���и�ֵ��Ҳ����ֱ�Ӷ����긳ֵ����ֵ�������������������
MKPlanNode stNode = new MKPlanNode();
stNode.pt = frompt;
MKPlanNode enNode = new MKPlanNode();
enNode.pt = topt;
double distance = DistanceUtil.getDistance(frompt, topt);
if (distance > 1000) {
actionbar_page_title.setText("�ݳ�ǰ��" + storename);
mSearch.drivingSearch(null, stNode, null, enNode);
} else {
actionbar_page_title.setText("����ǰ��" + storename);
mSearch.walkingSearch(null, stNode, null, enNode);
}
}
@Override
protected void onPause() {
mMapView.setVisibility(View.INVISIBLE);
mMapView.onPause();
super.onPause();
}
@Override
protected void onResume() {
mMapView.setVisibility(View.VISIBLE);
mMapView.onResume();
super.onResume();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mMapView.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mMapView.onRestoreInstanceState(savedInstanceState);
}
@Override
protected void onDestroy() {
mMapView.destroy();
/*searchApp app = (searchApp) this.getApplication();
if (app.mBMapManager != null) {
app.mBMapManager.destroy();
app.mBMapManager = null;
}*/
super.onDestroy();
}
private void initMapView() {
mMapView.setLongClickable(true);
//mMapController.setMapClickEnable(true);
//mMapView.setSatellite(false);
}
/**
* ˢ������
*/
private void refreshData() {
try {
isRouted = false;
async_begin.setVisibility(View.VISIBLE);
if (Util.isNetworkConnected(this)) {
if (innerLocationProvider == null) {
innerLocationProvider = searchApp.mLocationProvider;
innerLocationProvider
.setOnReceiveLocationListener(new MyOnReceiveLocationListener());
}
station = innerLocationProvider.getLocation();
if (station == null
|| (station.latitude == 0.0 && station.longitude == 0.0)) {
innerLocationProvider.updateListener();
} else {
GeoPoint googlept = new GeoPoint(
(int) (station.latitude * 1E6),
(int) (station.longitude * 1E6));
localpt = CoordinateConvert.fromGcjToBaidu(googlept);
showMyLocation();
SearchRouteProcess(localpt, endpt);
}
} else {
setNetError();
}
} catch (Exception e) {
setNetError();
}
}
/**
* ���ö�λ������ʾ
*/
private void setLocaltionError() {
async_begin.setVisibility(View.GONE);
TextView async_error_txt = (TextView) async_error
.findViewById(R.id.async_error_txt);
Button async_error_refleshbtn = (Button) async_error
.findViewById(R.id.async_error_reflesh);
async_error.setVisibility(View.VISIBLE);
async_error_txt.setText(R.string.error_location);
async_error_refleshbtn.setVisibility(View.VISIBLE);
async_error_refleshbtn.setOnClickListener(new refreshOnclick());
}
/**
* �������������������ʾ
*/
private void setNoResultError() {
async_begin.setVisibility(View.GONE);
TextView async_error_txt = (TextView) async_error
.findViewById(R.id.async_error_txt);
Button async_error_refleshbtn = (Button) async_error
.findViewById(R.id.async_error_reflesh);
async_error.setVisibility(View.VISIBLE);
async_error_txt.setText("û���ҵ�������ҩ����Ϣ");
async_error_refleshbtn.setVisibility(View.VISIBLE);
async_error_refleshbtn.setOnClickListener(new refreshOnclick());
}
/**
* �������������ʾ
*/
private void setNetError() {
async_begin.setVisibility(View.GONE);
TextView async_error_txt = (TextView) async_error
.findViewById(R.id.async_error_txt);
Button async_error_refleshbtn = (Button) async_error
.findViewById(R.id.async_error_reflesh);
async_error.setVisibility(View.VISIBLE);
async_error_txt.setText(R.string.error_nonetwork);
async_error_refleshbtn.setVisibility(View.VISIBLE);
async_error_refleshbtn.setOnClickListener(new refreshOnclick());
}
/**
* ˢ�µ��
*/
public class refreshOnclick implements OnClickListener
{
@Override
public void onClick(View v) {
async_error.setVisibility(View.GONE);
//async_begin.setVisibility(View.VISIBLE);
refreshData();
}
}
/**
* ��ʾ�ֻ�λ��
*/
private void showMyLocation() {
try {
if (myLocationOverlay == null) {
myLocationOverlay = new MyLocationOverlay(mMapView);
mMapView.getOverlays().add(myLocationOverlay);
}
locData = new LocationData();
locData.latitude = localpt.getLatitudeE6() / 1e6;
locData.longitude = localpt.getLongitudeE6() / 1e6;
try {
locData.accuracy = station.accuracy;
locData.direction = station.direction;
location_address_txt.setText(station.address);
location_address_ico.setImageResource(R.drawable.icon_loc_suc);
location_address_ico.clearAnimation();
} catch (Exception e) {
}
myLocationOverlay.setData(locData);
myLocationOverlay.enableCompass();
mMapView.getController().animateTo(localpt);
mMapView.refresh();
} catch (Exception e) {
// TODO �Զ����ɵ� catch ��
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
/*String drugstoreid = data.getExtras().getString("drugstoreid");
Integer positionIndex = idlist.indexOf(drugstoreid);
if (positionIndex != -1) {
((OverlayTest)(mMapView.getOverlays().get(0))).onTap(positionIndex);
}*/
}
}
}