com.jaspersoft.android.jaspermobile.dialog.PasswordDialogFragment.java Source code

Java tutorial

Introduction

Here is the source code for com.jaspersoft.android.jaspermobile.dialog.PasswordDialogFragment.java

Source

/*
 * Copyright  2016 TIBCO Software,Inc.All rights reserved.
 * http://community.jaspersoft.com/project/jaspermobile-android
 *
 * Unless you have purchased a commercial license agreement from TIBCO Jaspersoft,
 * the following license terms apply:
 *
 * This program is part of TIBCO Jaspersoft Mobile for Android.
 *
 * TIBCO Jaspersoft Mobile is free software:you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation,either version 3of the License,or
 * (at your option)any later version.
 *
 * TIBCO Jaspersoft Mobile is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY;without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with TIBCO Jaspersoft Mobile for Android.If not,see
 * <http://www.gnu.org/licenses/lgpl>.
 */

package com.jaspersoft.android.jaspermobile.dialog;

import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AlertDialog;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.jaspersoft.android.jaspermobile.R;
import com.jaspersoft.android.jaspermobile.domain.AppCredentials;
import com.jaspersoft.android.jaspermobile.domain.Profile;
import com.jaspersoft.android.jaspermobile.domain.ProfileForm;
import com.jaspersoft.android.jaspermobile.domain.SimpleSubscriber;
import com.jaspersoft.android.jaspermobile.domain.interactor.profile.CheckPasswordUseCase;
import com.jaspersoft.android.jaspermobile.domain.interactor.profile.GetCurrentProfileFormUseCase;
import com.jaspersoft.android.jaspermobile.ui.view.activity.NavigationActivity_;
import com.jaspersoft.android.jaspermobile.ui.view.fragment.ComponentProviderDelegate;
import com.jaspersoft.android.sdk.service.exception.ServiceException;
import com.jaspersoft.android.sdk.service.exception.StatusCodes;

import org.androidannotations.annotations.EFragment;

import javax.inject.Inject;

import rx.Subscriber;

/**
 * @author Tom Koptel
 * @since 1.9
 */
@EFragment
public class PasswordDialogFragment extends DialogFragment implements DialogInterface.OnShowListener {

    private static final String TAG = PasswordDialogFragment.class.getSimpleName();

    private EditText passwordField;
    private View dialogView;
    private Toast mToast;

    @Inject
    GetCurrentProfileFormUseCase mGetCurrentProfileFormUseCase;
    @Inject
    CheckPasswordUseCase mCheckPasswordUseCase;

    //---------------------------------------------------------------------
    // Static methods
    //---------------------------------------------------------------------

    public static void show(FragmentManager fm) {
        PasswordDialogFragment dialogFragment = (PasswordDialogFragment) fm.findFragmentByTag(TAG);
        if (dialogFragment == null) {
            dialogFragment = PasswordDialogFragment_.builder().build();
            dialogFragment.show(fm, TAG);
        }
    }

    //---------------------------------------------------------------------
    // Public methods
    //---------------------------------------------------------------------

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ComponentProviderDelegate.INSTANCE.getBaseActivityComponent(getActivity()).inject(this);

        mToast = Toast.makeText(getActivity(), "", Toast.LENGTH_LONG);
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        LayoutInflater inflater = LayoutInflater.from(getActivity());
        dialogView = inflater.inflate(R.layout.dialog_password, null);
        mGetCurrentProfileFormUseCase.execute(new SimpleSubscriber<ProfileForm>() {
            @Override
            public void onError(Throwable e) {
                showError(e.getLocalizedMessage());
            }

            @Override
            public void onNext(ProfileForm form) {
                populateForm(form);
            }
        });

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
                .setTitle(R.string.h_ad_title_server_sign_in).setIcon(android.R.drawable.ic_dialog_alert)
                .setView(dialogView).setCancelable(true).setPositiveButton(R.string.ok, null)
                .setNegativeButton(R.string.cancel, null);

        AlertDialog dialog = builder.create();
        dialog.setOnShowListener(this);

        return dialog;
    }

    private void populateForm(ProfileForm formData) {
        Profile profile = formData.getProfile();
        AppCredentials credentials = formData.getCredentials();

        String alias = profile.getKey();
        String username = credentials.getUsername();
        String organization = credentials.getOrganization();

        ((TextView) dialogView.findViewById(R.id.tv_alias)).setText(alias);
        ((TextView) dialogView.findViewById(R.id.tv_username)).setText(username);

        TextView organizationField = (TextView) dialogView.findViewById(R.id.tv_organization);
        organizationField.setText(organization);

        if (TextUtils.isEmpty(organization)) {
            dialogView.findViewById(R.id.tv_organization_hint).setVisibility(View.GONE);
            organizationField.setVisibility(View.GONE);
        }
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        if (mToast != null) {
            mToast.cancel();
        }
        mGetCurrentProfileFormUseCase.unsubscribe();
        mCheckPasswordUseCase.unsubscribe();
    }

    @Override
    public void onShow(DialogInterface dialogInterface) {
        AlertDialog dialog = ((AlertDialog) dialogInterface);
        passwordField = (EditText) dialog.findViewById(R.id.et_new_password);
        dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new PasswordDialogOkClickListener());
    }

    private void tryToLogin(String password) {
        mCheckPasswordUseCase.execute(password, new Subscriber<Void>() {
            @Override
            public void onStart() {
                showLoader();
            }

            @Override
            public void onCompleted() {
                hideLoader();
            }

            @Override
            public void onError(Throwable e) {
                if (e instanceof ServiceException) {
                    ServiceException serviceException = (ServiceException) e;
                    int code = serviceException.code();
                    if (code == StatusCodes.AUTHORIZATION_ERROR) {
                        showError(getString(R.string.r_error_incorrect_credentials));
                    }
                } else {
                    showError(e.getLocalizedMessage());
                }
                hideLoader();
            }

            @Override
            public void onNext(Void item) {
                dismiss();

                Intent restartIntent = NavigationActivity_.intent(getActivity()).get();
                restartIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                getActivity().finish();
                getActivity().startActivity(restartIntent);
            }
        });
    }

    private void showLoader() {
        ProgressDialogFragment.builder(getFragmentManager()).setLoadingMessage(R.string.loading_msg).show();
    }

    private void hideLoader() {
        ProgressDialogFragment.dismiss(getFragmentManager());
    }

    private void showError(String message) {
        mToast.setText(message);
        mToast.show();
    }

    //---------------------------------------------------------------------
    // Nested classes
    //---------------------------------------------------------------------

    private class PasswordDialogOkClickListener implements View.OnClickListener {
        @Override
        public void onClick(View v) {
            String password = passwordField.getText().toString().trim();
            if (TextUtils.isEmpty(password)) {
                passwordField.setError(getString(R.string.sp_error_field_required));
            } else {
                tryToLogin(password);
            }
        }
    }
}