migrated change password into separate activity

This commit is contained in:
Daniel Gultsch 2015-01-03 00:11:02 +01:00
parent 1988e244ef
commit 969044b113
6 changed files with 138 additions and 88 deletions

View File

@ -79,6 +79,9 @@
<activity <activity
android:name=".ui.BlocklistActivity" android:name=".ui.BlocklistActivity"
android:label="@string/title_activity_block_list" /> android:label="@string/title_activity_block_list" />
<activity
android:name=".ui.ChangePasswordActivity"
android:label="@string/change_password_on_server" />
<activity <activity
android:name=".ui.ManageAccountActivity" android:name=".ui.ManageAccountActivity"
android:configChanges="orientation|screenSize" android:configChanges="orientation|screenSize"

View File

@ -0,0 +1,107 @@
package eu.siacs.conversations.ui;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import eu.siacs.conversations.R;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.services.XmppConnectionService;
import eu.siacs.conversations.xmpp.jid.InvalidJidException;
import eu.siacs.conversations.xmpp.jid.Jid;
public class ChangePasswordActivity extends XmppActivity implements XmppConnectionService.OnAccountPasswordChanged {
private Button mChangePasswordButton;
private View.OnClickListener mOnChangePasswordButtonClicked = new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mAccount != null) {
final String currentPassword = mCurrentPassword.getText().toString();
final String newPassword = mNewPassword.getText().toString();
final String newPasswordConfirm = mNewPasswordConfirm.getText().toString();
if (!currentPassword.equals(mAccount.getPassword())) {
mCurrentPassword.requestFocus();
mCurrentPassword.setError(getString(R.string.account_status_unauthorized));
} else if (!newPassword.equals(newPasswordConfirm)) {
mNewPasswordConfirm.requestFocus();
mNewPasswordConfirm.setError(getString(R.string.passwords_do_not_match));
} else if (newPassword.trim().isEmpty()) {
mNewPassword.requestFocus();
mNewPassword.setError(getString(R.string.password_should_not_be_empty));
} else {
mCurrentPassword.setError(null);
mNewPassword.setError(null);
mNewPasswordConfirm.setError(null);
xmppConnectionService.updateAccountPasswordOnServer(mAccount, newPassword, ChangePasswordActivity.this);
mChangePasswordButton.setEnabled(false);
mChangePasswordButton.setTextColor(getSecondaryTextColor());
mChangePasswordButton.setText(R.string.updating);
}
}
}
};
private EditText mCurrentPassword;
private EditText mNewPassword;
private EditText mNewPasswordConfirm;
private Account mAccount;
@Override
void onBackendConnected() {
try {
final String jid = getIntent() == null ? null : getIntent().getStringExtra("account");
if (jid != null) {
this.mAccount = xmppConnectionService.findAccountByJid(Jid.fromString(jid));
}
} catch (final InvalidJidException ignored) {
}
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_change_password);
Button mCancelButton = (Button) findViewById(R.id.left_button);
mCancelButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
this.mChangePasswordButton = (Button) findViewById(R.id.right_button);
this.mChangePasswordButton.setOnClickListener(this.mOnChangePasswordButtonClicked);
this.mCurrentPassword = (EditText) findViewById(R.id.current_password);
this.mNewPassword = (EditText) findViewById(R.id.new_password);
this.mNewPasswordConfirm = (EditText) findViewById(R.id.new_password_confirm);
}
@Override
public void onPasswordChangeSucceeded() {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(ChangePasswordActivity.this,R.string.password_changed,Toast.LENGTH_LONG).show();
finish();
}
});
}
@Override
public void onPasswordChangeFailed() {
runOnUiThread(new Runnable() {
@Override
public void run() {
mNewPassword.setError(getString(R.string.could_not_change_password));
mChangePasswordButton.setEnabled(true);
mChangePasswordButton.setTextColor(getPrimaryTextColor());
mChangePasswordButton.setText(R.string.change_password);
}
});
}
}

View File

