[恢复是否出车、添加登录监听]
This commit is contained in:
yangyakun
2024-04-18 19:04:33 +08:00
parent 40c078909a
commit 5a214a99d0
19 changed files with 158 additions and 50 deletions

View File

@@ -28,6 +28,7 @@ import com.mogo.och.bus.model.OrderModel;
import com.mogo.och.bus.util.BusTrajectoryManager;
import com.mogo.och.bus.util.BusVoiceManager;
import com.mogo.och.common.module.biz.login.ILoginCallback;
import com.mogo.och.common.module.biz.login.LoginStatusEnum;
import com.mogo.och.common.module.biz.login.LoginStatusManager;
import com.mogo.och.common.module.manager.autopilot.OCHAdasAbilityManager;
import com.mogo.och.common.module.manager.autopilot.autopilot.ArrivedStation;
@@ -61,6 +62,7 @@ public class BusPresenter extends Presenter<BusFragment>
OchAutoPilotStatusListenerManager.INSTANCE.addListener(TAG,this);
OrderModel.getInstance().init();
OCHAdasAbilityManager.getInstance().init(AbsMogoApplication.getApp());
LoginStatusManager.INSTANCE.addListener(TAG,this);
}
@Override
@@ -265,7 +267,7 @@ public class BusPresenter extends Presenter<BusFragment>
}
@Override
public void loginSuccess() {
public void onStatusChange(LoginStatusEnum currentStatus) {
CallerLogger.d(M_BUS + TAG, " loginStatus =" + LoginStatusManager.isLogin());
if(LoginStatusManager.isLogin()){
OrderModel.getInstance().startOrStopOrderLoop(true);

View File

@@ -16,8 +16,9 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.DateTimeUtils
import com.mogo.och.common.module.biz.login.ILoginCallback
import com.mogo.och.common.module.biz.login.LoginStatusEnum
import com.mogo.och.common.module.biz.login.LoginStatusManager
import com.mogo.och.common.module.manager.socket.cloud.OCHSocketMessageManager.OPERATION_ROAD_SIDE_TYPE
import com.mogo.och.common.module.biz.login.LoginStatusManager.isLogin
import com.mogo.och.common.module.manager.autopilot.OCHAdasAbilityManager
import com.mogo.och.common.module.manager.beautifymode.BeautifyManager
import com.mogo.och.common.module.manager.stopside.OCHPlanningActionsCallback
@@ -44,6 +45,7 @@ class DriverM1Presenter(view: DriverM1Fragment?) :
DriverM1Model.get().init(context)
OCHAdasAbilityManager.getInstance().init(AbsMogoApplication.getApp())
registerListener()
LoginStatusManager.addListener(TAG,this)
}
private fun registerListener() {
@@ -67,21 +69,18 @@ class DriverM1Presenter(view: DriverM1Fragment?) :
DriverM1Model.get().release()
}
override fun loginSuccess() {
d(SceneConstant.M_BUS + TAG, " loginStatus =" + isLogin())
if(isLogin()){
override fun onStatusChange(currentStatus: LoginStatusEnum?) {
d(SceneConstant.M_BUS + TAG, " loginStatus =" + LoginStatusManager.isLogin())
if(LoginStatusManager.isLogin()){
// 查询服务状态
DriverM1Model.get().queryCurrentServiceStatus()
DriverM1Model.get().startQueryCurrentOrder()
}else{
CharterTrajectoryManager.stopTrajReqLoop()
DriverM1Model.get().stopQueryCurrentOrder()
}
}
override fun loginFail() {
DriverM1Model.get().stopQueryCurrentOrder()
}
// 登出
fun logout() {
DriverM1Model.get().logout()

View File

@@ -19,6 +19,7 @@ import com.mogo.och.common.module.biz.login.LoginService
import com.mogo.och.common.module.biz.login.LoginStatusManager
import com.mogo.och.common.module.biz.login.RoleEnum
import com.mogo.och.common.module.biz.login.LoginStatusEnum
import com.mogo.och.common.module.biz.login.OpenOrderStatusEnum
import com.mogo.och.common.module.manager.socket.lan.bean.BusinessType
import com.mogo.och.common.module.manager.socket.lan.bean.EnvType
import com.mogo.och.common.module.manager.socket.lan.bean.ProjectType
@@ -37,6 +38,7 @@ class LoginProvider : LoginService {
private lateinit var loginFragment: Fragment
private var loginStatus: LoginStatusEnum = LoginStatusEnum.None
private var businessEnum: BusinessEnum = BusinessEnum.None
private var openOrderStatusEnum: OpenOrderStatusEnum = OpenOrderStatusEnum.None
private var loginInfo: LoginInfo? = null
override fun init(context: Context) {
@@ -175,5 +177,23 @@ class LoginProvider : LoginService {
return businessEnum
}
override fun setOpenOrderStatusType(type: Int) {
CallerLogger.d(tag, "setOpenOrderStatusType:${type}")
if (openOrderStatusEnum.code != type) {
this.openOrderStatusEnum = OpenOrderStatusEnum.valueOf(type)
LoginStatusManager.invokeLOpenOrderStatusChange(this.openOrderStatusEnum)
}
}
override fun getOpenOrderStatusType(): OpenOrderStatusEnum {
CallerLogger.d(tag, "getOpenOrderStatusType")
return openOrderStatusEnum
}
override fun isOpenOrderType(): Boolean {
CallerLogger.d(tag, "isOpenOrderType:${openOrderStatusEnum == OpenOrderStatusEnum.Ordering}")
return openOrderStatusEnum == OpenOrderStatusEnum.Ordering
}
}

View File

@@ -66,6 +66,7 @@ public abstract class LoginStatusModel {
return;
}
}
LoginStatusManager.setOpenOrderType(data.data.servingStatus);
LoginStatusManager.setLoginStatus(data.data.driverStatus);
LoginStatusManager.setLoginInfo(data.data);
CallerLogger.d(M_TAXI + TAG, "登录信息:" + data);

View File

@@ -58,7 +58,6 @@ object LoginLanDriverSocket : ILoginCallback {
// 司机端发送业务模式更改和环境校验
override fun onStatusChange(currentStatus: LoginStatusEnum?) {
super.onStatusChange(currentStatus)
when (currentStatus) {
LoginStatusEnum.Login -> {
FlavorUtils.getEnvCheck()

View File

@@ -1,13 +1,13 @@
package com.mogo.och.common.module.biz.login;
public interface ILoginCallback {
default void loginSuccess(){}
default void loginFail(){}
default void onStatusChange(LoginStatusEnum currentStatus){}
default void onBusinessChange(BusinessEnum businessEnum){}
default void onOpenOrderStatusEnumChange(OpenOrderStatusEnum businessEnum){}
default void onBusinessChangeDebug(BusinessEnum businessEnum){}
}

View File

@@ -2,6 +2,7 @@ package com.mogo.och.common.module.biz.login;
public class LoginInfo {
public int driverStatus; //1登录0登出
public int servingStatus;//1接单中0暂停接单
public int businessType; //9: taxi. 10: bus公交 11:接驳 13:包车
public String orderNo;
public int purpose; // 1 运营, 2 测试, 3演示
@@ -79,6 +80,7 @@ public class LoginInfo {
public String toString() {
return "LoginInfo{" +
"driverStatus=" + driverStatus +
", servingStatus=" + servingStatus +
", businessType=" + businessType +
", orderNo='" + orderNo + '\'' +
", purpose=" + purpose +

View File

@@ -36,4 +36,10 @@ interface LoginService :CommonService {
fun changeStatus(currentStatus: String)
fun setOpenOrderStatusType(type: Int)
fun getOpenOrderStatusType(): OpenOrderStatusEnum
fun isOpenOrderType(): Boolean
}

View File

@@ -65,6 +65,26 @@ object LoginStatusManager : CallerBase<ILoginCallback>() {
return BusinessEnum.None
}
@JvmStatic
fun setOpenOrderType(type: Int) {
loginService?.setOpenOrderStatusType(type)
}
@JvmStatic
fun getOpenOrderType():OpenOrderStatusEnum{
loginService?.let {
return it.getOpenOrderStatusType()
}
return OpenOrderStatusEnum.None
}
@JvmStatic
fun isOpenOrderType():Boolean{
loginService?.let {
return it.isOpenOrderType()
}
return false
}
@JvmStatic
fun setLoginStatus(loginStatus: LoginStatusEnum) {
loginService?.setLoginStatus(loginStatus)
@@ -106,6 +126,13 @@ object LoginStatusManager : CallerBase<ILoginCallback>() {
}
}
fun invokeLOpenOrderStatusChange(currentStatus: OpenOrderStatusEnum) {
M_LISTENERS.forEach {
val listener = it.value
listener.onOpenOrderStatusEnumChange(currentStatus)
}
}
@JvmStatic
fun checkBusiness(businessType: Int):Boolean {
loginService?.let {
@@ -132,5 +159,12 @@ object LoginStatusManager : CallerBase<ILoginCallback>() {
}
}
override fun doSomeAfterAddListener(tag: String, listener: ILoginCallback) {
super.doSomeAfterAddListener(tag, listener)
listener.onStatusChange(getLoginStatus())
listener.onBusinessChange(getBusInessType())
listener.onOpenOrderStatusEnumChange(getOpenOrderType())
}
}

View File

@@ -0,0 +1,27 @@
package com.mogo.och.common.module.biz.login
/**
* Created on 2022/08/19
*
*
* 0 初始状态,
* 10 接单状态 可接单,
* 20 暂停接到哪 不可接单,
*/
enum class OpenOrderStatusEnum(val code: Int) {
UnOrdering( 0 ),
Ordering( 1),
None( -1),;
companion object {
@JvmStatic
fun valueOf(code: Int): OpenOrderStatusEnum {
for (value in values()) {
if (value.code == code) {
return value
}
}
return None
}
}
}

View File

@@ -6,7 +6,9 @@ import androidx.fragment.app.FragmentActivity
import com.alibaba.android.arouter.facade.annotation.Route
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.och.common.module.biz.lansocket.LoginLanDriverSocket
import com.mogo.och.common.module.biz.login.LoginStatusEnum
import com.mogo.och.common.module.biz.login.LoginStatusManager
import com.mogo.och.facade.constant.FacadeConst
/**
@@ -30,6 +32,8 @@ class FacadeDriverProvider : FacadeProvider() {
sweeperFacadeProvider.init(context)
}else {
super.init(context)
LoginStatusManager.queryLoginStatusByNet()
LoginLanDriverSocket.load()
}
}

View File

@@ -1,6 +1,8 @@
package com.mogo.och.facade.route
import android.content.Context
import com.alibaba.android.arouter.facade.annotation.Route
import com.mogo.och.common.module.biz.lansocket.LoginLanPassengerSocket
import com.mogo.och.facade.constant.FacadeConst
/**
@@ -15,5 +17,10 @@ class FacadePassengerProvider : FacadeProvider() {
override val functionName: String
get() = TAG
override fun init(context: Context) {
super.init(context)
LoginLanPassengerSocket.load()
}
}

View File

@@ -42,13 +42,6 @@ abstract class FacadeProvider : IMoGoFunctionProvider, ILoginCallback {
override fun init(context: Context) {
d(TAG, "FacadeProvider:init")
LoginStatusManager.addListener(TAG, this)
if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){
LoginStatusManager.queryLoginStatusByNet()
LoginLanDriverSocket.load()
}else{
LoginLanPassengerSocket.load()
}
}
override fun createCoverage(fragmentActivity: FragmentActivity?, integer: Int?): Fragment? {
@@ -149,7 +142,7 @@ abstract class FacadeProvider : IMoGoFunctionProvider, ILoginCallback {
override fun onBusinessChange(businessEnum: BusinessEnum) {
super.onBusinessChange(businessEnum)
val (bussness, identity, model) =AppIdentityModeUtils.getInfo(FunctionBuildConfig.appIdentityMode)
val (_, identity, model) =AppIdentityModeUtils.getInfo(FunctionBuildConfig.appIdentityMode)
when (businessEnum) {
BusinessEnum.None -> {}
BusinessEnum.Taxi -> FunctionBuildConfig.appIdentityMode = "${AppIdentityModeUtils.TAXI}_${identity}_${model}"

View File

@@ -16,6 +16,7 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
import com.mogo.och.common.module.biz.login.LoginStatusEnum;
import com.mogo.och.common.module.manager.autopilot.autopilot.ArrivedStation;
import com.mogo.och.common.module.manager.autopilot.autopilot.IOchAutopilotStatusListener;
import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutoPilotStatusListenerManager;
@@ -61,6 +62,7 @@ public class BusPresenter extends Presenter<ShuttleFragment>
OchAutoPilotStatusListenerManager.INSTANCE.addListener(TAG,this);
OrderModel.getInstance().init();
OCHAdasAbilityManager.getInstance().init(AbsMogoApplication.getApp());
LoginStatusManager.INSTANCE.addListener(TAG,this);
}
@Override
@@ -257,7 +259,8 @@ public class BusPresenter extends Presenter<ShuttleFragment>
}
@Override
public void loginSuccess() {
public void onStatusChange(LoginStatusEnum currentStatus) {
ILoginCallback.super.onStatusChange(currentStatus);
CallerLogger.d(M_BUS + TAG, " loginStatus =" + LoginStatusManager.isLogin());
if(LoginStatusManager.isLogin()){
// OrderModel.getInstance().queryBusRoutes();

View File

@@ -286,7 +286,7 @@ public class TaxiModel {
LoginStatusManager.queryLoginStatusByNet();
return;
}
boolean currentOrderStatus = LoginStatusManager.isLogin();
boolean currentOrderStatus = LoginStatusManager.isOpenOrderType();
TaxiServiceManager.changeOrderServing(mContext, currentOrderStatus,
new OchCommonServiceCallback<BaseData>() {
@@ -1058,7 +1058,7 @@ public class TaxiModel {
CallerLogger.d(M_TAXI + TAG, "onIntentReceived = %s", intentStr);
if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intentStr)) {
if (NetworkUtils.isConnected(mContext)) {
startOrStopOrderLoop(LoginStatusManager.isLogin());
startOrStopOrderLoop(LoginStatusManager.isLogin() && LoginStatusManager.isOpenOrderType());
LoginStatusManager.queryLoginStatusByNet();
}
}

View File

@@ -17,7 +17,9 @@ import com.mogo.eagle.core.function.call.order.CallerOrderListenerManager;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
import com.mogo.och.common.module.biz.login.ILoginCallback;
import com.mogo.och.common.module.biz.login.LoginStatusEnum;
import com.mogo.och.common.module.biz.login.LoginStatusManager;
import com.mogo.och.common.module.biz.login.OpenOrderStatusEnum;
import com.mogo.och.common.module.manager.autopilot.OCHAdasAbilityManager;
import com.mogo.och.common.module.voice.VoiceNotice;
import com.mogo.och.taxi.bean.OrderQueryRespBean;
@@ -50,19 +52,22 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
super(view);
TaxiModel.getInstance().init(AbsMogoApplication.getApp());
OCHAdasAbilityManager.getInstance().init(AbsMogoApplication.getApp());
LoginStatusManager.INSTANCE.addListener(TAG,this);
onStatusChange(LoginStatusManager.getLoginStatus());
onOpenOrderStatusEnumChange(LoginStatusManager.getOpenOrderType());
initListeners();
}
@Override
public void onCreate(@NonNull LifecycleOwner owner) {
super.onCreate(owner);
CallerLogger.d(M_TAXI + TAG, "网约车-出租车拿到订单");
CallerLogger.d(M_TAXI + TAG, "网约车-onCreate");
}
@Override
public void onDestroy(@NonNull LifecycleOwner owner) {
super.onDestroy(owner);
CallerLogger.d(M_TAXI + TAG, "网约车-onDestroy");
releaseListeners();
TaxiModel.getInstance().release();
}
@@ -333,10 +338,9 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
}
@Override
public void loginSuccess() {
public void onStatusChange(LoginStatusEnum currentStatus) {
//设置 是否启动订单轮训
TaxiModel.getInstance().startOrStopOrderLoop(LoginStatusManager.isLogin());
TaxiModel.getInstance().startOrStopOrderLoop(LoginStatusManager.isLogin()&&LoginStatusManager.isOpenOrderType());
// 设置当前用户角色
String role = "";
if (TaxiDriverRoleEnum.DEMO.getCode() == LoginStatusManager.getPurpose().getCode()) {
@@ -346,8 +350,14 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
}
String finalRole = role;
runOnUIThread(() -> {
mView.updateOperationStatus(LoginStatusManager.isLogin(), finalRole);
mView.setRole(finalRole);
});
}
@Override
public void onOpenOrderStatusEnumChange(OpenOrderStatusEnum businessEnum) {
runOnUIThread(() -> {
mView.updateOperationStatus(LoginStatusManager.getOpenOrderType());
});
}
}

View File

@@ -17,6 +17,8 @@ import androidx.fragment.app.FragmentTransaction;
import com.mogo.eagle.core.data.temp.EventLogout;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.och.common.module.biz.login.LoginStatusManager;
import com.mogo.och.common.module.biz.login.OpenOrderStatusEnum;
import com.mogo.och.taxi.R;
import com.mogo.och.taxi.constant.TaxiOrderStatusEnum;
import com.mogo.och.taxi.bean.OrderQueryRespBean;
@@ -145,7 +147,6 @@ public class TaxiFragment extends BaseTaxiTabFragment<TaxiFragment, TaxiPresente
@Override
protected void onChangeOperationStatus() {
super.onChangeOperationStatus();
mPresenter.updateCarStatus();
}
@@ -158,27 +159,27 @@ public class TaxiFragment extends BaseTaxiTabFragment<TaxiFragment, TaxiPresente
/**
* 状态变更
* @param inOperation true 可以接单 false 暂停接单
* @param role 测试车辆:测试 演示车辆V 运营车辆: ""空
*/
public void updateOperationStatus(boolean inOperation,String role) {
public void updateOperationStatus(OpenOrderStatusEnum inOperation) {
CallerLogger.e(M_TAXI + TAG, "onOperationChanged:" + inOperation);
if (inOperation) {
if (!TextUtils.isEmpty(role)){
mDriverRole.setVisibility(View.VISIBLE);
mDriverRole.setText(role);
}else {
mDriverRole.setVisibility(View.GONE);
}
if (LoginStatusManager.isOpenOrderType()) {
tvOperationStatus.setText("暂停接单");
tvOperationStatus.setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(R.drawable.shape_size_operation_back), null, null, null);
showPanel();
} else {
mDriverRole.setVisibility(View.GONE);
tvOperationStatus.setText("接单");
tvOperationStatus.setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(R.drawable.shape_size_operation_out), null, null, null);
hidPanel();
}
}
public void setRole(String role){
if (!TextUtils.isEmpty(role)){
mDriverRole.setVisibility(View.VISIBLE);
mDriverRole.setText(role);
}else {
mDriverRole.setVisibility(View.GONE);
}
}
public void updateAutopilotStatus(int status) {
onAutopilotStatusChanged(status);

View File

@@ -13,6 +13,7 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
import com.mogo.och.common.module.biz.login.ILoginCallback;
import com.mogo.och.common.module.biz.login.LoginStatusEnum;
import com.mogo.och.common.module.biz.login.LoginStatusManager;
import com.mogo.och.common.module.manager.autopilot.OCHAdasAbilityManager;
import com.mogo.och.taxi.callback.ITaxiADASStatusCallback;
@@ -38,6 +39,7 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
super(view);
TaxiTaskModel.INSTANCE.init();
OCHAdasAbilityManager.getInstance().init(AbsMogoApplication.getApp());
onStatusChange(LoginStatusManager.getLoginStatus());
initListeners();
}
@@ -197,10 +199,8 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
});
}
@Override
public void loginSuccess() {
public void onStatusChange(LoginStatusEnum currentStatus) {
// 设置当前用户角色
String role = "";
if (RoleEnum.DEMO == LoginStatusManager.getPurpose()) {
@@ -210,7 +210,7 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
}
String finalRole = role;
runOnUIThread(() -> {
mView.updateOperationStatus(LoginStatusManager.isLogin(), finalRole);
mView.updateOperationStatus(LoginStatusManager.isOpenOrderType(), finalRole);
});
if (!TaxiTaskModel.INSTANCE.checkCurrentTaskCondition()) {

View File

@@ -990,7 +990,7 @@ object TaxiTaskModel {
d(
TAG,
"prepareNextTask onSuccess:${GsonUtil.jsonFromObject(data)}, " +
"isCarServingStatus = ${LoginStatusManager.isLogin()}"
"isCarServingStatus = ${LoginStatusManager.isOpenOrderType()}"
)
DebugView.printInfoMsg("[PrepareNextTask] 请求success")
isPrepareingNextTask = false
@@ -1000,7 +1000,7 @@ object TaxiTaskModel {
DebugView.printErrorMsg("[PrepareNextTask] 请求fail, code=$code ,msg=$msg")
d(TAG, "prepareNextTask onFail: code=$code ,msg=$msg")
isPrepareingNextTask = false
if (LoginStatusManager.isLogin()
if (LoginStatusManager.isLogin() && LoginStatusManager.isOpenOrderType()
&& QueryCurrentTaskRespBean.isTaskCompleteTaskType(mCurrentTaskWithOrder)) {
mCurrentTaskWithOrder?.endSite?.siteId?.also {
startPrepareTaskDelay(TaxiUnmannedConst.START_PREPARE_TASK_RETRY_INTERVAL,it)
@@ -1014,7 +1014,7 @@ object TaxiTaskModel {
"net = ${NetworkUtils.isConnected(mContext)}")
d(TAG, "prepareNextTask onError, , net = ${NetworkUtils.isConnected(mContext)}")
isPrepareingNextTask = false
if (LoginStatusManager.isLogin()
if (LoginStatusManager.isLogin() && LoginStatusManager.isOpenOrderType()
&& QueryCurrentTaskRespBean.isTaskCompleteTaskType(mCurrentTaskWithOrder)) {
mCurrentTaskWithOrder?.endSite?.siteId?.also {
startPrepareTaskDelay(TaxiUnmannedConst.START_PREPARE_TASK_RETRY_INTERVAL,it)
@@ -1103,7 +1103,7 @@ object TaxiTaskModel {
LoginStatusManager.queryLoginStatusByNet()
return
}
if (LoginStatusManager.isLogin()) {//接单状态下,去结束
if (LoginStatusManager.isOpenOrderType()) {//接单状态下,去结束
DebugView.printInfoMsg("[暂停接单] 准备发送请求")
TaxiTaskWithOrderServiceManager.endService(
mContext,
@@ -1533,7 +1533,7 @@ object TaxiTaskModel {
}
fun updatePrepareTaskDelayUI() {
if (!LoginStatusManager.isLogin()){
if (!LoginStatusManager.isOpenOrderType()){
mTaxiTaskWithOrderCallbackMap.forEach {
val listener = it.value
listener.onStartPrepareTaskUI(0, false)