package com.wigwamlabs.spotify.ui; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.DialogFragment; import android.content.DialogInterface; import android.os.Bundle; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager; import android.view.inputmethod.EditorInfo; import android.widget.EditText; import android.widget.TextView; import com.wigwamlabs.spotify.R; import com.wigwamlabs.spotify.SpotifyError; @SuppressWarnings("WeakerAccess") public class LoginDialogFragment extends DialogFragment { private EditText mUsername; private EditText mPassword; private TextView mErrorMessage; private View mButton; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final Activity activity = getActivity(); final View root = LayoutInflater.from(activity).inflate(R.layout.dialog_login, null, false); final View.OnFocusChangeListener focusChangeListener = new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { ViewUtils.showSoftInput(v); } } }; mUsername = (EditText) root.findViewById(R.id.username); mUsername.setOnFocusChangeListener(focusChangeListener); mPassword = (EditText) root.findViewById(R.id.password); mPassword.setOnFocusChangeListener(focusChangeListener); mPassword.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == R.id.actionLogin || actionId == EditorInfo.IME_NULL) { login(); return true; } return false; } }); mErrorMessage = (TextView) root.findViewById(R.id.errorMessage); mButton = root.findViewById(R.id.login); mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { login(); } }); final AlertDialog dialog = new AlertDialog.Builder(activity) .setView(root) .create(); dialog.setCanceledOnTouchOutside(false); dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); return dialog; } @Override public void onCancel(DialogInterface dialog) { // quite the activity since the user isn't logging in getActivity().finish(); } private void login() { final String username = mUsername.getText().toString().trim(); final String password = mPassword.getText().toString().trim(); EditText firstError = null; if (username.length() == 0) { mUsername.setError(getString(R.string.loginUsernameRequired)); //noinspection ConstantConditions if (firstError == null) { firstError = mUsername; } } else { mUsername.setError(null); } if (password.length() == 0) { mPassword.setError(getString(R.string.loginPasswordRequired)); if (firstError == null) { firstError = mPassword; } } else { mPassword.setError(null); } if (firstError == null) { ViewUtils.hideSoftInput(mUsername); mErrorMessage.setVisibility(View.GONE); mUsername.setEnabled(false); mPassword.setEnabled(false); mButton.setEnabled(false); final SpotifyActivity activity = (SpotifyActivity) getActivity(); activity.getSpotifySession().login(username, password); } else { firstError.requestFocus(); } } public void onLoggedIn(int error) { mUsername.setEnabled(true); mPassword.setEnabled(true); mButton.setEnabled(true); final int errorResourceId; switch (error) { case SpotifyError.OK: errorResourceId = 0; break; case SpotifyError.UNABLE_TO_CONTACT_SERVER: errorResourceId = R.string.loginErrorUnableToContactServer; break; case SpotifyError.BAD_USERNAME_OR_PASSWORD: errorResourceId = R.string.loginErrorBadUsernameOrPassword; break; case SpotifyError.USER_BANNED: errorResourceId = R.string.loginErrorUserBanned; break; case SpotifyError.USER_NEEDS_PREMIUM: errorResourceId = R.string.loginErrorUserNeedsPremium; break; case SpotifyError.CLIENT_TOO_OLD: errorResourceId = R.string.loginErrorClientTooOld; break; case SpotifyError.OTHER_PERMANENT: errorResourceId = R.string.loginErrorPermanent; break; default: case SpotifyError.OTHER_TRANSIENT: errorResourceId = R.string.loginErrorTransient; break; } if (errorResourceId == 0) { mErrorMessage.setVisibility(View.GONE); } else { mErrorMessage.setText(errorResourceId); mErrorMessage.setVisibility(View.VISIBLE); } if (error == SpotifyError.BAD_USERNAME_OR_PASSWORD) { mUsername.requestFocus(); } } }