/*
* 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.ui.view.fragment;
import android.accounts.AccountManager;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.Toast;
import com.jaspersoft.android.jaspermobile.R;
import com.jaspersoft.android.jaspermobile.dialog.ProgressDialogFragment;
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.internal.di.components.AuthenticatorActivityComponent;
import com.jaspersoft.android.jaspermobile.ui.contract.AuthenticationContract;
import com.jaspersoft.android.jaspermobile.ui.page.AuthPageState;
import com.jaspersoft.android.jaspermobile.ui.presenter.AuthenticationPresenter;
import com.jaspersoft.android.jaspermobile.ui.view.activity.AuthenticatorActivity;
import com.jaspersoft.android.jaspermobile.util.BaseUrlNormalizer;
import com.jaspersoft.android.jaspermobile.util.SimpleTextWatcher;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EFragment;
import org.androidannotations.annotations.InstanceState;
import org.androidannotations.annotations.ViewById;
import javax.inject.Inject;
import javax.inject.Named;
/**
* @author Tom Koptel
* @since 2.0
*/
@EFragment(R.layout.add_account_layout)
public class AuthenticatorFragment extends BaseFragment implements AuthenticationContract.View {
private static final String ALIAS = "Mobile Demo";
private static final String SERVER_URL = "https://mobiledemo.jaspersoft.com/jasperserver-pro";
private static final String ORGANIZATION = "organization_1";
private static final String USERNAME = "phoneuser";
private static final String PASSWORD = "phoneuser";
@ViewById
protected EditText aliasEdit;
@ViewById
protected EditText usernameEdit;
@ViewById
protected EditText organizationEdit;
@ViewById
protected EditText serverUrlEdit;
@ViewById
protected EditText passwordEdit;
@ViewById(R.id.tryDemoContainer)
protected ViewGroup tryDemoLayout;
@Inject
AuthenticationPresenter mPresenter;
@Inject
AuthenticationContract.ActionListener mActionListener;
@InstanceState
AuthPageState mState = new AuthPageState();
@Inject
@Named("accountType")
String accountType;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
if (mPresenter == null) {
injectComponents();
}
}
private void injectComponents() {
getComponent(AuthenticatorActivityComponent.class).inject(this);
mPresenter.injectView(this);
}
@AfterViews
void init() {
showTryDemo(false);
mActionListener.checkDemoAccountAvailability();
setOnTypeErrorClearListeners();
}
@Click
void addAccount() {
String alias = aliasEdit.getText().toString();
String serverUrl = serverUrlEdit.getText().toString();
String username = usernameEdit.getText().toString();
String password = passwordEdit.getText().toString();
String organization = organizationEdit.getText().toString();
saveProfile(alias, serverUrl, username, password, organization);
}
@Click
void tryDemo() {
saveProfile(ALIAS, SERVER_URL, USERNAME, PASSWORD, ORGANIZATION);
}
@Override
public void onResume() {
super.onResume();
if (mPresenter != null) {
mPresenter.resume();
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (mPresenter != null) {
mPresenter.destroy();
}
}
@Override
public void onPause() {
super.onPause();
if (mPresenter != null) {
mPresenter.pause();
}
}
@Override
public void showLoading() {
ProgressDialogFragment.builder(getFragmentManager())
.setLoadingMessage(R.string.account_add)
.show();
}
@Override
public void hideLoading() {
ProgressDialogFragment.dismiss(getFragmentManager());
}
@Override
public void showError(String message) {
Toast.makeText(getActivity(), message, Toast.LENGTH_LONG).show();
}
@Override
public void showNotification(String message) {
}
@Override
public void hideError() {
}
@Override
public void showAliasDuplicateError() {
aliasEdit.setError(getString(R.string.sp_error_duplicate_alias));
aliasEdit.requestFocus();
}
@Override
public void showAliasReservedError() {
aliasEdit.setError(getString(R.string.sp_error_reserved_alias));
aliasEdit.requestFocus();
}
@Override
public void showAliasRequiredError() {
aliasEdit.setError(getString(R.string.sp_error_field_required));
aliasEdit.requestFocus();
}
@Override
public void showServerUrlFormatError() {
serverUrlEdit.setError(getString(R.string.sp_error_url_not_valid));
serverUrlEdit.requestFocus();
}
@Override
public void showServerUrlRequiredError() {
serverUrlEdit.setError(getString(R.string.sp_error_field_required));
serverUrlEdit.requestFocus();
}
@Override
public void showUsernameRequiredError() {
usernameEdit.setError(getString(R.string.sp_error_field_required));
usernameEdit.requestFocus();
}
@Override
public void showPasswordRequiredError() {
passwordEdit.setError(getString(R.string.sp_error_field_required));
passwordEdit.requestFocus();
}
@Override
public void showServerVersionNotSupported() {
showError(getString(R.string.r_error_server_not_supported));
}
@Override
public void showFailedToAddProfile(String message) {
showError(getString(R.string.failure_add_account, message));
}
@Override
public void navigateToApp(Profile profile) {
Bundle data = new Bundle();
data.putString(AccountManager.KEY_ACCOUNT_NAME, profile.getKey());
data.putString(AccountManager.KEY_ACCOUNT_TYPE, accountType);
Intent resultIntent = new Intent();
resultIntent.putExtras(data);
getAccountAuthenticatorActivity().setAccountAuthenticatorResult(data);
getActivity().setResult(Activity.RESULT_OK, resultIntent);
getActivity().finish();
}
@Override
public void showTryDemo(boolean visible) {
tryDemoLayout.setVisibility(visible ? View.VISIBLE : View.GONE);
}
@Override
public AuthPageState getState() {
return mState;
}
private AuthenticatorActivity getAccountAuthenticatorActivity() {
if (getActivity() instanceof AuthenticatorActivity) {
return (AuthenticatorActivity) getActivity();
} else {
throw new IllegalStateException("Fragment can only be consumed " +
"within com.jaspersoft.android.jaspermobile.activities.auth.AuthenticatorActivity");
}
}
/**
* Hide error on text change.
* Paste text on Android 4.2 will not cause clearing error on editText.
*/
private void setOnTypeErrorClearListeners(){
aliasEdit.addTextChangedListener(new ErrorTextWatcher(aliasEdit));
serverUrlEdit.addTextChangedListener(new ErrorTextWatcher(serverUrlEdit));
usernameEdit.addTextChangedListener(new ErrorTextWatcher(usernameEdit));
passwordEdit.addTextChangedListener(new ErrorTextWatcher(passwordEdit));
}
private void saveProfile(
String alias,
String serverUrl,
String username,
String password,
String organization
) {
AppCredentials credentials = AppCredentials.builder()
.setUsername(username)
.setPassword(password)
.setOrganization(organization)
.create();
ProfileForm profileForm = new ProfileForm.Builder()
.setAlias(alias)
.setBaseUrl(BaseUrlNormalizer.normalize(serverUrl))
.setCredentials(credentials)
.build();
mPresenter.saveProfile(profileForm);
}
private class ErrorTextWatcher extends SimpleTextWatcher {
private EditText editText;
public ErrorTextWatcher(EditText editText) {
this.editText = editText;
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
editText.setError(null);
}
}
}