add player login fragment with mvp classes
Project: http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/commit/1aa2c70a Tree: http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/tree/1aa2c70a Diff: http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/diff/1aa2c70a Branch: refs/heads/master Commit: 1aa2c70a2163d448d3c5db9db8b10a53faaede46 Parents: 2e4c7bb Author: Sagar <[email protected]> Authored: Sun Sep 25 21:40:33 2016 +0530 Committer: Sagar <[email protected]> Committed: Sun Sep 25 21:40:33 2016 +0530 ---------------------------------------------------------------------- .../ui/playerlogin/PlayerLoginFragment.java | 252 +++++++++++++++++++ .../ui/playerlogin/PlayerLoginMvpView.java | 13 + .../ui/playerlogin/PlayerLoginPresenter.java | 79 ++++++ .../res/layout/fragment_player_login_layout.xml | 67 +++++ 4 files changed, 411 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1aa2c70a/app/src/main/java/org/apache/taverna/mobile/ui/playerlogin/PlayerLoginFragment.java ---------------------------------------------------------------------- diff --git a/app/src/main/java/org/apache/taverna/mobile/ui/playerlogin/PlayerLoginFragment.java b/app/src/main/java/org/apache/taverna/mobile/ui/playerlogin/PlayerLoginFragment.java new file mode 100644 index 0000000..35ebedc --- /dev/null +++ b/app/src/main/java/org/apache/taverna/mobile/ui/playerlogin/PlayerLoginFragment.java @@ -0,0 +1,252 @@ +package org.apache.taverna.mobile.ui.playerlogin; + + +import android.content.Context; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.design.widget.Snackbar; +import android.support.design.widget.TextInputLayout; +import android.support.v4.app.Fragment; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.CheckBox; +import android.widget.EditText; + +import org.apache.taverna.mobile.R; +import org.apache.taverna.mobile.data.DataManager; +import org.apache.taverna.mobile.data.local.PreferencesHelper; +import org.apache.taverna.mobile.utils.ConnectionInfo; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; + + +public class PlayerLoginFragment extends Fragment implements PlayerLoginMvpView, View + .OnFocusChangeListener { + + @BindView(R.id.etEmail) + EditText mEditTextEmail; + + @BindView(R.id.etPassword) + EditText mEditTextPassword; + + @BindView(R.id.input_layout_email) + TextInputLayout mTextInputEmail; + + @BindView(R.id.input_layout_password) + TextInputLayout mTextInputPassword; + + @BindView(R.id.cbRemember) + CheckBox mCheckBoxRemember; + + + private DataManager dataManager; + + private PlayerLoginPresenter mPlayerLoginPresenter; + + OnSuccessful mCallback; + + + public static PlayerLoginFragment newInstance() { + + Bundle args = new Bundle(); + + PlayerLoginFragment fragment = new PlayerLoginFragment(); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + dataManager = new DataManager(new PreferencesHelper(getContext())); + mPlayerLoginPresenter = new PlayerLoginPresenter(dataManager); + + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle + savedInstanceState) { + + View rootView = inflater.inflate(R.layout.fragment_player_login_layout, container, false); + ButterKnife.bind(this, rootView); + mPlayerLoginPresenter.attachView(this); + return rootView; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + + mEditTextEmail.addTextChangedListener(new CustomTextWatcher(mEditTextEmail)); + + + mEditTextPassword.addTextChangedListener(new CustomTextWatcher(mEditTextPassword)); + + mEditTextEmail.setOnFocusChangeListener(this); + + mEditTextPassword.setOnFocusChangeListener(this); + + + //mPlayerLoginPresenter.PlayerLogin("[email protected]", "Sagarishere", true); + + + + } + + + @Override + public void onDestroyView() { + super.onDestroyView(); + mPlayerLoginPresenter.detachView(); + } + + + @OnClick(R.id.bLogin) + public void login(View v) { + if (ConnectionInfo.isConnectingToInternet(getContext())) { + if (!mEditTextEmail.getText().toString().trim().isEmpty() && !mEditTextPassword + .getText().toString().trim().isEmpty()) { + + mPlayerLoginPresenter.playerLogin(mEditTextEmail.getText().toString().trim(), + mEditTextPassword.getText().toString().trim(), mCheckBoxRemember + .isChecked()); + + } else { + + showError("Please enter valid credential"); + } + } else { + + showError("NO Internet Connection"); + } + } + + @Override + public void showError(String string) { + final Snackbar snackbar = Snackbar.make(mEditTextPassword, string, Snackbar + .LENGTH_LONG); + snackbar.setAction("OK", new View.OnClickListener() { + @Override + public void onClick(View view) { + snackbar.dismiss(); + } + }); + + snackbar.show(); + } + + @Override + public void showCredentialError() { + mTextInputEmail.setError(getString(R.string.err_login_email)); + mTextInputPassword.setError(getString(R.string.err_login_password)); + requestFocus(mEditTextPassword); + } + + @Override + public void validCredential() { + mCallback.onSuccessfulLogin(); + } + + + private void validateEmail() { + + if (mEditTextEmail.getText().toString().trim().isEmpty()) { + + mTextInputEmail.setError(getString(R.string.err_login_email)); + } else { + + mTextInputEmail.setError(null); + } + + + } + + private void requestFocus(View view) { + if (view.requestFocus()) { + getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams + .SOFT_INPUT_STATE_ALWAYS_VISIBLE); + } + } + + private void validatePassword() { + if (mEditTextPassword.getText().toString().trim().isEmpty()) { + + mTextInputPassword.setError(getString(R.string.err_login_password)); + } else { + + mTextInputPassword.setError(null); + } + + + } + + @Override + public void onFocusChange(View v, boolean hasFocus) { + switch (v.getId()) { + case R.id.etEmail: + if (!v.hasFocus()) { + validateEmail(); + } + break; + case R.id.etPassword: + if (!v.hasFocus()) { + validatePassword(); + } + break; + } + } + + private class CustomTextWatcher implements TextWatcher { + + private View view; + + private CustomTextWatcher(View view) { + this.view = view; + } + + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + public void afterTextChanged(Editable editable) { + switch (view.getId()) { + case R.id.etEmail: + validateEmail(); + break; + case R.id.etPassword: + validatePassword(); + break; + } + } + } + + + public interface OnSuccessful { + void onSuccessfulLogin(); + } + + + @Override + public void onAttach(Context context) { + super.onAttach(context); + + try { + mCallback = (OnSuccessful) getActivity(); + } catch (ClassCastException e) { + throw new ClassCastException(getActivity().toString() + + " must implement OnSuccessful"); + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1aa2c70a/app/src/main/java/org/apache/taverna/mobile/ui/playerlogin/PlayerLoginMvpView.java ---------------------------------------------------------------------- diff --git a/app/src/main/java/org/apache/taverna/mobile/ui/playerlogin/PlayerLoginMvpView.java b/app/src/main/java/org/apache/taverna/mobile/ui/playerlogin/PlayerLoginMvpView.java new file mode 100644 index 0000000..9e0f9e6 --- /dev/null +++ b/app/src/main/java/org/apache/taverna/mobile/ui/playerlogin/PlayerLoginMvpView.java @@ -0,0 +1,13 @@ +package org.apache.taverna.mobile.ui.playerlogin; + +import org.apache.taverna.mobile.ui.base.MvpView; + + +public interface PlayerLoginMvpView extends MvpView{ + + void showError(String string); + + void showCredentialError(); + + void validCredential(); +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1aa2c70a/app/src/main/java/org/apache/taverna/mobile/ui/playerlogin/PlayerLoginPresenter.java ---------------------------------------------------------------------- diff --git a/app/src/main/java/org/apache/taverna/mobile/ui/playerlogin/PlayerLoginPresenter.java b/app/src/main/java/org/apache/taverna/mobile/ui/playerlogin/PlayerLoginPresenter.java new file mode 100644 index 0000000..411eca2 --- /dev/null +++ b/app/src/main/java/org/apache/taverna/mobile/ui/playerlogin/PlayerLoginPresenter.java @@ -0,0 +1,79 @@ +package org.apache.taverna.mobile.ui.playerlogin; + +import android.util.Base64; +import android.util.Log; + +import org.apache.taverna.mobile.data.DataManager; +import org.apache.taverna.mobile.ui.base.BasePresenter; + +import okhttp3.ResponseBody; +import retrofit2.adapter.rxjava.HttpException; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + + +public class PlayerLoginPresenter extends BasePresenter<PlayerLoginMvpView> { + + private DataManager mDataManager; + + private Subscription mSubscriptions; + + public PlayerLoginPresenter(DataManager dataManager) { + mDataManager = dataManager; + } + + @Override + public void attachView(PlayerLoginMvpView mvpView) { + super.attachView(mvpView); + } + + @Override + public void detachView() { + super.detachView(); + if (mSubscriptions != null) mSubscriptions.unsubscribe(); + } + + public void playerLogin(final String username, final String password, final boolean loginFlag) { + if (mSubscriptions != null) mSubscriptions.unsubscribe(); + + mSubscriptions = mDataManager.authPlayerUserLoginDetail(getEncodedCredential(username, + password),loginFlag) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeOn(Schedulers.io()) + .subscribe(new Observer<ResponseBody>() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + Log.e("TAG", "onError: ", e); + if (e instanceof HttpException) { + if (((HttpException) e).code() == 401) { + getMvpView().showCredentialError(); + } else if (((HttpException) e).code() == 406) { + getMvpView().validCredential(); + mDataManager.getPreferencesHelper().setUserPlayerLoggedInFlag + (loginFlag,getEncodedCredential(username, password)); + + } + } + } + + @Override + public void onNext(ResponseBody responseBody) { + Log.e("hello", "onCompleted: " + responseBody.byteStream()); + } + }); + + } + + private String getEncodedCredential(String username, String password) { + + return "Basic " + Base64.encodeToString((username + ":" + password).getBytes(), Base64 + .NO_WRAP); + } +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1aa2c70a/app/src/main/res/layout/fragment_player_login_layout.xml ---------------------------------------------------------------------- diff --git a/app/src/main/res/layout/fragment_player_login_layout.xml b/app/src/main/res/layout/fragment_player_login_layout.xml new file mode 100644 index 0000000..4379459 --- /dev/null +++ b/app/src/main/res/layout/fragment_player_login_layout.xml @@ -0,0 +1,67 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:padding="40dp" + > + + <TextView + android:id="@+id/header" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center" + android:textSize="24sp" + android:text="Taverna Player Portal Login"/> + + <android.support.design.widget.TextInputLayout + android:layout_below="@id/header" + android:id="@+id/input_layout_email" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="20dp"> + + <EditText + android:id="@+id/etEmail" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="@string/hint_email" + android:inputType="textEmailAddress" + android:singleLine="true"/> + + </android.support.design.widget.TextInputLayout> + + <android.support.design.widget.TextInputLayout + android:id="@+id/input_layout_password" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@id/input_layout_email" + android:layout_marginTop="20dp"> + + <EditText + android:id="@+id/etPassword" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="@string/hint_password" + android:inputType="textPassword" + android:singleLine="true"/> + + </android.support.design.widget.TextInputLayout> + + <CheckBox + android:id="@+id/cbRemember" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@id/input_layout_password" + android:checked="true" + android:text="@string/keeplogin"/> + + <Button + android:id="@+id/bLogin" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="Login" + android:layout_marginTop="20dp" + android:layout_below="@id/cbRemember"/> + +</RelativeLayout> \ No newline at end of file
