146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)/* 246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * Copyright (C) 2012 The Android Open Source Project 346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * 446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License"); 546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * you may not use this file except in compliance with the License. 646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * You may obtain a copy of the License at 746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * 846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * http://www.apache.org/licenses/LICENSE-2.0 946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * 1046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * Unless required by applicable law or agreed to in writing, software 1146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS, 1246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * See the License for the specific language governing permissions and 1446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * limitations under the License. 1546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 1646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 1746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)package com.android.webview.chromium; 1846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 1946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.content.ActivityNotFoundException; 2046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.content.Context; 2146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.content.Intent; 221e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdochimport android.graphics.Bitmap; 236138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles)import android.graphics.BitmapFactory; 246138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles)import android.graphics.Canvas; 256138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles)import android.graphics.Color; 2646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.graphics.Picture; 277da9c0c080655cfd18bb4ab0937d89be4c2ca659Marcin Kosibaimport android.net.http.ErrorStrings; 2862c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurunimport android.net.http.SslError; 2946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.os.Handler; 3046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.os.Looper; 31251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liuimport android.os.Message; 3246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.provider.Browser; 3346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.util.Log; 3446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.KeyEvent; 35e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liuimport android.view.View; 3646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.ConsoleMessage; 374320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liuimport android.webkit.DownloadListener; 38885c764368483b3082be2eccfab3c8a9f72f95b1Kristian Monsenimport android.webkit.GeolocationPermissions; 396832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsenimport android.webkit.JsDialogHelper; 4046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.JsPromptResult; 4146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.JsResult; 4262c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurunimport android.webkit.SslErrorHandler; 43809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liuimport android.webkit.ValueCallback; 4446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebChromeClient; 45e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liuimport android.webkit.WebChromeClient.CustomViewCallback; 4646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebResourceResponse; 4746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebView; 4846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewClient; 4946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 5046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.AwContentsClient; 5146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.AwHttpAuthHandler; 5246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.InterceptedRequestData; 5346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.JsPromptResultReceiver; 5446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.JsResultReceiver; 5530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdochimport org.chromium.base.ThreadUtils; 5646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.content.browser.ContentView; 5746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.content.browser.ContentViewClient; 58245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixonimport org.chromium.content.common.TraceEvent; 5946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 606138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles)import java.lang.ref.SoftReference; 6146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import java.net.URISyntaxException; 6246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 6346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)/** 6446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * An adapter class that forwards the callbacks from {@link ContentViewClient} 6546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * to the appropriate {@link WebViewClient} or {@link WebChromeClient}. 6646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * 6746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * An instance of this class is associated with one {@link WebViewChromium} 6846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * instance. A WebViewChromium is a WebView implementation provider (that is 6946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * android.webkit.WebView delegates all functionality to it) and has exactly 7046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * one corresponding {@link ContentView} instance. 7146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * 7246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * A {@link ContentViewClient} may be shared between multiple {@link ContentView}s, 7346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * and hence multiple WebViews. Many WebViewClient methods pass the source 7446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * WebView as an argument. This means that we either need to pass the 7546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * corresponding ContentView to the corresponding ContentViewClient methods, 7646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * or use an instance of ContentViewClientAdapter per WebViewChromium, to 7746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * allow the source WebView to be injected by ContentViewClientAdapter. We 7846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * choose the latter, because it makes for a cleaner design. 7946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 8046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)public class WebViewContentsClientAdapter extends AwContentsClient { 81081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon // TAG is chosen for consistency with classic webview tracing. 82081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon private static final String TAG = "WebViewCallback"; 83081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon // Enables API callback tracing 84081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon private static final boolean TRACE = android.webkit.DebugFlags.TRACE_CALLBACK; 8546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The WebView instance that this adapter is serving. 8646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private final WebView mWebView; 8746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The WebViewClient instance that was passed to WebView.setWebViewClient(). 8846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private WebViewClient mWebViewClient; 89384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen // The WebChromeClient instance that was passed to WebView.setContentViewClient(). 9046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private WebChromeClient mWebChromeClient; 9146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The listener receiving find-in-page API results. 9246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private WebView.FindListener mFindListener; 9346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The listener receiving notifications of screen updates. 9446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private WebView.PictureListener mPictureListener; 9546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 964320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu private DownloadListener mDownloadListener; 974320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu 989b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch private Handler mUiThreadHandler; 999b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 1006138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles) private SoftReference<Bitmap> mCachedDefaultVideoPoster; 1016138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles) 1029b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch private static final int NEW_WEBVIEW_CREATED = 100; 1039b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 10446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 10546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * Adapter constructor. 10646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * 10746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @param webView the {@link WebView} instance that this adapter is serving. 10846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 10946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) WebViewContentsClientAdapter(WebView webView) { 11046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (webView == null) { 11146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) throw new IllegalArgumentException("webView can't be null"); 11246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 11346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 11446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebView = webView; 11546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) setWebViewClient(null); 1169b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 1179b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch mUiThreadHandler = new Handler() { 1189b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 1199b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch @Override 1209b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch public void handleMessage(Message msg) { 1219b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch switch(msg.what) { 1229b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch case NEW_WEBVIEW_CREATED: 1231ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch WebView.WebViewTransport t = (WebView.WebViewTransport) msg.obj; 1241ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch WebView newWebView = t.getWebView(); 1251ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch if (newWebView == mWebView) { 1261ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch throw new IllegalArgumentException( 1271ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch "Parent WebView cannot host it's own popup window. Please " + 1281ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch "use WebSettings.setSupportMultipleWindows(false)"); 1291ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch } 1301ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch 131bbfef40e5fc625f4821f012fae7f16468b7308cfJonathan Dixon if (newWebView != null && newWebView.copyBackForwardList().getSize() != 0) { 1321ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch throw new IllegalArgumentException( 1331ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch "New WebView for popup window must not have been previously " + 1341ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch "navigated."); 1351ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch } 1361ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch 1371ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch WebViewChromium.completeWindowCreation(mWebView, newWebView); 1389b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch break; 1399b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch default: 1409b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch throw new IllegalStateException(); 1419b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch } 1429b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch } 1439b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch }; 1449b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 14546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 14646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 14746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // WebViewClassic is coded in such a way that even if a null WebViewClient is set, 14846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // certain actions take place. 14946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // We choose to replicate this behavior by using a NullWebViewClient implementation (also known 15046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // as the Null Object pattern) rather than duplicating the WebViewClassic approach in 15146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // ContentView. 15246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) static class NullWebViewClient extends WebViewClient { 15346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 15446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) { 15546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // TODO: Investigate more and add a test case. 15646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // This is a copy of what Clank does. The WebViewCore key handling code and Clank key 15746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // handling code differ enough that it's not trivial to figure out how keycodes are 15846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // being filtered. 15946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) int keyCode = event.getKeyCode(); 16046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (keyCode == KeyEvent.KEYCODE_MENU || 16146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_HOME || 16246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_BACK || 16346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_CALL || 16446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_ENDCALL || 16546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_POWER || 16646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_HEADSETHOOK || 16746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_CAMERA || 16846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_FOCUS || 16946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || 17046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_VOLUME_MUTE || 17146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_VOLUME_UP) { 17246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return true; 17346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 17446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return false; 17546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 17646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 17746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 17846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean shouldOverrideUrlLoading(WebView view, String url) { 17946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) Intent intent; 18046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // Perform generic parsing of the URI to turn it into an Intent. 18146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) try { 18246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME); 18346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } catch (URISyntaxException ex) { 18446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) Log.w(TAG, "Bad URI " + url + ": " + ex.getMessage()); 18546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return false; 18646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 18746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // Sanitize the Intent, ensuring web pages can not bypass browser 18846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // security (only access to BROWSABLE activities). 18946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) intent.addCategory(Intent.CATEGORY_BROWSABLE); 19046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) intent.setComponent(null); 19146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // Pass the package name as application ID so that the intent from the 19246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // same application can be opened in the same tab. 193fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu intent.putExtra(Browser.EXTRA_APPLICATION_ID, 194fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu view.getContext().getPackageName()); 19546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) try { 196fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu view.getContext().startActivity(intent); 19746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } catch (ActivityNotFoundException ex) { 19846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) Log.w(TAG, "No application can handle " + url); 19946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return false; 20046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 20146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return true; 20246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 20346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 20446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 20546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) void setWebViewClient(WebViewClient client) { 20646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (client != null) { 20746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient = client; 20846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } else { 209fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu mWebViewClient = new NullWebViewClient(); 21046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 21146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 21246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 21346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) void setWebChromeClient(WebChromeClient client) { 214384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen mWebChromeClient = client; 21546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 21646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 2174320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu void setDownloadListener(DownloadListener listener) { 2184320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu mDownloadListener = listener; 2194320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu } 2204320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu 22146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) void setFindListener(WebView.FindListener listener) { 22246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mFindListener = listener; 22346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 22446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 22546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) void setPictureListener(WebView.PictureListener listener) { 22646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mPictureListener = listener; 22746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 22846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 22946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) //-------------------------------------------------------------------------------------------- 230245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon // Adapter for all the methods. 23146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) //-------------------------------------------------------------------------------------------- 23246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 23346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 234809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu * @see AwContentsClient#getVisitedHistory 235809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu */ 236809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu @Override 237809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu public void getVisitedHistory(ValueCallback<String[]> callback) { 238245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 239384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen if (mWebChromeClient != null) { 240081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "getVisitedHistory"); 241384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen mWebChromeClient.getVisitedHistory(callback); 242384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen } 243245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 244809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu } 245809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu 246809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu /** 2475e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu * @see AwContentsClient#doUpdateVisiteHistory(String, boolean) 2485e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu */ 2495e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu @Override 2505e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu public void doUpdateVisitedHistory(String url, boolean isReload) { 251245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 252081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "doUpdateVisitedHistory=" + url + " reload=" + isReload); 2535e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu mWebViewClient.doUpdateVisitedHistory(mWebView, url, isReload); 254245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 2555e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu } 2565e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu 2575e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu /** 25846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see AwContentsClient#onProgressChanged(int) 25946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 26046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 26146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onProgressChanged(int progress) { 262245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 263384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen if (mWebChromeClient != null) { 264081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onProgressChanged=" + progress); 265384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen mWebChromeClient.onProgressChanged(mWebView, progress); 266384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen } 267245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 26846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 26946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 27046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 27146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see AwContentsClient#shouldInterceptRequest(java.lang.String) 27246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 27346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 27446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public InterceptedRequestData shouldInterceptRequest(String url) { 275245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 276081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "shouldInterceptRequest=" + url); 27746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) WebResourceResponse response = mWebViewClient.shouldInterceptRequest(mWebView, url); 278245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 27946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (response == null) return null; 28046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return new InterceptedRequestData( 28146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) response.getMimeType(), 28246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) response.getEncoding(), 28346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) response.getData()); 28446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 28546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 28646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 287f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon * @see AwContentsClient#shouldOverrideUrlLoading(java.lang.String) 28846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 289245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon @Override 290f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon public boolean shouldOverrideUrlLoading(String url) { 291245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 292081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "shouldOverrideUrlLoading=" + url); 293245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon boolean result = mWebViewClient.shouldOverrideUrlLoading(mWebView, url); 294245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 295245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon return result; 29646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 29746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 29846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 29946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see AwContentsClient#onUnhandledKeyEvent(android.view.KeyEvent) 30046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 30146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 30246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onUnhandledKeyEvent(KeyEvent event) { 303245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 304081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onUnhandledKeyEvent"); 30546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient.onUnhandledKeyEvent(mWebView, event); 306245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 30746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 30846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 30946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 31046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see AwContentsClient#onConsoleMessage(android.webkit.ConsoleMessage) 31146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 31246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 31346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean onConsoleMessage(ConsoleMessage consoleMessage) { 314245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 315384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen boolean result; 316384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen if (mWebChromeClient != null) { 317081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onConsoleMessage"); 318384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen result = mWebChromeClient.onConsoleMessage(consoleMessage); 3191a0ca658d1d188ed9dc9b2163be0f2ee89e06a1eKristian Monsen String message = consoleMessage.message(); 3201a0ca658d1d188ed9dc9b2163be0f2ee89e06a1eKristian Monsen if (result && message != null && message.startsWith("[blocked]")) { 3211a0ca658d1d188ed9dc9b2163be0f2ee89e06a1eKristian Monsen Log.e(TAG, "Blocked URL: " + message); 3221a0ca658d1d188ed9dc9b2163be0f2ee89e06a1eKristian Monsen } 323384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen } else { 324384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen result = false; 325384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen } 326245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 327245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon return result; 32846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 32946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 33046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 33146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see AwContentsClient#onFindResultReceived(int,int,boolean) 33246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 33346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 33446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onFindResultReceived(int activeMatchOrdinal, int numberOfMatches, 33546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) boolean isDoneCounting) { 33646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (mFindListener == null) return; 337245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 338081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onFindResultReceived"); 33946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mFindListener.onFindResultReceived(activeMatchOrdinal, numberOfMatches, isDoneCounting); 340245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 34146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 34246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 3435ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil /** 3445ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil * @See AwContentsClient#onNewPicture(Picture) 3455ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil */ 3469c5a40623b62737244deb2d04a98830d7ffa8404Leandro Gracia Gil @Override 3475ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil public void onNewPicture(Picture picture) { 3485ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil if (mPictureListener == null) return; 349245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 350081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onNewPicture"); 3515ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil mPictureListener.onNewPicture(mWebView, picture); 352245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 3535ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil } 3545ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil 35546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 35646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onLoadResource(String url) { 357245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 358081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onLoadResource=" + url); 35946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient.onLoadResource(mWebView, url); 360245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 36146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 36246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 3639b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch @Override 3649b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch public boolean onCreateWindow(boolean isDialog, boolean isUserGesture) { 3659b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch Message m = mUiThreadHandler.obtainMessage( 3669b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch NEW_WEBVIEW_CREATED, mWebView.new WebViewTransport()); 367245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 368384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen boolean result; 369384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen if (mWebChromeClient != null) { 370081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onCreateWindow"); 371384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen result = mWebChromeClient.onCreateWindow(mWebView, isDialog, isUserGesture, m); 372384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen } else { 373384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen result = false; 374384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen } 375245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 376245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon return result; 3779b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch } 3789b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 379d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch /** 380d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch * @see AwContentsClient#onCloseWindow() 381d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch */ 382245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon @Override 383d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch public void onCloseWindow() { 384245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 385384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen if (mWebChromeClient != null) { 386081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onCloseWindow"); 387384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen mWebChromeClient.onCloseWindow(mWebView); 388384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen } 389245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 390d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch } 391d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch 392d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch /** 393d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch * @see AwContentsClient#onRequestFocus() 394d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch */ 395245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon @Override 396d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch public void onRequestFocus() { 397245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 398384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen if (mWebChromeClient != null) { 399081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onRequestFocus"); 400384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen mWebChromeClient.onRequestFocus(mWebView); 401384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen } 402245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 403d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch } 404d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch 4051e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch /** 406690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun * @see AwContentsClient#onReceivedTouchIconUrl(String url, boolean precomposed) 407690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun */ 408690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun @Override 409690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun public void onReceivedTouchIconUrl(String url, boolean precomposed) { 410245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 411384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen if (mWebChromeClient != null) { 412081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onReceivedTouchIconUrl=" + url); 413384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen mWebChromeClient.onReceivedTouchIconUrl(mWebView, url, precomposed); 414384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen } 415245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 416690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun } 417690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun 418690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun /** 4191e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch * @see AwContentsClient#onReceivedIcon(Bitmap bitmap) 4201e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch */ 4211e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch @Override 4221e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch public void onReceivedIcon(Bitmap bitmap) { 423245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 424384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen if (mWebChromeClient != null) { 425081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onReceivedIcon"); 426384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen mWebChromeClient.onReceivedIcon(mWebView, bitmap); 427384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen } 428245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 4291e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch } 4301e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch 43146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 43246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#onPageStarted(String) 43346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 43446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 43546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onPageStarted(String url) { 436245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 437081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onPageStarted=" + url); 438f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon mWebViewClient.onPageStarted(mWebView, url, mWebView.getFavicon()); 439245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 44046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 44146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 44246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 44346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#onPageFinished(String) 44446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 44546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 44646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onPageFinished(String url) { 447245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 448081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onPageFinished=" + url); 44946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient.onPageFinished(mWebView, url); 450245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 451e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch 452e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // See b/8208948 453e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // This fakes an onNewPicture callback after onPageFinished to allow 454e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // CTS tests to run in an un-flaky manner. This is required as the 455e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // path for sending Picture updates in Chromium are decoupled from the 456e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // page loading callbacks, i.e. the Chrome compositor may draw our 457e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // content and send the Picture before onPageStarted or onPageFinished 458e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // are invoked. The CTS harness discards any pictures it receives before 459e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // onPageStarted is invoked, so in the case we get the Picture before that and 460e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // no further updates after onPageStarted, we'll fail the test by timing 461e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // out waiting for a Picture. 462e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // To ensure backwards compatibility, we need to defer sending Picture updates 463e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // until onPageFinished has been invoked. This work is being done 464e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // upstream, and we can revert this hack when it lands. 465e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch if (mPictureListener != null) { 46630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch ThreadUtils.postOnUiThreadDelayed(new Runnable() { 467e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch @Override 468e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch public void run() { 469e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch UnimplementedWebViewApi.invoke(); 470e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch if (mPictureListener != null) { 471081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onPageFinished-fake"); 47219b22dbf30aec2f35bfbdbc80f9fa01e98d563e8Ben Murdoch mPictureListener.onNewPicture(mWebView, new Picture()); 473e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch } 474e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch } 475e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch }, 100); 476e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch } 47746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 47846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 47946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 48046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#onReceivedError(int,String,String) 48146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 48246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 48346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onReceivedError(int errorCode, String description, String failingUrl) { 4847da9c0c080655cfd18bb4ab0937d89be4c2ca659Marcin Kosiba if (description == null || description.isEmpty()) { 4857da9c0c080655cfd18bb4ab0937d89be4c2ca659Marcin Kosiba // ErrorStrings is @hidden, so we can't do this in AwContents. 4867da9c0c080655cfd18bb4ab0937d89be4c2ca659Marcin Kosiba // Normally the net/ layer will set a valid description, but for synthesized callbacks 4877da9c0c080655cfd18bb4ab0937d89be4c2ca659Marcin Kosiba // (like in the case for intercepted requests) AwContents will pass in null. 4887da9c0c080655cfd18bb4ab0937d89be4c2ca659Marcin Kosiba description = ErrorStrings.getString(errorCode, mWebView.getContext()); 4897da9c0c080655cfd18bb4ab0937d89be4c2ca659Marcin Kosiba } 490245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 491081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onReceivedError=" + failingUrl); 49246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient.onReceivedError(mWebView, errorCode, description, failingUrl); 493245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 494f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon } 495f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon 49646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 497f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon * @see ContentViewClient#onReceivedTitle(String) 49846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 499245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon @Override 500f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon public void onReceivedTitle(String title) { 501245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 502384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen if (mWebChromeClient != null) { 503081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onReceivedTitle"); 504384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen mWebChromeClient.onReceivedTitle(mWebView, title); 505384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen } 506245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 50746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 50846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 50946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 51046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 51146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#shouldOverrideKeyEvent(KeyEvent) 51246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 51346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 51446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean shouldOverrideKeyEvent(KeyEvent event) { 515b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon // TODO(joth): The expression here is a workaround for http://b/7697782 :- 516b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon // 1. The check for system key should be made in AwContents or ContentViewCore, 517b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon // before shouldOverrideKeyEvent() is called at all. 518b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon // 2. shouldOverrideKeyEvent() should be called in onKeyDown/onKeyUp, not from 519b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon // dispatchKeyEvent(). 520245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon if (event.isSystem()) return true; 521245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 522081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "shouldOverrideKeyEvent"); 523245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon boolean result = mWebViewClient.shouldOverrideKeyEvent(mWebView, event); 524245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 525245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon return result; 52646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 52746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 52846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 52946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 53046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#onStartContentIntent(Context, String) 5313e9ca893bb8fb7e0038c04bd04ae78f40233db4fBo Liu * Callback when detecting a click on a content link. 53246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 533f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon // TODO: Delete this method when removed from base class. 53446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onStartContentIntent(Context context, String contentUrl) { 535245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 536081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "shouldOverrideUrlLoading=" + contentUrl); 5373e9ca893bb8fb7e0038c04bd04ae78f40233db4fBo Liu mWebViewClient.shouldOverrideUrlLoading(mWebView, contentUrl); 538245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 53946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 54046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 5416832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen @Override 5426832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen public void onGeolocationPermissionsShowPrompt(String origin, 5436832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen GeolocationPermissions.Callback callback) { 544245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 545384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen if (mWebChromeClient != null) { 546081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onGeolocationPermissionsShowPrompt"); 547384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen mWebChromeClient.onGeolocationPermissionsShowPrompt(origin, callback); 548384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen } 549245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 5506832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } 55146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 5526832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen @Override 5536832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen public void onGeolocationPermissionsHidePrompt() { 554245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 555384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen if (mWebChromeClient != null) { 556081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onGeolocationPermissionsHidePrompt"); 557384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen mWebChromeClient.onGeolocationPermissionsHidePrompt(); 558384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen } 559245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 56046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 56146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 56246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private static class JsPromptResultReceiverAdapter implements JsResult.ResultReceiver { 5636832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen private JsPromptResultReceiver mChromePromptResultReceiver; 5646832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen private JsResultReceiver mChromeResultReceiver; 5656832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen // We hold onto the JsPromptResult here, just to avoid the need to downcast 5666832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen // in onJsResultComplete. 5676832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen private final JsPromptResult mPromptResult = new JsPromptResult(this); 56846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 56946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public JsPromptResultReceiverAdapter(JsPromptResultReceiver receiver) { 5706832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen mChromePromptResultReceiver = receiver; 5716832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } 5726832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen 5736832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen public JsPromptResultReceiverAdapter(JsResultReceiver receiver) { 57446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mChromeResultReceiver = receiver; 57546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 57646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 57746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public JsPromptResult getPromptResult() { 57846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return mPromptResult; 57946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 58046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 58146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 58246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onJsResultComplete(JsResult result) { 5836832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen if (mChromePromptResultReceiver != null) { 5846832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen if (mPromptResult.getResult()) { 5856832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen mChromePromptResultReceiver.confirm(mPromptResult.getStringResult()); 5866832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } else { 5876832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen mChromePromptResultReceiver.cancel(); 5886832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } 58946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } else { 5906832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen if (mPromptResult.getResult()) { 5916832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen mChromeResultReceiver.confirm(); 5926832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } else { 5936832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen mChromeResultReceiver.cancel(); 5946832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } 59546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 59646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 59746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 59846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 59946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 60046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void handleJsAlert(String url, String message, JsResultReceiver receiver) { 601245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 602384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen if (mWebChromeClient != null) { 603384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen final JsPromptResult res = 604384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen new JsPromptResultReceiverAdapter(receiver).getPromptResult(); 605081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onJsAlert"); 606384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen if (!mWebChromeClient.onJsAlert(mWebView, url, message, res)) { 607384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen new JsDialogHelper(res, JsDialogHelper.ALERT, null, message, url) 608384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen .showDialog(mWebView.getContext()); 609384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen } 610fa824b4e111b53fb0981eb0dec3d254bf2c300eeKristian Monsen } else { 611fa824b4e111b53fb0981eb0dec3d254bf2c300eeKristian Monsen receiver.cancel(); 6126832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } 613245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 61446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 61546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 61646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 61746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void handleJsBeforeUnload(String url, String message, JsResultReceiver receiver) { 618245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 619384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen if (mWebChromeClient != null) { 620384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen final JsPromptResult res = 621384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen new JsPromptResultReceiverAdapter(receiver).getPromptResult(); 622081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onJsBeforeUnload"); 623384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen if (!mWebChromeClient.onJsBeforeUnload(mWebView, url, message, res)) { 624384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen new JsDialogHelper(res, JsDialogHelper.UNLOAD, null, message, url) 625384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen .showDialog(mWebView.getContext()); 626384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen } 627fa824b4e111b53fb0981eb0dec3d254bf2c300eeKristian Monsen } else { 628fa824b4e111b53fb0981eb0dec3d254bf2c300eeKristian Monsen receiver.cancel(); 6296832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } 630245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 63146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 63246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 63346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 63446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void handleJsConfirm(String url, String message, JsResultReceiver receiver) { 635245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 636384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen if (mWebChromeClient != null) { 637384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen final JsPromptResult res = 638384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen new JsPromptResultReceiverAdapter(receiver).getPromptResult(); 639081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onJsConfirm"); 640384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen if (!mWebChromeClient.onJsConfirm(mWebView, url, message, res)) { 641384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen new JsDialogHelper(res, JsDialogHelper.CONFIRM, null, message, url) 642384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen .showDialog(mWebView.getContext()); 643384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen } 644fa824b4e111b53fb0981eb0dec3d254bf2c300eeKristian Monsen } else { 645fa824b4e111b53fb0981eb0dec3d254bf2c300eeKristian Monsen receiver.cancel(); 6466832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } 647245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 64846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 64946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 65046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 65146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void handleJsPrompt(String url, String message, String defaultValue, 65246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) JsPromptResultReceiver receiver) { 653245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 654384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen if (mWebChromeClient != null) { 655384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen final JsPromptResult res = 656384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen new JsPromptResultReceiverAdapter(receiver).getPromptResult(); 657081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onJsPrompt"); 658384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen if (!mWebChromeClient.onJsPrompt(mWebView, url, message, defaultValue, res)) { 659384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen new JsDialogHelper(res, JsDialogHelper.PROMPT, defaultValue, message, url) 660384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen .showDialog(mWebView.getContext()); 661384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen } 662fa824b4e111b53fb0981eb0dec3d254bf2c300eeKristian Monsen } else { 663fa824b4e111b53fb0981eb0dec3d254bf2c300eeKristian Monsen receiver.cancel(); 6646832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } 665245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 66646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 66746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 66846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 66946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onReceivedHttpAuthRequest(AwHttpAuthHandler handler, String host, String realm) { 670245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 671081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onReceivedHttpAuthRequest=" + host); 67246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient.onReceivedHttpAuthRequest(mWebView, 67346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) new AwHttpAuthHandlerAdapter(handler), host, realm); 674245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 67546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 67646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 677251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu @Override 67862c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun public void onReceivedSslError(final ValueCallback<Boolean> callback, SslError error) { 67962c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun SslErrorHandler handler = new SslErrorHandler() { 68062c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun @Override 68162c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun public void proceed() { 68262c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun postProceed(true); 68362c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun } 68462c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun @Override 68562c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun public void cancel() { 68662c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun postProceed(false); 68762c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun } 68862c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun private void postProceed(final boolean proceed) { 68962c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun post(new Runnable() { 69062c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun @Override 69162c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun public void run() { 69262c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun callback.onReceiveValue(proceed); 69362c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun } 69462c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun }); 69562c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun } 69662c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun }; 697245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 698081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onReceivedSslError"); 69962c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun mWebViewClient.onReceivedSslError(mWebView, handler, error); 700245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 70162c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun } 70262c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun 70362c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun @Override 70497a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu public void onReceivedLoginRequest(String realm, String account, String args) { 705245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 706081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onReceivedLoginRequest=" + realm); 70797a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu mWebViewClient.onReceivedLoginRequest(mWebView, realm, account, args); 708245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 70997a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu } 71097a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu 71197a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu @Override 712251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu public void onFormResubmission(Message dontResend, Message resend) { 713245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 714081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onFormResubmission"); 715251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu mWebViewClient.onFormResubmission(mWebView, dontResend, resend); 716245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 717251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu } 718251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu 7194320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu @Override 7204320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu public void onDownloadStart(String url, 7214320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu String userAgent, 7224320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu String contentDisposition, 7234320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu String mimeType, 7244320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu long contentLength) { 7254320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu if (mDownloadListener != null) { 726245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 727081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onDownloadStart"); 7284320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu mDownloadListener.onDownloadStart(url, 7294320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu userAgent, 7304320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu contentDisposition, 7314320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu mimeType, 7324320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu contentLength); 733245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 7344320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu } 7354320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu } 7364320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu 7373c4cc4ad5269837048ffabfa3e749a30b6d17e25Alan Leung @Override 7383520eb778d668dc76ca4541c69abd568b9d02691Mikhail Naganov public void onScaleChangedScaled(float oldScale, float newScale) { 739245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 740081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, " onScaleChangedScaled"); 7413c4cc4ad5269837048ffabfa3e749a30b6d17e25Alan Leung mWebViewClient.onScaleChanged(mWebView, oldScale, newScale); 742245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 7433c4cc4ad5269837048ffabfa3e749a30b6d17e25Alan Leung } 7444320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu 7452729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai @Override 746bbe58198e8cce0c35c42809aebc965aa2b476e1cTao Bai public void onShowCustomView(View view, CustomViewCallback cb) { 747245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 748384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen if (mWebChromeClient != null) { 749081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onShowCustomView"); 750384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen mWebChromeClient.onShowCustomView(view, cb); 751384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen } 752245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 753e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liu } 754e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liu 7552729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai @Override 756782fea892aaa4a0867547697d49f6a1dd265d437Tao Bai public void onHideCustomView() { 757245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 758384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen if (mWebChromeClient != null) { 759081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "onHideCustomView"); 760384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen mWebChromeClient.onHideCustomView(); 761384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen } 762245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 763782fea892aaa4a0867547697d49f6a1dd265d437Tao Bai } 764782fea892aaa4a0867547697d49f6a1dd265d437Tao Bai 765782fea892aaa4a0867547697d49f6a1dd265d437Tao Bai @Override 7662729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai protected View getVideoLoadingProgressView() { 767245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 768384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen View result; 769384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen if (mWebChromeClient != null) { 770081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "getVideoLoadingProgressView"); 771384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen result = mWebChromeClient.getVideoLoadingProgressView(); 772384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen } else { 773384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen result = null; 774384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen } 775245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 776245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon return result; 7772729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai } 7782729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai 779be2a57c401cf1bb65d541b0bef30d71962d22488Tao Bai @Override 780be2a57c401cf1bb65d541b0bef30d71962d22488Tao Bai public Bitmap getDefaultVideoPoster() { 781245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 7826138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles) Bitmap result = null; 783384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen if (mWebChromeClient != null) { 784081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon if (TRACE) Log.d(TAG, "getDefaultVideoPoster"); 785384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen result = mWebChromeClient.getDefaultVideoPoster(); 7866138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles) } 7876138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles) if (result == null) { 7886138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles) if (mCachedDefaultVideoPoster != null) { 7896138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles) result = mCachedDefaultVideoPoster.get(); 7906138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles) } 7916138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles) if (result == null) { 7926138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles) Bitmap poster = BitmapFactory.decodeResource( 7936138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles) mWebView.getContext().getResources(), 7946138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles) com.android.internal.R.drawable.ic_media_video_poster); 7956138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles) result = Bitmap.createBitmap(poster.getWidth(), 7966138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles) poster.getHeight(), 7976138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles) poster.getConfig()); 7986138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles) result.eraseColor(Color.GRAY); 7996138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles) Canvas canvas = new Canvas(result); 8006138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles) canvas.drawBitmap(poster, 0f, 0f, null); 8016138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles) mCachedDefaultVideoPoster = new SoftReference<Bitmap>(result); 8026138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles) } 803384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen } 804245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 805245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon return result; 806be2a57c401cf1bb65d541b0bef30d71962d22488Tao Bai } 807be2a57c401cf1bb65d541b0bef30d71962d22488Tao Bai 80846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private static class AwHttpAuthHandlerAdapter extends android.webkit.HttpAuthHandler { 80946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private AwHttpAuthHandler mAwHandler; 81046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 81146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public AwHttpAuthHandlerAdapter(AwHttpAuthHandler awHandler) { 81246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mAwHandler = awHandler; 81346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 81446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 81546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 81646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void proceed(String username, String password) { 81746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (username == null) { 81846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) username = ""; 81946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 82046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 82146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (password == null) { 82246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) password = ""; 82346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 82446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mAwHandler.proceed(username, password); 82546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 82646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 82746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 82846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void cancel() { 82946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mAwHandler.cancel(); 83046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 83146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 83246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 83346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean useHttpAuthUsernamePassword() { 834d32343c77868461af07738ac7abd802000490d3dBen Murdoch return mAwHandler.isFirstAttempt(); 83546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 83646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 83746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)} 838