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 (!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}