1package eu.siacs.conversations.ui;
  2
  3import android.content.Intent;
  4import android.os.Bundle;
  5import android.view.View;
  6import android.widget.Toast;
  7
  8import androidx.databinding.DataBindingUtil;
  9
 10import com.google.android.material.textfield.TextInputLayout;
 11
 12import eu.siacs.conversations.R;
 13import eu.siacs.conversations.databinding.ActivityChangePasswordBinding;
 14import eu.siacs.conversations.entities.Account;
 15import eu.siacs.conversations.services.XmppConnectionService;
 16import eu.siacs.conversations.ui.widget.DisabledActionModeCallback;
 17
 18public class ChangePasswordActivity extends XmppActivity implements XmppConnectionService.OnAccountPasswordChanged {
 19
 20	private ActivityChangePasswordBinding binding;
 21
 22	private final View.OnClickListener mOnChangePasswordButtonClicked = new View.OnClickListener() {
 23		@Override
 24		public void onClick(final View view) {
 25			final var account = mAccount;
 26			if (account == null) {
 27				return;
 28			}
 29			final String currentPassword = binding.currentPassword.getText().toString();
 30			final String newPassword = binding.newPassword.getText().toString();
 31			if (!account.isOptionSet(Account.OPTION_MAGIC_CREATE) && !didUnlock && !currentPassword.equals(account.getPassword())) {
 32				binding.currentPassword.requestFocus();
 33				binding.currentPasswordLayout.setError(getString(R.string.account_status_unauthorized));
 34				removeErrorsOnAllBut(binding.currentPasswordLayout);
 35			} else if (newPassword.trim().isEmpty()) {
 36				binding.newPassword.requestFocus();
 37				binding.newPasswordLayout.setError(getString(R.string.password_should_not_be_empty));
 38				removeErrorsOnAllBut(binding.newPasswordLayout);
 39			} else {
 40				binding.currentPasswordLayout.setError(null);
 41				binding.newPasswordLayout.setError(null);
 42				xmppConnectionService.updateAccountPasswordOnServer(account, newPassword, ChangePasswordActivity.this);
 43				binding.changePasswordButton.setEnabled(false);
 44				binding.changePasswordButton.setText(R.string.updating);
 45			}
 46		}
 47	};
 48
 49
 50
 51	private Account mAccount;
 52	private boolean didUnlock = false;
 53
 54	@Override
 55    protected void onBackendConnected() {
 56		this.mAccount = extractAccount(getIntent());
 57		if (this.mAccount != null && (this.mAccount.isOptionSet(Account.OPTION_MAGIC_CREATE) || didUnlock)) {
 58			this.binding.currentPasswordLayout.setVisibility(View.GONE);
 59		} else {
 60			this.binding.currentPasswordLayout.setVisibility(View.VISIBLE);
 61		}
 62	}
 63
 64	@Override
 65	protected void onCreate(final Bundle savedInstanceState) {
 66		super.onCreate(savedInstanceState);
 67		this.binding = DataBindingUtil.setContentView(this, R.layout.activity_change_password);
 68		Activities.setStatusAndNavigationBarColors(this, binding.getRoot());
 69		setSupportActionBar(binding.toolbar);
 70		configureActionBar(getSupportActionBar());
 71		binding.cancelButton.setOnClickListener(view -> finish());
 72		binding.changePasswordButton.setOnClickListener(this.mOnChangePasswordButtonClicked);
 73		binding.currentPassword.setCustomSelectionActionModeCallback(new DisabledActionModeCallback());
 74		binding.newPassword.setCustomSelectionActionModeCallback(new DisabledActionModeCallback());
 75	}
 76
 77	@Override
 78	public void onStart() {
 79		super.onStart();
 80		Intent intent = getIntent();
 81		this.didUnlock = intent.getBooleanExtra("did_unlock", false);
 82		String password = intent != null ? intent.getStringExtra("password") : null;
 83		if (password != null) {
 84			binding.newPassword.getEditableText().clear();
 85			binding.newPassword.getEditableText().append(password);
 86		}
 87	}
 88
 89	@Override
 90	public void onPasswordChangeSucceeded() {
 91		runOnUiThread(() -> {
 92			Toast.makeText(ChangePasswordActivity.this,R.string.password_changed,Toast.LENGTH_LONG).show();
 93			finish();
 94		});
 95	}
 96
 97	@Override
 98	public void onPasswordChangeFailed() {
 99		runOnUiThread(() -> {
100			binding.newPasswordLayout.setError(getString(R.string.could_not_change_password));
101			binding.changePasswordButton.setEnabled(true);
102			binding.changePasswordButton.setText(R.string.change_password);
103		});
104
105	}
106
107	private void removeErrorsOnAllBut(TextInputLayout exception) {
108		if (this.binding.currentPasswordLayout != exception) {
109			this.binding.currentPasswordLayout.setErrorEnabled(false);
110			this.binding.currentPasswordLayout.setError(null);
111		}
112		if (this.binding.newPasswordLayout != exception) {
113			this.binding.newPasswordLayout.setErrorEnabled(false);
114			this.binding.newPasswordLayout.setError(null);
115		}
116
117	}
118
119	public void refreshUiReal() {
120
121	}
122}