// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package org.chromium.chrome.browser.sync.ui; import android.app.Activity; import android.app.Dialog; import android.app.DialogFragment; import android.os.Bundle; import android.support.v7.app.AlertDialog; import android.text.SpannableString; import android.text.method.LinkMovementMethod; import android.text.style.ClickableSpan; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.inputmethod.EditorInfo; import android.widget.EditText; import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; import org.chromium.chrome.R; import org.chromium.chrome.browser.help.HelpAndFeedback; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.ui.text.SpanApplier; import org.chromium.ui.text.SpanApplier.SpanInfo; /** * Dialog to ask the user to enter a new custom passphrase. */ public class PassphraseCreationDialogFragment extends DialogFragment { interface Listener { void onPassphraseCreated(String passphrase); } private EditText mEnterPassphrase; private EditText mConfirmPassphrase; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { super.onCreateDialog(savedInstanceState); LayoutInflater inflater = getActivity().getLayoutInflater(); View view = inflater.inflate(R.layout.sync_custom_passphrase, null); mEnterPassphrase = (EditText) view.findViewById(R.id.passphrase); mConfirmPassphrase = (EditText) view.findViewById(R.id.confirm_passphrase); mConfirmPassphrase.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_DONE) { tryToSubmitPassphrase(); } return false; } }); TextView instructionsView = (TextView) view.findViewById(R.id.custom_passphrase_instructions); instructionsView.setMovementMethod(LinkMovementMethod.getInstance()); instructionsView.setText(getInstructionsText()); AlertDialog dialog = new AlertDialog.Builder(getActivity(), R.style.AlertDialogTheme) .setView(view) .setTitle(R.string.sync_passphrase_type_custom_dialog_title) .setPositiveButton(R.string.save, null) .setNegativeButton(R.string.cancel, null) .create(); dialog.getDelegate().setHandleNativeActionModesEnabled(false); return dialog; } private SpannableString getInstructionsText() { final Activity activity = getActivity(); return SpanApplier.applySpans( activity.getString(R.string.sync_custom_passphrase), new SpanInfo("<learnmore>", "</learnmore>", new ClickableSpan() { @Override public void onClick(View view) { HelpAndFeedback.getInstance(activity).show(activity, activity.getString(R.string.help_context_change_sync_passphrase), Profile.getLastUsedProfile(), null); } })); } @Override public void onStart() { super.onStart(); AlertDialog d = (AlertDialog) getDialog(); if (d != null) { // Override the button's onClick listener. The default gets set in the dialog's // onCreate, when it is shown (in super.onStart()), so we have to do this here. // Otherwise the dialog will close when the button is clicked regardless of what else we // do. d.getButton(Dialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { tryToSubmitPassphrase(); } }); } } private void tryToSubmitPassphrase() { String passphrase = mEnterPassphrase.getText().toString(); String confirmPassphrase = mConfirmPassphrase.getText().toString(); if (!passphrase.equals(confirmPassphrase)) { mEnterPassphrase.setError(null); mConfirmPassphrase.setError(getString(R.string.sync_passphrases_do_not_match)); mConfirmPassphrase.requestFocus(); return; } else if (passphrase.isEmpty()) { mConfirmPassphrase.setError(null); mEnterPassphrase.setError(getString(R.string.sync_passphrase_cannot_be_blank)); mEnterPassphrase.requestFocus(); return; } // The passphrase is not empty and matches. ((Listener) getTargetFragment()).onPassphraseCreated(passphrase); getDialog().dismiss(); } }