// Copyright 2016 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.password_manager; import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.support.v7.app.AlertDialog; import android.text.SpannableString; import android.text.Spanned; import android.text.method.LinkMovementMethod; import android.text.style.ClickableSpan; import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; import org.chromium.base.annotations.CalledByNative; import org.chromium.chrome.R; import org.chromium.ui.base.WindowAndroid; /** * The auto sign-in first run experience dialog is shown instead of usual auto sign-in snackbar * when the user first encounters the auto sign-in feature. */ public class AutoSigninFirstRunDialog implements DialogInterface.OnClickListener, DialogInterface.OnDismissListener { private final Context mContext; private final String mTitle; private final String mExplanation; private final int mExplanationLinkStart; private final int mExplanationLinkEnd; private final String mOkButtonText; private final String mTurnOffButtonText; private long mNativeAutoSigninFirstRunDialog; private AlertDialog mDialog; private boolean mWasDismissedByNative; private AutoSigninFirstRunDialog(Context context, long nativeAutoSigninFirstRunDialog, String title, String explanation, int explanationLinkStart, int explanationLinkEnd, String okButtonText, String turnOffButtonText) { mNativeAutoSigninFirstRunDialog = nativeAutoSigninFirstRunDialog; mContext = context; mTitle = title; mExplanation = explanation; mExplanationLinkStart = explanationLinkStart; mExplanationLinkEnd = explanationLinkEnd; mOkButtonText = okButtonText; mTurnOffButtonText = turnOffButtonText; } @CalledByNative private static AutoSigninFirstRunDialog createAndShowDialog(WindowAndroid windowAndroid, long nativeAutoSigninFirstRunDialog, String title, String explanation, int explanationLinkStart, int explanationLinkEnd, String okButtonText, String turnOffButtonText) { Activity activity = windowAndroid.getActivity().get(); if (activity == null) return null; AutoSigninFirstRunDialog dialog = new AutoSigninFirstRunDialog(activity, nativeAutoSigninFirstRunDialog, title, explanation, explanationLinkStart, explanationLinkEnd, okButtonText, turnOffButtonText); dialog.show(); return dialog; } private void show() { final AlertDialog.Builder builder = new AlertDialog.Builder(mContext, R.style.AlertDialogTheme) .setTitle(mTitle) .setPositiveButton(mOkButtonText, this) .setNegativeButton(mTurnOffButtonText, this); View view = LayoutInflater.from(mContext).inflate( R.layout.auto_sign_in_first_run_dialog, null); TextView summaryView = (TextView) view.findViewById(R.id.summary); if (mExplanationLinkStart != mExplanationLinkEnd && mExplanationLinkEnd != 0) { SpannableString spanableExplanation = new SpannableString(mExplanation); spanableExplanation.setSpan(new ClickableSpan() { @Override public void onClick(View view) { nativeOnLinkClicked(mNativeAutoSigninFirstRunDialog); mDialog.dismiss(); } }, mExplanationLinkStart, mExplanationLinkEnd, Spanned.SPAN_INCLUSIVE_INCLUSIVE); summaryView.setText(spanableExplanation); summaryView.setMovementMethod(LinkMovementMethod.getInstance()); } else { summaryView.setText(mExplanation); summaryView.setMovementMethod(LinkMovementMethod.getInstance()); } builder.setView(view); mDialog = builder.create(); mDialog.setCanceledOnTouchOutside(false); mDialog.setOnDismissListener(this); mDialog.show(); } @Override public void onClick(DialogInterface dialog, int whichButton) { if (whichButton == DialogInterface.BUTTON_NEGATIVE) { nativeOnTurnOffClicked(mNativeAutoSigninFirstRunDialog); } else if (whichButton == DialogInterface.BUTTON_POSITIVE) { nativeOnOkClicked(mNativeAutoSigninFirstRunDialog); } } @Override public void onDismiss(DialogInterface dialog) { destroy(); } private void destroy() { assert mNativeAutoSigninFirstRunDialog != 0; nativeDestroy(mNativeAutoSigninFirstRunDialog); mNativeAutoSigninFirstRunDialog = 0; mDialog = null; } @CalledByNative private void dismissDialog() { assert !mWasDismissedByNative; mWasDismissedByNative = true; mDialog.dismiss(); } private native void nativeOnTurnOffClicked(long nativeAutoSigninFirstRunDialogAndroid); private native void nativeOnOkClicked(long nativeAutoSigninFirstRunDialogAndroid); private native void nativeDestroy(long nativeAutoSigninFirstRunDialogAndroid); private native void nativeOnLinkClicked(long nativeAutoSigninFirstRunDialogAndroid); }