PageDialogsHandler.java revision 8233facddcc51865d612a919d450db6954aa48e3
18233facddcc51865d612a919d450db6954aa48e3Michael Kolb/* 28233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Copyright (C) 2010 The Android Open Source Project 38233facddcc51865d612a919d450db6954aa48e3Michael Kolb * 48233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Licensed under the Apache License, Version 2.0 (the "License"); 58233facddcc51865d612a919d450db6954aa48e3Michael Kolb * you may not use this file except in compliance with the License. 68233facddcc51865d612a919d450db6954aa48e3Michael Kolb * You may obtain a copy of the License at 78233facddcc51865d612a919d450db6954aa48e3Michael Kolb * 88233facddcc51865d612a919d450db6954aa48e3Michael Kolb * http://www.apache.org/licenses/LICENSE-2.0 98233facddcc51865d612a919d450db6954aa48e3Michael Kolb * 108233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Unless required by applicable law or agreed to in writing, software 118233facddcc51865d612a919d450db6954aa48e3Michael Kolb * distributed under the License is distributed on an "AS IS" BASIS, 128233facddcc51865d612a919d450db6954aa48e3Michael Kolb * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138233facddcc51865d612a919d450db6954aa48e3Michael Kolb * See the License for the specific language governing permissions and 148233facddcc51865d612a919d450db6954aa48e3Michael Kolb * limitations under the License. 158233facddcc51865d612a919d450db6954aa48e3Michael Kolb */ 168233facddcc51865d612a919d450db6954aa48e3Michael Kolb 178233facddcc51865d612a919d450db6954aa48e3Michael Kolbpackage com.android.browser; 188233facddcc51865d612a919d450db6954aa48e3Michael Kolb 198233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.app.AlertDialog; 208233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.content.Context; 218233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.content.DialogInterface; 228233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.content.res.Configuration; 238233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.net.http.SslCertificate; 248233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.net.http.SslError; 258233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.text.format.DateFormat; 268233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.view.LayoutInflater; 278233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.view.View; 288233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.webkit.HttpAuthHandler; 298233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.webkit.SslErrorHandler; 308233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.webkit.WebView; 318233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.widget.LinearLayout; 328233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.widget.TextView; 338233facddcc51865d612a919d450db6954aa48e3Michael Kolb 348233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport java.util.Date; 358233facddcc51865d612a919d450db6954aa48e3Michael Kolb 368233facddcc51865d612a919d450db6954aa48e3Michael Kolb/** 378233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Displays page info 388233facddcc51865d612a919d450db6954aa48e3Michael Kolb * 398233facddcc51865d612a919d450db6954aa48e3Michael Kolb */ 408233facddcc51865d612a919d450db6954aa48e3Michael Kolbpublic class PageDialogsHandler { 418233facddcc51865d612a919d450db6954aa48e3Michael Kolb 428233facddcc51865d612a919d450db6954aa48e3Michael Kolb private Context mContext; 438233facddcc51865d612a919d450db6954aa48e3Michael Kolb private Controller mController; 448233facddcc51865d612a919d450db6954aa48e3Michael Kolb private boolean mPageInfoFromShowSSLCertificateOnError; 458233facddcc51865d612a919d450db6954aa48e3Michael Kolb private Tab mPageInfoView; 468233facddcc51865d612a919d450db6954aa48e3Michael Kolb private AlertDialog mPageInfoDialog; 478233facddcc51865d612a919d450db6954aa48e3Michael Kolb 488233facddcc51865d612a919d450db6954aa48e3Michael Kolb // as SSLCertificateOnError has different style for landscape / portrait, 498233facddcc51865d612a919d450db6954aa48e3Michael Kolb // we have to re-open it when configuration changed 508233facddcc51865d612a919d450db6954aa48e3Michael Kolb private AlertDialog mSSLCertificateOnErrorDialog; 518233facddcc51865d612a919d450db6954aa48e3Michael Kolb private WebView mSSLCertificateOnErrorView; 528233facddcc51865d612a919d450db6954aa48e3Michael Kolb private SslErrorHandler mSSLCertificateOnErrorHandler; 538233facddcc51865d612a919d450db6954aa48e3Michael Kolb private SslError mSSLCertificateOnErrorError; 548233facddcc51865d612a919d450db6954aa48e3Michael Kolb 558233facddcc51865d612a919d450db6954aa48e3Michael Kolb // as SSLCertificate has different style for landscape / portrait, we 568233facddcc51865d612a919d450db6954aa48e3Michael Kolb // have to re-open it when configuration changed 578233facddcc51865d612a919d450db6954aa48e3Michael Kolb private AlertDialog mSSLCertificateDialog; 588233facddcc51865d612a919d450db6954aa48e3Michael Kolb private Tab mSSLCertificateView; 598233facddcc51865d612a919d450db6954aa48e3Michael Kolb private HttpAuthenticationDialog mHttpAuthenticationDialog; 608233facddcc51865d612a919d450db6954aa48e3Michael Kolb 618233facddcc51865d612a919d450db6954aa48e3Michael Kolb public PageDialogsHandler(Context context, Controller controller) { 628233facddcc51865d612a919d450db6954aa48e3Michael Kolb mContext = context; 638233facddcc51865d612a919d450db6954aa48e3Michael Kolb mController = controller; 648233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 658233facddcc51865d612a919d450db6954aa48e3Michael Kolb 668233facddcc51865d612a919d450db6954aa48e3Michael Kolb public void onConfigurationChanged(Configuration config) { 678233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (mPageInfoDialog != null) { 688233facddcc51865d612a919d450db6954aa48e3Michael Kolb mPageInfoDialog.dismiss(); 698233facddcc51865d612a919d450db6954aa48e3Michael Kolb showPageInfo(mPageInfoView, mPageInfoFromShowSSLCertificateOnError); 708233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 718233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (mSSLCertificateDialog != null) { 728233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateDialog.dismiss(); 738233facddcc51865d612a919d450db6954aa48e3Michael Kolb showSSLCertificate(mSSLCertificateView); 748233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 758233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (mSSLCertificateOnErrorDialog != null) { 768233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateOnErrorDialog.dismiss(); 778233facddcc51865d612a919d450db6954aa48e3Michael Kolb showSSLCertificateOnError(mSSLCertificateOnErrorView, mSSLCertificateOnErrorHandler, 788233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateOnErrorError); 798233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 808233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (mHttpAuthenticationDialog != null) { 818233facddcc51865d612a919d450db6954aa48e3Michael Kolb mHttpAuthenticationDialog.reshow(); 828233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 838233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 848233facddcc51865d612a919d450db6954aa48e3Michael Kolb 858233facddcc51865d612a919d450db6954aa48e3Michael Kolb /** 868233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Displays an http-authentication dialog. 878233facddcc51865d612a919d450db6954aa48e3Michael Kolb */ 888233facddcc51865d612a919d450db6954aa48e3Michael Kolb void showHttpAuthentication(final Tab tab, final HttpAuthHandler handler, String host, String realm) { 898233facddcc51865d612a919d450db6954aa48e3Michael Kolb mHttpAuthenticationDialog = new HttpAuthenticationDialog(mContext, host, realm); 908233facddcc51865d612a919d450db6954aa48e3Michael Kolb mHttpAuthenticationDialog.setOkListener(new HttpAuthenticationDialog.OkListener() { 918233facddcc51865d612a919d450db6954aa48e3Michael Kolb public void onOk(String host, String realm, String username, String password) { 928233facddcc51865d612a919d450db6954aa48e3Michael Kolb setHttpAuthUsernamePassword(host, realm, username, password); 938233facddcc51865d612a919d450db6954aa48e3Michael Kolb handler.proceed(username, password); 948233facddcc51865d612a919d450db6954aa48e3Michael Kolb mHttpAuthenticationDialog = null; 958233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 968233facddcc51865d612a919d450db6954aa48e3Michael Kolb }); 978233facddcc51865d612a919d450db6954aa48e3Michael Kolb mHttpAuthenticationDialog.setCancelListener(new HttpAuthenticationDialog.CancelListener() { 988233facddcc51865d612a919d450db6954aa48e3Michael Kolb public void onCancel() { 998233facddcc51865d612a919d450db6954aa48e3Michael Kolb handler.cancel(); 1008233facddcc51865d612a919d450db6954aa48e3Michael Kolb mController.resetTitleAndRevertLockIcon(tab); 1018233facddcc51865d612a919d450db6954aa48e3Michael Kolb mHttpAuthenticationDialog = null; 1028233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 1038233facddcc51865d612a919d450db6954aa48e3Michael Kolb }); 1048233facddcc51865d612a919d450db6954aa48e3Michael Kolb mHttpAuthenticationDialog.show(); 1058233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 1068233facddcc51865d612a919d450db6954aa48e3Michael Kolb 1078233facddcc51865d612a919d450db6954aa48e3Michael Kolb /** 1088233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Set HTTP authentication password. 1098233facddcc51865d612a919d450db6954aa48e3Michael Kolb * 1108233facddcc51865d612a919d450db6954aa48e3Michael Kolb * @param host The host for the password 1118233facddcc51865d612a919d450db6954aa48e3Michael Kolb * @param realm The realm for the password 1128233facddcc51865d612a919d450db6954aa48e3Michael Kolb * @param username The username for the password. If it is null, it means 1138233facddcc51865d612a919d450db6954aa48e3Michael Kolb * password can't be saved. 1148233facddcc51865d612a919d450db6954aa48e3Michael Kolb * @param password The password 1158233facddcc51865d612a919d450db6954aa48e3Michael Kolb */ 1168233facddcc51865d612a919d450db6954aa48e3Michael Kolb public void setHttpAuthUsernamePassword(String host, String realm, 1178233facddcc51865d612a919d450db6954aa48e3Michael Kolb String username, 1188233facddcc51865d612a919d450db6954aa48e3Michael Kolb String password) { 1198233facddcc51865d612a919d450db6954aa48e3Michael Kolb WebView w = mController.getCurrentTopWebView(); 1208233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (w != null) { 1218233facddcc51865d612a919d450db6954aa48e3Michael Kolb w.setHttpAuthUsernamePassword(host, realm, username, password); 1228233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 1238233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 1248233facddcc51865d612a919d450db6954aa48e3Michael Kolb 1258233facddcc51865d612a919d450db6954aa48e3Michael Kolb /** 1268233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Displays a page-info dialog. 1278233facddcc51865d612a919d450db6954aa48e3Michael Kolb * @param tab The tab to show info about 1288233facddcc51865d612a919d450db6954aa48e3Michael Kolb * @param fromShowSSLCertificateOnError The flag that indicates whether 1298233facddcc51865d612a919d450db6954aa48e3Michael Kolb * this dialog was opened from the SSL-certificate-on-error dialog or 1308233facddcc51865d612a919d450db6954aa48e3Michael Kolb * not. This is important, since we need to know whether to return to 1318233facddcc51865d612a919d450db6954aa48e3Michael Kolb * the parent dialog or simply dismiss. 1328233facddcc51865d612a919d450db6954aa48e3Michael Kolb */ 1338233facddcc51865d612a919d450db6954aa48e3Michael Kolb void showPageInfo(final Tab tab, 1348233facddcc51865d612a919d450db6954aa48e3Michael Kolb final boolean fromShowSSLCertificateOnError) { 1358233facddcc51865d612a919d450db6954aa48e3Michael Kolb final LayoutInflater factory = LayoutInflater.from(mContext); 1368233facddcc51865d612a919d450db6954aa48e3Michael Kolb 1378233facddcc51865d612a919d450db6954aa48e3Michael Kolb final View pageInfoView = factory.inflate(R.layout.page_info, null); 1388233facddcc51865d612a919d450db6954aa48e3Michael Kolb 1398233facddcc51865d612a919d450db6954aa48e3Michael Kolb final WebView view = tab.getWebView(); 1408233facddcc51865d612a919d450db6954aa48e3Michael Kolb 1418233facddcc51865d612a919d450db6954aa48e3Michael Kolb String url = null; 1428233facddcc51865d612a919d450db6954aa48e3Michael Kolb String title = null; 1438233facddcc51865d612a919d450db6954aa48e3Michael Kolb 1448233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (view == null) { 1458233facddcc51865d612a919d450db6954aa48e3Michael Kolb url = tab.getUrl(); 1468233facddcc51865d612a919d450db6954aa48e3Michael Kolb title = tab.getTitle(); 1478233facddcc51865d612a919d450db6954aa48e3Michael Kolb } else if (view == mController.getCurrentWebView()) { 1488233facddcc51865d612a919d450db6954aa48e3Michael Kolb // Use the cached title and url if this is the current WebView 1498233facddcc51865d612a919d450db6954aa48e3Michael Kolb url = tab.getCurrentUrl(); 1508233facddcc51865d612a919d450db6954aa48e3Michael Kolb title = tab.getCurrentTitle(); 1518233facddcc51865d612a919d450db6954aa48e3Michael Kolb } else { 1528233facddcc51865d612a919d450db6954aa48e3Michael Kolb url = view.getUrl(); 1538233facddcc51865d612a919d450db6954aa48e3Michael Kolb title = view.getTitle(); 1548233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 1558233facddcc51865d612a919d450db6954aa48e3Michael Kolb 1568233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (url == null) { 1578233facddcc51865d612a919d450db6954aa48e3Michael Kolb url = ""; 1588233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 1598233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (title == null) { 1608233facddcc51865d612a919d450db6954aa48e3Michael Kolb title = ""; 1618233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 1628233facddcc51865d612a919d450db6954aa48e3Michael Kolb 1638233facddcc51865d612a919d450db6954aa48e3Michael Kolb ((TextView) pageInfoView.findViewById(R.id.address)).setText(url); 1648233facddcc51865d612a919d450db6954aa48e3Michael Kolb ((TextView) pageInfoView.findViewById(R.id.title)).setText(title); 1658233facddcc51865d612a919d450db6954aa48e3Michael Kolb 1668233facddcc51865d612a919d450db6954aa48e3Michael Kolb mPageInfoView = tab; 1678233facddcc51865d612a919d450db6954aa48e3Michael Kolb mPageInfoFromShowSSLCertificateOnError = fromShowSSLCertificateOnError; 1688233facddcc51865d612a919d450db6954aa48e3Michael Kolb 1698233facddcc51865d612a919d450db6954aa48e3Michael Kolb AlertDialog.Builder alertDialogBuilder = 1708233facddcc51865d612a919d450db6954aa48e3Michael Kolb new AlertDialog.Builder(mContext) 1718233facddcc51865d612a919d450db6954aa48e3Michael Kolb .setTitle(R.string.page_info) 1728233facddcc51865d612a919d450db6954aa48e3Michael Kolb .setIcon(android.R.drawable.ic_dialog_info) 1738233facddcc51865d612a919d450db6954aa48e3Michael Kolb .setView(pageInfoView) 1748233facddcc51865d612a919d450db6954aa48e3Michael Kolb .setPositiveButton( 1758233facddcc51865d612a919d450db6954aa48e3Michael Kolb R.string.ok, 1768233facddcc51865d612a919d450db6954aa48e3Michael Kolb new DialogInterface.OnClickListener() { 1778233facddcc51865d612a919d450db6954aa48e3Michael Kolb public void onClick(DialogInterface dialog, 1788233facddcc51865d612a919d450db6954aa48e3Michael Kolb int whichButton) { 1798233facddcc51865d612a919d450db6954aa48e3Michael Kolb mPageInfoDialog = null; 1808233facddcc51865d612a919d450db6954aa48e3Michael Kolb mPageInfoView = null; 1818233facddcc51865d612a919d450db6954aa48e3Michael Kolb 1828233facddcc51865d612a919d450db6954aa48e3Michael Kolb // if we came here from the SSL error dialog 1838233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (fromShowSSLCertificateOnError) { 1848233facddcc51865d612a919d450db6954aa48e3Michael Kolb // go back to the SSL error dialog 1858233facddcc51865d612a919d450db6954aa48e3Michael Kolb showSSLCertificateOnError( 1868233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateOnErrorView, 1878233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateOnErrorHandler, 1888233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateOnErrorError); 1898233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 1908233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 1918233facddcc51865d612a919d450db6954aa48e3Michael Kolb }) 1928233facddcc51865d612a919d450db6954aa48e3Michael Kolb .setOnCancelListener( 1938233facddcc51865d612a919d450db6954aa48e3Michael Kolb new DialogInterface.OnCancelListener() { 1948233facddcc51865d612a919d450db6954aa48e3Michael Kolb public void onCancel(DialogInterface dialog) { 1958233facddcc51865d612a919d450db6954aa48e3Michael Kolb mPageInfoDialog = null; 1968233facddcc51865d612a919d450db6954aa48e3Michael Kolb mPageInfoView = null; 1978233facddcc51865d612a919d450db6954aa48e3Michael Kolb 1988233facddcc51865d612a919d450db6954aa48e3Michael Kolb // if we came here from the SSL error dialog 1998233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (fromShowSSLCertificateOnError) { 2008233facddcc51865d612a919d450db6954aa48e3Michael Kolb // go back to the SSL error dialog 2018233facddcc51865d612a919d450db6954aa48e3Michael Kolb showSSLCertificateOnError( 2028233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateOnErrorView, 2038233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateOnErrorHandler, 2048233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateOnErrorError); 2058233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 2068233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 2078233facddcc51865d612a919d450db6954aa48e3Michael Kolb }); 2088233facddcc51865d612a919d450db6954aa48e3Michael Kolb 2098233facddcc51865d612a919d450db6954aa48e3Michael Kolb // if we have a main top-level page SSL certificate set or a certificate 2108233facddcc51865d612a919d450db6954aa48e3Michael Kolb // error 2118233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (fromShowSSLCertificateOnError || 2128233facddcc51865d612a919d450db6954aa48e3Michael Kolb (view != null && view.getCertificate() != null)) { 2138233facddcc51865d612a919d450db6954aa48e3Michael Kolb // add a 'View Certificate' button 2148233facddcc51865d612a919d450db6954aa48e3Michael Kolb alertDialogBuilder.setNeutralButton( 2158233facddcc51865d612a919d450db6954aa48e3Michael Kolb R.string.view_certificate, 2168233facddcc51865d612a919d450db6954aa48e3Michael Kolb new DialogInterface.OnClickListener() { 2178233facddcc51865d612a919d450db6954aa48e3Michael Kolb public void onClick(DialogInterface dialog, 2188233facddcc51865d612a919d450db6954aa48e3Michael Kolb int whichButton) { 2198233facddcc51865d612a919d450db6954aa48e3Michael Kolb mPageInfoDialog = null; 2208233facddcc51865d612a919d450db6954aa48e3Michael Kolb mPageInfoView = null; 2218233facddcc51865d612a919d450db6954aa48e3Michael Kolb 2228233facddcc51865d612a919d450db6954aa48e3Michael Kolb // if we came here from the SSL error dialog 2238233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (fromShowSSLCertificateOnError) { 2248233facddcc51865d612a919d450db6954aa48e3Michael Kolb // go back to the SSL error dialog 2258233facddcc51865d612a919d450db6954aa48e3Michael Kolb showSSLCertificateOnError( 2268233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateOnErrorView, 2278233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateOnErrorHandler, 2288233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateOnErrorError); 2298233facddcc51865d612a919d450db6954aa48e3Michael Kolb } else { 2308233facddcc51865d612a919d450db6954aa48e3Michael Kolb // otherwise, display the top-most certificate from 2318233facddcc51865d612a919d450db6954aa48e3Michael Kolb // the chain 2328233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (view.getCertificate() != null) { 2338233facddcc51865d612a919d450db6954aa48e3Michael Kolb showSSLCertificate(tab); 2348233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 2358233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 2368233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 2378233facddcc51865d612a919d450db6954aa48e3Michael Kolb }); 2388233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 2398233facddcc51865d612a919d450db6954aa48e3Michael Kolb 2408233facddcc51865d612a919d450db6954aa48e3Michael Kolb mPageInfoDialog = alertDialogBuilder.show(); 2418233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 2428233facddcc51865d612a919d450db6954aa48e3Michael Kolb 2438233facddcc51865d612a919d450db6954aa48e3Michael Kolb /** 2448233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Displays the main top-level page SSL certificate dialog 2458233facddcc51865d612a919d450db6954aa48e3Michael Kolb * (accessible from the Page-Info dialog). 2468233facddcc51865d612a919d450db6954aa48e3Michael Kolb * @param tab The tab to show certificate for. 2478233facddcc51865d612a919d450db6954aa48e3Michael Kolb */ 2488233facddcc51865d612a919d450db6954aa48e3Michael Kolb private void showSSLCertificate(final Tab tab) { 2498233facddcc51865d612a919d450db6954aa48e3Michael Kolb final View certificateView = 2508233facddcc51865d612a919d450db6954aa48e3Michael Kolb inflateCertificateView(tab.getWebView().getCertificate()); 2518233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (certificateView == null) { 2528233facddcc51865d612a919d450db6954aa48e3Michael Kolb return; 2538233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 2548233facddcc51865d612a919d450db6954aa48e3Michael Kolb 2558233facddcc51865d612a919d450db6954aa48e3Michael Kolb LayoutInflater factory = LayoutInflater.from(mContext); 2568233facddcc51865d612a919d450db6954aa48e3Michael Kolb 2578233facddcc51865d612a919d450db6954aa48e3Michael Kolb final LinearLayout placeholder = 2588233facddcc51865d612a919d450db6954aa48e3Michael Kolb (LinearLayout)certificateView.findViewById(R.id.placeholder); 2598233facddcc51865d612a919d450db6954aa48e3Michael Kolb 2608233facddcc51865d612a919d450db6954aa48e3Michael Kolb LinearLayout ll = (LinearLayout) factory.inflate( 2618233facddcc51865d612a919d450db6954aa48e3Michael Kolb R.layout.ssl_success, placeholder); 2628233facddcc51865d612a919d450db6954aa48e3Michael Kolb ((TextView)ll.findViewById(R.id.success)) 2638233facddcc51865d612a919d450db6954aa48e3Michael Kolb .setText(R.string.ssl_certificate_is_valid); 2648233facddcc51865d612a919d450db6954aa48e3Michael Kolb 2658233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateView = tab; 2668233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateDialog = 2678233facddcc51865d612a919d450db6954aa48e3Michael Kolb new AlertDialog.Builder(mContext) 2688233facddcc51865d612a919d450db6954aa48e3Michael Kolb .setTitle(R.string.ssl_certificate).setIcon( 2698233facddcc51865d612a919d450db6954aa48e3Michael Kolb R.drawable.ic_dialog_browser_certificate_secure) 2708233facddcc51865d612a919d450db6954aa48e3Michael Kolb .setView(certificateView) 2718233facddcc51865d612a919d450db6954aa48e3Michael Kolb .setPositiveButton(R.string.ok, 2728233facddcc51865d612a919d450db6954aa48e3Michael Kolb new DialogInterface.OnClickListener() { 2738233facddcc51865d612a919d450db6954aa48e3Michael Kolb public void onClick(DialogInterface dialog, 2748233facddcc51865d612a919d450db6954aa48e3Michael Kolb int whichButton) { 2758233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateDialog = null; 2768233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateView = null; 2778233facddcc51865d612a919d450db6954aa48e3Michael Kolb 2788233facddcc51865d612a919d450db6954aa48e3Michael Kolb showPageInfo(tab, false); 2798233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 2808233facddcc51865d612a919d450db6954aa48e3Michael Kolb }) 2818233facddcc51865d612a919d450db6954aa48e3Michael Kolb .setOnCancelListener( 2828233facddcc51865d612a919d450db6954aa48e3Michael Kolb new DialogInterface.OnCancelListener() { 2838233facddcc51865d612a919d450db6954aa48e3Michael Kolb public void onCancel(DialogInterface dialog) { 2848233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateDialog = null; 2858233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateView = null; 2868233facddcc51865d612a919d450db6954aa48e3Michael Kolb 2878233facddcc51865d612a919d450db6954aa48e3Michael Kolb showPageInfo(tab, false); 2888233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 2898233facddcc51865d612a919d450db6954aa48e3Michael Kolb }) 2908233facddcc51865d612a919d450db6954aa48e3Michael Kolb .show(); 2918233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 2928233facddcc51865d612a919d450db6954aa48e3Michael Kolb 2938233facddcc51865d612a919d450db6954aa48e3Michael Kolb /** 2948233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Displays the SSL error certificate dialog. 2958233facddcc51865d612a919d450db6954aa48e3Michael Kolb * @param view The target web-view. 2968233facddcc51865d612a919d450db6954aa48e3Michael Kolb * @param handler The SSL error handler responsible for cancelling the 2978233facddcc51865d612a919d450db6954aa48e3Michael Kolb * connection that resulted in an SSL error or proceeding per user request. 2988233facddcc51865d612a919d450db6954aa48e3Michael Kolb * @param error The SSL error object. 2998233facddcc51865d612a919d450db6954aa48e3Michael Kolb */ 3008233facddcc51865d612a919d450db6954aa48e3Michael Kolb void showSSLCertificateOnError( 3018233facddcc51865d612a919d450db6954aa48e3Michael Kolb final WebView view, final SslErrorHandler handler, 3028233facddcc51865d612a919d450db6954aa48e3Michael Kolb final SslError error) { 3038233facddcc51865d612a919d450db6954aa48e3Michael Kolb 3048233facddcc51865d612a919d450db6954aa48e3Michael Kolb final View certificateView = 3058233facddcc51865d612a919d450db6954aa48e3Michael Kolb inflateCertificateView(error.getCertificate()); 3068233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (certificateView == null) { 3078233facddcc51865d612a919d450db6954aa48e3Michael Kolb return; 3088233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 3098233facddcc51865d612a919d450db6954aa48e3Michael Kolb 3108233facddcc51865d612a919d450db6954aa48e3Michael Kolb LayoutInflater factory = LayoutInflater.from(mContext); 3118233facddcc51865d612a919d450db6954aa48e3Michael Kolb 3128233facddcc51865d612a919d450db6954aa48e3Michael Kolb final LinearLayout placeholder = 3138233facddcc51865d612a919d450db6954aa48e3Michael Kolb (LinearLayout)certificateView.findViewById(R.id.placeholder); 3148233facddcc51865d612a919d450db6954aa48e3Michael Kolb 3158233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (error.hasError(SslError.SSL_UNTRUSTED)) { 3168233facddcc51865d612a919d450db6954aa48e3Michael Kolb LinearLayout ll = (LinearLayout)factory 3178233facddcc51865d612a919d450db6954aa48e3Michael Kolb .inflate(R.layout.ssl_warning, placeholder); 3188233facddcc51865d612a919d450db6954aa48e3Michael Kolb ((TextView)ll.findViewById(R.id.warning)) 3198233facddcc51865d612a919d450db6954aa48e3Michael Kolb .setText(R.string.ssl_untrusted); 3208233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 3218233facddcc51865d612a919d450db6954aa48e3Michael Kolb 3228233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (error.hasError(SslError.SSL_IDMISMATCH)) { 3238233facddcc51865d612a919d450db6954aa48e3Michael Kolb LinearLayout ll = (LinearLayout)factory 3248233facddcc51865d612a919d450db6954aa48e3Michael Kolb .inflate(R.layout.ssl_warning, placeholder); 3258233facddcc51865d612a919d450db6954aa48e3Michael Kolb ((TextView)ll.findViewById(R.id.warning)) 3268233facddcc51865d612a919d450db6954aa48e3Michael Kolb .setText(R.string.ssl_mismatch); 3278233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 3288233facddcc51865d612a919d450db6954aa48e3Michael Kolb 3298233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (error.hasError(SslError.SSL_EXPIRED)) { 3308233facddcc51865d612a919d450db6954aa48e3Michael Kolb LinearLayout ll = (LinearLayout)factory 3318233facddcc51865d612a919d450db6954aa48e3Michael Kolb .inflate(R.layout.ssl_warning, placeholder); 3328233facddcc51865d612a919d450db6954aa48e3Michael Kolb ((TextView)ll.findViewById(R.id.warning)) 3338233facddcc51865d612a919d450db6954aa48e3Michael Kolb .setText(R.string.ssl_expired); 3348233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 3358233facddcc51865d612a919d450db6954aa48e3Michael Kolb 3368233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (error.hasError(SslError.SSL_NOTYETVALID)) { 3378233facddcc51865d612a919d450db6954aa48e3Michael Kolb LinearLayout ll = (LinearLayout)factory 3388233facddcc51865d612a919d450db6954aa48e3Michael Kolb .inflate(R.layout.ssl_warning, placeholder); 3398233facddcc51865d612a919d450db6954aa48e3Michael Kolb ((TextView)ll.findViewById(R.id.warning)) 3408233facddcc51865d612a919d450db6954aa48e3Michael Kolb .setText(R.string.ssl_not_yet_valid); 3418233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 3428233facddcc51865d612a919d450db6954aa48e3Michael Kolb 3438233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateOnErrorHandler = handler; 3448233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateOnErrorView = view; 3458233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateOnErrorError = error; 3468233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateOnErrorDialog = 3478233facddcc51865d612a919d450db6954aa48e3Michael Kolb new AlertDialog.Builder(mContext) 3488233facddcc51865d612a919d450db6954aa48e3Michael Kolb .setTitle(R.string.ssl_certificate).setIcon( 3498233facddcc51865d612a919d450db6954aa48e3Michael Kolb R.drawable.ic_dialog_browser_certificate_partially_secure) 3508233facddcc51865d612a919d450db6954aa48e3Michael Kolb .setView(certificateView) 3518233facddcc51865d612a919d450db6954aa48e3Michael Kolb .setPositiveButton(R.string.ok, 3528233facddcc51865d612a919d450db6954aa48e3Michael Kolb new DialogInterface.OnClickListener() { 3538233facddcc51865d612a919d450db6954aa48e3Michael Kolb public void onClick(DialogInterface dialog, 3548233facddcc51865d612a919d450db6954aa48e3Michael Kolb int whichButton) { 3558233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateOnErrorDialog = null; 3568233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateOnErrorView = null; 3578233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateOnErrorHandler = null; 3588233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateOnErrorError = null; 3598233facddcc51865d612a919d450db6954aa48e3Michael Kolb 3608233facddcc51865d612a919d450db6954aa48e3Michael Kolb view.getWebViewClient().onReceivedSslError( 3618233facddcc51865d612a919d450db6954aa48e3Michael Kolb view, handler, error); 3628233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 3638233facddcc51865d612a919d450db6954aa48e3Michael Kolb }) 3648233facddcc51865d612a919d450db6954aa48e3Michael Kolb .setNeutralButton(R.string.page_info_view, 3658233facddcc51865d612a919d450db6954aa48e3Michael Kolb new DialogInterface.OnClickListener() { 3668233facddcc51865d612a919d450db6954aa48e3Michael Kolb public void onClick(DialogInterface dialog, 3678233facddcc51865d612a919d450db6954aa48e3Michael Kolb int whichButton) { 3688233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateOnErrorDialog = null; 3698233facddcc51865d612a919d450db6954aa48e3Michael Kolb 3708233facddcc51865d612a919d450db6954aa48e3Michael Kolb // do not clear the dialog state: we will 3718233facddcc51865d612a919d450db6954aa48e3Michael Kolb // need to show the dialog again once the 3728233facddcc51865d612a919d450db6954aa48e3Michael Kolb // user is done exploring the page-info details 3738233facddcc51865d612a919d450db6954aa48e3Michael Kolb 3748233facddcc51865d612a919d450db6954aa48e3Michael Kolb showPageInfo(mController.getTabControl() 3758233facddcc51865d612a919d450db6954aa48e3Michael Kolb .getTabFromView(view), 3768233facddcc51865d612a919d450db6954aa48e3Michael Kolb true); 3778233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 3788233facddcc51865d612a919d450db6954aa48e3Michael Kolb }) 3798233facddcc51865d612a919d450db6954aa48e3Michael Kolb .setOnCancelListener( 3808233facddcc51865d612a919d450db6954aa48e3Michael Kolb new DialogInterface.OnCancelListener() { 3818233facddcc51865d612a919d450db6954aa48e3Michael Kolb public void onCancel(DialogInterface dialog) { 3828233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateOnErrorDialog = null; 3838233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateOnErrorView = null; 3848233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateOnErrorHandler = null; 3858233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSSLCertificateOnErrorError = null; 3868233facddcc51865d612a919d450db6954aa48e3Michael Kolb 3878233facddcc51865d612a919d450db6954aa48e3Michael Kolb view.getWebViewClient().onReceivedSslError( 3888233facddcc51865d612a919d450db6954aa48e3Michael Kolb view, handler, error); 3898233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 3908233facddcc51865d612a919d450db6954aa48e3Michael Kolb }) 3918233facddcc51865d612a919d450db6954aa48e3Michael Kolb .show(); 3928233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 3938233facddcc51865d612a919d450db6954aa48e3Michael Kolb 3948233facddcc51865d612a919d450db6954aa48e3Michael Kolb /** 3958233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Inflates the SSL certificate view (helper method). 3968233facddcc51865d612a919d450db6954aa48e3Michael Kolb * @param certificate The SSL certificate. 3978233facddcc51865d612a919d450db6954aa48e3Michael Kolb * @return The resultant certificate view with issued-to, issued-by, 3988233facddcc51865d612a919d450db6954aa48e3Michael Kolb * issued-on, expires-on, and possibly other fields set. 3998233facddcc51865d612a919d450db6954aa48e3Michael Kolb * If the input certificate is null, returns null. 4008233facddcc51865d612a919d450db6954aa48e3Michael Kolb */ 4018233facddcc51865d612a919d450db6954aa48e3Michael Kolb private View inflateCertificateView(SslCertificate certificate) { 4028233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (certificate == null) { 4038233facddcc51865d612a919d450db6954aa48e3Michael Kolb return null; 4048233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 4058233facddcc51865d612a919d450db6954aa48e3Michael Kolb 4068233facddcc51865d612a919d450db6954aa48e3Michael Kolb LayoutInflater factory = LayoutInflater.from(mContext); 4078233facddcc51865d612a919d450db6954aa48e3Michael Kolb 4088233facddcc51865d612a919d450db6954aa48e3Michael Kolb View certificateView = factory.inflate( 4098233facddcc51865d612a919d450db6954aa48e3Michael Kolb R.layout.ssl_certificate, null); 4108233facddcc51865d612a919d450db6954aa48e3Michael Kolb 4118233facddcc51865d612a919d450db6954aa48e3Michael Kolb // issued to: 4128233facddcc51865d612a919d450db6954aa48e3Michael Kolb SslCertificate.DName issuedTo = certificate.getIssuedTo(); 4138233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (issuedTo != null) { 4148233facddcc51865d612a919d450db6954aa48e3Michael Kolb ((TextView) certificateView.findViewById(R.id.to_common)) 4158233facddcc51865d612a919d450db6954aa48e3Michael Kolb .setText(issuedTo.getCName()); 4168233facddcc51865d612a919d450db6954aa48e3Michael Kolb ((TextView) certificateView.findViewById(R.id.to_org)) 4178233facddcc51865d612a919d450db6954aa48e3Michael Kolb .setText(issuedTo.getOName()); 4188233facddcc51865d612a919d450db6954aa48e3Michael Kolb ((TextView) certificateView.findViewById(R.id.to_org_unit)) 4198233facddcc51865d612a919d450db6954aa48e3Michael Kolb .setText(issuedTo.getUName()); 4208233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 4218233facddcc51865d612a919d450db6954aa48e3Michael Kolb 4228233facddcc51865d612a919d450db6954aa48e3Michael Kolb // issued by: 4238233facddcc51865d612a919d450db6954aa48e3Michael Kolb SslCertificate.DName issuedBy = certificate.getIssuedBy(); 4248233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (issuedBy != null) { 4258233facddcc51865d612a919d450db6954aa48e3Michael Kolb ((TextView) certificateView.findViewById(R.id.by_common)) 4268233facddcc51865d612a919d450db6954aa48e3Michael Kolb .setText(issuedBy.getCName()); 4278233facddcc51865d612a919d450db6954aa48e3Michael Kolb ((TextView) certificateView.findViewById(R.id.by_org)) 4288233facddcc51865d612a919d450db6954aa48e3Michael Kolb .setText(issuedBy.getOName()); 4298233facddcc51865d612a919d450db6954aa48e3Michael Kolb ((TextView) certificateView.findViewById(R.id.by_org_unit)) 4308233facddcc51865d612a919d450db6954aa48e3Michael Kolb .setText(issuedBy.getUName()); 4318233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 4328233facddcc51865d612a919d450db6954aa48e3Michael Kolb 4338233facddcc51865d612a919d450db6954aa48e3Michael Kolb // issued on: 4348233facddcc51865d612a919d450db6954aa48e3Michael Kolb String issuedOn = formatCertificateDate( 4358233facddcc51865d612a919d450db6954aa48e3Michael Kolb certificate.getValidNotBeforeDate()); 4368233facddcc51865d612a919d450db6954aa48e3Michael Kolb ((TextView) certificateView.findViewById(R.id.issued_on)) 4378233facddcc51865d612a919d450db6954aa48e3Michael Kolb .setText(issuedOn); 4388233facddcc51865d612a919d450db6954aa48e3Michael Kolb 4398233facddcc51865d612a919d450db6954aa48e3Michael Kolb // expires on: 4408233facddcc51865d612a919d450db6954aa48e3Michael Kolb String expiresOn = formatCertificateDate( 4418233facddcc51865d612a919d450db6954aa48e3Michael Kolb certificate.getValidNotAfterDate()); 4428233facddcc51865d612a919d450db6954aa48e3Michael Kolb ((TextView) certificateView.findViewById(R.id.expires_on)) 4438233facddcc51865d612a919d450db6954aa48e3Michael Kolb .setText(expiresOn); 4448233facddcc51865d612a919d450db6954aa48e3Michael Kolb 4458233facddcc51865d612a919d450db6954aa48e3Michael Kolb return certificateView; 4468233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 4478233facddcc51865d612a919d450db6954aa48e3Michael Kolb 4488233facddcc51865d612a919d450db6954aa48e3Michael Kolb /** 4498233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Formats the certificate date to a properly localized date string. 4508233facddcc51865d612a919d450db6954aa48e3Michael Kolb * @return Properly localized version of the certificate date string and 4518233facddcc51865d612a919d450db6954aa48e3Michael Kolb * the "" if it fails to localize. 4528233facddcc51865d612a919d450db6954aa48e3Michael Kolb */ 4538233facddcc51865d612a919d450db6954aa48e3Michael Kolb private String formatCertificateDate(Date certificateDate) { 4548233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (certificateDate == null) { 4558233facddcc51865d612a919d450db6954aa48e3Michael Kolb return ""; 4568233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 4578233facddcc51865d612a919d450db6954aa48e3Michael Kolb String formattedDate = DateFormat.getDateFormat(mContext) 4588233facddcc51865d612a919d450db6954aa48e3Michael Kolb .format(certificateDate); 4598233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (formattedDate == null) { 4608233facddcc51865d612a919d450db6954aa48e3Michael Kolb return ""; 4618233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 4628233facddcc51865d612a919d450db6954aa48e3Michael Kolb return formattedDate; 4638233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 4648233facddcc51865d612a919d450db6954aa48e3Michael Kolb 4658233facddcc51865d612a919d450db6954aa48e3Michael Kolb} 466