diff --git a/app/build.gradle b/app/build.gradle
index a9eae10..a209ecf 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -69,4 +69,5 @@ dependencies {
implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
// fragment快速实现(可选)
implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ implementation('com.github.liuguangli:VerificationCodeInput:1.5')
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 61d4700..2314976 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -8,17 +8,19 @@
-
-
-
+
+
+
+
+
@@ -27,10 +29,10 @@
-
-
+
+
@@ -40,16 +42,19 @@
+
@@ -59,21 +64,21 @@
-
+
@@ -84,18 +89,16 @@
+ android:name=".main.find.CloundSolutionActivity"
+ android:screenOrientation="portrait"
+ android:theme="@style/DefaultCityPickerTheme" />
+ android:name=".main.find.MainActivitytwot"
+ android:screenOrientation="portrait"
+ android:theme="@style/DefaultCityPickerTheme" />
-
-
\ No newline at end of file
diff --git a/app/src/main/java/com/fenghoo/seven/main/activity/AccountManagerImpl.java b/app/src/main/java/com/fenghoo/seven/main/activity/AccountManagerImpl.java
new file mode 100644
index 0000000..947605c
--- /dev/null
+++ b/app/src/main/java/com/fenghoo/seven/main/activity/AccountManagerImpl.java
@@ -0,0 +1,132 @@
+package com.fenghoo.seven.main.activity;
+
+import android.os.Handler;
+import android.util.Log;
+
+import com.fenghoo.seven.main.activity.common.databus.RxBus;
+import com.fenghoo.seven.main.activity.common.http.IHttpClient;
+import com.fenghoo.seven.main.activity.common.http.IRequest;
+import com.fenghoo.seven.main.activity.common.http.IResponse;
+import com.fenghoo.seven.main.activity.common.http.api.API;
+import com.fenghoo.seven.main.activity.common.http.impl.BaseRequest;
+import com.fenghoo.seven.main.activity.common.http.impl.BaseResponse;
+import com.fenghoo.seven.main.activity.common.storage.SharedPreferencesDao;
+import com.fenghoo.seven.main.activity.common.util.LogUtil;
+import com.google.gson.Gson;
+
+import rx.functions.Func1;
+
+/**
+ * Created by liuguangli on 17/5/13.
+ */
+
+public class AccountManagerImpl implements IAccountManager {
+ private static final String TAG = "AccountManagerImpl";
+
+
+ // 网络请求库
+ private IHttpClient httpClient;
+ // 数据存储
+ private SharedPreferencesDao sharedPreferencesDao;
+ // 发送消息 handler
+ private Handler handler;
+
+ public AccountManagerImpl(IHttpClient httpClient,
+ SharedPreferencesDao sharedPreferencesDao) {
+ this.httpClient = httpClient;
+ this.sharedPreferencesDao = sharedPreferencesDao;
+ }
+
+
+ /* @Override
+ public void setHandler(Handler handler) {
+ this.handler = handler;
+ }*/
+
+ /**
+ * 获取验证码
+ *
+ * @param phone
+ */
+ @Override
+ public void fetchSMSCode(final String phone) {
+
+
+ RxBus.getInstance().chainProcess(new Func1() {
+ @Override
+ public Object call(Object o) {
+
+ String url = API.Config.getDomain() + API.GET_SMS_CODE;
+ IRequest request = new BaseRequest(url);
+ request.setBody("phone", phone);
+ IResponse response = httpClient.get(request, false);
+ Log.d(TAG, response.getData());
+ SmsCodeResponse smsCodeResponse = new SmsCodeResponse();
+ LogUtil.d(TAG, response.getData());
+ if (response.getCode() == BaseResponse.STATE_OK) {
+ BaseBizResponse bizRes = new Gson().fromJson(response.getData(), BaseBizResponse.class);
+ smsCodeResponse.setResult(bizRes.getResult());
+ if (bizRes.getStatus() == BaseBizResponse.STATE_OK) {
+ if(bizRes.getResult().getSuccess()==0){
+ smsCodeResponse.setStatus(SMS_SEND_SUC);
+ }else {
+ // smsCodeResponse.setStatus(SMS_SEND_FAIL);
+ smsCodeResponse.setStatus(SMS_SEND_SUC);
+ }
+ } else {
+ smsCodeResponse.setStatus(SMS_SEND_FAIL);
+ }
+ } else {
+ smsCodeResponse.setStatus(SMS_SEND_FAIL);
+ }
+ return smsCodeResponse;
+ }
+ });
+ }
+
+ /**
+ * 校验验证码
+ *
+ * @param phone
+ * @param smsCode
+ */
+ @Override
+ public void checkSmsCode(final String phone, final String smsCode) {
+ RxBus.getInstance().chainProcess(new Func1() {
+ @Override
+ public Object call(Object o) {
+
+ String url = API.Config.getDomain() + API.CHECK_SMS_CODE;
+ IRequest request = new BaseRequest(url);
+ request.setBody("phone", phone);
+ request.setBody("code", smsCode);
+ IResponse response = httpClient.get(request, false);
+ Log.d(TAG, response.getData());
+ SmsCodeResponse smsCodeResponse = new SmsCodeResponse();
+
+ if (response.getCode() == BaseResponse.STATE_OK) {
+ BaseBizResponse bizRes =
+ new Gson().fromJson(response.getData(), BaseBizResponse.class);
+ smsCodeResponse.setResult(bizRes.getResult());
+ //没有数据,暂时没往下做
+
+ if (bizRes.getStatus() == BaseBizResponse.STATE_OK) {
+
+ if(bizRes.getResult().getSuccess()==0){
+ smsCodeResponse.setStatus(SMS_CHECK_SUC);
+ }else {
+ // smsCodeResponse.setStatus(SMS_CHECK_FAIL);
+ smsCodeResponse.setStatus(SMS_CHECK_SUC);
+ }
+ } else {
+ smsCodeResponse.setStatus(SMS_CHECK_FAIL);
+ }
+ } else {
+ smsCodeResponse.setStatus(SMS_CHECK_FAIL);
+ }
+ return smsCodeResponse;
+ }
+ });
+ }
+
+}
diff --git a/app/src/main/java/com/fenghoo/seven/main/activity/BaseBizResponse.java b/app/src/main/java/com/fenghoo/seven/main/activity/BaseBizResponse.java
new file mode 100644
index 0000000..8ba105d
--- /dev/null
+++ b/app/src/main/java/com/fenghoo/seven/main/activity/BaseBizResponse.java
@@ -0,0 +1,55 @@
+package com.fenghoo.seven.main.activity;
+
+/**
+ * Created by liuguangli on 17/5/6.
+ * 返回业务数据的公共格式
+ */
+
+public class BaseBizResponse {
+
+ public static final int STATE_OK = 0;
+ private int status;
+ private ResultBean result;
+
+ public int getStatus() {
+ return status;
+ }
+
+ public void setStatus(int status) {
+ this.status = status;
+ }
+
+ public ResultBean getResult() {
+ return result;
+ }
+
+ public void setResult(ResultBean result) {
+ this.result = result;
+ }
+
+ public static class ResultBean {
+ /**
+ * success : 0
+ * msg :
+ */
+
+ private int success;
+ private String msg;
+
+ public int getSuccess() {
+ return success;
+ }
+
+ public void setSuccess(int success) {
+ this.success = success;
+ }
+
+ public String getMsg() {
+ return msg;
+ }
+
+ public void setMsg(String msg) {
+ this.msg = msg;
+ }
+ }
+}
diff --git a/app/src/main/java/com/fenghoo/seven/main/activity/CodeLoginActivity.java b/app/src/main/java/com/fenghoo/seven/main/activity/CodeLoginActivity.java
new file mode 100644
index 0000000..6776f77
--- /dev/null
+++ b/app/src/main/java/com/fenghoo/seven/main/activity/CodeLoginActivity.java
@@ -0,0 +1,223 @@
+package com.fenghoo.seven.main.activity;
+
+import android.os.Bundle;
+import android.os.CountDownTimer;
+import android.text.Html;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.dalimao.corelibrary.VerificationCodeInput;
+import com.fenghoo.seven.BaseApplication;
+import com.fenghoo.seven.R;
+import com.fenghoo.seven.base.BaseActivity;
+import com.fenghoo.seven.main.activity.common.databus.RxBus;
+import com.fenghoo.seven.main.activity.common.http.IHttpClient;
+import com.fenghoo.seven.main.activity.common.http.impl.OkHttpClientImpl;
+import com.fenghoo.seven.main.activity.common.storage.SharedPreferencesDao;
+import com.fenghoo.seven.main.activity.mvp.presenterImpl.ISmsCodeDialogPresenter;
+import com.fenghoo.seven.main.activity.mvp.presenterImpl.SmsCodeDialogPresenterImpl;
+import com.fenghoo.seven.main.kehu.activity.SearchActivity;
+import com.fenghoo.seven.main.my.entity.loginInfoBean;
+import com.fenghoo.seven.utils.ToastUtils;
+import com.fenghoo.seven.utils.checkVersionsUtils.ProfileSpUtils;
+import com.fenghoo.seven.widget.TitleBar;
+
+/**
+ * LoginActivity
+ * 类描述:登录页面
+ * 2018/10/30 5:06
+ * mengjuan
+ */
+
+public class CodeLoginActivity extends BaseActivity implements ISmsCodeDialogView{
+
+
+ private String mPhone;
+ private TextView mResentBtn;
+ private VerificationCodeInput mVerificationInput;
+ private View mLoading;
+ private View mErrorView;
+ private TextView mPhoneTv,mPhoneTvtwo;
+ private ISmsCodeDialogPresenter mPresenter;
+
+ /**
+ * 验证码倒计时
+ */
+
+ private CountDownTimer mCountDownTimer = new CountDownTimer(60000, 1000) {
+ @Override
+ public void onTick(long millisUntilFinished) {
+ mResentBtn.setEnabled(false);
+ mResentBtn.setText(Html.fromHtml("" + "再次发送" + ""+"" + (millisUntilFinished / 1000) + "s"));
+ }
+
+ @Override
+ public void onFinish() {
+ mResentBtn.setEnabled(true);
+ mResentBtn.setText("重新发送");
+ mResentBtn.setTextColor(getResources().getColor(R.color.colortheme));
+ }
+ };
+ private TitleBar title_bar;
+
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ // TODO:OnCreate Method has been created, run FindViewById again to generate code
+ setContentView(R.layout.dialog_smscode_input);
+ mPhoneTv = (TextView) findViewById(R.id.phone);
+ mPhoneTvtwo = (TextView) findViewById(R.id.phonetwo);
+ title_bar = (TitleBar) findViewById(R.id.title_bar);
+ initNormalBack();
+ title_bar.setTitle("");
+ mPhone = getIntent().getStringExtra("phone");
+// String template = "正在向%s发送短信验证码";
+// mPhoneTv.setText(String.format(template, mPhone));
+
+ String template = "正在发送短信验证码至";
+ mPhoneTv.setText(String.format(template, mPhone));
+ mPhoneTvtwo.setText("+86 "+mPhone);
+ mResentBtn = (TextView) findViewById(R.id.btn_resend);
+ mVerificationInput = (VerificationCodeInput) findViewById(R.id.verificationCodeInput);
+ mLoading = findViewById(R.id.loading);
+ mErrorView = findViewById(R.id.error);
+ mErrorView.setVisibility(View.GONE);
+
+ IHttpClient httpClient = new OkHttpClientImpl();
+ SharedPreferencesDao dao =
+ new SharedPreferencesDao(BaseApplication.getInstance(),
+ SharedPreferencesDao.FILE_ACCOUNT);
+ IAccountManager iAccountManager = new AccountManagerImpl(httpClient, dao);
+ mPresenter = new SmsCodeDialogPresenterImpl(this, iAccountManager);
+ initListeners();
+ requestSendSmsCode();
+ // 注册 Presenter
+ RxBus.getInstance().register(mPresenter);
+ }
+
+
+
+ private void initListeners() {
+
+ // 重发验证码按钮注册监听器
+ mResentBtn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ String template = "正在发送短信验证码至";
+ mPhoneTv.setText(String.format(template, mPhone));
+ mPhoneTvtwo.setText("+86 "+mPhone);
+ resend();
+ }
+ });
+
+ // 验证码输入完成监听器
+ mVerificationInput.setOnCompleteListener(new VerificationCodeInput.Listener() {
+ @Override
+ public void onComplete(String code) {
+ commit(code);
+ }
+ });
+ }
+
+ /**
+ * 提交验证码
+ * @param code
+ */
+ private void commit(final String code) {
+ mPresenter.requestCheckSmsCode(mPhone, code);
+ }
+
+ private void resend() {
+ requestSendSmsCode();
+ }
+ /**
+ * 请求下发验证码
+ */
+ private void requestSendSmsCode() {
+
+ mPresenter.requestSendSmsCode(mPhone);
+ }
+ @Override
+ public void showLoading() {
+ mLoading.setVisibility(View.VISIBLE);
+
+ }
+
+ @Override
+ public void showError(int code, String msg) {
+ mLoading.setVisibility(View.GONE);
+ switch (code) {
+ case IAccountManager.SMS_SEND_FAIL:
+ ToastUtils.showToast(CodeLoginActivity.this,msg);
+ break;
+// case IAccountManager.SMS_CHECK_FAIL:
+// // 提示验证码错误
+// mErrorView.setVisibility(View.VISIBLE);
+// mVerificationInput.setEnabled(true);
+
+ // break;
+
+ }
+
+ }
+
+ @Override
+ public void showCountDownTimer() {
+ mLoading.setVisibility(View.GONE);
+ String template = "验证码已通过短信发送至";
+ mPhoneTv.setText(String.format(template, mPhone));
+ mPhoneTvtwo.setText("+86 "+mPhone);
+ mCountDownTimer.start();
+ mResentBtn.setEnabled(false);
+
+ }
+
+
+
+ @Override
+ public void showSmsCodeCheckState(boolean suc, loginInfoBean data) {
+ if (!suc) {
+ //提示验证码错误
+ mErrorView.setVisibility(View.VISIBLE);
+ mVerificationInput.setEnabled(true);
+ mLoading.setVisibility(View.GONE);
+ } else {
+ //进入主页
+ ProfileSpUtils.getInstance().saveLoginSatus(true);
+ ProfileSpUtils.getInstance().saveProfile(data);
+ startActivity(MainActivity.class);
+
+ }
+ }
+
+ @Override
+ public void showUserExist(boolean exist) {
+ mLoading.setVisibility(View.GONE);
+ mErrorView.setVisibility(View.GONE);
+ if (!exist) {
+
+
+ } else {
+// // 用户存在 ,进入登录
+// LoginDialog dialog = new LoginDialog(mainActivity, mPhone);
+// dialog.show();
+// dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
+// @Override
+// public void onDismiss(DialogInterface dialog) {
+// SmsCodeDialog.this.dismiss();
+// }
+// });
+ }
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ // 注销 Presenter
+ RxBus.getInstance().unRegister(mPresenter);
+ }
+}
diff --git a/app/src/main/java/com/fenghoo/seven/main/activity/ForgetPasActivity.java b/app/src/main/java/com/fenghoo/seven/main/activity/ForgetPasActivity.java
new file mode 100644
index 0000000..b8fd25b
--- /dev/null
+++ b/app/src/main/java/com/fenghoo/seven/main/activity/ForgetPasActivity.java
@@ -0,0 +1,50 @@
+package com.fenghoo.seven.main.activity;
+
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+
+import com.fenghoo.seven.R;
+import com.fenghoo.seven.base.BaseActivity;
+import com.fenghoo.seven.main.kehu.activity.ShowAty;
+import com.fenghoo.seven.widget.TitleBar;
+
+public class ForgetPasActivity extends BaseActivity implements View.OnClickListener {
+ private TitleBar title_bar;
+ /**
+ * 请输入手机号
+ */
+ private EditText mEtPhone;
+ /**
+ * 获取验证码
+ */
+ private Button mBtnLogin;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_forget_pas);
+ initView();
+ }
+
+ private void initView() {
+ title_bar = (TitleBar) findViewById(R.id.title_bar);
+ initNormalBack();
+ title_bar.setTitle("");
+ mEtPhone = (EditText) findViewById(R.id.et_phone);
+ mBtnLogin = (Button) findViewById(R.id.btn_login);
+ mBtnLogin.setOnClickListener(this);
+ }
+
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()) {
+ case R.id.btn_login:
+ ShowAty.CodeLoginActivity(ForgetPasActivity.this,mEtPhone.getText().toString().trim());
+ break;
+ default:
+ break;
+ }
+ }
+}
diff --git a/app/src/main/java/com/fenghoo/seven/main/activity/IAccountManager.java b/app/src/main/java/com/fenghoo/seven/main/activity/IAccountManager.java
new file mode 100644
index 0000000..ce772fc
--- /dev/null
+++ b/app/src/main/java/com/fenghoo/seven/main/activity/IAccountManager.java
@@ -0,0 +1,43 @@
+package com.fenghoo.seven.main.activity;
+
+/**
+ * Created by liuguangli on 17/5/9.
+ * 帐号相关业务逻辑抽象
+ */
+
+public interface IAccountManager {
+ // 服务器错误
+ static final int SERVER_FAIL = -999;
+ // 验证码发送成功
+ static final int SMS_SEND_SUC = 0;
+ // 验证码发送失败
+ static final int SMS_SEND_FAIL = 1;
+ // 验证码校验成功
+ static final int SMS_CHECK_SUC = 2;
+ // 验证码错误
+ static final int SMS_CHECK_FAIL = -2;
+ // 用户已经存在
+ static final int USER_EXIST = 3;
+ // 用户不存在
+ static final int USER_NOT_EXIST = -3;
+ // 注册成功
+ static final int REGISTER_SUC = 4;
+ // 登录成功
+ static final int LOGIN_SUC = 5;
+ // 密码错误
+ static final int PW_ERROR = -5;
+ // 登录失效
+ static final int TOKEN_INVALID = -6;
+
+
+ /*void setHandler(Handler handler);*/
+ /**
+ * 下发验证码
+ */
+ void fetchSMSCode(String phone);
+ /**
+ * 校验验证码
+ */
+ void checkSmsCode(String phone, String smsCode);
+
+}
diff --git a/app/src/main/java/com/fenghoo/seven/main/activity/ISmsCodeDialogView.java b/app/src/main/java/com/fenghoo/seven/main/activity/ISmsCodeDialogView.java
new file mode 100644
index 0000000..ed3123b
--- /dev/null
+++ b/app/src/main/java/com/fenghoo/seven/main/activity/ISmsCodeDialogView.java
@@ -0,0 +1,31 @@
+package com.fenghoo.seven.main.activity;
+
+
+import com.fenghoo.seven.main.my.entity.loginInfoBean;
+
+/**
+ * Created by liuguangli on 17/5/13.
+ */
+
+public interface ISmsCodeDialogView extends IView {
+
+
+ /**
+ * 显示倒计时
+ */
+ void showCountDownTimer();
+
+
+ /**
+ * 显示验证状态
+ * @param b
+ */
+ void showSmsCodeCheckState(boolean b, loginInfoBean data);
+
+
+ /**
+ * 用户是否存在
+ * @param b
+ */
+ void showUserExist(boolean b);
+}
diff --git a/app/src/main/java/com/fenghoo/seven/main/activity/IView.java b/app/src/main/java/com/fenghoo/seven/main/activity/IView.java
new file mode 100644
index 0000000..1dabee2
--- /dev/null
+++ b/app/src/main/java/com/fenghoo/seven/main/activity/IView.java
@@ -0,0 +1,16 @@
+package com.fenghoo.seven.main.activity;
+
+/**
+ * Created by liuguangli on 17/5/13.
+ */
+
+public interface IView {
+ /**
+ * 显示loading
+ */
+ void showLoading();
+ /**
+ * 显示错误
+ */
+ void showError(int Code, String msg);
+}
diff --git a/app/src/main/java/com/fenghoo/seven/main/activity/LoginPasswordActivity.java b/app/src/main/java/com/fenghoo/seven/main/activity/LoginPasswordActivity.java
index 9fb34dc..d52e18f 100644
--- a/app/src/main/java/com/fenghoo/seven/main/activity/LoginPasswordActivity.java
+++ b/app/src/main/java/com/fenghoo/seven/main/activity/LoginPasswordActivity.java
@@ -1,16 +1,19 @@
package com.fenghoo.seven.main.activity;
+import android.content.Intent;
import android.os.CountDownTimer;
import android.text.Html;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
+import android.widget.RelativeLayout;
import android.widget.TextView;
import com.fenghoo.seven.R;
import com.fenghoo.seven.base.BaseTreeActivity;
import com.fenghoo.seven.main.activity.mvp.contract.LoginPasswordContract;
import com.fenghoo.seven.main.activity.mvp.presenterImpl.LoginPasswordPresenterImpl;
+import com.fenghoo.seven.main.kehu.activity.ShowAty;
import androidx.annotation.NonNull;
@@ -25,6 +28,7 @@ public class LoginPasswordActivity extends BaseTreeActivity subscribers;
+
+ /**
+ * 注册 DataBusSubscriber
+ * @param subscriber
+ */
+ public synchronized void register(Object subscriber) {
+ subscribers.add(subscriber);
+ }
+
+
+ /**
+ * 注销 DataBusSubscriber
+ * @param subscriber
+ */
+ public synchronized void unRegister(Object subscriber) {
+ subscribers.remove(subscriber);
+ }
+
+
+ /**
+ * 单利模式
+ */
+ private RxBus() {
+ subscribers = new CopyOnWriteArraySet<>();
+ }
+ public static synchronized RxBus getInstance() {
+
+ if (instance == null) {
+ synchronized (RxBus.class) {
+ if (instance == null) {
+ instance = new RxBus();
+ }
+
+ }
+ }
+ return instance;
+ }
+
+ /**
+ * 包装处理过程
+ * @param func
+ */
+ public void chainProcess(Func1 func) {
+ Observable.just("")
+ .subscribeOn(Schedulers.io()) // 指定处理过程在 IO 线程
+ .map(func) // 包装处理过程
+ .observeOn(AndroidSchedulers.mainThread()) // 指定事件消费在 Main 线程
+ .subscribe(new Action1