From 495e43f017bf26a4d92f36341cd19ed282915998 Mon Sep 17 00:00:00 2001
From: fengjignqi <15192412330@163.com>
Date: Wed, 23 Sep 2026 17:41:17 +0800
Subject: [PATCH] =?UTF-8?q?=E9=9A=90=E7=A7=81=E6=94=BF=E7=AD=96=EF=BC=8C?=
=?UTF-8?q?=E7=94=A8=E6=88=B7=E5=8D=8F=E8=AE=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/src/main/AndroidManifest.xml | 5 +
.../main/java/com/juhabi/birds/AppConfig.kt | 2 +
.../juhabi/birds/login/ForgetPsdActivity.kt | 44 +++++-
.../juhabi/birds/login/RegisterActivity.kt | 3 +
.../com/juhabi/birds/mine/MineFragment.kt | 22 ++-
.../juhabi/birds/mine/UpdateUserAccount.kt | 87 +++++++---
.../com/juhabi/birds/mine/WebviewActivity.kt | 148 ++++++++++++++++++
.../juhabi/birds/mine/model/MineUserInfo.kt | 3 +-
.../com/juhabi/birds/mine/mvp/MineContract.kt | 7 +
.../com/juhabi/birds/mine/mvp/MineImpl.kt | 46 ++++++
.../juhabi/birds/mine/mvp/MinePresenter.kt | 135 ++++++++++++++--
.../com/juhabi/birds/network/ApiService.kt | 38 +++++
.../birds/util/manager/UserInfoManager.kt | 8 +-
.../layout/activity_serivce_web_layout.xml | 37 +++++
app/src/main/res/layout/forget_psd_layout.xml | 2 +
.../main/res/layout/mine_center_layout.xml | 3 +-
app/src/main/res/layout/register_layout.xml | 1 +
.../res/layout/update_user_phone_layout.xml | 3 +-
18 files changed, 548 insertions(+), 46 deletions(-)
create mode 100644 app/src/main/java/com/juhabi/birds/mine/WebviewActivity.kt
create mode 100644 app/src/main/res/layout/activity_serivce_web_layout.xml
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 1051641..e1da272 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -85,6 +85,11 @@
android:name=".mine.UpdateUserAccount"
android:exported="false" />
+
+
+
()
LoginContract.LoginView, View.OnClickListener {
private var codeCountDownTimer: CountDownTimer? = null
+ private var resetByPhone = true
private var isPasswordVisible = false
private var isConfirmPasswordVisible = false
@@ -52,6 +53,7 @@ class ForgetPsdActivity : BaseActivity()
binding.passwordVisibilityButton,
binding.confirmPasswordVisibilityButton,
binding.confirmButton,
+ binding.tvChangeLoginType,
).forEach { view ->
view.setOnClickListener(this)
}
@@ -63,13 +65,35 @@ class ForgetPsdActivity : BaseActivity()
finish()
}
+ R.id.tv_change_login_type ->{
+ resetByPhone = !resetByPhone
+ binding.linearCountry.visibility = if (resetByPhone) View.VISIBLE else View.GONE
+ binding.imgLoginType.setImageResource(
+ if (resetByPhone) R.mipmap.icon_login_phone else R.mipmap.icon_login_email
+ )
+ binding.tvChangeLoginType.text = if (resetByPhone) "邮箱" else "手机"
+ binding.phoneEditText.apply {
+ text?.clear()
+ hint = if (resetByPhone) "请输入手机号" else "请输入邮箱"
+ inputType = if (resetByPhone) {
+ InputType.TYPE_CLASS_PHONE
+ } else {
+ InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS
+ }
+ }
+ }
+
R.id.getCodeButton -> {//获取验证码
- val phone = binding.phoneEditText.text.toString().trim()
- if (phone.isBlank()) {
- ToastUtil.showShort(mContext, "手机号不能为空")
+ val account = binding.phoneEditText.text.toString().trim()
+ if (account.isBlank()) {
+ ToastUtil.showShort(mContext, if (resetByPhone) "手机号不能为空" else "邮箱不能为空")
return
}
- presenter?.getPhoneSmsCode(phone, AppConfig.SEND_CODE_SCENE_RESET)
+ if (resetByPhone) {
+ presenter?.getPhoneSmsCode(account, AppConfig.SEND_CODE_SCENE_RESET)
+ } else {
+ presenter?.getEmailSmsCode(account, AppConfig.SEND_CODE_SCENE_RESET)
+ }
}
R.id.passwordVisibilityButton -> {
@@ -83,13 +107,13 @@ class ForgetPsdActivity : BaseActivity()
}
R.id.confirmButton -> {//修改密码
- val phone = binding.phoneEditText.text.toString().trim()
+ val account = binding.phoneEditText.text.toString().trim()
val code = binding.codeEditText.text.toString().trim()
val password = binding.passwordEditText.text.toString()
val confirmPassword = binding.confirmPasswordEditText.text.toString()
- if (phone.isBlank()) {
- ToastUtil.showShort(mContext, "手机号不能为空")
+ if (account.isBlank()) {
+ ToastUtil.showShort(mContext, if (resetByPhone) "手机号不能为空" else "邮箱不能为空")
return
}
if (code.isBlank()) {
@@ -116,7 +140,11 @@ class ForgetPsdActivity : BaseActivity()
return
}
- presenter?.forgetPsdByPhone(phone, code, password)
+ if (resetByPhone) {
+ presenter?.forgetPsdByPhone(account, code, password)
+ } else {
+ presenter?.forgetPsdByEmail(account, code, password)
+ }
}
}
}
diff --git a/app/src/main/java/com/juhabi/birds/login/RegisterActivity.kt b/app/src/main/java/com/juhabi/birds/login/RegisterActivity.kt
index 04b2983..7a104f0 100644
--- a/app/src/main/java/com/juhabi/birds/login/RegisterActivity.kt
+++ b/app/src/main/java/com/juhabi/birds/login/RegisterActivity.kt
@@ -74,6 +74,9 @@ class RegisterActivity : BaseActivity(),
R.id.tv_change_login_type ->{
registerByPhone = !registerByPhone
binding.linearCountry.visibility = if (registerByPhone) View.VISIBLE else View.GONE
+ binding.imgLoginType.setImageResource(
+ if (registerByPhone) R.mipmap.icon_login_phone else R.mipmap.icon_login_email
+ )
binding.tvChangeLoginType.text = if (registerByPhone) "邮箱" else "手机"
binding.phoneEditText.apply {
text?.clear()
diff --git a/app/src/main/java/com/juhabi/birds/mine/MineFragment.kt b/app/src/main/java/com/juhabi/birds/mine/MineFragment.kt
index 719f49e..1828191 100644
--- a/app/src/main/java/com/juhabi/birds/mine/MineFragment.kt
+++ b/app/src/main/java/com/juhabi/birds/mine/MineFragment.kt
@@ -68,6 +68,14 @@ class MineFragment : BaseFragment(),
goTo(UpdateUserAccount::class.java, null)
}
+ R.id.linear_ysxy -> {
+ openAgreementPage(WebviewActivity.PAGE_PRIVACY, AppConfig.PRIVACY_POLICY_URL)
+ }
+
+ R.id.linear_yhxy -> {
+ openAgreementPage(WebviewActivity.PAGE_AGREEMENT, AppConfig.USER_AGREEMENT_URL)
+ }
+
R.id.linear_qchc -> {
showDialogtext(
"提示",
@@ -130,14 +138,26 @@ class MineFragment : BaseFragment(),
}
}
+ private fun openAgreementPage(page: Int, url: String) {
+ goTo(
+ WebviewActivity::class.java,
+ Bundle().apply {
+ putInt(WebviewActivity.EXTRA_PAGE, page)
+ putString(WebviewActivity.EXTRA_URL, url)
+ }
+ )
+ }
+
/** 将个人信息请求结果更新到个人中心页面。 */
override fun getUserInfoSuccess(userInfo: MineUserInfo) {
val displayName = userInfo.userName.ifBlank { "未设置用户名" }
- val displayAccount = userInfo.phoneNumber
+ val displayAccount = userInfo.nickName
?.ifBlank { null }
?: "未绑定手机号"
binding.tvUserName.text = displayName
binding.tvUserAccount.text = displayAccount
+ binding.tvChangeBindAccount.text = if (userInfo.phoneBound == true) "换绑手机号" else "换绑邮箱"
+
if (userInfo.avatar.isNullOrBlank()) {
binding.imgAvatar.setImageResource(R.mipmap.icon_mine_user_head_defaul)
}
diff --git a/app/src/main/java/com/juhabi/birds/mine/UpdateUserAccount.kt b/app/src/main/java/com/juhabi/birds/mine/UpdateUserAccount.kt
index 92c7db8..47c4801 100644
--- a/app/src/main/java/com/juhabi/birds/mine/UpdateUserAccount.kt
+++ b/app/src/main/java/com/juhabi/birds/mine/UpdateUserAccount.kt
@@ -2,6 +2,7 @@ package com.juhabi.birds.mine
import android.os.Bundle
import android.os.CountDownTimer
+import android.text.InputType
import android.view.LayoutInflater
import android.view.View
import com.gyf.immersionbar.ImmersionBar
@@ -24,6 +25,7 @@ class UpdateUserAccount : BaseActivity{
- // 新接口根据登录态识别当前手机号,不需要传手机号或验证码场景。
- presenter?.getCurrentPhoneCode()
+ if (userLoginByPhone) presenter?.getCurrentPhoneCode()
+ else presenter?.getCurrentEmailCode()
}
R.id.tv_confirmAccount ->{
@@ -76,25 +84,27 @@ class UpdateUserAccount : BaseActivity{
- // 新手机号不能为空,校验通过后使用 rebind 场景发送验证码。
- val newPhone = binding.etNewPhone.text.toString().trim()
- if (newPhone.isBlank()) {
- ToastUtil.showShort(mContext, "新手机号不能为空")
+ // 新账号不能为空,按手机号或邮箱模式发送 rebind 验证码。
+ val newAccount = binding.etNewPhone.text.toString().trim()
+ if (newAccount.isBlank()) {
+ ToastUtil.showShort(mContext, if (userLoginByPhone) "新手机号不能为空" else "新邮箱不能为空")
return
}
- presenter?.sendNewPhoneCode(newPhone)
+ if (userLoginByPhone) presenter?.sendNewPhoneCode(newAccount)
+ else presenter?.sendNewEmailCode(newAccount)
}
R.id.tv_submit_new_account ->{
- //绑定新的手机号码
- val newPhone = binding.etNewPhone.text.toString().trim()
+ // 根据当前换绑类型提交新手机号或新邮箱。
+ val newAccount = binding.etNewPhone.text.toString().trim()
val code = binding.etNewPhoneCode.text.toString().trim()
- if (newPhone.isBlank()) {
- ToastUtil.showShort(mContext, "新手机号不能为空")
+ if (newAccount.isBlank()) {
+ ToastUtil.showShort(mContext, if (userLoginByPhone) "新手机号不能为空" else "新邮箱不能为空")
return
}
if (code.isBlank()) {
@@ -102,8 +112,8 @@ class UpdateUserAccount : BaseActivity() {
+
+ override fun showError(message: String) {
+ showMessage(message)
+ }
+
+ override fun initWindows() {
+ supportActionBar?.hide()
+ ImmersionBar.with(this)
+ .transparentStatusBar()
+ .statusBarColor(com.juhabi.birds.R.color.color_zhu)
+ .statusBarDarkFont(true)
+ .navigationBarColor(com.juhabi.birds.R.color.color_zhu)
+ .navigationBarDarkIcon(true)
+ .titleBar(binding.rlTitle)
+ .init()
+ }
+
+ override fun createBinding(inflater: LayoutInflater): ActivitySerivceWebLayoutBinding {
+ return ActivitySerivceWebLayoutBinding.inflate(inflater)
+ }
+
+ override fun createPresenter(): MinePresenter? = null
+
+ override fun initView(savedInstanceState: Bundle?) {
+ val pageCode = intent.getIntExtra(
+ EXTRA_PAGE,
+ intent.getIntExtra(LEGACY_EXTRA_PAGE, PAGE_AGREEMENT)
+ )
+ val page = when (pageCode) {
+ PAGE_PRIVACY -> "隐私政策" to "privacy_policy.html"
+ PAGE_AGREEMENT -> "用户协议" to "user_agreement.html"
+ else -> null
+ }
+ if (page == null) {
+ showMessage("页面参数无效")
+ finish()
+ return
+ }
+
+ binding.includeTitle.tvTitle.text = page.first
+ binding.includeTitle.imgBack.setOnClickListener { finish() }
+ val pageUrl = intent.getStringExtra(EXTRA_URL)
+
+ binding.webview.apply {
+ visibility = View.VISIBLE
+ setBackgroundColor(Color.WHITE)
+ settings.javaScriptEnabled = false
+ settings.domStorageEnabled = false
+ settings.allowFileAccess = false
+ settings.allowContentAccess = false
+ settings.setSupportZoom(false)
+ settings.builtInZoomControls = false
+ settings.displayZoomControls = false
+ settings.allowFileAccessFromFileURLs = false
+ settings.allowUniversalAccessFromFileURLs = false
+ addJavascriptInterface(PageBridge(), "Android")
+ webViewClient = AgreementWebViewClient()
+ loadUrl(pageUrl?.takeIf(String::isNotBlank) ?: "file:///android_asset/${page.second}")
+ }
+ }
+
+ override fun onBackPressed() {
+ if (binding.webview.canGoBack()) {
+ binding.webview.goBack()
+ } else {
+ super.onBackPressed()
+ }
+ }
+
+ override fun onDestroy() {
+ binding.webview.apply {
+ stopLoading()
+ removeJavascriptInterface("Android")
+ webViewClient = WebViewClient()
+ destroy()
+ }
+ super.onDestroy()
+ }
+
+ private inner class AgreementWebViewClient : WebViewClient() {
+ override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean {
+ return handleUrl(view, request.url)
+ }
+
+ @Suppress("DEPRECATION")
+ override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
+ return handleUrl(view, Uri.parse(url))
+ }
+
+ private fun handleUrl(view: WebView, uri: Uri): Boolean {
+ if (uri.scheme == "file" && uri.host == "android_asset") return false
+ if (uri.scheme == "http" || uri.scheme == "https" || uri.scheme == "mailto") {
+ return try {
+ startActivity(Intent(Intent.ACTION_VIEW, uri))
+ true
+ } catch (_: Exception) {
+ showMessage("无法打开此链接")
+ true
+ }
+ }
+ return true
+ }
+
+ override fun onReceivedError(
+ view: WebView,
+ request: WebResourceRequest,
+ error: WebResourceError
+ ) {
+ super.onReceivedError(view, request, error)
+ if (request.isForMainFrame) showMessage("页面加载失败,请稍后重试")
+ }
+ }
+
+ private inner class PageBridge {
+ @JavascriptInterface
+ fun finishActivity() {
+ runOnUiThread { finish() }
+ }
+ }
+
+ companion object {
+ const val EXTRA_PAGE = "from_request_code"
+ const val EXTRA_URL = "webview_url"
+ const val LEGACY_EXTRA_PAGE = "from_requse_code"
+ const val PAGE_AGREEMENT = 10001
+ const val PAGE_PRIVACY = 10002
+ }
+}
diff --git a/app/src/main/java/com/juhabi/birds/mine/model/MineUserInfo.kt b/app/src/main/java/com/juhabi/birds/mine/model/MineUserInfo.kt
index e072ce1..5b9ec19 100644
--- a/app/src/main/java/com/juhabi/birds/mine/model/MineUserInfo.kt
+++ b/app/src/main/java/com/juhabi/birds/mine/model/MineUserInfo.kt
@@ -11,5 +11,6 @@ data class MineUserInfo(
val phoneBound: Boolean = false,
val userType: String = "",
val createTime: String = "",
- val avatar: String? = null
+ val avatar: String? = null,
+ val userLoginByPhone : Boolean = false
)
diff --git a/app/src/main/java/com/juhabi/birds/mine/mvp/MineContract.kt b/app/src/main/java/com/juhabi/birds/mine/mvp/MineContract.kt
index 22afa3d..898fcc5 100644
--- a/app/src/main/java/com/juhabi/birds/mine/mvp/MineContract.kt
+++ b/app/src/main/java/com/juhabi/birds/mine/mvp/MineContract.kt
@@ -21,13 +21,17 @@ interface MineContract {
)
fun modifyPassword(oldPassword: String, newPassword: String, callback: Callback)
fun getCurrentPhoneCode(callback: Callback>)
+ fun getCurrentEmailCode(callback: Callback>)
fun sendPhoneCode(request: JSONObject, callback: Callback>)
+ fun sendEmailCode(request: JSONObject, callback: Callback>)
fun verifyOldPhone(oldCode: String, callback: Callback>)
+ fun verifyOldEmail(oldCode: String, callback: Callback>)
fun updateBindNewPhone(
newPhoneNumber: String,
code: String,
callback: Callback>
)
+ fun updateBindNewEmail(newEmail: String, code: String, callback: Callback>)
fun userLogout(callback: Callback>)
fun userLogoff(callback: Callback>)
fun cancel()
@@ -46,6 +50,9 @@ interface MineContract {
fun onVerifyOldPhoneSuccess(message: String) {}
/** 新手机号绑定成功回调。 */
fun onUpdateBindNewPhoneSuccess(message: String) {}
+ fun onUpdateBindNewEmailSuccess(message: String) {}
+ fun onVerifyOldEmailSuccess(message: String) {}
+ fun newEmailCodeSuccess(message: String) {}
/** 退出登录成功回调。 */
fun onLogoutSuccess(message: String) {}
/** 注销账号成功回调。 */
diff --git a/app/src/main/java/com/juhabi/birds/mine/mvp/MineImpl.kt b/app/src/main/java/com/juhabi/birds/mine/mvp/MineImpl.kt
index 522bbd6..3033a06 100644
--- a/app/src/main/java/com/juhabi/birds/mine/mvp/MineImpl.kt
+++ b/app/src/main/java/com/juhabi/birds/mine/mvp/MineImpl.kt
@@ -55,6 +55,17 @@ class MineImpl : MineContract.DataModel {
}
}
+ override fun getCurrentEmailCode(callback: MineContract.Callback>) {
+ ApiClient.apiService.getCurrentEmailCode(NetworkManager.getToken()).enqueue(object : Callback> {
+ override fun onResponse(call: Call>, response: Response>) {
+ mainHandler.post { response.body()?.let(callback::success) ?: callback.fail("验证码发送失败") }
+ }
+ override fun onFailure(call: Call>, error: Throwable) {
+ if (!call.isCanceled) mainHandler.post { callback.fail(error.message ?: "网络请求失败") }
+ }
+ })
+ }
+
override fun sendPhoneCode(
request: JSONObject,
callback: MineContract.Callback>
@@ -86,6 +97,17 @@ class MineImpl : MineContract.DataModel {
}
}
+ override fun sendEmailCode(request: JSONObject, callback: MineContract.Callback>) {
+ ApiClient.apiService.sendEmailCode(NetworkManager.getToken(), NetworkManager.toRequestBody(request)).enqueue(object : Callback> {
+ override fun onResponse(call: Call>, response: Response>) {
+ mainHandler.post { response.body()?.let(callback::success) ?: callback.fail("验证码发送失败") }
+ }
+ override fun onFailure(call: Call>, error: Throwable) {
+ if (!call.isCanceled) mainHandler.post { callback.fail(error.message ?: "网络请求失败") }
+ }
+ })
+ }
+
override fun verifyOldPhone(
oldCode: String,
callback: MineContract.Callback>
@@ -119,6 +141,18 @@ class MineImpl : MineContract.DataModel {
}
}
+ override fun verifyOldEmail(oldCode: String, callback: MineContract.Callback>) {
+ val body = JSONObject().apply { put("oldCode", oldCode.trim()) }
+ ApiClient.apiService.verifyOldEmail(NetworkManager.getToken(), NetworkManager.toRequestBody(body)).enqueue(object : Callback> {
+ override fun onResponse(call: Call>, response: Response>) {
+ mainHandler.post { response.body()?.let(callback::success) ?: callback.fail("当前邮箱验证失败") }
+ }
+ override fun onFailure(call: Call>, error: Throwable) {
+ if (!call.isCanceled) mainHandler.post { callback.fail(error.message ?: "网络请求失败") }
+ }
+ })
+ }
+
override fun updateBindNewPhone(
newPhoneNumber: String,
code: String,
@@ -157,6 +191,18 @@ class MineImpl : MineContract.DataModel {
}
}
+ override fun updateBindNewEmail(newEmail: String, code: String, callback: MineContract.Callback>) {
+ val body = JSONObject().apply { put("newEmail", newEmail.trim()); put("code", code.trim()) }
+ ApiClient.apiService.updateBindNewEmail(NetworkManager.getToken(), NetworkManager.toRequestBody(body)).enqueue(object : Callback> {
+ override fun onResponse(call: Call>, response: Response>) {
+ mainHandler.post { response.body()?.let(callback::success) ?: callback.fail("邮箱更换失败") }
+ }
+ override fun onFailure(call: Call>, error: Throwable) {
+ if (!call.isCanceled) mainHandler.post { callback.fail(error.message ?: "网络请求失败") }
+ }
+ })
+ }
+
override fun userLogout(callback: MineContract.Callback>) {
logoutCall?.cancel()
logoutCall = ApiClient.apiService
diff --git a/app/src/main/java/com/juhabi/birds/mine/mvp/MinePresenter.kt b/app/src/main/java/com/juhabi/birds/mine/mvp/MinePresenter.kt
index ce5a24c..ad1c49f 100644
--- a/app/src/main/java/com/juhabi/birds/mine/mvp/MinePresenter.kt
+++ b/app/src/main/java/com/juhabi/birds/mine/mvp/MinePresenter.kt
@@ -3,8 +3,8 @@ package com.juhabi.birds.mine.mvp
import com.juhabi.birds.base.BasePresenter
import com.juhabi.birds.main.model.AppVersionInfo
import com.juhabi.birds.mine.model.MineUserInfo
-import com.juhabi.birds.network.BaseBean
import com.juhabi.birds.login.model.SendCodeEntity
+import com.juhabi.birds.network.BaseBean
import org.json.JSONObject
class MinePresenter(private val mineImpl: MineImpl) : BasePresenter() {
@@ -34,6 +34,31 @@ class MinePresenter(private val mineImpl: MineImpl) : BasePresenter> {
+ override fun success(data: BaseBean) {
+ view?.apply {
+ hideLoading()
+ if (data.code == 0 || data.code == 200) {
+ sendCodeSuccess(data.message.ifBlank { "验证码已发送" })
+ } else {
+ showError(data.message.ifBlank { "验证码发送失败" })
+ }
+ }
+ }
+
+ override fun fail(message: String) {
+ view?.apply {
+ hideLoading()
+ showError(message)
+ }
+ }
+ })
+ }
+
/** 向新手机号发送 rebind 场景验证码。 */
fun sendNewPhoneCode(phoneNumber: String) {
val currentView = view ?: return
@@ -63,6 +88,35 @@ class MinePresenter(private val mineImpl: MineImpl) : BasePresenter> {
+ override fun success(data: BaseBean) {
+ view?.apply {
+ hideLoading()
+ if (data.code == 0 || data.code == 200) {
+ newEmailCodeSuccess(data.message.ifBlank { "验证码已发送" })
+ } else {
+ showError(data.message.ifBlank { "验证码发送失败" })
+ }
+ }
+ }
+
+ override fun fail(message: String) {
+ view?.apply {
+ hideLoading()
+ showError(message)
+ }
+ }
+ })
+ }
+
/** 校验当前手机号收到的验证码。 */
fun verifyOldPhone(oldCode: String) {
val currentView = view ?: return
@@ -90,6 +144,33 @@ class MinePresenter(private val mineImpl: MineImpl) : BasePresenter> {
+ override fun success(data: BaseBean) {
+ view?.apply {
+ hideLoading()
+ if (data.code == 0 || data.code == 200) {
+ onVerifyOldEmailSuccess(
+ data.message.ifBlank { "当前邮箱验证成功" }
+ )
+ } else {
+ showError(data.message.ifBlank { "当前邮箱验证失败" })
+ }
+ }
+ }
+
+ override fun fail(message: String) {
+ view?.apply {
+ hideLoading()
+ showError(message)
+ }
+ }
+ })
+ }
+
/** 提交新手机号和验证码,完成手机号换绑。 */
fun updateBindNewPhone(newPhoneNumber: String, code: String) {
val currentView = view ?: return
@@ -121,6 +202,33 @@ class MinePresenter(private val mineImpl: MineImpl) : BasePresenter> {
+ override fun success(data: BaseBean) {
+ view?.apply {
+ hideLoading()
+ if (data.code == 0 || data.code == 200) {
+ onUpdateBindNewEmailSuccess(
+ data.message.ifBlank { "邮箱更换成功" }
+ )
+ } else {
+ showError(data.message.ifBlank { "邮箱更换失败" })
+ }
+ }
+ }
+
+ override fun fail(message: String) {
+ view?.apply {
+ hideLoading()
+ showError(message)
+ }
+ }
+ })
+ }
+
/** 调用服务端退出登录接口,并统一分发成功或失败结果。 */
fun userLogout() {
val currentView = view ?: return
@@ -175,21 +283,20 @@ class MinePresenter(private val mineImpl: MineImpl) : BasePresenter {
- override fun success(data: MineUserInfo) {
- view?.apply {
- hideLoading()
- getUserInfoSuccess(data)
- }
- }
-
- override fun fail(message: String) {
- view?.apply {
- hideLoading()
- showError(message)
- }
+ override fun success(data: MineUserInfo) {
+ view?.apply {
+ hideLoading()
+ getUserInfoSuccess(data)
}
}
- )
+
+ override fun fail(message: String) {
+ view?.apply {
+ hideLoading()
+ showError(message)
+ }
+ }
+ })
}
fun checkVersion(currentVersion: String) {
diff --git a/app/src/main/java/com/juhabi/birds/network/ApiService.kt b/app/src/main/java/com/juhabi/birds/network/ApiService.kt
index 1b82c0d..7078b68 100644
--- a/app/src/main/java/com/juhabi/birds/network/ApiService.kt
+++ b/app/src/main/java/com/juhabi/birds/network/ApiService.kt
@@ -235,6 +235,44 @@ interface ApiService {
fun updateBindNewPhone(@HeaderMap headers: Map, @Body requestBody: RequestBody): Call>
+ /*****************************************************************************************************************************************/
+
+
+
+ /**
+ * 验证原邮箱号--发送短信
+ *
+ * 不需要任何入参,
+ */
+ @POST("app/user/email/old-code")
+ fun getCurrentEmailCode(@HeaderMap headers: Map): Call>
+
+
+ /**
+ * 验证原邮箱号--验证邮箱号
+ *
+ * 入参
+ *{
+ * "oldCode": "123456"
+ * }
+ *
+ */
+ @POST("app/user/email/verify-old")
+ fun verifyOldEmail(@HeaderMap headers: Map, @Body requestBody: RequestBody): Call>
+
+
+ /**
+ * 更换新的绑定邮箱号
+ {
+ "newEmail": "string",
+ "code": "string"
+ }
+ */
+ @PUT("app/user/email")
+ fun updateBindNewEmail(@HeaderMap headers: Map, @Body requestBody: RequestBody): Call>
+
+
+ /*****************************************************************************************************************************************/
/**
* 退出登录
*
diff --git a/app/src/main/java/com/juhabi/birds/util/manager/UserInfoManager.kt b/app/src/main/java/com/juhabi/birds/util/manager/UserInfoManager.kt
index e6ef07c..4896049 100644
--- a/app/src/main/java/com/juhabi/birds/util/manager/UserInfoManager.kt
+++ b/app/src/main/java/com/juhabi/birds/util/manager/UserInfoManager.kt
@@ -40,7 +40,13 @@ object UserInfoManager {
@JvmStatic
fun setUserInfo(userInfo: MineUserInfo) {
- setUserInfo(MyApplication.appContext, userInfo)
+ val loginByPhone = userInfo.email.isNullOrBlank()
+ val normalizedUserInfo = userInfo.copy(
+ email = if (loginByPhone) "" else userInfo.email,
+ phoneNumber = if (loginByPhone) userInfo.phoneNumber else "",
+ userLoginByPhone = loginByPhone
+ )
+ setUserInfo(MyApplication.appContext, normalizedUserInfo)
}
@JvmStatic
diff --git a/app/src/main/res/layout/activity_serivce_web_layout.xml b/app/src/main/res/layout/activity_serivce_web_layout.xml
new file mode 100644
index 0000000..e388ff4
--- /dev/null
+++ b/app/src/main/res/layout/activity_serivce_web_layout.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/forget_psd_layout.xml b/app/src/main/res/layout/forget_psd_layout.xml
index 9e0b28f..44b87e3 100644
--- a/app/src/main/res/layout/forget_psd_layout.xml
+++ b/app/src/main/res/layout/forget_psd_layout.xml
@@ -43,11 +43,13 @@
android:paddingStart="14dp">
+ android:text="换绑"/>
@@ -135,6 +135,7 @@
android:paddingStart="14dp">