From d51b11a2e6568f16e18be9bb294905489e629816 Mon Sep 17 00:00:00 2001 From: BoykoDmytro Date: Fri, 7 Jul 2017 17:53:51 +0300 Subject: [PATCH] impelemnt new api, fixed logic with logged user. --- .../mobile/communicator/data/DataManager.java | 35 ++++++++++-- .../data/db/PreferenceHelper.java | 22 ++++++++ .../communicator/data/models/mqtt/Auth.java | 10 +++- .../data/models/mqtt/Profile.java | 27 ++++++++-- .../communicator/data/server/PahoService.java | 13 +++-- .../mvp/presenters/CodeInputPresenter.java | 39 ++++++++------ .../mvp/presenters/LoginPresenter.java | 54 ++++++++++--------- .../mvp/presenters/MainPresenter.java | 52 ++++++++++++++++++ .../mvp/presenters/SplashPresenter.java | 8 ++- .../communicator/mvp/view/MainView.java | 11 ++++ .../ui/activities/MainActivity.java | 38 ++++++++++++- .../fragments/signin/CodeInputFragment.java | 5 +- .../ui/fragments/signin/LoginFragment.java | 12 ++++- .../communicator/utils/StringUtils.java | 5 ++ .../communicator/utils/ValidationUtils.java | 2 +- app/src/main/res/layout/activity_main.xml | 5 +- 16 files changed, 276 insertions(+), 62 deletions(-) create mode 100644 app/src/main/java/com/ninja/mobile/communicator/mvp/presenters/MainPresenter.java create mode 100644 app/src/main/java/com/ninja/mobile/communicator/mvp/view/MainView.java diff --git a/app/src/main/java/com/ninja/mobile/communicator/data/DataManager.java b/app/src/main/java/com/ninja/mobile/communicator/data/DataManager.java index 936260077a..95ba09ccf9 100644 --- a/app/src/main/java/com/ninja/mobile/communicator/data/DataManager.java +++ b/app/src/main/java/com/ninja/mobile/communicator/data/DataManager.java @@ -13,6 +13,7 @@ import com.ninja.mobile.communicator.data.models.events.ServerData; import com.ninja.mobile.communicator.data.models.mqtt.Auth; import com.ninja.mobile.communicator.data.models.mqtt.DeleteUser; import com.ninja.mobile.communicator.data.models.mqtt.Person; +import com.ninja.mobile.communicator.data.models.mqtt.Profile; import com.ninja.mobile.communicator.data.models.mqtt.Token; import com.ninja.mobile.communicator.data.models.mqtt.TokenResponse; import com.ninja.mobile.communicator.data.server.bert.BertDecoder; @@ -114,6 +115,7 @@ public class DataManager { } } + //Preferences private Token updateToken() { return mToken == null ? mToken = mPreferenceHelper.getToken() : mToken; } @@ -122,10 +124,30 @@ public class DataManager { return updateToken().data; } + public String getPhoneNumber() { + return mPreferenceHelper.getPhoneNumber(); + } + + public void setPhoneNumber(String phoneNumber) { + mPreferenceHelper.savePhoneNumber(phoneNumber); + } + + public void setIsUserConfirmed() { + mPreferenceHelper.setUserConfirmed(true); + } + + public boolean isUserConfirmed() { + return mPreferenceHelper.isUserConfirmed(); + } + + public void clearPreferences() { + mPreferenceHelper.clearPreferences(); + } + //AUTH public void requestSms(String phone) { Auth auth = new Auth(); - auth.phone = phone.replaceAll(" ", ""); + auth.phone = phone; auth.clientId = DEFAULT_CLIENT_ID; auth.dev_key = devKey; mBus.postToServer(new SendMessage(EventTopics.LOGIN, auth)); @@ -136,7 +158,7 @@ public class DataManager { if (token.isValid()) { Auth auth = new Auth(); auth.token = getToken(); - auth.type = Auth.Types.RESEND_SMS; + auth.setType(Auth.Types.RESEND_SMS); mBus.postToServer(new SendMessage(EventTopics.RESEND_MESSAGE, auth)); } } @@ -146,7 +168,7 @@ public class DataManager { if (token.isValid()) { Auth auth = new Auth(); auth.token = getToken(); - auth.type = Auth.Types.VERIFY; + auth.setType(Auth.Types.VERIFY); auth.sms_code = smsCode; mBus.postToServer(new SendMessage(EventTopics.CONFIRM_ACCOUNT, auth)); } @@ -157,6 +179,13 @@ public class DataManager { mBus.postToServer(new SendMessage(EventTopics.DELETE_USER, deleteUser)); } + public void deleteUserNew(String phone) { + Profile profile = new Profile(); + profile.phone = phone; + profile.setStatus(Profile.Types.REMOVE); + mBus.postToServer(new SendMessage(EventTopics.DELETE_USER, profile)); + } + public String getClientId() { return DEFAULT_CLIENT_ID; } diff --git a/app/src/main/java/com/ninja/mobile/communicator/data/db/PreferenceHelper.java b/app/src/main/java/com/ninja/mobile/communicator/data/db/PreferenceHelper.java index 0158fb5cf9..6c54aacb7a 100644 --- a/app/src/main/java/com/ninja/mobile/communicator/data/db/PreferenceHelper.java +++ b/app/src/main/java/com/ninja/mobile/communicator/data/db/PreferenceHelper.java @@ -18,6 +18,8 @@ public class PreferenceHelper { private final static String PREF_NAME = "nynja_prefs"; private final static String TOKEN_KEY = "token"; + private final static String PHONE_NUMBER_KEY = "phone"; + private final static String IS_USER_CONFIRMED_KEY = "is_use_confirmed"; private SharedPreferences mSharedPreferences; @@ -35,4 +37,24 @@ public class PreferenceHelper { String token = mSharedPreferences.getString(TOKEN_KEY, ""); return new Token(token); } + + public void savePhoneNumber(String phoneNumber) { + mSharedPreferences.edit().putString(PHONE_NUMBER_KEY, phoneNumber).apply(); + } + + public String getPhoneNumber() { + return mSharedPreferences.getString(PHONE_NUMBER_KEY, ""); + } + + public void clearPreferences() { + mSharedPreferences.edit().clear().apply(); + } + + public boolean isUserConfirmed() { + return mSharedPreferences.getBoolean(IS_USER_CONFIRMED_KEY, false); + } + + public void setUserConfirmed(boolean isConfirmed) { + mSharedPreferences.edit().putBoolean(IS_USER_CONFIRMED_KEY, isConfirmed).apply(); + } } diff --git a/app/src/main/java/com/ninja/mobile/communicator/data/models/mqtt/Auth.java b/app/src/main/java/com/ninja/mobile/communicator/data/models/mqtt/Auth.java index 0ff0daaa9b..302de081c8 100644 --- a/app/src/main/java/com/ninja/mobile/communicator/data/models/mqtt/Auth.java +++ b/app/src/main/java/com/ninja/mobile/communicator/data/models/mqtt/Auth.java @@ -1,6 +1,9 @@ package com.ninja.mobile.communicator.data.models.mqtt; +import android.support.annotation.NonNull; + +import com.ninja.mobile.communicator.data.server.bert.BertAtom; import com.ninja.mobile.communicator.data.server.bert.BertTuple; import java.util.List; @@ -12,11 +15,15 @@ public class Auth extends BaseModelMQQT { public String phone; public String token; public String clientId; - public String type; + private BertAtom type; public String sms_code; public Long attempts; public String services; + public void setType(@NonNull String type) { + this.type = new BertAtom(type); + } + @Override public Auth decode(BertTuple mqttMessage) { return null; } @@ -37,7 +44,6 @@ public class Auth extends BaseModelMQQT { } public interface Types { - String RESEND_SMS = "resend_sms"; String VERIFY = "verify"; } diff --git a/app/src/main/java/com/ninja/mobile/communicator/data/models/mqtt/Profile.java b/app/src/main/java/com/ninja/mobile/communicator/data/models/mqtt/Profile.java index f80c5f6251..bd76283f7e 100644 --- a/app/src/main/java/com/ninja/mobile/communicator/data/models/mqtt/Profile.java +++ b/app/src/main/java/com/ninja/mobile/communicator/data/models/mqtt/Profile.java @@ -1,24 +1,45 @@ package com.ninja.mobile.communicator.data.models.mqtt; +import android.support.annotation.NonNull; + +import com.ninja.mobile.communicator.data.server.bert.BertAtom; import com.ninja.mobile.communicator.data.server.bert.BertTuple; import java.util.List; -public class Profile extends BaseModelMQQT{ +public class Profile extends BaseModelMQQT { - public long id; public String phone; public List data; + public Long personId; public List accounts; + public BertAtom status; public Profile() { } + public void setStatus(@NonNull String status) { + this.status = new BertAtom(status); + } + @Override public Profile decode(BertTuple bertTuple) { return null; } @Override public Object encode() { - return null; + return new BertTuple() { + { + add(name); + add(phone); + add(data); + add(personId); + add(accounts); + add(status); + } + }; + } + + public interface Types { + String REMOVE = "remove"; } } diff --git a/app/src/main/java/com/ninja/mobile/communicator/data/server/PahoService.java b/app/src/main/java/com/ninja/mobile/communicator/data/server/PahoService.java index 883f05ff33..73990e7a9b 100644 --- a/app/src/main/java/com/ninja/mobile/communicator/data/server/PahoService.java +++ b/app/src/main/java/com/ninja/mobile/communicator/data/server/PahoService.java @@ -45,7 +45,7 @@ import timber.log.Timber; public class PahoService extends Service { - private static final String SERVER_URL = "tcp://ns.synrc.com:8083"; //1883 default port for mqtt + private static final String SERVER_URL = "tcp://ns.synrc.com:1883"; //1883 default port for mqtt private static final String USERNAME_TO_API = "api"; private MqttAndroidClient mServerClient; @@ -96,7 +96,7 @@ public class PahoService extends Service { if (data instanceof SendMessage) { SendMessage sendMessage = (SendMessage) data; PostData postData = sendMessage.getData(); - publishMessageTest(sendMessage.getData().eventTopic.name(), postData.data.encode()); + publishMessageToServerTest(sendMessage.getData().eventTopic.name(), postData.data.encode()); PahoService.this.publishMessage(sendMessage.getData().eventTopic.ordinal(), getAuthTopic(), postData.data.encode()); } else if (data instanceof SubscribeMessage) { SubscribeMessage subscribeMessage = (SubscribeMessage) data; @@ -123,7 +123,7 @@ public class PahoService extends Service { @Override public void messageArrived(String topic, MqttMessage message) throws Exception { - Timber.d("message from server: Topics:%s, ServerMessage:%s", topic, message.toString()); + publishMessageFromServerTest(topic, message.getPayload()); initNode(message); mBus.postEvent(new ServerData(topic, message)); } @@ -137,6 +137,7 @@ public class PahoService extends Service { mqttConnectOptions.setUserName(USERNAME_TO_API); mqttConnectOptions.setAutomaticReconnect(true); mqttConnectOptions.setCleanSession(false); + mqttConnectOptions.setConnectionTimeout(10); mServerClient.connect(mqttConnectOptions, null, new IMqttActionListener() { @Override @@ -216,9 +217,13 @@ public class PahoService extends Service { } //TEST - private void publishMessageTest(String topic, Object object) { + private void publishMessageToServerTest(String topic, Object object) { MqttMessage message = new MqttMessage(encode(object)); byte[] payload = message.getPayload(); Log.e("Test", topic + " erl: " + ServerTestHelper.convertToString(payload)); } + + private void publishMessageFromServerTest(String topic, byte[] payload) { + Log.e("Test", topic + " erl: " + ServerTestHelper.convertToString(payload)); + } } diff --git a/app/src/main/java/com/ninja/mobile/communicator/mvp/presenters/CodeInputPresenter.java b/app/src/main/java/com/ninja/mobile/communicator/mvp/presenters/CodeInputPresenter.java index 042f29292c..0dda289051 100644 --- a/app/src/main/java/com/ninja/mobile/communicator/mvp/presenters/CodeInputPresenter.java +++ b/app/src/main/java/com/ninja/mobile/communicator/mvp/presenters/CodeInputPresenter.java @@ -2,11 +2,13 @@ package com.ninja.mobile.communicator.mvp.presenters; import com.arellomobile.mvp.InjectViewState; import com.ninja.mobile.communicator.data.models.events.ServerData; +import com.ninja.mobile.communicator.data.models.mqtt.Io; import com.ninja.mobile.communicator.data.models.mqtt.TokenResponse; import com.ninja.mobile.communicator.data.server.Topics; import com.ninja.mobile.communicator.data.server.bert.BertDecoder; import com.ninja.mobile.communicator.data.server.bert.BertTuple; import com.ninja.mobile.communicator.mvp.view.CodeInputView; +import com.ninja.mobile.communicator.utils.StringUtils; import com.ninja.mobile.communicator.utils.ValidationUtils; import timber.log.Timber; @@ -17,6 +19,8 @@ import timber.log.Timber; @InjectViewState public class CodeInputPresenter extends BaseErrorPresenter { + String phoneNumber; + public CodeInputPresenter() { addDisposable(mDataManager.getInputSubject() .filter(data -> data instanceof ServerData) @@ -29,9 +33,10 @@ public class CodeInputPresenter extends BaseErrorPresenter { mDataManager.resendSms(); } - public void onConfirmClick(String code) { + public void onConfirmClick(String phone, String code) { if (ValidationUtils.isCodeValid(code)) { - mDataManager.confirmSms(code); + mDataManager.confirmSms(StringUtils.deleteSpaces(code)); + phoneNumber = phone; } else { showCodeErrorMessage("Code is too small.", -1); } @@ -40,21 +45,25 @@ public class CodeInputPresenter extends BaseErrorPresenter { private void handleServerResponse(byte[] payload) { try { BertDecoder bertDecoder = BertDecoder.setupDecoder().withDecodeAtomAsString(true); - BertTuple bertTuple = (BertTuple) bertDecoder.decodeAny(payload); - TokenResponse resendSmsResponse = new TokenResponse().decode(bertTuple); - if (resendSmsResponse.mIo.isSuccess()) { - switch (resendSmsResponse.mIo.getStatus()) { - case "login": - case "session_verified": - navigateToMyProfile(); - break; + Object o = bertDecoder.decodeAny(payload); + if (o instanceof BertTuple) { + BertTuple bertTuple = (BertTuple) o; + TokenResponse resendSmsResponse = new TokenResponse().decode(bertTuple); + if (resendSmsResponse.mIo.isSuccess()) { + switch (resendSmsResponse.mIo.getStatus()) { + case Io.Types.LOGIN: + navigateToMyProfile(); + mDataManager.setPhoneNumber(phoneNumber); + mDataManager.setIsUserConfirmed(); + break; - case "sms_send": - getViewState().showSuccessCodeSendMessage(); - break; + case Io.Types.SMS_SEND: + getViewState().showSuccessCodeSendMessage(); + break; + } + } else { + showCodeErrorMessage(resendSmsResponse.mIo.getStatus(), -1); } - } else { - showCodeErrorMessage(resendSmsResponse.mIo.getStatus(), -1); } } catch (Exception e) { Timber.e(e); diff --git a/app/src/main/java/com/ninja/mobile/communicator/mvp/presenters/LoginPresenter.java b/app/src/main/java/com/ninja/mobile/communicator/mvp/presenters/LoginPresenter.java index 5ed0289909..3f33a864cb 100644 --- a/app/src/main/java/com/ninja/mobile/communicator/mvp/presenters/LoginPresenter.java +++ b/app/src/main/java/com/ninja/mobile/communicator/mvp/presenters/LoginPresenter.java @@ -13,6 +13,7 @@ import com.ninja.mobile.communicator.data.server.bert.BertTuple; import com.ninja.mobile.communicator.mvp.view.LoginView; import com.ninja.mobile.communicator.ui.activities.MainActivity; import com.ninja.mobile.communicator.ui.fragments.signin.CodeInputFragment; +import com.ninja.mobile.communicator.utils.StringUtils; import com.ninja.mobile.communicator.utils.Utils; import java.io.InvalidObjectException; @@ -69,7 +70,7 @@ public class LoginPresenter extends BasePresenter { .filter(data -> data.getData().getTopic().equalsIgnoreCase(Topics.getAction(mDataManager.getClientId()))) .subscribe(data -> handleAuth(data.getData().getPayload()), Timber::e)); - mDataManager.requestSms(String.format("%s%s", mCode, mPhone)); + mDataManager.requestSms(StringUtils.deleteSpaces(String.format("%s%s", mCode, mPhone))); } private void navigateToCodeScreen() { @@ -160,29 +161,34 @@ public class LoginPresenter extends BasePresenter { private void handleAuth(byte[] payload) { try { BertDecoder bertDecoder = BertDecoder.setupDecoder().withDecodeAtomAsString(true); - BertTuple bertTuple = (BertTuple) bertDecoder.decodeAny(payload); - TokenResponse tokenResponse = new TokenResponse().decode(bertTuple); - if (tokenResponse.mIo.isSuccess()) { - switch (tokenResponse.mIo.getStatus()) { - case Io.Types.LOGIN: - navigateToMainScreen(); - break; - - case Io.Types.SMS_SEND: - navigateToCodeScreen(); - break; - default: - //ShowError - } - } else { - switch (tokenResponse.mIo.getStatus()) { - case Io.Types.NOT_VERIFIED: - mDataManager.resendSms(); - break; - - case Io.Types.MISMATCH_USER_DATA: - case Io.Types.ERROR: - break; + Object o = bertDecoder.decodeAny(payload); + if (o instanceof BertTuple) { + BertTuple bertTuple = (BertTuple) o; + TokenResponse tokenResponse = new TokenResponse().decode(bertTuple); + if (tokenResponse.mIo.isSuccess()) { + switch (tokenResponse.mIo.getStatus()) { + case Io.Types.LOGIN: + navigateToMainScreen(); + mDataManager.setPhoneNumber(String.format("%s%s", mCode, mPhone).replace(" ", "")); + mDataManager.setIsUserConfirmed(); + break; + + case Io.Types.SMS_SEND: + navigateToCodeScreen(); + break; + default: + //ShowError + } + } else { + switch (tokenResponse.mIo.getStatus()) { + case Io.Types.NOT_VERIFIED: + mDataManager.resendSms(); + break; + + case Io.Types.MISMATCH_USER_DATA: + case Io.Types.ERROR: + break; + } } } } catch (InvalidObjectException e) { diff --git a/app/src/main/java/com/ninja/mobile/communicator/mvp/presenters/MainPresenter.java b/app/src/main/java/com/ninja/mobile/communicator/mvp/presenters/MainPresenter.java new file mode 100644 index 0000000000..ae5189d315 --- /dev/null +++ b/app/src/main/java/com/ninja/mobile/communicator/mvp/presenters/MainPresenter.java @@ -0,0 +1,52 @@ +package com.ninja.mobile.communicator.mvp.presenters; + +import com.arellomobile.mvp.InjectViewState; +import com.ninja.mobile.communicator.data.models.events.ServerData; +import com.ninja.mobile.communicator.data.models.mqtt.Io; +import com.ninja.mobile.communicator.data.server.Topics; +import com.ninja.mobile.communicator.data.server.bert.BertDecoder; +import com.ninja.mobile.communicator.data.server.bert.BertTuple; +import com.ninja.mobile.communicator.mvp.view.MainView; + +import timber.log.Timber; + +/** + * Created by dmitro.boiko on 07/07/2017. + */ + +@InjectViewState +public class MainPresenter extends BaseErrorPresenter { + + @Override protected void onFirstViewAttach() { + super.onFirstViewAttach(); + addDisposable(mDataManager.getInputSubject() + .filter(data -> data instanceof ServerData) + .map(data -> (ServerData) data) + .filter(data -> data.getData().getTopic().equalsIgnoreCase(Topics.getAction(mDataManager.getClientId()))) + .subscribe(serverData -> handleServerResponse(serverData.getData().getPayload()), Timber::e)); + } + + public void deleteUser() { + mDataManager.deleteUser(mDataManager.getPhoneNumber()); + } + + private void handleServerResponse(byte[] payload) { + try { + BertDecoder bertDecoder = BertDecoder.setupDecoder().withDecodeAtomAsString(true); + Object o = bertDecoder.decodeAny(payload); + Timber.e(o.toString()); + if (o instanceof BertTuple) { + BertTuple bertTuple = (BertTuple) o; + Io io = new Io().decode((BertTuple) bertTuple.get(1)); + if (io.isSuccess()) { + getViewState().navigateToSplash(); + mDataManager.clearPreferences(); + } else { + getViewState().showCodeError(io.getStatus(), -1); + } + } + } catch (Exception e) { + Timber.e(e); + } + } +} diff --git a/app/src/main/java/com/ninja/mobile/communicator/mvp/presenters/SplashPresenter.java b/app/src/main/java/com/ninja/mobile/communicator/mvp/presenters/SplashPresenter.java index ec6cafb59c..6727604251 100644 --- a/app/src/main/java/com/ninja/mobile/communicator/mvp/presenters/SplashPresenter.java +++ b/app/src/main/java/com/ninja/mobile/communicator/mvp/presenters/SplashPresenter.java @@ -11,12 +11,10 @@ import com.ninja.mobile.communicator.mvp.view.SplashView; public class SplashPresenter extends BasePresenter { public void navigateTo() { - if (mDataManager.getToken().isEmpty()) { - getViewState().navigateToLogin(); - } else { + if (mDataManager.isUserConfirmed()) { getViewState().navigateToMainScreen(); + } else { + getViewState().navigateToLogin(); } } - - ; } diff --git a/app/src/main/java/com/ninja/mobile/communicator/mvp/view/MainView.java b/app/src/main/java/com/ninja/mobile/communicator/mvp/view/MainView.java new file mode 100644 index 0000000000..94a2d80bf6 --- /dev/null +++ b/app/src/main/java/com/ninja/mobile/communicator/mvp/view/MainView.java @@ -0,0 +1,11 @@ +package com.ninja.mobile.communicator.mvp.view; + +/** + * Created by dmitro.boiko on 07/07/2017. + */ + +public interface MainView extends ErrorMvpView { + + void navigateToSplash(); + +} diff --git a/app/src/main/java/com/ninja/mobile/communicator/ui/activities/MainActivity.java b/app/src/main/java/com/ninja/mobile/communicator/ui/activities/MainActivity.java index d48cd0d7ed..386606ed52 100644 --- a/app/src/main/java/com/ninja/mobile/communicator/ui/activities/MainActivity.java +++ b/app/src/main/java/com/ninja/mobile/communicator/ui/activities/MainActivity.java @@ -1,13 +1,22 @@ package com.ninja.mobile.communicator.ui.activities; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; +import android.support.v7.app.AlertDialog; +import com.arellomobile.mvp.presenter.InjectPresenter; import com.ninja.mobile.communicator.R; +import com.ninja.mobile.communicator.mvp.presenters.MainPresenter; +import com.ninja.mobile.communicator.mvp.view.MainView; import com.ninja.mobile.communicator.ui.base.BaseActivity; -public class MainActivity extends BaseActivity { +import butterknife.OnClick; + +public class MainActivity extends BaseActivity implements MainView { + + @InjectPresenter MainPresenter mMainPresenter; public static Intent getLaunchIntent(Context context) { Intent intent = new Intent(context, MainActivity.class); @@ -20,4 +29,31 @@ public class MainActivity extends BaseActivity { setContentView(R.layout.activity_main); } + @OnClick(R.id.deleteUser) + public void deleteUser() { + mMainPresenter.deleteUser(); + } + + @Override public void showInternetError() { + showAlert(getString(R.string.error_no_internet_connection), null); + } + + @Override public void showCodeError(String message, int code) { + showAlert(message, null); + } + + @Override public void navigateToSplash() { + Intent intent = RegistrationActivity.getLaunchIntent(this); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK); + startActivity(intent); + } + + private void showAlert(String message, DialogInterface.OnClickListener listener) { + //// FIXME: 02.07.17 move to dialog utils/factory + AlertDialog alertDialog = new AlertDialog.Builder(this).create(); + alertDialog.setTitle(getString(R.string.app_name)); + alertDialog.setMessage(message); + alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, getString(R.string.signin_text_ok), listener); + alertDialog.show(); + } } diff --git a/app/src/main/java/com/ninja/mobile/communicator/ui/fragments/signin/CodeInputFragment.java b/app/src/main/java/com/ninja/mobile/communicator/ui/fragments/signin/CodeInputFragment.java index 44d8593e5b..015ebc063b 100644 --- a/app/src/main/java/com/ninja/mobile/communicator/ui/fragments/signin/CodeInputFragment.java +++ b/app/src/main/java/com/ninja/mobile/communicator/ui/fragments/signin/CodeInputFragment.java @@ -32,6 +32,7 @@ import butterknife.OnClick; public class CodeInputFragment extends BaseFragment implements CodeInputView { public static final String PHONE_TAG = "phone"; + private final static String HINT_TEXT = "--- ---"; @BindView(R.id.f_code_tv_repeat) TextView mNotReceivedText; @BindView(R.id.f_code_tv_phone) TextView mPhoneNumber; @@ -63,7 +64,7 @@ public class CodeInputFragment extends BaseFragment implements CodeInputView { mPhoneNumber.setText(arguments.getString(PHONE_TAG)); } mCodeText.addTextChangedListener(new PhoneWatcher(mCodeText)); - mCodeText.setHintText("___ ___"); + mCodeText.setHintText(HINT_TEXT); } private void initSpannableTerms() { @@ -73,7 +74,7 @@ public class CodeInputFragment extends BaseFragment implements CodeInputView { @OnClick(R.id.f_code_btn_next) public void onNextClick() { - mCodeInputPresenter.onConfirmClick(StringUtils.getText(mCodeText)); + mCodeInputPresenter.onConfirmClick(StringUtils.getText(mPhoneNumber), StringUtils.getText(mCodeText)); } @Override public void navigateToMyProfileScreen() { diff --git a/app/src/main/java/com/ninja/mobile/communicator/ui/fragments/signin/LoginFragment.java b/app/src/main/java/com/ninja/mobile/communicator/ui/fragments/signin/LoginFragment.java index 96446e1945..a147a7d33a 100644 --- a/app/src/main/java/com/ninja/mobile/communicator/ui/fragments/signin/LoginFragment.java +++ b/app/src/main/java/com/ninja/mobile/communicator/ui/fragments/signin/LoginFragment.java @@ -12,10 +12,12 @@ import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import android.widget.EditText; +import android.widget.ImageButton; import android.widget.TextView; import android.widget.Toast; import com.arellomobile.mvp.presenter.InjectPresenter; +import com.jakewharton.rxbinding2.view.RxView; import com.jakewharton.rxbinding2.widget.RxTextView; import com.ninja.mobile.communicator.R; import com.ninja.mobile.communicator.mvp.presenters.LoginPresenter; @@ -29,10 +31,12 @@ import com.ninja.mobile.communicator.utils.PhoneWatcher; import com.ninja.mobile.communicator.utils.SpannableUtils; import java.util.List; +import java.util.concurrent.TimeUnit; import butterknife.BindView; import butterknife.OnClick; import butterknife.OnTouch; +import io.reactivex.android.schedulers.AndroidSchedulers; /** * Created by Max Chervatiuk on 23.06.17. @@ -47,6 +51,7 @@ public class LoginFragment extends BaseFragment implements LoginView { @BindView(R.id.f_iphone_edt_country_code) EditText mCountryCode; @BindView(R.id.f_iphone_edt_number) HintEditText mPhoneEditText; @BindView(R.id.f_iphone_tv_description) TextView mTermsOfUse; + @BindView(R.id.f_iphone_btn_next) ImageButton nextButton; @InjectPresenter LoginPresenter mPresenter; @@ -79,6 +84,11 @@ public class LoginFragment extends BaseFragment implements LoginView { return false; }); + RxView.clicks(nextButton) + .debounce(200, TimeUnit.MILLISECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(o -> attemptGetSms()); + initSpannableTerms(); } @@ -102,7 +112,7 @@ public class LoginFragment extends BaseFragment implements LoginView { mHandler.postDelayed(() -> mWheelView.setVisibility(View.VISIBLE), 100); } - @OnClick(R.id.f_iphone_btn_next) public void attemptGetSms() { + public void attemptGetSms() { mActivity.hideKeyboard(); mPresenter.attemptGetSms(); } diff --git a/app/src/main/java/com/ninja/mobile/communicator/utils/StringUtils.java b/app/src/main/java/com/ninja/mobile/communicator/utils/StringUtils.java index 9ce99335e0..52c64d453d 100644 --- a/app/src/main/java/com/ninja/mobile/communicator/utils/StringUtils.java +++ b/app/src/main/java/com/ninja/mobile/communicator/utils/StringUtils.java @@ -4,6 +4,7 @@ package com.ninja.mobile.communicator.utils; * Created by Bo on 29.06.2017. */ +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.text.TextUtils; import android.widget.TextView; @@ -17,4 +18,8 @@ public class StringUtils { public static String getText(@Nullable TextView view) { return view != null ? view.getText().toString() : ""; } + + public static String deleteSpaces(@NonNull String data) { + return data.replaceAll(" ", ""); + } } diff --git a/app/src/main/java/com/ninja/mobile/communicator/utils/ValidationUtils.java b/app/src/main/java/com/ninja/mobile/communicator/utils/ValidationUtils.java index 3de8506314..3e6a545bfb 100644 --- a/app/src/main/java/com/ninja/mobile/communicator/utils/ValidationUtils.java +++ b/app/src/main/java/com/ninja/mobile/communicator/utils/ValidationUtils.java @@ -21,6 +21,6 @@ public class ValidationUtils { } public static boolean isCodeValid(String code) { - return StringUtils.isNotEmpty(code) && code.length() == 7; + return StringUtils.isNotEmpty(code) && StringUtils.deleteSpaces(code).length() == 6; } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 044e9fe471..4f6c4d85b7 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -8,9 +8,12 @@ tools:context="com.ninja.mobile.communicator.ui.activities.MainActivity">