[f2a 登录]
This commit is contained in:
yangyakun
2026-04-22 19:19:53 +08:00
parent bf2bd70538
commit 8755b95e5b
38 changed files with 1149 additions and 369 deletions

View File

@@ -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(

View File

@@ -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;
}
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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(){}
}

View File

@@ -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<DriverStatusQueryRespBean> {
override fun onSuccess(data: DriverStatusQueryRespBean) {
val map: MutableMap<String, Any> = HashMap()
map["msg"] = data.toString()
MogoAnalyticUtils.track("QueryCarStatus", map)
go2LoginInfo(data.data, "接口获取")
}
override fun onError() {
val map: MutableMap<String, Any> = 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<String, Any> = 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)
}
}

View File

@@ -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<LoginRespBean> {
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<BaseData> {
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<BaseData> {
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<BaseData> {
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)
}
})
}
}

View File

@@ -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<TaxiLoginRespBean> {
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))
}
// 登录成功需要新的值
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))
}
}
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<DriverStatusQueryRespBean> {
override fun onSuccess(data: DriverStatusQueryRespBean) {
val map: MutableMap<String, Any> = HashMap()
map["msg"] = data.toString()
MogoAnalyticUtils.track("QueryCarStatus", map)
go2LoginInfo(data.data, "接口获取")
}
override fun onError() {
val map: MutableMap<String, Any> = 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<String, Any> = 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)
}
}

View File

@@ -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)
}
}
}

View File

@@ -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<LoginRespBean>?
) {
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<BaseData>?
) {
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<BaseData>?
) {
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"))
}
}

View File

@@ -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<DriverStatusQueryRespBean> 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<LoginRespBean> 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<BaseData> 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<BaseData> gotoLogByf2aCode(@Header("appId") String appId
, @Header("ticket") String ticket, @Body LoginF2aReqBean data);
}

View File

@@ -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<LoginPassengerFragment?>(view), ITaxiLoginCallback {
class LoginPassengerPresenter(view: LoginPassengerFragment?) : Presenter<LoginPassengerFragment?>(view) {
private val TAG = LoginPassengerPresenter::class.java.simpleName
@@ -25,7 +23,6 @@ class LoginPassengerPresenter(view: LoginPassengerFragment?) : Presenter<LoginPa
}
private fun initListeners() {
LoginModel.setiTaxiLoginCallback(this)
BizLoopManager.setLoopFunction(TAG, LoopInfo(2,::showStatus))
}

View File

@@ -6,14 +6,10 @@ import com.mogo.eagle.core.utilcode.mogo.Product
import com.mogo.eagle.core.utilcode.mogo.Vehicle
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON
import com.mogo.och.biz.login.callback.ITaxiLoginCallback
import com.mogo.och.biz.login.ui.LoginFragment
import com.mogo.och.biz.login.model.LoginModel
import com.mogo.och.biz.login.model.SwitchLoginModel
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 io.reactivex.disposables.Disposable
import java.util.concurrent.atomic.AtomicBoolean
/**
* @author congtaowang
@@ -21,22 +17,17 @@ import java.util.concurrent.atomic.AtomicBoolean
*
* 描述
*/
class LoginPresenter(view: LoginFragment?) : Presenter<LoginFragment?>(view), ITaxiLoginCallback,
class LoginPresenter(view: LoginFragment?) : Presenter<LoginFragment?>(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<LoginFragment?>(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()
}
}
}

View File

@@ -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<LoginFragment?, LoginPresenter?>(), 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<LoginFragment?, LoginPresenter?>(), 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()
}
}
}

View File

@@ -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()
}
}
}

View File

@@ -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()
}

View File

@@ -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)
}
}
}

View File

@@ -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,21 +38,44 @@ 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() {
LoginModel.setiTaxiLoginCallback(this)
CallerLogger.d(TAG,"LoginF2aViewModel:initListeners")
F2aLoginModel.setiTaxiLoginCallback(this)
LoginStatusManager.addListener(TAG,this)
}
fun gotoLogin(phone: String, code: String) {
if(!LoginModel.hasInit()){
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)) {
@@ -61,61 +83,77 @@ class LoginF2aViewModel : ViewModel(), ITaxiLoginCallback, ILoginCallback {
viewCallback?.inputPhoneError()
return
}
if(code.isBlank()||code.length<4){
ToastCharterUtils.showToastShort(R.string.biz_login_code_error)
if(pwd.isBlank()){
ToastCharterUtils.showToastShort(R.string.biz_login_pwd_error)
return
}
if(phone== LoginConst.OFFLINEPHONE&&code== LoginConst.OFFLINECODE){
if(phone== LoginConst.OFFLINEPHONE&&pwd== LoginConst.OFFLINECODE){
gotoOfflineMode()
return
}
LoginModel.gotoLogin(phone, code, false)
val mD5Result = Md5Util.getMD5Result(pwd)
F2aLoginModel.gotoLogin(phone,mD5Result)
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("登录页面","获取验证码 手机号输入错误")
fun gotoLogin4F2a(f2aCode: String) {
if(f2aCode.length!=6){
ToastCharterUtils.showToastShort(R.string.biz_login_code_error)
return
}
LoginModel.getPhoneCode(phone)
loginRespBean?.let {
F2aLoginModel.gotoLoginByF2aCode(it.phone,f2aCode)
}
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 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()
}
}
}
}
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()
}

