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}