@ -25,7 +25,6 @@ import android.widget.Toast;
import eu.siacs.conversations.R; import eu.siacs.conversations.R;
import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.services.XmppConnectionService;
import eu.siacs.conversations.services.XmppConnectionService.OnAccountUpdate; import eu.siacs.conversations.services.XmppConnectionService.OnAccountUpdate;
import eu.siacs.conversations.ui.adapter.KnownHostsAdapter; import eu.siacs.conversations.ui.adapter.KnownHostsAdapter;
import eu.siacs.conversations.utils.CryptoHelper; import eu.siacs.conversations.utils.CryptoHelper;
@ -35,13 +34,12 @@ import eu.siacs.conversations.xmpp.jid.InvalidJidException;
import eu.siacs.conversations.xmpp.jid.Jid; import eu.siacs.conversations.xmpp.jid.Jid;
import eu.siacs.conversations.xmpp.pep.Avatar; import eu.siacs.conversations.xmpp.pep.Avatar;
public class EditAccountActivity extends XmppActivity implements OnAccountUpdate, XmppConnectionService.OnAccountPasswordChanged { public class EditAccountActivity extends XmppActivity implements OnAccountUpdate{
private AutoCompleteTextView mAccountJid; private AutoCompleteTextView mAccountJid;
private EditText mPassword; private EditText mPassword;
private EditText mPasswordConfirm; private EditText mPasswordConfirm;
private CheckBox mRegisterNew; private CheckBox mRegisterNew;
private CheckBox mChangePassword;
private Button mCancelButton; private Button mCancelButton;
private Button mSaveButton; private Button mSaveButton;
private TableLayout mMoreTable; private TableLayout mMoreTable;
@ -64,7 +62,6 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
private Account mAccount; private Account mAccount;
private boolean mFetchingAvatar = false; private boolean mFetchingAvatar = false;
private boolean mChangingPassword = false;
private final OnClickListener mSaveButtonClickListener = new OnClickListener() { private final OnClickListener mSaveButtonClickListener = new OnClickListener() {
@ -76,7 +73,6 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
return; return;
} }
final boolean registerNewAccount = mRegisterNew.isChecked(); final boolean registerNewAccount = mRegisterNew.isChecked();
final boolean changePassword = mChangePassword.isChecked();
final Jid jid; final Jid jid;
try { try {
jid = Jid.fromString(mAccountJid.getText().toString()); jid = Jid.fromString(mAccountJid.getText().toString());
@ -92,7 +88,7 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
} }
final String password = mPassword.getText().toString(); final String password = mPassword.getText().toString();
final String passwordConfirm = mPasswordConfirm.getText().toString(); final String passwordConfirm = mPasswordConfirm.getText().toString();
if (registerNewAccount || changePassword) { if (registerNewAccount) {
if (!password.equals(passwordConfirm)) { if (!password.equals(passwordConfirm)) {
mPasswordConfirm.setError(getString(R.string.passwords_do_not_match)); mPasswordConfirm.setError(getString(R.string.passwords_do_not_match));
mPasswordConfirm.requestFocus(); mPasswordConfirm.requestFocus();
@ -104,21 +100,11 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
mAccount.setUsername(jid.hasLocalpart() ? jid.getLocalpart() : ""); mAccount.setUsername(jid.hasLocalpart() ? jid.getLocalpart() : "");
mAccount.setServer(jid.getDomainpart()); mAccount.setServer(jid.getDomainpart());
} catch (final InvalidJidException ignored) { } catch (final InvalidJidException ignored) {
}
if (changePassword) {
if (mAccount.isOnlineAndConnected()) {
xmppConnectionService.updateAccountPasswordOnServer(mAccount, mPassword.getText().toString(),EditAccountActivity.this);
mChangingPassword = true;
updateSaveButton();
} else {
Toast.makeText(EditAccountActivity.this,R.string.not_connected_try_again,Toast.LENGTH_SHORT).show();
}
return; return;
} else { }
mAccount.setPassword(password); mAccount.setPassword(password);
mAccount.setOption(Account.OPTION_REGISTER, registerNewAccount); mAccount.setOption(Account.OPTION_REGISTER, registerNewAccount);
xmppConnectionService.updateAccount(mAccount); xmppConnectionService.updateAccount(mAccount);
}
} else { } else {
try { try {
if (xmppConnectionService.findAccountByJid(Jid.fromString(mAccountJid.getText().toString())) != null) { if (xmppConnectionService.findAccountByJid(Jid.fromString(mAccountJid.getText().toString())) != null) {
@ -157,6 +143,7 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
@Override @Override
public void run() { public void run() {
invalidateOptionsMenu();
if (mAccount != null if (mAccount != null
&& mAccount.getStatus() != Account.State.ONLINE && mAccount.getStatus() != Account.State.ONLINE
&& mFetchingAvatar) { && mFetchingAvatar) {
@ -209,26 +196,10 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
@Override @Override
public void afterTextChanged(final Editable s) { public void afterTextChanged(final Editable s) {
toggleChangePasswordCheckbox();
} }
}; };
private void toggleChangePasswordCheckbox() {
final boolean registrationReady = mAccount != null &&
mAccount.isOnlineAndConnected() &&
mAccount.getXmppConnection().getFeatures().register();
if (passwordFieldEdited() && registrationReady) {
mChangePassword.setVisibility(View.VISIBLE);
} else {
mChangePassword.setVisibility(View.INVISIBLE);
mChangePassword.setChecked(false);
}
}
private boolean passwordFieldEdited() {
final String password = this.mPassword.getText().toString();
return jidToEdit != null && mAccount != null && !password.isEmpty() && !mAccount.getPassword().equals(password);
}
private final OnClickListener mAvatarClickListener = new OnClickListener() { private final OnClickListener mAvatarClickListener = new OnClickListener() {
@Override @Override
public void onClick(final View view) { public void onClick(final View view) {
@ -263,11 +234,7 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
} }
protected void updateSaveButton() { protected void updateSaveButton() {
if (mChangingPassword) { if (mAccount != null && mAccount.getStatus() == Account.State.CONNECTING) {
this.mSaveButton.setEnabled(false);
this.mSaveButton.setTextColor(getSecondaryTextColor());
this.mSaveButton.setText(R.string.updating);
} else if (mAccount != null && mAccount.getStatus() == Account.State.CONNECTING) {
this.mSaveButton.setEnabled(false); this.mSaveButton.setEnabled(false);
this.mSaveButton.setTextColor(getSecondaryTextColor()); this.mSaveButton.setTextColor(getSecondaryTextColor());
this.mSaveButton.setText(R.string.account_status_connecting); this.mSaveButton.setText(R.string.account_status_connecting);
@ -322,7 +289,6 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
this.mAvatar = (ImageView) findViewById(R.id.avater); this.mAvatar = (ImageView) findViewById(R.id.avater);
this.mAvatar.setOnClickListener(this.mAvatarClickListener); this.mAvatar.setOnClickListener(this.mAvatarClickListener);
this.mRegisterNew = (CheckBox) findViewById(R.id.account_register_new); this.mRegisterNew = (CheckBox) findViewById(R.id.account_register_new);
this.mChangePassword = (CheckBox) findViewById(R.id.account_change_password);
this.mStats = (LinearLayout) findViewById(R.id.stats); this.mStats = (LinearLayout) findViewById(R.id.stats);
this.mSessionEst = (TextView) findViewById(R.id.session_est); this.mSessionEst = (TextView) findViewById(R.id.session_est);
this.mServerInfoRosterVersion = (TextView) findViewById(R.id.server_info_roster_version); this.mServerInfoRosterVersion = (TextView) findViewById(R.id.server_info_roster_version);
@ -353,7 +319,6 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
} }
}; };
this.mRegisterNew.setOnCheckedChangeListener(OnCheckedShowConfirmPassword); this.mRegisterNew.setOnCheckedChangeListener(OnCheckedShowConfirmPassword);
this.mChangePassword.setOnCheckedChangeListener(OnCheckedShowConfirmPassword);
} }
@Override @Override
@ -363,13 +328,16 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
final MenuItem showQrCode = menu.findItem(R.id.action_show_qr_code); final MenuItem showQrCode = menu.findItem(R.id.action_show_qr_code);
final MenuItem showBlocklist = menu.findItem(R.id.action_show_block_list); final MenuItem showBlocklist = menu.findItem(R.id.action_show_block_list);
final MenuItem showMoreInfo = menu.findItem(R.id.action_server_info_show_more); final MenuItem showMoreInfo = menu.findItem(R.id.action_server_info_show_more);
final MenuItem changePassword = menu.findItem(R.id.action_change_password_on_server);
if (mAccount == null) { if (mAccount == null) {
showQrCode.setVisible(false); showQrCode.setVisible(false);
showBlocklist.setVisible(false); showBlocklist.setVisible(false);
showMoreInfo.setVisible(false); showMoreInfo.setVisible(false);
changePassword.setVisible(false);
} else if (mAccount.getStatus() != Account.State.ONLINE) { } else if (mAccount.getStatus() != Account.State.ONLINE) {
showBlocklist.setVisible(false); showBlocklist.setVisible(false);
showMoreInfo.setVisible(false); showMoreInfo.setVisible(false);
changePassword.setVisible(false);
} else if (!mAccount.getXmppConnection().getFeatures().blocking()) { } else if (!mAccount.getXmppConnection().getFeatures().blocking()) {
showBlocklist.setVisible(false); showBlocklist.setVisible(false);
} }
@ -396,8 +364,6 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
getActionBar().setTitle(R.string.action_add_account); getActionBar().setTitle(R.string.action_add_account);
} }
} }
this.mChangePassword.setVisibility(View.GONE);
this.mChangePassword.setChecked(false);
} }
} }
@ -425,13 +391,19 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
public boolean onOptionsItemSelected(final MenuItem item) { public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.action_show_block_list: case R.id.action_show_block_list:
final Intent intent = new Intent(this, BlocklistActivity.class); final Intent showBlocklistIntent = new Intent(this, BlocklistActivity.class);
intent.putExtra("account", mAccount.getJid().toString()); showBlocklistIntent.putExtra("account", mAccount.getJid().toString());
startActivity(intent); startActivity(showBlocklistIntent);
break; break;
case R.id.action_server_info_show_more: case R.id.action_server_info_show_more:
mMoreTable.setVisibility(item.isChecked() ? View.GONE : View.VISIBLE); mMoreTable.setVisibility(item.isChecked() ? View.GONE : View.VISIBLE);
item.setChecked(!item.isChecked()); item.setChecked(!item.isChecked());
break;
case R.id.action_change_password_on_server:
final Intent changePasswordIntent = new Intent(this, ChangePasswordActivity.class);
changePasswordIntent.putExtra("account", mAccount.getJid().toString());
startActivity(changePasswordIntent);
break;
} }
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
@ -445,18 +417,13 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
} }
if (this.mAccount.isOptionSet(Account.OPTION_REGISTER)) { if (this.mAccount.isOptionSet(Account.OPTION_REGISTER)) {
this.mRegisterNew.setVisibility(View.VISIBLE); this.mRegisterNew.setVisibility(View.VISIBLE);
this.mChangePassword.setVisibility(View.GONE);
this.mChangePassword.setChecked(false);
this.mRegisterNew.setChecked(true); this.mRegisterNew.setChecked(true);
this.mPasswordConfirm.setText(this.mAccount.getPassword()); this.mPasswordConfirm.setText(this.mAccount.getPassword());
} else { } else {
this.mRegisterNew.setVisibility(View.GONE); this.mRegisterNew.setVisibility(View.GONE);
this.mRegisterNew.setChecked(false); this.mRegisterNew.setChecked(false);
this.mChangePassword.setVisibility(View.GONE);
this.mChangePassword.setChecked(false);
} }
if (this.mAccount.isOnlineAndConnected() && !this.mFetchingAvatar) { if (this.mAccount.isOnlineAndConnected() && !this.mFetchingAvatar) {
toggleChangePasswordCheckbox();
this.mStats.setVisibility(View.VISIBLE); this.mStats.setVisibility(View.VISIBLE);
this.mSessionEst.setText(UIHelper.readableTimeDifferenceFull(this, this.mAccount.getXmppConnection() this.mSessionEst.setText(UIHelper.readableTimeDifferenceFull(this, this.mAccount.getXmppConnection()
.getLastSessionEstablished())); .getLastSessionEstablished()));
@ -528,30 +495,4 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
this.mStats.setVisibility(View.GONE); this.mStats.setVisibility(View.GONE);
} }
} }
@Override
public void onPasswordChangeSucceeded() {
this.mChangingPassword = false;
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(EditAccountActivity.this,R.string.password_changed,Toast.LENGTH_SHORT).show();
updateSaveButton();
updateAccountInformation();
}
});
}
@Override
public void onPasswordChangeFailed() {
this.mChangingPassword = false;
runOnUiThread(new Runnable() {
@Override
public void run() {
mPassword.requestFocus();
mPassword.setError(getString(R.string.could_not_change_password));
updateSaveButton();
}
});
}
} }

