ChangePasswordActivity.java

  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 (!(didUnlock
 56                          || account.isOptionSet(Account.OPTION_MAGIC_CREATE)
 57                          || currentPassword.equals(account.getPassword())
 58                        )) {
 59                        binding.currentPassword.requestFocus();
 60                        binding.currentPasswordLayout.setError(
 61                                getString(R.string.account_status_unauthorized));
 62                        removeErrorsOnAllBut(binding.currentPasswordLayout);
 63                    } else if (newPassword.trim().isEmpty()) {
 64                        binding.newPassword.requestFocus();
 65                        binding.newPasswordLayout.setError(
 66                                getString(R.string.password_should_not_be_empty));
 67                        removeErrorsOnAllBut(binding.newPasswordLayout);
 68                    } else {
 69                        binding.currentPasswordLayout.setError(null);
 70                        binding.newPasswordLayout.setError(null);
 71                        final var future =
 72                                xmppConnectionService.updateAccountPasswordOnServer(
 73                                        account, newPassword);
 74                        Futures.addCallback(
 75                                future,
 76                                ChangePasswordActivity.this.passwordChangedCallback,
 77                                ContextCompat.getMainExecutor(getApplication()));
 78                        binding.changePasswordButton.setEnabled(false);
 79                        binding.changePasswordButton.setText(R.string.updating);
 80                    }
 81                }
 82            };
 83
 84    private Account mAccount;
 85    private boolean didUnlock = false;
 86
 87    @Override
 88    protected void onBackendConnected() {
 89        this.mAccount = extractAccount(getIntent());
 90        if (this.mAccount != null && (this.mAccount.isOptionSet(Account.OPTION_MAGIC_CREATE) || didUnlock)) {
 91            this.binding.currentPasswordLayout.setVisibility(View.GONE);
 92        } else {
 93            this.binding.currentPasswordLayout.setVisibility(View.VISIBLE);
 94        }
 95    }
 96
 97    @Override
 98    protected void onCreate(final Bundle savedInstanceState) {
 99        super.onCreate(savedInstanceState);
100        this.binding = DataBindingUtil.setContentView(this, R.layout.activity_change_password);
101        Activities.setStatusAndNavigationBarColors(this, binding.getRoot());
102        setSupportActionBar(binding.toolbar);
103        configureActionBar(getSupportActionBar());
104        binding.cancelButton.setOnClickListener(view -> finish());
105        binding.changePasswordButton.setOnClickListener(this.mOnChangePasswordButtonClicked);
106        binding.currentPassword.setCustomSelectionActionModeCallback(
107                new DisabledActionModeCallback());
108        binding.newPassword.setCustomSelectionActionModeCallback(new DisabledActionModeCallback());
109    }
110
111    @Override
112    public void onStart() {
113        super.onStart();
114        Intent intent = getIntent();
115        this.didUnlock = intent.getBooleanExtra("did_unlock", false);
116        String password = intent != null ? intent.getStringExtra("password") : null;
117        if (password != null) {
118            binding.newPassword.getEditableText().clear();
119            binding.newPassword.getEditableText().append(password);
120        }
121    }
122
123    private void removeErrorsOnAllBut(TextInputLayout exception) {
124        if (this.binding.currentPasswordLayout != exception) {
125            this.binding.currentPasswordLayout.setErrorEnabled(false);
126            this.binding.currentPasswordLayout.setError(null);
127        }
128        if (this.binding.newPasswordLayout != exception) {
129            this.binding.newPasswordLayout.setErrorEnabled(false);
130            this.binding.newPasswordLayout.setError(null);
131        }
132    }
133
134    public void refreshUiReal() {}
135}