Merge remote-tracking branch 'origin/feature/v1.0.0' into feature/v1.0.0

This commit is contained in:
董宏宇
2020-01-13 16:49:36 +08:00
12 changed files with 300 additions and 39 deletions

View File

@@ -121,6 +121,7 @@ public class ExtensionsPresenter extends Presenter< ExtensionsView > implements
if ( mWeatherModel != null ) {
mWeatherModel.destroy();
}
getContext().unregisterReceiver( mReceiver );
if ( mMsgCenter != null ) {
mMsgCenter.unregisterMsgCenterListener( this );
}

View File

@@ -106,40 +106,52 @@ public class MapPresenter extends Presenter< MapView > implements IMogoVoiceList
switch ( cmd ) {
case VoiceConstants.CMD_MAP_TRAFFIC_MODE:
mView.getUIController().setTrafficEnabled( true );
AIAssist.getInstance( getContext() ).speakTTSVoice( "已打开", null );
break;
case VoiceConstants.CMD_MAP_UN_TRAFFIC_MODE:
mView.getUIController().setTrafficEnabled( false );
AIAssist.getInstance( getContext() ).speakTTSVoice( "已关闭", null );
break;
case VoiceConstants.CMD_MAP_ZOOM_IN:
AIAssist.getInstance( getContext() ).speakTTSVoice( "已缩小", null );
mView.getUIController().changeZoom( true );
break;
case VoiceConstants.CMD_MAP_ZOOM_OUT:
AIAssist.getInstance( getContext() ).speakTTSVoice( "已放大", null );
mView.getUIController().changeZoom( false );
break;
case VoiceConstants.CMD_MAP_2D:
case VoiceConstants.CMD_MAP_NORTH_UP_MODE:
mView.getUIController().changeMapMode( EnumMapUI.NorthUP_2D );
AIAssist.getInstance( getContext() ).speakTTSVoice( "已切换", null );
break;
case VoiceConstants.CMD_MAP_3D:
mView.getUIController().changeMapMode( EnumMapUI.CarUp_3D );
AIAssist.getInstance( getContext() ).speakTTSVoice( "已切换", null );
break;
case VoiceConstants.CMD_MAP_DAY_TIME_MODE:
mView.getUIController().changeMapMode( EnumMapUI.Type_Light );
AIAssist.getInstance( getContext() ).speakTTSVoice( "已切换", null );
break;
case VoiceConstants.CMD_MAP_NIGHT_MODE:
mView.getUIController().changeMapMode( EnumMapUI.Type_Night );
AIAssist.getInstance( getContext() ).speakTTSVoice( "已切换", null );
break;
case VoiceConstants.CMD_MAP_AUTO_LIGHT_NIGHT_MODE:
mView.getUIController().changeMapMode( EnumMapUI.Type_AUTO_LIGHT_Night );
AIAssist.getInstance( getContext() ).speakTTSVoice( "已切换", null );
break;
case VoiceConstants.CMD_MAP_DISPLAY_OVERVIEW_MODE:
mView.getUIController().displayOverview();
AIAssist.getInstance( getContext() ).speakTTSVoice( "已切换", null );
break;
case VoiceConstants.CMD_MAP_CONTINUE_NAVI_MODE:
mView.getUIController().recoverLockMode();
AIAssist.getInstance( getContext() ).speakTTSVoice( "已切换", null );
break;
case VoiceConstants.CMD_MAP_CAR_UP_MODE:
mView.getUIController().changeMapMode( EnumMapUI.CarUp_2D );
AIAssist.getInstance( getContext() ).speakTTSVoice( "已切换", null );
break;
}
}

View File

@@ -29,7 +29,7 @@ object AddressManager {
} else {
var newInstance = ChoosePathFragment.newInstance(EntityConvertUtils.poi2MogoTip(
homeAddress
))
).point)
SearchServiceHolder.push(
newInstance, MogoModulePaths.PATH_FRAGMENT_CHOOSE_PAHT
)
@@ -45,7 +45,7 @@ object AddressManager {
var newInstance =
ChoosePathFragment.newInstance(EntityConvertUtils.poi2MogoTip(
companyAddress
))
).point)
SearchServiceHolder.push(
newInstance, MogoModulePaths.PATH_FRAGMENT_CHOOSE_PAHT
)

View File

