@@ -1,7 +1,12 @@
package com.mogo.module.share.net ;
import android.content.Context ;
import com.alibaba.android.arouter.launcher.ARouter ;
import com.google.gson.Gson ;
import com.mogo.cloud.network.BaseData ;
import com.mogo.cloud.tanlu.api.IRoadInfoSearchCallback ;
import com.mogo.cloud.tanlu.api.MogoRoadSearchManager ;
import com.mogo.commons.debug.DebugConfig ;
import com.mogo.commons.network.ParamsProvider ;
import com.mogo.commons.network.SubscribeImpl ;
@@ -27,6 +32,7 @@ import com.mogo.utils.logger.Logger;
import com.mogo.utils.network.RequestOptions ;
import com.mogo.utils.network.utils.GsonUtil ;
import java.util.ArrayList ;
import java.util.Map ;
import io.reactivex.Observable ;
@@ -73,111 +79,148 @@ public class TanluModelData {
*
* @param voiceCmdData 语音提供的语义封装
*/
public void queryRodeInfo ( final VoiceCmdData voiceCmdData , final RoadInfoCallback callback ) {
public void queryRodeInfo ( Context context , String key , final VoiceCmdData voiceCmdData , final RoadInfoCallback callback ) {
Logger . d ( TAG , " queryRodeInfo: " + voiceCmdData ) ;
if ( voiceCmdData . isHere ( ) ) {
// 搜索附近路况,只需要拿到当前位置信息,就可以请求服务端
MogoLocation l = TanluServiceManager . getServiceApis ( ) . getMapServiceApi ( ) . getSingletonLocationClient ( mContext ) . getLastKnowLocation ( ) ;
Location location = new Location ( l . getLatitude ( ) , l . getLongitude ( ) ) ;
callback . onLocatSuccess ( l . getLatitude ( ) , l . getLongitude ( ) ) ;
RoadInfoRequest request ;
if ( voiceCmdData . getObj ( ) . equals ( TYPE_NAME_BLOCK ) ) {
// 拥堵和路况同时查
request = new RoadInfoRequest ( location , new String [ ] { TANLU_ROAD_CONGESTION_COMPAT , TANLU_ROAD_CURRENT } , false , false ) ;
} else {
request = new RoadInfoRequest ( location , new String [ ] { voiceCmdData . getType ( ) } , false , false ) ;
ArrayList list = new ArrayList ( ) ;
list . add ( voiceCmdData . getType ( ) ) ;
//北京市朝阳区小黄庄北街2号, 经纬度和地理位置必须有一个
MogoLocation mogoLocation = TanluServiceManager . getServiceApis ( ) . getMapServiceApi ( ) . getSingletonLocationClient ( mContext ) . getLastKnowLocation ( ) ;
com . mogo . cloud . tanlu . bean . location . Location location = new com . mogo . cloud . tanlu . bean . location . Location ( ) ;
location . setLatitude ( mogoLocation . getLatitude ( ) ) ;
location . setLongitude ( mogoLocation . getLongitude ( ) ) ;
com . mogo . cloud . tanlu . bean . RoadInfoRequest request = new com . mogo . cloud . tanlu . bean . RoadInfoRequest ( location , key , list , false , false ) ;
MogoRoadSearchManager . getInstance ( context ) . init ( ) ;
MogoRoadSearchManager . getInstance ( context ) . queryRoadInfo ( request , new IRoadInfoSearchCallback ( ) {
@Override
public void onSuccess ( BaseData < com . mogo . cloud . tanlu . bean . RoadInfos > result ) {
if ( result ! = null ) {
if ( result . getResult ( ) ! = null ) {
Logger . d ( TAG , " 搜索附近路况信息成功: " + result . getResult ( ) ) ;
callback . onQueryRoadInfoSuccess ( result . getResult ( ) . getData ( ) ) ;
} else {
callback . onQueryRoadInfoFail ( result . getMsg ( ) , result . getCode ( ) ) ;
}
}
}
Map < String , Object > params = new ParamsProvider . Builder ( mContext )
. append ( " sn " , Utils . getSn ( ) )
. append ( " data " , GsonUtil . jsonFromObject ( request ) )
. build ( ) ;
@Override
public void onFailure ( int code ) {
callback . onQueryRoadInfoFail ( " " , code ) ;
}
mShareApiService . queryRoadInfos ( params )
. subscribeOn ( Schedulers . io ( ) )
. observeOn ( AndroidSchedulers . mainThread ( ) )
. subscribe ( new SubscribeImpl < BaseDataCompat < RoadInfos > > ( RequestOptions . create ( mContext ) ) {
@Override
public void onError ( Throwable e ) {
super . onError ( e ) ;
}
@Override
public void onError ( Throwable e ) {
@Override
public void onSuccess ( BaseDataCompat < RoadInfos > o ) {
super . onSuccess ( o ) ;
Logger . d ( TAG , " 搜索附近路况信息成功: " + o ) ;
callback . onQueryRoadInfoSuccess ( o . getResult ( ) . getData ( ) ) ;
Logger . d ( TAG , " 搜索附近路况信息成功2: " + o ) ;
}
}
} ) ;
@Override
public void onError ( String message , int code ) {
super . onError ( message , code ) ;
callback . onQueryRoadInfoFail ( message , code ) ;
}
} ) ;
} else {
// 查询的不是附近的信息,所以需要查询一下目标地址的经纬度,然后再请求服务端
Observable . create ( new ObservableOnSubscribe < MogoPoiResult > ( ) {
@Override
public void subscribe ( ObservableEmitter < MogoPoiResult > emitter ) throws Exception {
// 根据传入的地址,转成经纬度
IMogoMapService mapService = TanluServiceManager . getServiceApis ( ) . getMapServiceApi ( ) ;
String cityCode = mapService . getSingletonLocationClient ( mContext ) . getLastKnowLocation ( ) . getCityCode ( ) ;
MogoPoiSearchQuery poiSearchQuery = new MogoPoiSearchQuery ( voiceCmdData . getLocation ( ) , " " , cityCode ) ;
IMogoPoiSearch poiSearch = mapService . getPoiSearch ( mContext , poiSearchQuery ) ;
MogoPoiResult result = poiSearch . searchPOI ( ) ;
if ( result ! = null & & result . getPois ( ) ! = null & & result . getPois ( ) . size ( ) > 0 ) {
emitter . onNext ( result ) ;
} else {
emitter . onError ( new IllegalArgumentException ( " 没有根据地址查询到对应的经纬度 " ) ) ;
}
}
} ) . subscribeOn ( Schedulers . io ( ) ) . observeOn ( Schedulers . io ( ) )
. flatMap ( new Function < MogoPoiResult , Observable < BaseDataCompat < RoadInfos > > > ( ) {
@Override
public Observable < BaseDataCompat < RoadInfos > > apply ( MogoPoiResult mogoPoiResult ) throws Exception {
// 转成经纬度后,整理参数,进行接口请求
Logger . d ( TAG , " 查询目标地址经纬度成功=== " + Thread . currentThread ( ) . getName ( ) ) ;
MogoPoiItem poiItem = mogoPoiResult . getPois ( ) . get ( 0 ) ;
Location location = new Location ( poiItem . getPoint ( ) . lat , poiItem . getPoint ( ) . lon ) ;
callback . onLocatSuccess ( location . getLat ( ) , location . getLon ( ) ) ;
RoadInfoRequest request ;
if ( voiceCmdData . getObj ( ) . equals ( TYPE_NAME_BLOCK ) ) {
// 拥堵和路况同时查
request = new RoadInfoRequest ( location , new String [ ] { TANLU_ROAD_CONGESTION_COMPAT , TANLU_ROAD_CURRENT } , false , false ) ;
} else {
request = new RoadInfoRequest ( location , new String [ ] { voiceCmdData . getType ( ) } , false , false ) ;
}
Map < String , Object > params = new ParamsProvider . Builder ( mContext )
. append ( " sn " , Utils . getSn ( ) )
. append ( " data " , GsonUtil . jsonFromObject ( request ) )
. build ( ) ;
return mShareApiService . queryRoadInfos ( params ) ;
}
} ) . subscribeOn ( Schedulers . io ( ) ) . observeOn ( AndroidSchedulers . mainThread ( ) )
. subscribe ( new SubscribeImpl < BaseDataCompat < RoadInfos > > ( RequestOptions . create ( mContext ) ) {
@Override
public void onError ( Throwable e ) {
super . onError ( e ) ;
callback . onQueryRoadInfoFail ( e . getMessage ( ) , - 1 ) ;
}
@Override
public void onSuccess ( BaseDataCompat < RoadInfos > o ) {
super . onSuccess ( o ) ;
Logger . d ( TAG , " 当前线程为 " + Thread . currentThread ( ) . getName ( ) + " 搜索目标地址路况信息成功: " + o ) ;
callback . onQueryRoadInfoSuccess ( o . getResult ( ) . getData ( ) ) ;
}
@Override
public void onError ( String message , int code ) {
super . onError ( message , code ) ;
callback . onQueryRoadInfoFail ( message , code ) ;
}
} ) ;
}
// if (voiceCmdData.isHere()) {
// // 搜索附近路况,只需要拿到当前位置信息,就可以请求服务端
// MogoLocation l = TanluServiceManager.getServiceApis().getMapServiceApi().getSingletonLocationClient(mContext).getLastKnowLocation();
// Location location = new Location(l.getLatitude(), l.getLongitude()) ;
// callback.onLocatSuccess(l.getLatitude(), l.getLongitude()) ;
// RoadInfoRequest request;
// if (voiceCmdData.getObj().equals(TYPE_NAME_BLOCK)) {
// // 拥堵和路况同时查
// request = new RoadInfoRequest(location, new String[]{TANLU_ROAD_CONGESTION_COMPAT, TANLU_ROAD_CURRENT}, false, false);
// }else {
// request = new RoadInfoRequest(location, new String[]{voiceCmdData.getType()}, false, false) ;
// }
//
// Map<String, Object> params = new ParamsProvider.Builder(mContext)
// .append("sn", Utils.getSn())
// .append("data", GsonUtil.jsonFromObject(request))
// .build() ;
//
// mShareApiService.queryRoadInfos(params)
// .subscribeOn(Schedulers.io())
// .observeOn(AndroidSchedulers.mainThread())
// .subscribe(new SubscribeImpl<BaseDataCompat<RoadInfos>>(RequestOptions.create(mContext)) {
// @Override
// public void onError(Throwable e) {
// super.onError(e) ;
// }
//
// @Override
// public void onSuccess(BaseDataCompat<RoadInfos> o) {
// super.onSuccess(o);
// Logger.d(TAG, "搜索附近路况信息成功: " + o);
// callback.onQueryRoadInfoSuccess(o.getResult().getData());
// Logger.d(TAG, "搜索附近路况信息成功2: " + o);
// }
//
// @Override
// public void onError(String message, int code) {
// super.onError(message, code);
// callback.onQueryRoadInfoFail(message, code);
// }
// });
// } else {
// // 查询的不是附近的信息,所以需要查询一下目标地址的经纬度,然后再请求服务端
// Observable.create(new ObservableOnSubscribe<MogoPoiResult>() {
// @Override
// public void subscribe(ObservableEmitter<MogoPoiResult> emitter) throws Exception {
// // 根据传入的地址,转成经纬度
// IMogoMapService mapService = TanluServiceManager.getServiceApis().getMapServiceApi();
// String cityCode = mapService.getSingletonLocationClient(mContext).getLastKnowLocation().getCityCode();
// MogoPoiSearchQuery poiSearchQuery = new MogoPoiSearchQuery(voiceCmdData.getLocation(), "", cityCode);
// IMogoPoiSearch poiSearch = mapService.getPoiSearch(mContext, poiSearchQuery);
// MogoPoiResult result = poiSearch.searchPOI();
// if (result != null && result.getPois() != null && result.getPois().size() > 0) {
// emitter.onNext(result);
// } else {
// emitter.onError(new IllegalArgumentException("没有根据地址查询到对应的经纬度"));
// }
// }
// }).subscribeOn(Schedulers.io()).observeOn(Schedulers.io())
// .flatMap(new Function<MogoPoiResult, Observable<BaseDataCompat<RoadInfos>>>() {
// @Override
// public Observable<BaseDataCompat<RoadInfos>> apply(MogoPoiResult mogoPoiResult) throws Exception {
// // 转成经纬度后,整理参数,进行接口请求
// Logger.d(TAG, "查询目标地址经纬度成功===" + Thread.currentThread().getName());
// MogoPoiItem poiItem = mogoPoiResult.getPois().get(0);
// Location location = new Location(poiItem.getPoint().lat, poiItem.getPoint().lon);
// callback.onLocatSuccess(location.getLat(), location.getLon());
// RoadInfoRequest request;
// if (voiceCmdData.getObj().equals(TYPE_NAME_BLOCK)) {
// // 拥堵和路况同时查
// request = new RoadInfoRequest(location, new String[]{TANLU_ROAD_CONGESTION_COMPAT, TANLU_ROAD_CURRENT}, false, false);
// }else{
// request = new RoadInfoRequest(location, new String[]{voiceCmdData.getType()}, false, false);
// }
//
// Map<String, Object> params = new ParamsProvider.Builder(mContext)
// .append("sn", Utils.getSn())
// .append("data", GsonUtil.jsonFromObject(request))
// .build();
// return mShareApiService.queryRoadInfos(params);
// }
// }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
// .subscribe(new SubscribeImpl<BaseDataCompat<RoadInfos>>(RequestOptions.create(mContext)) {
// @Override
// public void onError(Throwable e) {
// super.onError(e);
// callback.onQueryRoadInfoFail(e.getMessage(), -1);
// }
//
// @Override
// public void onSuccess(BaseDataCompat<RoadInfos> o) {
// super.onSuccess(o);
// Logger.d(TAG, "当前线程为"+Thread.currentThread().getName()+" 搜索目标地址路况信息成功: " + o);
// callback.onQueryRoadInfoSuccess(o.getResult().getData());
// }
//
// @Override
// public void onError(String message, int code) {
// super.onError(message, code);
// callback.onQueryRoadInfoFail(message, code);
// }
// });
// }
}
}