org.edx.mobile.view.LoginActivity.java Source code

Java tutorial

Introduction

Here is the source code for org.edx.mobile.view.LoginActivity.java

Source

package org.edx.mobile.view;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;

import org.edx.mobile.R;
import org.edx.mobile.base.BaseFragmentActivity;
import org.edx.mobile.exception.LoginErrorMessage;
import org.edx.mobile.exception.LoginException;
import org.edx.mobile.model.api.AuthResponse;
import org.edx.mobile.model.api.ProfileModel;
import org.edx.mobile.model.api.ResetPasswordResponse;
import org.edx.mobile.module.analytics.ISegment;
import org.edx.mobile.module.prefs.PrefManager;
import org.edx.mobile.social.SocialFactory;
import org.edx.mobile.social.SocialLoginDelegate;
import org.edx.mobile.task.LoginTask;
import org.edx.mobile.task.Task;
import org.edx.mobile.util.Config;
import org.edx.mobile.util.NetworkUtil;
import org.edx.mobile.util.PropertyUtil;
import org.edx.mobile.util.ResourceUtil;
import org.edx.mobile.util.ViewAnimationUtil;
import org.edx.mobile.view.dialog.ResetPasswordDialog;
import org.edx.mobile.view.dialog.SimpleAlertDialog;
import org.edx.mobile.view.dialog.SuccessDialogFragment;

import java.util.HashMap;
import java.util.Map;

public class LoginActivity extends BaseFragmentActivity implements SocialLoginDelegate.MobileLoginCallback {

    private TextView login_tv;
    private EditText email_et, password_et;

    private SimpleAlertDialog NoNetworkFragment;

    private ResetPasswordDialog resetDialog;
    private SuccessDialogFragment successFragment;
    private ProgressBar progressbar;
    private RelativeLayout loginButtonLayout;
    public String emailStr;
    private TextView forgotPassword_tv;
    private TextView eulaTv;
    private LinearLayout errorLayout;
    private TextView errorHeader;
    private TextView errorMessage;
    private SocialLoginDelegate socialLoginDelegate;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        overridePendingTransition(R.anim.slide_in_from_bottom, R.anim.no_transition);

        hideSoftKeypad();

        // setup for social login
        socialLoginDelegate = new SocialLoginDelegate(this, savedInstanceState, this, environment.getConfig());

        ImageView imgFacebook = (ImageView) findViewById(R.id.img_facebook);
        ImageView imgGoogle = (ImageView) findViewById(R.id.img_google);
        imgFacebook.setOnClickListener(
                socialLoginDelegate.createSocialButtonClickHandler(SocialFactory.SOCIAL_SOURCE_TYPE.TYPE_FACEBOOK));
        imgGoogle.setOnClickListener(
                socialLoginDelegate.createSocialButtonClickHandler(SocialFactory.SOCIAL_SOURCE_TYPE.TYPE_GOOGLE));

        email_et = (EditText) findViewById(R.id.email_et);

        password_et = (EditText) findViewById(R.id.password_et);
        progressbar = (ProgressBar) findViewById(R.id.login_spinner);
        login_tv = (TextView) findViewById(R.id.login_btn_tv);

        loginButtonLayout = (RelativeLayout) findViewById(R.id.login_button_layout);
        loginButtonLayout.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // Check for Validation
                callServerForLogin();
            }
        });

        forgotPassword_tv = (TextView) findViewById(R.id.forgot_password_tv);
        forgotPassword_tv.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // Calling help dialog
                if (NetworkUtil.isConnected(LoginActivity.this)) {
                    showResetPasswordDialog();
                } else {
                    showNoNetworkDialog();
                }
            }
        });

        eulaTv = (TextView) findViewById(R.id.end_user_agreement_tv);
        String platformName = environment.getConfig().getPlatformName();
        CharSequence licenseText = ResourceUtil.getFormattedString(getResources(), R.string.licensing_agreement,
                "platform_name", platformName);
        eulaTv.setText(licenseText);
        eulaTv.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                showEulaDialog();
            }
        });

        errorLayout = (LinearLayout) findViewById(R.id.error_layout);
        errorHeader = (TextView) findViewById(R.id.error_header);
        errorMessage = (TextView) findViewById(R.id.error_message);

        environment.getSegment().trackScreenView(ISegment.Screens.LOGIN);

        View closeButton = findViewById(R.id.actionbar_close_btn);
        if (closeButton != null) {
            closeButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    finish();
                }
            });
        }

        // enable login buttons at launch
        tryToSetUIInteraction(true);

        Config config = environment.getConfig();
        // check if third party traffic is enabled
        boolean isOnZeroRatedNetwork = NetworkUtil.isOnZeroRatedNetwork(getApplicationContext(), config);

        if (isOnZeroRatedNetwork) {
            findViewById(R.id.panel_login_social).setVisibility(View.GONE);
        } else {
            if (!config.getFacebookConfig().isEnabled() && !config.getGoogleConfig().isEnabled()) {
                findViewById(R.id.panel_login_social).setVisibility(View.GONE);
            } else if (!config.getFacebookConfig().isEnabled()) {
                findViewById(R.id.facebook_layout).setVisibility(View.GONE);
            } else if (!config.getGoogleConfig().isEnabled()) {
                findViewById(R.id.google_layout).setVisibility(View.GONE);
            }
        }

        TextView customTitle = (TextView) findViewById(R.id.activity_title);
        if (customTitle != null) {
            customTitle.setText(ResourceUtil.getFormattedString(getResources(), R.string.login_title,
                    "platform_name", config.getPlatformName()));
        }

        TextView version_tv = (TextView) findViewById(R.id.tv_version_no);
        try {
            String envDisplayName = config.getEnvironmentDisplayName();

            if (envDisplayName != null && envDisplayName.length() > 0) {
                version_tv.setVisibility(View.VISIBLE);
                String versionName = PropertyUtil.getManifestVersionName(this);
                String text = String.format("%s %s %s", getString(R.string.label_version), versionName,
                        envDisplayName);
                version_tv.setText(text);
            }
        } catch (Exception e) {
            logger.error(e);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        socialLoginDelegate.onActivityDestroyed();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("username", email_et.getText().toString().trim());

        socialLoginDelegate.onActivitySaveInstanceState(outState);

    }

    @Override
    protected void onStart() {
        super.onStart();
        if (email_et.getText().toString().length() == 0) {
            displayLastEmailId();
        }

        socialLoginDelegate.onActivityStarted();

    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        if (savedInstanceState != null) {
            email_et.setText(savedInstanceState.getString("username"));
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        tryToSetUIInteraction(true);
        socialLoginDelegate.onActivityResult(requestCode, resultCode, data);
    }

    protected void onResume() {
        super.onResume();
        PrefManager pm = new PrefManager(LoginActivity.this, PrefManager.Pref.LOGIN);
        //MOB-1343 : app enter here when user in the login window and lock the screen
        if (pm.getCurrentUserProfile() != null) {
            Intent intent = new Intent(LoginActivity.this, MyCoursesListActivity.class);
            startActivity(intent);
            finish();
        }
    }

    private void displayLastEmailId() {
        PrefManager pref = new PrefManager(this, PrefManager.Pref.LOGIN);
        String emailId = pref.getString("email");
        email_et.setText(emailId);
    }

    public ProgressBar getProgressBar() {
        return this.progressbar;
    }

    public void callServerForLogin() {

        if (NetworkUtil.isConnected(this)) {
            emailStr = email_et.getText().toString().trim();
            String passwordStr = password_et.getText().toString().trim();

            if (email_et != null && emailStr.length() == 0) {
                showErrorMessage(getString(R.string.login_error), getString(R.string.error_enter_email));
                email_et.requestFocus();
            } else if (password_et != null && passwordStr.length() == 0) {
                showErrorMessage(getString(R.string.login_error), getString(R.string.error_enter_password));
                password_et.requestFocus();
            } else {
                email_et.setEnabled(false);
                password_et.setEnabled(false);
                forgotPassword_tv.setEnabled(false);
                eulaTv.setEnabled(false);

                clearDialogs();

                LoginTask logintask = new LoginTask(this, email_et.getText().toString().trim(),
                        password_et.getText().toString()) {
                    @Override
                    public void onSuccess(AuthResponse result) {
                        try {
                            if (result != null && result.hasValidProfile()) {
                                onUserLoginSuccess(result.profile);
                            } else {
                                LoginErrorMessage errorMsg = new LoginErrorMessage(getString(R.string.login_error),
                                        getString(R.string.login_failed));
                                throw new LoginException(errorMsg);
                            }
                        } catch (LoginException ex) {
                            logger.error(ex);
                            handle(ex);
                        }
                    }

                    @Override
                    public void onException(Exception ex) {
                        onUserLoginFailure(ex, null, null);
                    }

                };

                tryToSetUIInteraction(false);
                logintask.setProgressDialog(progressbar);
                logintask.execute();
            }
        } else {
            showErrorMessage(getString(R.string.no_connectivity), getString(R.string.network_not_connected));
        }
    }

    @Override
    protected void onStop() {
        super.onStop();

        socialLoginDelegate.onActivityStopped();
    }

    public String getEmail() {
        String email = email_et.getText().toString().trim();

        return email;
    }

    private void showResetPasswordDialog() {
        clearDialogs();
        resetDialog = new ResetPasswordDialog() {
            @Override
            protected void onResetSuccessful() {
                super.onResetSuccessful();
                if (isActivityStarted())
                    showResetSuccessDialog();
            }

            @Override
            protected void onResetFailed(ResetPasswordResponse result) {
                super.onResetFailed(result);
                showResetFailure(result.getPrimaryReason());
            }
        };
        Bundle bundle = new Bundle();
        bundle.putString("login_email", getEmail());
        resetDialog.setArguments(bundle);
        resetDialog.show(getSupportFragmentManager(), "show");
    }

    public void showResetSuccessDialog() {
        Map<String, String> dialogMap = new HashMap<String, String>();
        dialogMap.put("title", getString(R.string.success_dialog_title_help));
        dialogMap.put("message_1", getString(R.string.success_dialog_message_help));

        successFragment = SuccessDialogFragment.newInstance(dialogMap);
        successFragment.setStyle(DialogFragment.STYLE_NO_TITLE, 0);
        successFragment.show(getSupportFragmentManager(), "dialog");
    }

    public void showEulaDialog() {
        clearDialogs();
        showWebDialog(getString(R.string.eula_file_link), true, getString(R.string.end_user_title));
    }

    public void showResetFailure(String text) {
        Map<String, String> dialogMap = new HashMap<String, String>();
        dialogMap.put("title", getString(R.string.title_reset_password_failed));
        dialogMap.put("message_1", text);

        successFragment = SuccessDialogFragment.newInstance(dialogMap);
        successFragment.setStyle(DialogFragment.STYLE_NO_TITLE, 0);
        successFragment.show(getSupportFragmentManager(), "dialog");

    }

    public void showNoNetworkDialog() {
        Bundle args = new Bundle();
        args.putString(SimpleAlertDialog.EXTRA_TITLE, getString(R.string.reset_no_network_title));
        args.putString(SimpleAlertDialog.EXTRA_MESSAGE, getString(R.string.reset_no_network_message));

        NoNetworkFragment = SimpleAlertDialog.newInstance(args);
        NoNetworkFragment.setStyle(DialogFragment.STYLE_NO_TITLE, 0);
        NoNetworkFragment.show(getSupportFragmentManager(), "dialog");
    }

    @Override
    public boolean showErrorMessage(String header, String message, boolean isPersistent) {
        if (message != null) {
            return super.showErrorMessage(header, message, isPersistent);
        } else {
            return super.showErrorMessage(header, getString(R.string.login_failed), isPersistent);
        }
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        Animation errorMessageAnim = errorLayout.getAnimation();
        if (errorMessageAnim == null || errorMessageAnim.hasEnded()) {
            ViewAnimationUtil.hideMessageBar(errorLayout);
        }
        return super.dispatchTouchEvent(ev);
    }

    @Override
    protected void onOnline() {
        super.onOnline();
        hideErrorMessage();
    }

    @Override
    protected void onOffline() {
        super.onOffline();
        showErrorMessage(getString(R.string.no_connectivity), getString(R.string.network_not_connected), false);
    }

    private void myCourseScreen() {
        if (isActivityStarted()) {
            // do NOT launch next screen if app minimized
            environment.getRouter().showMyCourses(this);
            // but finish this screen anyways as login is succeeded
            finish();
        }
    }

    private void clearDialogs() {
        if (resetDialog != null) {
            resetDialog.dismiss();
        }
    }

    @Override
    public boolean createOptionsMenu(Menu menu) {
        // Login screen doesn't have any menu
        return true;
    }

    /**
     * Starts fetching profile of the user after login by Facebook or Google.
     *
     * @param accessToken
     * @param backend
     */
    public void onSocialLoginSuccess(String accessToken, String backend, Task task) {
        tryToSetUIInteraction(false);
        task.setProgressDialog(progressbar);
    }

    public void onUserLoginSuccess(ProfileModel profile) throws LoginException {

        // save this email id
        PrefManager pref = new PrefManager(this, PrefManager.Pref.LOGIN);
        pref.put("email", email_et.getText().toString().trim());

        pref.put(PrefManager.Key.TRANSCRIPT_LANGUAGE, "none");

        environment.getSegment().identifyUser(profile.id.toString(), profile.email,
                email_et.getText().toString().trim());

        String backendKey = pref.getString(PrefManager.Key.SEGMENT_KEY_BACKEND);
        if (backendKey != null) {
            environment.getSegment().trackUserLogin(backendKey);
        }

        //segIO.trackDeviceDetails();
        environment.getNotificationDelegate().resubscribeAll();

        myCourseScreen();
    }

    public void onUserLoginFailure(Exception ex, String accessToken, String backend) {
        tryToSetUIInteraction(true);

        // handle if this is a LoginException
        if (ex != null && ex instanceof LoginException) {
            LoginErrorMessage error = (((LoginException) ex).getLoginErrorMessage());

            showErrorMessage(error.getMessageLine1(),
                    (error.getMessageLine2() != null) ? error.getMessageLine2() : getString(R.string.login_failed));
        } else {
            logger.error(ex);
        }
    }

    @Override
    public void finish() {
        super.finish();
        overridePendingTransition(R.anim.no_transition, R.anim.slide_out_to_bottom);
    }

    @Override
    public boolean tryToSetUIInteraction(boolean enable) {
        if (enable) {
            unblockTouch();
            loginButtonLayout.setBackgroundResource(R.drawable.bt_signin_active);
            loginButtonLayout.setEnabled(enable);
            login_tv.setText(getString(R.string.login));
        } else {
            blockTouch();
            loginButtonLayout.setBackgroundResource(R.drawable.new_bt_signin_active);
            loginButtonLayout.setEnabled(enable);
            login_tv.setText(getString(R.string.signing_in));
        }

        ImageView imgFacebook = (ImageView) findViewById(R.id.img_facebook);
        ImageView imgGoogle = (ImageView) findViewById(R.id.img_google);
        imgFacebook.setClickable(enable);
        imgGoogle.setClickable(enable);

        email_et.setEnabled(enable);
        password_et.setEnabled(enable);

        forgotPassword_tv.setEnabled(enable);
        eulaTv.setEnabled(enable);

        return true;
    }

}