// Copyright (c) 2014 mogoweb. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. /* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.mogoweb.chrome.shell; import android.app.AlertDialog; import android.content.Context; import android.content.res.Configuration; import android.net.http.SslError; import android.webkit.SslErrorHandler; import android.webkit.WebView; import com.mogoweb.chrome.HttpAuthHandler; /** * Displays page info * */ public class PageDialogsHandler { private Context mContext; private boolean mPageInfoFromShowSSLCertificateOnError; private String mUrlCertificateOnError; // private Tab mPageInfoView; private AlertDialog mPageInfoDialog; // as SSLCertificateOnError has different style for landscape / portrait, // we have to re-open it when configuration changed private AlertDialog mSSLCertificateOnErrorDialog; private WebView mSSLCertificateOnErrorView; private SslErrorHandler mSSLCertificateOnErrorHandler; private SslError mSSLCertificateOnErrorError; // as SSLCertificate has different style for landscape / portrait, we // have to re-open it when configuration changed private AlertDialog mSSLCertificateDialog; // private Tab mSSLCertificateView; private HttpAuthenticationDialog mHttpAuthenticationDialog; public PageDialogsHandler(Context context) { mContext = context; } public void onConfigurationChanged(Configuration config) { // if (mPageInfoDialog != null) { // mPageInfoDialog.dismiss(); // showPageInfo(mPageInfoView, // mPageInfoFromShowSSLCertificateOnError, // mUrlCertificateOnError); // } // if (mSSLCertificateDialog != null) { // mSSLCertificateDialog.dismiss(); // showSSLCertificate(mSSLCertificateView); // } // if (mSSLCertificateOnErrorDialog != null) { // mSSLCertificateOnErrorDialog.dismiss(); // showSSLCertificateOnError(mSSLCertificateOnErrorView, // mSSLCertificateOnErrorHandler, // mSSLCertificateOnErrorError); // } if (mHttpAuthenticationDialog != null) { mHttpAuthenticationDialog.reshow(); } } /** * Displays an http-authentication dialog. */ void showHttpAuthentication(final HttpAuthHandler handler, String host, String realm) { mHttpAuthenticationDialog = new HttpAuthenticationDialog(mContext, host, realm); mHttpAuthenticationDialog.setOkListener(new HttpAuthenticationDialog.OkListener() { public void onOk(String host, String realm, String username, String password) { setHttpAuthUsernamePassword(host, realm, username, password); handler.proceed(username, password); mHttpAuthenticationDialog = null; } }); mHttpAuthenticationDialog.setCancelListener(new HttpAuthenticationDialog.CancelListener() { public void onCancel() { handler.cancel(); mHttpAuthenticationDialog = null; } }); mHttpAuthenticationDialog.show(); } /** * Set HTTP authentication password. * * @param host The host for the password * @param realm The realm for the password * @param username The username for the password. If it is null, it means * password can't be saved. * @param password The password */ public void setHttpAuthUsernamePassword(String host, String realm, String username, String password) { // WebView w = mController.getCurrentTopWebView(); // if (w != null) { // w.setHttpAuthUsernamePassword(host, realm, username, password); // } } // /** // * Displays a page-info dialog. // * @param tab The tab to show info about // * @param fromShowSSLCertificateOnError The flag that indicates whether // * this dialog was opened from the SSL-certificate-on-error dialog or // * not. This is important, since we need to know whether to return to // * the parent dialog or simply dismiss. // * @param urlCertificateOnError The URL that invokes SSLCertificateError. // * Null when fromShowSSLCertificateOnError is false. // */ // void showPageInfo(final Tab tab, // final boolean fromShowSSLCertificateOnError, // final String urlCertificateOnError) { // if (tab == null) return; // final LayoutInflater factory = LayoutInflater.from(mContext); // // final View pageInfoView = factory.inflate(R.layout.page_info, null); // // final WebView view = tab.getWebView(); // // String url = fromShowSSLCertificateOnError ? urlCertificateOnError : tab.getUrl(); // String title = tab.getTitle(); // // if (url == null) { // url = ""; // } // if (title == null) { // title = ""; // } // // ((TextView) pageInfoView.findViewById(R.id.address)).setText(url); // ((TextView) pageInfoView.findViewById(R.id.title)).setText(title); // // mPageInfoView = tab; // mPageInfoFromShowSSLCertificateOnError = fromShowSSLCertificateOnError; // mUrlCertificateOnError = urlCertificateOnError; // // AlertDialog.Builder alertDialogBuilder = // new AlertDialog.Builder(mContext) // .setTitle(R.string.page_info) // .setIcon(android.R.drawable.ic_dialog_info) // .setView(pageInfoView) // .setPositiveButton( // R.string.ok, // new DialogInterface.OnClickListener() { // public void onClick(DialogInterface dialog, // int whichButton) { // mPageInfoDialog = null; // mPageInfoView = null; // // // if we came here from the SSL error dialog // if (fromShowSSLCertificateOnError) { // // go back to the SSL error dialog // showSSLCertificateOnError( // mSSLCertificateOnErrorView, // mSSLCertificateOnErrorHandler, // mSSLCertificateOnErrorError); // } // } // }) // .setOnCancelListener( // new DialogInterface.OnCancelListener() { // public void onCancel(DialogInterface dialog) { // mPageInfoDialog = null; // mPageInfoView = null; // // // if we came here from the SSL error dialog // if (fromShowSSLCertificateOnError) { // // go back to the SSL error dialog // showSSLCertificateOnError( // mSSLCertificateOnErrorView, // mSSLCertificateOnErrorHandler, // mSSLCertificateOnErrorError); // } // } // }); // // // if we have a main top-level page SSL certificate set or a certificate // // error // if (fromShowSSLCertificateOnError || // (view != null && view.getCertificate() != null)) { // // add a 'View Certificate' button // alertDialogBuilder.setNeutralButton( // R.string.view_certificate, // new DialogInterface.OnClickListener() { // public void onClick(DialogInterface dialog, // int whichButton) { // mPageInfoDialog = null; // mPageInfoView = null; // // // if we came here from the SSL error dialog // if (fromShowSSLCertificateOnError) { // // go back to the SSL error dialog // showSSLCertificateOnError( // mSSLCertificateOnErrorView, // mSSLCertificateOnErrorHandler, // mSSLCertificateOnErrorError); // } else { // // otherwise, display the top-most certificate from // // the chain // showSSLCertificate(tab); // } // } // }); // } // // mPageInfoDialog = alertDialogBuilder.show(); // } // /** // * Displays the main top-level page SSL certificate dialog // * (accessible from the Page-Info dialog). // * @param tab The tab to show certificate for. // */ // private void showSSLCertificate(final Tab tab) { // // SslCertificate cert = tab.getWebView().getCertificate(); // if (cert == null) { // return; // } // // mSSLCertificateView = tab; // mSSLCertificateDialog = createSslCertificateDialog(cert, tab.getSslCertificateError()) // .setPositiveButton(R.string.ok, // new DialogInterface.OnClickListener() { // public void onClick(DialogInterface dialog, // int whichButton) { // mSSLCertificateDialog = null; // mSSLCertificateView = null; // // showPageInfo(tab, false, null); // } // }) // .setOnCancelListener( // new DialogInterface.OnCancelListener() { // public void onCancel(DialogInterface dialog) { // mSSLCertificateDialog = null; // mSSLCertificateView = null; // // showPageInfo(tab, false, null); // } // }) // .show(); // } // /** // * Displays the SSL error certificate dialog. // * @param view The target web-view. // * @param handler The SSL error handler responsible for cancelling the // * connection that resulted in an SSL error or proceeding per user request. // * @param error The SSL error object. // */ // void showSSLCertificateOnError( // final WebView view, final SslErrorHandler handler, // final SslError error) { // // SslCertificate cert = error.getCertificate(); // if (cert == null) { // return; // } // // mSSLCertificateOnErrorHandler = handler; // mSSLCertificateOnErrorView = view; // mSSLCertificateOnErrorError = error; // mSSLCertificateOnErrorDialog = createSslCertificateDialog(cert, error) // .setPositiveButton(R.string.ok, // new DialogInterface.OnClickListener() { // public void onClick(DialogInterface dialog, // int whichButton) { // mSSLCertificateOnErrorDialog = null; // mSSLCertificateOnErrorView = null; // mSSLCertificateOnErrorHandler = null; // mSSLCertificateOnErrorError = null; // // ((BrowserWebView) view).getWebViewClient(). // onReceivedSslError(view, handler, error); // } // }) // .setNeutralButton(R.string.page_info_view, // new DialogInterface.OnClickListener() { // public void onClick(DialogInterface dialog, // int whichButton) { // mSSLCertificateOnErrorDialog = null; // // // do not clear the dialog state: we will // // need to show the dialog again once the // // user is done exploring the page-info details // // showPageInfo(mController.getTabControl() // .getTabFromView(view), // true, // error.getUrl()); // } // }) // .setOnCancelListener( // new DialogInterface.OnCancelListener() { // public void onCancel(DialogInterface dialog) { // mSSLCertificateOnErrorDialog = null; // mSSLCertificateOnErrorView = null; // mSSLCertificateOnErrorHandler = null; // mSSLCertificateOnErrorError = null; // // ((BrowserWebView) view).getWebViewClient(). // onReceivedSslError(view, handler, error); // } // }) // .show(); // } // /* // * Creates an AlertDialog to display the given certificate. If error is // * null, text is added to state that the certificae is valid and the icon // * is set accordingly. If error is non-null, it must relate to the supplied // * certificate. In this case, error is used to add text describing the // * problems with the certificate and a different icon is used. // */ // private AlertDialog.Builder createSslCertificateDialog(SslCertificate certificate, // SslError error) { // View certificateView = certificate.inflateCertificateView(mContext); // final LinearLayout placeholder = // (LinearLayout)certificateView.findViewById(com.android.internal.R.id.placeholder); // // LayoutInflater factory = LayoutInflater.from(mContext); // int iconId; // // if (error == null) { // iconId = R.drawable.ic_dialog_browser_certificate_secure; // LinearLayout table = (LinearLayout)factory.inflate(R.layout.ssl_success, placeholder); // TextView successString = (TextView)table.findViewById(R.id.success); // successString.setText(com.android.internal.R.string.ssl_certificate_is_valid); // } else { // iconId = R.drawable.ic_dialog_browser_certificate_partially_secure; // if (error.hasError(SslError.SSL_UNTRUSTED)) { // addError(factory, placeholder, R.string.ssl_untrusted); // } // if (error.hasError(SslError.SSL_IDMISMATCH)) { // addError(factory, placeholder, R.string.ssl_mismatch); // } // if (error.hasError(SslError.SSL_EXPIRED)) { // addError(factory, placeholder, R.string.ssl_expired); // } // if (error.hasError(SslError.SSL_NOTYETVALID)) { // addError(factory, placeholder, R.string.ssl_not_yet_valid); // } // if (error.hasError(SslError.SSL_DATE_INVALID)) { // addError(factory, placeholder, R.string.ssl_date_invalid); // } // if (error.hasError(SslError.SSL_INVALID)) { // addError(factory, placeholder, R.string.ssl_invalid); // } // // The SslError should always have at least one type of error and we // // should explicitly handle every type of error it supports. We // // therefore expect the condition below to never be hit. We use it // // as as safety net in case a new error type is added to SslError // // without the logic above being updated accordingly. // if (placeholder.getChildCount() == 0) { // addError(factory, placeholder, R.string.ssl_unknown); // } // } // // return new AlertDialog.Builder(mContext) // .setTitle(com.android.internal.R.string.ssl_certificate) // .setIcon(iconId) // .setView(certificateView); // } // // private void addError(LayoutInflater inflater, LinearLayout parent, int error) { // TextView textView = (TextView) inflater.inflate(R.layout.ssl_warning, // parent, false); // textView.setText(error); // parent.addView(textView); // } }