From 8755b95e5b48788af85d2e7be430be7375198812 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Wed, 22 Apr 2026 19:19:53 +0800 Subject: [PATCH] =?UTF-8?q?[8.5.0]=20[f2a=20=E7=99=BB=E5=BD=95]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mogo/och/biz/login/LoginServiceManager.kt | 8 +- .../biz/login/bean/f2a/LoginF2aReqBean.java | 33 +++ .../och/biz/login/bean/f2a/LoginReqBean.java | 18 ++ .../och/biz/login/bean/f2a/LoginRespBean.java | 24 +++ .../biz/login/bean/f2a/RestPwdReqBean.java | 18 ++ .../biz/login/bean/f2a/RestPwdRespBean.java | 23 +++ .../login/callback/ITaxiLoginCallback.java | 10 +- .../och/biz/login/model/CommonLoginModel.kt | 181 +++++++++++++++++ .../mogo/och/biz/login/model/F2aLoginModel.kt | 166 ++++++++++++++++ .../mogo/och/biz/login/model/LoginModel.kt | 160 +-------------- .../och/biz/login/model/SwitchLoginModel.kt | 28 +++ .../biz/login/net/OchCommonServiceManager.kt | 73 ++++++- .../login/net/OchLoginServiceSaasEhApi.java | 45 +++++ .../presenter/LoginPassengerPresenter.kt | 5 +- .../och/biz/login/presenter/LoginPresenter.kt | 40 +--- .../mogo/och/biz/login/ui/LoginFragment.kt | 33 --- .../mogo/och/biz/login/ui/login/LoginView.kt | 35 +++- .../och/biz/login/ui/login/LoginViewModel.kt | 13 +- .../och/biz/login/ui/loginf2a/LoginF2aView.kt | 144 +++++++++++--- .../login/ui/loginf2a/LoginF2aViewModel.kt | 188 +++++++++++------- .../login/ui/loginswitch/LoginSwitchView.kt | 115 +++++++++++ .../src/main/res/layout/biz_login_view.xml | 2 +- .../main/res/layout/biz_login_view_f2a.xml | 45 +++-- .../biz/src/main/res/values-en/strings.xml | 8 +- .../biz/src/main/res/values/strings.xml | 6 + .../och/common/module/manager/EnvManager.kt | 4 + .../module/manager/transform/OchTransform.kt | 6 + .../manager/transform/OchTransformDispatch.kt | 1 + .../unmanned/taxi/ui/base/TaxiPresenter.java | 5 + app/script/projectFlavors/project.gradle | 5 + .../mogo/launcher/startup/ConfigStartUp.kt | 1 + .../hmi/ui/setting/DebugSettingView.kt | 38 ++++ .../main/res/layout/view_debug_setting.xml | 12 ++ .../core/data/config/FunctionBuildConfig.kt | 5 + .../core/data/deva/bizconfig/FuncBizConfig.kt | 1 + .../api/och/IOchBizFunctionCall4Eagle.kt | 2 + .../api/setting/ISopSettingListener.kt | 6 + .../CallerOchBizFunctionCall4EagleManager.kt | 11 + 38 files changed, 1149 insertions(+), 369 deletions(-) create mode 100644 OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/f2a/LoginF2aReqBean.java create mode 100644 OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/f2a/LoginReqBean.java create mode 100644 OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/f2a/LoginRespBean.java create mode 100644 OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/f2a/RestPwdReqBean.java create mode 100644 OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/f2a/RestPwdRespBean.java create mode 100644 OCH/common/biz/src/main/java/com/mogo/och/biz/login/model/CommonLoginModel.kt create mode 100644 OCH/common/biz/src/main/java/com/mogo/och/biz/login/model/F2aLoginModel.kt create mode 100644 OCH/common/biz/src/main/java/com/mogo/och/biz/login/model/SwitchLoginModel.kt create mode 100644 OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/loginswitch/LoginSwitchView.kt diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/LoginServiceManager.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/LoginServiceManager.kt index f91f18d37b..72911590bd 100644 --- a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/LoginServiceManager.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/LoginServiceManager.kt @@ -28,8 +28,8 @@ import com.mogo.eagle.core.utilcode.util.GsonUtils import com.mogo.eagle.core.utilcode.util.TimeUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.biz.login.callback.ILoginViewCallback -import com.mogo.och.biz.login.model.LoginModel import com.mogo.och.biz.login.bean.LoginInfo +import com.mogo.och.biz.login.model.SwitchLoginModel import com.mogo.och.common.module.biz.lansocket.IOchLanPassengerStatusListener import com.mogo.och.common.module.biz.lansocket.LoginLanPassengerSocket import com.mogo.och.common.module.biz.login.LoginStatusManager @@ -180,12 +180,12 @@ object LoginServiceManager : IOchLanPassengerStatusListener { } private fun queryLoginStatusByNet() { - LoginModel.queryCarStatus(false) + SwitchLoginModel.queryCarStatus(false) } fun queryLoginStatusByNet(readCatche: Boolean) { d(tag, "queryLoginStatusByNet") - LoginModel.queryCarStatus(readCatche) + SwitchLoginModel.queryCarStatus(readCatche) } fun loginOut() { @@ -198,7 +198,7 @@ object LoginServiceManager : IOchLanPassengerStatusListener { FunctionBuildConfig.isOffLine = false sendLogin2Client(1) } - LoginModel.logout() + SwitchLoginModel.logout() } fun checkAllEnv( diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/f2a/LoginF2aReqBean.java b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/f2a/LoginF2aReqBean.java new file mode 100644 index 0000000000..e856a28538 --- /dev/null +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/f2a/LoginF2aReqBean.java @@ -0,0 +1,33 @@ +package com.mogo.och.biz.login.bean.f2a; + +/** + * Created by yangyakun on 2021/8/19 + * 通过手机号验证码登录 + */ +public class LoginF2aReqBean { + + public String phone; + public String mfaCode; + public String sn; + public Location4Login loc; + + public LoginF2aReqBean(String phone, String mfaCode, String sn, Location4Login location4Login) { + this.phone = phone; + this.mfaCode = mfaCode; + this.sn = sn; + this.loc = location4Login; + } + + public static class Location4Login{ + public double lat; + public double lon; + public String coordinateType = "WGS84"; + + + public Location4Login(double lat, double lon,String coordinateType) { + this.lat = lat; + this.lon = lon; + this.coordinateType = coordinateType; + } + } +} diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/f2a/LoginReqBean.java b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/f2a/LoginReqBean.java new file mode 100644 index 0000000000..c0553a671f --- /dev/null +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/f2a/LoginReqBean.java @@ -0,0 +1,18 @@ +package com.mogo.och.biz.login.bean.f2a; + +/** + * Created by yangyakun on 2021/8/19 + * 通过手机号验证码登录 + */ +public class LoginReqBean { + + public String phone; + public String password; + public String sn; + + public LoginReqBean(String phone, String password, String sn) { + this.phone = phone; + this.password = password; + this.sn = sn; + } +} diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/f2a/LoginRespBean.java b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/f2a/LoginRespBean.java new file mode 100644 index 0000000000..91a710dec3 --- /dev/null +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/f2a/LoginRespBean.java @@ -0,0 +1,24 @@ +package com.mogo.och.biz.login.bean.f2a; + +import com.mogo.eagle.core.data.BaseData; + +/** + * Created by yangyakun on 2021/8/19 + * 通过账号密码登录 + */ +public class LoginRespBean extends BaseData { + + public Result data; + + public static final class Result { + public Long driverId; + public boolean isFirstLogin; + public boolean isPasswordExpired; + public boolean isPasswordExpiringSoon; + public boolean needInitPassword; + public String otpAuthUrl; + public String phone; + public String sn; + } + +} diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/f2a/RestPwdReqBean.java b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/f2a/RestPwdReqBean.java new file mode 100644 index 0000000000..f71456e04d --- /dev/null +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/f2a/RestPwdReqBean.java @@ -0,0 +1,18 @@ +package com.mogo.och.biz.login.bean.f2a; + +/** + * Created by yangyakun on 2021/8/19 + * 通过手机号验证码登录 + */ +public class RestPwdReqBean { + + public Long driverId; + public String newPwd; + public String oldPwd; + + public RestPwdReqBean(Long driverId, String newPwd,String oldPwd) { + this.driverId = driverId; + this.newPwd = newPwd; + this.oldPwd = oldPwd; + } +} diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/f2a/RestPwdRespBean.java b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/f2a/RestPwdRespBean.java new file mode 100644 index 0000000000..df59f8ac9c --- /dev/null +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/f2a/RestPwdRespBean.java @@ -0,0 +1,23 @@ +package com.mogo.och.biz.login.bean.f2a; + +import com.mogo.eagle.core.data.BaseData; + +/** + * Created by yangyakun on 2021/8/19 + * 通过账号密码登录 + */ +public class RestPwdRespBean extends BaseData { + + public Result data; + + public static final class Result { + public Long driverId; + public boolean isFirstLogin; + public boolean isPasswordExpired; + public boolean isPasswordExpiringSoon; + public String otpAuthUrl; + public String phone; + public String sn; + } + +} diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/callback/ITaxiLoginCallback.java b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/callback/ITaxiLoginCallback.java index 70bcccb8ce..18b37abdc0 100644 --- a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/callback/ITaxiLoginCallback.java +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/callback/ITaxiLoginCallback.java @@ -1,5 +1,10 @@ package com.mogo.och.biz.login.callback; +import com.mogo.och.biz.login.bean.f2a.LoginRespBean; +import com.mogo.och.biz.login.bean.f2a.RestPwdRespBean; + +import org.jetbrains.annotations.Nullable; + /** * Created on 2021/9/8 * @@ -9,5 +14,8 @@ public interface ITaxiLoginCallback { default void getPhoneCodeSuccess(){} default void netErrorCallback(){} - default void stopAutoLogin(){} + + default void loginfirstSuccess(@Nullable LoginRespBean.Result data,String oldPwd){} + + default void restPwdSuccess(){} } diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/model/CommonLoginModel.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/model/CommonLoginModel.kt new file mode 100644 index 0000000000..d9a0da7381 --- /dev/null +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/model/CommonLoginModel.kt @@ -0,0 +1,181 @@ +package com.mogo.och.biz.login.model + +import android.content.Context +import android.net.ConnectivityManager +import android.util.Log +import com.mogo.commons.AbsMogoApplication +import com.mogo.commons.module.intent.IMogoIntentListener +import com.mogo.commons.module.intent.IntentManager +import com.mogo.commons.storage.SharedPrefsMgr +import com.mogo.commons.utils.MogoAnalyticUtils +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsFuncConfigListenerManager +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON +import com.mogo.eagle.core.utilcode.util.NetworkUtils +import com.mogo.eagle.core.utilcode.util.StringUtils +import com.mogo.och.biz.R +import com.mogo.och.biz.login.LoginServiceManager +import com.mogo.och.biz.login.bean.DriverStatusQueryRespBean +import com.mogo.och.biz.login.bean.LoginInfo +import com.mogo.och.biz.login.callback.ITaxiLoginCallback +import com.mogo.och.biz.login.net.OchCommonServiceManager +import com.mogo.och.common.module.biz.login.LoginStatusManager +import com.mogo.och.common.module.manager.cache.ISpCallback +import com.mogo.och.common.module.manager.cache.OchSPManager +import com.mogo.och.common.module.network.OchCommonServiceCallback +import com.mogo.och.common.module.utils.ToastUtilsOch +import com.mogo.och.common.module.wigets.toast.ToastCharterUtils +import io.reactivex.Observable +import io.reactivex.disposables.Disposable +import java.util.concurrent.TimeUnit + +open class CommonLoginModel { + + protected val TAG = M_OCHCOMMON + this.javaClass.simpleName + + protected var mContext: Context? = null + + open var iTaxiLoginCallback: ITaxiLoginCallback? = null + + private val mNetWorkIntentListener = IMogoIntentListener { intentStr, _ -> + d(TAG, "onIntentReceived = %s", intentStr) + if (ConnectivityManager.CONNECTIVITY_ACTION == intentStr) { + if (NetworkUtils.isConnected(mContext) + && AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + // 网络链接成功可以先读取本地再获取服务器 + queryCarStatus() + } + } + } + + private val snChangeListener = object : ISpCallback { + override fun snChange() { + d(TAG, "sn 发生变化${OchSPManager.getSn()}") + if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + queryCarStatus(false) + } + } + } + + init { + mContext = AbsMogoApplication.getApp() + IntentManager.getInstance() + .registerIntentListener(ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener) + } + + protected var subscribe: Disposable? = null + + protected val loginInfoKey = "LOGININFOKEY" + + fun hasInit(): Boolean { + return iTaxiLoginCallback != null + } + + fun setiTaxiLoginCallback(iTaxiLoginCallback: ITaxiLoginCallback?) { + d(TAG, "setiTaxiLoginCallback") + OchSPManager.addListener(TAG, snChangeListener) + this.iTaxiLoginCallback = iTaxiLoginCallback + } + + fun release() { + d(TAG, "release") + OchSPManager.remove(TAG) + iTaxiLoginCallback = null + } + + @Synchronized + private fun go2LoginInfo(data: LoginInfo?, source: String) { + d(TAG, "设置源:${source}") + data?.let { + LoginServiceManager.setLoginInfo(data) + loginSuccess(data) + } + } + + /** + * 接单状态和登录状态查询 + * 1、司机端登录成功后开启2分钟定时请求登录状态 + * 2、对外提供查询登录状态 + * 3、网络状态发生变化后查询 + * 4、sn 发生变化后查询 + * 5、登录成功后主动查询 + * 6、错误重试 + * 7、错误重试 + * 8、登出后重试 + */ + fun queryCarStatus(readCatche: Boolean = true) { + mContext?.let { + Log.d(TAG, "设置源:queryCarStatus") + if (readCatche) { + val loginInfo = LoginServiceManager.getLoginInfo() + go2LoginInfo(loginInfo,"缓存获取") + } + OchCommonServiceManager.queryDriverServiceStatus( + it, + object : OchCommonServiceCallback { + override fun onSuccess(data: DriverStatusQueryRespBean) { + val map: MutableMap = HashMap() + map["msg"] = data.toString() + MogoAnalyticUtils.track("QueryCarStatus", map) + go2LoginInfo(data.data, "接口获取") + } + + override fun onError() { + val map: MutableMap = HashMap() + map["msg"] = "网络错误" + MogoAnalyticUtils.track("QueryCarStatus", map) + + if (!NetworkUtils.isConnected(mContext)) { + ToastCharterUtils.showToastShort(mContext!!.getString(R.string.biz_login_network_error_tip)) + } else { + ToastCharterUtils.showToastShort(mContext!!.getString(R.string.biz_login_request_error_tip)) + } +// LoginStatusManager.setLoginError(-10012, "网络错误") + LoginStatusManager.setLoginError(-10012, StringUtils.getString(R.string.module_och_network_mistake)) + // 依赖参数 + subscribe = Observable.timer(5, TimeUnit.SECONDS) + .subscribe { _: Long? -> queryCarStatus(readCatche) } + } + + override fun onFail(code: Int, msg: String) { + val map: MutableMap = HashMap() + map["msg"] = msg + map["code"] = code + MogoAnalyticUtils.track("QueryCarStatus", map) + + LoginStatusManager.setLoginError(code, "msg:${msg}") + ToastUtilsOch.showWithCodeMessage(code, msg) + // 依赖参数 + subscribe = Observable.timer(3, TimeUnit.SECONDS) + .subscribe { _: Long? -> queryCarStatus(readCatche) } +// if (code == OchCommonConst.WAIT_TAKEN) { +// +// } else { +// } + } + }) + } + } + + fun loginSuccess(data: LoginInfo?) { + d(TAG, "loginSuccess:${LoginServiceManager.isLogin()}") + if (LoginServiceManager.isLogin()) { + CallerDevaToolsFuncConfigListenerManager + SharedPrefsMgr.getInstance().putString("och_account", data?.phone) + } else { + SharedPrefsMgr.getInstance().putString("och_account", "") + } + + } + + fun gotoOfflineMode() { + FunctionBuildConfig.isOffLine = true + var loginInfo = LoginServiceManager.getLoginInfo() + if(loginInfo==null){ + loginInfo = LoginInfo() + } + LoginServiceManager.setLoginInfo(loginInfo) + } +} \ No newline at end of file diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/model/F2aLoginModel.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/model/F2aLoginModel.kt new file mode 100644 index 0000000000..b58417d785 --- /dev/null +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/model/F2aLoginModel.kt @@ -0,0 +1,166 @@ +package com.mogo.och.biz.login.model + +import android.annotation.SuppressLint +import com.mogo.eagle.core.data.BaseData +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d +import com.mogo.eagle.core.utilcode.util.NetworkUtils +import com.mogo.och.biz.R +import com.mogo.och.biz.login.LoginServiceManager +import com.mogo.och.biz.login.bean.LoginInfo +import com.mogo.och.biz.login.bean.TaxiLogoutReqBean +import com.mogo.och.biz.login.bean.f2a.LoginF2aReqBean +import com.mogo.och.biz.login.bean.f2a.LoginRespBean +import com.mogo.och.biz.login.net.OchCommonServiceManager +import com.mogo.och.bridge.autopilot.location.OchLocationManager +import com.mogo.och.common.module.manager.cache.OchSPManager +import com.mogo.och.common.module.network.OchCommonServiceCallback +import com.mogo.och.common.module.utils.ToastUtilsOch +import com.mogo.och.common.module.wigets.toast.ToastCharterUtils + + +/** + * Created by pangfan on 2021/8/19 + * + * + * 网约车 - 出租车业务逻辑处理 + */ +@SuppressLint("StaticFieldLeak") +object F2aLoginModel: CommonLoginModel() { + + fun gotoLogin(phone: String, pwd: String) { + mContext?.let { + OchCommonServiceManager.gotoLoginBypwd(it, phone, pwd, + object : OchCommonServiceCallback { + override fun onSuccess(data: LoginRespBean?) { + if (null != data && 0 == data.code) { + // 登录成功需要新的值 + queryCarStatus(false) + iTaxiLoginCallback?.loginfirstSuccess(data.data,pwd) + } else { + if (data != null) { + ToastCharterUtils.showToastShort(data.msg.toString()) + } + } + } + + override fun onError() { + if (!NetworkUtils.isConnected(mContext)) { + ToastCharterUtils.showToastShort(mContext?.getString(R.string.biz_login_network_error_tip)) + } else { + ToastCharterUtils.showToastShort(mContext?.getString(R.string.biz_login_request_error_tip_unmanned)) + } + iTaxiLoginCallback?.netErrorCallback() + } + + override fun onFail(code: Int, msg: String) { + ToastUtilsOch.showWithCodeMessage(code, msg) + } + }) + } + } + + fun gotoLoginByF2aCode(phone: String?, f2aCode: String) { + mContext?.let { + val location = OchLocationManager.getWgs02Location() + val location4Login = LoginF2aReqBean.Location4Login(location.latitude, location.longitude,"WGS84") + OchCommonServiceManager.gotoLoginByf2aCode(it, phone, f2aCode, location4Login, + object : OchCommonServiceCallback { + override fun onSuccess(data: BaseData?) { + if (null != data && 0 == data.code) { + // 登录成功需要新的值 + queryCarStatus(false) + } else { + if (data != null) { + ToastCharterUtils.showToastShort(data.msg.toString()) + } + } + } + + override fun onError() { + if (!NetworkUtils.isConnected(mContext)) { + ToastCharterUtils.showToastShort(mContext?.getString(R.string.biz_login_network_error_tip)) + } else { + ToastCharterUtils.showToastShort(mContext?.getString(R.string.biz_login_request_error_tip_unmanned)) + } + iTaxiLoginCallback?.netErrorCallback() + } + + override fun onFail(code: Int, msg: String) { + ToastUtilsOch.showWithCodeMessage(code, msg) + } + }) + } + } + + fun gotoRestPwd(driverId:Long,pwd: String,oldPwd:String) { + mContext?.let { + OchCommonServiceManager.gotoRestPwd(it,driverId, pwd,oldPwd, + object : OchCommonServiceCallback { + override fun onSuccess(data: BaseData?) { + if (null != data && 0 == data.code) { + // 登录成功需要新的值 + queryCarStatus(false) + iTaxiLoginCallback?.restPwdSuccess() + } else { + if (data != null) { + ToastCharterUtils.showToastShort(data.msg.toString()) + } + } + } + + override fun onError() { + if (!NetworkUtils.isConnected(mContext)) { + ToastCharterUtils.showToastShort(mContext?.getString(R.string.biz_login_network_error_tip)) + } else { + ToastCharterUtils.showToastShort(mContext?.getString(R.string.biz_login_request_error_tip_unmanned)) + } + iTaxiLoginCallback?.netErrorCallback() + } + + override fun onFail(code: Int, msg: String) { + ToastUtilsOch.showWithCodeMessage(code, msg) + } + }) + } + } + + + + @Synchronized + private fun go2LoginInfo(data: LoginInfo?, source: String) { + d(TAG, "设置源:${source}") + data?.let { + LoginServiceManager.setLoginInfo(data) + loginSuccess(data) + } + } + + // 登出 + fun logout() { + val location4Login = TaxiLogoutReqBean.Location4Login() + OchCommonServiceManager.logout( + mContext!!, location4Login, + object : OchCommonServiceCallback { + override fun onSuccess(data: BaseData?) { + if (null != data && 0 == data.code) { + OchSPManager.remove(loginInfoKey) + // 退出登录成功需要查询新的 + queryCarStatus(false) + } + } + + override fun onError() { + if (!NetworkUtils.isConnected(mContext)) { + ToastCharterUtils.showToastShort(mContext!!.getString(R.string.biz_login_network_error_tip)) + } else { + ToastCharterUtils.showToastShort(mContext!!.getString(R.string.biz_login_request_error_tip)) + } + } + + override fun onFail(code: Int, msg: String) { + ToastUtilsOch.showWithCodeMessage(code, msg) + } + }) + } + +} \ No newline at end of file diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/model/LoginModel.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/model/LoginModel.kt index 8d361e750d..33230aeabb 100644 --- a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/model/LoginModel.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/model/LoginModel.kt @@ -45,56 +45,7 @@ import java.util.concurrent.TimeUnit * 网约车 - 出租车业务逻辑处理 */ @SuppressLint("StaticFieldLeak") -object LoginModel { - - private const val TAG = "${M_OCHCOMMON}LoginModel" - private var mContext: Context? = null - var iTaxiLoginCallback: ITaxiLoginCallback? = null - private var subscribe: Disposable? = null - - private val loginInfoKey = "LOGININFOKEY" - - private val mNetWorkIntentListener = IMogoIntentListener { intentStr, _ -> - d(TAG, "onIntentReceived = %s", intentStr) - if (ConnectivityManager.CONNECTIVITY_ACTION == intentStr) { - if (NetworkUtils.isConnected(mContext) - && AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - // 网络链接成功可以先读取本地再获取服务器 - queryCarStatus() - } - } - } - - private val snChangeListener = object : ISpCallback { - override fun snChange() { - d(TAG, "sn 发生变化${OchSPManager.getSn()}") - if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - queryCarStatus(false) - } - } - } - - init { - mContext = AbsMogoApplication.getApp() - IntentManager.getInstance() - .registerIntentListener(ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener) - } - - fun hasInit(): Boolean { - return iTaxiLoginCallback != null - } - - fun setiTaxiLoginCallback(iTaxiLoginCallback: ITaxiLoginCallback?) { - d(TAG, "setiTaxiLoginCallback") - OchSPManager.addListener(TAG, snChangeListener) - LoginModel.iTaxiLoginCallback = iTaxiLoginCallback - } - - fun release() { - d(TAG, "release") - OchSPManager.remove(TAG) - iTaxiLoginCallback = null - } +object LoginModel: CommonLoginModel() { /** * 获取手机验证码 @@ -137,7 +88,7 @@ object LoginModel { } - fun gotoLogin(phone: String, code: String, isAutoLoginMode: Boolean) { + fun gotoLogin(phone: String, code: String) { mContext?.let { val location = OchLocationManager.getGCJ02Location() val location4Login = TaxiLoginReqBean.Location4Login(location.latitude, location.longitude) @@ -145,12 +96,7 @@ object LoginModel { object : OchCommonServiceCallback { override fun onSuccess(data: TaxiLoginRespBean?) { if (null != data && 0 == data.code) { - // 获取验证码成功 - if (isAutoLoginMode){ - iTaxiLoginCallback?.stopAutoLogin() - }else{ - ToastCharterUtils.showToastShort(mContext?.getString(R.string.biz_login_login_success)) - } + ToastCharterUtils.showToastShort(mContext?.getString(R.string.biz_login_login_success)) // 登录成功需要新的值 queryCarStatus(false) } else { @@ -164,12 +110,7 @@ object LoginModel { if (!NetworkUtils.isConnected(mContext)) { ToastCharterUtils.showToastShort(mContext?.getString(R.string.biz_login_network_error_tip)) } else { - if (isAutoLoginMode){ - ToastCharterUtils.showToastShort(mContext?.getString(R.string.biz_login_request_error_tip_unmanned)) - }else{ - ToastCharterUtils.showToastShort(mContext?.getString(R.string.biz_login_request_error_tip)) - } - + ToastCharterUtils.showToastShort(mContext?.getString(R.string.biz_login_request_error_tip_unmanned)) } iTaxiLoginCallback?.netErrorCallback() } @@ -181,80 +122,6 @@ object LoginModel { } } - /** - * 接单状态和登录状态查询 - * 1、司机端登录成功后开启2分钟定时请求登录状态 - * 2、对外提供查询登录状态 - * 3、网络状态发生变化后查询 - * 4、sn 发生变化后查询 - * 5、登录成功后主动查询 - * 6、错误重试 - * 7、错误重试 - * 8、登出后重试 - */ - fun queryCarStatus(readCatche: Boolean = true) { - mContext?.let { - Log.d(TAG, "设置源:queryCarStatus") - if (readCatche) { - val loginInfo = LoginServiceManager.getLoginInfo() - go2LoginInfo(loginInfo,"缓存获取") - } - OchCommonServiceManager.queryDriverServiceStatus( - it, - object : OchCommonServiceCallback { - override fun onSuccess(data: DriverStatusQueryRespBean) { - val map: MutableMap = HashMap() - map["msg"] = data.toString() - MogoAnalyticUtils.track("QueryCarStatus", map) - go2LoginInfo(data.data, "接口获取") - } - - override fun onError() { - val map: MutableMap = HashMap() - map["msg"] = "网络错误" - MogoAnalyticUtils.track("QueryCarStatus", map) - - if (!NetworkUtils.isConnected(mContext)) { - ToastCharterUtils.showToastShort(mContext!!.getString(R.string.biz_login_network_error_tip)) - } else { - ToastCharterUtils.showToastShort(mContext!!.getString(R.string.biz_login_request_error_tip)) - } -// LoginStatusManager.setLoginError(-10012, "网络错误") - LoginStatusManager.setLoginError(-10012, StringUtils.getString(R.string.module_och_network_mistake)) - // 依赖参数 - subscribe = Observable.timer(5, TimeUnit.SECONDS) - .subscribe { _: Long? -> queryCarStatus(readCatche) } - } - - override fun onFail(code: Int, msg: String) { - val map: MutableMap = HashMap() - map["msg"] = msg - map["code"] = code - MogoAnalyticUtils.track("QueryCarStatus", map) - - LoginStatusManager.setLoginError(code, "msg:${msg}") - ToastUtilsOch.showWithCodeMessage(code, msg) - // 依赖参数 - subscribe = Observable.timer(3, TimeUnit.SECONDS) - .subscribe { _: Long? -> queryCarStatus(readCatche) } -// if (code == OchCommonConst.WAIT_TAKEN) { -// -// } else { -// } - } - }) - } - } - - @Synchronized - private fun go2LoginInfo(data: LoginInfo?, source: String) { - d(TAG, "设置源:${source}") - data?.let { - LoginServiceManager.setLoginInfo(data) - loginSuccess(data) - } - } - // 登出 fun logout() { val location4Login = TaxiLogoutReqBean.Location4Login() @@ -283,23 +150,4 @@ object LoginModel { }) } - fun loginSuccess(data: LoginInfo?) { - d(TAG, "loginSuccess:${LoginServiceManager.isLogin()}") - if (LoginServiceManager.isLogin()) { - SharedPrefsMgr.getInstance().putString("och_account", data?.phone) - } else { - SharedPrefsMgr.getInstance().putString("och_account", "") - } - - } - - fun gotoOfflineMode() { - FunctionBuildConfig.isOffLine = true - var loginInfo = LoginServiceManager.getLoginInfo() - if(loginInfo==null){ - loginInfo = LoginInfo() - } - LoginServiceManager.setLoginInfo(loginInfo) - } - } \ No newline at end of file diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/model/SwitchLoginModel.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/model/SwitchLoginModel.kt new file mode 100644 index 0000000000..ad1d026b6f --- /dev/null +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/model/SwitchLoginModel.kt @@ -0,0 +1,28 @@ +package com.mogo.och.biz.login.model + +import com.mogo.och.common.module.manager.EnvManager + +object SwitchLoginModel { + fun logout() { + if (EnvManager.isPhoneCodeMode()) { + F2aLoginModel.logout() + }else{ + LoginModel.logout() + } + } + + fun release() { + LoginModel.release() + F2aLoginModel.release() + } + + fun queryCarStatus(readCatche:Boolean){ + if (EnvManager.isPhoneCodeMode()) { + F2aLoginModel.queryCarStatus(readCatche) + }else{ + LoginModel.queryCarStatus(readCatche) + } + } + + +} \ No newline at end of file diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/net/OchCommonServiceManager.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/net/OchCommonServiceManager.kt index c863b3a7d4..3c7ccd7274 100644 --- a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/net/OchCommonServiceManager.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/net/OchCommonServiceManager.kt @@ -2,25 +2,28 @@ package com.mogo.och.biz.login.net import android.content.Context import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.commons.env.ProjectUtils import com.mogo.commons.storage.SharedPrefsMgr -import com.mogo.och.biz.login.bean.DriverStatusQueryRespBean -import com.mogo.och.biz.login.bean.TaxiLoginReqBean import com.mogo.eagle.core.data.BaseData import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.network.MoGoRetrofitFactory import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.och.biz.login.bean.DriverStatusQueryRespBean +import com.mogo.och.biz.login.bean.TaxiLoginReqBean import com.mogo.och.biz.login.bean.TaxiLoginRespBean import com.mogo.och.biz.login.bean.TaxiLoginSmsReqBean import com.mogo.och.biz.login.bean.TaxiLogoutReqBean +import com.mogo.och.biz.login.bean.f2a.LoginF2aReqBean +import com.mogo.och.biz.login.bean.f2a.LoginReqBean +import com.mogo.och.biz.login.bean.f2a.LoginRespBean +import com.mogo.och.biz.login.bean.f2a.RestPwdReqBean import com.mogo.och.common.module.biz.lansocket.LoginLanPassengerSocket import com.mogo.och.common.module.constant.OchCommonConst +import com.mogo.och.common.module.manager.cache.OchSPManager import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.common.module.network.OchCommonSubscribeImpl import com.mogo.och.common.module.network.interceptor.transformTry -import com.mogo.commons.env.ProjectUtils -import com.mogo.och.common.module.manager.cache.OchSPManager -import com.mogo.och.common.module.utils.RxUtils object OchCommonServiceManager { @@ -168,4 +171,64 @@ object OchCommonServiceManager { } } + + + /** + * 通过密码半登录 + * @param context + * @param callback + */ + @JvmStatic + fun gotoLoginBypwd( + context: Context, phone: String?, pwd: String?, + callback: OchCommonServiceCallback? + ) { + CallerLogger.d(TAG, "gotoLoginBycode:通过手机验证码登录:${phone}---${pwd}") + val sn = OchSPManager.getSn() + ochLoginServiceSaasEh.gotoLoginBypwd( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + SharedPrefsMgr.getInstance().token, + LoginReqBean(phone, pwd, sn) + ).transformTry().subscribe(OchCommonSubscribeImpl(context, callback, "login")) + } + + /** + * 重新设置密码 + * @param context + * @param callback + */ + @JvmStatic + fun gotoRestPwd( + context: Context, driverId: Long?, pwd: String?,oldPwd:String, + callback: OchCommonServiceCallback? + ) { + CallerLogger.d(TAG, "gotoLoginBycode:重置密码") + val sn = OchSPManager.getSn() + ochLoginServiceSaasEh.gotoresetPwd( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + SharedPrefsMgr.getInstance().token, + RestPwdReqBean(driverId, pwd,oldPwd) + ).transformTry().subscribe(OchCommonSubscribeImpl(context, callback, "gotoRestPwd")) + } + + /** + * 重新设置密码 + * @param context + * @param callback + */ + @JvmStatic + fun gotoLoginByf2aCode( + context: Context, phone: String?, mfaCode: String?, + location4Login: LoginF2aReqBean.Location4Login, + callback: OchCommonServiceCallback? + ) { + CallerLogger.d(TAG, "gotoLoginBycode:重置密码") + val sn = OchSPManager.getSn() + ochLoginServiceSaasEh.gotoLogByf2aCode( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + SharedPrefsMgr.getInstance().token, + LoginF2aReqBean(phone, mfaCode,sn,location4Login) + ).transformTry().subscribe(OchCommonSubscribeImpl(context, callback, "gotoRestPwd")) + } + } \ No newline at end of file diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/net/OchLoginServiceSaasEhApi.java b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/net/OchLoginServiceSaasEhApi.java index bb94d176a0..d5a576455d 100644 --- a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/net/OchLoginServiceSaasEhApi.java +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/net/OchLoginServiceSaasEhApi.java @@ -6,6 +6,10 @@ import com.mogo.och.biz.login.bean.TaxiLoginReqBean; import com.mogo.och.biz.login.bean.TaxiLoginRespBean; import com.mogo.och.biz.login.bean.TaxiLoginSmsReqBean; import com.mogo.och.biz.login.bean.TaxiLogoutReqBean; +import com.mogo.och.biz.login.bean.f2a.LoginF2aReqBean; +import com.mogo.och.biz.login.bean.f2a.LoginReqBean; +import com.mogo.och.biz.login.bean.f2a.LoginRespBean; +import com.mogo.och.biz.login.bean.f2a.RestPwdReqBean; import io.reactivex.Observable; import retrofit2.http.Body; @@ -63,4 +67,45 @@ interface OchLoginServiceSaasEhApi { Observable queryDriverServiceStatusAndLoginStatus(@Header("appId") String appId , @Header("ticket") String ticket, @Query("sn") String sn); + + + /** + * 通过验证码登录 + * + * @param appId + * @param ticket + * @param data + * @return + */ + @Headers({"Content-type:application/json;charset=UTF-8"}) + @POST("/l4r-vehicle/api/tnt/driver/auth/v2/loginNext") + Observable gotoLoginBypwd(@Header("appId") String appId + , @Header("ticket") String ticket, @Body LoginReqBean data); + + /** + * 通过验证码登录 + * + * @param appId + * @param ticket + * @param data + * @return + */ + @Headers({"Content-type:application/json;charset=UTF-8"}) + @POST("/l4r-vehicle/api/tnt/driver/auth/v2/resetPwd") + Observable gotoresetPwd(@Header("appId") String appId + , @Header("ticket") String ticket, @Body RestPwdReqBean data); + + /** + * 通过验证码登录 + * + * @param appId + * @param ticket + * @param data + * @return + */ + @Headers({"Content-type:application/json;charset=UTF-8"}) + @POST("/l4r-vehicle/api/tnt/driver/auth/v2/login") + Observable gotoLogByf2aCode(@Header("appId") String appId + , @Header("ticket") String ticket, @Body LoginF2aReqBean data); + } diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/presenter/LoginPassengerPresenter.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/presenter/LoginPassengerPresenter.kt index 4f2445e599..5984814a10 100644 --- a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/presenter/LoginPassengerPresenter.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/presenter/LoginPassengerPresenter.kt @@ -3,8 +3,6 @@ package com.mogo.och.biz.login.presenter import androidx.lifecycle.LifecycleOwner import com.mogo.commons.mvp.Presenter import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.och.biz.login.callback.ITaxiLoginCallback -import com.mogo.och.biz.login.model.LoginModel import com.mogo.och.biz.login.ui.LoginPassengerFragment import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.common.module.manager.loop.LoopInfo @@ -15,7 +13,7 @@ import com.mogo.och.common.module.manager.loop.LoopInfo * * 描述 */ -class LoginPassengerPresenter(view: LoginPassengerFragment?) : Presenter(view), ITaxiLoginCallback { +class LoginPassengerPresenter(view: LoginPassengerFragment?) : Presenter(view) { private val TAG = LoginPassengerPresenter::class.java.simpleName @@ -25,7 +23,6 @@ class LoginPassengerPresenter(view: LoginPassengerFragment?) : Presenter(view), ITaxiLoginCallback, +class LoginPresenter(view: LoginFragment?) : Presenter(view), ILoginCallback { - private var countDownDisposable: Disposable? = null - private val TAG = M_OCHCOMMON+LoginPresenter::class.java.simpleName - private var autoLoginDisposable: Disposable? = null - private var isAutoLoginMode = AtomicBoolean(false) // 标记是否处于自动登录模式 init { initListeners() CallerLogger.d(TAG, "登录-Init") } private fun initListeners() { - LoginModel.setiTaxiLoginCallback(this) LoginStatusManager.addListener(TAG,this) } @@ -53,33 +44,10 @@ class LoginPresenter(view: LoginFragment?) : Presenter(view), IT CallerLogger.d(TAG, "登录-初始化") } - - override fun onDestroy(owner: LifecycleOwner) { super.onDestroy(owner) - LoginModel.release() - countDownDisposable?.let { - if (!it.isDisposed) { - it.dispose() - } - } - stopAutoLogin() + SwitchLoginModel.release() + } - override fun stopAutoLogin() { - isAutoLoginMode.set(false) - autoLoginDisposable?.let { - if (!it.isDisposed) { - it.dispose() - } - } - autoLoginDisposable = null - OchChainLogManager.writeChainLog(TAG, "登录成功,停止自动登录循环") - } - - override fun netErrorCallback() { - if (!isAutoLoginMode.get()) { - mView?.showLoginOffLineModel() - } - } } \ No newline at end of file diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/LoginFragment.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/LoginFragment.kt index 2d6325a7f6..c9028099d6 100644 --- a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/LoginFragment.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/LoginFragment.kt @@ -33,9 +33,6 @@ import com.mogo.och.biz.R import com.mogo.och.biz.login.LoginConst import com.mogo.och.biz.login.callback.ILoginViewCallback import com.mogo.och.biz.login.presenter.LoginPresenter -import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager -import com.mogo.och.common.module.utils.ResourcesUtils -import com.mogo.och.common.module.wigets.dialog.CommonDialogStatus import com.mogo.skin.utils.SkinResources import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack @@ -206,14 +203,6 @@ class LoginFragment : MvpFragment(), ILoginView biz_login_svp?.setBackgroundResource(R.drawable.biz_login_bg_bus_end) } } -// if (AppIdentityModeUtils.getCockpitType() == CockpitType.UNMANNED) { -// cl_welcome_info?.visibility = View.VISIBLE -// UiThreadHandler.postDelayed({ -// mPresenter?.autoLogin() -// }, 2_000, UiThreadHandler.MODE.QUEUE) -// } else { -// cl_login_info?.visibility = View.VISIBLE -// } login_view_info?.visibility = View.VISIBLE }else{ viewColdStart.setColdStartResultListener(object: ColdStartView.ColdStartResultListener{ @@ -302,26 +291,4 @@ class LoginFragment : MvpFragment(), ILoginView viewColdStart.setColdStartResultListener(null) } - fun showLoginOffLineModel() { - context?.let { - val builder = CommonDialogStatus.Builder() - val closeLineConfirmDialog = builder - .title(ResourcesUtils.getString(R.string.biz_login_net_error_title)) - .tips(ResourcesUtils.getString(R.string.biz_login_net_error_tip)) - .confirmStr(ResourcesUtils.getString(R.string.biz_login_offline_login)) - .status(CommonDialogStatus.Status.neterror) - .build(it) - closeLineConfirmDialog.setClickListener(object : CommonDialogStatus.ClickListener { - override fun confirm() { - - login_view_info?.gotoLogin4Fragment(LoginConst.OFFLINEPHONE, LoginConst.OFFLINECODE) - } - - override fun cancel() { - closeLineConfirmDialog.dismiss() - } - }) - closeLineConfirmDialog.show() - } - } } \ No newline at end of file diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/login/LoginView.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/login/LoginView.kt index b604b92715..b5a1bc3c7c 100644 --- a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/login/LoginView.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/login/LoginView.kt @@ -13,11 +13,14 @@ import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.util.ActivityUtils import com.mogo.eagle.core.utilcode.util.KeyboardUtils import com.mogo.och.biz.R +import com.mogo.och.biz.login.LoginConst import com.mogo.och.biz.login.ui.LoginFragment import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager +import com.mogo.och.common.module.utils.ResourcesUtils +import com.mogo.och.common.module.wigets.dialog.CommonDialogStatus import kotlinx.android.synthetic.main.biz_login_view_old.view.biz_acbtn_login -import kotlinx.android.synthetic.main.biz_login_view_old.view.biz_acet_phone_code_value import kotlinx.android.synthetic.main.biz_login_view_old.view.biz_ace_login_phone_value +import kotlinx.android.synthetic.main.biz_login_view_old.view.biz_acet_phone_code_value import kotlinx.android.synthetic.main.biz_login_view_old.view.biz_actv_login_get_code import kotlinx.android.synthetic.main.biz_login_view_old.view.biz_actv_welcome_login_title @@ -107,10 +110,6 @@ class LoginView : ConstraintLayout, LoginViewModel.IErrorInfoViewCallback { } } - fun gotoLogin4Fragment(phone: String, code: String){ - viewModel?.gotoLogin(phone, code) - } - override fun onAttachedToWindow() { super.onAttachedToWindow() @@ -128,10 +127,6 @@ class LoginView : ConstraintLayout, LoginViewModel.IErrorInfoViewCallback { } - fun getBottomInfo(){ - - } - init { try { initView() @@ -170,4 +165,26 @@ class LoginView : ConstraintLayout, LoginViewModel.IErrorInfoViewCallback { } } + override fun showLoginOffLineModel() { + context?.let { + val builder = CommonDialogStatus.Builder() + val closeLineConfirmDialog = builder + .title(ResourcesUtils.getString(R.string.biz_login_net_error_title)) + .tips(ResourcesUtils.getString(R.string.biz_login_net_error_tip)) + .confirmStr(ResourcesUtils.getString(R.string.biz_login_offline_login)) + .status(CommonDialogStatus.Status.neterror) + .build(it) + closeLineConfirmDialog.setClickListener(object : CommonDialogStatus.ClickListener { + override fun confirm() { + viewModel?.gotoLogin(LoginConst.OFFLINEPHONE, LoginConst.OFFLINECODE) + } + + override fun cancel() { + closeLineConfirmDialog.dismiss() + } + }) + closeLineConfirmDialog.show() + } + } + } \ No newline at end of file diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/login/LoginViewModel.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/login/LoginViewModel.kt index cf9f590e8c..472cb30c97 100644 --- a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/login/LoginViewModel.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/login/LoginViewModel.kt @@ -27,11 +27,6 @@ class LoginViewModel : ViewModel(), ITaxiLoginCallback, ILoginCallback { private var countDownDisposable: Disposable? = null - - init { - - } - fun setDistanceCallback(viewCallback: IErrorInfoViewCallback) { this.viewCallback = viewCallback initListeners() @@ -69,7 +64,7 @@ class LoginViewModel : ViewModel(), ITaxiLoginCallback, ILoginCallback { gotoOfflineMode() return } - LoginModel.gotoLogin(phone, code, false) + LoginModel.gotoLogin(phone, code) viewCallback?.closeSoftInput() } @@ -112,10 +107,16 @@ class LoginViewModel : ViewModel(), ITaxiLoginCallback, ILoginCallback { LoginModel.gotoOfflineMode() } + override fun netErrorCallback() { + super.netErrorCallback() + viewCallback?.showLoginOffLineModel() + } + interface IErrorInfoViewCallback { fun inputPhoneError() fun closeSoftInput() fun setCountDownText(text: String, enable: Boolean) + fun showLoginOffLineModel() } diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/loginf2a/LoginF2aView.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/loginf2a/LoginF2aView.kt index 70dc4cb71d..65933ef98c 100644 --- a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/loginf2a/LoginF2aView.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/loginf2a/LoginF2aView.kt @@ -2,6 +2,8 @@ package com.mogo.och.biz.login.ui.loginf2a import android.content.Context import android.os.SystemClock +import android.text.Editable +import android.text.TextWatcher import android.util.AttributeSet import android.view.LayoutInflater import androidx.constraintlayout.widget.ConstraintLayout @@ -11,15 +13,35 @@ import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.findViewTreeViewModelStoreOwner import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.util.ActivityUtils +import com.mogo.eagle.core.utilcode.util.ImageUtils import com.mogo.eagle.core.utilcode.util.KeyboardUtils import com.mogo.och.biz.R import com.mogo.och.biz.login.ui.LoginFragment -import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager -import kotlinx.android.synthetic.main.biz_login_view_old.view.biz_acbtn_login -import kotlinx.android.synthetic.main.biz_login_view_old.view.biz_acet_phone_code_value -import kotlinx.android.synthetic.main.biz_login_view_old.view.biz_ace_login_phone_value -import kotlinx.android.synthetic.main.biz_login_view_old.view.biz_actv_login_get_code -import kotlinx.android.synthetic.main.biz_login_view_old.view.biz_actv_welcome_login_title +import com.mogo.och.common.module.utils.createQRCode +import com.mogo.och.common.module.utils.createQRCodeWithPicture +import com.mogo.skin.utils.SkinResources +import kotlinx.android.synthetic.main.biz_login_view_f2a.view.acet_f2a_code +import kotlinx.android.synthetic.main.biz_login_view_f2a.view.acet_input_number_1 +import kotlinx.android.synthetic.main.biz_login_view_f2a.view.acet_input_number_2 +import kotlinx.android.synthetic.main.biz_login_view_f2a.view.acet_input_number_3 +import kotlinx.android.synthetic.main.biz_login_view_f2a.view.acet_input_number_4 +import kotlinx.android.synthetic.main.biz_login_view_f2a.view.acet_input_number_5 +import kotlinx.android.synthetic.main.biz_login_view_f2a.view.acet_input_number_6 +import kotlinx.android.synthetic.main.biz_login_view_f2a.view.aciv_get_f2a_code +import kotlinx.android.synthetic.main.biz_login_view_f2a.view.biz_acbtn_f2a_login_first +import kotlinx.android.synthetic.main.biz_login_view_f2a.view.biz_acbtn_f2a_login_normal +import kotlinx.android.synthetic.main.biz_login_view_f2a.view.biz_acbtn_login +import kotlinx.android.synthetic.main.biz_login_view_f2a.view.biz_acbtn_reset_passwrod +import kotlinx.android.synthetic.main.biz_login_view_f2a.view.biz_ace_login_phone_value +import kotlinx.android.synthetic.main.biz_login_view_f2a.view.biz_acet_phone_pwd_value +import kotlinx.android.synthetic.main.biz_login_view_f2a.view.biz_actv_welcome_login_title +import kotlinx.android.synthetic.main.biz_login_view_f2a.view.biz_reset_password_first_value +import kotlinx.android.synthetic.main.biz_login_view_f2a.view.biz_reset_password_secode_value +import kotlinx.android.synthetic.main.biz_login_view_f2a.view.group_bind_sec_code +import kotlinx.android.synthetic.main.biz_login_view_f2a.view.group_f2a_login +import kotlinx.android.synthetic.main.biz_login_view_f2a.view.group_password_login +import kotlinx.android.synthetic.main.biz_login_view_f2a.view.group_reset_password +import me.jessyan.autosize.utils.AutoSizeUtils class LoginF2aView : ConstraintLayout, LoginF2aViewModel.IErrorInfoViewCallback { @@ -52,20 +74,24 @@ class LoginF2aView : ConstraintLayout, LoginF2aViewModel.IErrorInfoViewCallback private fun initListener(){ biz_acbtn_login.onClick { val phone = biz_ace_login_phone_value.text.toString() - val code = biz_acet_phone_code_value.text.toString() - viewModel?.gotoLogin(phone, code) + val pwd = biz_acet_phone_pwd_value.text.toString() + viewModel?.gotoLogin(phone, pwd) } + + biz_acbtn_reset_passwrod.onClick { + val pwd = biz_reset_password_first_value.text.toString() + val pwdSecod = biz_reset_password_secode_value.text.toString() + viewModel?.gotoRestPwd(pwd,pwdSecod) + } + + biz_acbtn_f2a_login_first.onClick { + val f2aCode = acet_f2a_code.text.toString() + viewModel?.gotoLogin4F2a(f2aCode) + } + biz_actv_welcome_login_title.setOnClickListener { continuousClick() } - biz_actv_login_get_code.setOnClickListener { - OchChainLogManager.writeChainLog("登录页面","点击获取验证码") - if(viewModel==null){ - OchChainLogManager.writeChainLog("司机登录页面","mPresenter=${viewModel}") - }else{ - viewModel?.getPhoneCode(biz_ace_login_phone_value.text.toString()) - } - } biz_ace_login_phone_value.addTextChangedListener { it?.let { itEditable -> @@ -74,6 +100,43 @@ class LoginF2aView : ConstraintLayout, LoginF2aViewModel.IErrorInfoViewCallback } } } + + val etList = listOf(acet_input_number_1, acet_input_number_2, acet_input_number_3, acet_input_number_4, acet_input_number_5, acet_input_number_6) + + etList.forEachIndexed { index, editText -> + editText.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} + + override fun afterTextChanged(s: Editable?) { + if (!s.isNullOrEmpty()) { + // 输入了内容,跳到下一格 + if (index < etList.size - 1) { + etList[index + 1].requestFocus() + } else { + // 最后一格,收集验证码 + val code = etList.joinToString("") { it.text.toString() } + } + } else { + // 删除了内容,跳到上一格 + if (index > 0) { + etList[index - 1].requestFocus() + } + } + } + }) + } + + biz_acbtn_f2a_login_normal.onClick { + val stringBuilder = StringBuilder() + etList.forEach { + stringBuilder.append(it.text) + } + if(stringBuilder.length==6){ + viewModel?.gotoLogin4F2a(stringBuilder.toString()) + } + } + } companion object { @@ -91,7 +154,7 @@ class LoginF2aView : ConstraintLayout, LoginF2aViewModel.IErrorInfoViewCallback mHits[mHits.size - 1] = SystemClock.uptimeMillis() if (mHits[0] >= (SystemClock.uptimeMillis() - DURATION)) { mHits = LongArray(COUNTS) //重新初始化数组 - viewModel?.gotoLogin("13288888888", "8888") + viewModel?.gotoLogin4Code("13288888888", "8888") } } @@ -122,6 +185,11 @@ class LoginF2aView : ConstraintLayout, LoginF2aViewModel.IErrorInfoViewCallback viewModel?.setDistanceCallback(this) } + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + + } + override fun onVisibilityAggregated(isVisible: Boolean) { super.onVisibilityAggregated(isVisible) @@ -160,14 +228,42 @@ class LoginF2aView : ConstraintLayout, LoginF2aViewModel.IErrorInfoViewCallback KeyboardUtils.hideSoftInput(ActivityUtils.getTopActivity()) } - override fun setCountDownText(text: String, enable: Boolean) { - if (enable) { - biz_actv_login_get_code.setText(R.string.biz_login_get_code) - biz_actv_login_get_code.isEnabled = true - } else { - biz_actv_login_get_code.text = text - biz_actv_login_get_code.isEnabled = false + override fun showLoginView() { + group_password_login.visibility = VISIBLE + group_reset_password.visibility = GONE + group_bind_sec_code.visibility = GONE + group_f2a_login.visibility = GONE + } + + override fun showRestPassword() { + group_password_login.visibility = GONE + group_reset_password.visibility = VISIBLE + group_bind_sec_code.visibility = GONE + group_f2a_login.visibility = GONE + } + + override fun showF2aLoginViewSecod() { + group_password_login.visibility = GONE + group_reset_password.visibility = GONE + group_bind_sec_code.visibility = GONE + group_f2a_login.visibility = VISIBLE + } + + override fun showQrLoginView(otpAuthUrl: String?) { + group_password_login.visibility = GONE + group_reset_password.visibility = GONE + group_bind_sec_code.visibility = VISIBLE + group_f2a_login.visibility = GONE + otpAuthUrl?.let { + val qrCenterLogoDrawable = + SkinResources.getInstance().getDrawable(R.drawable.icon_qr_center_logo) + val qrCenterLogoBitmap = ImageUtils.drawable2Bitmap(qrCenterLogoDrawable) + val bmQr = createQRCodeWithPicture(qrCenterLogoBitmap,otpAuthUrl, AutoSizeUtils.dp2px(context, 360f), + AutoSizeUtils.dp2px(context, 360f), true + ) + aciv_get_f2a_code.setImageBitmap(bmQr) } + } } \ No newline at end of file diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/loginf2a/LoginF2aViewModel.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/loginf2a/LoginF2aViewModel.kt index a8288337b8..88614ccd9b 100644 --- a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/loginf2a/LoginF2aViewModel.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/loginf2a/LoginF2aViewModel.kt @@ -1,32 +1,31 @@ package com.mogo.och.biz.login.ui.loginf2a import androidx.lifecycle.ViewModel -import com.mogo.commons.AbsMogoApplication import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.util.Md5Util import com.mogo.eagle.core.utilcode.util.RegexUtils +import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.och.biz.R import com.mogo.och.biz.login.LoginConst +import com.mogo.och.biz.login.bean.f2a.LoginRespBean +import com.mogo.och.biz.login.bean.f2a.RestPwdRespBean import com.mogo.och.biz.login.callback.ITaxiLoginCallback +import com.mogo.och.biz.login.model.F2aLoginModel import com.mogo.och.biz.login.model.LoginModel -import com.mogo.och.biz.login.ui.debugview.BusinessViewModel import com.mogo.och.common.module.biz.login.ILoginCallback import com.mogo.och.common.module.biz.login.LoginStatusManager -import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager +import com.mogo.och.common.module.utils.CallerLoggerUtils +import com.mogo.och.common.module.utils.ResourcesUtils import com.mogo.och.common.module.wigets.toast.ToastCharterUtils -import io.reactivex.Observable -import io.reactivex.android.schedulers.AndroidSchedulers -import io.reactivex.disposables.Disposable -import io.reactivex.schedulers.Schedulers -import java.util.concurrent.TimeUnit class LoginF2aViewModel : ViewModel(), ITaxiLoginCallback, ILoginCallback { - private val TAG = BusinessViewModel::class.java.simpleName + private val TAG = LoginF2aViewModel::class.java.simpleName private var viewCallback: IErrorInfoViewCallback? = null - private var countDownDisposable: Disposable? = null - + private var loginRespBean: LoginRespBean.Result?=null; + private var oldPwd: String?=null; init { @@ -39,83 +38,122 @@ class LoginF2aViewModel : ViewModel(), ITaxiLoginCallback, ILoginCallback { override fun onCleared() { super.onCleared() + CallerLogger.d(TAG,"LoginF2aViewModel:onCleared") this.viewCallback = null - countDownDisposable?.let { - if (!it.isDisposed) { - it.dispose() + F2aLoginModel.setiTaxiLoginCallback(null) + LoginStatusManager.removeListener(TAG) + } + + private fun initListeners() { + CallerLogger.d(TAG,"LoginF2aViewModel:initListeners") + F2aLoginModel.setiTaxiLoginCallback(this) + LoginStatusManager.addListener(TAG,this) + } + + fun gotoRestPwd(pwd: String, pwdSecod: String) { + if(!F2aLoginModel.hasInit()){ + initListeners() + } + if(pwd!=pwdSecod){ + ToastCharterUtils.showToastShort(R.string.biz_login_reset_passwrod_different) + return + } + if(pwd.isBlank()){ + ToastCharterUtils.showToastShort(R.string.biz_login_reset_passwrod_non_input) + return + } + if(pwd.length<14||pwd.length>20){ + ToastCharterUtils.showToastShort(R.string.biz_login_reset_passwrod_non_compliant) + return + } + loginRespBean?.let { + oldPwd?.let { old-> + val mD5Result = Md5Util.getMD5Result(pwd) + F2aLoginModel.gotoRestPwd(it.driverId,mD5Result,old) + } + } + viewCallback?.closeSoftInput() + } + fun gotoLogin(phone: String, pwd: String) { + if(!F2aLoginModel.hasInit()){ + initListeners() + } + if (!RegexUtils.isMobileExact(phone)) { + ToastCharterUtils.showToastShort(R.string.biz_login_phone_error) + viewCallback?.inputPhoneError() + return + } + if(pwd.isBlank()){ + ToastCharterUtils.showToastShort(R.string.biz_login_pwd_error) + return + } + if(phone== LoginConst.OFFLINEPHONE&&pwd== LoginConst.OFFLINECODE){ + gotoOfflineMode() + return + } + val mD5Result = Md5Util.getMD5Result(pwd) + F2aLoginModel.gotoLogin(phone,mD5Result) + viewCallback?.closeSoftInput() + } + + fun gotoLogin4F2a(f2aCode: String) { + if(f2aCode.length!=6){ + ToastCharterUtils.showToastShort(R.string.biz_login_code_error) + return + } + loginRespBean?.let { + F2aLoginModel.gotoLoginByF2aCode(it.phone,f2aCode) + } + + } + + + override fun loginfirstSuccess(data: LoginRespBean.Result?,oldPwd:String) { + data?.let { + loginRespBean = it + this.oldPwd = oldPwd + if (it.needInitPassword) { + // 修改密码去 + viewCallback?.showRestPassword() + }else{ + if(it.isPasswordExpired){// 已经超过365天了 + // 修改密码去 + viewCallback?.showRestPassword() + return + } + if(it.isPasswordExpiringSoon){// 还有特定日期就超过365天 + ToastUtils.showShort(ResourcesUtils.getString(R.string.biz_login_password_will_out_day)) + } + if(it.isFirstLogin){ + viewCallback?.showQrLoginView(it.otpAuthUrl) + }else{ + viewCallback?.showF2aLoginViewSecod() + } } } } - private fun initListeners() { - LoginModel.setiTaxiLoginCallback(this) - LoginStatusManager.addListener(TAG,this) - } - - fun gotoLogin(phone: String, code: String) { - if(!LoginModel.hasInit()){ - initListeners() - } - if (!RegexUtils.isMobileExact(phone)) { - ToastCharterUtils.showToastShort(R.string.biz_login_phone_error) - viewCallback?.inputPhoneError() - return - } - if(code.isBlank()||code.length<4){ - ToastCharterUtils.showToastShort(R.string.biz_login_code_error) - return - } - if(phone== LoginConst.OFFLINEPHONE&&code== LoginConst.OFFLINECODE){ - gotoOfflineMode() - return - } - LoginModel.gotoLogin(phone, code, false) - viewCallback?.closeSoftInput() - } - - fun getPhoneCode(phone: String) { - OchChainLogManager.writeChainLog("登录页面","获取验证码${phone}") - if(!LoginModel.hasInit()){ - OchChainLogManager.writeChainLog("登录页面","LoginModel没有初始化去初始化") - initListeners() - } - if (!RegexUtils.isMobileExact(phone)) { - ToastCharterUtils.showToastShort(R.string.biz_login_phone_error) - viewCallback?.inputPhoneError() - OchChainLogManager.writeChainLog("登录页面","获取验证码 手机号输入错误") - return - } - LoginModel.getPhoneCode(phone) - } - - override fun getPhoneCodeSuccess() { - super.getPhoneCodeSuccess() - val countDownSeconds = 60L; - countDownDisposable = Observable.intervalRange(0, countDownSeconds, 0, 1, TimeUnit.SECONDS) - .map { aLong -> countDownSeconds - aLong } - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ - viewCallback?.setCountDownText("${it}s",false) - CallerLogger.d(TAG, "倒计时:$it") - }, { - CallerLogger.d(TAG, "倒计时onError:${it}") - it.printStackTrace() - viewCallback?.setCountDownText(AbsMogoApplication.getApp().getString(R.string.biz_login_get_code),true) - }, { - CallerLogger.d(TAG, "倒计时onComplete") - viewCallback?.setCountDownText(AbsMogoApplication.getApp().getString(R.string.biz_login_get_code),true) - }) + override fun restPwdSuccess() { + loginRespBean = null + oldPwd = null + viewCallback?.showLoginView() } private fun gotoOfflineMode() { - LoginModel.gotoOfflineMode() + F2aLoginModel.gotoOfflineMode() + } + + fun gotoLogin4Code(phone: String, code: String) { + LoginModel.gotoLogin(phone,code) } interface IErrorInfoViewCallback { fun inputPhoneError() fun closeSoftInput() - fun setCountDownText(text: String, enable: Boolean) + fun showRestPassword() + fun showF2aLoginViewSecod() + fun showQrLoginView(otpAuthUrl: String?) + fun showLoginView() } diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/loginswitch/LoginSwitchView.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/loginswitch/LoginSwitchView.kt new file mode 100644 index 0000000000..f216146058 --- /dev/null +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/ui/loginswitch/LoginSwitchView.kt @@ -0,0 +1,115 @@ +package com.mogo.och.biz.login.ui.loginswitch + +import android.content.Context +import android.util.AttributeSet +import android.view.View +import android.view.ViewGroup +import android.widget.FrameLayout +import com.mogo.och.biz.login.ui.login.LoginView +import com.mogo.och.biz.login.ui.loginf2a.LoginF2aView +import com.mogo.och.common.module.manager.EnvManager +import com.mogo.och.common.module.manager.transform.OchTransform +import com.mogo.och.common.module.manager.transform.OchTransformDispatch + + +class LoginSwitchView : FrameLayout, OchTransformDispatch { + + constructor(context: Context) : super(context) + + constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) + + constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super( + context, + attributeSet, + defStyleAttr + ) + + constructor( + context: Context, + attributeSet: AttributeSet, + defStyleAttr: Int, + defStyleRes: Int + ) : super(context, attributeSet, defStyleAttr, defStyleRes) + + companion object { + val TAG = LoginSwitchView::class.java.simpleName + } + + private var loginView:LoginView?=null + private var loginF2aView:LoginF2aView?=null + + override fun onLoginModeChange() { + super.onLoginModeChange() + loadView() + } + + + override fun onAttachedToWindow() { + OchTransform.addListener(TAG,this) + super.onAttachedToWindow() + loadView() + } + + private fun loadView(){ + if (EnvManager.isPhoneCodeMode()) { + handleLoginView(LoginView::class.java, ::loginView){ + this.loginView = it + } + } else { + handleLoginView(LoginF2aView::class.java, ::loginF2aView){ + loginF2aView = it + } + } + } + + // 统一处理 + private fun handleLoginView( + viewClass: Class, + getView: () -> T?, + setView: (T) -> Unit + ) { + val child = getChildAt(0) + if (child != null && viewClass.isInstance(child)) return + + removeAllViews() + + val view = getView() ?: run { + // 关键修复:两个 View 都统一强转为泛型 T + val newView: T = if (viewClass == LoginView::class.java) { + LoginView(context) as T + } else { + LoginF2aView(context) as T + } + setView(newView) + newView + } + + addViewSafely(view) + } + + // 安全添加,必加!防止崩溃 + private fun addViewSafely(view: View) { + (view.parent as? ViewGroup)?.removeView(view) + addView(view) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + OchTransform.removeListener(TAG) + } + + + override fun onVisibilityAggregated(isVisible: Boolean) { + super.onVisibilityAggregated(isVisible) + + } + + init { + try { + + } catch (e: Exception) { + e.printStackTrace() + } + } + +} \ No newline at end of file diff --git a/OCH/common/biz/src/main/res/layout/biz_login_view.xml b/OCH/common/biz/src/main/res/layout/biz_login_view.xml index 11142dbb3c..b273284b1e 100644 --- a/OCH/common/biz/src/main/res/layout/biz_login_view.xml +++ b/OCH/common/biz/src/main/res/layout/biz_login_view.xml @@ -15,7 +15,7 @@ app:layout_constraintTop_toTopOf="parent" /> - @@ -59,7 +59,7 @@ @@ -128,23 +128,22 @@ app:layout_constraintTop_toBottomOf="@+id/actv_phone_code_title" /> + app:layout_constraintTop_toTopOf="@+id/v_phone_code_bg" /> + android:layout_height="@dimen/dp_369"/> - Login successful Please enter a correct phone number Please enter a correct verification code + Please enter a correct verification password Please enter phone number Please enter phone number + Please enter password + Set a new password Please set a new password Positions 14-20, containing numbers and English letters (upper and lower case) 请确认新密码 Next step - + The password is about to expire, and it needs to be changed + The passwords entered twice do not match. Please re-enter + The password does not meet the requirements. Please re-enter + Please enter a new password Welcome to sign in Please open the MFA authenticator and enter the 6-digit verification code. If you are unable to obtain the verification code, please contact the administrator diff --git a/OCH/common/biz/src/main/res/values/strings.xml b/OCH/common/biz/src/main/res/values/strings.xml index 15aa58d2c3..0eca46e8e1 100644 --- a/OCH/common/biz/src/main/res/values/strings.xml +++ b/OCH/common/biz/src/main/res/values/strings.xml @@ -10,14 +10,20 @@ 登录成功 请输入正确的手机号 请输入正确的验证码 + 请输入正确的密码 请输入手机号 请输入手机号 + 请输入密码 设置新密码 请设置新密码 14-20位,包含数字、英文大小写 请确认新密码 下一步 + 密码即将到期,需更改密码 + 两次输入的密码不一致,请重新输入 + 密码不符合要求,请重新输入 + 请输入新密码 欢迎登录 diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/EnvManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/EnvManager.kt index 2bfee65881..c890a9f456 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/EnvManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/EnvManager.kt @@ -54,6 +54,10 @@ object EnvManager { return isT1T2() && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) } + fun isPhoneCodeMode():Boolean{ + return FunctionBuildConfig.loginMode==0 + } + } \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/transform/OchTransform.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/transform/OchTransform.kt index b06903aebf..9814f80fef 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/transform/OchTransform.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/transform/OchTransform.kt @@ -30,4 +30,10 @@ object OchTransform : CallerBase(), IOchBizFunctionCall4Ea it.value.setVideoView(target) } } + + override fun onLoginStateChange() { + M_LISTENERS.forEach{ + it.value.onLoginModeChange() + } + } } \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/transform/OchTransformDispatch.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/transform/OchTransformDispatch.kt index 978d89bfa0..41334158d9 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/transform/OchTransformDispatch.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/transform/OchTransformDispatch.kt @@ -6,4 +6,5 @@ interface OchTransformDispatch { fun logout(){} fun setVideoView(target: View?){} + fun onLoginModeChange(){} } \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiPresenter.java b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiPresenter.java index b7b391af5f..c62a44240a 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiPresenter.java +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiPresenter.java @@ -90,6 +90,11 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS public void logout() { TaxiTaskModel.INSTANCE.logout(); } + + @Override + public void onLoginModeChange() { + + } }; //导航去订单目的地 diff --git a/app/script/projectFlavors/project.gradle b/app/script/projectFlavors/project.gradle index 9e43364519..afd6270257 100644 --- a/app/script/projectFlavors/project.gradle +++ b/app/script/projectFlavors/project.gradle @@ -6,6 +6,7 @@ project.android.productFlavors { dimension "project" buildConfigField 'boolean', 'secure', "true" buildConfigField 'int', 'ttsLanguage', "1" // 仅中文 + buildConfigField 'int', 'loginMode', "0" // 手机号验证码登录 buildConfigField 'String', 'URLs', "\"${readFileToJson("mogo").replace("\"", "\\\"")}\"" buildConfigField 'String', 'mediaUrlConfig', "\"${readMediaUrlConfigFromJsonFile("mogo").replace("\"", "\\\"")}\"" } @@ -13,6 +14,7 @@ project.android.productFlavors { dimension "project" buildConfigField 'boolean', 'secure', "false" buildConfigField 'int', 'ttsLanguage', "1 << 1" // 中英韩 + buildConfigField 'int', 'loginMode', "0" // 手机号验证码登录 buildConfigField 'String', 'URLs', "\"${readFileToJson("yantai").replace("\"", "\\\"")}\"" buildConfigField 'String', 'mediaUrlConfig', "\"${readMediaUrlConfigFromJsonFile("yantai").replace("\"", "\\\"")}\"" } @@ -21,6 +23,7 @@ project.android.productFlavors { dimension "project" buildConfigField 'boolean', 'secure', "true" buildConfigField 'int', 'ttsLanguage', "1" // 仅中文 + buildConfigField 'int', 'loginMode', "0" // 手机号验证码登录 buildConfigField 'String', 'URLs', "\"${readFileToJson("dali").replace("\"", "\\\"")}\"" buildConfigField 'String', 'mediaUrlConfig', "\"${readMediaUrlConfigFromJsonFile("dali").replace("\"", "\\\"")}\"" } @@ -28,6 +31,7 @@ project.android.productFlavors { dimension "project" buildConfigField 'boolean', 'secure', "true" buildConfigField 'int', 'ttsLanguage', "1" // 仅中文 + buildConfigField 'int', 'loginMode', "1" // 手机号验证码登录 buildConfigField 'String', 'URLs', "\"${readFileToJson("saas").replace("\"", "\\\"")}\"" buildConfigField 'String', 'mediaUrlConfig', "\"${readMediaUrlConfigFromJsonFile("saas").replace("\"", "\\\"")}\"" } @@ -35,6 +39,7 @@ project.android.productFlavors { dimension "project" buildConfigField 'boolean', 'secure', "true" buildConfigField 'int', 'ttsLanguage', "1" // 仅中文 + buildConfigField 'int', 'loginMode', "1" // 手机号验证码登录 buildConfigField 'String', 'URLs', "\"${readFileToJson("singapore").replace("\"", "\\\"")}\"" buildConfigField 'String', 'mediaUrlConfig', "\"${readMediaUrlConfigFromJsonFile("singapore").replace("\"", "\\\"")}\"" } diff --git a/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt b/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt index c667dca004..208c62d634 100644 --- a/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt +++ b/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt @@ -51,6 +51,7 @@ object ConfigStartUp { // 演示模式,上一次勾选的数据 FunctionBuildConfig.isDemoMode = BuildConfig.IS_DEMO_MODE FunctionBuildConfig.ttsLanguage = BuildConfig.ttsLanguage + FunctionBuildConfig.loginMode = BuildConfig.loginMode // 各个module需要的url FunctionBuildConfig.urlJson = GsonUtils.fromJson(BuildConfig.URLs, UrlConfig::class.java) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index 0a6857f7b5..1592de876f 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt @@ -46,6 +46,7 @@ import com.mogo.eagle.core.data.constants.MoGoConfig import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_BAG_RECORD import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_BEAUTY_MODE +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_LOGIN_MODE import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_FULL_LOG import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_RAIN_MODE import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_WARNING_UPLOAD @@ -97,6 +98,7 @@ import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager import com.mogo.eagle.core.function.call.obu.CallerObuApiManager import com.mogo.eagle.core.function.call.obu.CallerObuConnectListenerManager import com.mogo.eagle.core.function.call.obu.CallerObuInfoListenerManager +import com.mogo.eagle.core.function.call.och.CallerEagleBaseFunctionCall4OchManager import com.mogo.eagle.core.function.call.och.CallerOchBizFunctionCall4EagleManager import com.mogo.eagle.core.function.call.setting.CallerMapShowNameManager import com.mogo.eagle.core.function.call.setting.CallerMoGoUiSettingManager @@ -263,6 +265,7 @@ import kotlinx.android.synthetic.main.view_debug_setting.view.tbLanguage import kotlinx.android.synthetic.main.view_debug_setting.view.tbLogCatch import kotlinx.android.synthetic.main.view_debug_setting.view.tbLogcatCenter import kotlinx.android.synthetic.main.view_debug_setting.view.tbLoginLogout +import kotlinx.android.synthetic.main.view_debug_setting.view.tbLoginMode import kotlinx.android.synthetic.main.view_debug_setting.view.tbNetLog import kotlinx.android.synthetic.main.view_debug_setting.view.tbObuController import kotlinx.android.synthetic.main.view_debug_setting.view.tbObuLog @@ -1152,6 +1155,18 @@ internal class DebugSettingView @JvmOverloads constructor( } } + + tbLoginMode.isChecked = FunctionBuildConfig.loginMode == 0 + tbLoginMode.setOnCheckedChangeListener { compoundButton, isChecked -> + if (!compoundButton.isPressed) { + return@setOnCheckedChangeListener + } + CallerOchBizFunctionCall4EagleManager.onLoginStateChange() + } + if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { + tbLoginMode.visibility = View.GONE + } + // 雨天模式,上一次勾选的数据 tbIsRainMode.isChecked = FunctionBuildConfig.isRainMode //雨天模式 @@ -2453,6 +2468,12 @@ internal class DebugSettingView @JvmOverloads constructor( tbIsRainMode?.text = "开启雨天模式" } + if(FunctionBuildConfig.loginMode==0){ + tbLoginMode?.text = "手机号验证码登录" + }else{ + tbLoginMode?.text = "二次验证登录" + } + obuConnectStatusTv.text = Html.fromHtml( "OBU连接状态:${ if (AppConfigInfo.isConnectObu) { @@ -2545,6 +2566,19 @@ internal class DebugSettingView @JvmOverloads constructor( tbIsDemoMode.setPadding(left, top, right, bottom) } + BIZ_LOGIN_MODE -> { + tbLoginMode.isClickable = !lock + val (left, top, right, bottom) = tbLoginMode.currentPadding() + if (lock) { + tbLoginMode.background = + resources.getDrawable(R.drawable.radio_button_lock_background) + } else { + tbLoginMode.background = + resources.getDrawable(R.drawable.radio_button_normal_background_right) + } + tbLoginMode.setPadding(left, top, right, bottom) + } + BIZ_RAIN_MODE -> { tbIsRainMode.isClickable = !lock val (left, top, right, bottom) = tbIsRainMode.currentPadding() @@ -2897,6 +2931,10 @@ internal class DebugSettingView @JvmOverloads constructor( tbIsRainMode.isChecked = status } + override fun onLoginModeClickEvent(status: Boolean) { + tbLoginMode.isChecked = status + } + /** * 点云模式 */ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml index f18e666d84..0e4af13ed7 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml @@ -331,6 +331,18 @@ android:textOn="关闭美化模式" android:textSize="@dimen/dp_24" /> + +