View File

@@ -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 <T : View> handleLoginView(
viewClass: Class<T>,
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()
}
}
}

View File

@@ -15,7 +15,7 @@
app:layout_constraintTop_toTopOf="parent" />
<com.mogo.och.biz.login.ui.login.LoginView
<com.mogo.och.biz.login.ui.loginswitch.LoginSwitchView
android:id="@+id/login_view_info"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"

View File

@@ -38,8 +38,8 @@
<androidx.constraintlayout.widget.Group
android:id="@+id/group_password_login"
android:visibility="gone"
app:constraint_referenced_ids="biz_actv_welcome_login_title,actv_login_phone_title,biz_ace_login_phone_value,actv_phone_code_title,v_phone_code_bg,biz_acet_phone_code_value,biz_acbtn_login"
android:visibility="visible"
app:constraint_referenced_ids="biz_actv_welcome_login_title,actv_login_phone_title,biz_ace_login_phone_value,actv_phone_code_title,v_phone_code_bg,biz_acet_phone_pwd_value,biz_acbtn_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
@@ -59,7 +59,7 @@
<androidx.constraintlayout.widget.Group
android:id="@+id/group_f2a_login"
android:visibility="visible"
android:visibility="gone"
app:constraint_referenced_ids="biz_actv_f2a_login_title_big,biz_actv_f2a_login_title,biz_actv_f2a_login_title_samll,acet_input_number_1,acet_input_number_2,acet_input_number_3,acet_input_number_4,acet_input_number_5,acet_input_number_6,biz_acbtn_f2a_login_normal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
@@ -128,23 +128,22 @@
app:layout_constraintTop_toBottomOf="@+id/actv_phone_code_title" />
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/biz_acet_phone_code_value"
android:id="@+id/biz_acet_phone_pwd_value"
android:layout_width="@dimen/dp_760"
android:layout_height="136dp"
android:background="@null"
android:gravity="center_vertical"
android:imeOptions="actionDone"
android:inputType="textPassword"
android:maxLength="4"
android:maxLines="1"
android:hint="@string/biz_login_pwd_hint_text"
android:paddingStart="30dp"
android:textColor="@color/white"
android:textColorHint="@color/white"
android:textSize="@dimen/dp_40"
app:layout_constraintBottom_toBottomOf="@+id/v_phone_code_bg"
app:layout_constraintStart_toStartOf="@+id/v_phone_code_bg"
app:layout_constraintTop_toTopOf="@+id/v_phone_code_bg"
tools:text="1881" />
app:layout_constraintTop_toTopOf="@+id/v_phone_code_bg" />
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/biz_acbtn_login"
@@ -195,8 +194,8 @@
android:background="@drawable/biz_login_phone_normal"
android:gravity="center_vertical"
android:hint="@string/biz_login_reset_password_first_text_hide"
android:inputType="numberSigned"
android:maxLength="11"
android:inputType="text"
android:maxLength="20"
android:maxLines="1"
android:paddingStart="30dp"
android:textColor="@color/white"
@@ -224,8 +223,8 @@
android:background="@drawable/biz_login_phone_normal"
android:gravity="center_vertical"
android:hint="@string/biz_login_reset_password_first_text_hide"
android:inputType="numberSigned"
android:maxLength="11"
android:inputType="text"
android:maxLength="20"
android:maxLines="1"
android:paddingStart="30dp"
android:textColor="@color/white"
@@ -271,8 +270,9 @@
app:layout_constraintEnd_toEndOf="parent"
android:background="@color/white"
android:layout_marginTop="@dimen/dp_30"
android:padding="@dimen/dp_10"
android:layout_width="@dimen/dp_369"
android:layout_height="@dimen/dp_360"/>
android:layout_height="@dimen/dp_369"/>
<View
@@ -293,7 +293,7 @@
android:gravity="center_vertical"
android:imeOptions="actionDone"
android:inputType="numberSigned"
android:maxLength="4"
android:maxLength="6"
android:maxLines="1"
android:paddingStart="30dp"
android:textColor="@color/white"
@@ -375,6 +375,9 @@
app:layout_constraintTop_toBottomOf="@+id/biz_actv_f2a_login_title_samll"
app:layout_constraintEnd_toStartOf="@+id/acet_input_number_2"
app:layout_constraintHorizontal_chainStyle="packed"
android:gravity="center"
android:textSize="@dimen/dp_40"
android:textColor="@color/white"
android:layout_marginEnd="@dimen/dp_10"
android:layout_marginTop="@dimen/dp_39"
android:layout_width="@dimen/dp_110"
@@ -387,6 +390,9 @@
app:layout_constraintEnd_toStartOf="@+id/acet_input_number_3"
android:layout_marginStart="@dimen/dp_10"
android:layout_marginEnd="@dimen/dp_10"
android:gravity="center"
android:textSize="@dimen/dp_40"
android:textColor="@color/white"
app:layout_constraintTop_toBottomOf="@+id/biz_actv_f2a_login_title_samll"
android:layout_marginTop="@dimen/dp_39"
android:layout_width="@dimen/dp_110"
@@ -399,11 +405,13 @@
app:layout_constraintEnd_toStartOf="@+id/acet_input_number_4"
android:layout_marginStart="@dimen/dp_10"
android:layout_marginEnd="@dimen/dp_10"
android:gravity="center"
android:textSize="@dimen/dp_40"
android:textColor="@color/white"
app:layout_constraintTop_toBottomOf="@+id/biz_actv_f2a_login_title_samll"
android:layout_marginTop="@dimen/dp_39"
android:layout_width="@dimen/dp_110"
android:layout_height="@dimen/dp_135"/>
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/acet_input_number_4"
android:background="@drawable/biz_login_phone_normal"
@@ -411,6 +419,9 @@
app:layout_constraintEnd_toStartOf="@+id/acet_input_number_5"
android:layout_marginStart="@dimen/dp_10"
android:layout_marginEnd="@dimen/dp_10"
android:gravity="center"
android:textSize="@dimen/dp_40"
android:textColor="@color/white"
app:layout_constraintTop_toBottomOf="@+id/biz_actv_f2a_login_title_samll"
android:layout_marginTop="@dimen/dp_39"
android:layout_width="@dimen/dp_110"
@@ -423,6 +434,9 @@
app:layout_constraintEnd_toStartOf="@+id/acet_input_number_6"
android:layout_marginStart="@dimen/dp_10"
android:layout_marginEnd="@dimen/dp_10"
android:gravity="center"
android:textSize="@dimen/dp_40"
android:textColor="@color/white"
app:layout_constraintTop_toBottomOf="@+id/biz_actv_f2a_login_title_samll"
android:layout_marginTop="@dimen/dp_39"
android:layout_width="@dimen/dp_110"
@@ -434,6 +448,9 @@
app:layout_constraintStart_toEndOf="@+id/acet_input_number_5"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginStart="@dimen/dp_10"
android:gravity="center"
android:textSize="@dimen/dp_40"
android:textColor="@color/white"
app:layout_constraintTop_toBottomOf="@+id/biz_actv_f2a_login_title_samll"
android:layout_marginTop="@dimen/dp_39"
android:layout_width="@dimen/dp_110"

