国内微信登录和手机验证码登录

This commit is contained in:
2026-08-03 14:38:26 +08:00
parent ec3445bba4
commit 6ae141d6f1
37 changed files with 324 additions and 146 deletions

View File

@@ -117,6 +117,9 @@
<activity
android:name=".ui.activity.account.cn.VerifyCodeLoginCNActivity"
android:exported="false" />
<activity
android:name=".ui.activity.account.cn.WXLoginActivity"
android:exported="false" />
<activity
android:name=".ui.activity.account.cn.LoginV2CNActivity"
android:exported="false" />

View File

@@ -128,7 +128,8 @@ class MySubscriptionAdapter(
} else if (item.subscriptionStatus == ConstantInt.Close) {
setText(R.string.txt_enable_auto_renew)
expiresTitle.setText(R.string.txt_expires_on1)
View.VISIBLE
//createUserId不一样就是绑定了其他用户有套餐的设备
if (item.createUserId == userId) visibility else View.GONE
} else {
expiresTitle.setText(R.string.txt_expires_on1)
View.GONE

View File

@@ -556,7 +556,7 @@ abstract class BaseActivity<T : ViewBinding>(val inflater: (inflater: LayoutInfl
private fun Activity.overrideTransitionOpen(enter: Int, exit: Int) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
overrideActivityTransition(Activity.OVERRIDE_TRANSITION_OPEN, enter, exit)
overrideActivityTransition(OVERRIDE_TRANSITION_OPEN, enter, exit)
} else {
@Suppress("DEPRECATION")
overridePendingTransition(enter, exit)
@@ -565,7 +565,7 @@ abstract class BaseActivity<T : ViewBinding>(val inflater: (inflater: LayoutInfl
private fun Activity.overrideTransitionClose(enter: Int, exit: Int) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
overrideActivityTransition(Activity.OVERRIDE_TRANSITION_CLOSE, enter, exit)
overrideActivityTransition(OVERRIDE_TRANSITION_CLOSE, enter, exit)
} else {
@Suppress("DEPRECATION")
overridePendingTransition(enter, exit)
@@ -590,15 +590,19 @@ abstract class BaseActivity<T : ViewBinding>(val inflater: (inflater: LayoutInfl
//服务器返回错误信息
val exceptionMessage = it.exceptionOrNull()?.message
//服务器返回错误code
val exceptionCode: String? = it.exceptionOrNull()?.toString()
val exceptionCode= it.exceptionOrNull()?.toString()
LogUtil.d("Throwable异常", "code=${exceptionCode},${exceptionMessage}")
if (null != exceptionCode) {
//处理注册用户已存在的情况
if (exceptionCode == ErrorCode.USER_HAS_EXIST.toString()) {
//处理验证码登录,用户未注册的情况
if (!isShowCodeError && exceptionCode == ErrorCode.USER_NO_EXIST.toString()) {
getResultCallback.onRequestError(exceptionCode)
return
}
if (exceptionCode == ErrorCode.DEVICE_HAS_BIND.toString()) {
//处理注册用户已存在的情况
else if (exceptionCode == ErrorCode.USER_HAS_EXIST.toString()) {
getResultCallback.onRequestError(exceptionCode)
return
} else if (exceptionCode == ErrorCode.DEVICE_HAS_BIND.toString()) {
val str =
String.format(getString(R.string.txt_device_has_bind), exceptionMessage)
showToast(str)
@@ -808,9 +812,9 @@ abstract class BaseActivity<T : ViewBinding>(val inflater: (inflater: LayoutInfl
/**
* 隐藏软键盘
*/
fun hideInputMethod(view: View): Boolean {
fun hideInputMethod(rootView: View): Boolean {
getInputMethodManager()?.apply {
return hideSoftInputFromWindow(view.windowToken, 0)
return hideSoftInputFromWindow(rootView.windowToken, 0)
}
return false
}

View File

@@ -20,7 +20,6 @@ import com.abbidot.tracker.constant.GetResultCallback
import com.abbidot.tracker.util.Util
import com.qmuiteam.qmui.alpha.QMUIAlphaButton
import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton
import com.qmuiteam.qmui.widget.dialog.QMUITipDialog
/**
*Created by .yzq on 2021/11/2/002.
@@ -35,7 +34,6 @@ abstract class BaseFragment<T : ViewBinding>(
protected lateinit var mViewBinding: T
var mActivity: Activity? = null
var mContext: Context? = null
var mLoadingDialog: QMUITipDialog? = null
//防止某个时间执行多次
private var mLimitExecutionTime = 0L

View File

@@ -58,7 +58,8 @@ data class SubscriptionsOrderBean(
var isRefundable: Int,//是否显示退款按钮 1:是 0:否
var isAutoRenewal: Int,//是否是自动续订 1:是 0:否
@MultipleEntity var menuType: Int,
var renewNum:String,
var renewNum: String,
var createUserId: String,//这个订单是由哪个用户创建的
var isUpdateOrder: Int = 0//是否是升级订单 1:是 0:否
) : Parcelable, MultiItemEntity {
constructor(@MultipleEntity menuType: Int) : this(
@@ -106,7 +107,7 @@ data class SubscriptionsOrderBean(
0,
0,
0,
menuType,"",
menuType, "", "",
0
)
@@ -155,7 +156,7 @@ data class SubscriptionsOrderBean(
0,
0,
0,
MultipleEntity.TEXT,"",
MultipleEntity.TEXT, "", "",
0
)

View File

@@ -14,6 +14,7 @@ data class UserBean(
var token: String,
var userName: String,
var wxId: String,
var wxCode: String,
//0没有绑定手机号 1绑定了
var status: Int,
var isBindDevice: Int, //是否绑定了设备 0未绑定 1绑定
@@ -23,5 +24,5 @@ data class UserBean(
) {
//设置空的构造方法
constructor() : this("", "", "", "", "", "", 0, 0, 0, 0, ConstantInt.Type1)
constructor() : this("", "", "", "", "", "", "", 0, 0, 0, 0, ConstantInt.Type1)
}

View File

@@ -9,9 +9,9 @@ import com.abbidot.tracker.base.BaseFragment
import com.abbidot.tracker.constant.GetResultCallback
import com.abbidot.tracker.databinding.FragmentBindPhoneCnBinding
import com.abbidot.tracker.deprecated.ui.activity.LoginRegisterCNActivity
import com.abbidot.tracker.vm.CountDownTimerViewModel
import com.abbidot.tracker.vm.cn.LoginCNViewModel
import com.abbidot.tracker.vm.cn.RegisterCNViewModel
import com.abbidot.tracker.vm.CountDownTimerViewModel
/**
@@ -71,7 +71,7 @@ class BindPhoneCNFragment :
val data = it.getOrNull()
data?.apply {
val activity = activity as LoginRegisterCNActivity
mLoginCNViewModel.loginSuccess(activity, this, R.string.txt_bind_success)
// mLoginCNViewModel.loginSuccess(activity, this, R.string.txt_bind_success)
}
}
})

View File

@@ -66,7 +66,7 @@ class LoginCNAccountFragment :
val data = it.getOrNull()
data?.apply {
val activity = activity as LoginRegisterCNActivity
mLoginCNViewModel.loginSuccess(activity, this)
// mLoginCNViewModel.loginSuccess(activity, this)
}
}
})
@@ -78,7 +78,7 @@ class LoginCNAccountFragment :
val data = it.getOrNull()
data?.apply {
val activity = activity as LoginRegisterCNActivity
mLoginCNViewModel.loginSuccess(activity, this)
// mLoginCNViewModel.loginSuccess(activity, this)
}
}
})

View File

@@ -79,7 +79,7 @@ class LoginCNCodeFragment :
val data = it.getOrNull()
data?.apply {
val activity = activity as LoginRegisterCNActivity
mLoginCNViewModel.loginSuccess(activity, this)
// mLoginCNViewModel.loginSuccess(activity, this)
}
}
})

View File

@@ -51,7 +51,7 @@ class LoginCNFirstFragment :
val data = it.getOrNull()
data?.apply {
val activity = activity as LoginRegisterCNActivity
mLoginCNViewModel.loginSuccess(activity, this)
// mLoginCNViewModel.loginSuccess(activity, this)
}
}
})

View File

@@ -53,7 +53,7 @@ import retrofit2.http.Url
interface INetworkService {
companion object {
private const val IP_SERVER = "https://aws.abbidot.com"
// private const val IP_SERVER = "https://aws.abbidot.com"
// private const val IP_SERVER = "https://192.168.0.22"
// const val BASE_URL = "http://ec2-50-18-65-40.us-west-1.compute.amazonaws.com:8090/abbidot/"
// const val BASE_URL = "http://ec2-3-101-8-36.us-west-1.compute.amazonaws.com:8090/abbidot/"
@@ -63,7 +63,7 @@ interface INetworkService {
const val BASE_URL_ABROAD = "https://aws.abbidot.com/abbidot/"
//设备透传
const val BASE_URL_BLE = "https://ab-server.abbidot.cn/"
const val BASE_URL_BLE = "https://ab-server.abbidot.com/"
//测试服务器
const val BASE_URL_TEST = "https://aws.abbidot.com:8443/abbidot/"
@@ -141,7 +141,8 @@ interface INetworkService {
@Field("phone") phone: String,
@Field("password") password: String,
@Field("userName") userName: String,
@Field("countryCode") countryCode: String
@Field("countryCode") countryCode: String,
@Field("openidIdentifier") openidIdentifier: String
): BaseResponse<UserBean>
@@ -1435,7 +1436,7 @@ interface INetworkService {
@Field("phone") phone: String, @Field("code") code: String,
//验证码类型 1是注册 2是忘记密码
@Field("type") type: Int
): BaseResponse<String>
): BaseResponse<UserBean>
/**
* 账号密码登录

View File

@@ -42,9 +42,9 @@ object NetworkApi : BaseNetworkApi<INetworkService>(INetworkService.BASE_URL) {
* 注册/创建用户
*/
suspend fun registerV2(
email: String, phone: String, password: String, userName: String, countryCode: String
email: String, phone: String, password: String, userName: String, countryCode: String, wxOpenidId: String
) = getResult {
service.registerV2(email, phone, password, userName, countryCode)
service.registerV2(email, phone, password, userName, countryCode, wxOpenidId)
}
/**

View File

@@ -785,9 +785,10 @@ class HomeV2Activity : BaseActivity<ActivityHomeV2Binding>(ActivityHomeV2Binding
if (SRBleUtil.instance.isBleEnable(mContext)) {
if (BleManager.getInstance().isConnected(macID)) {
LogUtil.e("已连接设备,不用再次自动连接设备")
// SRBleUtil.instance.cancelBleScan("已连接设备,取消其他连接扫描")
// val bleTrack = SRBleUtil.instance.getConnectMacDevice(macID)
// XEventBus.post(EventName.ConnectDeviceState, bleTrack)
//通知其他页面取消其他连接扫描
SRBleUtil.instance.cancelBleScan("已连接设备,取消其他连接扫描")
val bleTrack = SRBleUtil.instance.getConnectMacDevice(macID)
XEventBus.post(EventName.ConnectDeviceState, bleTrack)
} else {
mAutomaticConnectionDeviceViewModel.connectDeviceToMac(
this@HomeV2Activity, macID, false

View File

@@ -1,23 +1,32 @@
package com.abbidot.tracker.ui.activity
import android.content.Intent
import android.view.Gravity
import android.view.View
import com.abbidot.baselibrary.constant.EventName
import com.abbidot.baselibrary.constant.MMKVKey
import com.abbidot.baselibrary.eventbus.XEventBus
import com.abbidot.baselibrary.network.exception.ErrorCode
import com.abbidot.baselibrary.util.AppUtils
import com.abbidot.baselibrary.util.MMKVUtil
import com.abbidot.tracker.R
import com.abbidot.tracker.base.BaseActivity
import com.abbidot.tracker.bean.UserBean
import com.abbidot.tracker.constant.ConstantInt
import com.abbidot.tracker.constant.GetResultCallback
import com.abbidot.tracker.databinding.ActivitySayHelloBinding
import com.abbidot.tracker.ui.activity.account.CreateAccountV2Activity
import com.abbidot.tracker.ui.activity.account.LoginV2Activity
import com.abbidot.tracker.ui.activity.account.cn.LoginV2CNActivity
import com.abbidot.tracker.ui.activity.account.cn.RegisterCNActivity
import com.abbidot.tracker.ui.activity.account.cn.WXLoginActivity
import com.abbidot.tracker.util.ThirdPartyUtil
import com.abbidot.tracker.util.Util
class SayHelloActivity : BaseActivity<ActivitySayHelloBinding>(ActivitySayHelloBinding::inflate) {
private var mWXCode = ""
override fun getTopBar() = null
override fun initData() {
@@ -36,6 +45,43 @@ class SayHelloActivity : BaseActivity<ActivitySayHelloBinding>(ActivitySayHelloB
XEventBus.observe(this, EventName.FinishActivity) {
finish()
}
XEventBus.observe(this, EventName.PostValue) { s: String ->
mWXCode = s
}
//微信登录成功返回
XEventBus.observe(this, EventName.WXLoginResult) { it: Result<UserBean> ->
dealRequestResult(it, object : GetResultCallback {
override fun onResult(any: Any) {
it.getOrNull()?.let { userBean ->
Util.dealLoginSuccessData(mContext, userBean)
showToast(R.string.txt_login_successful, gravity = Gravity.CENTER)
Util.loginSuccessGo(this@SayHelloActivity, mViewBinding.root)
}
}
override fun onInterceptCode() {
setButtonEnabled(
mViewBinding.btnSayHelloLoginWechat, ConstantInt.Type1
)
}
override fun onRequestError(exceptionCode: String?) {
setButtonEnabled(
mViewBinding.btnSayHelloLoginWechat, ConstantInt.Type1
)
exceptionCode?.let { code ->
if (code == ErrorCode.USER_NO_EXIST.toString()) {
Intent(mContext, WXLoginActivity::class.java).let { i ->
i.putExtra(MMKVKey.CountryCode, mWXCode)
startActivity(i)
}
}
}
}
}, isShowCodeError = false)
}
}
override fun onClick(v: View?) {
@@ -44,6 +90,8 @@ class SayHelloActivity : BaseActivity<ActivitySayHelloBinding>(ActivitySayHelloB
btnSayHelloLogin -> {
if (AppUtils.isChina()) {
val intent = Intent(mContext, LoginV2CNActivity::class.java)
val phone = MMKVUtil.getString(MMKVKey.Phone)
intent.putExtra(MMKVKey.Phone, phone)
startActivity(intent)
} else {
val intent = Intent(mContext, LoginV2Activity::class.java)
@@ -61,7 +109,12 @@ class SayHelloActivity : BaseActivity<ActivitySayHelloBinding>(ActivitySayHelloB
}
}
btnSayHelloLoginWechat -> ThirdPartyUtil.instance.startWXLogin(this@SayHelloActivity)
btnSayHelloLoginWechat -> {
setButtonEnabled(
mViewBinding.btnSayHelloLoginWechat, ConstantInt.Type0
)
ThirdPartyUtil.instance.startWXLogin(this@SayHelloActivity)
}
}
}
}

View File

@@ -21,7 +21,6 @@ import com.abbidot.tracker.base.BaseActivity
import com.abbidot.tracker.constant.ConstantInt
import com.abbidot.tracker.constant.GetResultCallback
import com.abbidot.tracker.databinding.ActivityLoginV2Binding
import com.abbidot.tracker.ui.activity.set.FirstPermissionsActivity
import com.abbidot.tracker.util.Util
import com.abbidot.tracker.util.ViewUtil
import com.abbidot.tracker.vm.LoginViewModel
@@ -54,8 +53,8 @@ class LoginV2Activity : BaseActivity<ActivityLoginV2Binding>(ActivityLoginV2Bind
it.etInputContent.setText(userEmail)
it.etInputContent.inputType = InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS
ViewUtil.instance.setInputViewErrorHideClick(
mContext, it.rlEtInputLayout, tvEmailErrorTipLogin, it.etInputContent
,true )
mContext, it.rlEtInputLayout, tvEmailErrorTipLogin, it.etInputContent, true
)
}
ilLoginV2Password.let {
it.tvInputNameTitle.setText(R.string.login_txt_password)
@@ -106,15 +105,24 @@ class LoginV2Activity : BaseActivity<ActivityLoginV2Binding>(ActivityLoginV2Bind
Util.dealLoginSuccessData(mContext, this)
showToast(R.string.txt_login_successful, gravity = Gravity.CENTER)
loginSuccessGo()
Util.loginSuccessGo(this@LoginV2Activity, mViewBinding.btnLoginV2Login)
//登录成功,把保存的设备存本地
// mTrackerViewModel.getDeviceList(this@LoginV2Activity, 1)
}
}
override fun onInterceptCode() {
setButtonEnabled(
mViewBinding.btnLoginV2Login, ConstantInt.Type1
)
}
override fun onRequestError(exceptionCode: String?) {
setButtonEnabled(
mViewBinding.btnLoginV2Login, ConstantInt.Type1
)
}
})
setButtonEnabled(
mViewBinding.btnLoginV2Login, ConstantInt.Type1
)
}
//获取设备列表
@@ -126,7 +134,7 @@ class LoginV2Activity : BaseActivity<ActivityLoginV2Binding>(ActivityLoginV2Bind
val isBindDevice = MMKVUtil.getInt(MMKVKey.isBindDevice)
val isBindPet = MMKVUtil.getInt(MMKVKey.isBindPet)
if (isBindDevice == ConstantInt.isBind && isBindPet == ConstantInt.NoBind) {
if (list.size > 0) {
if (list.isNotEmpty()) {
MMKVUtil.putString(MMKVKey.FirstDeviceId, list[0].deviceId)
MMKVUtil.putString(
MMKVKey.FirstDeviceOutId, list[0].deviceOutId
@@ -144,7 +152,7 @@ class LoginV2Activity : BaseActivity<ActivityLoginV2Binding>(ActivityLoginV2Bind
showToast(R.string.txt_login_successful, gravity = Gravity.CENTER)
loginSuccessGo()
Util.loginSuccessGo(this@LoginV2Activity, mViewBinding.btnLoginV2Login)
}
}
}
@@ -152,17 +160,6 @@ class LoginV2Activity : BaseActivity<ActivityLoginV2Binding>(ActivityLoginV2Bind
}
}
private fun loginSuccessGo() {
val hasPermissions = Util.checkNeedPermissionsEnabled(mContext)
mViewBinding.btnLoginV2Login.postDelayed({
if (hasPermissions) {
startActivityFinish(Util.checkBindDeviceAndPetGoActivity(mContext))
} else {
startActivityFinish(Intent(mContext, FirstPermissionsActivity::class.java))
}
}, 1000)
}
private fun loginClick(isMd5: Boolean = true) {
mViewBinding.apply {
var email = ilLoginV2EmailAddress.etInputContent.text.toString()

View File

@@ -22,7 +22,7 @@ class ForgotPasswordCNActivity : AddEmailValidActivity() {
switchFragment(2)
}.apply {
mContext = this@ForgotPasswordCNActivity
mFragmentList.add(AccountCnPhoneFragment.newInstance(mContext!!))
mFragmentList.add(AccountCnPhoneFragment.newInstance(mContext!!,2))
mFragmentList.add(this)
mFragmentList.add(ForgotPasswordV2ThereFragment.newInstance(mContext!!))
}

View File

@@ -9,6 +9,7 @@ import android.view.Gravity
import android.view.View
import androidx.activity.viewModels
import com.abbidot.baselibrary.constant.EventName
import com.abbidot.baselibrary.constant.MMKVKey
import com.abbidot.baselibrary.eventbus.XEventBus
import com.abbidot.baselibrary.util.AppUtils
import com.abbidot.baselibrary.util.Utils
@@ -17,7 +18,6 @@ import com.abbidot.tracker.base.BaseActivity
import com.abbidot.tracker.constant.ConstantInt
import com.abbidot.tracker.constant.GetResultCallback
import com.abbidot.tracker.databinding.ActivityLoginV2CnBinding
import com.abbidot.tracker.ui.activity.set.FirstPermissionsActivity
import com.abbidot.tracker.util.Util
import com.abbidot.tracker.util.ViewUtil
import com.abbidot.tracker.vm.cn.LoginCNViewModel
@@ -38,9 +38,15 @@ class LoginV2CNActivity :
mViewBinding.apply {
root.setBackgroundResource(R.drawable.icon_login_v2_bg)
var userPhone = ""
intent.extras?.apply {
userPhone = getString(MMKVKey.Phone, "")
}
ilLoginV2CnPhone.let {
it.tvInputNameTitle.setText(R.string.login_txt_phone)
it.etInputContent.setHint(R.string.login_txt_phone)
it.etInputContent.setText(userPhone)
it.etInputContent.inputType = InputType.TYPE_CLASS_NUMBER
val filters = arrayOf<InputFilter>(InputFilter.LengthFilter(11))
it.etInputContent.filters = filters
@@ -83,7 +89,7 @@ class LoginV2CNActivity :
Util.dealLoginSuccessData(mContext, this)
showToast(R.string.txt_login_successful, gravity = Gravity.CENTER)
loginSuccessGo()
Util.loginSuccessGo(this@LoginV2CNActivity, mViewBinding.btnLoginV2CnLogin)
}
}
@@ -98,17 +104,6 @@ class LoginV2CNActivity :
}
}
private fun loginSuccessGo() {
val hasPermissions = Util.checkNeedPermissionsEnabled(mContext)
mViewBinding.btnLoginV2CnLogin.postDelayed({
if (hasPermissions) {
startActivityFinish(Util.checkBindDeviceAndPetGoActivity(mContext))
} else {
startActivityFinish(Intent(mContext, FirstPermissionsActivity::class.java))
}
}, 1000)
}
private fun goForgotPassword() {
Intent(mContext, ForgotPasswordCNActivity::class.java).apply {
// val email = mViewBinding.ilLoginV2EmailAddress.etInputContent.text.toString()

View File

@@ -10,7 +10,7 @@ class RegisterCNActivity : AddEmailValidActivity() {
mEmailValidFragment = EmailValidFragment.newInstance(this, 1) {
switchFragment(2)
}.apply {
mFragmentList.add(AccountCnPhoneFragment.newInstance(this@RegisterCNActivity))
mFragmentList.add(AccountCnPhoneFragment.newInstance(this@RegisterCNActivity, 1))
mFragmentList.add(this)
mFragmentList.add(CreateAccountV2ThreeFragment.newInstance(this@RegisterCNActivity))
}

View File

@@ -1,16 +1,23 @@
package com.abbidot.tracker.ui.activity.account.cn
import com.abbidot.tracker.constant.ConstantInt
import com.abbidot.tracker.ui.activity.account.AddEmailValidActivity
import com.abbidot.tracker.ui.fragment.account.CreateAccountV2ThreeFragment
import com.abbidot.tracker.ui.fragment.account.EmailValidFragment
import com.abbidot.tracker.ui.fragment.account.cn.AccountCnPhoneFragment
class VerifyCodeLoginCNActivity : AddEmailValidActivity() {
override fun initData() {
mEmailValidFragment = EmailValidFragment.newInstance(this, 1) {
// switchFragment(2)
mEmailValidFragment = EmailValidFragment.newInstance(this, ConstantInt.Type3) {
switchFragment(2)
}.apply {
mFragmentList.add(AccountCnPhoneFragment.newInstance(this@VerifyCodeLoginCNActivity))
mFragmentList.add(
AccountCnPhoneFragment.newInstance(
this@VerifyCodeLoginCNActivity, ConstantInt.Type3
)
)
mFragmentList.add(this)
mFragmentList.add(CreateAccountV2ThreeFragment.newInstance(this@VerifyCodeLoginCNActivity))
}
super.initData()
}

View File

@@ -0,0 +1,32 @@
package com.abbidot.tracker.ui.activity.account.cn
import com.abbidot.baselibrary.constant.MMKVKey
import com.abbidot.tracker.constant.ConstantInt
import com.abbidot.tracker.ui.activity.account.AddEmailValidActivity
import com.abbidot.tracker.ui.fragment.account.CreateAccountV2ThreeFragment
import com.abbidot.tracker.ui.fragment.account.EmailValidFragment
import com.abbidot.tracker.ui.fragment.account.cn.AccountCnPhoneFragment
class WXLoginActivity : AddEmailValidActivity() {
private var mWXCode = ""
override fun initData() {
mWXCode = intent.getStringExtra(MMKVKey.CountryCode) ?: ""
mEmailValidFragment = EmailValidFragment.newInstance(this, ConstantInt.Type4) {
switchFragment(2)
}.apply {
mFragmentList.add(
AccountCnPhoneFragment.newInstance(
this@WXLoginActivity, ConstantInt.Type4
)
)
mFragmentList.add(this)
mFragmentList.add(
CreateAccountV2ThreeFragment.newInstance(
this@WXLoginActivity, mWXCode
)
)
}
super.initData()
}
}

View File

@@ -39,12 +39,15 @@ class CreateAccountV2ThreeFragment : BaseFragment<FragmentCreateAccountV2ThreeBi
private lateinit var mCountryCommon: CountryCommon
private var isShowPassword = false
private var mWXCode = ""
companion object {
@JvmStatic
fun newInstance(context: Context) = CreateAccountV2ThreeFragment().apply {
mContext = context
}
fun newInstance(context: Context, wxCode: String = "") =
CreateAccountV2ThreeFragment().apply {
mContext = context
mWXCode = wxCode
}
}
override fun initData() {
@@ -218,7 +221,9 @@ class CreateAccountV2ThreeFragment : BaseFragment<FragmentCreateAccountV2ThreeBi
// it, e, p, password, name, mCountryCommon.getCountryCode()
// )
setButtonEnabled(btnCreateAccountV2Signup, ConstantInt.Type0)
mUserViewModel.registerV2(it, e, p, password, name, locale.country.uppercase())
mUserViewModel.registerV2(
it, e, p, password, name, locale.country.uppercase(), mWXCode
)
}
}
}

View File

@@ -9,6 +9,7 @@ import android.view.View.OnClickListener
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import com.abbidot.baselibrary.network.exception.ErrorCode
import com.abbidot.baselibrary.util.AppUtils
import com.abbidot.tracker.R
import com.abbidot.tracker.base.BaseActivity
@@ -16,8 +17,10 @@ import com.abbidot.tracker.base.BaseFragment
import com.abbidot.tracker.constant.ConstantInt
import com.abbidot.tracker.constant.GetResultCallback
import com.abbidot.tracker.databinding.FragmentBaseEmailValidBinding
import com.abbidot.tracker.util.Util
import com.abbidot.tracker.vm.CountDownTimerViewModel
import com.abbidot.tracker.vm.UserProfileViewModel
import com.abbidot.tracker.vm.cn.LoginCNViewModel
import com.abbidot.tracker.vm.cn.RegisterCNViewModel
import com.daimajia.androidanimations.library.Techniques
import com.daimajia.androidanimations.library.YoYo
@@ -34,6 +37,7 @@ open class EmailValidFragment : BaseFragment<FragmentBaseEmailValidBinding>(
private val mCountDownTimerViewModel: CountDownTimerViewModel by viewModels()
private val mRegisterViewModel: UserProfileViewModel by viewModels()
private val mLoginCNViewModel: LoginCNViewModel by viewModels()
private val mRegisterCNViewModel: RegisterCNViewModel by viewModels()
private val mResendCodeTime = 5 * 60
@@ -47,13 +51,13 @@ open class EmailValidFragment : BaseFragment<FragmentBaseEmailValidBinding>(
@JvmStatic
fun newInstance(
context: Context,
emailCodeType: Int,
verifyCodeType: Int,
btnString: String = "",
okClickListener: OnClickListener
) = EmailValidFragment().apply {
mContext = context
mBtnString = btnString
mVerifyCodeType = emailCodeType
mVerifyCodeType = verifyCodeType
mOnOkClickListener = okClickListener
}
}
@@ -77,6 +81,8 @@ open class EmailValidFragment : BaseFragment<FragmentBaseEmailValidBinding>(
mViewBinding.apply {
getHostActivity(BaseActivity::class.java)?.hideInputMethod(root)
if (!TextUtils.isEmpty(mBtnString)) {
btnForgotPasswordV2TwoContinue.text = mBtnString
}
@@ -132,6 +138,36 @@ open class EmailValidFragment : BaseFragment<FragmentBaseEmailValidBinding>(
}
if (AppUtils.isChina()) {
mLoginCNViewModel.mPhoneLoginResultLiveData.observe(viewLifecycleOwner) {
dealRequestResult(it, object : GetResultCallback {
override fun onResult(any: Any) {
it.getOrNull()?.let { userBean ->
Util.dealLoginSuccessData(mContext!!, userBean)
showToast(R.string.txt_login_successful, gravity = Gravity.CENTER)
getHostActivity(BaseActivity::class.java)?.let { activity ->
Util.loginSuccessGo(activity, mViewBinding.root)
}
}
}
override fun onInterceptCode() {
setButtonEnabled(
mViewBinding.btnForgotPasswordV2TwoContinue, ConstantInt.Type1
)
}
override fun onRequestError(exceptionCode: String?) {
setButtonEnabled(
mViewBinding.btnForgotPasswordV2TwoContinue, ConstantInt.Type1
)
exceptionCode?.let { code ->
if (code == ErrorCode.USER_NO_EXIST.toString()) {
mOnOkClickListener?.onClick(view)
}
}
}
}, isShowCodeError = false)
}
mRegisterCNViewModel.apply {
mSendCodeResultLiveData.observe(viewLifecycleOwner) {
dealRequestResult(it, object : GetResultCallback {
@@ -148,8 +184,16 @@ open class EmailValidFragment : BaseFragment<FragmentBaseEmailValidBinding>(
mValidateCodeResultLiveData.observe(viewLifecycleOwner) {
dealRequestResult(it, object : GetResultCallback {
override fun onResult(any: Any) {
it.getOrNull()?.apply {
mOnOkClickListener?.onClick(view)
it.getOrNull()?.let { data ->
if (mVerifyCodeType == ConstantInt.Type4) {
Util.dealLoginSuccessData(mContext!!, data)
showToast(
R.string.txt_login_successful, gravity = Gravity.CENTER
)
getHostActivity(BaseActivity::class.java)?.let { activity ->
Util.loginSuccessGo(activity, mViewBinding.root)
}
} else mOnOkClickListener?.onClick(view)
}
}
@@ -163,6 +207,17 @@ open class EmailValidFragment : BaseFragment<FragmentBaseEmailValidBinding>(
setButtonEnabled(
mViewBinding.btnForgotPasswordV2TwoContinue, ConstantInt.Type1
)
if (mVerifyCodeType == ConstantInt.Type4) {
exceptionCode?.let { code ->
if (code == "519") {
mOnOkClickListener?.onClick(view)
} else if (code == "520") {
showToast(
R.string.txt_phone_has_bound, gravity = Gravity.CENTER
)
}
}
}
}
})
}
@@ -246,9 +301,15 @@ open class EmailValidFragment : BaseFragment<FragmentBaseEmailValidBinding>(
setButtonEnabled(mViewBinding.btnForgotPasswordV2TwoContinue, ConstantInt.Type0)
if (AppUtils.isChina()) {
mRegisterCNViewModel.validatePhoneCode(
this@EmailValidFragment, mEmail, content, mVerifyCodeType
)
if (mVerifyCodeType == ConstantInt.Type3) {
mLoginCNViewModel.phoneLogin(
this@EmailValidFragment, mEmail, content
)
} else {
mRegisterCNViewModel.validatePhoneCode(
this@EmailValidFragment, mEmail, content, mVerifyCodeType
)
}
} else {
mRegisterViewModel.validateCode(
this@EmailValidFragment, mEmail, content, mVerifyCodeType
@@ -259,6 +320,7 @@ open class EmailValidFragment : BaseFragment<FragmentBaseEmailValidBinding>(
override fun onClick(v: View?) {
mViewBinding.apply {
getHostActivity(BaseActivity::class.java)?.hideInputMethod(mViewBinding.root)
when (v!!) {
btnForgotPasswordV2TwoContinue -> continueVerifyCode()

View File

@@ -1,18 +1,23 @@
package com.abbidot.tracker.ui.fragment.account.cn
import android.content.Context
import android.content.Intent
import android.text.InputFilter
import android.text.InputType
import android.text.TextUtils
import android.view.View
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import com.abbidot.baselibrary.constant.MMKVKey
import com.abbidot.baselibrary.network.exception.ErrorCode
import com.abbidot.tracker.R
import com.abbidot.tracker.base.BaseDialog
import com.abbidot.tracker.base.BaseFragment
import com.abbidot.tracker.constant.ConstantInt
import com.abbidot.tracker.constant.GetResultCallback
import com.abbidot.tracker.databinding.FragmentAccountCnPhoneBinding
import com.abbidot.tracker.ui.activity.account.AddEmailValidActivity
import com.abbidot.tracker.ui.activity.account.cn.LoginV2CNActivity
import com.abbidot.tracker.util.ViewUtil
import com.abbidot.tracker.vm.cn.RegisterCNViewModel
@@ -25,12 +30,14 @@ class AccountCnPhoneFragment :
BaseFragment<FragmentAccountCnPhoneBinding>(FragmentAccountCnPhoneBinding::inflate) {
private val mRegisterCNViewModel: RegisterCNViewModel by viewModels()
private var mVerifyCodeType = 0
companion object {
@JvmStatic
fun newInstance(context: Context) =
fun newInstance(context: Context, verifyCodeType: Int) =
AccountCnPhoneFragment().apply {
mContext = context
mVerifyCodeType = verifyCodeType
}
}
@@ -62,6 +69,25 @@ class AccountCnPhoneFragment :
override fun onRequestError(exceptionCode: String?) {
setButtonEnabled(mViewBinding.btnAccountCnPhoneContinue, ConstantInt.Type1)
exceptionCode?.let { code ->
if (code == ErrorCode.USER_HAS_EXIST.toString()) {
ViewUtil.instance.showDialog(
mContext!!,
R.string.txt_account_exists_log_in,
object : BaseDialog.OnDialogOkListener {
override fun onOkClick(dialog: BaseDialog<*>) {
dialog.dismiss()
val intent = Intent(mContext, LoginV2CNActivity::class.java)
val phone =
mViewBinding.ilAccountCnPhoneEditLayout.etInputContent.text.toString()
intent.putExtra(MMKVKey.Phone, phone)
startActivityFinish(mActivity!!, intent)
}
},
okTextResId = R.string.txt_sure
)
}
}
}
})
}
@@ -87,7 +113,7 @@ class AccountCnPhoneFragment :
}
getHostActivity(AddEmailValidActivity::class.java)?.setToEmail(phone)
setButtonEnabled(btnAccountCnPhoneContinue, ConstantInt.Type0)
mRegisterCNViewModel.sendCode(this@AccountCnPhoneFragment, phone, 1)
mRegisterCNViewModel.sendCode(this@AccountCnPhoneFragment, phone, mVerifyCodeType)
}
}

View File

@@ -557,7 +557,7 @@ class HomeTrackFragment :
private fun addMenuListData(petBean: PetBean) {
petBean.apply {
if (mTrackMenuList.size == 0) {
if (mTrackMenuList.isEmpty()) {
if (deviceType == ConstantInt.Type1) {
ViewUtil.instance.addMenuBean(
mTrackMenuList, getString(R.string.tracker_manage_led)
@@ -825,7 +825,7 @@ class HomeTrackFragment :
mFencesAdapter.setData(null)
mZoneAdapter.setData(null)
mapDeviceBean.fences?.apply {
if (size > 0) {
if (isNotEmpty()) {
if (size > 3) mFencesList.addAll(subList(0, 3).toList())
else mFencesList.addAll(this.toList())
mFencesAdapter.setData(mFencesList, true)
@@ -835,7 +835,7 @@ class HomeTrackFragment :
}
}
mapDeviceBean.wifiZones?.apply {
if (size > 0) {
if (isNotEmpty()) {
mZoneList.addAll(this)
mZoneAdapter.setData(mZoneList, true)
mViewBinding.btnHomePetTrackWifiZoneManage.visibility = View.VISIBLE

View File

@@ -164,7 +164,7 @@ class HistoryDataGoogleMapFragment : BaseGoogleMapFragment() {
fun setLatLngData(data: MutableList<HistoryDataBean>) {
mGoogleMap?.clear()
if (data.size == 0) return
if (data.isEmpty()) return
mLatLngList.clear()
var maxLat = data[0].latitude
var maxLon = data[0].longitude
@@ -214,7 +214,7 @@ class HistoryDataGoogleMapFragment : BaseGoogleMapFragment() {
* 停止滑动
*/
fun slideStopChanged(progress: Int) {
if (mLatLngList.size > 0) {
if (mLatLngList.isNotEmpty()) {
moveCameraLocation(
mLatLngList[progress].latitude, mLatLngList[progress].longitude, true
)

View File

@@ -10,6 +10,7 @@ import android.location.LocationManager
import android.os.Build
import android.os.Parcelable
import android.provider.Settings
import android.view.View
import androidx.lifecycle.LifecycleCoroutineScope
import androidx.lifecycle.ViewModelProvider
import cn.jpush.android.api.JPushInterface
@@ -37,6 +38,7 @@ import com.abbidot.tracker.ui.activity.SayHelloActivity
import com.abbidot.tracker.ui.activity.device.AddNewTracker1Activity
import com.abbidot.tracker.ui.activity.pet.ShowInviteDeviceActivity
import com.abbidot.tracker.ui.activity.pet.first.FirstSetPetTypeActivity
import com.abbidot.tracker.ui.activity.set.FirstPermissionsActivity
import com.abbidot.tracker.ui.activity.subscribe.SubscriptionPlanActivity
import com.abbidot.tracker.util.bluetooth.SRBleUtil
import com.abbidot.tracker.vm.SubscriptionManageViewModel
@@ -570,6 +572,24 @@ class Util {
}
}
/**
* 登录成功后的跳转
*/
fun loginSuccessGo(activity: BaseActivity<*>, view: View) {
val hasPermissions = checkNeedPermissionsEnabled(activity)
view.postDelayed({
if (hasPermissions) {
activity.startActivityFinish(checkBindDeviceAndPetGoActivity(activity))
} else {
activity.startActivityFinish(
Intent(
activity, FirstPermissionsActivity::class.java
)
)
}
}, 1000)
}
/**
* 退出登录
*/
@@ -584,9 +604,11 @@ class Util {
BleManager.getInstance().disconnectAllDevice()
lifecycleScope.launch {
val email = MMKVUtil.getString(MMKVKey.Email)
val phone = MMKVUtil.getString(MMKVKey.Phone)
MMKVUtil.clearAll()
//保存最后一次登录的邮箱
MMKVUtil.putString(MMKVKey.Email, email)
MMKVUtil.putString(MMKVKey.Phone, phone)
withContext(Dispatchers.IO) {
MyDatabase.deviceDao().deleteAll(MyDatabase.DEVICE_TABLE)
MyDatabase.creditCardDao().deleteAll(MyDatabase.CREDIT_CARD_TABLE)

View File

@@ -74,11 +74,13 @@ class UserProfileViewModel : ViewModel() {
phone: String,
password: String,
userName: String,
countryCode: String
countryCode: String,
wxOpenidId: String=""
) {
activity.showLoading(true)
viewModelScope.launch {
val result = NetworkApi.registerV2(email,phone, password, userName, countryCode)
val result =
NetworkApi.registerV2(email, phone, password, userName, countryCode, wxOpenidId)
mRegisterV2LiveData.value = result
}
}

View File

@@ -1,24 +1,13 @@
package com.abbidot.tracker.vm.cn
import android.content.Intent
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import cn.jpush.android.api.JPushInterface
import com.abbidot.baselibrary.constant.EventName
import com.abbidot.baselibrary.constant.MMKVKey
import com.abbidot.baselibrary.eventbus.XEventBus
import com.abbidot.baselibrary.util.MMKVUtil
import com.abbidot.tracker.R
import com.abbidot.tracker.base.BaseActivity
import com.abbidot.tracker.base.BaseFragment
import com.abbidot.tracker.bean.UserBean
import com.abbidot.tracker.constant.ConstantInt
import com.abbidot.tracker.retrofit2.NetworkApi
import com.abbidot.tracker.ui.activity.HomeV2Activity
import dagger.hilt.android.scopes.ActivityRetainedScoped
import kotlinx.coroutines.launch
import java.util.Random
import javax.inject.Inject
/**
@@ -44,43 +33,6 @@ class LoginCNViewModel @Inject constructor() : ViewModel() {
}
}
/**
* 处理微信、登录成功返回
*/
fun loginSuccess(
activity: BaseActivity<*>,
userBean: UserBean,
tipRes: Int = R.string.txt_login_successful
) {
//判断有没有绑定手机号
if (userBean.status == ConstantInt.Close) {
// activity.apply {
// mWXId = userBean.wxId
// switchFragment(LoginRegisterCNActivity.Fragment_Bind_Phone)
// }
} else {
//通知欢迎页面关闭
XEventBus.post(EventName.FinishActivity)
activity.showToast(tipRes)
MMKVUtil.putString(MMKVKey.UserId, userBean.userId)
MMKVUtil.putInt(MMKVKey.isBindDevice, userBean.isBindDevice)
MMKVUtil.putString(MMKVKey.Token, userBean.token)
val rand = Random()
//极光推送设置别名
JPushInterface.setAlias(activity, rand.nextInt(1000), userBean.userId)
val intent = Intent()
//判断有没有绑定设备
// if (userBean.isBindDevice == ConstantInt.Close) {
// intent.setClass(activity, AddTrackerDeviceActivity::class.java)
// } else {
// intent.setClass(activity, HomeActivity::class.java)
// }
intent.setClass(activity, HomeV2Activity::class.java)
activity.startActivityFinish(intent)
}
}
/**
* 微信绑定手机号
*/

View File

@@ -5,6 +5,7 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.abbidot.baselibrary.util.Utils
import com.abbidot.tracker.base.BaseFragment
import com.abbidot.tracker.bean.UserBean
import com.abbidot.tracker.retrofit2.NetworkApi
import kotlinx.coroutines.launch
@@ -15,7 +16,7 @@ import kotlinx.coroutines.launch
*/
class RegisterCNViewModel : ViewModel() {
val mSendCodeResultLiveData = MutableLiveData<Result<String>>()
val mValidateCodeResultLiveData = MutableLiveData<Result<String>>()
val mValidateCodeResultLiveData = MutableLiveData<Result<UserBean>>()
// val mPhoneRegisterResultLiveData = MutableLiveData<Result<String>>()
val mSetNewPasswordResultLiveData = MutableLiveData<Result<String>>()

View File

@@ -23,7 +23,7 @@ class WXEntryActivity : WXBaseActivity() {
override fun initData() {
mLoginCNViewModel.mWXLoginResultLiveData.observe(this) {
LogUtil.e(it.toString())
LogUtil.e("mWXLoginResultLiveData:$it")
XEventBus.post(EventName.WXLoginResult, it)
finish()
}
@@ -37,21 +37,25 @@ class WXEntryActivity : WXBaseActivity() {
BaseResp.ErrCode.ERR_OK -> {
result = "登录成功"
val code = r.code
XEventBus.post(EventName.PostValue, code)
LogUtil.e("${result}TAG_WECHAT_CODE", code)
mLoginCNViewModel.wxLogin(code)
}
BaseResp.ErrCode.ERR_AUTH_DENIED -> {
result = "用户拒绝微信授权登录"
LogUtil.e("ERROR", result)
Toaster.show(result)
finish()
}
BaseResp.ErrCode.ERR_USER_CANCEL -> {
result = "用户取消微信授权登录"
LogUtil.e("ERROR", result)
Toaster.show(result)
finish()
}
else -> {
result = "微信授权登录失败,${baseResp.errStr},code=${r.code}"
LogUtil.e("ERROR", result)

View File

@@ -193,7 +193,6 @@
<string name="login_txt_login_code">验证码登录</string>
<string name="txt_code_success">验证码已发送</string>
<string name="login_txt_no_account">没有账号?</string>
@@ -213,7 +212,6 @@
<string name="register_txt_submit">提交</string>
<string name="system_txt_map">地图</string>
<string name="system_txt_profile">我的</string>
@@ -918,5 +916,6 @@
<string name="txt_terms_html">terms_zh.html</string>
<string name="txt_privacy_html">privacy_zh.html</string>
<string name="txt_subscription_terms_conditions_html">subscription_terms_conditions_zh.html</string>
<string name="txt_phone_has_bound">该手机号码已被绑定</string>
</resources>

View File

@@ -1087,5 +1087,6 @@
<string name="txt_terms_html">terms_en.html</string>
<string name="txt_privacy_html">privacy_en.html</string>
<string name="txt_subscription_terms_conditions_html">subscription_terms_conditions_en.html</string>
<string name="txt_phone_has_bound">该手机号码已被绑定</string>
</resources>