package org.odk.collect.android.preferences; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface.OnClickListener; import android.preference.DialogPreference; import android.util.AttributeSet; import android.view.View; import android.view.WindowManager; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import org.odk.collect.android.R; import org.odk.collect.android.application.Collect; public class PasswordDialogPreference extends DialogPreference implements OnClickListener { private EditText passwordEditText; private EditText verifyEditText; public PasswordDialogPreference(Context context, AttributeSet attrs) { super(context, attrs); setDialogLayoutResource(R.layout.password_dialog_layout); } @Override public void onBindDialogView(View view) { passwordEditText = (EditText) view.findViewById(R.id.pwd_field); verifyEditText = (EditText) view.findViewById(R.id.verify_field); final String adminPW = getPersistedString(""); // populate the fields if a pw exists if (!adminPW.equalsIgnoreCase("")) { passwordEditText.setText(adminPW); passwordEditText.setSelection(passwordEditText.getText().length()); verifyEditText.setText(adminPW); } Button positiveButton = (Button) view .findViewById(R.id.positive_button); positiveButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String pw = passwordEditText.getText().toString(); String ver = verifyEditText.getText().toString(); if (!pw.equalsIgnoreCase("") && !ver.equalsIgnoreCase("") && pw.equals(ver)) { // passwords are the same persistString(pw); Toast.makeText(PasswordDialogPreference.this.getContext(), R.string.admin_password_changed, Toast.LENGTH_SHORT).show(); PasswordDialogPreference.this.getDialog().dismiss(); Collect.getInstance().getActivityLogger() .logAction(this, "AdminPasswordDialog", "CHANGED"); } else if (pw.equalsIgnoreCase("") && ver.equalsIgnoreCase("")) { persistString(""); Toast.makeText(PasswordDialogPreference.this.getContext(), R.string.admin_password_disabled, Toast.LENGTH_SHORT).show(); PasswordDialogPreference.this.getDialog().dismiss(); Collect.getInstance().getActivityLogger() .logAction(this, "AdminPasswordDialog", "DISABLED"); } else { Toast.makeText(PasswordDialogPreference.this.getContext(), R.string.admin_password_mismatch, Toast.LENGTH_SHORT).show(); Collect.getInstance().getActivityLogger() .logAction(this, "AdminPasswordDialog", "MISMATCH"); } } }); Button negativeButton = (Button) view.findViewById(R.id.negative_button); negativeButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { PasswordDialogPreference.this.getDialog().dismiss(); Collect.getInstance().getActivityLogger() .logAction(this, "AdminPasswordDialog", "CANCELLED"); } }); super.onBindDialogView(view); } @Override protected void onClick() { super.onClick(); // this seems to work to pop the keyboard when the dialog appears // i hope this isn't a race condition getDialog().getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); } @Override protected void onPrepareDialogBuilder(AlertDialog.Builder builder) { // we get rid of the default buttons (that close the dialog every time) builder.setPositiveButton(null, null); builder.setNegativeButton(null, null); super.onPrepareDialogBuilder(builder); } }