@@ -2,6 +2,7 @@ package com.mogo.module.navi.ui.adapter;
import android.content.Context;
import android.view.View;
import com.mogo.map.search.geo.MogoPoiItem;
import com.mogo.map.search.inputtips.MogoTip;
import com.mogo.module.navi.R;
import com.mogo.module.navi.bean.SearchPoi;
@@ -13,7 +14,7 @@ import java.util.List;
* @author zyz
* 2019-08-13.
*/
public class SearchCategoryAdapter extends RecycleBaseAdapter<MogoTip> {
public class SearchCategoryAdapter extends RecycleBaseAdapter<MogoPoiItem> {
private int current = 0;
private int lastPosition = 0;
@@ -21,7 +22,7 @@ public class SearchCategoryAdapter extends RecycleBaseAdapter<MogoTip> {
/**
*
*/
public SearchCategoryAdapter(Context context, List<MogoTip> list) {
public SearchCategoryAdapter(Context context, List<MogoPoiItem> list) {
super(context, list, R.layout.item_search_category);
}
@@ -30,10 +31,10 @@ public class SearchCategoryAdapter extends RecycleBaseAdapter<MogoTip> {
private View.OnClickListener onClickListener;
@Override
public void onBindViewHolder(RecycleViewHolder holder, MogoTip tip) {
public void onBindViewHolder(RecycleViewHolder holder, MogoPoiItem tip) {
holder.setText(R.id.tv_position, tip.getName());
holder.setText(R.id.tv_position_des, tip.getAddress());
holder.setText(R.id.tv_position, tip.getTitle());
holder.setText(R.id.tv_position_des, tip.getSnippet());
holder.setText(R.id.iv_position,String.valueOf(holder.getLayoutPosition()+1));
holder.itemView.setTag(R.id.tag_position, holder.getLayoutPosition());
@@ -49,7 +50,7 @@ public class SearchCategoryAdapter extends RecycleBaseAdapter<MogoTip> {
this.mShowDelete = showDelete;
}
public void refresh(List<MogoTip> datums, boolean showDelete) {
public void refresh(List<MogoPoiItem> datums, boolean showDelete) {
//this.da = datums;
setShowDelete(showDelete);
setDatas(datums);
@@ -57,14 +58,25 @@ public class SearchCategoryAdapter extends RecycleBaseAdapter<MogoTip> {
}
public void setCurrent(int current) {
if (current==this.current) {
return;
}
this.lastPosition=this.current;
this.current = current;
notifyItemChanged(lastPosition);
notifyItemChanged(current);
lastPosition = current;
}
public int getCurrent() {
return current;
}
public MogoTip getCurrentItem(){
public int getLastPosition(){
return lastPosition;
}
public MogoPoiItem getCurrentItem(){
return list.get(current);
}
}

View File

@@ -0,0 +1,94 @@
package com.mogo.module.navi.ui.search;
import android.app.AlertDialog;
import android.text.Editable;
import android.text.TextUtils;
import android.widget.EditText;
import androidx.annotation.NonNull;
import androidx.lifecycle.LifecycleOwner;
import com.alibaba.android.arouter.launcher.ARouter;
import com.mogo.commons.mvp.Presenter;
import com.mogo.map.search.geo.MogoPoiItem;
import com.mogo.map.search.inputtips.IMogoInputtipsListener;
import com.mogo.map.search.inputtips.IMogoInputtipsSearch;
import com.mogo.map.search.inputtips.MogoTip;
import com.mogo.map.search.inputtips.query.MogoInputtipsQuery;
import com.mogo.map.search.poisearch.IMogoPoiSearch;
import com.mogo.map.search.poisearch.IMogoPoiSearchListener;
import com.mogo.map.search.poisearch.MogoPoiResult;
import com.mogo.map.search.poisearch.query.MogoPoiSearchQuery;
import com.mogo.module.common.TextWatcherAdapter;
import com.mogo.module.navi.bean.EntityConvertUtils;
import com.mogo.module.navi.bean.SearchPoi;
import com.mogo.module.navi.constants.DataConstants;
import com.mogo.module.navi.constants.SearchServiceHolder;
import com.mogo.module.navi.database.AppDataBase;
import com.mogo.service.MogoServicePaths;
import com.mogo.service.map.IMogoMapService;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.Single;
import io.reactivex.SingleEmitter;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
import java.util.List;
/**
* @author congtaowang
* @since 2019-10-02
* <p>
* 搜搜页逻辑处理
*/
public class CategoryPresenter extends Presenter<CategoryView> {
private CompositeDisposable mCompositeDisposable;
private IMogoMapService mMapService;
public CategoryPresenter(CategoryView view) {
super(view);
mCompositeDisposable = new CompositeDisposable();
}
@Override
public void onCreate(@NonNull LifecycleOwner owner) {
super.onCreate(owner);
mMapService = (IMogoMapService) ARouter.getInstance()
.build(MogoServicePaths.PATH_SERVICES_MAP)
.navigation(getContext());
}
public void startSearchLocalPoiByInput(String keyword) {
MogoPoiSearchQuery mogoInputtipsQuery = new MogoPoiSearchQuery("", keyword);
mogoInputtipsQuery.setLocation(
SearchServiceHolder.INSTANCE.getMapUIController().getWindowCenterLocation());
IMogoPoiSearch inputtipsSearch =
mMapService.getPoiSearch(getContext(), mogoInputtipsQuery);
inputtipsSearch.setPoiSearchListener(new IMogoPoiSearchListener() {
@Override public void onPoiSearched(MogoPoiResult result, int errorCode) {
mView.renderSearchPoiResult(result.getPois());
}
@Override public void onPoiItemSearched(MogoPoiItem item, int errorCode) {
}
});
inputtipsSearch.searchPOIAsyn();
}
@Override
public void onDestroy(@NonNull LifecycleOwner owner) {
super.onDestroy(owner);
if (mCompositeDisposable != null && !mCompositeDisposable.isDisposed()) {
mCompositeDisposable.dispose();
mCompositeDisposable = null;
}
//CameraChangedLiveData.getInstance().removeAllObserver();
}
}

View File

@@ -1,15 +1,22 @@
package com.mogo.module.navi.ui.search
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import com.mogo.map.marker.IMogoMarker
import com.mogo.map.marker.MogoMarkerOptions
import com.mogo.map.search.geo.MogoPoiItem
import com.mogo.map.search.inputtips.MogoTip
import com.mogo.module.common.MogoModulePaths
import com.mogo.module.navi.R
import com.mogo.module.navi.bean.SearchPoi
import com.mogo.module.navi.constants.SearchServiceHolder
import com.mogo.module.navi.ui.adapter.SearchCategoryAdapter
import com.mogo.module.navi.ui.base.BaseFragment
import com.mogo.module.navi.uitls.BitmapUtils
import kotlinx.android.synthetic.main.fragment_search_category.cv_search_result
import kotlinx.android.synthetic.main.fragment_search_category.rv_search_result
import kotlinx.android.synthetic.main.fragment_search_category.tv_navi_navi
@@ -20,18 +27,54 @@ import kotlinx.android.synthetic.main.include_search_bar.iv_navi_back
* @author zyz
* 2020-01-09.
*/
class CategorySearchFragment : BaseSearchFragment() {
class CategorySearchFragment : BaseFragment(), CategoryView {
private val TAG: String = "CategorySearchFragment"
private var addMarkers: List<IMogoMarker>? = null
override fun renderSearchPoiResult(datums: List<MogoPoiItem>?) {
mAdapter.setDatas(datums)
cv_search_result.visibility = View.VISIBLE
var arrayList = ArrayList<MogoMarkerOptions>()
for (index in 0 until datums!!.size) {
var decodeResource =
BitmapFactory.decodeResource(
resources,
if (mAdapter.current == index) R.mipmap.icon_search_category_checked else R.mipmap.icon_search_category_unchecked
)
var createWaterMask =
BitmapUtils.createWaterMask(
context, decodeResource, (index + 1).toString(), R.color.white, 18
)
val options = MogoMarkerOptions()
.icon(createWaterMask)
.latitude(datums[index].point?.lat ?: 0.0)
.owner("CategorySearchFragment")
.anchor(0.5f, 1f)
.longitude(datums[index].point?.lng ?: 0.0)
arrayList.add(options)
}
addMarkers = SearchServiceHolder.getMarkerManger()
.addMarkers(TAG, arrayList, true)
}
private lateinit var mAdapter: SearchCategoryAdapter
private var category:String?=null
private lateinit var mSearchPresenter: CategoryPresenter
private var category: String? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
category=arguments?.getString("category")
category = arguments?.getString("category")
SearchServiceHolder.statusManager.setSearchUIShow(
MogoModulePaths.PATH_FRAGMENT_SEARCH_CATEGORY, false
)
mSearchPresenter = CategoryPresenter(this)
lifecycle.addObserver(mSearchPresenter)
}
override fun getLayoutId(): Int {
return R.layout.fragment_search_category
}
@@ -57,33 +100,52 @@ class CategorySearchFragment : BaseSearchFragment() {
tv_navi_navi.setOnClickListener {
var newInstance = ChoosePathFragment.newInstance(mAdapter.currentItem)
var newInstance = ChoosePathFragment.newInstance(mAdapter.currentItem.point)
SearchServiceHolder.push(newInstance, MogoModulePaths.PATH_FRAGMENT_CHOOSE_PAHT)
}
mAdapter.setOnClickListener {
var position = it.getTag(R.id.tag_position) as Int
mAdapter.setCurrent(position)
updateMarker()
}
}
private fun updateMarker() {
addMarkers?.get(mAdapter.lastPosition)
?.setIcon(getMarkerIcon(mAdapter.lastPosition))
addMarkers?.get(mAdapter.current)
?.setIcon(getMarkerIcon(mAdapter.current))
}
private fun getMarkerIcon(index :Int): Bitmap {
var decodeResource =
BitmapFactory.decodeResource(
resources,
if (mAdapter.current == index) R.mipmap.icon_search_category_checked else R.mipmap.icon_search_category_unchecked
)
var createWaterMask =
BitmapUtils.createWaterMask(
context, decodeResource, (index+1).toString(), R.color.white, 18
)
return createWaterMask
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
mSearchPresenter.startSearchPoiByInput(category)
}
override fun renderSearchPoiResult(
datums: List<MogoTip>,
showDelete: Boolean
) {
mAdapter.setDatas(datums)
cv_search_result.visibility=View.VISIBLE
mSearchPresenter.startSearchLocalPoiByInput(category)
}
override fun showHistory(datums: List<SearchPoi>) {
override fun onDestroyView() {
super.onDestroyView()
mSearchPresenter.onDestroy(viewLifecycleOwner)
lifecycle.removeObserver(mSearchPresenter)
SearchServiceHolder.getMarkerManger()
.removeMarkers(TAG)
}
override fun onDestroy() {
@@ -93,12 +155,12 @@ class CategorySearchFragment : BaseSearchFragment() {
)
}
companion object{
fun newInstance( category:String):Fragment{
companion object {
fun newInstance(category: String): Fragment {
var bundle = Bundle()
bundle.putString("category",category)
bundle.putString("category", category)
var categorySerachFragment = CategorySearchFragment()
categorySerachFragment.arguments=bundle
categorySerachFragment.arguments = bundle
return categorySerachFragment
}
}

View File

@@ -0,0 +1,24 @@
package com.mogo.module.navi.ui.search;
import android.widget.EditText;
import com.mogo.commons.mvp.IView;
import com.mogo.map.search.geo.MogoPoiItem;
import com.mogo.map.search.inputtips.MogoTip;
import com.mogo.module.navi.bean.SearchPoi;
import java.util.List;
/**
* @author congtaowang
* @since 2019-10-02
* <p>
* 描述
*/
public interface CategoryView extends IView {
/**
* @param datums
*/
void renderSearchPoiResult(List<MogoPoiItem> datums);
}

View File

@@ -4,6 +4,7 @@ import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import com.mogo.map.MogoLatLng
import com.mogo.map.navi.IMogoNaviListener
import com.mogo.map.navi.MogoCalculatePath
import com.mogo.map.navi.MogoNaviInfo
@@ -57,10 +58,10 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener {
return R.layout.fragment_search_category
}
var mogoTip: MogoTip? = null
var mogoTip: MogoLatLng? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mogoTip = arguments?.getParcelable<MogoTip>(AMapConstants.KEY_PARCELABLE)
mogoTip = arguments?.getParcelable<MogoLatLng>(AMapConstants.KEY_PARCELABLE)
SearchServiceHolder.statusManager.setSearchUIShow(
MogoModulePaths.PATH_FRAGMENT_CHOOSE_PAHT, true
)
@@ -82,7 +83,7 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener {
et_navi_search.setText(getString(R.string.choose_path))
et_navi_search.isEnabled = false
SearchServiceHolder.getNavi()
.naviTo(mogoTip?.point)
.naviTo(mogoTip)
SearchServiceHolder.listenerCenter.registerMogoNaviListener(
MogoModulePaths.PATH_FRAGMENT_CHOOSE_PAHT, this
@@ -124,7 +125,7 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener {
}
companion object {
fun newInstance(searchPoi: MogoTip): Fragment {
fun newInstance(searchPoi: MogoLatLng): Fragment {
var bundle = Bundle()
bundle.putParcelable(AMapConstants.KEY_PARCELABLE, searchPoi)
var choosePathFragment = ChoosePathFragment()

View File

@@ -116,7 +116,7 @@ public class SearchFragment extends BaseSearchFragment implements SearchView, Vi
@Override public void onClick(View v) {
SearchPoi item = (SearchPoi) v.getTag(R.id.tag_item);
MogoTip mogoTip = EntityConvertUtils.poi2MogoTip(item);
SearchServiceHolder.INSTANCE.push(ChoosePathFragment.Companion.newInstance(mogoTip),
SearchServiceHolder.INSTANCE.push(ChoosePathFragment.Companion.newInstance(mogoTip.getPoint()),
MogoModulePaths.PATH_FRAGMENT_CHOOSE_PAHT);
}
});
@@ -126,7 +126,7 @@ public class SearchFragment extends BaseSearchFragment implements SearchView, Vi
MogoTip tag = (MogoTip) v.getTag(R.id.tag_position);
SearchPoi searchPoi = EntityConvertUtils.tipToPoi(tag);
mSearchPresenter.insert(searchPoi);
SearchServiceHolder.INSTANCE.push(ChoosePathFragment.Companion.newInstance(tag),
SearchServiceHolder.INSTANCE.push(ChoosePathFragment.Companion.newInstance(tag.getPoint()),
MogoModulePaths.PATH_FRAGMENT_CHOOSE_PAHT);
}
});

View File

@@ -8,14 +8,20 @@ import androidx.annotation.NonNull;
import androidx.lifecycle.LifecycleOwner;
import com.alibaba.android.arouter.launcher.ARouter;
import com.mogo.commons.mvp.Presenter;
import com.mogo.map.search.geo.MogoPoiItem;
import com.mogo.map.search.inputtips.IMogoInputtipsListener;
import com.mogo.map.search.inputtips.IMogoInputtipsSearch;
import com.mogo.map.search.inputtips.MogoTip;
import com.mogo.map.search.inputtips.query.MogoInputtipsQuery;
import com.mogo.map.search.poisearch.IMogoPoiSearch;
import com.mogo.map.search.poisearch.IMogoPoiSearchListener;
import com.mogo.map.search.poisearch.MogoPoiResult;
import com.mogo.map.search.poisearch.query.MogoPoiSearchQuery;
import com.mogo.module.common.TextWatcherAdapter;
import com.mogo.module.navi.bean.EntityConvertUtils;
import com.mogo.module.navi.bean.SearchPoi;
import com.mogo.module.navi.constants.DataConstants;
import com.mogo.module.navi.constants.SearchServiceHolder;
import com.mogo.module.navi.database.AppDataBase;
import com.mogo.service.MogoServicePaths;
import com.mogo.service.map.IMogoMapService;
@@ -105,9 +111,6 @@ public class SearchPresenter extends Presenter< SearchView >
inputtipsSearch.requestInputtipsAsyn();
}
/**
* 缓存搜索到的导航地址
*

View File

@@ -91,6 +91,10 @@ class SettingAddressFragment : BaseFragment(), IMogoGeoSearchListener {
SearchServiceHolder.getGeoSearcher()
.setGeoSearchListener(this)
SearchServiceHolder.statusManager.setSearchUIShow(
MogoModulePaths.PATH_FRAGMENT_SETTING_HOME, false)
}
override fun getLayoutId(): Int {
@@ -173,6 +177,10 @@ class SettingAddressFragment : BaseFragment(), IMogoGeoSearchListener {
MogoModulePaths.PATH_FRAGMENT_SETTING_HOME
)
addMarker?.destroy()
SearchServiceHolder.statusManager.setSearchUIShow(
MogoModulePaths.PATH_FRAGMENT_SETTING_HOME, true)
// moveMapToRight()
}

View File

@@ -0,0 +1,44 @@
package com.mogo.module.navi.uitls;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import androidx.core.content.ContextCompat;
/**
* @author zyz
* 2020-01-13.
*/
public class BitmapUtils {
public static Bitmap createWaterMask(Context context, Bitmap src, String text, int textColor, int textSize) {
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(ContextCompat.getColor(context, textColor));
paint.setTextSize(dp2px(context, textSize));
int width = src.getWidth();
int height = src.getHeight();
//创建一个bitmap
Rect bounds = new Rect();
paint.getTextBounds(text, 0, text.length(), bounds);
// 创建一个新的和SRC长度宽度一样的位图
Bitmap newb = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
//将该图片作为画布
Canvas canvas = new Canvas(newb);
//在画布 00坐标上开始绘制原始图片
canvas.drawBitmap(src, 0, 0, null);
// 绘制文字
canvas.drawText(text, (width-bounds.width())/2.0F, (float) ( bounds.height()*1.8), paint);
// 保存
canvas.save();
// 存储
canvas.restore();
return newb;
}
public static int dp2px(Context context, float dp) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dp * scale + 0.5f);
}
}