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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 literal 7102 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 + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_authorization_code.xml b/app/src/main/res/layout/activity_authorization_code.xml new file mode 100644 index 000000000..0ad7f270f --- /dev/null +++ b/app/src/main/res/layout/activity_authorization_code.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + +