From 8648a9e5334c5cf992cc730fe20b30e5d3a5de1c Mon Sep 17 00:00:00 2001 From: yangyakun Date: Tue, 20 Sep 2022 11:37:20 +0800 Subject: [PATCH] =?UTF-8?q?[2110]=20=E6=8A=BD=E5=8F=96taxi=E5=88=B0common?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OCH/mogo-och-common-module/build.gradle | 22 +++ .../biz}/bean/DriverStatusQueryRespBean.java | 2 +- .../module/biz}/bean/TaxiLoginReqBean.java | 6 +- .../module/biz}/bean/TaxiLoginRespBean.java | 8 +- .../module/biz}/bean/TaxiLoginSmsReqBean.java | 6 +- .../module/biz}/bean/TaxiLogoutReqBean.java | 6 +- .../module/biz/callback/ILoginCallback.java | 9 ++ .../module/biz/callback/ILoginViewCallback.kt | 13 ++ .../biz}/callback/ITaxiLoginCallback.java | 9 +- .../module/biz/constant/LoginStatusManager.kt | 38 +++++ .../module/biz/constant/OchCommonConst.kt | 28 ++++ .../biz}/constant/TaxiLoginStatusEnum.kt | 2 +- .../module/biz/model/OchCommonLoginModel.kt} | 40 +++-- .../model/OchCommonLoginStatusDefaultModel.kt | 41 +++++ .../biz/model/OchCommonLoginStatusModel.java | 128 ++++++++++++++++ .../biz/network/OchCommonServiceApiNew.java | 63 ++++++++ .../biz/network/OchCommonServiceCallback.java | 18 +++ .../biz/network/OchCommonServiceManager.java | 143 ++++++++++++++++++ .../biz/presenter/OchCommonLoginPresenter.kt} | 28 ++-- .../OchCommonLoginStatusDefaultPresenter.kt | 48 ++++++ .../module/biz/provider/LoginService.kt | 29 ++++ .../module/biz/provider/LoginServiceImpl.kt | 109 +++++++++++++ .../module/biz}/ui/TaxiLoginDialogFragment.kt | 14 +- .../color/taxi_login_get_code_text_color.xml | 0 .../res/drawable-xhdpi}/taxi_ic_login_bg.webp | Bin .../res/drawable/taxi_login_bg_selector.xml | 0 .../main/res/drawable/taxi_login_enable.xml | 0 .../taxi_login_get_code_text_color.xml | 0 .../res/drawable/taxi_login_phone_error.xml | 0 .../res/drawable/taxi_login_phone_normal.xml | 0 .../main/res/drawable/taxi_login_unenable.xml | 0 .../src/main/res/layout/taxi_login_view.xml | 0 .../src/main/res/values/colors.xml | 13 ++ .../src/main/res/values/strings.xml | 17 +++ .../src/main/res/values/styles.xml | 21 +++ .../taxi/callback/ITaxiCarStatusCallback.java | 2 - .../com/mogo/och/taxi/constant/TaxiConst.kt | 1 - .../taxi/constant/TaxtServingStatusManager.kt | 38 +++++ .../com/mogo/och/taxi/model/TaxiModel.java | 124 ++------------- .../och/taxi/network/TaxiServiceApiNew.java | 45 ------ .../och/taxi/network/TaxiServiceManager.java | 72 --------- .../och/taxi/presenter/TaxiPresenter.java | 64 ++++---- .../com/mogo/och/taxi/ui/TaxiFragment.java | 73 +++------ .../com/mogo/och/taxi/utils/StatusManager.kt | 73 --------- .../taxi_ic_login_bg.webp | Bin 44568 -> 0 bytes .../res/drawable-xhdpi/taxi_ic_login_bg.webp | Bin 44568 -> 0 bytes .../src/main/res/values/colors.xml | 10 -- .../src/main/res/values/strings.xml | 11 -- .../src/main/res/values/styles.xml | 18 --- 49 files changed, 896 insertions(+), 496 deletions(-) rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz}/bean/DriverStatusQueryRespBean.java (90%) rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz}/bean/TaxiLoginReqBean.java (81%) rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz}/bean/TaxiLoginRespBean.java (54%) rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz}/bean/TaxiLoginSmsReqBean.java (54%) rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz}/bean/TaxiLogoutReqBean.java (77%) create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginCallback.java create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginViewCallback.kt rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz}/callback/ITaxiLoginCallback.java (58%) create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/LoginStatusManager.kt create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/OchCommonConst.kt rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz}/constant/TaxiLoginStatusEnum.kt (90%) rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiLoginModel.kt => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginModel.kt} (78%) create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusDefaultModel.kt create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusModel.java create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceApiNew.java create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceCallback.java create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceManager.java rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiLoginPresenter.kt => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginPresenter.kt} (79%) create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginStatusDefaultPresenter.kt create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginService.kt create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginServiceImpl.kt rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz}/ui/TaxiLoginDialogFragment.kt (96%) rename OCH/{mogo-och-taxi => mogo-och-common-module}/src/main/res/color/taxi_login_get_code_text_color.xml (100%) rename OCH/{mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440 => mogo-och-common-module/src/main/res/drawable-xhdpi}/taxi_ic_login_bg.webp (100%) rename OCH/{mogo-och-taxi => mogo-och-common-module}/src/main/res/drawable/taxi_login_bg_selector.xml (100%) rename OCH/{mogo-och-taxi => mogo-och-common-module}/src/main/res/drawable/taxi_login_enable.xml (100%) rename OCH/{mogo-och-taxi => mogo-och-common-module}/src/main/res/drawable/taxi_login_get_code_text_color.xml (100%) rename OCH/{mogo-och-taxi => mogo-och-common-module}/src/main/res/drawable/taxi_login_phone_error.xml (100%) rename OCH/{mogo-och-taxi => mogo-och-common-module}/src/main/res/drawable/taxi_login_phone_normal.xml (100%) rename OCH/{mogo-och-taxi => mogo-och-common-module}/src/main/res/drawable/taxi_login_unenable.xml (100%) rename OCH/{mogo-och-taxi => mogo-och-common-module}/src/main/res/layout/taxi_login_view.xml (100%) create mode 100644 OCH/mogo-och-common-module/src/main/res/values/colors.xml create mode 100644 OCH/mogo-och-common-module/src/main/res/values/strings.xml create mode 100644 OCH/mogo-och-common-module/src/main/res/values/styles.xml create mode 100644 OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxtServingStatusManager.kt delete mode 100644 OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/StatusManager.kt delete mode 100644 OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1600/taxi_ic_login_bg.webp delete mode 100644 OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_ic_login_bg.webp diff --git a/OCH/mogo-och-common-module/build.gradle b/OCH/mogo-och-common-module/build.gradle index 1f74335527..927d871c22 100644 --- a/OCH/mogo-och-common-module/build.gradle +++ b/OCH/mogo-och-common-module/build.gradle @@ -1,6 +1,8 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'kotlin-kapt' +apply plugin: 'com.alibaba.arouter' android { compileSdkVersion 31 @@ -14,6 +16,22 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles "consumer-rules.pro" + //ARouter apt 参数 + kapt { + useBuildCache = false + arguments { + arg("AROUTER_MODULE_NAME", project.getName()) + } + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = "1.8" } buildTypes { @@ -34,6 +52,10 @@ dependencies { androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' implementation rootProject.ext.dependencies.amapnavi3dmap + implementation rootProject.ext.dependencies.rxandroid + + implementation rootProject.ext.dependencies.arouter + kapt rootProject.ext.dependencies.aroutercompiler if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { implementation rootProject.ext.dependencies.mogoutils diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/DriverStatusQueryRespBean.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/DriverStatusQueryRespBean.java similarity index 90% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/DriverStatusQueryRespBean.java rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/DriverStatusQueryRespBean.java index ac630c9ecf..903fece224 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/DriverStatusQueryRespBean.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/DriverStatusQueryRespBean.java @@ -1,4 +1,4 @@ -package com.mogo.och.taxi.bean; +package com.mogo.och.common.module.biz.bean; import com.mogo.eagle.core.data.BaseData; diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginReqBean.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginReqBean.java similarity index 81% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginReqBean.java rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginReqBean.java index 0591d3f878..ebe1fa2731 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginReqBean.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginReqBean.java @@ -1,8 +1,8 @@ -package com.mogo.och.taxi.bean; +package com.mogo.och.common.module.biz.bean; /** - * Created by pangfan on 2021/8/19 - * 司机端准备好或者乘客已验证上车请求参数 + * Created by yangyakun on 2021/8/19 + * 通过手机号验证码登录 */ public class TaxiLoginReqBean { diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginRespBean.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginRespBean.java similarity index 54% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginRespBean.java rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginRespBean.java index c1265a9be3..9cda2a96c6 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginRespBean.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginRespBean.java @@ -1,14 +1,14 @@ -package com.mogo.och.taxi.bean; +package com.mogo.och.common.module.biz.bean; import com.mogo.eagle.core.data.BaseData; /** - * Created by pangfan on 2021/8/19 - * 司机端准备好或者乘客已验证上车请求参数 + * Created by yangyakun on 2021/8/19 + * 通过验证码登录 */ public class TaxiLoginRespBean extends BaseData { - public TaxiLoginRespBean.Result data; + public Result data; public static class Result { public Double lat; diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginSmsReqBean.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginSmsReqBean.java similarity index 54% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginSmsReqBean.java rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginSmsReqBean.java index 3a4d4d7a4f..3c246bc153 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginSmsReqBean.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginSmsReqBean.java @@ -1,8 +1,8 @@ -package com.mogo.och.taxi.bean; +package com.mogo.och.common.module.biz.bean; /** - * Created by pangfan on 2021/8/19 - * 司机端准备好或者乘客已验证上车请求参数 + * Created by yyk on 2021/8/19 + * 获取验证码 */ public class TaxiLoginSmsReqBean { diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLogoutReqBean.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLogoutReqBean.java similarity index 77% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLogoutReqBean.java rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLogoutReqBean.java index ced9b2eddb..22e63dd838 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLogoutReqBean.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLogoutReqBean.java @@ -1,8 +1,8 @@ -package com.mogo.och.taxi.bean; +package com.mogo.och.common.module.biz.bean; /** - * Created by pangfan on 2021/8/19 - * 司机端准备好或者乘客已验证上车请求参数 + * Created by yyk on 2021/8/19 + * 登出请求参数 */ public class TaxiLogoutReqBean { public String sn; diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginCallback.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginCallback.java new file mode 100644 index 0000000000..481a2cd75b --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginCallback.java @@ -0,0 +1,9 @@ +package com.mogo.och.common.module.biz.callback; + +import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean; + +public interface ILoginCallback { + void loginSuccess(DriverStatusQueryRespBean data); + + void loginFail(boolean isLogin); +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginViewCallback.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginViewCallback.kt new file mode 100644 index 0000000000..033e900e77 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginViewCallback.kt @@ -0,0 +1,13 @@ +package com.mogo.och.common.module.biz.callback + +interface ILoginViewCallback { + /** + * 展示登录页面 + */ + fun showLoginDialogFragment() + + /** + * 隐藏登录页面 + */ + fun hideLoginDialogFragment() +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiLoginCallback.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ITaxiLoginCallback.java similarity index 58% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiLoginCallback.java rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ITaxiLoginCallback.java index a8f35171cb..5cbca0d853 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiLoginCallback.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ITaxiLoginCallback.java @@ -1,11 +1,4 @@ -package com.mogo.och.taxi.callback; - -import androidx.annotation.NonNull; - -import com.mogo.och.taxi.bean.OrderQueryRespBean; -import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean; - -import java.util.List; +package com.mogo.och.common.module.biz.callback; /** * Created on 2021/9/8 diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/LoginStatusManager.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/LoginStatusManager.kt new file mode 100644 index 0000000000..8f290529b7 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/LoginStatusManager.kt @@ -0,0 +1,38 @@ +package com.mogo.och.common.module.biz.constant + +object LoginStatusManager { + /** + * 登录状态 + */ + private var loginStatus: TaxiLoginStatusEnum = TaxiLoginStatusEnum.None + + @JvmStatic + fun setLoginStatus(status: Int) { + when (status) { + 0 -> { + this.loginStatus = TaxiLoginStatusEnum.Logout + } + 1 -> { + this.loginStatus = TaxiLoginStatusEnum.Login + } + else -> { + this.loginStatus = TaxiLoginStatusEnum.None + } + } + } + @JvmStatic + fun setLoginStatus(loginStatus: TaxiLoginStatusEnum) { + this.loginStatus = loginStatus + } + @JvmStatic + fun getLoginStatus(): TaxiLoginStatusEnum { + return loginStatus + } + @JvmStatic + fun isLogin():Boolean { + if(loginStatus== TaxiLoginStatusEnum.Login){ + return true + } + return false + } +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/OchCommonConst.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/OchCommonConst.kt new file mode 100644 index 0000000000..55a0b5cc2a --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/OchCommonConst.kt @@ -0,0 +1,28 @@ +package com.mogo.och.common.module.biz.constant + +import com.mogo.commons.debug.DebugConfig + +/** + * Created on 2021/12/6 + */ +class OchCommonConst { + companion object { + + private const val BASE_URL_OCH_DEV = "http://tech-dev.zhidaohulian.com" + private const val BASE_URL_OCH_QA = "https://tech-qa.zhidaohulian.com" + private const val BASE_URL_OCH_RELEASE = "https://tech.zhidaohulian.com" + + @JvmStatic + fun getBaseUrl(): String { + return when (DebugConfig.getNetMode()) { + DebugConfig.NET_MODE_DEV, DebugConfig.NET_MODE_DEMO -> BASE_URL_OCH_DEV + DebugConfig.NET_MODE_QA -> BASE_URL_OCH_QA + DebugConfig.NET_MODE_RELEASE -> BASE_URL_OCH_RELEASE + else -> BASE_URL_OCH_RELEASE + } + } + // token 失效 重新获取token + const val WAIT_TAKEN = 100046 + + } +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxiLoginStatusEnum.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/TaxiLoginStatusEnum.kt similarity index 90% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxiLoginStatusEnum.kt rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/TaxiLoginStatusEnum.kt index 5e19782f5e..451196d777 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxiLoginStatusEnum.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/TaxiLoginStatusEnum.kt @@ -1,4 +1,4 @@ -package com.mogo.och.taxi.constant +package com.mogo.och.common.module.biz.constant /** * Created on 2022/08/19 diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiLoginModel.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginModel.kt similarity index 78% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiLoginModel.kt rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginModel.kt index bdef0b53fd..08f1acc43f 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiLoginModel.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginModel.kt @@ -1,21 +1,20 @@ -package com.mogo.och.taxi.model +package com.mogo.och.common.module.biz.model import android.annotation.SuppressLint import android.content.Context import com.mogo.eagle.core.data.BaseData import com.mogo.eagle.core.utilcode.util.NetworkUtils -import com.mogo.och.taxi.model.TaxiLoginModel -import com.mogo.och.taxi.callback.ITaxiLoginCallback -import com.mogo.module.common.MogoApisHandler -import com.mogo.map.navi.IMogoCarLocationChangedListener2 -import com.mogo.och.taxi.network.TaxiServiceManager -import com.mogo.och.taxi.network.TaxiServiceCallback import com.mogo.eagle.core.utilcode.util.ToastUtils -import com.mogo.och.taxi.R -import com.mogo.och.taxi.bean.TaxiLoginReqBean -import com.mogo.och.taxi.bean.TaxiLoginRespBean -import com.mogo.och.taxi.constant.TaxiLoginStatusEnum -import com.mogo.och.taxi.utils.StatusManager +import com.mogo.map.navi.IMogoCarLocationChangedListener2 +import com.mogo.module.common.MogoApisHandler +import com.mogo.och.common.module.R +import com.mogo.och.common.module.biz.bean.TaxiLoginReqBean +import com.mogo.och.common.module.biz.bean.TaxiLoginRespBean +import com.mogo.och.common.module.biz.callback.ITaxiLoginCallback +import com.mogo.och.common.module.biz.constant.TaxiLoginStatusEnum +import com.mogo.och.common.module.biz.constant.LoginStatusManager +import com.mogo.och.common.module.biz.network.OchCommonServiceCallback +import com.mogo.och.common.module.biz.network.OchCommonServiceManager /** * Created by pangfan on 2021/8/19 @@ -24,7 +23,7 @@ import com.mogo.och.taxi.utils.StatusManager * 网约车 - 出租车业务逻辑处理 */ @SuppressLint("StaticFieldLeak") -object TaxiLoginModel{ +object OchCommonLoginModel{ private val TAG = "TaxiLoginModel" private var mContext: Context? = null @@ -34,10 +33,7 @@ object TaxiLoginModel{ fun init(context: Context) { mContext = context.applicationContext // 达到起始站围栏监听 - MogoApisHandler.getInstance() - .apis - .registerCenterApi - .registerCarLocationChangedListener(TAG, mCarLocationChangedListener2) + MogoApisHandler.getInstance().apis.registerCenterApi.registerCarLocationChangedListener(TAG, mCarLocationChangedListener2) } fun hasInit():Boolean{ @@ -73,8 +69,8 @@ object TaxiLoginModel{ * 获取手机验证码 */ fun getPhoneCode(phone: String?) { - TaxiServiceManager.getInstance().getPhoneCode(mContext, phone, - object : TaxiServiceCallback { + OchCommonServiceManager.getInstance().getPhoneCode(mContext, phone, + object : OchCommonServiceCallback { override fun onSuccess(data: BaseData?) { if (null != data && 0 == data.code) { // 获取验证码成功 @@ -103,13 +99,13 @@ object TaxiLoginModel{ fun gotoLogin(phone: String, code: String) { val location4Login = TaxiLoginReqBean.Location4Login(mLatitude, mLongitude) - TaxiServiceManager.getInstance().gotoLoginBycode(mContext, phone, code, location4Login, - object : TaxiServiceCallback { + OchCommonServiceManager.getInstance().gotoLoginBycode(mContext, phone, code, location4Login, + object : OchCommonServiceCallback { override fun onSuccess(data: TaxiLoginRespBean?) { if (null != data && 0 == data.code) { // 获取验证码成功 ToastUtils.showShort(mContext?.getString(R.string.module_och_taxi_login_login_success)) - StatusManager.setLoginStatus(TaxiLoginStatusEnum.Login) + LoginStatusManager.setLoginStatus(TaxiLoginStatusEnum.Login) iTaxiLoginCallback?.loginSuccess() } else { if (data != null) { diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusDefaultModel.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusDefaultModel.kt new file mode 100644 index 0000000000..c935981982 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusDefaultModel.kt @@ -0,0 +1,41 @@ +package com.mogo.och.common.module.biz.model + +import android.annotation.SuppressLint +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean +import com.mogo.och.common.module.biz.callback.ILoginCallback +import com.mogo.och.common.module.biz.callback.ILoginViewCallback +import com.mogo.och.common.module.biz.constant.LoginStatusManager + +@SuppressLint("StaticFieldLeak") +object OchCommonLoginStatusDefaultModel : OchCommonLoginStatusModel() { + + + const val TAG = "OchCommonLoginStatusDefaultModel" + + + var loginCallback: ILoginCallback? = null + var loginViewCallback: ILoginViewCallback? = null + + override fun loginSuccess(data: DriverStatusQueryRespBean?) { + CallerLogger.d(SceneConstant.M_TAXI + TAG, "loginSuccess:${LoginStatusManager.isLogin()}") + if (LoginStatusManager.isLogin()) { + loginViewCallback?.hideLoginDialogFragment() + } else { + loginViewCallback?.showLoginDialogFragment() + } + loginCallback?.loginSuccess(data) + } + + override fun loginFail(isLogin: Boolean) { + CallerLogger.d(SceneConstant.M_TAXI + TAG, "loginFail:$isLogin") + if (isLogin) { + loginViewCallback?.hideLoginDialogFragment() + } else { + loginViewCallback?.showLoginDialogFragment() + } + loginCallback?.loginFail(isLogin) + } + +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusModel.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusModel.java new file mode 100644 index 0000000000..0b1e9f0bfb --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusModel.java @@ -0,0 +1,128 @@ +package com.mogo.och.common.module.biz.model; + +import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI; + +import android.content.Context; + +import com.mogo.commons.AbsMogoApplication; +import com.mogo.eagle.core.data.BaseData; +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; +import com.mogo.eagle.core.utilcode.util.NetworkUtils; +import com.mogo.eagle.core.utilcode.util.ToastUtils; +import com.mogo.och.common.module.R; +import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean; +import com.mogo.och.common.module.biz.bean.TaxiLogoutReqBean; +import com.mogo.och.common.module.biz.constant.LoginStatusManager; +import com.mogo.och.common.module.biz.constant.OchCommonConst; +import com.mogo.och.common.module.biz.network.OchCommonServiceCallback; +import com.mogo.och.common.module.biz.network.OchCommonServiceManager; +import com.mogo.och.common.module.utils.ToastUtilsOch; + +import java.util.concurrent.TimeUnit; + +import io.reactivex.Observable; +import io.reactivex.disposables.Disposable; + +public abstract class OchCommonLoginStatusModel { + + private static final String TAG = "OchCommonLoginStatusModel"; + + protected Context mContext; + + private Disposable subscribe; + + + public void init() { + mContext = AbsMogoApplication.getApp(); + queryCarStatus(); + } + + protected abstract void loginSuccess(DriverStatusQueryRespBean data); + + protected abstract void loginFail(boolean isLogin); + + /** + * 接单状态和登录状态查询 + * 1、初始化查询 + * 2、错误重试 + * 3、错误重试 + * 4、登出后重试 + * 5、变更出车状态查下 + * 6、变更出车状态查下 + * 7、网络状态变更后查询 + * 8、登录页面关闭后查下状态 + */ + public void queryCarStatus() { + OchCommonServiceManager.getInstance().queryDriverServiceStatus(mContext, + new OchCommonServiceCallback() { + @Override + public void onSuccess(DriverStatusQueryRespBean data) { + if (null != data && 0 == data.code) { + LoginStatusManager.setLoginStatus(data.data.driverStatus); + CallerLogger.INSTANCE.d(M_TAXI + TAG, "changeCarStatus:" + LoginStatusManager.getLoginStatus()); + loginSuccess(data); + } + } + + @Override + public void onError() { + if (!NetworkUtils.isConnected(mContext)) { + ToastUtils.showShort(mContext.getString(R.string.network_error_tip)); + } else { + ToastUtils.showShort(mContext.getString(R.string.request_error_tip)); + } + subscribe = Observable.timer(5, TimeUnit.SECONDS).subscribe(aLong -> { + queryCarStatus(); + }); + } + + @Override + public void onFail(int code, String msg) { + ToastUtilsOch.showWithCodeMessage(code,msg); + if(code== OchCommonConst.WAIT_TAKEN){ + subscribe = Observable.timer(3, TimeUnit.SECONDS).subscribe(aLong -> { + queryCarStatus(); + }); + }else { + loginFail(LoginStatusManager.isLogin()); + } + } + }); + } + + // 登出 + public void logout(double mLatitude,double mLongitude) { + TaxiLogoutReqBean.Location4Login location4Login = new TaxiLogoutReqBean.Location4Login(mLatitude, mLongitude); + OchCommonServiceManager.getInstance().logout(mContext,location4Login, + new OchCommonServiceCallback() { + @Override + public void onSuccess(BaseData data) { + if (null != data && 0 == data.code) { + loginFail(false); + queryCarStatus(); + } + } + + @Override + public void onError() { + if (!NetworkUtils.isConnected(mContext)) { + ToastUtils.showShort(mContext.getString(R.string.network_error_tip)); + } else { + ToastUtils.showShort(mContext.getString(R.string.request_error_tip)); + } + } + + @Override + public void onFail(int code, String msg) { + ToastUtilsOch.showWithCodeMessage(code,msg); + } + }); + } + + public void release() { + if(subscribe!=null&&!subscribe.isDisposed()){ + subscribe.dispose(); + } + } + +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceApiNew.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceApiNew.java new file mode 100644 index 0000000000..da32fc85be --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceApiNew.java @@ -0,0 +1,63 @@ +package com.mogo.och.common.module.biz.network; +import com.mogo.eagle.core.data.BaseData; +import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean; +import com.mogo.och.common.module.biz.bean.TaxiLoginReqBean; +import com.mogo.och.common.module.biz.bean.TaxiLoginRespBean; +import com.mogo.och.common.module.biz.bean.TaxiLoginSmsReqBean; +import com.mogo.och.common.module.biz.bean.TaxiLogoutReqBean; + +import io.reactivex.Observable; +import retrofit2.http.Body; +import retrofit2.http.GET; +import retrofit2.http.Header; +import retrofit2.http.Headers; +import retrofit2.http.POST; +import retrofit2.http.Query; + +/** + * Created by pangfan on 2021/8/19 + * + * 网约车-出租车接口定义 + */ +interface OchCommonServiceApiNew { + /** + * 获取手机验证码 + * + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) +// @GET( "/autopilot-car-hailing/api/v1/driver/serviceStatus/query" ) + @POST( "/autopilot-car-hailing/driver/v2/driver/taxi/sendSms" ) + Observable getPhoneCode(@Header("appId") String appId + , @Header("ticket") String ticket, @Body TaxiLoginSmsReqBean data); + /** + * 通过验证码登录 + * @param appId + * @param ticket + * @param data + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) + @POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/startOperation" ) + Observable gotoLoginBycode(@Header("appId") String appId + , @Header("ticket") String ticket, @Body TaxiLoginReqBean data); + /** + * 登出接口 + */ + @Headers({"Content-type:application/json;charset=UTF-8"}) + @POST("/autopilot-car-hailing/cab/flow/v1/driver/taxi/endOperation") + Observable logout(@Header("appId") String appId, @Header("ticket") String ticket, + @Body TaxiLogoutReqBean data); + + /** + * 接单状态和登录状态查询 + * @param sn + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) +// @GET( "/autopilot-car-hailing/api/v1/driver/serviceStatus/query" ) + @GET( "/autopilot-car-hailing/operation/v1/driver/taxi/loginStatus" ) + Observable queryDriverServiceStatusAndLoginStatus(@Header ("appId") String appId + ,@Header("ticket") String ticket,@Query("sn") String sn); + +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceCallback.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceCallback.java new file mode 100644 index 0000000000..8433def5f0 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceCallback.java @@ -0,0 +1,18 @@ +package com.mogo.och.common.module.biz.network; + +/** + * @author congtaowang + * @since 2021/1/15 + * + * 修改订单状态回调接口 + */ +public interface OchCommonServiceCallback< T > { + + void onSuccess(T data); + + void onFail(int code, String msg); + + default void onError() { + + } +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceManager.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceManager.java new file mode 100644 index 0000000000..668f781253 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceManager.java @@ -0,0 +1,143 @@ +package com.mogo.och.common.module.biz.network; + +import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI; + +import android.content.Context; + +import com.mogo.cloud.passport.MoGoAiCloudClient; +import com.mogo.cloud.passport.MoGoAiCloudClientConfig; +import com.mogo.eagle.core.data.BaseData; +import com.mogo.eagle.core.network.MoGoRetrofitFactory; +import com.mogo.eagle.core.network.RequestOptions; +import com.mogo.eagle.core.network.SubscribeImpl; +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; +import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean; +import com.mogo.och.common.module.biz.bean.TaxiLoginReqBean; +import com.mogo.och.common.module.biz.bean.TaxiLoginRespBean; +import com.mogo.och.common.module.biz.bean.TaxiLoginSmsReqBean; +import com.mogo.och.common.module.biz.bean.TaxiLogoutReqBean; +import com.mogo.och.common.module.biz.constant.OchCommonConst; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +/** + * Created by pangfan on 2021/8/19 + */ +public class OchCommonServiceManager { + private static final String TAG = OchCommonServiceManager.class.getSimpleName(); + + private static final class SingletonHolder { + private static final OchCommonServiceManager INSTANCE = new OchCommonServiceManager(); + } + + public static OchCommonServiceManager getInstance() { + return SingletonHolder.INSTANCE; + } + + private OchCommonServiceApiNew mOCHTaxiServiceApi; + + private OchCommonServiceManager() { + if (mOCHTaxiServiceApi == null){ + mOCHTaxiServiceApi = MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create(OchCommonServiceApiNew.class); + } + } + + /** + * 获取手机验证码 + * @param context + * @param callback + */ + public void getPhoneCode(Context context,String phone, + OchCommonServiceCallback callback) { + mOCHTaxiServiceApi.getPhoneCode(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + , MoGoAiCloudClientConfig.getInstance().getToken() + , new TaxiLoginSmsReqBean(phone)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context, callback, "getPhoneCode")); + } + /** + * 通过验证码登录 + * @param context + * @param callback + */ + public void gotoLoginBycode(Context context, String phone, String code, + TaxiLoginReqBean.Location4Login location4Login, + OchCommonServiceCallback callback) { + String sn = MoGoAiCloudClientConfig.getInstance().getSn(); + mOCHTaxiServiceApi.gotoLoginBycode(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + , MoGoAiCloudClientConfig.getInstance().getToken() + , new TaxiLoginReqBean(phone, code, sn, location4Login)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context, callback, "gotoLoginBycode")); + } + + /** + * 登出 + */ + public void logout(Context context, TaxiLogoutReqBean.Location4Login location4Login, OchCommonServiceCallback callback) { + mOCHTaxiServiceApi.logout( + MoGoAiCloudClientConfig.getInstance().getServiceAppId(), + MoGoAiCloudClientConfig.getInstance().getToken(), + new TaxiLogoutReqBean(MoGoAiCloudClientConfig.getInstance().getSn(), location4Login)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context, callback, "logout")); + } + + /** + * 接单状态和登录状态查询 + * @param context + * @param callback + */ + public void queryDriverServiceStatus(Context context, + OchCommonServiceCallback callback) { + if(MoGoAiCloudClientConfig.getInstance().getToken().isEmpty()){ + callback.onFail(OchCommonConst.WAIT_TAKEN,"等待令牌中请稍等"); + MoGoAiCloudClient.getInstance().refreshToken(); + return; + } + mOCHTaxiServiceApi.queryDriverServiceStatusAndLoginStatus(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + ,MoGoAiCloudClientConfig.getInstance().getSn()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context, callback, "queryDriverServiceStatus")); + } + + + + private SubscribeImpl getSubscribeImpl( + Context context, OchCommonServiceCallback callback, String apiName) { + return new SubscribeImpl(RequestOptions.create(context)) { + @Override + public void onSuccess(T o) { + super.onSuccess(o); + CallerLogger.INSTANCE.d(M_TAXI + TAG,apiName + ": onSuccess() " + o.msg); + if (callback != null) { + callback.onSuccess(o); + } + } + + @Override + public void onError(Throwable e) { + super.onError(e); + CallerLogger.INSTANCE.e(M_TAXI + TAG,apiName + ": onError() " + e.getMessage()); + if (callback != null) { + callback.onError(); + } + } + + @Override + public void onError(String message, int code) { + super.onError(message, code); + CallerLogger.INSTANCE.e(M_TAXI + TAG,String.format(apiName + ": onError() code = %d; message = %s;", code, message)); + if (callback != null) { + callback.onFail(code, message); + } + } + }; + } +} diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiLoginPresenter.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginPresenter.kt similarity index 79% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiLoginPresenter.kt rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginPresenter.kt index 1497683ddc..49b8446a77 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiLoginPresenter.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginPresenter.kt @@ -1,4 +1,4 @@ -package com.mogo.och.taxi.presenter +package com.mogo.och.common.module.biz.presenter import androidx.lifecycle.LifecycleOwner import com.mogo.commons.AbsMogoApplication @@ -7,10 +7,10 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.RegexUtils import com.mogo.eagle.core.utilcode.util.ToastUtils -import com.mogo.och.taxi.R -import com.mogo.och.taxi.callback.ITaxiLoginCallback -import com.mogo.och.taxi.model.TaxiLoginModel -import com.mogo.och.taxi.ui.TaxiLoginDialogFragment +import com.mogo.och.common.module.R +import com.mogo.och.common.module.biz.ui.TaxiLoginDialogFragment +import com.mogo.och.common.module.biz.callback.ITaxiLoginCallback +import com.mogo.och.common.module.biz.model.OchCommonLoginModel import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable @@ -23,7 +23,7 @@ import java.util.concurrent.TimeUnit * * 描述 */ -class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) : +class OchCommonLoginPresenter(view: TaxiLoginDialogFragment?) : Presenter(view), ITaxiLoginCallback { private var countDownDisposable: Disposable? = null @@ -33,12 +33,12 @@ class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) : } private fun initListeners() { - TaxiLoginModel.init(AbsMogoApplication.getApp()) - TaxiLoginModel.setiTaxiLoginCallback(this) + OchCommonLoginModel.init(AbsMogoApplication.getApp()) + OchCommonLoginModel.setiTaxiLoginCallback(this) } fun getPhoneCode(phone:String){ - if(!TaxiLoginModel.hasInit()){ + if(!OchCommonLoginModel.hasInit()){ initListeners() } if (!RegexUtils.isMobileExact(phone)) { @@ -46,7 +46,7 @@ class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) : mView?.inputPhoneError() return } - TaxiLoginModel.getPhoneCode(phone) + OchCommonLoginModel.getPhoneCode(phone) } override fun onCreate(owner: LifecycleOwner) { @@ -58,7 +58,7 @@ class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) : override fun onDestroy(owner: LifecycleOwner) { super.onDestroy(owner) - TaxiLoginModel.release() + OchCommonLoginModel.release() countDownDisposable?.let { if (!it.isDisposed) { it.dispose() @@ -67,7 +67,7 @@ class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) : } companion object { - private val TAG = TaxiLoginPresenter::class.java.simpleName + private val TAG = OchCommonLoginPresenter::class.java.simpleName } override fun getPhoneCodeSuccess() { @@ -94,7 +94,7 @@ class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) : } fun gotoLogin(phone: String, code: String) { - if(!TaxiLoginModel.hasInit()){ + if(!OchCommonLoginModel.hasInit()){ initListeners() } if (!RegexUtils.isMobileExact(phone)) { @@ -107,6 +107,6 @@ class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) : return } mView?.closeSoftInput() - TaxiLoginModel.gotoLogin(phone,code) + OchCommonLoginModel.gotoLogin(phone,code) } } \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginStatusDefaultPresenter.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginStatusDefaultPresenter.kt new file mode 100644 index 0000000000..a4c77ec190 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginStatusDefaultPresenter.kt @@ -0,0 +1,48 @@ +package com.mogo.och.common.module.biz.presenter + +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleObserver +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.OnLifecycleEvent +import com.mogo.och.common.module.biz.callback.ILoginCallback +import com.mogo.och.common.module.biz.callback.ILoginViewCallback +import com.mogo.och.common.module.biz.model.OchCommonLoginStatusDefaultModel + +/** + * @author yangyakun + * @since 2020-09-19 + */ +class OchCommonLoginStatusDefaultPresenter : LifecycleObserver { + private var isFirstShow = true + + @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) + fun onCreate(owner: LifecycleOwner) { + OchCommonLoginStatusDefaultModel.init() + } + + @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) + fun onResume(owner: LifecycleOwner) { + if (isFirstShow) { + isFirstShow = false + } else { + queryLoginStatus() + } + } + @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) + fun onDestory(owner: LifecycleOwner) { + OchCommonLoginStatusDefaultModel.release() + } + + fun queryLoginStatus() { + OchCommonLoginStatusDefaultModel.queryCarStatus() + } + + fun logOut(mLatitude:Double,mLongitude:Double){ + OchCommonLoginStatusDefaultModel.logout(mLatitude, mLongitude) + } + + fun setLoginCallback(loginCallback: ILoginCallback?,loginViewCallback: ILoginViewCallback?){ + OchCommonLoginStatusDefaultModel.loginCallback = loginCallback + OchCommonLoginStatusDefaultModel.loginViewCallback = loginViewCallback + } +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginService.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginService.kt new file mode 100644 index 0000000000..a311da107f --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginService.kt @@ -0,0 +1,29 @@ +package com.mogo.och.common.module.biz.provider + +import androidx.fragment.app.Fragment +import com.alibaba.android.arouter.facade.template.IProvider +import com.mogo.och.common.module.biz.callback.ILoginCallback + +interface LoginService : IProvider { + /** + * 注册页面 + * @param fragment 主页面 + * @param callback 回调 + */ + fun registerFragment(fragment: Fragment?,loginCallback: ILoginCallback?) + + fun unRegisterFragment() + + /** + * 查询登录状态 + */ + fun queryLoginStatus():Boolean + + fun queryLoginStatusByNet() + + /** + * 登出 + */ + fun loginOut(mLatitude:Double,mLongitude:Double) + +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginServiceImpl.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginServiceImpl.kt new file mode 100644 index 0000000000..dcbe881200 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginServiceImpl.kt @@ -0,0 +1,109 @@ +package com.mogo.och.common.module.biz.provider + +import android.content.Context +import android.content.DialogInterface +import androidx.fragment.app.DialogFragment +import androidx.fragment.app.Fragment +import com.alibaba.android.arouter.facade.annotation.Route +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.eagle.core.utilcode.util.AppStateManager.currentActivity +import com.mogo.och.common.module.biz.callback.ILoginCallback +import com.mogo.och.common.module.biz.callback.ILoginViewCallback +import com.mogo.och.common.module.biz.constant.LoginStatusManager +import com.mogo.och.common.module.biz.presenter.OchCommonLoginStatusDefaultPresenter +import com.mogo.och.common.module.biz.ui.TaxiLoginDialogFragment +import com.mogo.och.common.module.biz.ui.TaxiLoginDialogFragment.Companion.newInstance +import java.lang.ref.WeakReference + +@Route(path = "/ochbiz/common/login") +class LoginServiceImpl : LoginService,ILoginViewCallback { + + companion object{ + const val TAG = "LoginServiceImpl" + } + + private var fragment: Fragment?=null + private var taxiLoginDialogFragment: WeakReference? = null + private var presenter: OchCommonLoginStatusDefaultPresenter?=null + + override fun init(context: Context) { + + } + + override fun registerFragment(fragment: Fragment?,loginCallback: ILoginCallback?) { + presenter = OchCommonLoginStatusDefaultPresenter() + this.fragment = fragment + presenter?.let { + it.setLoginCallback(loginCallback, this) + this.fragment?.lifecycle?.addObserver(it) + } + + } + + override fun unRegisterFragment() { + this.presenter?.let { + it.setLoginCallback(null,null) + this.fragment?.lifecycle?.removeObserver(it) + } + this.fragment = null + } + + + override fun showLoginDialogFragment() { + fragment?.let { + CallerHmiManager.hideToolsView() + val parentFragmentManager = it.parentFragmentManager + val fragmentByTag: Fragment? = parentFragmentManager.findFragmentByTag(TAG) + if (fragmentByTag is DialogFragment) { + if (fragmentByTag.dialog != null && fragmentByTag.dialog!!.isShowing) { + return + } + if (fragmentByTag.dialog != null && fragmentByTag.isAdded) { + if (currentActivity() == null) { // 没有在当前应用内 在启动页面关闭应用 + d(SceneConstant.M_TAXI + TAG, "showLoginDialogFragment 权限验证") + return + } + } + } + + if (taxiLoginDialogFragment?.get() == null) { + taxiLoginDialogFragment = WeakReference(newInstance()) + } + val taxiLoginDialog = taxiLoginDialogFragment?.get() + if (taxiLoginDialog != null) { + if (taxiLoginDialog.dialog != null && taxiLoginDialog.dialog!!.isShowing) { + return + } + if (taxiLoginDialog.isAdded) { //解决方法就是添加这行代码,如果已经添加了,就移除掉然后再show,就不会出现Fragment already added的错误了。 + parentFragmentManager.beginTransaction().remove(taxiLoginDialog) + .commitAllowingStateLoss() + } + d(SceneConstant.M_TAXI + TAG, "showLoginDialogFragment 展示登录界面") + taxiLoginDialog.show(parentFragmentManager, TAG) + taxiLoginDialog.setOnDismissListener(DialogInterface.OnDismissListener { dialog: DialogInterface? -> + taxiLoginDialogFragment?.clear() + presenter?.queryLoginStatus() + }) + } + } + } + override fun hideLoginDialogFragment() { + d(SceneConstant.M_TAXI + TAG, "hideLoginDialogFragment 隐藏登录界面") + if (taxiLoginDialogFragment?.get() != null) { + taxiLoginDialogFragment?.get()?.dismissAllowingStateLoss() + } + } + override fun queryLoginStatus():Boolean { + return LoginStatusManager.isLogin() + } + + override fun queryLoginStatusByNet() { + presenter?.queryLoginStatus() + } + + override fun loginOut(mLatitude:Double,mLongitude:Double) { + presenter?.logOut(mLatitude,mLongitude) + } +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiLoginDialogFragment.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/ui/TaxiLoginDialogFragment.kt similarity index 96% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiLoginDialogFragment.kt rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/ui/TaxiLoginDialogFragment.kt index 19da74fbae..b08e15472d 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiLoginDialogFragment.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/ui/TaxiLoginDialogFragment.kt @@ -1,4 +1,4 @@ -package com.mogo.och.taxi.ui +package com.mogo.och.common.module.biz.ui import android.content.DialogInterface import android.graphics.Rect @@ -15,7 +15,6 @@ import androidx.core.widget.addTextChangedListener import androidx.fragment.app.DialogFragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentTransaction -import com.mogo.cloud.passport.MoGoAiCloudClient import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.commons.mvp.MvpDialogFragment import com.mogo.eagle.core.utilcode.kotlin.onClick @@ -23,16 +22,15 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.BarUtils import com.mogo.eagle.core.utilcode.util.KeyboardUtils -import com.mogo.och.taxi.R -import com.mogo.och.taxi.constant.TaxiConst -import com.mogo.och.taxi.presenter.TaxiLoginPresenter +import com.mogo.och.common.module.R +import com.mogo.och.common.module.biz.presenter.OchCommonLoginPresenter /** * @author: yangyakun * @date: 2022/8/15 */ -class TaxiLoginDialogFragment : MvpDialogFragment(), +class TaxiLoginDialogFragment : MvpDialogFragment(), DialogInterface.OnKeyListener { lateinit var clMain: ConstraintLayout @@ -169,8 +167,8 @@ class TaxiLoginDialogFragment : MvpDialogFragment + + #2961F2 + #14FF0000 + #FF0000 + #666666 + #86A5F7 + #111533 + #878890 + #EF262C + #4D000000 + + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/res/values/strings.xml b/OCH/mogo-och-common-module/src/main/res/values/strings.xml new file mode 100644 index 0000000000..f2d52ad1eb --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/res/values/strings.xml @@ -0,0 +1,17 @@ + + + + 欢迎您登录 + 登录 + 获取验证码 + 请输入验证码 + 获取验证码成功 + 登录成功 + 请输入正确的手机号 + 请输入正确的验证码 + 请输入手机号 + 请输入手机号 + + 网络异常,请稍后重试 + 请求出现异常,请稍后重试 + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/res/values/styles.xml b/OCH/mogo-och-common-module/src/main/res/values/styles.xml new file mode 100644 index 0000000000..b205c0fd04 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/res/values/styles.xml @@ -0,0 +1,21 @@ + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiCarStatusCallback.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiCarStatusCallback.java index ac0eddc08a..b51f44ec35 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiCarStatusCallback.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiCarStatusCallback.java @@ -6,9 +6,7 @@ package com.mogo.och.taxi.callback; * Model->Presenter回调:接单车状态变更 登录状态变更 */ public interface ITaxiCarStatusCallback { - void onCarStatusChanged(boolean inOperation,String role); void onServiceDataUpdate(long dailyTimeDuration, long dailyOrderNum); - void onCarLoginStatusChange(boolean isLogin); } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxiConst.kt b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxiConst.kt index 41a1280592..2a399bb339 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxiConst.kt +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxiConst.kt @@ -81,6 +81,5 @@ class TaxiConst { const val TIMER_START_AUTOPILOT_INTERVAL = 20 * 1000L - const val WAIT_TAKEN = 100046 } } \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxtServingStatusManager.kt b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxtServingStatusManager.kt new file mode 100644 index 0000000000..7a42236e8b --- /dev/null +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxtServingStatusManager.kt @@ -0,0 +1,38 @@ +package com.mogo.och.taxi.constant + +object TaxtServingStatusManager { + + /** + * 接单状态 + */ + private var openOrderStatus: TaxiOpenOrderStatusEnum = TaxiOpenOrderStatusEnum.None + + // region 是否可用接单 + @JvmStatic + fun isOpeningOrderStatus():Boolean{ + if(openOrderStatus==TaxiOpenOrderStatusEnum.Ordering){ + return true + } + return false + } + @JvmStatic + fun setOpenOrderStatus(status: Int) { + when (status) { + 0 -> { + this.openOrderStatus = TaxiOpenOrderStatusEnum.UnOrdering + } + 1 -> { + this.openOrderStatus = TaxiOpenOrderStatusEnum.Ordering + } + else -> { + this.openOrderStatus = TaxiOpenOrderStatusEnum.None + } + } + } + @JvmStatic + fun getOpenOrderStatus(): TaxiOpenOrderStatusEnum { + return openOrderStatus + } + + //endregion +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java index 06b77b0491..dc0f367ad6 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java @@ -13,6 +13,7 @@ import android.net.ConnectivityManager; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.alibaba.android.arouter.launcher.ARouter; import com.amap.api.maps.model.LatLng; import com.elegant.network.utils.GsonUtil; import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager; @@ -34,12 +35,13 @@ import com.mogo.eagle.core.utilcode.util.NetworkUtils; import com.mogo.eagle.core.utilcode.util.ToastUtils; import com.mogo.map.navi.IMogoCarLocationChangedListener2; import com.mogo.module.common.MogoApisHandler; +import com.mogo.och.common.module.biz.constant.LoginStatusManager; +import com.mogo.och.common.module.biz.provider.LoginService; import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil; import com.mogo.och.common.module.utils.PinYinUtil; import com.mogo.och.common.module.utils.ToastUtilsOch; import com.mogo.och.taxi.R; import com.mogo.och.taxi.bean.DriverServiceDataRespBean; -import com.mogo.och.taxi.bean.DriverStatusQueryRespBean; import com.mogo.och.taxi.bean.OrderGrabRespBean; import com.mogo.och.taxi.bean.OrderGrabStatusQueryRespBean; import com.mogo.och.taxi.bean.OrderQueryRespBean; @@ -50,19 +52,17 @@ import com.mogo.och.taxi.bean.OrdersListQueryRespBean; import com.mogo.och.taxi.bean.OrdersNewBookingQueryRespBean; import com.mogo.och.taxi.bean.QueryOrderRouteResp; import com.mogo.och.taxi.bean.TaxiDataBaseRespBean; -import com.mogo.och.taxi.bean.TaxiLogoutReqBean; import com.mogo.och.taxi.bean.TaxiOrPassengerReadyReqBean; import com.mogo.och.taxi.callback.ITaxiADASStatusCallback; import com.mogo.och.taxi.callback.ITaxiCarStatusCallback; import com.mogo.och.taxi.callback.ITaxiControllerStatusCallback; import com.mogo.och.taxi.callback.ITaxiOrderStatusCallback; -import com.mogo.och.taxi.constant.TaxiDriverRoleEnum; import com.mogo.och.taxi.constant.TaxiConst; import com.mogo.och.taxi.constant.TaxiOrderStatusEnum; import com.mogo.och.taxi.constant.TaxiOrderTypeEnum; +import com.mogo.och.taxi.constant.TaxtServingStatusManager; import com.mogo.och.taxi.network.TaxiServiceCallback; import com.mogo.och.taxi.network.TaxiServiceManager; -import com.mogo.och.taxi.utils.StatusManager; import com.mogo.och.taxi.utils.TaxiAnalyticsManager; import com.mogo.och.taxi.utils.OrderUtil; import com.mogo.aicloud.services.socket.IMogoLifecycleListener; @@ -79,10 +79,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.concurrent.TimeUnit; -import io.reactivex.Observable; -import io.reactivex.disposables.Disposable; import io.reactivex.exceptions.UndeliverableException; import io.reactivex.functions.Consumer; import io.reactivex.plugins.RxJavaPlugins; @@ -119,7 +116,6 @@ public class TaxiModel { private ITaxiCarStatusCallback mCarStatusCallback; //Model->Presenter:接单状态、登录状态和司机今日接单状态 private ITaxiControllerStatusCallback mControllerStatusCallback; //Model->Presenter:VR mode等 private ITaxiOrderStatusCallback mOrderStatusCallback; //Model->Presenter:订单变更 - private Disposable subscribe; private volatile boolean isRestartAutopilot = false; @@ -127,6 +123,8 @@ public class TaxiModel { private double mLongitude, mLatitude; + private LoginService loginService; + private TaxiModel() { } @@ -149,6 +147,7 @@ public class TaxiModel { public void init(Context context) { mContext = context.getApplicationContext(); initListeners(); + loginService = (LoginService) ARouter.getInstance().build("/ochbiz/common/login").navigation(); // IMogoServiceApis apis = MogoApisHandler.getInstance().getApis(); // apis.getSocketManagerApi(mContext).init(mContext, DebugConfig.getSocketAppId()); @@ -193,16 +192,13 @@ public class TaxiModel { CallerLogger.INSTANCE.d(M_TAXI + TAG, "Undeliverable exception"); } }); - queryCarStatus(); } public void release() { startOrStopOrderLoop(false); startOrStopCalculateRouteInfo(false); releaseListeners(); - if(subscribe!=null&&!subscribe.isDisposed()){ - subscribe.dispose(); - } + loginService = null; } private void initListeners() { @@ -248,7 +244,7 @@ public class TaxiModel { CallerAutopilotPlanningListenerManager.INSTANCE.removeListener(moGoAutopilotPlanningListener); } - private void startOrStopOrderLoop(boolean start) { + public void startOrStopOrderLoop(boolean start) { CallerLogger.INSTANCE.d(M_TAXI + TAG, "startOrStopOrderLoop() " + start); if (start) { TaxiModelLoopManager.getInstance().startInAndWaitOrdersLoop(); @@ -261,82 +257,18 @@ public class TaxiModel { } } - /** - * 接单状态和登录状态查询 - * 1、初始化查下状态 - * 2、点击更新接单状态 如果是初始化状态就查下状态 - * 3、点击更新接单状态后 查询状态 - * 4、网络状态波动时 查询状态 - * 5、登出后更新状态 - */ - public void queryCarStatus() { - TaxiServiceManager.getInstance().queryDriverServiceStatus(mContext, - new TaxiServiceCallback() { - @Override - public void onSuccess(DriverStatusQueryRespBean data) { - if (null != data && 0 == data.code) { - StatusManager.setLoginStatus(data.data.driverStatus); - StatusManager.setOpenOrderStatus(data.data.servingStatus); - //更新view - CallerLogger.INSTANCE.d(M_TAXI + TAG, "changeCarStatus:" + StatusManager.getLoginStatus()); - startOrStopOrderLoop(StatusManager.isLogin()&&StatusManager.isOpeningOrderStatus()); - if(mCarStatusCallback!=null) { - mCarStatusCallback.onCarLoginStatusChange(StatusManager.isLogin()); - } - String role = ""; - if (TaxiDriverRoleEnum.DEMO.getCode() == data.data.purpose) { - role = TaxiConst.DEMO_USER; - } else if (TaxiDriverRoleEnum.TEST.getCode() == data.data.purpose) { - role = TaxiConst.TEST_USER; - } - if (mCarStatusCallback != null) { - mCarStatusCallback.onCarStatusChanged(StatusManager.isOpeningOrderStatus(), role); - } - - } - } - - @Override - public void onError() { - if (!NetworkUtils.isConnected(mContext)) { - ToastUtils.showShort(mContext.getString(R.string.network_error_tip)); - } else { - ToastUtils.showShort(mContext.getString(R.string.request_error_tip)); - } - subscribe = Observable.timer(5, TimeUnit.SECONDS).subscribe(aLong -> { - queryCarStatus(); - }); - } - - @Override - public void onFail(int code, String msg) { - ToastUtilsOch.showWithCodeMessage(code,msg); - if(code==TaxiConst.WAIT_TAKEN){ - subscribe = Observable.timer(3, TimeUnit.SECONDS).subscribe(aLong -> { - queryCarStatus(); - }); - }else { - if (mCarStatusCallback != null) { - mCarStatusCallback.onCarLoginStatusChange(StatusManager.isLogin()); - } - } - } - }); - } - //更新接单状态 public void updateCarStatus() { - if(!StatusManager.isLogin()){ - queryCarStatus(); + if(!LoginStatusManager.isLogin()){ + loginService.queryLoginStatusByNet(); return; } - TaxiServiceManager.getInstance().changeOrderServing(mContext,StatusManager.isOpeningOrderStatus(), + TaxiServiceManager.getInstance().changeOrderServing(mContext,TaxtServingStatusManager.isOpeningOrderStatus(), new TaxiServiceCallback() { @Override public void onSuccess(BaseData data) { if (null != data && 0 == data.code) { - //StatusManager.changeOrderStatus(); - queryCarStatus(); + loginService.queryLoginStatusByNet(); } } @@ -1002,8 +934,8 @@ public class TaxiModel { CallerLogger.INSTANCE.d(M_TAXI + TAG, "onIntentReceived = %s", intentStr); if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intentStr)) { if (NetworkUtils.isConnected(mContext)) { - startOrStopOrderLoop(StatusManager.isLogin()&&StatusManager.isOpeningOrderStatus()); - queryCarStatus(); + startOrStopOrderLoop(LoginStatusManager.isLogin()&&TaxtServingStatusManager.isOpeningOrderStatus()); + loginService.queryLoginStatusByNet(); } } } @@ -1580,30 +1512,6 @@ public class TaxiModel { // 登出 public void logout() { - TaxiLogoutReqBean.Location4Login location4Login = new TaxiLogoutReqBean.Location4Login(mLatitude, mLongitude); - TaxiServiceManager.getInstance().logout(mContext,location4Login, - new TaxiServiceCallback() { - @Override - public void onSuccess(BaseData data) { - if (null != data && 0 == data.code) { - mCarStatusCallback.onCarLoginStatusChange(false); - queryCarStatus(); - } - } - - @Override - public void onError() { - if (!NetworkUtils.isConnected(mContext)) { - ToastUtils.showShort(mContext.getString(R.string.network_error_tip)); - } else { - ToastUtils.showShort(mContext.getString(R.string.request_error_tip)); - } - } - - @Override - public void onFail(int code, String msg) { - ToastUtilsOch.showWithCodeMessage(code,msg); - } - }); + loginService.loginOut(mLatitude,mLongitude); } } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java index 8b29d4039d..cbb3885cf6 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java @@ -2,7 +2,6 @@ package com.mogo.och.taxi.network; import com.mogo.eagle.core.data.BaseData; import com.mogo.och.taxi.bean.CarHeartbeatReqBean; import com.mogo.och.taxi.bean.DriverServiceDataRespBean; -import com.mogo.och.taxi.bean.DriverStatusQueryRespBean; import com.mogo.och.taxi.bean.DriverStatusUpdateReqBean; import com.mogo.och.taxi.bean.OrderCancelReqBean; import com.mogo.och.taxi.bean.OrderGrabReqBean; @@ -20,10 +19,6 @@ import com.mogo.och.taxi.bean.OrdersListQueryRespBean; import com.mogo.och.taxi.bean.OrdersNewBookingQueryRespBean; import com.mogo.och.taxi.bean.QueryOrderRouteResp; import com.mogo.och.taxi.bean.TaxiDataBaseRespBean; -import com.mogo.och.taxi.bean.TaxiLoginReqBean; -import com.mogo.och.taxi.bean.TaxiLoginRespBean; -import com.mogo.och.taxi.bean.TaxiLoginSmsReqBean; -import com.mogo.och.taxi.bean.TaxiLogoutReqBean; import com.mogo.och.taxi.bean.TaxiOrPassengerReadyReqBean; import com.mogo.och.taxi.bean.UpdateOrderDisAndTimeReqBean; @@ -290,35 +285,6 @@ interface TaxiServiceApiNew { Observable orderCompleted(@Header ("appId") String appId , @Header("ticket") String ticket,@Body TaxiOrPassengerReadyReqBean data); - - /** - * 获取手机验证码 - * - * @return - */ - @Headers( {"Content-type:application/json;charset=UTF-8"} ) -// @GET( "/autopilot-car-hailing/api/v1/driver/serviceStatus/query" ) - @POST( "/autopilot-car-hailing/driver/v2/driver/taxi/sendSms" ) - Observable getPhoneCode(@Header ("appId") String appId - ,@Header("ticket") String ticket,@Body TaxiLoginSmsReqBean data); - /** - * 通过验证码登录 - * @param appId - * @param ticket - * @param data - * @return - */ - @Headers( {"Content-type:application/json;charset=UTF-8"} ) - @POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/startOperation" ) - Observable gotoLoginBycode(@Header ("appId") String appId - , @Header("ticket") String ticket, @Body TaxiLoginReqBean data); - /** - * 登出接口 - */ - @Headers({"Content-type:application/json;charset=UTF-8"}) - @POST("/autopilot-car-hailing/cab/flow/v1/driver/taxi/endOperation") - Observable logout(@Header ("appId") String appId,@Header("ticket") String ticket, - @Body TaxiLogoutReqBean data); /** * 暂停接单 * @param data @@ -339,15 +305,4 @@ interface TaxiServiceApiNew { @POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/resetOrderServing" ) Observable resetOrderServing(@Header ("appId") String appId,@Header("ticket") String ticket ,@Body DriverStatusUpdateReqBean data); - /** - * 接单状态和登录状态查询 - * @param sn - * @return - */ - @Headers( {"Content-type:application/json;charset=UTF-8"} ) -// @GET( "/autopilot-car-hailing/api/v1/driver/serviceStatus/query" ) - @GET( "/autopilot-car-hailing/operation/v1/driver/taxi/loginStatus" ) - Observable queryDriverServiceStatusAndLoginStatus(@Header ("appId") String appId - ,@Header("ticket") String ticket,@Query("sn") String sn); - } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.java index 333ca64fd9..5c209c7b87 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.java @@ -4,7 +4,6 @@ import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAX import android.content.Context; -import com.mogo.cloud.passport.MoGoAiCloudClient; import com.mogo.cloud.passport.MoGoAiCloudClientConfig; import com.mogo.eagle.core.data.BaseData; import com.mogo.eagle.core.network.MoGoRetrofitFactory; @@ -13,7 +12,6 @@ import com.mogo.eagle.core.network.SubscribeImpl; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.och.taxi.bean.CarHeartbeatReqBean; import com.mogo.och.taxi.bean.DriverServiceDataRespBean; -import com.mogo.och.taxi.bean.DriverStatusQueryRespBean; import com.mogo.och.taxi.bean.DriverStatusUpdateReqBean; import com.mogo.och.taxi.bean.OrderCancelReqBean; import com.mogo.och.taxi.bean.OrderGrabReqBean; @@ -31,10 +29,6 @@ import com.mogo.och.taxi.bean.OrdersListQueryRespBean; import com.mogo.och.taxi.bean.OrdersNewBookingQueryRespBean; import com.mogo.och.taxi.bean.QueryOrderRouteResp; import com.mogo.och.taxi.bean.TaxiDataBaseRespBean; -import com.mogo.och.taxi.bean.TaxiLoginReqBean; -import com.mogo.och.taxi.bean.TaxiLoginRespBean; -import com.mogo.och.taxi.bean.TaxiLoginSmsReqBean; -import com.mogo.och.taxi.bean.TaxiLogoutReqBean; import com.mogo.och.taxi.bean.TaxiOrPassengerReadyReqBean; import com.mogo.och.taxi.bean.UpdateOrderDisAndTimeReqBean; import com.mogo.och.taxi.constant.TaxiConst; @@ -263,26 +257,6 @@ public class TaxiServiceManager { .subscribe(getSubscribeImpl(context, callback, "updateDriverServiceStatus")); } - /** - * 接单状态和登录状态查询 - * @param context - * @param callback - */ - public void queryDriverServiceStatus(Context context, - TaxiServiceCallback callback) { - if(MoGoAiCloudClientConfig.getInstance().getToken().isEmpty()){ - callback.onFail(TaxiConst.WAIT_TAKEN,"等待令牌中请稍等"); - MoGoAiCloudClient.getInstance().refreshToken(); - return; - } - mOCHTaxiServiceApi.queryDriverServiceStatusAndLoginStatus(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken() - ,MoGoAiCloudClientConfig.getInstance().getSn()) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "queryDriverServiceStatus")); - } - /** * 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度 * @param context @@ -455,52 +429,6 @@ public class TaxiServiceManager { } - /** - * 获取手机验证码 - * @param context - * @param callback - */ - public void getPhoneCode(Context context,String phone, - TaxiServiceCallback callback) { - mOCHTaxiServiceApi.getPhoneCode(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - , MoGoAiCloudClientConfig.getInstance().getToken() - , new TaxiLoginSmsReqBean(phone)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "getPhoneCode")); - } - /** - * 通过验证码登录 - * @param context - * @param callback - */ - public void gotoLoginBycode(Context context, String phone, String code, - TaxiLoginReqBean.Location4Login location4Login, - TaxiServiceCallback callback) { - String sn = MoGoAiCloudClientConfig.getInstance().getSn(); - mOCHTaxiServiceApi.gotoLoginBycode(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - , MoGoAiCloudClientConfig.getInstance().getToken() - , new TaxiLoginReqBean(phone, code, sn, location4Login)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "gotoLoginBycode")); - } - - /** - * 登出 - */ - public void logout(Context context, TaxiLogoutReqBean.Location4Login location4Login, TaxiServiceCallback callback) { - mOCHTaxiServiceApi.logout( - MoGoAiCloudClientConfig.getInstance().getServiceAppId(), - MoGoAiCloudClientConfig.getInstance().getToken(), - new TaxiLogoutReqBean(MoGoAiCloudClientConfig.getInstance().getSn(), location4Login)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "logout")); - } - - - private SubscribeImpl getSubscribeImpl( Context context, TaxiServiceCallback callback, String apiName) { return new SubscribeImpl(RequestOptions.create(context)) { diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java index 5bd2c9cb2f..cd1d701673 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java @@ -15,7 +15,11 @@ import com.mogo.commons.mvp.Presenter; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; +import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean; +import com.mogo.och.common.module.biz.callback.ILoginCallback; +import com.mogo.och.common.module.biz.constant.LoginStatusManager; import com.mogo.och.taxi.constant.TaxiConst; +import com.mogo.och.taxi.constant.TaxiDriverRoleEnum; import com.mogo.och.taxi.constant.TaxiOrderStatusEnum; import com.mogo.och.taxi.bean.OrderQueryRespBean; import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean; @@ -23,6 +27,7 @@ import com.mogo.och.taxi.callback.ITaxiADASStatusCallback; import com.mogo.och.taxi.callback.ITaxiCarStatusCallback; import com.mogo.och.taxi.callback.ITaxiControllerStatusCallback; import com.mogo.och.taxi.callback.ITaxiOrderStatusCallback; +import com.mogo.och.taxi.constant.TaxtServingStatusManager; import com.mogo.och.taxi.model.TaxiModel; import com.mogo.och.taxi.ui.TaxiFragment; @@ -37,11 +42,10 @@ import java.util.List; * 描述 */ public class TaxiPresenter extends Presenter implements ITaxiADASStatusCallback, - ITaxiCarStatusCallback, ITaxiOrderStatusCallback, ITaxiControllerStatusCallback { + ITaxiCarStatusCallback, ITaxiOrderStatusCallback, ITaxiControllerStatusCallback, ILoginCallback { private static final String TAG = TaxiPresenter.class.getSimpleName(); - private boolean isFirstShow = true; private int preAutopilotStatus = 0; public TaxiPresenter(TaxiFragment view) { @@ -64,16 +68,6 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS TaxiModel.getInstance().release(); } - @Override - public void onResume(@NonNull LifecycleOwner owner) { - super.onResume(owner); - if(isFirstShow){ - isFirstShow = false; - }else { - TaxiModel.getInstance().queryCarStatus(); - } - } - private void initListeners() { TaxiModel.getInstance().setADASStatusCallback(this); TaxiModel.getInstance().setCarStatusCallback(this); @@ -113,13 +107,6 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS TaxiModel.getInstance().jumpPassengerCheckDone(); } - /** - * 登录成功后查询登录状态 - */ - public void queryLoginStatus() { - TaxiModel.getInstance().queryCarStatus(); - } - /** * 司机确认车辆环境可开启自动驾驶 */ @@ -218,25 +205,11 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS preAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING; } - @Override - public void onCarStatusChanged(boolean inOperation, String role) { - runOnUIThread(() -> mView.updateOperationStatus(inOperation,role)); - } - @Override public void onServiceDataUpdate(long dailyTimeDuration, long dailyOrderNum) { runOnUIThread(() -> mView.onServiceDataUpdate(dailyTimeDuration,dailyOrderNum)); } - @Override - public void onCarLoginStatusChange(boolean isLogin) { - if(isLogin){ - mView.hideLoginDialogFragment(); - }else { - mView.showLoginDialogFragment(); - } - } - @Override public void onOrdersInServiceChanged(@NonNull @NotNull List inServiceList) { @@ -337,4 +310,29 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS }); } } + + @Override + public void loginSuccess(DriverStatusQueryRespBean data) { + //设置 接单状态 + TaxtServingStatusManager.setOpenOrderStatus(data.data.servingStatus); + //设置 是否启动订单轮训 + TaxiModel.getInstance().startOrStopOrderLoop(LoginStatusManager.isLogin()&&TaxtServingStatusManager.isOpeningOrderStatus()); + + // 设置当前用户角色 + String role = ""; + if (TaxiDriverRoleEnum.DEMO.getCode() == data.data.purpose) { + role = TaxiConst.DEMO_USER; + } else if (TaxiDriverRoleEnum.TEST.getCode() == data.data.purpose) { + role = TaxiConst.TEST_USER; + } + String finalRole = role; + runOnUIThread(() -> { + mView.updateOperationStatus(TaxtServingStatusManager.isOpeningOrderStatus(), finalRole); + }); + } + + @Override + public void loginFail(boolean isLogin) { + + } } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java index 955e7d221b..e35ca7e733 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java @@ -13,16 +13,13 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; -import androidx.fragment.app.DialogFragment; -import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; -import com.mogo.commons.debug.DebugConfig; +import com.alibaba.android.arouter.launcher.ARouter; import com.mogo.eagle.core.data.temp.EventLogout; -import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; -import com.mogo.eagle.core.utilcode.util.AppStateManager; import com.mogo.module.common.MogoApisHandler; +import com.mogo.och.common.module.biz.provider.LoginService; import com.mogo.och.taxi.R; import com.mogo.och.taxi.constant.TaxiOrderStatusEnum; import com.mogo.och.taxi.bean.OrderQueryRespBean; @@ -59,10 +56,19 @@ public class TaxiFragment extends BaseTaxiTabFragment taxiLoginDialogFragment = null; private WeakReference personalDialogFragment = null; protected double mCurLatitude = 0.0; protected double mCurLongitude = 0.0; + private LoginService loginService; + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + loginService = (LoginService) ARouter.getInstance().build("/ochbiz/common/login").navigation(); + if(loginService!=null){ + loginService.registerFragment(this, getPresenter()); + } + } @Nullable @Override @@ -164,6 +170,8 @@ public class TaxiFragment extends BaseTaxiTabFragment(TaxiLoginDialogFragment.newInstance()); - } - TaxiLoginDialogFragment taxiLoginDialog = taxiLoginDialogFragment.get(); - if(taxiLoginDialog!=null) { - if (taxiLoginDialog.getDialog() != null && taxiLoginDialog.getDialog().isShowing()) { - return; - } - if (taxiLoginDialog.isAdded()) {//解决方法就是添加这行代码,如果已经添加了,就移除掉然后再show,就不会出现Fragment already added的错误了。 - getParentFragmentManager().beginTransaction().remove(taxiLoginDialog).commitAllowingStateLoss(); - } - CallerLogger.INSTANCE.d(M_TAXI + TAG,"showLoginDialogFragment 展示登录界面"); - taxiLoginDialog.show(getParentFragmentManager(), TaxiLoginDialogFragment.Companion.getTAG()); - taxiLoginDialog.setOnDismissListener(dialog -> { - taxiLoginDialogFragment.clear(); - mPresenter.queryLoginStatus(); - }); - } - } - public void hideLoginDialogFragment(){ - CallerLogger.INSTANCE.d(M_TAXI + TAG,"hideLoginDialogFragment 隐藏登录界面"); - if(taxiLoginDialogFragment!=null&&taxiLoginDialogFragment.get()!=null){ - taxiLoginDialogFragment.get().dismissAllowingStateLoss(); - } - } - private void testRouteInfoUpload() { TPRouteDataTestUtils.converToRouteData(); } - /** - * Taxi调试信息:订单、线路、轨迹等信息 - * - * START - */ + //region Taxi调试信息:订单、线路、轨迹等信息 private View testBar; private TextView testCurOrderId; private TextView testCurLineId; @@ -474,7 +436,6 @@ public class TaxiFragment extends BaseTaxiTabFragment { - this.loginStatus = TaxiLoginStatusEnum.Logout - } - 1 -> { - this.loginStatus = TaxiLoginStatusEnum.Login - } - else -> { - this.loginStatus = TaxiLoginStatusEnum.None - } - } - } - @JvmStatic - fun setLoginStatus(loginStatus: TaxiLoginStatusEnum) { - this.loginStatus = loginStatus - } - @JvmStatic - fun getLoginStatus(): TaxiLoginStatusEnum { - return loginStatus - } - @JvmStatic - fun isLogin():Boolean { - if(loginStatus==TaxiLoginStatusEnum.Login){ - return true - } - return false - } - // region 是否可用接单 - @JvmStatic - fun isOpeningOrderStatus():Boolean{ - if(openOrderStatus==TaxiOpenOrderStatusEnum.Ordering){ - return true - } - return false - } - @JvmStatic - fun setOpenOrderStatus(status: Int) { - when (status) { - 0 -> { - this.openOrderStatus = TaxiOpenOrderStatusEnum.UnOrdering - } - 1 -> { - this.openOrderStatus = TaxiOpenOrderStatusEnum.Ordering - } - else -> { - this.openOrderStatus = TaxiOpenOrderStatusEnum.None - } - } - } - @JvmStatic - fun getOpenOrderStatus(): TaxiOpenOrderStatusEnum { - return openOrderStatus - } - - //endregion -} \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1600/taxi_ic_login_bg.webp b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1600/taxi_ic_login_bg.webp deleted file mode 100644 index 7af7432551edf42ec320de1a5643e49b5d4dc543..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44568 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ම{4EGY^_h6bs7t5vjtr`t_) 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 BRHFa@ diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_ic_login_bg.webp b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_ic_login_bg.webp deleted file mode 100644 index 7af7432551edf42ec320de1a5643e49b5d4dc543..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44568 zcmdSA1$10V(k@tHW@cuzSQbkbgT>6u%*@QpY%yER%oa0)1r{?|uyXfwPyaL1@63C< zXU}exZe^aES*n|vkr7{f5h*V&B7#^20H_EH$|}op5Q4tfYv>`efT#h`{NTKCV!2Xe zIbw|ZlzZ*Q~LnHQaq zjuMaf3CvNgT0W~seLv6Tp4iFn3A5u z^Y7qZjNVdSDb^-my9~Ovyr5tAycd5?xCg(H9YMXMyo6}p=cS~CoTc;^pXHpnG=#jp zSmczr4LxpJbS@qqN4@2)ov&--ip&1oxC}0cad?{y741V$}br6eF<;9!BJ&F@vFOg!vO*F514ZQKlzFh`@sBH+MlOiuuL|s zD93nznu)00uSzgYcCN@Jd)>`Mem!qYG|KU+FZkc@L}5St|Ijp9d4MAv?M3wgsw}I| zuocQWm1E3=n}HDgPbhp<*i`P}sOEKOMCVIs#;$P>5EjnK0FY;;McB;T~swKYI)CKDA07KJ|n)ysGb$Ns%VlqKIa1! z5`5~z#clR$ooWsq{l9<7Th%yt`k8)g{6CpYdQOt>3+f+D`b&5ic&jVQev-cx4YyI5 z3B@);Yda{za)9zWf?IphujTzL#;i;@cbmnpfP*%H9h~$-3GsLPujLg?fWm?JHq4J8 zRX$=cvqqR%LpHtTL=!tw*Ju~Wc?@h$0*x6`CaVW=xHJX4aQioB|mBK5AfHKT%3ef?I%^>Zv13z|P2S(`dli4?IZem{36 zb?m_FrBHAXs`lo@LE5pn4TMOA??q_#Z&f5wuDmLC8WCOM1gVJX5@_?%{dVFHsTW)#^mJb`npCa zPT}ZXtmz_GFp4m#lH5gnPujEoqM`D(Ma%wsT}IQ|8hSU%WotK_3BYEG9Wr{YUmLN6T5YT0c-@ruWTxy@)PA65gWm^n)d~s)JUOSwtWt z=^ai|^QX7H96!8QdO(C7kU8FFk3 zp$;jfo4}BS!IyVfL)mhPc2~Gl|tR1Sc z`R|J~&^dv_67k!BP#*0hw(;pyesBUIMVfzFC#a@!T=c`=4H-(>bvhI5k#!|a41GGS zy{ll~&_T#b9k~m?YRi`E;>S$9r9sfhA2FXZbV#m0Y1aKkX#ZTU_u*FnUM$p+n;Cx1 za@ZM%mVA7w^*?^$x5=S3F=pLs{mqc7Cs*ox)_e8|lagCENav7J$73!FMHz>Tnoj>Y z&BZZ>3$#w0U8)m4-4NTh2M*GLGJJL{jzR1HpY7`-h{?W%4#4La004kMX$+OAS&HYJ z5$sO>(_(vE7RX=?eGGZGc(t0k?p@01J{Ys6iy6;nem1#q6Ql%irk~$TySA6xjhMaF z(*-lXbBm0NmRL}GE28EP;rDd@r=lx#u3P}c%1#)F%6IwHqL^Z(6e z;z7fqvWz6B8=>@osWi`B>o&>6d)tj5Ivwh}Lc|(jdGgo60c;-WWjuI6w!wZEt1qR< zspGRK@jpV}XW`s!t_!u$ZiljXLKfJY4)N>%glJHq#zIR*;Y<&vfQo{gkI`2D5Mm{71eom|!aZ_No@2&K>X(ekN{o=f*P7)wG)ZyEpT_srKYINE4|G?yo!lj+ zA;}wfyx{V?Db|Ozuok&EqC$lWFGT4O85Kw(G^ZgD#&yoSI4g(+Cdw8==m?+vR(a+) z%&Ywqz2s%AV8Ofpfj?#MSM1|nbw4yLJkOU80`IJU0vY@RvO;qxrv^IfS}yY^&eNS0z`Xz{*A}LgUh|;@nc><<<{LxZ5 zc!eT(s$Dq>>>^tH$Rzz0_H_J}hUxO_l8y~wl#+ooE$6d2may$=VOzctEw-fJ@KEjH+S-W_{@HK9kbRKYPHw20#5(&%G~rhKDN#tGCdPtiX*QuKsi}c23d| z<)<8!9hu%p&DGqwxx)F3+(}?WfnmBZY9s={)X-1x8k5?$aBnzu8P3yVMM-ZxW7qRT z_8gJN;f8{?z85>ml=29b!dq@8g<@Ttd4d;f)Xg??jtSsr%VB$lDaev$z_F)_z_hJy z#kR%rT%dHgR`tCpAD@TWhtd*}KYt@a=6S<$ntzQE>o|NY!U-gp;ROE|uY@m6O3cn5 z4>3~?LaB&fj#RU1dSnNT|H2>QW{ugEyy<*y*@(x!ynP6qcbgq|I@T*#qW0iz&F-wM zE)UpKujCPUm*INnc-nu2l^#5dtV=W31bal$_M?Z-(D4K-gEDrD+2F9paS+aE<&!;A z`WGo6x~y-R1nn9nJ-p+v0?6IC_GWwL`4x@M!rOp=Zdg+G{Wu-+4HNXa$wyA1`P>_0 z>E`qM&f~^oSC&QTQUqtQ7VUo-0zX14p3wXQy4ZKZb&<5@N@4#VMt{=D)-aOQ>~4+8 zZ1C=WA%;+4AxFK}Mf4C%<)W{AlCK?&#pOg%MO{-C9scVKT5mJ&U@$#@t+cB}q{=e) z5_+*^FM1>K3*+Oo0RB8$SFOc_bZc$%p-P>HySENE7?G~D(j?t9KjOBt1Bag=Z^Y^6SxrX@a_X@?890#z^mpkCYTdm1+fz6g_In9eOD8J#~?YcsnDThQko!O zV)Nk$npq4(kOS|-mVDvRMF6pW!~H8IZTG3Qs0HCqO%6a4#PytxW>@%VJlaOhlGp@RgGk`ev(s=D)*77%NH%LTDOWf`> zMSH5!idYZGa|2;phe0W;FlB{T*xy}ZAN7x>dLA2bA#&+?{9J&TkMo@lGAVwwl7G~jBMEm#IfBM*>=5Osrgb*QJez2>RSfX zK(G2D(PyF_NM-IeFn>#)Ll=}imxUybgdC3cRvZAmwLx@+(=PXHUZ1_jBlIo5nSX+F zwp?P0NKoarpyr~t|K#6&T(HP>l^JYByWoC9((Gf_MqClA8vadcXgPxz-Oajagb1aZ zz^i_rO;_$zDY_M$sx~D1ALiL!-AF;GfS(zONd;G(M!`@bve+9D1xH2k;w(44Wk*fv zC|tcRIud;agO>GyX#~x@Bg*^t77;p4WZ} z!N0K;8SbgeVub#XMC}N|u*D!DUV{nP?I$UlUiW|eUElv;2LVx;gG?1e*UHG>QLd$H z6%T1Wiut_@SHeJ>yKKQ-+CZye6zj`+W$K7!NcbrW|L1To@7Z++6qFqx(a-pe#1rz@ zNdJhz^W^VBKAhV1$nGKU~KyQw(ET^_L;llml;&4`Ut7cF(51| zvVJ=?mfrgX{b>SY3pG2+vIn$`&;WPv(`$wJr5vpy_3}`R{2(Rb*6YNDwb8dEXzc8! zk>}4x2@(4gpoShokis+7@4gKzwqU_ukmMhR^!IH~;AmVg3kvp`-TTZ+a;#-Tx`gjO zlf{5|FZMTR1l%fZHJsK`v;U<^vG+&j90AWc?X|nWyE7X!H^KF< zD(Fuhs{3gbddyDMZ#U?a@dPor?793^H}Ad*e9Nbrc>bnq&G4J7eC8^$&mXjwa)FAB zmo#68flHqR(Cp$BaIC;9RW&e1sgABU5LU!H%$n=dJ4vKFQN%|6f!evT149?#nE#1M z1_7~m%4csjRU2WP|JXT)4E_*y+hX6gNGG&gJ{OhSp9>Xr;?xH5RsUlzK~k=7BaBlV zdybUurvZ!qOq}tB>U{0!9ZroAlK2i%)Y!9c8>(l|UzAH80UHh?O9I{fdh_!MjTW06 zNIUJ+lm!BOt6sUvl2Q#zb4hk!RHusA)2#*{Lr-JvK)ml^D`$@R#h}%sz~=sRFHGP= ze5C?#l&LtVXO{&uL)5#K6y~54U?ujd5Mok1RO&UJt2L=sWhRTDVr3@KUbC1TfDn_1 z2%TNhSQQP>J!CHN@mQn#6#hYUfKP1O4({3B2|u%0;i}aH!2>QKm7B&(WJrm_EU3X^YiIk`7tKj|i$&F=7-%DYX7!lUu3CB@^N@xfKI^fga$GvhoqQ z|G5CGSV)9Aj3SCJJJ@v3L2U>uu3ib+#@-v<<+U)B^8?i;96 z^Kod|W2hN|N0F-~yA)vG-d!2Hqe_D8L<4pf`77yqln&jGwjN>dOo_%%QvsW+UZOGV z^6Zfa5V^Dcyiu+3?mygV_1`xZXKzCm+}As^+bH>irB87`ygwZLiNXH|4u0Q)X5I{G<$QMiAx0Y@i+V;hp!nypjD@Af=?010KPz zLCd%^_*VlHQ{g{ph;R3~D;*y0jOi^G{A}(}rMOZrqd8A6^6S zQbBh*^_~+K(ODqLzZ-DsmE%=b~_vTuvOh$if!jMOc%)D01j z4!VVlqkEh7#$-J|h~ts>KW)lB9fl8wEB%Rsc?Y+FlPG+ahiR$&>qFTVR-I0%xg8`pqBrc7jcA*}r1y(@4fh7-taj|? zRTyVi7KJ%nJY3jnQb}t?44QUgP;+-Hqh$Yh+^EMyYg1!1?@vmBl;DUxOEvi27|?Zb z;jOHQacm*(b|n64sr&Ctxu_yf!4;K73mJp-2K5Qn6$ch~Zu%Z4p(NtL(la0vhS0Ox zZmqH2Dq_oyc4c;Ry#eS%lNDeNrWS_PIt6H1c&(EF%i5*H8iIDR@p8LU_{jEGy5xUE z7HTB>N}NjSgLawpQgJrH9?dCFh%;?2&%df$AO!S=T?L@Ymfa2KD4zpP(OI0W6uVrVzP z6-Y+gK@F|ZJNl42ofPLlVftOGTP)qgw&4R14kPBasaOO8Rnolr5>Q#yz1fW;0=$Im zqj^CxV5l{IhJ_tZ(C@pYPC!|?zUxol`(MK&2kE03tU?%S*k$(zrUW#hiL#z)>mycM z)BqZcbyQ=vtA{hIc@{}`P%pDdMa|+y!I(+T4-H(tU=#qtc^`o~ww-se(+$5zOQWP- zAv3lCgumE-shDXWHfXy|Vk*?jl!{V(B@;sONsXsTQV4qLZy;> z(BpQbj2U&>YlIr@!^AgLMO3<0d8qC zX-?YB2T8uI225Zlt6l+ifn8Zp8VhisU0HBHH1kM7zN~or9#rjCBw=9U1^~6*`*Vie zQNlJn!!jNpB0JLIL;8$^f-W@#i7VW&1rl_z*{O|i2I;1Ox2m1Er2j6)3K-TaVG?$B zyxX8o$}<`;=;6FTRLL~8x*C=RgTS*UER&hX_-?E#s%4H@`$*S?{p=T>v>D6&=ki&I zF>0yi6FaMrp9UP)a zlUHZtXw4$4Xvs?B!l8iG@iP)=U1&f8g_V@ zM*Bc6-jEvmSIKvy$%h$WdQ-^D>@w#}xKH+=%a{ioOFrP#jUJRPevDvtHT&rrzQV)V zG#4eTJ1|br2a|vn<&=i`=8b@%(I7j1W)O~9JGcS#V{#|O${DdJt`&E1PG_}Hto}pC!1(}40xC}*6b#o+& zxU$}{Zefycn_M3!mP(6y>r`oMptWC%wpg5S1=RJT@@jI&8|jGh^ai=X`~&w|Ea;KR zoG5kYBOGkc1{WhsHs{POjxdHFwRuy>x0Rn_9us5qw_KPdq!BM(R=5_sB5{@#r2dW3 ztd|91jmpRZ!er=WD)7?vkv=&pT#H}1H7161HEPMeGrFJZDOYN_&cuh5eA>U0cL+19 zF*NVt*3w|)Et|JP_Zq!P>83Me>FN+^MJK%I=E~;G^H#{fG;Y{ot9IMJEd+z3Ne0dl zSr}=1AlVn2%$B(+GK#zHl0Da8Io+_JEGSjjpBZ@&`kZiYW|`$bN+3c7TMhd6umPP3 zHoFk=Xp)B-fR)v<)l+U3_hoI`x<%>U z?Djn4D&lBG&2?a0ob0tNHJW20*&D1KJ25TI@ZhY@Xp*Ho8VsHVCYA}?M}J7^VOYLh z{DS4_YH_GeawdTf=`v zWA0tR;}zq=WDUt@2a^IyxxA`UE-p+0pi@cgpO+e6v2As}!1XVtVlLP!>|heSrZPnP}#q@LV$VBwr#^C~|vva;_A3nueL`Ludp zh^70(raR|k0%GLXq}$Kz-EY&IgS;SSrk`emZ*G2z`R#O7Bb3qFo#4C^A%9aGfm`g6 zHt9GQTcEEqcSj{jSlqk@PPD(}bVgm!2yrASM1Bhv%gaBzGOc<&*_O#BuD8nQB z;fJ}2DqCh`GjH|A_+IKd=zh=+H1>Yn);c=s`3rGUjmdQ<=nw>c^M_#0*G_U z2OYua#}-*ASg8H=FL#wqjWz)TQu*X+4HUV)l`jeeo|5}Qp9_*Y72>hoa|1o*KawtX zt>mMgGivav~LmgN;2}{9b#8&LG8-xLnpIL z(U4t7SN7;MnSDT8Iw(>i^K=tKDtd@$J`%X?(4(z!IYk`bw#PYiG&K z!%rOdsJK5_urYCs@n%JnpI_1(TuBIV)Z=K#ew5(N!l@HTvztqV1PB>ZpJ2#PoDiX) z{pU23Pp^hR<$yrOq%np)P^!&^rXb{W`sqpP0z(~8#hKK|NDk}l+qdzu(54<2$(#)@ zkIhatA`L0}w7y)y8(aT~GPsx<9i?NWtjHrrMv(76Jm*VCzB*E6%Kei)eB_13OaviQ?qU9 z0EI}$Ic^MsFsAYtid@i*Q|f@q{+o<$71B@`#OH1?0nGPgX` zvJxuRvYIq1jh<2Z%rwAxXTzmqV19F6CL64LIg&6}L&vY|3eBXjuyH|i{l4a=Y34jC zyOMlgsGY%)(KBcPyOyux^&w1-BB1fGwi>WKRS%5qVEVWDKb{Y34#i^Y>2(Uw>o7Tz zNg$4fI=0Fy_(rWOd=te|hwjUD00fNHW^DeQk%9m0cr@(px1hYGHdV&N4fD9k^7@VOsA?I+?-x3-@Y zrzrj{uRyO=s#=+_V6WIQ_ZRj3pEIER&U4LmvF_Fqz-6rug77QAlhff=wyOn%0kWb4 zwT?)aP6kuYZ6lO#WbUL7Ilglz!2x@L+j@Egn4MH?3KO0=I~<2K&)5<&2S?1eOHKN? ztwXkib^Sd{fz8!U?Ve(Ey)mXVdgQSwG>kZL9XOrm|* z6mpE;tj51PKC6LGl0kUCQ`!(cUu>XXYijoVq;?xJFNH=_x+oTIh5*n^IHCP@B&GL(smv?oj|tfr!px7BnDdFBZOT+B$kA69<3g5t2o6p1x;PuH$Jg_>0QgKq zwgdyXr&ScN;jFAXO6Vz@4aY7Qc~Vjg=lxdWEASr**T7&5W)*7tq;D$K3h3T`jt&|s zqdr6=zfbtT5xwvE2Um}oqNz1*d6niAp8Cmqxp#hps0%PtHf)pB8fWVqv*id%9jAdF}sxbtgk;lM9Pq52ve@Q3vdG3Yr{PaKz z6_UHV08_8Jzb_O=BF(3!@P=`N7FRt6;ifHtQf5r*z>75UM)%Z;Tcpy681ec+Zu67I zChu|5m=p21K1oYB45&PZZj|ouR0@LtGSbi{ZN_UJ;8dmX?*>KS_z{QX(hX3H{LS_std zFl?H}wMykZBHvl4UF7pef#M>pV~|@h(`IptLFrL*Z*ys$qw1sx4lcdSdzw)v`N^l{GqkwUOCc6+k_*|8f2L6BDh%XDlFN@lc-#M2 z#@=fwQ}Q380el9(O+D8T3^8OV7Mi2T{?8WmecZX89yPv*Rq+^_WFji0pQATR!S!Va zxcQ{f@e{vNGSuSqS(Gb<)c1lLWv;=XuYC3q^w1~1HDn*@2X-86pT}nQd#2R()N}}t zh}b{`Xr>Z6D{x{iyDJCWp?Y3Cq7_6ew)VTDz56)#Um*6Tbp1=E}~5XOdqK(o$zMzEI)8YEQE$KJV`KQk}>BqV-Cs6oOfdoC$6{&J<}cYZHbfE$C0*lYz(HA@f*Z+!x5DVocd%@`u&Kw8F%l?EIv2K)|1T(EescJ zwIOg(IX~OYyQc&djK)nUN^O1Qj&t1sDOfC!ONMx0axG&!WUz%Awp`>ZTy&la2@xLc z+o0u7=LpTyrwVGf(Q})6ErogX#q9CJ&IRO$SWraiqZ1({$RIRz-NIOc|GYjk*9 z7Sle$FWS_?Zl_Yh(r_7v7}PKZ9xZ)W0mC2cstzaem2Nob>G?V0b6QG%x@N`&rx?N zw#0T;#Zo#GySFJsY8G=E??dKP9rtj>lSDf9tQ=6CxMzZWNOaB2n1gZceN1Gnz{6)s z79$}X8xE#zYlm{abn1*=Ssgh{kuw?eTqIYrUngAGM5Y{cJD9PT&`y=bYMbN=v6U5I zQg7Si{K}rPb^#WwQC5TDvluuV|mvwq*X1m-a{6-=85+@cKAVvTg@D z;4hX;@5zh#5oBO=kRkMK2}+JsN7^c{STkp)m|Z!AHeY!oP-gwmN?uz}lIL(44ZyVJ zj6~}h#z9{KzZHfUm)O~^CgjBi1(9@JxA~?m6gz#VHP%0Z*~LOb-Opf#?M!w#Rw;%A z2TsITlw(M0NC)0qu0owI@7W!*8SHVIVYmUk!+MzOKjOXoBA2IiLY{Bg663IKCUpuW z(Tg0?4x;o8gSCV+*#XD&<*RYj?D5E$+(x(9cBVs#gQu3pd;0SyRe8iZ%|b>5?0;o1 z|FQ9a2c5c&!UF0OCrVw&VP`Ay4Rg@$l{?uycTmzk|J$kvOyjQSNM3}c)wB`;RQ1R6X zU-XMXn!P{dprI7Hpz}bKv7H619S!U4RxjUHRJpywQ*boUG&IRsr7n~HIn#h>h>6jM zh^o0|>ky`fGG$C}NwYOf{4AU%55kmqt?Q}(jNyJooeRXj9j(VtCMNWspiLF$C|V-X zD2-NkkX~ngosk1A;)}QIq1+rID&=Zsw14qCV}n7KZjA!wRu?RPU7h&?4YRMBM!m{t zd@=pC(FLHAlpcH#9N)0XXDbz81h!aEl~vH?^rGLMG#FQd#L17+=5KQ!R@5SdG`G?a z;*Xjo9@N?aD}Jlz0dx{@eeu0bAcd`@sL$01?&UE~Qk?HS7u_$ydtcSdDxf{Ey#$x% z$lAP+=fh2b2+}e0-#9~TH?VULt<8f!Y{ov8n@S33-}Q5@U@<6b68frSci2t3$*%^qTh>4lPX#Da{Z|Xl|cNbi65}k z{HXc;y}4^we-?u5)qcyuK2;fw)UItHFnf>2%W-fz@ta6vUt_QR+r=d!;}fb+j=1Le z*H}K#p^55@+YxDAitsp-jjXZ#|CI(GKMNJk`etUpz0wNTtb?Jc&VHm)noXcaKEair z(l^~k_5mv6!kk+vr$9;Gn!DD!k&6`y_R+0S3AO39@hY#?9VN_Oz`!tAu78*T|Y>x_%Spk#(V6@E(`#psvT`3oJTapb*2$>HJ_?u3*@Xi8vFq+e?& zJt5bwMVc!6IP1VnoUI!qns8Z<+68lVmYR&a7h~bs<*sM}C?eMwc;TsKV0UUW*5tO} z{@CECGWkPp#s5eX{r3!p(}=qP2O~0Mq%xZFV@u`_w9DbyZQG^m_w5G6H=|e+kI*hJ1I1{krtU?^Bz$EhZ!YIxJ_YQOMIu7@EtW#IOz2V`yg>> zcR%e&g;-_ePWpR-&%e(~Z%7v!L0ayS7_+EH^WoU126b?-Z>^}em_N|#{BhD7js47w zHE>qBQgN3*IuZ(RM%85$mhJ5=`G1zoc~%HLzvyX1IykG|-#VRlF<`ltH5*X21`-gX zYxOj}@HP7I&%EdV`O_e0QDk$@#iMQyDst9018G&MEKmI$c~bDkQ`5~dnVArXD~2Nc z%*uPn>ygbcjkGc~0uGcO1M^El@vQ?XlDeYUvgR=B$z!b|`Zh-v+kPkliGLS+f6uLA zS;|w`Ii6#t&8DB$!3-jLTMyUn?jLOC0>A}T-c1Zd(xM!ju;hG1JDdEFyvqA&SSYFu z3^69I>MBKW4cI1gIkiSe7JX&^#!a27+TxNPIvqbkZ1RLD?eB6te(JweOYJ1dqp!Ja zJ@)0lzFAMV)^pn?WRjJP=<1JQj!5U;(ku!MI~OE#a(PTvwFq&F`-K=q2ZxH2WRd%& z9`S^O{E@`)Z%)u8R|ZyDv}ar$&Pdy<^Q@yG%3xSpiI#17ANQfgL$LiDcy2J`!piI4MOqZAX1;)M>@6LVO3=7UY<6sHuXKKv=h=SarH3 zJ3cW*rh~=NZL(TiFf|?JBNx=yM5pgXgbnNdp2*|#it{TnQ~8&J3trO=F?7>{_XZr@ z1Cz)td!Fahn7!jp%$33MHx=+A8K#68J4eeFU(_FezDkyw7q4rY6X$eZ!B%mtWGAs2 zK;Fr0ixAZG)d`3UUlBOS{EhcjTxedLeZP{Q^|GfyjmsgKgA@#lo7o;N6bx+I}f2g&dHK~jzA zzLX%q(>10q#`7A_pq2Y+Io1h8x$m5A(#=#HJBY&zEW)78u`8~ zP`(5L-|KDNyXfB2g(xT)@@lZ?;5OgM8R9mF&vs%9LsaR?41*0jIN$OrOCw!Z{B(Ir z@UYaTEb;I@nK;x?5MOM2Fl`sA8w#`YUP&~F8o?uG;$Byf#&j_gofcLefx~Hv(S~LH z@&dx%5q&#lGpilp``Lpa4Dc#a^iLBP`R{a=|8Uv{swQ@GtlE1XTtt8hG7PbatDLR* zj)1b}&o@m|1JQi_hPx?eB3!MiFfD-N>x~)=IC>PE>H1}G_>f?}4EvsNx#20_@em&XOy zuL|2?aU!5J7mbWGHw)Ot{W|lRQyqb{Yi>l5+w?k9l1cr+F6H+_c=-_5(Mf`td&wM7 z@7gl>d-O__<<|%#lP~-@Sv%#+DCy|wX+%V1}%G=psZ6q|dlfdh7NzEpH*2AM~ z%-v0fM%Gwc8g)!fuora8SQ`I7{DS$~m~Od_ih~d*REgWp@MqOehj+LOXW4_Jo9g{j|;mp8dx<*e8-UNXEf2I-3P@sVD@rGU{hH+#b ze_~({6S;HQr28endFG8N^f48EB>1fj+l-yjaW}Y@9X>pv-v~D3EY)#cO^vYK(FJjI zqTL=ZRXLx9(YW3wsJu7@o3COyj1~ZZ7V{b}Of=O$wXPhUP>fYP*AzjJkzaq}7G>7t zVsCm(x0Zo()BL9x=EXvdMPJ0G`zWCPxLOM^!gdJK*lXA(xft|wFW=4Xr{!mliE0_{ zRN6d(Xp){pki-)>2ddjS+{?0)rL5#fzn7K5v?gNajQu!_pv~@Cn%D1~mXOFP^y`mN zXOx9PiZF3R^(KbdK=O1pE%THqP?~{W3UzM&7-ra$Vt;lsgn7dH#>5AT>z~g=BFX?7 z#dGp?X3g#^{9CZty-c*1Q!9w@Fd}>y&c)bG8J0K$=rd*MIC*jv zUuV|kwqa+3rjL9!rl8KifnvNY)?(<-XA}g|jqIFsetZ(qZ{?@dr#MfYGgZ@F|F2fN zrzcgCf2f$iSQM29!C99wJi}Ki8lmHBWThQF?_XU{;iDh~%(Vpd5p@5W31lIyW!ZmD z$vg+E+yAHlsV;yj#B&UArD6gG?LKa0?HnxfTB(~fP51mc%)8am7go$jx|Sj9FA?L71rb&-^^8BKE7 ziQyHzw(ddzwwtKCIQjsv$SmcI06?cq+8tnI3v_TP0~FF_ zTw7l?ICdebqm?S(5*rF7^n+Qke-ASX3v%jPLcH`d1u{6EMoJGSEdCVIKiNJ+K3Ap~2k>Bs9X!RFVS=;G^PJ4Q@X5 z<8#fSSV-H|n4l!Ulsg8`W5X~5!ZBnUYU z|39AfU25$fR^ixXLAOmXY8veNoq?z02>}3jeD);(tO1+mX@F_&K)$4qNxmD6dvD0? za`0yF3Yo1Syv@=HI3D!RAd}=IIwVpD8T)S@?83-nD_z?=xg{cMSfc_59fSZN-TED*_?@rQGpSN1nkU`Fl5@Cw|<@pB_2$wFX+?R|w;R^?rlk@E?Diju}^<0r(nKA0jnX)`3HevH$?fZ{SM2JIjcH75W`9wlx^c z6I4+R=pu@$TcrvimKw;6620u!>zd7MrduCdY%QldsHmT|&Jv5?m|rnvW++A?MtG+Y z6H>&RFxXWn;<64%VDO3MB05S_xmisrkTl0x#5lC(Pkr5_y@WitiMpNax0Z|e==FHO z6e+pr+;~4Lj8VRgbC-ldm=7+FRF0Z6%OmQIi41`IE}Y4(d5kIW z5L&|AV{fOH5~R%llF}dY>N^Yo0Kj?UeUYp?Rplx~7$;ACcvN~2T1Pw4J6zBd7Dk}b zyllFko%Or}cDd)ksvNvAfRjk--r`}2~Ov`_S}Z#?;9aUxtvuztBx6_svu(b=)((|bQdFG5<_y3QqL1|YenVs( zZsK4UjE3-2eB@--lGr&%$?A0_ddiRTH#_o;O}RDUQ~t!+P}Z*-&UCz6gsJBg{HDx$<@3gPWiCTp}axtm~X>y<9;>H zCRwKa@Uec?Zw`LT4!2Ls508I9kOeEFoYIP%$b!ip+o?MO5ItEC6&d1bJIIty`lF&; zVati5xDTV1J)LuCRN;LJ07&hUh`{@y#HW5gzD>#z1zU7zp%uw##eaiI{DzliBsSrA zhv?oikC8Z*4FEuj%Mt)+Q8utWKLDX|UQ%uZ?}wMoL#LH*3u8@6*G5RVbK?h9%Dx0X za*lt0mR?Hged(kXq7fc!=X-##rY~YrAm8WQsMn!Z`z|<8%S5o~;Ma^@CkmwY9o_%p z^(GCs^9%W4z6t4Gu`-@qACzlG`Z1md`Kszc<(Y3`QMiV^4*A2@+C^fk;w)61@Co8xv%xrF{8??=YD7|LN0s=;(=EZw(Te>!(JF2KnPzZ29!KcqrrRxXEln=<9!ULM+uu0&i z9_!eVXws>tT2acb9e^SUsSPM614k-R?}+1vaz)B=rm%t6fy=m^EO6BemgIcq&n46) z=ivl9D4+Up8xpNQ*er?OwK*I@`XI*QtdE9RDgriAUAy{o=kvQ>cZ03C|^RW}ZgPQy1rLO;b zoi1eCkACukG!zV_%uyKL;j6;D(>G+f=&wIDXD!DHbFhX(gqQT8n9_Z4S~nq=kzdmG zLBGZEo=JzbRSs^sR`@sEBG0GbQaMHf3W=3pBTf@C^Ms=;kEEO>eoQ%;+(>_M4wUQY z(@$m>zfS#2Enbiu(;We?R>G^UO7}tkBb~&GLg>O_jMjrlS>t8r z2(Sb|(T%{LarGcz6i0F1noryIb|<1xr99|P)5<&hp+G_OMB-~MDs>dD3|R@3aJU*h zV?=*#LLn(ZV_;VB44?KXPi}(Q=Eq5d%-GXiru1SZqX%=j)dRC7!fn<}=Fj9mws&f5 zqLV(l8;cBpBoidx)>G)Y=Nwf!5IRQB5 zSA2}5e6rM7v0%4B;S}(UA)ATV)P+R6mk$73qOyyCtRcWlbE5XG80WbF^t=I2REOXO zqE)QLr#hYXY6tS04T2803Km=^msvYWkWI{GG-R(K1JC;X0uB&C@sBX_Wko9)w9k=% zn7E6_XN?Xzy$44QbgSFdL%e59?uC3)&DKI8G4&s4y5FuVzXP=}vBR>&i7R24`Uu9M z7$1>73#MwCV$8!W&a=`^Qq8wCoTaJotR*XMKT|!25+sVC5PR#S823udo6hDTuU3vrS&4Hh;V%!A0q4i9cs8(GazOMDW4T>y9 zRJNaL6L_z6<8$b|AH3SEBB^Cht@UM%0u190WiU^odYO4H zJ-x4s+Z`XfXb;)|b_ob_El&%p5GTaWgFLHnSP;uP7bx>8qJj+L-!Q1p3ar*2-7X%14nWgLY4vZDHZRe%asB0T!a7=OIC9*P@${h|DuT8gTxjgb$Gd>>*- z-x5geJp3358F^tbSK7U=J|CsJ27f$PZH4>V66Sm!o*c8E-Y}-5!u%Sg<(;(#B#pr@ zv;v0JU32%T9#X3JE`CfbYZ>MNu$Ysg&=p!z9c*J8#p>+8u>sa*9CR6h>dSRcDgpsV zveae^oQ!(N>@Nmj!<^9M9jp5Uc|CZ5oDsG}*wwFDbOB0H8@q#~w;&mfE#eCknB>}- zlwGzZQb2L^R-r^m;G&eM7j0YuN;7DBVZrFmF{o&$(}XGYf6?{LL7pr@x4*G=%pKdd zZQHhO+qSJ8d&k(ZZQHir-h1DR_s17sbVNr-MR!G2o|D~CotdWu>r{1Le@3RtMW9$B zoqi&GKHDtiMcRr^%?Xkr!!SrAD$u2s3Ey7JlDs$&$njIB>;r%&53bxk z{`ww3RL;vE%7E0PFi9FgF#(dg);6IkVeD%25A0;)$|{mQet5X}k1Cj~K&w|uxC0)I z4ZQcF{bB>$b#qyxZ|QTC*1uKf4I>&oQr`>~d`HdWygLOP7@PSTSEN3Gme*Lu8AaK zHz8nDi68)a#exhG3Pxl<;lkR?D9!il&w?gSu9ne7q`!dgV+U0x&COr?f&hVW?;-Hi zRY>D+d-6DdHFcWTno#b4I~+Mi>$S`Q`~DjL;S1CU{}#ru<9|ROS9!pyp`G{LSBAJ) zSBW_-{$qux?5Go5>M5=VoI0~pm|1)-&Fg8|gUM-fZ$)|Zg@JqMrOY7nwy*%3fUx9h zb)7nTllm^@p{vFuX(s-OLjPvx?QUJ7__iU*DOoT4$e5+rH~RNSxP7nIir#LKZ#qL> zBWngcyYI2^_^H~?3bDWy0r0aXLPC5w6>j(sWSzB(@9QNI8e6B2+s9b~d%h-S-<2=z z_$g`rhF0xML1d$Cem!Qg1#M0ucatX$*59ks#QV1R*Tx0NF7$t* zHK@mbXX`1y1wZ`A}NYG=&eQjeVKY=e@b`6y@eXQ`3k;=V13pw8r`W>fs+ z<1OkRqnQGtNGhAN{X_0m6a7n!vMDXan3DUQMB4?ci4uwk`s6tA!VD?U*R>ihb zShwt7mDBd#UXMR?B>w9x30%c3y=-91NeIkcG{0YQacH4({6dH89ama_88`3YnP}>n zdNThgW-ZH_ls+9llCuwXFNQu?4XA-qT1jXwS<|>Kw(h#mzmsIg>j%sh*nT#GS%tSS ziI9V0>s9gZtkV~&**EjqeD$L%tBc7}l4I@H4Ca%9F75LT74NC}Q64LR?)jq1ev_j( zLCGauuzsR6`DDlAS?OUrg5(Pm>W|Gx*(an1ZG?Ypsxa^a2*1?x&-b?m=-U9NcH@ZP z5)SE=?!eE0x8L4L9u_Hz=zfEDFPx*{%c3t|G)y^Eyn^`o000@^GZ5Qz#Ynh4+@jL7 z#szgkRmfqHs~f=C42NKz7s|<08*l*Xp_Zsc0Zajzm%Vc%R!eWEWFkqnTrUAI9nP+q zDvvkeC4{pt=;d;cN6eEBAqdGp3?&BNgB5aFVlMVcb9c)eWc&fQ`8_?4a#p-j{PO&# za7xWZ%`eV%eHF#{D`As{%$Hlgi*d!*)|Vq>-sn2c926{~KW-jh&eA zAMOCi0mwg?fG1`syE)^R>bXU)2&QDs@b0Wkh7E$~*0{qe?{lvhyz-65hW_3R+{3@Q z2=VadSJe)X2*5g^P?FHfwlWe&7Ld(bs%3_P7KgOg4R(+OsAf4LI~7#w*#=X-X@|fZ*s65Ad#XqT*B>1Xo(kE5DYNZj>Jk4Y86@{d?mtk-+kLW(_?ou ziqx}-xa)!5kVv_`aqD~!OkX1HIhpD~1BfK;nCL#(F%AHP>l6C2biXx_Rt2|$M-strSM0urzecJ$ z#(n#4!HleNx&(3kK&weC!Yrpm6c}78Jj_6qui7Ja8YqJrc zw@-Qnyl{}|Aso^8S-p1dPB{_Y4!14QoL~j>&(hx}(=O~wBwdG-UKo52iq4?#ht6YH z6iYCSvhsurWAhwlxh~-{#zoQvs_l);q{0A!di$IJw^a-}>R_ihH3P`UcrD;^2X-jC zw@^j;QmfTicr%PH?zzS1+S|D|}osvAW z^Ne>axWn#eOPZzndcpsB|Ad+xEF|3`VVL@=k+IC(jQmsSnHJE`Usc+Bz_@KfwRfm_ zsQaTO=CSQr>NAyAs zP`>Y?$g)1zFh%wVDn{9|bcD#Op#l%3l28wYmN>4HHilu)+K9edSu}ydITS)6nxg^} z4i!TMc-_YM=jd`Hc$AG5czF#dmXntI1LfmEQtuk6b(Af+5=unSK!0lffsn+UEZiVeMTG2g<( z8A!M5o1oYl_~}@j{lORtOa9=75U?0&<(nnfU_h%g4y%XONr3lV8tQ8NW!*)l3vUJG z*TA9%sRs^KCQK6lyRv}o1B$S2ftxEYjwvIXy1=(2+s)LJe?i305>+PrD6gC_>fn_p zl>_x5V5Wz=zMJbno!1qRvX%vVZ3tbXOtsog3D*h}j^Up;Z|v`P;=MR3BYB!xF-bSs zf#C;iw`FdK9DqlGk5Nzr_shHd%ep_Qh>uQ{7J@A?I#CRThJi9Fmg_%XDL zCH)b`8cCymCf=&&PrG~U2Qk66Aif59{oaI#{J&_x=*P>@pa>VsObX|V@l#+8>eoY5 zI-EuyIOK_5x?mE^7}|p`J};o7juo^Pbv9keq7wdHZ;ACkXHxZyprA7lMZU=XYW%p9 z8+^BpchiOveDbvm_(PxNjOKg(G9Rhfw_ln-cIFg;pB{RSs$PpD$(ALUqM4p&i1izoRQ*YV}04`c) zq;WHafx-Mp?Kgpj$=w(yuHKos8GuI;{Nm|p-e4Ri%SiJH!9Q_Lq=?W>swrf~N|bn; zsGPP|$8!M*-_%dV9ObGq(slQ<5X60UvMt&OyVeW-^Xk;ZKoAO!Fk29fmXm~ebQy{5 zcq9^o>jhBQWM=i(?^JGe#d5etlw05$ckatdSGCebyO}?U<_DiuhWJK^_hi-$TZv_a z6Y&T|&5_&&!?=m(qbvMfB^3G?cktQ2py^IX>EE3_F{gE|9;lM5KKy*@5~xo)3(5)k z!=I;G$J{3}9KEec3Q^!!0~CdnZPN~5>^$0*$UXp2x_!&pg6gfeJCu&inD7cmu9Sbb zkPK94bg|{XUDaUR8frPJ9^7zmslgP7mtKTU8-G6w3}nsQ)_pYq5X|Qf-J!CX2M)9m zPE90<7tJKS4qtaa*S2o=%!upMYscX)1@~?$X zk=M2J;9Pw1pW9aXeuT?C3o3w)-!<(A-}Up`v=s0XmlgK`r3M zhptQyV`ZEZ*Yc^~yDaSxf`q6d*L2ZzX@|=FIQAa3Wr;D-8Q#4~fgFdu!#|BM;CU9A z>^qHErvWkD=oWdnLm3MmF~Zox4-6&kV&5G}IG}*mTcZz>fhhe;Pc}YNF_4 z9EYb7x^dm}&{ElmlH5rlcI>w?jA=6#S3NL)-wn z&1#3g?WwGSEaYoFbjJ(D>S?l2ef@D68`w7Y9^UufxVR0btu!#SNjtI54@*lE!}$7?4C1^tdWe$Ery%7xL@$}H8%F?CVDt++-Qsf z)tc57(8+WlyndrJeiTc>jVhQ<#GD{^kHEeCt3)Snm=-7l3--FZq{I#5#Xr!AX;fyT#nZ`@$?Q^`|s(JH-0yg4tA07&f`RU z2DJQee2jFuRMA!6{tn{SEO_6(<2ytnzh62(-~|6R-0q!n_kt`jiGGzwqzc$(-0lGU zi$A;Y7~E^>=L+BnQF0u7Jlj1z`#g5F?$?3Jq(!3X%Wl4$yh>kVz!qsOd~$YKJ>R=} zaXk*+ZCntM*Y``$}E#5^h-d_LWULMNs#R%!l*O}w!0+Hi+#_py~Yp*Mh=wqcP zTIV@Q4Bwz%b(rKd`nM7StMUUzvcF_s7EXFF(~QJaiPCHA*#J=0&(u+ylYhWVWpXAA z7RN4{p?Pnv;R#l3=n+Il_zyVx7ghCD81UWb(Dt3^-c{bS|Cs$Z_}QLqM~RRY&7b-{ zQfvTGEShHOppDMytzhEm$IoJIDknWR)*PK`xX_`Ma^C~KpayH6cgYa1AS>L;Sg|QM zl8=?;PE|aZA4{^YsJ7o}X`&Ok=rS8RwveaW^JxY~ZM>A|wiTKBbgkrd`7~>2M~g2< ztJ3p^N4aS8^y9wEPjK(!_JfJoNG&Lp1O-5og=&;6Vt=EcQ&=L3#Igyekp4VbTUja7 zJGUgj*qCTEPi%z`h=TF=D~=OWWbT0fuJ_j5q!R3zVF}QG8;L2;{u)h;Es^ynSC$;- z)kKw>3Ty#wgzGAsUla5Iu(jQqqBXR46oUZc&%O@vgb$uk&^hlpb5-=a150%?#Ih}$HGW#)l;gKQf+ltL5KJ@)+mEn_ z({@W2Ph;nLbaTTN@Uz#l&LJQd3`|3KqCs)HJE;dg(c#xXK|r!r>=$jX^;g78vX}Co zRj?=GP3uez{8v~tA0vLoCft|!&4w@N4}JnZ$CpTY&12?2EmT}lBOAMz^eIS#6?B^zM8$~71I&&Tl-!Wf>}kQPESHo?cg#od3ku7 zZE}cy)8}hfss0_$Yh*Jb$l+;ItEar4vPSHSz%;MS=@;OmH3DUp*=btPs*JdVMH5{l zrVHzpQ%fM}=U0Q98kg3^uhEK7-Mtb_)YbXTcGgMN<5|trWE6WSOt@%!X@`3}U47IlA z{)T>D22nP8#gDt+_`Y!NSHb~H(`w7BcnsQDhr~n2)~kOad6L|F=n0%GCjW&r%wQj* z^(-NXl}!HP%GWe3Sg*I!i83Sdk{KCIBRQI|hXl1`yxuHIwU`IXwvLiI3n`c_C6@b~ z1OXqre00T)P>BcBgT&iPLMU-^K&((xMQ2O5A+sAbTHnR&_N(-O#G!LOoi^+_>lOJTyhD)R<&W8rFc>2Xv4;KJg7#y3@zeV=nYQDc z%qKL%@QOwh0(w*p0|Vj{RH+F3^(z!e6op>tL;}Z;0{n2xM&du_ZLQFznI!j=Zm37D zzj8i5fpDV&zqT^jL3kRyaCuD+(fJ8S7r<;Qfo1Q7*TyAtltL*OTc&1yCa$1y%3}i(>wvdC=_57Q z@$0-^*Y5zF8LWk4BEWKarQyP6Gp2J3!>@Z|ydSo_PRT%RWbS=^pLI+wN!S5TK++#P zV$4zMiTX0M!v?e2)+s8mLw55L4T}X#Wv;-NQ*rw42;4PzqZk|N95E2ZOF!96gZN9<(ga2ov#AfMX>;O^t-w; zrpIL9QvNA7mwUI{MgEha2um)RNwA?I`|x=`SPm}vk-oS>@$k>tN{{>!BPAhgu{I&K zbc8;)Z@PRBTrv5Q(nK2r_UZr!CT{aPXe7hp*H?=6(kkRe?{5YoPHB_jzmCi!N1IOO zejv1>zb#d<=Grm=ad*4|urju0W%Os>WY-&P4KJV4R@ID@-$~Qe+oyNX5~}liZEUTm z;r0|py##8wmU)tKb9FkvYFGS^N?S1n%&KaG5i&^1sudtJvaKy-s8hg1+AaJ<^)<&Ql)ekR4U zQp}3OO+ya-%^|Y@>j`>HvxE#qC# z??bLq1_J&C<5*MFMwIQ-7b-slA~oZZzu|C0nREVlnP|TmgcQyYfaImDZ|_*c4s>b|Ths-A8yjxR=B0;FycWBqj9l5G+O8EnB zISFxbKPcy#wIXDBG(MGaw%nB11mJe1F)JOJ5bXNYyFS%?c9pY|Z;EugHpF>T+(}CN z`|>n@=S@m}-KQ5Hw75VmY^Tl*sf7(HhI=Hrxjg4g zMRbPwXiHq68SR?dZMm_+dyOZuE8rOsMY9jnS2Kg82Wk?njlAYQ)e#_B=tBUsV2D3q zOKJ98Jiu`sW>Y%ntAC6{Hw7HJ;}4oqwq*A(3545u<`YUUgD3gX3MlI^#h=h=g#GUs z8{nUB><4L-^RR`V%c<5Cz5uDcEPa51sK{vj7k)Ykc@bAr;}eRkMK=PL8lh#T=L+L} zp=G=7BNZ7Y+epr|UlJq$l<>+!@3c8~9%x5i7lw&Rnbm_*q`8(DD&&udCN&LONgtjr z>5^asFirK%uCjL4uwNP*3ZCS9$zxiledY&Kc2i8eFB%5I{!b^Xv0XB9ukq;3rvPP9 zahRA+N3|3Pp-3Nz)Yp7NB%DK;yM8eSWjN4Q|k!o?Hj4ZBGQ~_5gZp0fFOP2B^OwOZFC7o1U@nz15XW$$o_wPn4il(cz6!K^F2FOvJ$>Qbc zq8?Foc65ij#4pEnAKw5jARV+2JkHQ5R_fI^?_19V=w#fm2%?f-WVgQ~1Q)|U>-7ls z+{m`c{Zgy&I6~A8Sbh4R&%RcdI8j~cJ4!Kv$7&`@&_zAf%mye-K#)9RLH6X|~6{4o6 z{H+Ea&My$C_=|GelI$a-67x-py$}>8p(d;&{*;JA!LD1?>c*}$?873YO@?8O zx-6Os+`q`fd;tc3IT1-+b>vKniRtREN6j(p;1>^KkMaqG07tnnYeui*qpxpi1zZRt|LOkqHFXCPK&Hb@!nL-^dCx_R#$rm8 z9Pl%XE6~NVsv@PwoF65H2jo~cJh2>|=25L|*HLi*JkYetW!YGFKjG=@u_B0fB$J>U zwquPltfh^&hEwsT5Hl<$mr+>UTM*3ejJI%R)BFVoV*e_lmF$Z{fl~+s$D4wm2w`=m z!kA3*7Lkm0ZwB5$p*VVARRTpU;Jrq#(oFjH9IdA_peJ}qq9hLG{{OuWNA76LAQd=+ zKkxbPU6obs3d(pDb3mLgX3}@urWZoTEJrs8(6=gL6=fJGmTQKon?lJ+rf_}>UDh7Y z*bmL|OcEdLCp~OHxN(H%Qr^3|;)^XE50gChw-Bp`!F~G++yJ(&<)+#a3?+ssw&A%z ztR-rqMUpMPm#^=(+OQf#n_MR3I9)bw@(3k%S@MB_p~>(I%VCDMh98!_PWLy&uoJD5 z4wRb0Y&F4RVet&4M#<|0a#OUX#UNpp)c}{CHqXd6KHdi3gu1KR#}~pjC3U zmw!cN8ZZ8-w-lpn>VCkQR9dYF3EKbNjK02Zbkg!Ww&bF!6KKOn)BKEHi|){H0$>nz@vO>5iT)>! z_ctf|iV7Yt(a>)?)1?sMz7D?__vX^@`;PK(*5hO04%6455;DZ&a7yX(QGp-wjGa=C zJTHM+w zv1=~!YvY{i_sh(MUqJjf?1UREXqkRboZ?n3;ZmSKXmeo7vM(;iZVZ~Uj<;doUY*!+ zl%HWqaSBARvLsy9Q9<3{OrD$YJ2jS^xH7V#1a%BNnn*7qC?IzzgKYC+@z&mOx0cgK z>I=dYnI=5Km>7nHDP`fP4zr<3xc;`?Jfp-fC z75C@XrQpkc7rNlISaB{mX{!$tHh~P{%p*q3@A`+qINi|)b~g*16763Ku%u{r`3-wE zG}jQ(e$IUXE(r5I_1AiArxYZDigLYj32h6YFPYk0e1P(#a{hlgM7Z{0@Kqx|C&VFc#I}kjTMUdJW&#`JD-41pb13Tj315 zE8@^%xxw`tDsM`NK2iEB+$Xm1YyCYJWv=`aV)8K@3pK+R&vGp3vDJwHh58w;Vn)ai z8v*?-i{~t3zq>vj$)bo0xKi4n;SaCT_sT0qo8voa^abYOG>A#C_wctBrWxwJs4FR9<3p)C zsZb_fL?X(Ep4k^Te1y$uuy;dxVt(IIt@FMd5!~uCiq9L2yOIJ9jj8Qaf$A(*rG3uD z=5(Y>3qw>pa&~{NzqLGx6%|??x`Awf04vqS+BEGjw>-e*Fa(WHPyqBC`bUCU_N`s^ zNR{P!o)22Izqo}NQ;c}3+z?qRLR);)2Ty9<&e>I0DqkRe-isy@O4lf&*80h3>E4jD zqtY4}6elTs6hjWd)3aA^5i{8{-AL8H&;yilu=-p94FX#Awtit=OLm|EayGp8w|dHd z_{rx=DOaEnXrtmS&LlN$E3-66tvf(`e5{?*&s12F7XmFk>`?hgk8z2A!!fAEegDoE zxtdSOU$qU8ql7(=TIi2-J|3~>vMVlklsSIw-doUEMhUarp(0dUUDFnZKR1gR^sz`y z+H(aimmLJwRa)@4m4!BQ8i>w6vqvQ;HplHze^jF`Om^lT7#$Vx>yo2gN>qQV`#9yZ zI#R^67MTQ1*BlPD$f@)+4AVfuojJEPjY+1`#$8#j<0*!LF_u{uU59Kqk(qDvNNVLkj z%$%Z+<4^?NzLy@Z01Ay%x+VClU)GZnP9{|J8G>%wLy$wdCs{yjv%Ta29QYD}3EcoW z^n&lo{x};7|FbPCJ!<}7-2HkFcJwWD3L!^FUPw3A898aT)W&Am?^vjvirr;RJ(Bk; zv8_j$vQus=MC$~F?cBFz)SNDYbI1w*Rie|blRI~Lwj{_MB>e8k5@!%Azg!RF!S`Rl zfyCqE0SRNzmMA$u{P9Ue!68ivW~pL3c-f+MsiVex*W!R7QVHjAz4Izu5?bcJG_l19FbG|-s;B} z4%}Dsg=DCiRn;W)0^hApK?-K{Hg>(3L<+$ka78K&!>SkE?o(d-@17gke={~w^TIiJ zsR@lM+|gYPp5HmADK4Z%SSeVd=Zrk&kN=G2JWSm9#eq1Jt?@z9(8VmjpK_yC8cDpv z=D!89fgh^E$*KokAGdQ&smhj+mYpb`X5U4bIbR}jh%*~+sVWW&n(n;(P*TVQ=jjM&!@cvC^_;F7o0{FP zZ!@OA0O@*~R3f5oueMIFWRXM_85i7K_iOnYI%cm}8_jwWzK#ZfCcF+s!SaWUGm1LL zGIyGR$^|0pZ&AOme;@|i?`PmLzP%c8#LX3|6WEFnY|S{H``rXzRCxg+qrblIT%)rH{D!y~t5Ke~0Y@bZ3 zlhC9Yh4Bc};m+r@6f>x@;fh>B#I(3(24p|Q2QP88P`m+%F*Oltt6eMe8B^W!AbMAh zO}EiZYD7ur`gtd-^0>Y1)$A|L;?xj5fw5EbjJon{JjmAPo7T;)JbKUnNW9jw_qAlmq-Th7? z!{6~DoKUL=&CTSf)U$ZZNC-C3mln6Db}MWqed+@?juOS?2Mm)HMkbJdfvRngEdW_P zakz~|FQk6chg6n)y;nm=<3&LE1eOC`<^ZCT9O$2f*qr-ru?3&=1-cBHa>ZWf9RWk| zm2Nril8bwMPnppj$A()Q;^Zeb#^d19z&@UVZM(%Z5w(iu0Fd+9YBBAb;6otNrkOHl zivvRypWXOhh`b3uafHCFe1A%n=y;2d8bi&1f7z*UP;C5X@PE$0L%A&2fuT`|hs-+& zjKLwxrd#H<j zGz(}aMe=qpikuMOPQZ4Rq91dA|5X*SiJ&!8khuAG2ANoXxx1?Qo|O{O+uVN^c%P<^ zNxzi@uB%l_;|J>BLGtvXd!aeNQcJrg+_zp}YX7)DjCs(cwT9d0Ww+iAj{WZ06X70c z+AZ+@UFTW%HKUC$|K~PP75e~oP0xT|&FoGKD>Qri#frc8l)p9+B6O8&P*bzW(0>2H z8G0#2jo`>TttNfIDU!Fk2hybfotwO*G`UGv^|l)_xyz@pyk~8Na)T>gXr57pwSr|= zOze=P+v1#m{Cw_xA?;loxd}e+|Nlb*-qDoT2$|`lHKXbNkv+CMs=h%!p?YV#ea3%@OElHu zgk+LTCfxpN-9-|Qu`mmGB3-3t3HT-G4#Y9k<@d~vW9CVxH-kr#s80UYm{&LiQizqP zd7VC(9i23sA6T*mgwU1zd%>RV&&v&3cC)PTMoq4C`Cyyaz1X+)f^z7*5j+1T*;d!G zP_-wZQ1yz+2alN9L~(Vi4e`h|Vj}y6`f-7`8OAq01zd1$O|Ngpa>#$Gh4 z9}m6v%W07krR)Oabrh;TKPVsDM0rhnRMgS}gSBQ)s-d8*dndNm`w!ENM@CADAXeX^ z9-DtRBdSU$CE`H3KAkiCl1i^{iCn5ywlpx~)~A^phV^>(X9Lkg!-3@AM2L#r@qHH| zVj$1?SIHOyI&y!1Rvqu*_;^r_;wCBH%LI}~0;HsNKEr_hBkI_evk@egR1zA)PV}Ac zELCXTeY`GAqFmHq!^C?D3<@$KDM;?<;JL;H$ZI%;?NPV72J`&2{nRnBrco7n^}|Ni zfnIAvv51}J5!&pqO{fhRggLQj05@>H5+n;v_*zHC&c}=c74lC6lNKX$jn-^T(4(sa zy=R&k4-A9j!4$|vZ{J!_PQ5!DSMpDVCw(Q{mVdKbmwL>n(P}vs3BDDdVJTG?&5KFFj9IAG@;u2nj^rox1k{ z?^I6OL7(2pRp`sHqRkIknJs;7dPy3t6wh#1DP2_ucw4@Kv*VCeWl^J!Lqa%c4PWlj z;W9Mtxi{W@+8;XD2i=56M5ScM>9Fw5ම{4EGY^_h6bs7t5vjtr`t_) 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 BRHFa@ diff --git a/OCH/mogo-och-taxi/src/main/res/values/colors.xml b/OCH/mogo-och-taxi/src/main/res/values/colors.xml index 743794b7f8..3aa7cfc710 100644 --- a/OCH/mogo-och-taxi/src/main/res/values/colors.xml +++ b/OCH/mogo-och-taxi/src/main/res/values/colors.xml @@ -25,14 +25,4 @@ #657EE2 - #2961F2 - #14FF0000 - #FF0000 - #666666 - #86A5F7 - #111533 - #878890 - #EF262C - #4D000000 - \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/res/values/strings.xml b/OCH/mogo-och-taxi/src/main/res/values/strings.xml index b24bdb28d8..1c2e79dfea 100644 --- a/OCH/mogo-och-taxi/src/main/res/values/strings.xml +++ b/OCH/mogo-och-taxi/src/main/res/values/strings.xml @@ -30,17 +30,6 @@ 自动驾驶状态为0不可用 司机端未确认可以开启自动驾驶 - 欢迎您登录 - 登录 - 获取验证码 - 请输入验证码 - 获取验证码成功 - 登录成功 - 请输入正确的手机号 - 请输入正确的验证码 - 请输入手机号 - 请输入手机号 - 网络异常,请稍后重试 请求出现异常,请稍后重试 \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/res/values/styles.xml b/OCH/mogo-och-taxi/src/main/res/values/styles.xml index ec73feaae9..bd2964b922 100644 --- a/OCH/mogo-och-taxi/src/main/res/values/styles.xml +++ b/OCH/mogo-och-taxi/src/main/res/values/styles.xml @@ -23,22 +23,4 @@ - - \ No newline at end of file