package com.uservoice.uservoicesdk.flow; import android.support.v4.app.FragmentActivity; import com.uservoice.uservoicesdk.Session; import com.uservoice.uservoicesdk.babayaga.Babayaga; import com.uservoice.uservoicesdk.dialog.PasswordDialogFragment; import com.uservoice.uservoicesdk.dialog.SigninDialogFragment; 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; public class SigninManager { private final Runnable callback; private final FragmentActivity activity; private String email; private String name; private boolean passwordOnly; private SigninManager(FragmentActivity activity, String email, String name, Runnable callback) { this.activity = activity; this.email = email == null || email.trim().isEmpty() ? null : email; this.name = name == null || name.trim().isEmpty() ? null : name; this.callback = callback; } public static void signIn(FragmentActivity activity, Runnable callback) { new SigninManager(activity, null, null, callback).signIn(); } public static void signIn(FragmentActivity activity, String email, String name, Runnable callback) { new SigninManager(activity, email, name, callback).signIn(); } public static void signinForSubscribe(FragmentActivity activity, String email, Runnable callback) { SigninManager manager = new SigninManager(activity, email, Session.getInstance().getName(), callback); manager.setPasswordOnly(true); manager.signIn(); } private void signIn() { User currentUser = Session.getInstance().getUser(); if (currentUser != null && (email == null || email.equals(currentUser.getEmail()))) { callback.run(); } else { email = email == null ? Session.getInstance().getEmail() : email; name = name == null ? Session.getInstance().getName() : name; if (email != null) { User.discover(email, new Callback<User>() { @Override public void onModel(User model) { promptToSignIn(); } @Override public void onError(RestResult error) { createUser(); } }); } else { promptToSignIn(); } } } private void createUser() { RequestToken.getRequestToken(new DefaultCallback<RequestToken>(activity) { @Override public void onModel(RequestToken model) { Session.getInstance().setRequestToken(model); User.findOrCreate(email, name, new DefaultCallback<AccessTokenResult<User>>(activity) { @Override public void onModel(AccessTokenResult<User> model) { Session.getInstance().setUser(model.getModel()); Session.getInstance().setAccessToken(activity, model.getAccessToken()); Babayaga.track(Babayaga.Event.IDENTIFY); callback.run(); } }); } }); } private void promptToSignIn() { if (passwordOnly) { PasswordDialogFragment dialog = new PasswordDialogFragment(callback); dialog.show(activity.getSupportFragmentManager(), "PasswordDialogFragment"); } else { SigninDialogFragment dialog = new SigninDialogFragment(email, name, callback); dialog.show(activity.getSupportFragmentManager(), "SigninDialogFragment"); } } public void setPasswordOnly(boolean passwordOnly) { this.passwordOnly = passwordOnly; } }