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