package org.yaxim.androidclient.dialogs; import org.yaxim.androidclient.XMPPRosterServiceAdapter; import org.yaxim.androidclient.service.IXMPPRosterService; import org.yaxim.androidclient.service.XMPPService; import org.yaxim.androidclient.util.ConnectionState; import org.yaxim.androidclient.util.PreferenceConstants; import android.annotation.TargetApi; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.ServiceConnection; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.os.IBinder; import android.preference.PreferenceManager; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.EditText; import android.widget.TextView; import org.yaxim.androidclient.R; public class ChangePasswordDialog extends AlertDialog implements DialogInterface.OnClickListener, TextWatcher { private Context mContext; private ServiceConnection mXmppServiceConnection; private XMPPRosterServiceAdapter mServiceAdapter; private CheckBox mChangeOnServer; private EditText mOldPassword; private EditText mEditPassword; private EditText mRepeatPassword; private View mPasswordWarning; private Button mOkButton; private ProgressDialog mProgressDialog; public ChangePasswordDialog(Context context) { super(context); mContext = context; setTitle(R.string.account_jabberPW_title); LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View group = inflater.inflate(R.layout.password_view, null, false); setView(group); mChangeOnServer = (CheckBox) group.findViewById(R.id.password_change_on_server); mChangeOnServer.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) { updateDialog(); } }); mOldPassword = (EditText) group.findViewById(R.id.password_old); mEditPassword = (EditText) group.findViewById(R.id.password_new); mRepeatPassword = (EditText) group.findViewById(R.id.password_new_repeat); mPasswordWarning = group.findViewById(R.id.password_warning); setButton(BUTTON_POSITIVE, context.getString(android.R.string.ok), this); setButton(BUTTON_NEGATIVE, context.getString(android.R.string.cancel), (DialogInterface.OnClickListener)null); } public void onCreate(Bundle icicle) { super.onCreate(icicle); mOkButton = getButton(BUTTON_POSITIVE); mOldPassword.addTextChangedListener(this); mEditPassword.addTextChangedListener(this); mRepeatPassword.addTextChangedListener(this); mChangeOnServer.setEnabled(false); mOkButton.setEnabled(false); Intent serviceIntent = new Intent(mContext, XMPPService.class); serviceIntent.setAction("org.yaxim.androidclient.XMPPSERVICE"); mXmppServiceConnection = new ServiceConnection() { public void onServiceConnected(ComponentName name, IBinder service) { mServiceAdapter = new XMPPRosterServiceAdapter( IXMPPRosterService.Stub.asInterface(service)); //if (mServiceAdapter.getConnectionState() == ConnectionState.ONLINE) mChangeOnServer.setChecked(true); updateDialog(); } public void onServiceDisconnected(ComponentName name) { } }; mContext.bindService(serviceIntent, mXmppServiceConnection, 0); } @Override public void dismiss() { mContext.unbindService(mXmppServiceConnection); super.dismiss(); } public void onClick(DialogInterface dialog, int which) { String password = mEditPassword.getText().toString(); if (mChangeOnServer.isChecked()) { mProgressDialog = ProgressDialog.show(mContext, mContext.getString(R.string.account_jabberPW_title), mContext.getString(R.string.account_jabberPW_progress), true); new PasswordChangeTask().execute(password); } else updateLocalPassword(password); } private void updateDialog() { boolean is_logged_in = (mServiceAdapter != null && mServiceAdapter.getConnectionState() == ConnectionState.ONLINE); // set checkbox / warning mChangeOnServer.setEnabled(true); if (!is_logged_in) mChangeOnServer.setChecked(false); mChangeOnServer.setEnabled(is_logged_in); mPasswordWarning.setVisibility(mChangeOnServer.isChecked() ? View.GONE : View.VISIBLE); boolean is_ok = true; // TODO: check old password length and match if (mEditPassword.length() == 0) is_ok = false; boolean passwords_match = mEditPassword.getText().toString().equals( mRepeatPassword.getText().toString()); is_ok = is_ok && passwords_match; mRepeatPassword.setError((passwords_match || mRepeatPassword.length() == 0) ? null : mContext.getString(R.string.StartupDialog_error_password)); mOkButton.setEnabled(is_ok); } public void afterTextChanged(Editable s) { updateDialog(); } public void beforeTextChanged(CharSequence s, int start, int count, int after) {} public void onTextChanged(CharSequence s, int start, int before, int count) {} private void updateLocalPassword(String password) { PreferenceManager.getDefaultSharedPreferences(mContext).edit() .putString(PreferenceConstants.PASSWORD, password).commit(); //YaximApplication.getConfig(mMainWindow).reconnect_required = false; } private class PasswordChangeTask extends AsyncTask<String, Void, String> { String mPassword; @Override protected String doInBackground(String... params) { mPassword = params[0]; // blocking method on the server return mServiceAdapter.changePassword(mPassword); } @Override protected void onPostExecute(String result) { mProgressDialog.dismiss(); int icon_id = android.R.drawable.ic_dialog_alert; if ("OK".equals(result)) { updateLocalPassword(mPassword); result = mContext.getString(R.string.account_jabberPW_finished); icon_id = android.R.drawable.ic_dialog_info; } else { result = mContext.getString(R.string.account_jabberPW_error, result); } new AlertDialog.Builder(mContext) .setTitle(R.string.account_jabberPW_title) .setIcon(icon_id) .setMessage(result) .setPositiveButton(mContext.getString(android.R.string.ok), null) .create().show(); } } }