package bf.io.openshop.ux.dialogs; import android.accounts.Account; import android.accounts.AccountManager; import android.app.Dialog; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.support.annotation.NonNull; import android.support.design.widget.TextInputLayout; import android.support.v4.app.DialogFragment; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.Button; import android.widget.EditText; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.RadioButton; import android.widget.TextView; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.VolleyError; import com.facebook.AccessToken; import com.facebook.CallbackManager; import com.facebook.FacebookCallback; import com.facebook.FacebookException; import com.facebook.GraphRequest; import com.facebook.GraphResponse; import com.facebook.login.LoginManager; import com.facebook.login.LoginResult; import org.json.JSONException; import org.json.JSONObject; import java.util.Arrays; import bf.io.openshop.BuildConfig; import bf.io.openshop.CONST; import bf.io.openshop.MyApplication; import bf.io.openshop.R; import bf.io.openshop.SettingsMy; import bf.io.openshop.api.EndPoints; import bf.io.openshop.api.GsonRequest; import bf.io.openshop.api.JsonRequest; import bf.io.openshop.entities.User; import bf.io.openshop.interfaces.LoginDialogInterface; import bf.io.openshop.listeners.OnSingleClickListener; import bf.io.openshop.listeners.OnTouchPasswordListener; import bf.io.openshop.utils.JsonUtils; import bf.io.openshop.utils.MsgUtils; import bf.io.openshop.utils.Utils; import bf.io.openshop.ux.MainActivity; import timber.log.Timber; /** * Dialog handles user login, registration and forgotten password function. */ public class LoginDialogFragment extends DialogFragment implements FacebookCallback<LoginResult> { public static final String MSG_RESPONSE = "response: %s"; private CallbackManager callbackManager; private LoginDialogInterface loginDialogInterface; private ProgressDialog progressDialog; private FormState actualFormState = FormState.BASE; private LinearLayout loginBaseForm; private LinearLayout loginRegistrationForm; private LinearLayout loginEmailForm; private LinearLayout loginEmailForgottenForm; private TextInputLayout loginRegistrationEmailWrapper; private TextInputLayout loginRegistrationPasswordWrapper; private RadioButton loginRegistrationGenderWoman; private TextInputLayout loginEmailEmailWrapper; private TextInputLayout loginEmailPasswordWrapper; private TextInputLayout loginEmailForgottenEmailWrapper; /** * Creates dialog which handles user login, registration and forgotten password function. * * @param loginDialogInterface listener receiving login/registration results. * @return new instance of dialog. */ public static LoginDialogFragment newInstance(LoginDialogInterface loginDialogInterface) { LoginDialogFragment frag = new LoginDialogFragment(); frag.loginDialogInterface = loginDialogInterface; return frag; } public static void logoutUser() { LoginManager fbManager = LoginManager.getInstance(); if (fbManager != null) fbManager.logOut(); SettingsMy.setActiveUser(null); MainActivity.updateCartCountNotification(); MainActivity.invalidateDrawerMenuHeader(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setStyle(DialogFragment.STYLE_NO_TITLE, R.style.dialogFullscreen); progressDialog = Utils.generateProgressDialog(getActivity(), false); } @Override public void onStart() { super.onStart(); Dialog d = getDialog(); if (d != null) { int width = ViewGroup.LayoutParams.MATCH_PARENT; int height = ViewGroup.LayoutParams.MATCH_PARENT; Window window = d.getWindow(); window.setLayout(width, height); window.setWindowAnimations(R.style.dialogFragmentAnimation); d.setOnKeyListener(new DialogInterface.OnKeyListener() { @Override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { if (BuildConfig.DEBUG) Timber.d("onKey: %d (Back=%d). Event:%d (Down:%d, Up:%d)", keyCode, KeyEvent.KEYCODE_BACK, event.getAction(), KeyEvent.ACTION_DOWN, KeyEvent.ACTION_UP); if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { switch (actualFormState) { case REGISTRATION: if (event.getAction() == KeyEvent.ACTION_UP) { setVisibilityOfRegistrationForm(false); } return true; case FORGOTTEN_PASSWORD: if (event.getAction() == KeyEvent.ACTION_UP) { setVisibilityOfEmailForgottenForm(false); } return true; case EMAIL: if (event.getAction() == KeyEvent.ACTION_UP) { setVisibilityOfEmailForm(false); } return true; default: return false; } } return false; } }); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Timber.d("%s - OnCreateView", this.getClass().getSimpleName()); View view = inflater.inflate(R.layout.dialog_login, container, false); callbackManager = CallbackManager.Factory.create(); loginBaseForm = (LinearLayout) view.findViewById(R.id.login_base_form); loginRegistrationForm = (LinearLayout) view.findViewById(R.id.login_registration_form); loginEmailForm = (LinearLayout) view.findViewById(R.id.login_email_form); loginEmailForgottenForm = (LinearLayout) view.findViewById(R.id.login_email_forgotten_form); prepareLoginFormNavigation(view); prepareInputBoxes(view); prepareActionButtons(view); return view; } private void prepareInputBoxes(View view) { // Registration form loginRegistrationEmailWrapper = (TextInputLayout) view.findViewById(R.id.login_registration_email_wrapper); loginRegistrationPasswordWrapper = (TextInputLayout) view.findViewById(R.id.login_registration_password_wrapper); loginRegistrationGenderWoman = (RadioButton) view.findViewById(R.id.login_registration_sex_woman); EditText registrationPassword = loginRegistrationPasswordWrapper.getEditText(); if (registrationPassword != null) { registrationPassword.setOnTouchListener(new OnTouchPasswordListener(registrationPassword)); } // Login email form loginEmailEmailWrapper = (TextInputLayout) view.findViewById(R.id.login_email_email_wrapper); EditText loginEmail = loginEmailEmailWrapper.getEditText(); if (loginEmail != null) loginEmail.setText(SettingsMy.getUserEmailHint()); loginEmailPasswordWrapper = (TextInputLayout) view.findViewById(R.id.login_email_password_wrapper); EditText emailPassword = loginEmailPasswordWrapper.getEditText(); if (emailPassword != null) { emailPassword.setOnTouchListener(new OnTouchPasswordListener(emailPassword)); emailPassword.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_SEND || actionId == 124) { invokeLoginWithEmail(); return true; } return false; } }); } loginEmailForgottenEmailWrapper = (TextInputLayout) view.findViewById(R.id.login_email_forgotten_email_wrapper); EditText emailForgottenPassword = loginEmailForgottenEmailWrapper.getEditText(); if (emailForgottenPassword != null) emailForgottenPassword.setText(SettingsMy.getUserEmailHint()); // Simple accounts whisperer. Account[] accounts = AccountManager.get(getActivity()).getAccounts(); String[] addresses = new String[accounts.length]; for (int i = 0; i < accounts.length; i++) { addresses[i] = accounts[i].name; Timber.e("Sets autocompleteEmails: %s", accounts[i].name); } ArrayAdapter<String> emails = new ArrayAdapter<>(getActivity(), android.R.layout.simple_dropdown_item_1line, addresses); AutoCompleteTextView textView = (AutoCompleteTextView) view.findViewById(R.id.login_registration_email_text_auto); textView.setAdapter(emails); } private void prepareLoginFormNavigation(View view) { // Login email Button loginFormEmailButton = (Button) view.findViewById(R.id.login_form_email_btn); loginFormEmailButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { setVisibilityOfEmailForm(true); } }); ImageButton closeEmailBtn = (ImageButton) view.findViewById(R.id.login_email_close_button); closeEmailBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Slow to display ripple effect (new Handler()).postDelayed(new Runnable() { @Override public void run() { setVisibilityOfEmailForm(false); } }, 200); } }); // Registration TextView loginFormRegistrationButton = (TextView) view.findViewById(R.id.login_form_registration_btn); loginFormRegistrationButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { setVisibilityOfRegistrationForm(true); } }); ImageButton closeRegistrationBtn = (ImageButton) view.findViewById(R.id.login_registration_close_button); closeRegistrationBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Slow to display ripple effect (new Handler()).postDelayed(new Runnable() { @Override public void run() { setVisibilityOfRegistrationForm(false); } }, 200); } }); // Email forgotten password TextView loginEmailFormForgottenButton = (TextView) view.findViewById(R.id.login_email_forgotten_password); loginEmailFormForgottenButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { setVisibilityOfEmailForgottenForm(true); } }); ImageButton closeEmailForgottenFormBtn = (ImageButton) view.findViewById(R.id.login_email_forgotten_back_button); closeEmailForgottenFormBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Slow to display ripple effect (new Handler()).postDelayed(new Runnable() { @Override public void run() { setVisibilityOfEmailForgottenForm(false); } }, 200); } }); } private void prepareActionButtons(View view) { TextView loginBaseSkip = (TextView) view.findViewById(R.id.login_form_skip); loginBaseSkip.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // if (loginDialogInterface != null) loginDialogInterface.skipLogin(); dismiss(); } }); // FB login Button fbLogin = (Button) view.findViewById(R.id.login_form_facebook); fbLogin.setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View v) { invokeFacebookLogin(); } }); Button emailLogin = (Button) view.findViewById(R.id.login_email_confirm); emailLogin.setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View v) { invokeLoginWithEmail(); } }); Button registerBtn = (Button) view.findViewById(R.id.login_registration_confirm); registerBtn.setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View v) { invokeRegisterNewUser(); } }); Button resetPassword = (Button) view.findViewById(R.id.login_email_forgotten_confirm); resetPassword.setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View v) { invokeResetPassword(); } }); } private void invokeFacebookLogin() { LoginManager.getInstance().registerCallback(callbackManager, this); LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "email")); } private void invokeRegisterNewUser() { hideSoftKeyboard(); if (isRequiredFields(loginRegistrationEmailWrapper, loginRegistrationPasswordWrapper)) { // SettingsMy.setUserEmailHint(etRegistrationEmail.getText().toString()); registerNewUser(loginRegistrationEmailWrapper.getEditText(), loginRegistrationPasswordWrapper.getEditText()); } } private void registerNewUser(EditText editTextEmail, EditText editTextPassword) { SettingsMy.setUserEmailHint(editTextEmail.getText().toString()); String url = String.format(EndPoints.USER_REGISTER, SettingsMy.getActualNonNullShop(getActivity()).getId()); progressDialog.show(); // get selected radio button from radioGroup JSONObject jo = new JSONObject(); try { jo.put(JsonUtils.TAG_EMAIL, editTextEmail.getText().toString().trim()); jo.put(JsonUtils.TAG_PASSWORD, editTextPassword.getText().toString().trim()); jo.put(JsonUtils.TAG_GENDER, loginRegistrationGenderWoman.isChecked() ? "female" : "male"); } catch (JSONException e) { Timber.e(e, "Parse new user registration exception"); MsgUtils.showToast(getActivity(), MsgUtils.TOAST_TYPE_INTERNAL_ERROR, null, MsgUtils.ToastLength.SHORT); return; } if (BuildConfig.DEBUG) Timber.d("Register new user: %s", jo.toString()); GsonRequest<User> registerNewUser = new GsonRequest<>(Request.Method.POST, url, jo.toString(), User.class, new Response.Listener<User>() { @Override public void onResponse(@NonNull User response) { Timber.d(MSG_RESPONSE, response.toString()); handleUserLogin(response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { if (progressDialog != null) progressDialog.cancel(); MsgUtils.logAndShowErrorMessage(getActivity(), error); } }); registerNewUser.setRetryPolicy(MyApplication.getDefaultRetryPolice()); registerNewUser.setShouldCache(false); MyApplication.getInstance().addToRequestQueue(registerNewUser, CONST.LOGIN_DIALOG_REQUESTS_TAG); } private void invokeLoginWithEmail() { hideSoftKeyboard(); if (isRequiredFields(loginEmailEmailWrapper, loginEmailPasswordWrapper)) { logInWithEmail(loginEmailEmailWrapper.getEditText(), loginEmailPasswordWrapper.getEditText()); } } private void logInWithEmail(EditText editTextEmail, EditText editTextPassword) { SettingsMy.setUserEmailHint(editTextEmail.getText().toString()); String url = String.format(EndPoints.USER_LOGIN_EMAIL, SettingsMy.getActualNonNullShop(getActivity()).getId()); progressDialog.show(); JSONObject jo; try { jo = JsonUtils.createUserAuthentication(editTextEmail.getText().toString().trim(), editTextPassword.getText().toString().trim()); editTextPassword.setText(""); } catch (JSONException e) { Timber.e(e, "Parse logInWithEmail exception"); MsgUtils.showToast(getActivity(), MsgUtils.TOAST_TYPE_INTERNAL_ERROR, null, MsgUtils.ToastLength.SHORT); return; } if (BuildConfig.DEBUG) Timber.d("Login user: %s", jo.toString()); GsonRequest<User> userLoginEmailRequest = new GsonRequest<>(Request.Method.POST, url, jo.toString(), User.class, new Response.Listener<User>() { @Override public void onResponse(@NonNull User response) { Timber.d(MSG_RESPONSE, response.toString()); handleUserLogin(response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { if (progressDialog != null) progressDialog.cancel(); MsgUtils.logAndShowErrorMessage(getActivity(), error); } }); userLoginEmailRequest.setRetryPolicy(MyApplication.getDefaultRetryPolice()); userLoginEmailRequest.setShouldCache(false); MyApplication.getInstance().addToRequestQueue(userLoginEmailRequest, CONST.LOGIN_DIALOG_REQUESTS_TAG); } private void handleUserLogin(User user) { if (progressDialog != null) progressDialog.cancel(); SettingsMy.setActiveUser(user); // Invalidate GCM token for new registration with authorized user. SettingsMy.setTokenSentToServer(false); if (getActivity() instanceof MainActivity) ((MainActivity) getActivity()).registerGcmOnServer(); MainActivity.invalidateDrawerMenuHeader(); if (loginDialogInterface != null) { loginDialogInterface.successfulLoginOrRegistration(user); } else { Timber.e("Interface is null"); MsgUtils.showToast(getActivity(), MsgUtils.TOAST_TYPE_INTERNAL_ERROR, null, MsgUtils.ToastLength.SHORT); } dismiss(); } private void invokeResetPassword() { EditText emailForgottenPasswordEmail = loginEmailForgottenEmailWrapper.getEditText(); if (emailForgottenPasswordEmail == null || emailForgottenPasswordEmail.getText().toString().equalsIgnoreCase("")) { loginEmailForgottenEmailWrapper.setErrorEnabled(true); loginEmailForgottenEmailWrapper.setError(getString(R.string.Required_field)); } else { loginEmailForgottenEmailWrapper.setErrorEnabled(false); resetPassword(emailForgottenPasswordEmail); } } private void resetPassword(EditText emailOfForgottenPassword) { String url = String.format(EndPoints.USER_RESET_PASSWORD, SettingsMy.getActualNonNullShop(getActivity()).getId()); progressDialog.show(); JSONObject jo = new JSONObject(); try { jo.put(JsonUtils.TAG_EMAIL, emailOfForgottenPassword.getText().toString().trim()); } catch (JSONException e) { Timber.e(e, "Parse resetPassword exception"); MsgUtils.showToast(getActivity(), MsgUtils.TOAST_TYPE_INTERNAL_ERROR, null, MsgUtils.ToastLength.SHORT); return; } if (BuildConfig.DEBUG) Timber.d("Reset password email: %s", jo.toString()); JsonRequest req = new JsonRequest(Request.Method.POST, url, jo, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { Timber.d("Reset password on url success. Response: %s", response.toString()); progressDialog.cancel(); MsgUtils.showToast(getActivity(), MsgUtils.TOAST_TYPE_MESSAGE, getString(R.string.Check_your_email_we_sent_you_an_confirmation_email), MsgUtils.ToastLength.LONG); setVisibilityOfEmailForgottenForm(false); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { if (progressDialog != null) progressDialog.cancel(); MsgUtils.logAndShowErrorMessage(getActivity(), error); } }); req.setRetryPolicy(MyApplication.getDefaultRetryPolice()); req.setShouldCache(false); MyApplication.getInstance().addToRequestQueue(req, CONST.LOGIN_DIALOG_REQUESTS_TAG); } private void hideSoftKeyboard() { if (getActivity() != null && getView() != null) { InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(getView().getWindowToken(), 0); } } private void setVisibilityOfRegistrationForm(boolean setVisible) { if (setVisible) { actualFormState = FormState.REGISTRATION; loginBaseForm.setVisibility(View.INVISIBLE); loginRegistrationForm.setVisibility(View.VISIBLE); } else { actualFormState = FormState.BASE; loginBaseForm.setVisibility(View.VISIBLE); loginRegistrationForm.setVisibility(View.INVISIBLE); hideSoftKeyboard(); } } private void setVisibilityOfEmailForm(boolean setVisible) { if (setVisible) { actualFormState = FormState.EMAIL; loginBaseForm.setVisibility(View.INVISIBLE); loginEmailForm.setVisibility(View.VISIBLE); } else { actualFormState = FormState.BASE; loginBaseForm.setVisibility(View.VISIBLE); loginEmailForm.setVisibility(View.INVISIBLE); hideSoftKeyboard(); } } private void setVisibilityOfEmailForgottenForm(boolean setVisible) { if (setVisible) { actualFormState = FormState.FORGOTTEN_PASSWORD; loginEmailForm.setVisibility(View.INVISIBLE); loginEmailForgottenForm.setVisibility(View.VISIBLE); } else { actualFormState = FormState.EMAIL; loginEmailForm.setVisibility(View.VISIBLE); loginEmailForgottenForm.setVisibility(View.INVISIBLE); } hideSoftKeyboard(); } /** * Check if editTexts are valid view and if user set all required fields. * * @return true if ok. */ private boolean isRequiredFields(TextInputLayout emailWrapper, TextInputLayout passwordWrapper) { if (emailWrapper == null || passwordWrapper == null) { Timber.e(new RuntimeException(), "Called isRequiredFields with null parameters."); MsgUtils.showToast(getActivity(), MsgUtils.TOAST_TYPE_INTERNAL_ERROR, null, MsgUtils.ToastLength.LONG); return false; } else { EditText email = emailWrapper.getEditText(); EditText password = passwordWrapper.getEditText(); if (email == null || password == null) { Timber.e(new RuntimeException(), "Called isRequiredFields with null editTexts in wrappers."); MsgUtils.showToast(getActivity(), MsgUtils.TOAST_TYPE_INTERNAL_ERROR, null, MsgUtils.ToastLength.LONG); return false; } else { boolean isEmail = false; boolean isPassword = false; if (email.getText().toString().equalsIgnoreCase("")) { emailWrapper.setErrorEnabled(true); emailWrapper.setError(getString(R.string.Required_field)); } else { emailWrapper.setErrorEnabled(false); isEmail = true; } if (password.getText().toString().equalsIgnoreCase("")) { passwordWrapper.setErrorEnabled(true); passwordWrapper.setError(getString(R.string.Required_field)); } else { passwordWrapper.setErrorEnabled(false); isPassword = true; } if (isEmail && isPassword) { return true; } else { Timber.e("Some fields are required."); return false; } } } } @Override public void onStop() { super.onStop(); MyApplication.getInstance().getRequestQueue().cancelAll(CONST.LOGIN_DIALOG_REQUESTS_TAG); } @Override public void onDetach() { loginDialogInterface = null; super.onDetach(); } @Override public void onSuccess(final LoginResult loginResult) { Timber.d("FB login success"); if (loginResult == null) { Timber.e("Fb login succeed with null loginResult."); handleNonFatalError(getString(R.string.Facebook_login_failed), true); } else { Timber.d("Result: %s", loginResult.toString()); GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() { @Override public void onCompleted(JSONObject object, GraphResponse response) { if (response != null && response.getError() == null) { verifyUserOnApi(object, loginResult.getAccessToken()); } else { Timber.e("Error on receiving user profile information."); if (response != null && response.getError() != null) { Timber.e(new RuntimeException(), "Error: %s", response.getError().toString()); } handleNonFatalError(getString(R.string.Receiving_facebook_profile_failed), true); } } }); Bundle parameters = new Bundle(); parameters.putString("fields", "id,name,email,gender"); request.setParameters(parameters); request.executeAsync(); } } @Override public void onCancel() { Timber.d("Fb login canceled"); } @Override public void onError(FacebookException e) { Timber.e(e, "Fb login error"); handleNonFatalError(getString(R.string.Facebook_login_failed), false); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (callbackManager != null) callbackManager.onActivityResult(requestCode, resultCode, data); else { Timber.d("OnActivityResult, null callbackManager object."); } } /** * Volley request that sends FB_ID and FB_ACCESS_TOKEN to API */ private void verifyUserOnApi(JSONObject userProfileObject, AccessToken fbAccessToken) { String url = String.format(EndPoints.USER_LOGIN_FACEBOOK, SettingsMy.getActualNonNullShop(getActivity()).getId()); JSONObject jo = new JSONObject(); try { jo.put(JsonUtils.TAG_FB_ID, userProfileObject.getString("id")); jo.put(JsonUtils.TAG_FB_ACCESS_TOKEN, fbAccessToken.getToken()); } catch (JSONException e) { Timber.e(e, "Exception while parsing fb user."); MsgUtils.showToast(getActivity(), MsgUtils.TOAST_TYPE_INTERNAL_ERROR, null, MsgUtils.ToastLength.LONG); return; } progressDialog.show(); GsonRequest<User> verifyFbUser = new GsonRequest<>(Request.Method.POST, url, jo.toString(), User.class, new Response.Listener<User>() { @Override public void onResponse(@NonNull User response) { Timber.d(MSG_RESPONSE, response.toString()); handleUserLogin(response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { if (progressDialog != null) progressDialog.cancel(); MsgUtils.logAndShowErrorMessage(getActivity(), error); LoginDialogFragment.logoutUser(); } }, getFragmentManager(), null); verifyFbUser.setRetryPolicy(MyApplication.getDefaultRetryPolice()); verifyFbUser.setShouldCache(false); MyApplication.getInstance().addToRequestQueue(verifyFbUser, CONST.LOGIN_DIALOG_REQUESTS_TAG); } /** * Handle errors, when user have identity at least. * Show error message to user. */ private void handleNonFatalError(String message, boolean logoutFromFb) { if (logoutFromFb) { LoginDialogFragment.logoutUser(); } if (getActivity() != null) MsgUtils.showToast(getActivity(), MsgUtils.TOAST_TYPE_MESSAGE, message, MsgUtils.ToastLength.LONG); } private enum FormState { BASE, REGISTRATION, EMAIL, FORGOTTEN_PASSWORD } }