View File

@@ -10,15 +10,21 @@
<string name="biz_login_login_success">Login successful</string>
<string name="biz_login_phone_error">Please enter a correct phone number</string>
<string name="biz_login_code_error">Please enter a correct verification code</string>
<string name="biz_login_pwd_error">Please enter a correct verification password</string>
<string name="biz_login_phone_hint_text">Please enter phone number</string>
<string name="biz_login_get_phone_title">Please enter phone number</string>
<string name="biz_login_pwd_hint_text">Please enter password</string>
<string name="biz_login_reset_password_title_big">Set a new password</string>
<string name="biz_login_reset_password_title">Please set a new password</string>
<string name="biz_login_reset_password_first_text_hide">Positions 14-20, containing numbers and English letters (upper and lower case)</string>
<string name="biz_login_reset_password_second_title">请确认新密码</string>
<string name="biz_login_reset_password_next">Next step</string>
<string name="biz_login_password_will_out_day">The password is about to expire, and it needs to be changed</string>
<string name="biz_login_reset_passwrod_different">The passwords entered twice do not match. Please re-enter</string>
<string name="biz_login_reset_passwrod_non_compliant">The password does not meet the requirements. Please re-enter</string>
<string name="biz_login_reset_passwrod_non_input">Please enter a new password</string>
<string name="biz_login_f2a_title_big">Welcome to sign in</string>
<string name="biz_login_f2a_title">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</string>

View File

