package org.azavea.otm.ui; import android.app.Activity; import android.app.AlertDialog; import android.os.Bundle; import android.text.Editable; import android.view.View; import android.widget.EditText; import android.widget.Toast; import com.loopj.android.http.JsonHttpResponseHandler; import org.azavea.helpers.Logger; import org.azavea.otm.App; import org.azavea.otm.LoginManager; import org.azavea.otm.R; import org.azavea.otm.rest.RequestGenerator; import org.azavea.otm.rest.handlers.LoggingJsonHttpResponseHandler; import org.json.JSONException; import org.json.JSONObject; import java.io.UnsupportedEncodingException; import cz.msebera.android.httpclient.Header; public class ChangePassword extends UpEnabledActionBarActivity { private String newPassword; LoginManager loginManager = App.getLoginManager(); private JsonHttpResponseHandler changePasswordResponseHandler = new LoggingJsonHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, JSONObject response) { try { if (response.has("username")) { loginManager.loggedInUser.setPassword(newPassword); loginManager.storePassword(newPassword); notifyUserPasswordChangedAndFinish(); } else { alert(R.string.password_change_error); } } catch (JSONException e) { Logger.warning("Error changing password", e); alert(R.string.password_change_error); } } @Override public void failure(Throwable e, String responseBody) { Logger.warning("Error changing password", e); alert(R.string.password_change_error); } }; private void notifyUserPasswordChangedAndFinish() { final Activity thisActivity = this; new AlertDialog.Builder(this).setIcon(android.R.drawable.ic_dialog_alert).setTitle(R.string.password_changed) .setMessage(R.string.password_changed) .setPositiveButton(R.string.OK, (dialog, which) -> thisActivity.finish()).show(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.change_password); } private boolean newPasswordsMatch() { String p1 = ((EditText) findViewById(R.id.newPassword1)).getText().toString(); String p2 = ((EditText) findViewById(R.id.newPassword2)).getText().toString(); return p1.equals(p2); } private boolean newPasswordMeetsStandard() { Editable p1 = ((EditText) findViewById(R.id.newPassword1)).getText(); return p1.length() >= 6; } private boolean oldPasswordIsBlank() { Editable old = ((EditText) findViewById(R.id.oldPassword)).getText(); return (old.length() == 0); } private boolean newPasswordIsBlank() { Editable n = ((EditText) findViewById(R.id.newPassword1)).getText(); return (n.length() == 0); } private boolean authorizedToChangePassword() throws JSONException { LoginManager loginManager = App.getLoginManager(); String p = loginManager.loggedInUser.getPassword(); String pValidate = ((EditText) findViewById(R.id.oldPassword)).getText().toString(); return p.equals(pValidate); } private void alert(int msg) { String s = this.getString(msg); Toast.makeText(App.getAppInstance(), s, Toast.LENGTH_LONG).show(); } private void changePassword() throws UnsupportedEncodingException, JSONException { newPassword = ((EditText) findViewById(R.id.newPassword1)).getText().toString(); RequestGenerator rc = new RequestGenerator(); rc.changePassword(App.getAppInstance(), newPassword, changePasswordResponseHandler); } public void handleChangePasswordClick(View view) { boolean authorizedToChangePassword; try { authorizedToChangePassword = authorizedToChangePassword(); } catch (JSONException e) { Logger.error(e); alert(R.string.password_change_error); return; } if (oldPasswordIsBlank()) { alert(R.string.no_blank_old_password); } else if (newPasswordIsBlank()) { alert(R.string.no_blank_new_password); } else if (!authorizedToChangePassword) { alert(R.string.bad_old_password); } else if (!newPasswordsMatch()) { alert(R.string.new_passwords_dont_match); } else if (!newPasswordMeetsStandard()) { alert(R.string.new_passwords_not_strong); } else { try { changePassword(); } catch (JSONException | UnsupportedEncodingException e) { Logger.error(e); alert(R.string.password_change_error); } } } }