From f6dc3a117d0da896ae59dcc6a3da6e76a9f8661f Mon Sep 17 00:00:00 2001 From: tongchenfei Date: Fri, 15 Jan 2021 10:35:26 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E5=A2=9E=E5=8A=A0TopView=E7=B2=98=E6=80=A7?= =?UTF-8?q?=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../extensions/utils/TopViewAnimHelper.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/TopViewAnimHelper.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/TopViewAnimHelper.java index de88f7ac66..4254a93618 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/TopViewAnimHelper.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/TopViewAnimHelper.java @@ -83,6 +83,9 @@ public class TopViewAnimHelper { cameraMode = rootView.findViewById(R.id.module_ext_id_north); // 初始化默认隐藏导航 hideNaviView(); + + showStickView(); + } private volatile boolean isTopViewOut = true; @@ -185,10 +188,32 @@ public class TopViewAnimHelper { }).start(); } + private final List stickViewCache = new ArrayList<>(); + + private void showStickView() { + if (stickViewCache.isEmpty()) { + return; + } else if (stickViewCache.size() == 1) { + MotionViewCache stickView = stickViewCache.remove(0); + startTopInAnim(stickView.view, stickView.params, stickView.statusListener); + return; + } + for (int i = 0; i < stickViewCache.size() - 2; i++) { + MotionViewCache stickView = stickViewCache.get(i); + stickView.statusListener.beforeViewRemoveAnim(stickView.view); + stickView.statusListener.onViewRemoved(stickView.view); + } + MotionViewCache stickView = stickViewCache.get(stickViewCache.size() - 1); + stickViewCache.clear(); + startTopInAnim(stickView.view, stickView.params, stickView.statusListener); + } + public void startTopInAnim(View view, ViewGroup.LayoutParams params, IMogoTopViewStatusListener statusListener) { if (topMotionLayout == null) { + // 增加黏性事件 + stickViewCache.add(new MotionViewCache(view, params, statusListener)); return; } From 10200c3df647a55e2d33c4e8dd0c81f805b33588 Mon Sep 17 00:00:00 2001 From: tongchenfei Date: Fri, 15 Jan 2021 20:28:24 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BD=91=E7=BA=A6?= =?UTF-8?q?=E8=BD=A6=E5=B0=8F=E5=B7=B4=E5=88=9D=E6=AD=A5=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/gradle.xml | 6 + OCH/mogo-och-bus/build.gradle | 6 + .../java/com/mogo/och/bus/OchBusProvider.java | 92 ++++++++++++ .../och/bus/bean/OchBusRoutesRequest.java | 32 +++++ .../och/bus/bean/OchBusRoutesResponse.java | 22 +++ .../mogo/och/bus/bean/OchBusRoutesResult.java | 27 ++++ .../com/mogo/och/bus/bean/OchBusStation.java | 135 ++++++++++++++++++ .../mogo/och/bus/fragment/OchBusFragment.java | 91 ++++++++++++ .../mogo/och/bus/net/IOchBusApiService.java | 29 ++++ .../och/bus/presenter/OchBusPresenter.java | 76 ++++++++++ .../src/main/res/layout/fragment_och_bus.xml | 30 ++++ .../com/mogo/httpdns/mogo/MogoHttpDns.java | 2 +- .../module/common/constants/HostConst.java | 1 + .../extensions/utils/TopViewAnimHelper.java | 2 + .../extensions/utils/TopViewManager.java | 10 ++ .../res/layout/module_ext_layout_entrance.xml | 2 +- .../windowview/IMogoTopViewManager.java | 5 + 17 files changed, 566 insertions(+), 2 deletions(-) create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/OchBusProvider.java create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesRequest.java create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesResponse.java create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesResult.java create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusStation.java create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/OchBusFragment.java create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IOchBusApiService.java create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusPresenter.java create mode 100644 OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 5974cf305a..740794bd48 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -12,6 +12,11 @@ diff --git a/OCH/mogo-och-bus/build.gradle b/OCH/mogo-och-bus/build.gradle index 05bf3ff391..2e4e685dd9 100644 --- a/OCH/mogo-och-bus/build.gradle +++ b/OCH/mogo-och-bus/build.gradle @@ -39,15 +39,21 @@ dependencies { implementation rootProject.ext.dependencies.androidxappcompat implementation rootProject.ext.dependencies.arouter annotationProcessor rootProject.ext.dependencies.aroutercompiler + implementation rootProject.ext.dependencies.androidxconstraintlayout + + implementation rootProject.ext.dependencies.rxjava + implementation rootProject.ext.dependencies.rxandroid if (Boolean.valueOf(RELEASE)) { implementation rootProject.ext.dependencies.mogooch implementation rootProject.ext.dependencies.mogoutils implementation rootProject.ext.dependencies.mogocommons + implementation rootProject.ext.dependencies.modulecommon } else { implementation project(":OCH:mogo-och") implementation project(":foudations:mogo-utils") implementation project(":foudations:mogo-commons") + implementation project(":modules:mogo-module-common") } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/OchBusProvider.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/OchBusProvider.java new file mode 100644 index 0000000000..01f4ec1b2e --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/OchBusProvider.java @@ -0,0 +1,92 @@ +package com.mogo.och.bus; + +import android.content.Context; + +import androidx.fragment.app.FragmentActivity; + +import com.alibaba.android.arouter.facade.annotation.Route; +import com.mogo.module.common.MogoApisHandler; +import com.mogo.och.IMogoOCH; +import com.mogo.och.OCHConstants; +import com.mogo.och.bus.bean.OchBusStation; +import com.mogo.och.bus.fragment.OchBusFragment; +import com.mogo.service.connection.IMogoOnMessageListener; +import com.mogo.service.statusmanager.IMogoStatusChangedListener; +import com.mogo.service.statusmanager.StatusDescriptor; +import com.mogo.utils.logger.Logger; + +import java.util.List; + +/** + * 网约车小巴业务实现入口 + * + * @author tongchenfei + */ +@Route(path = OCHConstants.PATH) +public class OchBusProvider implements IMogoOCH { + private static final String TAG = "OchBusProvider"; + private OchBusFragment busFragment; + private int containerId; + private FragmentActivity activity; + + @Override + public void init(FragmentActivity activity, int containerId) { + this.containerId = containerId; + this.activity = activity; + } + + @Override + public void init(Context context) { + MogoApisHandler.getInstance().getApis().getStatusManagerApi().registerStatusChangedListener("OchBus", StatusDescriptor.VR_MODE, statusChangedListener); + MogoApisHandler.getInstance().getApis().getStatusManagerApi().registerStatusChangedListener("OchBus", StatusDescriptor.TOP_VIEW, statusChangedListener); + MogoApisHandler.getInstance().getApis().getSocketManagerApi(context).registerOnMessageListener(401017,messageListener); + } + + private void showFragment() { + if (busFragment == null) { + Logger.d(TAG,"准备add fragment======"); + busFragment = new OchBusFragment(); + activity.getSupportFragmentManager().beginTransaction().add(containerId, busFragment).commit(); + return; + } + Logger.d(TAG,"准备show fragment"); + activity.getSupportFragmentManager().beginTransaction().show(busFragment).commit(); + } + + private void hideFragment() { + if (busFragment != null) { + Logger.d(TAG,"准备hide fragment"); + activity.getSupportFragmentManager().beginTransaction().hide(busFragment).commit(); + } + + } + + private final IMogoStatusChangedListener statusChangedListener = (descriptor, isTrue) -> { + if (descriptor == StatusDescriptor.VR_MODE) { + // 进入vr模式默认显示网约车小巴fragment + if (isTrue) { + showFragment(); + } else { + hideFragment(); + } + } else if (MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode() && descriptor == StatusDescriptor.TOP_VIEW) { + // topView进行展示时推出网约车界面,但是不隐藏整个fragment + if (busFragment != null && isTrue) { + busFragment.hideOchBus(); + } + } + }; + + private final IMogoOnMessageListener> messageListener = new IMogoOnMessageListener>() { + @Override + public Class> target() { + return null; + } + + @Override + public void onMsgReceived(List obj) { + // todo 刷新界面 + } + }; + +} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesRequest.java new file mode 100644 index 0000000000..3b80f70dc2 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesRequest.java @@ -0,0 +1,32 @@ +package com.mogo.och.bus.bean; + +/** + * 网约车小巴路线请求参数封装 + * + * @author tongchenfei + */ +public class OchBusRoutesRequest { + double lat; + double lon; + + public OchBusRoutesRequest(double lat, double lon) { + this.lat = lat; + this.lon = lon; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } +} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesResponse.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesResponse.java new file mode 100644 index 0000000000..ac56cf1ef4 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesResponse.java @@ -0,0 +1,22 @@ +package com.mogo.och.bus.bean; + +import com.mogo.commons.data.BaseData; + +/** + * 网约车小巴路线接口请求响应结果 + * + * @author tongchenfei + */ +public class OchBusRoutesResponse extends BaseData { + private OchBusRoutesResult result; + + public OchBusRoutesResult getResult() { + return result; + } + + public void setResult(OchBusRoutesResult result) { + this.result = result; + } + + +} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesResult.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesResult.java new file mode 100644 index 0000000000..6a77b51f22 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesResult.java @@ -0,0 +1,27 @@ +package com.mogo.och.bus.bean; + +import java.util.List; + +/** + * 网约车小巴路线接口返回接口数据封装 + * + * @author tongchenfei + */ +public class OchBusRoutesResult { + private List siteData; + + public List getSiteData() { + return siteData; + } + + public void setSiteData(List siteData) { + this.siteData = siteData; + } + + @Override + public String toString() { + return "OchBusRoutesResult{" + + "siteData=" + siteData + + '}'; + } +} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusStation.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusStation.java new file mode 100644 index 0000000000..67c1d506ac --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusStation.java @@ -0,0 +1,135 @@ +package com.mogo.och.bus.bean; + +/** + * 单个网约车小巴车站信息 + * + * @author tongchenfei + */ +public class OchBusStation { + private double distance; + private String _id; + private int lineId; + private int siteId; + private String siteName; + private String cityCode; + private String areaCode; + private String areaName; + private double lat; + private double lon; + private String siteDesc; + private int siteState; + + public double getDistance() { + return distance; + } + + public void setDistance(double distance) { + this.distance = distance; + } + + public String get_id() { + return _id; + } + + public void set_id(String _id) { + this._id = _id; + } + + public int getLineId() { + return lineId; + } + + public void setLineId(int lineId) { + this.lineId = lineId; + } + + public int getSiteId() { + return siteId; + } + + public void setSiteId(int siteId) { + this.siteId = siteId; + } + + public String getSiteName() { + return siteName; + } + + public void setSiteName(String siteName) { + this.siteName = siteName; + } + + public String getCityCode() { + return cityCode; + } + + public void setCityCode(String cityCode) { + this.cityCode = cityCode; + } + + public String getAreaCode() { + return areaCode; + } + + public void setAreaCode(String areaCode) { + this.areaCode = areaCode; + } + + public String getAreaName() { + return areaName; + } + + public void setAreaName(String areaName) { + this.areaName = areaName; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public String getSiteDesc() { + return siteDesc; + } + + public void setSiteDesc(String siteDesc) { + this.siteDesc = siteDesc; + } + + public int getSiteState() { + return siteState; + } + + public void setSiteState(int siteState) { + this.siteState = siteState; + } + + @Override + public String toString() { + return "OchBusStation{" + + "distance=" + distance + + ", _id='" + _id + '\'' + + ", lineId=" + lineId + + ", siteId=" + siteId + + ", siteName='" + siteName + '\'' + + ", cityCode='" + cityCode + '\'' + + ", areaCode='" + areaCode + '\'' + + ", areaName='" + areaName + '\'' + + ", lat=" + lat + + ", lon=" + lon + + ", siteDesc='" + siteDesc + '\'' + + ", siteState=" + siteState + + '}'; + } +} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/OchBusFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/OchBusFragment.java new file mode 100644 index 0000000000..da5e7b9da5 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/OchBusFragment.java @@ -0,0 +1,91 @@ +package com.mogo.och.bus.fragment; + +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.Group; + +import com.mogo.commons.mvp.MvpFragment; +import com.mogo.module.common.MogoApisHandler; +import com.mogo.module.common.view.OnPreventFastClickListener; +import com.mogo.och.bus.bean.OchBusStation; +import com.mogo.och.bus.presenter.OchBusPresenter; +import com.mogo.och.bus.R; +import com.mogo.utils.logger.Logger; + +import java.util.List; + + +/** + * 网约车小巴界面 + * + * @author tongchenfei + */ +public class OchBusFragment extends MvpFragment { + private static final String TAG = "OchBusFragment"; + private Group groupOchBus; + private List stationList; + + @Override + protected int getLayoutId() { + return R.layout.fragment_och_bus; + } + + @Override + protected void initViews() { + groupOchBus = findViewById(R.id.groupOchBus); + findViewById(R.id.btnEnterOchBus).setOnClickListener(new OnPreventFastClickListener() { + @Override + public void onClickImpl(View v) { + showOchBus(); + } + }); + } + + @NonNull + @Override + protected OchBusPresenter createPresenter() { + return new OchBusPresenter(this); + } + + public void showOchBus() { + MogoApisHandler.getInstance().getApis().getTopViewManager().removeAllViewInVrMode(); + groupOchBus.setVisibility(View.VISIBLE); + + } + + @Override + public void onResume() { + super.onResume(); + queryStationListIfNecessary(); + } + + @Override + public void onHiddenChanged(boolean hidden) { + super.onHiddenChanged(hidden); + Logger.d(TAG, "onHiddenChanged: " + hidden); + if (!hidden) { + // 判断是否需要请求接口 + queryStationListIfNecessary(); + } + } + + public void refreshBusStations(List busStationList) { + if (busStationList == null) { + // todo 获取小巴数据失败 + }else{ + // todo 渲染小巴路线数据 + } + + } + + public void hideOchBus() { + groupOchBus.setVisibility(View.GONE); + } + + private void queryStationListIfNecessary(){ + if (stationList == null || stationList.isEmpty()) { + mPresenter.queryBusRoutes(); + } + } +} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IOchBusApiService.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IOchBusApiService.java new file mode 100644 index 0000000000..095d771541 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IOchBusApiService.java @@ -0,0 +1,29 @@ +package com.mogo.och.bus.net; + +import com.mogo.och.bus.bean.OchBusRoutesResponse; + +import io.reactivex.Observable; +import okhttp3.RequestBody; +import retrofit2.http.Body; +import retrofit2.http.Headers; +import retrofit2.http.POST; + +/** + * 小巴车相关接口 + * + * @author tongchenfei + */ +public interface IOchBusApiService { + + /** + * 根据车机坐标获取所在区域全部站点信息 + *

+ * wiki: http://wiki.zhidaohulian.com/pages/viewpage.action?pageId=48970072 + * + * @param requestBody 请求参数 + * @return 接口返回数据 + */ + @Headers({"Content-Type:application/json;charset=UTF-8"}) + @POST("/yycp-onlinecar-hailing/onlineCarHailing/site/querySiteByCoordinate/v1") + Observable querySiteByCoordinate(@Body RequestBody requestBody); +} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusPresenter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusPresenter.java new file mode 100644 index 0000000000..4bdc3d6838 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusPresenter.java @@ -0,0 +1,76 @@ +package com.mogo.och.bus.presenter; + +import com.mogo.commons.mvp.Presenter; +import com.mogo.commons.network.SubscribeImpl; +import com.mogo.map.location.MogoLocation; +import com.mogo.module.common.MogoApisHandler; +import com.mogo.module.common.constants.HostConst; +import com.mogo.och.bus.bean.OchBusRoutesRequest; +import com.mogo.och.bus.bean.OchBusRoutesResponse; +import com.mogo.och.bus.fragment.OchBusFragment; +import com.mogo.och.bus.net.IOchBusApiService; +import com.mogo.utils.logger.Logger; +import com.mogo.utils.network.RequestOptions; +import com.mogo.utils.network.utils.GsonUtil; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; +import okhttp3.MediaType; +import okhttp3.RequestBody; + +/** + * 网约车小巴 + * + * @author tongchenfei + */ +public class OchBusPresenter extends Presenter { + private static final String TAG = "OchBusPresenter"; + public OchBusPresenter(OchBusFragment view) { + super(view); + } + + public void queryBusRoutes() { + double lat = 0; + double lon = 0; + MogoLocation lastLocation = MogoApisHandler.getInstance().getApis().getMapServiceApi().getSingletonLocationClient(getContext()).getLastKnowLocation(); + if (lastLocation != null) { + lat = lastLocation.getLatitude(); + lon = lastLocation.getLongitude(); + } + OchBusRoutesRequest request = new OchBusRoutesRequest(lat,lon); + RequestBody requestBody = RequestBody.create(MediaType.get("application/json"), GsonUtil.jsonFromObject(request)); + MogoApisHandler.getInstance().getApis().getNetworkApi() + .create(IOchBusApiService.class, HostConst.HAILING_HOST) + .querySiteByCoordinate(requestBody) + .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) + .subscribe(new SubscribeImpl(RequestOptions.create(getContext())) { + + @Override + public void onSuccess(OchBusRoutesResponse o) { + super.onSuccess(o); + Logger.d(TAG, "获取到小巴路线数据: " + o); + if (mView != null) { + mView.refreshBusStations(o.getResult().getSiteData()); + } + } + + @Override + public void onError(Throwable e) { + super.onError(e); + Logger.e(TAG,e,"获取小巴路线图失败"); + if (mView != null) { + mView.refreshBusStations(null); + } + } + + @Override + public void onError(String message, int code) { + super.onError(message, code); + Logger.e(TAG, "获取小巴路线失败 code: " + code + " msg: " + message); + if (mView != null) { + mView.refreshBusStations(null); + } + } + }); + } +} diff --git a/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml b/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml new file mode 100644 index 0000000000..d51a3e453d --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml @@ -0,0 +1,30 @@ + + + +