View File

@ -79,15 +79,6 @@
android:textColor="@color/primarytext" android:textColor="@color/primarytext"
android:textSize="?attr/TextSizeBody" /> android:textSize="?attr/TextSizeBody" />
<CheckBox
android:id="@+id/account_change_password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="@string/change_password_on_server"
android:textColor="@color/primarytext"
android:textSize="?attr/TextSizeBody" />
<TextView <TextView
android:id="@+id/account_confirm_password_desc" android:id="@+id/account_confirm_password_desc"
android:layout_width="wrap_content" android:layout_width="wrap_content"

View File

@ -16,4 +16,8 @@
android:checkable="true" android:checkable="true"
android:checked="false" android:checked="false"
android:showAsAction="never" /> android:showAsAction="never" />
<item android:id="@+id/action_change_password_on_server"
android:title="@string/change_password"
android:showAsAction="never" />
</menu> </menu>

View File

@ -399,4 +399,8 @@
<string name="shared_secret_hint_should_not_be_empty">Your hint should not be empty</string> <string name="shared_secret_hint_should_not_be_empty">Your hint should not be empty</string>
<string name="shared_secret_can_not_be_empty">Your shared secret can not be empty</string> <string name="shared_secret_can_not_be_empty">Your shared secret can not be empty</string>
<string name="manual_verification_explanation">Carefully compare the fingerprint shown below with the fingerprint of your contact.\nYou can use any trusted form of communication like an encrypted e-mail or a telephone call to exchange those.</string> <string name="manual_verification_explanation">Carefully compare the fingerprint shown below with the fingerprint of your contact.\nYou can use any trusted form of communication like an encrypted e-mail or a telephone call to exchange those.</string>
<string name="change_password">Change password</string>
<string name="current_password">Current password</string>
<string name="new_password">New password</string>
<string name="password_should_not_be_empty">Password should not be empty</string>
</resources> </resources>