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) && !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
53 @Override
54 protected void onBackendConnected() {
55 this.mAccount = extractAccount(getIntent());
56 if (this.mAccount != null && this.mAccount.isOptionSet(Account.OPTION_MAGIC_CREATE)) {
57 this.binding.currentPasswordLayout.setVisibility(View.GONE);
58 } else {
59 this.binding.currentPasswordLayout.setVisibility(View.VISIBLE);
60 }
61 }
62
63 @Override
64 protected void onCreate(final Bundle savedInstanceState) {
65 super.onCreate(savedInstanceState);
66 this.binding = DataBindingUtil.setContentView(this, R.layout.activity_change_password);
67 Activities.setStatusAndNavigationBarColors(this, binding.getRoot());
68 setSupportActionBar(binding.toolbar);
69 configureActionBar(getSupportActionBar());
70 binding.cancelButton.setOnClickListener(view -> finish());
71 binding.changePasswordButton.setOnClickListener(this.mOnChangePasswordButtonClicked);
72 binding.currentPassword.setCustomSelectionActionModeCallback(new DisabledActionModeCallback());
73 binding.newPassword.setCustomSelectionActionModeCallback(new DisabledActionModeCallback());
74 }
75
76 @Override
77 public void onStart() {
78 super.onStart();
79 Intent intent = getIntent();
80 String password = intent != null ? intent.getStringExtra("password") : null;
81 if (password != null) {
82 binding.newPassword.getEditableText().clear();
83 binding.newPassword.getEditableText().append(password);
84 }
85 }
86
87 @Override
88 public void onPasswordChangeSucceeded() {
89 runOnUiThread(() -> {
90 Toast.makeText(ChangePasswordActivity.this,R.string.password_changed,Toast.LENGTH_LONG).show();
91 finish();
92 });
93 }
94
95 @Override
96 public void onPasswordChangeFailed() {
97 runOnUiThread(() -> {
98 binding.newPasswordLayout.setError(getString(R.string.could_not_change_password));
99 binding.changePasswordButton.setEnabled(true);
100 binding.changePasswordButton.setText(R.string.change_password);
101 });
102
103 }
104
105 private void removeErrorsOnAllBut(TextInputLayout exception) {
106 if (this.binding.currentPasswordLayout != exception) {
107 this.binding.currentPasswordLayout.setErrorEnabled(false);
108 this.binding.currentPasswordLayout.setError(null);
109 }
110 if (this.binding.newPasswordLayout != exception) {
111 this.binding.newPasswordLayout.setErrorEnabled(false);
112 this.binding.newPasswordLayout.setError(null);
113 }
114
115 }
116
117 public void refreshUiReal() {
118
119 }
120}