@@ -10,14 +10,20 @@
<string name="biz_login_login_success">登录成功</string>
<string name="biz_login_phone_error">请输入正确的手机号</string>
<string name="biz_login_code_error">请输入正确的验证码</string>
<string name="biz_login_pwd_error">请输入正确的密码</string>
<string name="biz_login_phone_hint_text">请输入手机号</string>
<string name="biz_login_get_phone_title">请输入手机号</string>
<string name="biz_login_pwd_hint_text">请输入密码</string>
<string name="biz_login_reset_password_title_big">设置新密码</string>
<string name="biz_login_reset_password_title">请设置新密码</string>
<string name="biz_login_reset_password_first_text_hide">14-20位包含数字、英文大小写</string>
<string name="biz_login_reset_password_second_title">请确认新密码</string>
<string name="biz_login_reset_password_next">下一步</string>
<string name="biz_login_password_will_out_day">密码即将到期,需更改密码</string>
<string name="biz_login_reset_passwrod_different">两次输入的密码不一致,请重新输入</string>
<string name="biz_login_reset_passwrod_non_compliant">密码不符合要求,请重新输入</string>
<string name="biz_login_reset_passwrod_non_input">请输入新密码</string>
<string name="biz_login_f2a_title_big">欢迎登录</string>

View File

@@ -54,6 +54,10 @@ object EnvManager {
return isT1T2() && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)
}
fun isPhoneCodeMode():Boolean{
return FunctionBuildConfig.loginMode==0
}
}

View File

@@ -30,4 +30,10 @@ object OchTransform : CallerBase<OchTransformDispatch>(), IOchBizFunctionCall4Ea
it.value.setVideoView(target)
}
}
override fun onLoginStateChange() {
M_LISTENERS.forEach{
it.value.onLoginModeChange()
}
}
}

View File

@@ -6,4 +6,5 @@ interface OchTransformDispatch {
fun logout(){}
fun setVideoView(target: View?){}
fun onLoginModeChange(){}
}

View File

@@ -90,6 +90,11 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
public void logout() {
TaxiTaskModel.INSTANCE.logout();
}
@Override
public void onLoginModeChange() {
}
};
//导航去订单目的地

View File

@@ -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("\"", "\\\"")}\""
}

View File

@@ -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)

View File

@@ -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
}
/**
* 点云模式
*/

View File

@@ -331,6 +331,18 @@
android:textOn="关闭美化模式"
android:textSize="@dimen/dp_24" />
<ToggleButton
android:id="@+id/tbLoginMode"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/dp_10"
android:background="@drawable/radio_button_normal_background_right"
android:textColor="#000"
android:padding="@dimen/dp_20"
android:textOff="二次验证登录"
android:textOn="手机号验证码登录"
android:textSize="@dimen/dp_24" />
<ToggleButton
android:id="@+id/tbIsRainMode"
android:layout_width="match_parent"

View File

@@ -161,6 +161,11 @@ object FunctionBuildConfig {
@JvmField
var ttsLanguage = 1
@Volatile
@JvmField
var loginMode = 0
/**
* 各车型宣传视频本地配置
* 广告json

View File

@@ -32,6 +32,7 @@ class FuncBizConfig {
const val BIZ_DNPW = "BIZ_DNPW" // 逆向超车预警
// Foundation
const val BIZ_BEAUTY_MODE = "BIZ_BEAUTY_MODE" // 美化模式
const val BIZ_LOGIN_MODE = "BIZ_LOGIN_MODE" // 登录模式
const val BIZ_RAIN_MODE = "BIZ_RAIN_MODE" // 雨天模式
const val BIZ_FULL_LOG = "BIZ_FULL_LOG" // 全量日志
const val BIZ_TRACE_LOG = "BIZ_TRACE_LOG" // 链路日志 todo 暂未有场景,未实现

View File

@@ -14,4 +14,6 @@ interface IOchBizFunctionCall4Eagle {
fun isLogin(): Boolean
fun setVideoView(target: View?)
fun onLoginStateChange()
}

View File

@@ -10,6 +10,12 @@ interface ISopSettingListener {
*/
fun onDemoModeClickEvent(status: Boolean){}
/**
* 美化模式
*/
fun onLoginModeClickEvent(status: Boolean){}
/**
* 雨天模式
*/

View File

@@ -1,7 +1,9 @@
package com.mogo.eagle.core.function.call.och
import android.view.View
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.function.api.och.IOchBizFunctionCall4Eagle
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsFuncConfigListenerManager
/**
* 实现提供给 鹰眼底层 调用的接口
@@ -33,4 +35,13 @@ object CallerOchBizFunctionCall4EagleManager : IOchBizFunctionCall4Eagle {
override fun setVideoView(target: View?) {
ochBizFunctionCall4EagleInstance?.setVideoView(target)
}
override fun onLoginStateChange() {
if(FunctionBuildConfig.loginMode==0){
FunctionBuildConfig.loginMode = 1
}else{
FunctionBuildConfig.loginMode = 0
}
ochBizFunctionCall4EagleInstance?.onLoginStateChange()
}
}