package com.uservoice.uservoicesdk.dialog;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.uservoice.uservoicesdk.R;
import com.uservoice.uservoicesdk.Session;
import com.uservoice.uservoicesdk.babayaga.Babayaga;
import com.uservoice.uservoicesdk.model.AccessToken;
import com.uservoice.uservoicesdk.model.AccessTokenResult;
import com.uservoice.uservoicesdk.model.RequestToken;
import com.uservoice.uservoicesdk.model.User;
import com.uservoice.uservoicesdk.rest.Callback;
import com.uservoice.uservoicesdk.rest.RestResult;
import com.uservoice.uservoicesdk.ui.DefaultCallback;
import com.uservoice.uservoicesdk.ui.Utils;
@SuppressLint("ValidFragment")
public class SigninDialogFragment extends DialogFragmentBugfixed {
private EditText emailField;
private EditText nameField;
private EditText passwordField;
private View passwordFields;
private Button forgotPassword;
private String email;
private String name;
private Runnable callback;
private Runnable requestTokenCallback;
public SigninDialogFragment() {
}
public SigninDialogFragment(String email, String name, Runnable callback) {
this.email = email;
this.name = name;
this.callback = callback;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
RequestToken.getRequestToken(new DefaultCallback<RequestToken>(getActivity()) {
@Override
public void onModel(RequestToken requestToken) {
Session.getInstance().setRequestToken(requestToken);
if (requestTokenCallback != null)
requestTokenCallback.run();
}
});
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
if (!Utils.isDarkTheme(getActivity())) {
builder.setInverseBackgroundForced(true);
}
builder.setTitle(R.string.uv_signin_dialog_title);
LayoutInflater inflater = getActivity().getLayoutInflater();
View view = inflater.inflate(R.layout.uv_signin_layout, null);
emailField = (EditText) view.findViewById(R.id.uv_signin_email);
nameField = (EditText) view.findViewById(R.id.uv_signin_name);
passwordField = (EditText) view.findViewById(R.id.uv_signin_password);
passwordFields = view.findViewById(R.id.uv_signin_password_fields);
forgotPassword = (Button) view.findViewById(R.id.uv_signin_forgot_password);
passwordFields.setVisibility(View.GONE);
emailField.setText(email);
nameField.setText(name);
if (email != null)
discoverUser();
forgotPassword.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendForgotPassword();
}
});
emailField.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (v == emailField && hasFocus == false) {
discoverUser();
}
}
});
builder.setView(view);
builder.setNegativeButton(android.R.string.cancel, null);
builder.setPositiveButton(R.string.uv_signin_dialog_ok, null);
// the crap you have to do to have a button that doesn't always close the dialog
final AlertDialog dialog = builder.create();
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface di) {
Button positiveButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
positiveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
signIn();
}
});
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(emailField, InputMethodManager.SHOW_IMPLICIT);
}
});
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
return dialog;
}
private void discoverUser() {
User.discover(emailField.getText().toString(), new Callback<User>() {
@Override
public void onModel(User model) {
passwordFields.setVisibility(View.VISIBLE);
nameField.setVisibility(View.GONE);
passwordField.requestFocus();
}
@Override
public void onError(RestResult error) {
passwordFields.setVisibility(View.GONE);
nameField.setVisibility(View.VISIBLE);
nameField.requestFocus();
}
});
}
private void signIn() {
final Activity activity = getActivity();
Runnable runnable = new Runnable() {
@Override
public void run() {
if (nameField.getVisibility() == View.VISIBLE) {
User.findOrCreate(emailField.getText().toString(), nameField.getText().toString(), new DefaultCallback<AccessTokenResult<User>>(getActivity()) {
@Override
public void onModel(AccessTokenResult<User> model) {
Session.getInstance().setUser(model.getModel());
Session.getInstance().setAccessToken(activity, model.getAccessToken());
Babayaga.track(Babayaga.Event.AUTHENTICATE);
dismiss();
callback.run();
}
});
} else {
AccessToken.authorize(emailField.getText().toString(), passwordField.getText().toString(), new Callback<AccessToken>() {
@Override
public void onModel(AccessToken accessToken) {
Session.getInstance().setAccessToken(activity, accessToken);
User.loadCurrentUser(new DefaultCallback<User>(getActivity()) {
@Override
public void onModel(User model) {
Session.getInstance().setUser(model);
Babayaga.track(Babayaga.Event.AUTHENTICATE);
dismiss();
callback.run();
}
});
}
@Override
public void onError(RestResult error) {
Toast.makeText(activity, R.string.uv_failed_signin_error, Toast.LENGTH_SHORT).show();
}
});
}
}
};
if (Session.getInstance().getRequestToken() != null) {
runnable.run();
} else {
requestTokenCallback = runnable;
}
}
private void sendForgotPassword() {
final Activity activity = getActivity();
User.sendForgotPassword(emailField.getText().toString(), new DefaultCallback<User>(getActivity()) {
@Override
public void onModel(User model) {
Toast.makeText(activity, R.string.uv_msg_forgot_password, Toast.LENGTH_SHORT).show();
}
});
}
}