You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@taverna.apache.org by ia...@apache.org on 2016/10/03 14:49:26 UTC

[16/50] [abbrv] incubator-taverna-mobile git commit: add player login fragment with mvp classes

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 <ku...@gmail.com>
Authored: Sun Sep 25 21:40:33 2016 +0530
Committer: Sagar <ku...@gmail.com>
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("kumarsagar15795@gmail.com", "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