From 7e421dfd08fbf39c598307fdf47a272eaec748bc Mon Sep 17 00:00:00 2001
From: wushaocheng <15876365887@163.com>
Date: Tue, 29 Nov 2022 15:29:09 +0800
Subject: [PATCH] =?UTF-8?q?=E7=99=BB=E5=BD=95=E7=9B=B8=E5=85=B3=E5=8A=9F?=
=?UTF-8?q?=E8=83=BD=E4=BF=AE=E6=94=B9=EF=BC=8C=E5=8C=85=E6=8B=AC=E9=87=8D?=
=?UTF-8?q?=E7=BD=AE=E5=AF=86=E7=A0=81=EF=BC=8C=E7=BB=91=E5=AE=9A=E6=89=8B?=
=?UTF-8?q?=E6=9C=BA=E5=8F=B7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/src/main/AndroidManifest.xml | 461 ++++++++---------
.../com/yizhuan/erban/base/BaseActivity.java | 3 +-
.../password/GiveGoldPassWordFragment.java | 1 -
.../erban/ui/login/AreaCodeActivity.kt | 80 +++
.../ui/login/AuthorizationCodeActivity.kt | 70 +++
.../erban/ui/login/BindCodeActivity.java | 6 +-
.../erban/ui/login/BindPhoneActivity.java | 161 ------
.../erban/ui/login/BindPhoneActivity.kt | 218 ++++++++
.../yizhuan/erban/ui/login/LoginActivity.java | 2 +-
.../erban/ui/login/LoginCodeActivity.java | 230 ---------
.../erban/ui/login/LoginCodeActivity.kt | 195 +++++++
.../erban/ui/login/LoginPasswordActivity.java | 8 +-
.../erban/ui/login/LoginPhoneActivity.kt | 91 ++++
.../erban/ui/login/ShowBindPhoneActivity.kt | 92 ++--
.../erban/ui/login/bean/CountryBean.java | 15 +
.../erban/ui/setting/ModifyPwdActivity.java | 11 +-
.../erban/ui/setting/ResetPasswordActivity.kt | 344 +++++++------
.../erban/ui/setting/SettingActivity.java | 12 +
.../erban/ui/setting/VerifyPhoneActivity.kt | 477 +++++++++---------
.../drawable-xhdpi/icon_show_bind_phone.webp | Bin 7102 -> 13502 bytes
.../main/res/layout/activity_area_code.xml | 30 ++
.../layout/activity_authorization_code.xml | 85 ++++
.../main/res/layout/activity_bind_phone.xml | 120 +++--
.../main/res/layout/activity_login_code.xml | 141 +++---
.../res/layout/activity_login_password.xml | 17 +-
.../main/res/layout/activity_login_phone.xml | 95 ++++
.../res/layout/activity_reset_login_pwd.xml | 206 ++++----
app/src/main/res/layout/activity_setting.xml | 37 ++
.../res/layout/activity_show_bind_phone.xml | 28 +-
.../main/res/layout/activity_verify_phone.xml | 264 ++++------
app/src/main/res/layout/item_country.xml | 25 +
app/src/main/res/values/arrays.xml | 245 +++++++++
app/src/main/res/values/strings.xml | 7 +-
.../bean/ClanHallMemberIncomeTotalInfo.kt | 2 +
.../earn/bean/ConfigWithdrawInfo.kt | 2 +
.../earn/bean/EarnRecordInfo.kt | 2 +
.../earn/bean/GoldToDiamondInfo.kt | 2 +
.../xchat_android_core/earn/bean/HallVo.kt | 3 +
.../earn/bean/MemberSettlement.kt | 2 +
.../earn/bean/WithdrawAccount.kt | 2 +
.../xchat_android_core/auth/AuthModel.java | 72 ++-
.../xchat_android_core/auth/IAuthModel.java | 20 +-
.../xchat_android_core/pay/IPayModel.java | 17 +-
.../xchat_android_core/pay/PayModel.java | 64 +--
.../user/bean/UserInfo.java | 6 +-
45 files changed, 2424 insertions(+), 1547 deletions(-)
create mode 100644 app/src/main/java/com/yizhuan/erban/ui/login/AreaCodeActivity.kt
create mode 100644 app/src/main/java/com/yizhuan/erban/ui/login/AuthorizationCodeActivity.kt
delete mode 100644 app/src/main/java/com/yizhuan/erban/ui/login/BindPhoneActivity.java
create mode 100644 app/src/main/java/com/yizhuan/erban/ui/login/BindPhoneActivity.kt
delete mode 100644 app/src/main/java/com/yizhuan/erban/ui/login/LoginCodeActivity.java
create mode 100644 app/src/main/java/com/yizhuan/erban/ui/login/LoginCodeActivity.kt
create mode 100644 app/src/main/java/com/yizhuan/erban/ui/login/LoginPhoneActivity.kt
create mode 100644 app/src/main/java/com/yizhuan/erban/ui/login/bean/CountryBean.java
create mode 100644 app/src/main/res/layout/activity_area_code.xml
create mode 100644 app/src/main/res/layout/activity_authorization_code.xml
create mode 100644 app/src/main/res/layout/activity_login_phone.xml
create mode 100644 app/src/main/res/layout/item_country.xml
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 449929dc6..fb0123460 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,78 +1,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ package="com.yizhuan.erban">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ android:screenOrientation="portrait" />
-
+
+ android:windowSoftInputMode="stateHidden|adjustResize" />
+
-
-
+
+
-
-
-
+
-
-
+
+
-
+
+ android:screenOrientation="portrait" />
+
+ android:screenOrientation="portrait" />
+ android:screenOrientation="portrait" />
+ android:screenOrientation="portrait" />
+
+ android:screenOrientation="portrait" />
+
+ android:windowSoftInputMode="adjustPan|stateAlwaysHidden" />
+ android:screenOrientation="portrait" />
+ android:windowSoftInputMode="adjustPan" />
+ android:screenOrientation="portrait" />
@@ -450,7 +294,7 @@
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar"
- android:windowSoftInputMode="stateHidden|adjustResize" />
+ android:windowSoftInputMode="stateHidden|adjustResize" />
+ android:windowSoftInputMode="stateHidden|adjustResize" />
+ android:windowSoftInputMode="stateHidden|adjustResize" />
+ android:screenOrientation="portrait" />
@@ -707,7 +551,7 @@
android:screenOrientation="portrait" />
+ android:screenOrientation="portrait" />
@@ -718,11 +562,11 @@
android:name="com.yizhuan.tutu.mentoring_relationship.activity.MentoringRelationshipActivity"
android:label="@string/main_androidmanifest_030"
android:screenOrientation="portrait"
- android:windowSoftInputMode="stateHidden|adjustResize" />
+ android:windowSoftInputMode="stateHidden|adjustResize" />
+ android:screenOrientation="portrait" />
@@ -745,8 +589,7 @@
-
+ android:theme="@style/room_message_activity" />
@@ -758,7 +601,7 @@
android:screenOrientation="portrait" />
+ android:screenOrientation="portrait" />
@@ -781,10 +624,10 @@
android:screenOrientation="portrait" />
+ android:screenOrientation="portrait" />
+ android:screenOrientation="portrait" />
@@ -798,7 +641,7 @@
+ android:theme="@style/room_message_activity" />
@@ -807,23 +650,24 @@
android:screenOrientation="portrait" />
+ android:screenOrientation="portrait" />
+
-
+
+ android:screenOrientation="portrait" />
+ android:screenOrientation="portrait" />
+ android:screenOrientation="portrait" />
@@ -832,7 +676,7 @@
android:screenOrientation="portrait" />
+ android:screenOrientation="portrait" />
+ android:screenOrientation="portrait" />
@@ -856,7 +700,7 @@
android:screenOrientation="portrait" />
+ android:screenOrientation="portrait" />
+ android:windowSoftInputMode="stateHidden|adjustResize" />
+ android:screenOrientation="portrait" />
+ android:screenOrientation="portrait" />
+ android:screenOrientation="portrait" />
+ android:windowSoftInputMode="adjustPan" />
@@ -900,22 +744,17 @@
android:theme="@style/dialog_web_view_activity" />
+ android:screenOrientation="portrait" />
-
-
-
-
+
+ android:screenOrientation="portrait" />
+ android:screenOrientation="portrait" />
@@ -964,7 +803,7 @@
android:screenOrientation="portrait" />
+ android:screenOrientation="portrait" />
@@ -1015,7 +854,7 @@
android:name=".earn.activity.EarnWithdrawActivity"
android:configChanges="screenSize|orientation|keyboardHidden|mcc|mnc|locale|touchscreen|screenLayout|keyboard|navigation|fontScale|uiMode|smallestScreenSize|layoutDirection"
android:exported="false"
- android:screenOrientation="portrait" />
+ android:screenOrientation="portrait" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/base/BaseActivity.java b/app/src/main/java/com/yizhuan/erban/base/BaseActivity.java
index b7304757f..a01c283e4 100644
--- a/app/src/main/java/com/yizhuan/erban/base/BaseActivity.java
+++ b/app/src/main/java/com/yizhuan/erban/base/BaseActivity.java
@@ -57,6 +57,7 @@ import com.yizhuan.erban.common.widget.dialog.DialogUiHelper;
import com.yizhuan.erban.ui.im.avtivity.NimP2PMessageActivity;
import com.yizhuan.erban.ui.login.AddUserInfoActivity;
import com.yizhuan.erban.ui.login.LoginCodeActivity;
+import com.yizhuan.erban.ui.login.LoginPhoneActivity;
import com.yizhuan.erban.ui.pay.ChargeActivity;
import com.yizhuan.erban.ui.setting.ResetPasswordActivity;
import com.yizhuan.erban.ui.webview.CommonWebViewActivity;
@@ -971,7 +972,7 @@ public abstract class BaseActivity extends RxAppCompatActivity
*/
private boolean isNeedToHandleBroadcastMessageActivity() {
List acts = new ArrayList<>();
-// acts.add(LoginPhoneActivity.class);
+ acts.add(LoginPhoneActivity.class);
acts.add(LoginCodeActivity.class);
acts.add(ResetPasswordActivity.class);
acts.add(AddUserInfoActivity.class);
diff --git a/app/src/main/java/com/yizhuan/erban/pay/password/GiveGoldPassWordFragment.java b/app/src/main/java/com/yizhuan/erban/pay/password/GiveGoldPassWordFragment.java
index 0bb36d91d..0eecb9f55 100644
--- a/app/src/main/java/com/yizhuan/erban/pay/password/GiveGoldPassWordFragment.java
+++ b/app/src/main/java/com/yizhuan/erban/pay/password/GiveGoldPassWordFragment.java
@@ -18,7 +18,6 @@ import androidx.fragment.app.FragmentManager;
import com.jungly.gridpasswordview.GridPasswordView;
import com.yizhuan.erban.R;
import com.yizhuan.erban.ui.setting.ModifyPwdActivity;
-import com.yizhuan.erban.ui.setting.VerifyPhoneActivity;
import com.yizhuan.xchat_android_library.utils.ResUtil;
diff --git a/app/src/main/java/com/yizhuan/erban/ui/login/AreaCodeActivity.kt b/app/src/main/java/com/yizhuan/erban/ui/login/AreaCodeActivity.kt
new file mode 100644
index 000000000..e2ea074a7
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/ui/login/AreaCodeActivity.kt
@@ -0,0 +1,80 @@
+package com.yizhuan.erban.ui.login
+
+import android.app.Activity
+import android.content.Intent
+import android.view.View
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.netease.nim.uikit.StatusBarUtil
+import com.yizhuan.erban.R
+import com.yizhuan.erban.base.BaseViewBindingActivity
+import com.yizhuan.erban.databinding.ActivityAreaCodeBinding
+import com.yizhuan.erban.ui.login.bean.CountryBean
+
+/**
+ * 区号
+ * Created by wushaocheng
+ * Date: 2022/11/28
+ */
+class AreaCodeActivity : BaseViewBindingActivity() {
+
+ private val mCountries = ArrayList()
+
+ companion object {
+ const val COUNTRY_NUMBER = "country_number"
+
+ @JvmStatic
+ fun startForResult(context: Activity, requestCode: Int) {
+ val intent = Intent(context, AreaCodeActivity::class.java)
+ context.startActivityForResult(
+ intent,
+ requestCode
+ )
+ }
+ }
+
+ override fun init() {
+ initTitleBar(getString(R.string.select_area_code))
+ initCountryData()
+ initListView()
+ }
+
+ private fun initCountryData() {
+ val countryList = resources.getStringArray(R.array.country_code_list_ch)
+ for (s in countryList) {
+ val country = s.split("*").toTypedArray()
+ val countryName = country[0]
+ val countryNumber = country[1]
+ val c = CountryBean(countryName, countryNumber)
+ mCountries.add(c)
+ }
+ }
+
+ private fun initListView() {
+ val mAdapter = object :
+ BaseQuickAdapter(R.layout.item_country, mCountries) {
+ override fun convert(helper: BaseViewHolder, item: CountryBean) {
+ helper.setText(R.id.tv_name, item.name)
+ helper.setText(R.id.tv_country_code, item.code)
+ }
+ }
+ binding.mRecyclerView.adapter = mAdapter
+ //返回国家
+ mAdapter.setOnItemClickListener { adapter: BaseQuickAdapter<*, *>?, view: View?, position: Int ->
+ val country = mCountries[position]
+ val intent = Intent()
+ intent.putExtra(COUNTRY_NUMBER, country.code)
+ setResult(RESULT_OK, intent)
+ finish()
+ }
+ }
+
+ override fun needSteepStateBar() = true
+
+ override fun setStatusBar() {
+ super.setStatusBar()
+ StatusBarUtil.transparencyBar(this)
+ StatusBarUtil.StatusBarLightMode(this)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/ui/login/AuthorizationCodeActivity.kt b/app/src/main/java/com/yizhuan/erban/ui/login/AuthorizationCodeActivity.kt
new file mode 100644
index 000000000..c2826002e
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/ui/login/AuthorizationCodeActivity.kt
@@ -0,0 +1,70 @@
+package com.yizhuan.erban.ui.login
+
+import android.text.Editable
+import android.text.TextWatcher
+import android.view.MotionEvent
+import android.view.WindowManager
+import android.widget.EditText
+import com.netease.nim.uikit.StatusBarUtil
+import com.yizhuan.erban.base.BaseViewBindingActivity
+import com.yizhuan.erban.databinding.ActivityAuthorizationCodeBinding
+
+/**
+ * 授权码页面
+ * Created by wushaocheng
+ * Date: 2022/11/28
+ */
+class AuthorizationCodeActivity : BaseViewBindingActivity() {
+
+ override fun init() {
+ initData()
+ initListener()
+ }
+
+ private fun initData() {
+ this.window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
+ }
+
+ private fun initListener() {
+ binding.etCode.addTextChangedListener(object : TextWatcher {
+ override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
+
+ }
+
+ override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
+
+ }
+
+ override fun afterTextChanged(p0: Editable?) {
+ binding.btnNext.isEnabled = p0?.isEmpty() != true
+ }
+
+ })
+ binding.btnNext.setOnClickListener {
+
+ }
+ }
+
+ override fun onTouchEvent(event: MotionEvent): Boolean {
+ val view = currentFocus
+ var isPressEdit = false
+ if (view is EditText) {
+ if (event.rawX >= view.getX() && event.rawX <= view.getX() + view.getWidth() && event.rawY >= view.getY() && event.rawY <= view.getY() + view.getHeight()) {
+ isPressEdit = true
+ }
+ }
+ if (!isPressEdit) {
+ hideIME()
+ }
+ return super.onTouchEvent(event)
+ }
+
+ override fun needSteepStateBar() = true
+
+ override fun setStatusBar() {
+ super.setStatusBar()
+ StatusBarUtil.transparencyBar(this)
+ StatusBarUtil.StatusBarLightMode(this)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/ui/login/BindCodeActivity.java b/app/src/main/java/com/yizhuan/erban/ui/login/BindCodeActivity.java
index cc5696f35..8c468b98d 100644
--- a/app/src/main/java/com/yizhuan/erban/ui/login/BindCodeActivity.java
+++ b/app/src/main/java/com/yizhuan/erban/ui/login/BindCodeActivity.java
@@ -81,9 +81,9 @@ public class BindCodeActivity extends BaseActivity {
private void onFindViews() {
codeEt = findViewById(R.id.et_code);
- tvGetCode = findViewById(R.id.tv_get_code);
+// tvGetCode = findViewById(R.id.tv_get_code);
tvDesc = findViewById(R.id.tv_desc);
- tvSecond = findViewById(R.id.tv_second);
+// tvSecond = findViewById(R.id.tv_second);
}
private void onSetListener() {
@@ -179,7 +179,7 @@ public class BindCodeActivity extends BaseActivity {
private void bindPhone() {
getDialogManager().showProgressDialog(BindCodeActivity.this, ResUtil.getString(R.string.ui_login_bindcodeactivity_02));
- AuthModel.get().bindPhone(mPhone, codeEt.getText().toString())
+ AuthModel.get().bindPhone(mPhone, codeEt.getText().toString(),"")
.compose(bindUntilEvent(ActivityEvent.DESTROY))
.doOnSuccess(s -> {
toast(ResUtil.getString(R.string.ui_login_bindcodeactivity_03));
diff --git a/app/src/main/java/com/yizhuan/erban/ui/login/BindPhoneActivity.java b/app/src/main/java/com/yizhuan/erban/ui/login/BindPhoneActivity.java
deleted file mode 100644
index d4ba91804..000000000
--- a/app/src/main/java/com/yizhuan/erban/ui/login/BindPhoneActivity.java
+++ /dev/null
@@ -1,161 +0,0 @@
-package com.yizhuan.erban.ui.login;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.text.Editable;
-import android.text.TextUtils;
-import android.text.TextWatcher;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.WindowManager;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.ImageView;
-
-import com.netease.nim.uikit.StatusBarUtil;
-import com.yizhuan.erban.R;
-import com.yizhuan.erban.base.BaseActivity;
-import com.yizhuan.erban.ui.login.helper.LogoutHelper;
-import com.yizhuan.xchat_android_library.utils.NetworkUtils;
-import com.yizhuan.xchat_android_library.utils.TextWatcherWrapper;
-
-/**
- * 由于所有用户都需要强制绑定手机,所以理论上这里只有MainActivity会调用到这个界面
- * 但是为了以防万一,其它调用绑定手机的地方也改为调用这个页面了
- */
-public class BindPhoneActivity extends BaseActivity implements View.OnClickListener {
-
- private static final String TAG = "BindPhoneActivity";
-
- private EditText accountEt;
- private Button btnNext;
- private ImageView ivBack;
- public static final String KEY_BACK_LOGIN = "key_back_login";
- private int REQUEST_CODE = 100;
-
- private AccountValidator accountValidator = new AccountValidator();
- private TextWatcher textWatcher = new TextWatcherWrapper() {
- @Override
- public void afterTextChanged(Editable s) {
- checkInput();
- }
- };
-
-
- public static void start(Context context) {
- Intent intent = new Intent(context, BindPhoneActivity.class);
- context.startActivity(intent);
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_bind_phone);
- onFindViews();
- onSetListener();
-
- accountEt.setFocusable(true);
- accountEt.setFocusableInTouchMode(true);
- accountEt.requestFocus();
- this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
- }
-
- private void onFindViews() {
- accountEt = findViewById(R.id.et_account);
- btnNext = findViewById(R.id.btn_next);
- ivBack = findViewById(R.id.iv_back);
- }
-
- private void onSetListener() {
- btnNext.setOnClickListener(this);
- btnNext.setEnabled(false);
- accountEt.addTextChangedListener(textWatcher);
- ivBack.setOnClickListener(this);
- }
-
- private void checkInput() {
- if (!TextUtils.isEmpty(accountEt.getText().toString()) && accountEt.getText().toString().length() >= 7) {
- btnNext.setEnabled(true);
- } else {
- btnNext.setEnabled(false);
- }
- }
-
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.btn_next:
- if (!NetworkUtils.isNetworkStrictlyAvailable(this)) {
- checkNetToast();
- return;
- }
- if (!accountValidator.isValid(accountEt.getText().toString())) {
- toast(accountValidator.getErrorMessage());
- return;
- }
- BindCodeActivity.startForResult(BindPhoneActivity.this, accountEt.getText().toString(), REQUEST_CODE);
- break;
-
- case R.id.iv_back:
- handleFinish();
- break;
- default:
- break;
- }
- }
-
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
- finish();
- }
- }
-
- @Override
- protected void onDestroy() {
- accountEt = null;
- super.onDestroy();
- }
-
-
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- View view = getCurrentFocus();
- boolean isPressEdit = false;
- if (view instanceof EditText) {
- if (event.getRawX() >= view.getX() && event.getRawX() <= view.getX() + view.getWidth() && event.getRawY() >= view.getY() && event.getRawY() <= view.getY() + view.getHeight()) {
- isPressEdit = true;
- }
- }
- if (!isPressEdit) {
- hideIME();
- }
- return super.onTouchEvent(event);
- }
-
-
- @Override
- public void onBackPressed() {
- handleFinish();
- }
-
- private void handleFinish() {
- LogoutHelper.logout();
- finish();
- }
-
- @Override
- protected boolean needSteepStateBar() {
- return true;
- }
-
- @Override
- protected void setStatusBar() {
- StatusBarUtil.transparencyBar(this);
- StatusBarUtil.StatusBarLightMode(this);
- }
-
-}
diff --git a/app/src/main/java/com/yizhuan/erban/ui/login/BindPhoneActivity.kt b/app/src/main/java/com/yizhuan/erban/ui/login/BindPhoneActivity.kt
new file mode 100644
index 000000000..9718cdf02
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/ui/login/BindPhoneActivity.kt
@@ -0,0 +1,218 @@
+package com.yizhuan.erban.ui.login
+
+import android.content.Context
+import android.content.Intent
+import android.os.CountDownTimer
+import android.text.Editable
+import android.text.TextUtils
+import android.text.TextWatcher
+import android.view.MotionEvent
+import android.view.View
+import android.widget.EditText
+import androidx.core.content.ContextCompat
+import com.coorchice.library.utils.LogUtils
+import com.netease.nim.uikit.StatusBarUtil
+import com.trello.rxlifecycle3.android.ActivityEvent
+import com.yizhuan.erban.R
+import com.yizhuan.erban.base.BaseViewBindingActivity
+import com.yizhuan.erban.databinding.ActivityBindPhoneBinding
+import com.yizhuan.erban.ui.login.BindPhoneActivity
+import com.yizhuan.xchat_android_core.auth.AuthModel
+import com.yizhuan.xchat_android_core.code.CodeType
+import com.yizhuan.xchat_android_core.user.UserModel
+import com.yizhuan.xchat_android_core.user.bean.UserInfo
+import com.yizhuan.xchat_android_library.utils.NetworkUtils
+import com.yizhuan.xchat_android_library.utils.ResUtil
+import io.reactivex.SingleObserver
+import io.reactivex.android.schedulers.AndroidSchedulers
+import io.reactivex.disposables.Disposable
+
+/**
+ * 由于所有用户都需要强制绑定手机,所以理论上这里只有MainActivity会调用到这个界面
+ * 但是为了以防万一,其它调用绑定手机的地方也改为调用这个页面了
+ */
+class BindPhoneActivity : BaseViewBindingActivity(),
+ View.OnClickListener, TextWatcher {
+
+ private var cdt: CountDownTimer? = null
+
+ companion object {
+ private const val TAG = "BindPhoneActivity"
+ const val REQUEST_AREA_CODE = 100
+
+ @JvmStatic
+ fun start(context: Context) {
+ val intent = Intent(context, BindPhoneActivity::class.java)
+ context.startActivity(intent)
+ }
+ }
+
+ override fun init() {
+ initTitleBar(getString(R.string.text_bind_phone))
+ initListener()
+ }
+
+ private fun initListener() {
+ binding.tvAreaCode.setOnClickListener(this)
+ binding.tvGetCode.setOnClickListener(this)
+ binding.btnNext.setOnClickListener(this)
+ binding.etAccount.addTextChangedListener(this)
+ binding.etCode.addTextChangedListener(this)
+ }
+
+ override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
+
+ }
+
+ override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
+
+ }
+
+ override fun afterTextChanged(p0: Editable?) {
+ binding.btnNext.isEnabled = !TextUtils.isEmpty(binding.etAccount.text.toString()) &&
+ !TextUtils.isEmpty(binding.etCode.text.toString())
+ }
+
+ override fun onClick(v: View) {
+ when (v.id) {
+ R.id.tv_area_code -> {
+ AreaCodeActivity.startForResult(this, REQUEST_AREA_CODE)
+ }
+ R.id.tv_get_code -> {
+ dialogManager.showProgressDialog(this)
+ AuthModel.get()
+ .getSmsCode(
+ binding.tvAreaCode.text.toString().substring(1),
+ binding.tvAreaCode.text.toString()
+ .substring(1) + binding.etAccount.text.toString(),
+ CodeType.BIND_PHONE
+ )
+ .observeOn(AndroidSchedulers.mainThread())
+ .compose(bindUntilEvent(ActivityEvent.DESTROY))
+ .subscribe(object : SingleObserver {
+ override fun onSubscribe(d: Disposable) {}
+ override fun onSuccess(tip: String) {
+ dialogManager.dismissDialog()
+ startCounter()
+ toast(tip)
+ }
+
+ override fun onError(e: Throwable) {
+ dialogManager.dismissDialog()
+ toast(e.message)
+ LogUtils.e(ResUtil.getString(R.string.ui_login_bindcodeactivity_01))
+ }
+ })
+ }
+ R.id.btn_next -> {
+ if (!NetworkUtils.isNetworkStrictlyAvailable(this)) {
+ checkNetToast()
+ return
+ }
+ dialogManager.showProgressDialog(
+ this,
+ ResUtil.getString(R.string.ui_login_bindcodeactivity_02)
+ )
+ AuthModel.get().bindPhone(
+ binding.tvAreaCode.text.toString().substring(1),
+ binding.tvAreaCode.text.toString()
+ .substring(1) + binding.etAccount.text.toString(),
+ binding.etCode.text.toString()
+ )
+ .compose(bindUntilEvent(ActivityEvent.DESTROY))
+ .doOnSuccess { s: String? ->
+ toast(ResUtil.getString(R.string.ui_login_bindcodeactivity_03))
+ setResult(RESULT_OK)
+ }
+ .doOnError { throwable: Throwable ->
+ toast(
+ throwable.message
+ )
+ }
+ .flatMap { s: String? ->
+ UserModel.get().updateCurrentUserInfo()
+ }
+ .doOnSuccess { s: UserInfo? ->
+ setResult(RESULT_OK)
+ finish()
+ }
+ .doFinally { dialogManager.dismissDialog() }
+ .subscribe()
+ }
+ }
+ }
+
+ private fun startCounter() {
+ stopCounter()
+ //开始倒计时 60s 间隔1s
+ binding.tvGetCode.isEnabled = false
+ binding.tvGetCode.setTextColor(ContextCompat.getColor(this, R.color.color_9168FA))
+ cdt = object : CountDownTimer(60 * 1000, 100) {
+ override fun onTick(text: Long) {
+ showTextDown(text)
+ }
+
+ override fun onFinish() {
+ resetBtn()
+ }
+ }
+ cdt?.start()
+ }
+
+ private fun showTextDown(text: Long) {
+ val time = (text / 1000).toString() + "s"
+ binding.tvGetCode.text = time
+ }
+
+ private fun stopCounter() {
+ cdt?.cancel()
+ cdt = null
+ }
+
+
+ private fun resetBtn() {
+ stopCounter()
+ binding.tvGetCode.setTextColor(ContextCompat.getColor(this, R.color.text_title_color))
+ binding.tvGetCode.isEnabled = true
+ binding.tvGetCode.text = getString(R.string.text_request_code)
+ }
+
+ override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+ super.onActivityResult(requestCode, resultCode, data)
+ if (requestCode == REQUEST_AREA_CODE && resultCode == RESULT_OK) {
+ val areaCode = data?.getStringExtra(AreaCodeActivity.COUNTRY_NUMBER)
+ if (areaCode != null) {
+ binding.tvAreaCode.text = areaCode
+ }
+ }
+ }
+
+ override fun onTouchEvent(event: MotionEvent): Boolean {
+ val view = currentFocus
+ var isPressEdit = false
+ if (view is EditText) {
+ if (event.rawX >= view.getX() && event.rawX <= view.getX() + view.getWidth() && event.rawY >= view.getY() && event.rawY <= view.getY() + view.getHeight()) {
+ isPressEdit = true
+ }
+ }
+ if (!isPressEdit) {
+ hideIME()
+ }
+ return super.onTouchEvent(event)
+ }
+
+ override fun needSteepStateBar(): Boolean {
+ return true
+ }
+
+ override fun setStatusBar() {
+ StatusBarUtil.transparencyBar(this)
+ StatusBarUtil.StatusBarLightMode(this)
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ stopCounter()
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/ui/login/LoginActivity.java b/app/src/main/java/com/yizhuan/erban/ui/login/LoginActivity.java
index a0718905a..3c92c345f 100644
--- a/app/src/main/java/com/yizhuan/erban/ui/login/LoginActivity.java
+++ b/app/src/main/java/com/yizhuan/erban/ui/login/LoginActivity.java
@@ -219,7 +219,7 @@ public class LoginActivity extends BaseActivity implements View.OnClickListener
break;
case R.id.tv_phone:
-
+ LoginPhoneActivity.start(this);
break;
case R.id.tv_others:
LoginPasswordActivity.start(LoginActivity.this);
diff --git a/app/src/main/java/com/yizhuan/erban/ui/login/LoginCodeActivity.java b/app/src/main/java/com/yizhuan/erban/ui/login/LoginCodeActivity.java
deleted file mode 100644
index 2a9363cfb..000000000
--- a/app/src/main/java/com/yizhuan/erban/ui/login/LoginCodeActivity.java
+++ /dev/null
@@ -1,230 +0,0 @@
-package com.yizhuan.erban.ui.login;
-
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.text.TextUtils;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.WindowManager;
-import android.widget.EditText;
-import android.widget.TextView;
-
-import com.coorchice.library.utils.LogUtils;
-import com.netease.nim.uikit.StatusBarUtil;
-import com.trello.rxlifecycle3.android.ActivityEvent;
-import com.yizhuan.erban.R;
-import com.yizhuan.erban.base.BaseActivity;
-import com.yizhuan.erban.ui.login.helper.LogoutHelper;
-import com.yizhuan.erban.ui.login.ui.CodeEditText;
-import com.yizhuan.xchat_android_core.auth.AuthModel;
-import com.yizhuan.xchat_android_core.auth.event.LoginEvent;
-import com.yizhuan.xchat_android_core.code.CodeType;
-import com.yizhuan.xchat_android_core.statistic.StatisticManager;
-import com.yizhuan.xchat_android_core.statistic.protocol.StatisticsProtocol;
-import com.yizhuan.xchat_android_library.utils.ResUtil;
-
-import org.greenrobot.eventbus.EventBus;
-import org.greenrobot.eventbus.Subscribe;
-import org.greenrobot.eventbus.ThreadMode;
-
-import io.reactivex.SingleObserver;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.Disposable;
-
-/**
- * @author zhouxiangfeng
- * @date 17/2/26
- */
-public class LoginCodeActivity extends BaseActivity {
-
- private CodeEditText codeEt;
- private TextView tvGetCode, tvDesc, tvSecond;
- private String mPhone;
- private boolean isSuperAdmin = false;
- private CodeDownDescTimer timer;
-
- public static void start(Context context, String phone) {
- Intent intent = new Intent(context, LoginCodeActivity.class);
- intent.putExtra("phone", phone);
- context.startActivity(intent);
- }
-
- public static void startForResult(Activity context, int requestCode) {
- Intent intent = new Intent(context, LoginCodeActivity.class);
- context.startActivityForResult(intent, requestCode); // startActivityForResult会导致singletop,singletask失效
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_login_code);
- EventBus.getDefault().register(this);
- onFindViews();
- initData();
- onSetListener();
- getSmsCode();
- }
-
- @SuppressLint("SetTextI18n")
- private void initData() {
- mPhone = getIntent().getStringExtra("phone");
-
- codeEt.setFocusable(true);
- codeEt.setFocusableInTouchMode(true);
- codeEt.requestFocus();
- this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
-
- }
-
- @Override
- protected boolean needSteepStateBar() {
- return true;
- }
-
- @Override
- protected void setStatusBar() {
- StatusBarUtil.transparencyBar(this);
- StatusBarUtil.StatusBarLightMode(this);
- }
-
- private void onFindViews() {
- codeEt = findViewById(R.id.et_code);
- tvGetCode = findViewById(R.id.tv_get_code);
- tvDesc = findViewById(R.id.tv_desc);
- tvSecond = findViewById(R.id.tv_second);
- }
-
- private void onSetListener() {
-
- codeEt.setOnTextFinishListener((text, length) -> login());
-
- tvGetCode.setOnClickListener(v -> getSmsCode());
-
- findViewById(R.id.iv_back).setOnClickListener(v -> finish());
- }
-
- @Override
- protected void onDestroy() {
- codeEt = null;
- super.onDestroy();
- stopCountDownTimer();
- EventBus.getDefault().unregister(this);
- }
-
-
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- View view = getCurrentFocus();
- boolean isPressEdit = false;
- if (view instanceof EditText) {
- if (event.getRawX() >= view.getX() && event.getRawX() <= view.getX() + view.getWidth() && event.getRawY() >= view.getY() && event.getRawY() <= view.getY() + view.getHeight()) {
- isPressEdit = true;
- }
- }
- if (!isPressEdit) {
- hideIME();
- }
- return super.onTouchEvent(event);
-
- }
-
-
- /**
- * 获取验证码
- */
- @SuppressLint("CheckResult")
- private void getSmsCode() {
- if (TextUtils.isEmpty(mPhone) || mPhone.length() != 11) {
- return;
- }
- AuthModel.get()
- .sendLoginCode(mPhone, CodeType.REGISTER)
- .observeOn(AndroidSchedulers.mainThread())
- .compose(bindUntilEvent(ActivityEvent.DESTROY))
- .subscribe(new SingleObserver() {
- @Override
- public void onSubscribe(Disposable d) {
-
- }
-
- @Override
- public void onSuccess(String s) {
- tvDesc.setText(getString(R.string.str_send_code_success) + mPhone);
- startCountDownTimer();
- toast(s);
- }
-
- @Override
- public void onError(Throwable e) {
- toast(e.getMessage());
-// finish();
- LogUtils.e(ResUtil.getString(R.string.ui_login_logincodeactivity_01));
- }
- });
- }
-
- private void login() {
- String smsCode = codeEt.getText().toString();
- getDialogManager().showProgressDialog(this, ResUtil.getString(R.string.ui_login_logincodeactivity_02));
- AuthModel.get().login(
- mPhone,
- "",
- smsCode,
- "",
- "")
- .subscribe(new SingleObserver() {
- @Override
- public void onSubscribe(Disposable d) {
- mCompositeDisposable.add(d);
- }
-
- @Override
- public void onSuccess(String s) {
- getDialogManager().dismissDialog();
- stopCountDownTimer();
- setResult(RESULT_OK);
- finish();
- }
-
- @Override
- public void onError(Throwable e) {
- getDialogManager().dismissDialog();
- dealWithLoginError(e);
- }
- });
-
- StatisticManager.Instance().onEvent(this,
- StatisticsProtocol.EVENT_LOGIN_PHONE_CLICK, ResUtil.getString(R.string.ui_login_logincodeactivity_03), null);
- }
-
- public void dealWithLoginError(Throwable e) {
- LogoutHelper.dealWithLoginError(this, e);
- }
-
- private void startCountDownTimer() {
- stopCountDownTimer();
- timer = new CodeDownDescTimer(tvSecond, tvGetCode, 60000, 1000);
- timer.start();
- }
-
- private void stopCountDownTimer() {
- if (timer != null) {
- timer.cancel();
- timer = null;
- }
- }
-
- /**
- * 注册成功后发送过来的事件
- */
- @Subscribe(threadMode = ThreadMode.MAIN)
- public void onLoginEvent(LoginEvent event) {
- getDialogManager().dismissDialog();
- setResult(RESULT_OK);
- finish();
- }
-
-}
diff --git a/app/src/main/java/com/yizhuan/erban/ui/login/LoginCodeActivity.kt b/app/src/main/java/com/yizhuan/erban/ui/login/LoginCodeActivity.kt
new file mode 100644
index 000000000..095809eb0
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/ui/login/LoginCodeActivity.kt
@@ -0,0 +1,195 @@
+package com.yizhuan.erban.ui.login
+
+import android.annotation.SuppressLint
+import android.app.Activity
+import android.content.Context
+import android.content.Intent
+import android.text.Editable
+import android.text.TextWatcher
+import android.view.MotionEvent
+import android.view.WindowManager
+import android.widget.EditText
+import com.coorchice.library.utils.LogUtils
+import com.netease.nim.uikit.StatusBarUtil
+import com.trello.rxlifecycle3.android.ActivityEvent
+import com.yizhuan.erban.R
+import com.yizhuan.erban.base.BaseViewBindingActivity
+import com.yizhuan.erban.databinding.ActivityLoginCodeBinding
+import com.yizhuan.erban.ui.login.helper.LogoutHelper
+import com.yizhuan.xchat_android_core.auth.AuthModel
+import com.yizhuan.xchat_android_core.auth.event.LoginEvent
+import com.yizhuan.xchat_android_core.code.CodeType
+import com.yizhuan.xchat_android_core.statistic.StatisticManager
+import com.yizhuan.xchat_android_core.statistic.protocol.StatisticsProtocol
+import com.yizhuan.xchat_android_library.utils.ResUtil
+import io.reactivex.SingleObserver
+import io.reactivex.android.schedulers.AndroidSchedulers
+import io.reactivex.disposables.Disposable
+import org.greenrobot.eventbus.EventBus
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+
+/**
+ * 验证码页面
+ * Created by wushaocheng
+ * Date: 2022/11/28
+ */
+class LoginCodeActivity : BaseViewBindingActivity() {
+ private var mPhone: String? = null
+
+ companion object {
+ fun start(context: Context, phone: String?) {
+ val intent = Intent(context, LoginCodeActivity::class.java)
+ intent.putExtra("phone", phone)
+ context.startActivity(intent)
+ }
+
+ fun startForResult(context: Activity, requestCode: Int) {
+ val intent = Intent(context, LoginCodeActivity::class.java)
+ context.startActivityForResult(
+ intent,
+ requestCode
+ ) // startActivityForResult会导致singletop,singletask失效
+ }
+ }
+
+ override fun init() {
+ EventBus.getDefault().register(this)
+ initData()
+ initListener()
+ getSmsCode()
+ }
+
+ @SuppressLint("SetTextI18n")
+ private fun initData() {
+ mPhone = intent.getStringExtra("phone")
+ this.window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
+ }
+
+ private fun initListener() {
+ binding.etCode.addTextChangedListener(object : TextWatcher{
+ override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
+
+ }
+
+ override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
+
+ }
+
+ override fun afterTextChanged(p0: Editable?) {
+ binding.btnNext.isEnabled = p0?.isEmpty() != true
+ }
+
+ })
+ binding.tvRegain.setOnClickListener { getSmsCode() }
+ binding.btnNext.setOnClickListener {
+
+ }
+ }
+
+ override fun onTouchEvent(event: MotionEvent): Boolean {
+ val view = currentFocus
+ var isPressEdit = false
+ if (view is EditText) {
+ if (event.rawX >= view.getX() && event.rawX <= view.getX() + view.getWidth() && event.rawY >= view.getY() && event.rawY <= view.getY() + view.getHeight()) {
+ isPressEdit = true
+ }
+ }
+ if (!isPressEdit) {
+ hideIME()
+ }
+ return super.onTouchEvent(event)
+ }
+
+ /**
+ * 获取验证码
+ */
+ private fun getSmsCode(){
+ AuthModel.get()
+ .sendLoginCode(mPhone, CodeType.REGISTER)
+ .observeOn(AndroidSchedulers.mainThread())
+ .compose(bindUntilEvent(ActivityEvent.DESTROY))
+ .subscribe(object : SingleObserver {
+ override fun onSubscribe(d: Disposable) {}
+
+ override fun onSuccess(tip: String) {
+// startCountDownTimer()
+ toast(tip)
+ }
+
+ override fun onError(e: Throwable) {
+ toast(e.message)
+ //finish();
+ LogUtils.e(ResUtil.getString(R.string.ui_login_logincodeactivity_01))
+ }
+
+ })
+ }
+
+ private fun login() {
+ val smsCode = binding.etCode.text.toString()
+ dialogManager.showProgressDialog(
+ this,
+ ResUtil.getString(R.string.ui_login_logincodeactivity_02)
+ )
+ AuthModel.get().login(
+ mPhone,
+ "",
+ smsCode,
+ "",
+ ""
+ )
+ .subscribe(object : SingleObserver {
+ override fun onSubscribe(d: Disposable) {
+ mCompositeDisposable.add(d)
+ }
+
+ override fun onSuccess(t: String) {
+ dialogManager.dismissDialog()
+// stopCountDownTimer()
+ setResult(RESULT_OK)
+ finish()
+ }
+
+ override fun onError(e: Throwable) {
+ dialogManager.dismissDialog()
+ dealWithLoginError(e)
+ }
+ })
+ StatisticManager.Instance().onEvent(
+ this,
+ StatisticsProtocol.EVENT_LOGIN_PHONE_CLICK,
+ ResUtil.getString(R.string.ui_login_logincodeactivity_03),
+ null
+ )
+ }
+
+ fun dealWithLoginError(e: Throwable?) {
+ LogoutHelper.dealWithLoginError(this, e)
+ }
+
+ /**
+ * 注册成功后发送过来的事件
+ */
+ @Subscribe(threadMode = ThreadMode.MAIN)
+ fun onLoginEvent(event: LoginEvent?) {
+ dialogManager.dismissDialog()
+ setResult(RESULT_OK)
+ finish()
+ }
+
+ override fun needSteepStateBar(): Boolean {
+ return true
+ }
+
+ override fun setStatusBar() {
+ StatusBarUtil.transparencyBar(this)
+ StatusBarUtil.StatusBarLightMode(this)
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ EventBus.getDefault().unregister(this)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/ui/login/LoginPasswordActivity.java b/app/src/main/java/com/yizhuan/erban/ui/login/LoginPasswordActivity.java
index 6258c173f..330d25162 100644
--- a/app/src/main/java/com/yizhuan/erban/ui/login/LoginPasswordActivity.java
+++ b/app/src/main/java/com/yizhuan/erban/ui/login/LoginPasswordActivity.java
@@ -15,6 +15,7 @@ import com.yizhuan.erban.R;
import com.yizhuan.erban.application.ReportManager;
import com.yizhuan.erban.base.BaseActivity;
import com.yizhuan.erban.ui.login.helper.LogoutHelper;
+import com.yizhuan.erban.ui.setting.ResetPasswordActivity;
import com.yizhuan.xchat_android_core.auth.AuthModel;
import com.yizhuan.xchat_android_core.auth.event.LoginEvent;
import com.yizhuan.xchat_android_library.utils.TextWatcherWrapper;
@@ -69,9 +70,10 @@ public class LoginPasswordActivity extends BaseActivity {
edtPassword.addTextChangedListener(textWatcher);
btnNext.setOnClickListener(v -> login());
findViewById(R.id.tv_forget_password).setOnClickListener(v ->
- getDialogManager().showOkCancelWithTitleDialog(getString(R.string.login_contact_service), "LINE:pekoyuyin", getString(R.string.button_ok), "", true, () -> {
-
- })
+ ResetPasswordActivity.start(context, ResetPasswordActivity.FROM_NOT_LOGIN)
+// getDialogManager().showOkCancelWithTitleDialog(getString(R.string.login_contact_service), "LINE:pekoyuyin", getString(R.string.button_ok), "", true, () -> {
+//
+// })
);
}
diff --git a/app/src/main/java/com/yizhuan/erban/ui/login/LoginPhoneActivity.kt b/app/src/main/java/com/yizhuan/erban/ui/login/LoginPhoneActivity.kt
new file mode 100644
index 000000000..ac472e31f
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/ui/login/LoginPhoneActivity.kt
@@ -0,0 +1,91 @@
+package com.yizhuan.erban.ui.login
+
+import android.content.Context
+import android.content.Intent
+import android.text.Editable
+import android.text.TextWatcher
+import android.view.MotionEvent
+import android.view.View
+import android.view.WindowManager
+import android.widget.EditText
+import com.netease.nim.uikit.StatusBarUtil
+import com.yizhuan.erban.R
+import com.yizhuan.erban.base.BaseViewBindingActivity
+import com.yizhuan.erban.databinding.ActivityLoginPhoneBinding
+
+/**
+ * 手机号登录页面
+ * Created by wushaocheng
+ * Date: 2022/11/28
+ */
+class LoginPhoneActivity : BaseViewBindingActivity(),
+ View.OnClickListener {
+
+ companion object {
+
+ @JvmStatic
+ fun start(context: Context) {
+ val starter = Intent(context, LoginPhoneActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun init() {
+ this.window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
+ initListener()
+ }
+
+ private fun initListener() {
+ binding.tvCode.setOnClickListener(this)
+ binding.btnNext.setOnClickListener(this)
+ binding.etPhone.addTextChangedListener(object : TextWatcher {
+ override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
+
+ }
+
+ override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
+
+ }
+
+ override fun afterTextChanged(p0: Editable?) {
+ binding.btnNext.isEnabled = p0?.isEmpty() != true
+ }
+
+ })
+ }
+
+ override fun onClick(view: View?) {
+ when (view?.id) {
+ R.id.tvCode -> {
+
+ }
+ R.id.btnNext -> {
+ hideIME()
+ LoginCodeActivity.start(this, binding.etPhone.text.toString())
+ }
+ }
+ }
+
+ override fun onTouchEvent(event: MotionEvent): Boolean {
+ val view = currentFocus
+ var isPressEdit = false
+ if (view is EditText) {
+ if (event.rawX >= view.getX() && event.rawX <= view.getX() + view.getWidth() && event.rawY >= view.getY() && event.rawY <= view.getY() + view.getHeight()) {
+ isPressEdit = true
+ }
+ }
+ if (!isPressEdit) {
+ hideIME()
+ }
+ return super.onTouchEvent(event)
+ }
+
+ override fun needSteepStateBar() = true
+
+ override fun setStatusBar() {
+ super.setStatusBar()
+ StatusBarUtil.transparencyBar(this)
+ StatusBarUtil.StatusBarLightMode(this)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/ui/login/ShowBindPhoneActivity.kt b/app/src/main/java/com/yizhuan/erban/ui/login/ShowBindPhoneActivity.kt
index 0479d8ef5..f5855599b 100644
--- a/app/src/main/java/com/yizhuan/erban/ui/login/ShowBindPhoneActivity.kt
+++ b/app/src/main/java/com/yizhuan/erban/ui/login/ShowBindPhoneActivity.kt
@@ -1,52 +1,58 @@
-package com.yizhuan.erban.ui.login;
+package com.yizhuan.erban.ui.login
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.text.TextUtils;
-import android.widget.TextView;
+import android.annotation.SuppressLint
+import android.content.Context
+import android.os.Bundle
+import com.yizhuan.erban.R
+import com.yizhuan.xchat_android_library.utils.ResUtil
+import android.widget.TextView
+import com.yizhuan.xchat_android_core.user.UserModel
+import com.yizhuan.erban.ui.setting.VerifyPhoneActivity
+import com.netease.nim.uikit.StatusBarUtil
+import android.content.Intent
+import android.text.TextUtils
+import android.view.View
+import com.yizhuan.erban.base.BaseActivity
+import com.yizhuan.erban.base.BaseViewBindingActivity
+import com.yizhuan.erban.databinding.ActivityShowBindPhoneBinding
+import com.yizhuan.erban.ui.login.ShowBindPhoneActivity
-import com.netease.nim.uikit.StatusBarUtil;
-import com.yizhuan.erban.R;
-import com.yizhuan.erban.base.BaseActivity;
-import com.yizhuan.erban.ui.setting.VerifyPhoneActivity;
-import com.yizhuan.xchat_android_core.user.UserModel;
-import com.yizhuan.xchat_android_core.user.bean.UserInfo;
-import com.yizhuan.xchat_android_library.utils.ResUtil;
+/**
+ * 已綁定手機號頁面
+ * Created by wushaocheng
+ * Date: 2022/11/28
+ */
+class ShowBindPhoneActivity : BaseViewBindingActivity() {
-public class ShowBindPhoneActivity extends BaseActivity {
-
- public static void start(Context context) {
- Intent intent = new Intent(context, ShowBindPhoneActivity.class);
- context.startActivity(intent);
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_show_bind_phone);
- initWhiteTitleBar(ResUtil.getString(R.string.ui_login_showbindphoneactivity_01));
- TextView tv_phone = findViewById(R.id.tv_phone);
- UserInfo userInfo = UserModel.get().getCacheLoginUserInfo();
- if (userInfo != null && !TextUtils.isEmpty(userInfo.getPhone())) {
- tv_phone.setText(userInfo.getPhone());
+ companion object {
+ @JvmStatic
+ fun start(context: Context) {
+ val intent = Intent(context, ShowBindPhoneActivity::class.java)
+ context.startActivity(intent)
}
- findViewById(R.id.tv_change_phone).setOnClickListener(v -> {
- VerifyPhoneActivity.start(ShowBindPhoneActivity.this, false);
- finish();
- }
- );
}
- @Override
- protected boolean needSteepStateBar() {
- return true;
+ @SuppressLint("SetTextI18n")
+ override fun init() {
+ initWhiteTitleBar(getString(R.string.text_bind_phone))
+ val userInfo = UserModel.get().cacheLoginUserInfo
+ if (userInfo != null && !TextUtils.isEmpty(userInfo.phone)) {
+ binding.tvPhone.text = "+${userInfo.phoneAreaCode} ${userInfo.phone}"
+ }
+ binding.tvChangePhone.setOnClickListener { v: View? ->
+ VerifyPhoneActivity.start(this@ShowBindPhoneActivity, false)
+ finish()
+ }
}
- @Override
- protected void setStatusBar() {
- super.setStatusBar();
- StatusBarUtil.transparencyBar(this);
- StatusBarUtil.StatusBarLightMode(this);
+ override fun needSteepStateBar(): Boolean {
+ return true
}
-}
+
+ override fun setStatusBar() {
+ super.setStatusBar()
+ StatusBarUtil.transparencyBar(this)
+ StatusBarUtil.StatusBarLightMode(this)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/ui/login/bean/CountryBean.java b/app/src/main/java/com/yizhuan/erban/ui/login/bean/CountryBean.java
new file mode 100644
index 000000000..3cf9b8d6a
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/ui/login/bean/CountryBean.java
@@ -0,0 +1,15 @@
+package com.yizhuan.erban.ui.login.bean;
+
+import lombok.Data;
+
+@Data
+public class CountryBean {
+ public String name;
+ public String code;
+
+ public CountryBean(String name, String code) {
+ this.name = name;
+ this.code = code;
+ }
+
+}
diff --git a/app/src/main/java/com/yizhuan/erban/ui/setting/ModifyPwdActivity.java b/app/src/main/java/com/yizhuan/erban/ui/setting/ModifyPwdActivity.java
index 029ed8e84..202eae5f2 100644
--- a/app/src/main/java/com/yizhuan/erban/ui/setting/ModifyPwdActivity.java
+++ b/app/src/main/java/com/yizhuan/erban/ui/setting/ModifyPwdActivity.java
@@ -179,9 +179,14 @@ public class ModifyPwdActivity extends BaseBindingActivity {
-
- });
+ if (type == PAY_PWD) {
+ VerifyPhoneActivity.startForResult(this, true);
+ } else {
+ ResetPasswordActivity.start(context, ResetPasswordActivity.FROM_LOGIN);
+ }
+// getDialogManager().showOkCancelWithTitleDialog(getString(R.string.login_contact_service), "LINE:pekoyuyin", getString(R.string.button_ok), "", true, () -> {
+//
+// });
break;
}
}
diff --git a/app/src/main/java/com/yizhuan/erban/ui/setting/ResetPasswordActivity.kt b/app/src/main/java/com/yizhuan/erban/ui/setting/ResetPasswordActivity.kt
index c11a0bfc1..8fdd1629d 100644
--- a/app/src/main/java/com/yizhuan/erban/ui/setting/ResetPasswordActivity.kt
+++ b/app/src/main/java/com/yizhuan/erban/ui/setting/ResetPasswordActivity.kt
@@ -1,189 +1,213 @@
-package com.yizhuan.erban.ui.setting;
+package com.yizhuan.erban.ui.setting
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.content.Intent;
-import android.text.Editable;
-import android.text.TextUtils;
-import android.text.TextWatcher;
-import android.view.View;
+import android.annotation.SuppressLint
+import android.content.Context
+import android.content.Intent
+import android.os.CountDownTimer
+import android.text.Editable
+import android.text.TextUtils
+import android.text.TextWatcher
+import android.view.View
+import androidx.core.content.ContextCompat
+import com.coorchice.library.utils.LogUtils
+import com.netease.nim.uikit.StatusBarUtil
+import com.trello.rxlifecycle3.android.ActivityEvent
+import com.yizhuan.erban.R
+import com.yizhuan.erban.base.BaseViewBindingActivity
+import com.yizhuan.erban.databinding.ActivityResetLoginPwdBinding
+import com.yizhuan.erban.ui.login.AreaCodeActivity
+import com.yizhuan.erban.ui.login.BindPhoneActivity
+import com.yizhuan.erban.ui.login.CodeDownTimer
+import com.yizhuan.erban.ui.login.helper.LogoutHelper
+import com.yizhuan.erban.ui.setting.ResetPasswordActivity
+import com.yizhuan.xchat_android_core.auth.AuthModel
+import com.yizhuan.xchat_android_core.code.CodeType
+import com.yizhuan.xchat_android_core.user.UserModel
+import com.yizhuan.xchat_android_library.utils.ResUtil
+import com.yizhuan.xchat_android_library.utils.TextWatcherWrapper
+import io.reactivex.SingleObserver
+import io.reactivex.android.schedulers.AndroidSchedulers
+import io.reactivex.disposables.Disposable
-import com.coorchice.library.utils.LogUtils;
-import com.netease.nim.uikit.StatusBarUtil;
-import com.trello.rxlifecycle3.android.ActivityEvent;
-import com.yizhuan.erban.R;
-import com.yizhuan.erban.base.BaseBindingActivity;
-import com.yizhuan.erban.databinding.ActivityResetLoginPwdBinding;
-import com.yizhuan.erban.ui.login.CodeDownTimer;
-import com.yizhuan.erban.ui.login.helper.LogoutHelper;
-import com.yizhuan.xchat_android_core.auth.AuthModel;
-import com.yizhuan.xchat_android_core.code.CodeType;
-import com.yizhuan.xchat_android_core.user.UserModel;
-import com.yizhuan.xchat_android_library.annatation.ActLayoutRes;
-import com.yizhuan.xchat_android_library.utils.ResUtil;
-import com.yizhuan.xchat_android_library.utils.TextWatcherWrapper;
-
-import io.reactivex.SingleObserver;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.Disposable;
-
-@ActLayoutRes(R.layout.activity_reset_login_pwd)
-public class ResetPasswordActivity extends BaseBindingActivity {
- public static final int FROM_NOT_LOGIN = 1;
- public static final int FROM_LOGIN = 2;
-
-
- private int from;
-
- private CodeDownTimer timer;
-
- private final TextWatcher textWatcher = new TextWatcherWrapper() {
- @Override
- public void afterTextChanged(Editable s) {
- checkInput();
+class ResetPasswordActivity : BaseViewBindingActivity(),
+ View.OnClickListener {
+ private var from = 0
+ private var cdt: CountDownTimer? = null
+ private val textWatcher: TextWatcher = object : TextWatcherWrapper() {
+ override fun afterTextChanged(s: Editable) {
+ checkInput()
}
- };
-
- public static void start(Context context, int type) {
- Intent intent = new Intent(context, ResetPasswordActivity.class);
- intent.putExtra("from", type);
- context.startActivity(intent);
}
- @Override
- protected void init() {
- from = getIntent().getIntExtra("from", FROM_LOGIN);
- mBinding.setClick(this);
- initWhiteTitleBar(ResUtil.getString(R.string.ui_setting_resetpasswordactivity_01));
+ companion object {
+ const val FROM_NOT_LOGIN = 1
+ const val FROM_LOGIN = 2
- if (from == FROM_LOGIN) {
- if (UserModel.get().getCacheLoginUserInfo() != null) {
- mBinding.etPhone.setText(UserModel.get().getCacheLoginUserInfo().getPhone());
+ @JvmStatic
+ fun start(context: Context, type: Int) {
+ val intent = Intent(context, ResetPasswordActivity::class.java)
+ intent.putExtra("from", type)
+ context.startActivity(intent)
+ }
+ }
+
+ override fun init() {
+ from = intent.getIntExtra("from", FROM_LOGIN)
+ initWhiteTitleBar(ResUtil.getString(R.string.ui_setting_resetpasswordactivity_01))
+// if (from == FROM_LOGIN) {
+// if (UserModel.get().cacheLoginUserInfo != null) {
+// binding.etAccount.setText(UserModel.get().cacheLoginUserInfo!!.phone)
+// }
+// binding.etAccount.isEnabled = false
+// }
+ initListener()
+ }
+
+ private fun initListener() {
+ binding.tvAreaCode.setOnClickListener(this)
+ binding.tvGetCode.setOnClickListener(this)
+ binding.btnCommit.setOnClickListener(this)
+
+ binding.etAccount.addTextChangedListener(textWatcher)
+ binding.etPassword.editText.addTextChangedListener(textWatcher)
+ binding.etCode.addTextChangedListener(textWatcher)
+ }
+
+ private fun checkInput() {
+ val enabled =
+ !TextUtils.isEmpty(binding.etAccount.text) && binding.etAccount.text.toString()
+ .trim { it <= ' ' }.length >= 7 && !TextUtils.isEmpty(binding.etPassword.text) && binding.etPassword.text.trim { it <= ' ' }.length >= 6 && !TextUtils.isEmpty(
+ binding.etCode.text
+ ) && binding.etCode.text.toString().trim { it <= ' ' }.length >= 5
+ binding.btnCommit.isEnabled = enabled
+ }
+
+ override fun onClick(v: View) {
+ when (v.id) {
+ R.id.tv_area_code -> {
+ AreaCodeActivity.startForResult(this, BindPhoneActivity.REQUEST_AREA_CODE)
}
- mBinding.etPhone.setEnabled(false);
- }
- mBinding.etPhone.addTextChangedListener(textWatcher);
- mBinding.edPassword.getEditText().addTextChangedListener(textWatcher);
- mBinding.etCode.addTextChangedListener(textWatcher);
- }
-
- private void checkInput() {
- boolean enabled = !TextUtils.isEmpty(mBinding.etPhone.getText()) && mBinding.etPhone.getText().toString().trim().length() >= 7
- && !TextUtils.isEmpty(mBinding.edPassword.getText()) && mBinding.edPassword.getText().trim().length() >= 6
- && !TextUtils.isEmpty(mBinding.etCode.getText()) && mBinding.etCode.getText().toString().trim().length() >= 5;
- mBinding.btnCommit.setEnabled(enabled);
- }
-
-
- @Override
- public void onClick(View v) {
- super.onClick(v);
- switch (v.getId()) {
- case R.id.btn_commit:
- commit();
- break;
- case R.id.btn_get_code:
- if (TextUtils.isEmpty(mBinding.etPhone.getText())) {
- toast(ResUtil.getString(R.string.ui_setting_resetpasswordactivity_02));
- return;
- }
- mBinding.btnGetCode.setClickable(false);
+ R.id.tv_get_code -> {
+ dialogManager.showProgressDialog(this)
AuthModel.get()
- .sendLoginCode(mBinding.etPhone.getText().toString().trim(), from == FROM_LOGIN ?
- CodeType.RESET_PSW_LOGIN : CodeType.RESET_PSW_NOT_LOGIN)
- .observeOn(AndroidSchedulers.mainThread())
- .compose(bindUntilEvent(ActivityEvent.DESTROY))
- .subscribe(new SingleObserver() {
- @Override
- public void onSubscribe(Disposable d) {
+ .getSmsCode(
+ binding.tvAreaCode.text.toString().substring(1),
+ binding.tvAreaCode.text.toString()
+ .substring(1) + binding.etAccount.text.toString(),
+ if (from == FROM_LOGIN) CodeType.RESET_PSW_LOGIN else CodeType.RESET_PSW_NOT_LOGIN
+ )
+ .observeOn(AndroidSchedulers.mainThread())
+ .compose(bindUntilEvent(ActivityEvent.DESTROY))
+ .subscribe(object : SingleObserver {
+ override fun onSubscribe(d: Disposable) {}
+ override fun onSuccess(t: String) {
+ dialogManager.dismissDialog()
+ startCounter()
+ }
- }
+ override fun onError(e: Throwable) {
+ dialogManager.dismissDialog()
+ toast(e.message)
+ LogUtils.e(ResUtil.getString(R.string.ui_setting_resetpasswordactivity_03))
+ }
- @Override
- public void onSuccess(String s) {
- startCountDownTimer();
- }
-
- @Override
- public void onError(Throwable e) {
- mBinding.btnGetCode.setClickable(true);
- LogUtils.e(ResUtil.getString(R.string.ui_setting_resetpasswordactivity_03));
- }
- });
- break;
+ })
+ }
+ R.id.btn_commit -> commit()
}
}
- private void startCountDownTimer() {
- stopCountDownTimer();
- timer = new CodeDownTimer(mBinding.btnGetCode, 60000, 1000);
- timer.start();
+ override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+ super.onActivityResult(requestCode, resultCode, data)
+ if (requestCode == BindPhoneActivity.REQUEST_AREA_CODE && resultCode == RESULT_OK) {
+ val areaCode = data?.getStringExtra(AreaCodeActivity.COUNTRY_NUMBER)
+ if (areaCode != null) {
+ binding.tvAreaCode.text = areaCode
+ }
+ }
}
- private void stopCountDownTimer() {
- if (timer != null) {
- timer.cancel();
- timer = null;
+ private fun startCounter() {
+ stopCounter()
+ //开始倒计时 60s 间隔1s
+ binding.tvGetCode.isEnabled = false
+ binding.tvGetCode.setTextColor(ContextCompat.getColor(this, R.color.color_9168FA))
+ cdt = object : CountDownTimer(60 * 1000, 100) {
+ override fun onTick(text: Long) {
+ showTextDown(text)
+ }
+
+ override fun onFinish() {
+ resetBtn()
+ }
}
+ cdt?.start()
+ }
+
+ private fun showTextDown(text: Long) {
+ val time = (text / 1000).toString() + "s"
+ binding.tvGetCode.text = time
+ }
+
+ private fun stopCounter() {
+ cdt?.cancel()
+ cdt = null
+ }
+
+ private fun resetBtn() {
+ stopCounter()
+ binding.tvGetCode.setTextColor(ContextCompat.getColor(this, R.color.text_title_color))
+ binding.tvGetCode.isEnabled = true
+ binding.tvGetCode.text = getString(R.string.text_request_code)
}
@SuppressLint("CheckResult")
- private void commit() {
- if (TextUtils.isEmpty(mBinding.etPhone.getText())) {
- toast(ResUtil.getString(R.string.ui_setting_resetpasswordactivity_04));
- return;
- }
- if (TextUtils.isEmpty(mBinding.edPassword.getText())) {
- toast(ResUtil.getString(R.string.ui_setting_resetpasswordactivity_05));
- return;
- }
- if (TextUtils.isEmpty(mBinding.etCode.getText())) {
- toast(ResUtil.getString(R.string.ui_setting_resetpasswordactivity_06));
- return;
- }
-
- getDialogManager().showProgressDialog(ResetPasswordActivity.this, ResUtil.getString(R.string.ui_setting_resetpasswordactivity_07));
+ private fun commit() {
+ dialogManager.showProgressDialog(
+ this@ResetPasswordActivity,
+ ResUtil.getString(R.string.ui_setting_resetpasswordactivity_07)
+ )
AuthModel.get().requestResetPsw(
- mBinding.etPhone.getText().toString().trim(),
- mBinding.etCode.getText().toString().trim(),
- mBinding.edPassword.getText().trim())
- .compose(bindToLifecycle())
- .subscribe(new SingleObserver() {
- @Override
- public void onSubscribe(Disposable d) {
+ binding.tvAreaCode.text.toString().substring(1) + binding.etAccount.text.toString()
+ .trim { it <= ' ' },
+ binding.etCode.text.toString().trim { it <= ' ' },
+ binding.etPassword.text.trim { it <= ' ' })
+ .compose(bindToLifecycle())
+ .subscribe(object : SingleObserver {
+ override fun onSubscribe(d: Disposable) {}
+ override fun onSuccess(t: String) {
+ dialogManager.dismissDialog()
+ UserModel.get().updateCurrentUserInfo().subscribe()
+ toast(ResUtil.getString(R.string.ui_setting_resetpasswordactivity_08))
+ if (from == FROM_LOGIN) {
+ LogoutHelper.logout()
}
+ finish()
+ }
- @Override
- public void onSuccess(String s) {
- getDialogManager().dismissDialog();
- UserModel.get().updateCurrentUserInfo().subscribe();
- toast(ResUtil.getString(R.string.ui_setting_resetpasswordactivity_08));
- if (from == FROM_LOGIN) {
- LogoutHelper.logout();
- }
- finish();
- }
-
- @Override
- public void onError(Throwable e) {
- getDialogManager().dismissDialog();
- toast(e.getMessage());
- }
- });
+ override fun onError(e: Throwable) {
+ dialogManager.dismissDialog()
+ toast(e.message)
+ }
+ })
}
- @Override
- protected boolean needSteepStateBar() {
- return true;
+ override fun needSteepStateBar(): Boolean {
+ return true
}
- @Override
- protected void setStatusBar() {
- super.setStatusBar();
- StatusBarUtil.transparencyBar(this);
- StatusBarUtil.StatusBarLightMode(this);
- StatusBarUtil.StatusBarLightMode(this);
+ override fun setStatusBar() {
+ super.setStatusBar()
+ StatusBarUtil.transparencyBar(this)
+ StatusBarUtil.StatusBarLightMode(this)
}
-}
+
+ override fun onDestroy() {
+ super.onDestroy()
+ dialogManager.dismissDialog()
+ stopCounter()
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/ui/setting/SettingActivity.java b/app/src/main/java/com/yizhuan/erban/ui/setting/SettingActivity.java
index 6a95d9b9c..94ea521a0 100644
--- a/app/src/main/java/com/yizhuan/erban/ui/setting/SettingActivity.java
+++ b/app/src/main/java/com/yizhuan/erban/ui/setting/SettingActivity.java
@@ -17,6 +17,8 @@ import com.yizhuan.erban.base.BaseActivity;
import com.yizhuan.erban.common.widget.dialog.DialogManager;
import com.yizhuan.erban.databinding.ActivitySettingBinding;
import com.yizhuan.erban.ui.im.avtivity.BlackListManageActivity;
+import com.yizhuan.erban.ui.login.BindPhoneActivity;
+import com.yizhuan.erban.ui.login.ShowBindPhoneActivity;
import com.yizhuan.erban.ui.login.helper.LogoutHelper;
import com.yizhuan.erban.ui.user.AboutActivity;
import com.yizhuan.erban.ui.webview.CommonWebViewActivity;
@@ -36,6 +38,8 @@ import org.greenrobot.eventbus.ThreadMode;
import java.io.File;
+import lombok.val;
+
/**
* Created by zhouxiangfeng on 2017/4/16.
*/
@@ -79,6 +83,14 @@ public class SettingActivity extends BaseActivity implements View.OnClickListene
@Override
public void onClick(View view) {
switch (view.getId()) {
+ case R.id.rly_bind_phone:
+ UserInfo userInfo = UserModel.get().getCacheLoginUserInfo();
+ if(userInfo != null && userInfo.isBindPhone()){
+ ShowBindPhoneActivity.start(context);
+ }else {
+ BindPhoneActivity.start(this);
+ }
+ break;
case R.id.rly_contact_us:
UIHelper.openContactUs(this);
break;
diff --git a/app/src/main/java/com/yizhuan/erban/ui/setting/VerifyPhoneActivity.kt b/app/src/main/java/com/yizhuan/erban/ui/setting/VerifyPhoneActivity.kt
index dbff4194c..b50c471ce 100644
--- a/app/src/main/java/com/yizhuan/erban/ui/setting/VerifyPhoneActivity.kt
+++ b/app/src/main/java/com/yizhuan/erban/ui/setting/VerifyPhoneActivity.kt
@@ -1,273 +1,262 @@
-package com.yizhuan.erban.ui.setting;
+package com.yizhuan.erban.ui.setting
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.text.TextUtils;
-import android.view.View;
+import android.annotation.SuppressLint
+import android.app.Activity
+import android.content.Context
+import android.content.Intent
+import android.os.CountDownTimer
+import android.text.Editable
+import android.text.TextUtils
+import android.text.TextWatcher
+import android.view.View
+import androidx.core.content.ContextCompat
+import com.netease.nim.uikit.StatusBarUtil
+import com.trello.rxlifecycle3.android.ActivityEvent
+import com.yizhuan.erban.R
+import com.yizhuan.erban.base.BaseViewBindingActivity
+import com.yizhuan.erban.databinding.ActivityVerifyPhoneBinding
+import com.yizhuan.erban.ui.login.AreaCodeActivity
+import com.yizhuan.erban.ui.login.BindPhoneActivity
+import com.yizhuan.xchat_android_core.auth.AuthModel
+import com.yizhuan.xchat_android_core.code.CodeType
+import com.yizhuan.xchat_android_core.pay.PayModel
+import com.yizhuan.xchat_android_core.user.UserModel
+import com.yizhuan.xchat_android_core.user.bean.UserInfo
+import com.yizhuan.xchat_android_core.utils.net.BeanObserver
+import com.yizhuan.xchat_android_library.utils.ResUtil
-import com.netease.nim.uikit.StatusBarUtil;
-import com.yizhuan.erban.R;
-import com.yizhuan.erban.base.BaseBindingActivity;
-import com.yizhuan.erban.databinding.ActivityVerifyPhoneBinding;
-import com.yizhuan.erban.ui.login.BindSuccessDialog;
-import com.yizhuan.erban.ui.login.CodeDownTimer;
-import com.yizhuan.xchat_android_core.auth.AuthModel;
-import com.yizhuan.xchat_android_core.bean.response.ServiceResult;
-import com.yizhuan.xchat_android_core.code.CodeType;
-import com.yizhuan.xchat_android_core.pay.PayModel;
-import com.yizhuan.xchat_android_core.user.UserModel;
-import com.yizhuan.xchat_android_core.utils.net.BeanObserver;
-import com.yizhuan.xchat_android_library.annatation.ActLayoutRes;
-import com.yizhuan.xchat_android_library.utils.ResUtil;
+class VerifyPhoneActivity : BaseViewBindingActivity(),
+ View.OnClickListener, TextWatcher {
+ private var resetPwd = false
+ private var isForgetPwd = false
+ private var cdt: CountDownTimer? = null
+ private var type = CodeType.UNBIND_PHONE
-import io.reactivex.Single;
-import io.reactivex.SingleObserver;
-import io.reactivex.SingleSource;
-import io.reactivex.disposables.Disposable;
-import io.reactivex.functions.Action;
-import io.reactivex.functions.Consumer;
-import io.reactivex.functions.Function;
+ private var isVerify = false
+ companion object {
+ const val REQUEST_CHECK_VALID_PHONE = 1001
-@ActLayoutRes(R.layout.activity_verify_phone)
-public class VerifyPhoneActivity extends BaseBindingActivity implements View.OnClickListener,
- BindSuccessDialog.BindSuccessDialogListener {
-
- public static final int REQUEST_CHECK_VALID_PHONE = 1001;
-
- private boolean isVerify;
- private boolean resetPwd;
- private boolean isForgetPwd;
- private CodeDownTimer timer;
- private int type = CodeType.UNBIND_PHONE;
-
- public static void start(Context context, boolean resetPwd) {
- Intent intent = new Intent(context, VerifyPhoneActivity.class);
- intent.putExtra("resetPwd", resetPwd);
- context.startActivity(intent);
- }
-
- public static void startForResult(Activity context, boolean isForgetPwd) {
- Intent intent = new Intent(context, VerifyPhoneActivity.class);
- intent.putExtra("isForgetPwd", isForgetPwd);
- context.startActivityForResult(intent, REQUEST_CHECK_VALID_PHONE);
- }
-
- @Override
- protected void init() {
- initWhiteTitleBar(ResUtil.getString(R.string.ui_setting_verifyphoneactivity_01));
- isForgetPwd = getIntent().getBooleanExtra("isForgetPwd", false);
- resetPwd = getIntent().getBooleanExtra("resetPwd", false);
- if (UserModel.get().getCacheLoginUserInfo() != null
- && !TextUtils.isEmpty(UserModel.get().getCacheLoginUserInfo().getPhone())) {
- mBinding.etPhone.setText(UserModel.get().getCacheLoginUserInfo().getPhone());
- mBinding.etPhone.setEnabled(false);
+ @JvmStatic
+ fun start(context: Context, resetPwd: Boolean) {
+ val intent = Intent(context, VerifyPhoneActivity::class.java)
+ intent.putExtra("resetPwd", resetPwd)
+ context.startActivity(intent)
}
- mBinding.btnGetCode.setOnClickListener(this);
- mBinding.btnRegist.setOnClickListener(this);
- mBinding.ivCodeDelete.setOnClickListener(this);
+ @JvmStatic
+ fun startForResult(context: Activity, isForgetPwd: Boolean) {
+ val intent = Intent(context, VerifyPhoneActivity::class.java)
+ intent.putExtra("isForgetPwd", isForgetPwd)
+ context.startActivityForResult(intent, REQUEST_CHECK_VALID_PHONE)
+ }
+ }
+
+ override fun init() {
+ initWhiteTitleBar(ResUtil.getString(R.string.ui_setting_verifyphoneactivity_01))
+ isForgetPwd = intent.getBooleanExtra("isForgetPwd", false)
+ resetPwd = intent.getBooleanExtra("resetPwd", false)
+
+ initListener()
+ }
+
+ private fun initListener() {
+ binding.tvAreaCode.setOnClickListener(this)
+ binding.tvGetCode.setOnClickListener(this)
+ binding.btnNext.setOnClickListener(this)
+ binding.etAccount.addTextChangedListener(this)
+ binding.etCode.addTextChangedListener(this)
+ }
+
+ override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
+
+ }
+
+ override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
+
+ }
+
+ override fun afterTextChanged(p0: Editable?) {
+ binding.btnNext.isEnabled = !TextUtils.isEmpty(binding.etAccount.text.toString()) &&
+ !TextUtils.isEmpty(binding.etCode.text.toString())
}
@SuppressLint("CheckResult")
- private void getCode() {
- if (isForgetPwd) {
- type = CodeType.RESET_PAY_PSW;
+ override fun onClick(v: View) {
+ when (v.id) {
+ R.id.tv_area_code -> {
+ AreaCodeActivity.startForResult(this, BindPhoneActivity.REQUEST_AREA_CODE)
+ }
+ R.id.tv_get_code -> {
+ if (isForgetPwd) {
+ type = CodeType.RESET_PAY_PSW
+ }
+ AuthModel.get()
+ .getSmsCode(
+ binding.tvAreaCode.text.toString().substring(1),
+ binding.tvAreaCode.text.toString()
+ .substring(1) + binding.etAccount.text.toString(),
+ type
+ )
+ .compose(bindToLifecycle())
+ .doOnError { throwable -> toast(throwable.message) }
+ .doOnSubscribe {
+ dialogManager.showProgressDialog(
+ this@VerifyPhoneActivity,
+ ResUtil.getString(R.string.ui_setting_verifyphoneactivity_02)
+ )
+ }
+ .doAfterTerminate { dialogManager.dismissDialog() }
+ .subscribe { s: String?, throwable: Throwable? ->
+ if (throwable != null) {
+ return@subscribe
+ }
+ toast(ResUtil.getString(R.string.ui_setting_verifyphoneactivity_03))
+ startCounter()
+ }
+ }
+ R.id.btn_next -> {
+ clickNextButton()
+ }
}
- AuthModel.get()
- .sendLoginCode(mBinding.etPhone.getText().toString(), type)
- .compose(bindToLifecycle())
- .doOnError(new Consumer() {
- @Override
- public void accept(Throwable throwable) throws Exception {
- toast(throwable.getMessage());
- }
- })
- .doOnSubscribe(new Consumer() {
- @Override
- public void accept(Disposable disposable) throws Exception {
- getDialogManager().showProgressDialog(VerifyPhoneActivity.this, ResUtil.getString(R.string.ui_setting_verifyphoneactivity_02));
- }
- })
- .doAfterTerminate(new Action() {
- @Override
- public void run() throws Exception {
- getDialogManager().dismissDialog();
- }
- })
- .subscribe((s, throwable) -> {
- if (throwable != null) {
- return;
- }
- toast(ResUtil.getString(R.string.ui_setting_verifyphoneactivity_03));
- startCountDownTimer();
- });
-
}
- private void clickRegistButton() {
- if (TextUtils.isEmpty(mBinding.etPhone.getText().toString())) {
- toast(ResUtil.getString(R.string.ui_setting_verifyphoneactivity_04));
- return;
- }
- if (TextUtils.isEmpty(mBinding.etCode.getText().toString())) {
- toast(ResUtil.getString(R.string.ui_setting_verifyphoneactivity_05));
- return;
- }
+ private fun clickNextButton() {
if (isVerify) {
- getDialogManager().showProgressDialog(this, ResUtil.getString(R.string.ui_setting_verifyphoneactivity_06));
- PayModel.get().bindPhone(
- AuthModel.get().getCurrentUid() + "",
- mBinding.etPhone.getText().toString(),
- mBinding.etCode.getText().toString(),
- AuthModel.get().getTicket()
+ dialogManager.showProgressDialog(
+ this,
+ ResUtil.getString(R.string.ui_login_bindcodeactivity_02)
)
- .compose(bindToLifecycle())
- .flatMap(new Function, SingleSource>() {
- @Override
- public SingleSource apply(ServiceResult stringServiceResult) throws Exception {
- if (stringServiceResult.isSuccess()) {
- return Single.just(ResUtil.getString(R.string.ui_setting_verifyphoneactivity_07));
- } else {
- return Single.error(new Throwable(stringServiceResult.getMessage()));
- }
- }
- })
- .subscribe(new SingleObserver() {
- @Override
- public void onSubscribe(Disposable d) {
-
- }
-
- @Override
- public void onSuccess(String s) {
- getDialogManager().dismissDialog();
- bindSuccessDialog();
- }
-
- @Override
- public void onError(Throwable e) {
- getDialogManager().dismissDialog();
- toast(e.getMessage());
- }
- });
+ AuthModel.get().bindPhone(
+ binding.tvAreaCode.text.toString().substring(1),
+ binding.tvAreaCode.text.toString()
+ .substring(1) + binding.etAccount.text.toString(),
+ binding.etCode.text.toString()
+ )
+ .compose(bindUntilEvent(ActivityEvent.DESTROY))
+ .doOnSuccess { s: String? ->
+ toast(ResUtil.getString(R.string.ui_login_bindcodeactivity_03))
+ setResult(RESULT_OK)
+ }
+ .doOnError { throwable: Throwable ->
+ toast(
+ throwable.message
+ )
+ }
+ .flatMap { s: String? ->
+ UserModel.get().updateCurrentUserInfo()
+ }
+ .doOnSuccess { s: UserInfo? ->
+ setResult(RESULT_OK)
+ finish()
+ }
+ .doFinally { dialogManager.dismissDialog() }
+ .subscribe()
} else {
- getDialogManager().showProgressDialog(this, ResUtil.getString(R.string.ui_setting_verifyphoneactivity_08));
- PayModel.get().verifyCode(
- mBinding.etPhone.getText().toString(),
- mBinding.etCode.getText().toString()
+ dialogManager.showProgressDialog(
+ this,
+ ResUtil.getString(R.string.ui_setting_verifyphoneactivity_08)
)
- .compose(bindToLifecycle())
- .subscribe(new BeanObserver() {
- @Override
- public void onErrorMsg(String error) {
- getDialogManager().dismissDialog();
- toast(error);
+ PayModel.get().verifyCode(
+ binding.tvAreaCode.text.toString().substring(1),
+ binding.tvAreaCode.text.toString()
+ .substring(1) + binding.etAccount.text.toString(),
+ binding.etCode.text.toString(),
+ )
+ .compose(bindToLifecycle())
+ .subscribe(object : BeanObserver() {
+ override fun onErrorMsg(error: String) {
+ dialogManager.dismissDialog()
+ toast(error)
+ }
+
+ override fun onSuccess(s: String) {
+ dialogManager.dismissDialog()
+ type = CodeType.BIND_PHONE
+ if (resetPwd) {
+ ModifyPwdActivity.start(
+ this@VerifyPhoneActivity,
+ ModifyPwdActivity.RESET_PAY_PWD
+ )
+ finish()
+ } else if (isForgetPwd) {
+ setResult(RESULT_OK)
+ finish()
+ } else {
+ showModifyView()
}
-
- @Override
- public void onSuccess(String s) {
- getDialogManager().dismissDialog();
- type = CodeType.BIND_PHONE;
- if (resetPwd) {
- ModifyPwdActivity.start(VerifyPhoneActivity.this, ModifyPwdActivity.RESET_PAY_PWD);
- finish();
- } else if (isForgetPwd) {
- setResult(RESULT_OK);
- finish();
- } else {
- showModifyView();
- }
- }
- });
- }
-
- }
-
- private void showModifyView() {
- isVerify = true;
- initWhiteTitleBar(ResUtil.getString(R.string.ui_setting_verifyphoneactivity_09));
-
- if (timer != null) {
- timer.cancel();
- }
-
- mBinding.text.setVisibility(View.GONE);
-
- mBinding.btnGetCode.setText(ResUtil.getString(R.string.ui_setting_verifyphoneactivity_010));
- mBinding.btnGetCode.setClickable(true);//重新获得点击
-
- mBinding.btnRegist.setText(ResUtil.getString(R.string.ui_setting_verifyphoneactivity_011));
- mBinding.etPhone.setText("");
- mBinding.etPhone.setEnabled(true);
- mBinding.etPhone.requestFocus();
- mBinding.etCode.setText("");
-
- mBinding.vsPhoneCountry.getViewStub().inflate();
- mBinding.vDividerOne.setVisibility(View.VISIBLE);
-
- }
-
- private void bindSuccessDialog() {
- BindSuccessDialog dialog = new BindSuccessDialog();
- dialog.setmListener(this);
- dialog.show(getSupportFragmentManager(), "bindSuccess");
- }
-
- @Override
- public void onClick(View v) {
- super.onClick(v);
-
- switch (v.getId()) {
- case R.id.iv_code_delete:
- mBinding.etCode.setText("");
- break;
-
- case R.id.btn_regist:
- clickRegistButton();
- break;
-
- case R.id.btn_get_code:
- getCode();
- break;
+ }
+ })
}
}
- @Override
- protected void onDestroy() {
- super.onDestroy();
- stopCountDownTimer();
+ private fun showModifyView() {
+ isVerify = true
+ initWhiteTitleBar(ResUtil.getString(R.string.text_bind_phone))
+ binding.etAccount.setText("")
+ binding.etCode.setText("")
+ resetBtn()
+ binding.btnNext.text = ResUtil.getString(R.string.ui_setting_verifyphoneactivity_011)
}
- @Override
- public void close() {
- finish();
- }
-
- private void startCountDownTimer() {
- stopCountDownTimer();
- timer = new CodeDownTimer(mBinding.btnGetCode, 60000, 1000);
- timer.start();
- }
-
- private void stopCountDownTimer() {
- if (timer != null) {
- timer.cancel();
- timer = null;
+ override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+ super.onActivityResult(requestCode, resultCode, data)
+ if (requestCode == BindPhoneActivity.REQUEST_AREA_CODE && resultCode == RESULT_OK) {
+ val areaCode = data?.getStringExtra(AreaCodeActivity.COUNTRY_NUMBER)
+ if (areaCode != null) {
+ binding.tvAreaCode.text = areaCode
+ }
}
}
- @Override
- protected boolean needSteepStateBar() {
- return true;
+ private fun startCounter() {
+ stopCounter()
+ //开始倒计时 60s 间隔1s
+ binding.tvGetCode.isEnabled = false
+ binding.tvGetCode.setTextColor(ContextCompat.getColor(this, R.color.color_9168FA))
+ cdt = object : CountDownTimer(60 * 1000, 100) {
+ override fun onTick(text: Long) {
+ showTextDown(text)
+ }
+
+ override fun onFinish() {
+ resetBtn()
+ }
+ }
+ cdt?.start()
}
- @Override
- protected void setStatusBar() {
- super.setStatusBar();
- StatusBarUtil.transparencyBar(this);
- StatusBarUtil.StatusBarLightMode(this);
+ private fun showTextDown(text: Long) {
+ val time = (text / 1000).toString() + "s"
+ binding.tvGetCode.text = time
}
-}
+
+ private fun stopCounter() {
+ cdt?.cancel()
+ cdt = null
+ }
+
+ private fun resetBtn() {
+ stopCounter()
+ binding.tvGetCode.setTextColor(ContextCompat.getColor(this, R.color.text_title_color))
+ binding.tvGetCode.isEnabled = true
+ binding.tvGetCode.text = getString(R.string.text_request_code)
+ }
+
+ override fun needSteepStateBar(): Boolean {
+ return true
+ }
+
+ override fun setStatusBar() {
+ super.setStatusBar()
+ StatusBarUtil.transparencyBar(this)
+ StatusBarUtil.StatusBarLightMode(this)
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ dialogManager.dismissDialog()
+ stopCounter()
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-xhdpi/icon_show_bind_phone.webp b/app/src/main/res/drawable-xhdpi/icon_show_bind_phone.webp
index 5d0b5942708a86c6c9bd650a087b7f4590a2a59d..e91dd0a88acafd5979e48a8440e009cc745952d9 100644
GIT binary patch
literal 13502
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