1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)package org.chromium.content.browser;
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.app.Activity;
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.content.Context;
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.content.res.Configuration;
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.graphics.Bitmap;
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.graphics.Canvas;
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.graphics.Rect;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.os.Build;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.util.AttributeSet;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.view.KeyEvent;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.view.MotionEvent;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.view.View;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.view.accessibility.AccessibilityEvent;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.view.accessibility.AccessibilityNodeInfo;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.view.inputmethod.EditorInfo;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.view.inputmethod.InputConnection;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.widget.FrameLayout;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import com.google.common.annotations.VisibleForTesting;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.content.common.TraceEvent;
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)import org.chromium.ui.base.WindowAndroid;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The containing view for {@link ContentViewCore} that exists in the Android UI hierarchy and
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * exposes the various {@link View} functionality to it.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO(joth): Remove any methods overrides from this class that were added for WebView
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *             compatibility.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)public class ContentView extends FrameLayout
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        implements ContentViewCore.InternalAccessDelegate, PageInfo {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    private final ContentViewCore mContentViewCore;
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    private float mCurrentTouchOffsetX;
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    private float mCurrentTouchOffsetY;
438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    private final int[] mLocationInWindow = new int[2];
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Creates an instance of a ContentView.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param context The Context the view is running in, through which it can
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *                access the current theme, resources, etc.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param nativeWebContents A pointer to the native web contents.
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @param windowAndroid An instance of the WindowAndroid.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @return A ContentView instance.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    public static ContentView newInstance(Context context, long nativeWebContents,
54b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)            WindowAndroid windowAndroid) {
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return newInstance(context, nativeWebContents, windowAndroid, null,
56b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                android.R.attr.webViewStyle);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Creates an instance of a ContentView.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param context The Context the view is running in, through which it can
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *                access the current theme, resources, etc.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param nativeWebContents A pointer to the native web contents.
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @param windowAndroid An instance of the WindowAndroid.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param attrs The attributes of the XML tag that is inflating the view.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @return A ContentView instance.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    public static ContentView newInstance(Context context, long nativeWebContents,
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            WindowAndroid windowAndroid, AttributeSet attrs) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // TODO(klobag): use the WebViewStyle as the default style for now. It enables scrollbar.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // When ContentView is moved to framework, we can define its own style in the res.
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return newInstance(context, nativeWebContents, windowAndroid, attrs,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                android.R.attr.webViewStyle);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Creates an instance of a ContentView.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param context The Context the view is running in, through which it can
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *                access the current theme, resources, etc.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param nativeWebContents A pointer to the native web contents.
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @param windowAndroid An instance of the WindowAndroid.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param attrs The attributes of the XML tag that is inflating the view.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param defStyle The default style to apply to this view.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @return A ContentView instance.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    public static ContentView newInstance(Context context, long nativeWebContents,
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            WindowAndroid windowAndroid, AttributeSet attrs, int defStyle) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
89b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)            return new ContentView(context, nativeWebContents, windowAndroid, attrs, defStyle);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            return new JellyBeanContentView(context, nativeWebContents, windowAndroid, attrs,
92b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                    defStyle);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    protected ContentView(Context context, long nativeWebContents, WindowAndroid windowAndroid,
97b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)            AttributeSet attrs, int defStyle) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        super(context, attrs, defStyle);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        if (getScrollBarStyle() == View.SCROLLBARS_INSIDE_OVERLAY) {
101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            setHorizontalScrollBarEnabled(false);
102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            setVerticalScrollBarEnabled(false);
103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        }
104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        setFocusable(true);
1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        setFocusableInTouchMode(true);
1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
108b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        mContentViewCore = new ContentViewCore(context);
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        mContentViewCore.initialize(this, this, nativeWebContents, windowAndroid);
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    /**
1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)     * @return The URL of the page.
1141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)     */
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public String getUrl() {
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return mContentViewCore.getUrl();
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // PageInfo implementation.
1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    @Override
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public String getTitle() {
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return mContentViewCore.getTitle();
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    @Override
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public boolean isReadyForSnapshot() {
128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        return isReady();
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    @Override
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public Bitmap getBitmap() {
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return getBitmap(getWidth(), getHeight());
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    @Override
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public Bitmap getBitmap(int width, int height) {
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return mContentViewCore.getBitmap(width, height);
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    @Override
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public int getBackgroundColor() {
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return mContentViewCore.getBackgroundColor();
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    @Override
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public View getView() {
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return this;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @return The core component of the ContentView that handles JNI communication.  Should only be
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *         used for passing to native.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public ContentViewCore getContentViewCore() {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * @return The cache of scales and positions used to convert coordinates from/to CSS.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public RenderCoordinates getRenderCoordinates() {
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return mContentViewCore.getRenderCoordinates();
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Returns true if the given Activity has hardware acceleration enabled
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * in its manifest, or in its foreground window.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * TODO(husky): Remove when ContentViewCore.initialize() is refactored (see TODO there)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * TODO(dtrainor) This is still used by other classes.  Make sure to pull some version of this
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * out before removing it.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public static boolean hasHardwareAcceleration(Activity activity) {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return ContentViewCore.hasHardwareAcceleration(activity);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Destroy the internal state of the WebView. This method may only be called
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * after the WebView has been removed from the view system. No other methods
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * may be called on this WebView after this method has been called.
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void destroy() {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.destroy();
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Returns true initially, false after destroy() has been called.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * It is illegal to call any other public method after destroy().
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public boolean isAlive() {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore.isAlive();
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * For internal use. Throws IllegalStateException if mNativeContentView is 0.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Use this to ensure we get a useful Java stack trace, rather than a native
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * crash dump, from use-after-destroy bugs in Java code.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void checkIsAlive() throws IllegalStateException {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.checkIsAlive();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void setContentViewClient(ContentViewClient client) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.setContentViewClient(client);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @VisibleForTesting
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public ContentViewClient getContentViewClient() {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore.getContentViewClient();
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Load url without fixing up the url string. Consumers of ContentView are responsible for
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * ensuring the URL passed in is properly formatted (i.e. the scheme has been added if left
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * off during user input).
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @param params Parameters for this load.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void loadUrl(LoadUrlParams params) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.loadUrl(params);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Stops loading the current web contents.
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void stopLoading() {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.stopLoading();
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @return Whether the current WebContents has a previous navigation entry.
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public boolean canGoBack() {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore.canGoBack();
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @return Whether the current WebContents has a navigation entry after the current one.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public boolean canGoForward() {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore.canGoForward();
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param offset The offset into the navigation history.
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @return Whether we can move in history by given offset
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public boolean canGoToOffset(int offset) {
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore.canGoToOffset(offset);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Navigates to the specified offset from the "current entry". Does nothing if the offset is out
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * of bounds.
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param offset The offset into the navigation history.
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void goToOffset(int offset) {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.goToOffset(offset);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Goes to the navigation entry before the current one.
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void goBack() {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.goBack();
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Goes to the navigation entry following the current one.
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void goForward() {
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.goForward();
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Clears the WebView's page history in both the backwards and forwards
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * directions.
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void clearHistory() {
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.clearHistory();
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Start profiling the update speed. You must call {@link #stopFpsProfiling}
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * to stop profiling.
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @VisibleForTesting
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void startFpsProfiling() {
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // TODO(nileshagrawal): Implement this.
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Stop profiling the update speed.
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @VisibleForTesting
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public float stopFpsProfiling() {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // TODO(nileshagrawal): Implement this.
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0.0f;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Fling the ContentView from the current position.
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param x Fling touch starting position
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param y Fling touch starting position
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param velocityX Initial velocity of the fling (X) measured in pixels per second.
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param velocityY Initial velocity of the fling (Y) measured in pixels per second.
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @VisibleForTesting
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void fling(long timeMs, int x, int y, int velocityX, int velocityY) {
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.getContentViewGestureHandler().fling(timeMs, x, y, velocityX, velocityY);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Start pinch zoom. You must call {@link #pinchEnd} to stop.
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @VisibleForTesting
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void pinchBegin(long timeMs, int x, int y) {
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.getContentViewGestureHandler().pinchBegin(timeMs, x, y);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Stop pinch zoom.
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @VisibleForTesting
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void pinchEnd(long timeMs) {
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.getContentViewGestureHandler().pinchEnd(timeMs);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void setIgnoreSingleTap(boolean value) {
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.getContentViewGestureHandler().setIgnoreSingleTap(value);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    /** @see ContentViewGestureHandler#setIgnoreRemainingTouchEvents */
3353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    public void setIgnoreRemainingTouchEvents() {
3363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        mContentViewCore.getContentViewGestureHandler().setIgnoreRemainingTouchEvents();
3373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
3383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Modify the ContentView magnification level. The effect of calling this
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * method is exactly as after "pinch zoom".
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param timeMs The event time in milliseconds.
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param delta The ratio of the new magnification level over the current
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *            magnification level.
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param anchorX The magnification anchor (X) in the current view
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *            coordinate.
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param anchorY The magnification anchor (Y) in the current view
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *            coordinate.
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @VisibleForTesting
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void pinchBy(long timeMs, int anchorX, int anchorY, float delta) {
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.getContentViewGestureHandler().pinchBy(timeMs, anchorX, anchorY, delta);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Injects the passed JavaScript code in the current page and evaluates it.
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @throws IllegalStateException If the ContentView has been destroyed.
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void evaluateJavaScript(String script) throws IllegalStateException {
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mContentViewCore.evaluateJavaScript(script, null);
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * To be called when the ContentView is shown.
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     **/
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void onShow() {
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.onShow();
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * To be called when the ContentView is hidden.
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     **/
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void onHide() {
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.onHide();
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
380b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)     * Return the ContentSettings object used to retrieve the settings for this
381b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)     * ContentView.
382b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)     * @return A ContentSettings object that can be used to retrieve this ContentView's
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *         settings.
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public ContentSettings getContentSettings() {
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore.getContentSettings();
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Hides the select action bar.
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void hideSelectActionBar() {
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.hideSelectActionBar();
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // FrameLayout overrides.
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Needed by ContentViewCore.InternalAccessDelegate
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public boolean drawChild(Canvas canvas, View child, long drawingTime) {
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return super.drawChild(canvas, child, drawingTime);
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Needed by ContentViewCore.InternalAccessDelegate
4051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    @Override
4061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    public void onScrollChanged(int l, int t, int oldl, int oldt) {
4071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        super.onScrollChanged(l, t, oldl, oldt);
4081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
4091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    protected void onSizeChanged(int w, int h, int ow, int oh) {
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TraceEvent.begin();
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        super.onSizeChanged(w, h, ow, oh);
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.onSizeChanged(w, h, ow, oh);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TraceEvent.end();
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
4198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
4208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        super.onLayout(changed, left, top, right, bottom);
4218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        if (changed) {
4228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            getLocationInWindow(mLocationInWindow);
4238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            mContentViewCore.onLocationInWindowChanged(mLocationInWindow[0], mLocationInWindow[1]);
4248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        }
4258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    }
4268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    @Override
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore.onCreateInputConnection(outAttrs);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public boolean onCheckIsTextEditor() {
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore.onCheckIsTextEditor();
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TraceEvent.begin();
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
44190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        mContentViewCore.onFocusChanged(gainFocus);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TraceEvent.end();
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
446d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    public void onWindowFocusChanged(boolean hasWindowFocus) {
447d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        super.onWindowFocusChanged(hasWindowFocus);
448d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        mContentViewCore.onWindowFocusChanged(hasWindowFocus);
449d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
450d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
451d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    @Override
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public boolean onKeyUp(int keyCode, KeyEvent event) {
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore.onKeyUp(keyCode, event);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public boolean dispatchKeyEventPreIme(KeyEvent event) {
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore.dispatchKeyEventPreIme(event);
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public boolean dispatchKeyEvent(KeyEvent event) {
463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (isFocused()) {
464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            return mContentViewCore.dispatchKeyEvent(event);
465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        } else {
466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            return super.dispatchKeyEvent(event);
467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public boolean onTouchEvent(MotionEvent event) {
472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        MotionEvent offset = createOffsetMotionEvent(event);
473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        boolean consumed = mContentViewCore.onTouchEvent(offset);
474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        offset.recycle();
475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return consumed;
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Mouse move events are sent on hover enter, hover move and hover exit.
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * They are sent on hover exit because sometimes it acts as both a hover
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * move and hover exit.
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public boolean onHoverEvent(MotionEvent event) {
4857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        MotionEvent offset = createOffsetMotionEvent(event);
4867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        boolean consumed = mContentViewCore.onHoverEvent(offset);
4877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        offset.recycle();
4881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        super.onHoverEvent(event);
4897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        return consumed;
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public boolean onGenericMotionEvent(MotionEvent event) {
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore.onGenericMotionEvent(event);
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    @Override
4987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    public boolean performLongClick() {
4997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        return false;
5007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
5017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * Sets the current amount to offset incoming touch events by.  This is used to handle content
504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * moving and not lining up properly with the android input system.
505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @param dx The X offset in pixels to shift touch events.
506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @param dy The Y offset in pixels to shift touch events.
507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public void setCurrentMotionEventOffsets(float dx, float dy) {
509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        mCurrentTouchOffsetX = dx;
510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        mCurrentTouchOffsetY = dy;
511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    private MotionEvent createOffsetMotionEvent(MotionEvent src) {
514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        MotionEvent dst = MotionEvent.obtain(src);
515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        dst.offsetLocation(mCurrentTouchOffsetX, mCurrentTouchOffsetY);
516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return dst;
517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    protected void onConfigurationChanged(Configuration newConfig) {
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.onConfigurationChanged(newConfig);
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Currently the ContentView scrolling happens in the native side. In
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * the Java view system, it is always pinned at (0, 0). scrollBy() and scrollTo()
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * are overridden, so that View's mScrollX and mScrollY will be unchanged at
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * (0, 0). This is critical for drawing ContentView correctly.
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void scrollBy(int x, int y) {
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.scrollBy(x, y);
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void scrollTo(int x, int y) {
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.scrollTo(x, y);
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    protected int computeHorizontalScrollExtent() {
542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        // TODO(dtrainor): Need to expose scroll events properly to public. Either make getScroll*
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // work or expose computeHorizontalScrollOffset()/computeVerticalScrollOffset as public.
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore.computeHorizontalScrollExtent();
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    protected int computeHorizontalScrollOffset() {
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore.computeHorizontalScrollOffset();
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    protected int computeHorizontalScrollRange() {
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore.computeHorizontalScrollRange();
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    protected int computeVerticalScrollExtent() {
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore.computeVerticalScrollExtent();
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    protected int computeVerticalScrollOffset() {
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore.computeVerticalScrollOffset();
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    protected int computeVerticalScrollRange() {
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore.computeVerticalScrollRange();
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // End FrameLayout overrides.
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public boolean awakenScrollBars(int startDelay, boolean invalidate) {
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore.awakenScrollBars(startDelay, invalidate);
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public boolean awakenScrollBars() {
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return super.awakenScrollBars();
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public int getSingleTapX()  {
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore.getContentViewGestureHandler().getSingleTapX();
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public int getSingleTapY()  {
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore.getContentViewGestureHandler().getSingleTapY();
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        super.onInitializeAccessibilityNodeInfo(info);
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.onInitializeAccessibilityNodeInfo(info);
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Fills in scrolling values for AccessibilityEvents.
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param event Event being fired.
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        super.onInitializeAccessibilityEvent(event);
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.onInitializeAccessibilityEvent(event);
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    protected void onAttachedToWindow() {
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        super.onAttachedToWindow();
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.onAttachedToWindow();
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    protected void onDetachedFromWindow() {
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        super.onDetachedFromWindow();
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.onDetachedFromWindow();
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    protected void onVisibilityChanged(View changedView, int visibility) {
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        super.onVisibilityChanged(changedView, visibility);
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.onVisibilityChanged(changedView, visibility);
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Register the delegate to be used when content can not be handled by
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * the rendering engine, and should be downloaded instead. This will replace
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * the current delegate.
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param delegate An implementation of ContentViewDownloadDelegate.
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void setDownloadDelegate(ContentViewDownloadDelegate delegate) {
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.setDownloadDelegate(delegate);
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Called by DownloadController.
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentViewDownloadDelegate getDownloadDelegate() {
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore.getDownloadDelegate();
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public boolean getUseDesktopUserAgent() {
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore.getUseDesktopUserAgent();
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Set whether or not we're using a desktop user agent for the currently loaded page.
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param override If true, use a desktop user agent.  Use a mobile one otherwise.
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param reloadOnChange Reload the page if the UA has changed.
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void setUseDesktopUserAgent(boolean override, boolean reloadOnChange) {
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.setUseDesktopUserAgent(override, reloadOnChange);
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Zooms in the WebView by 25% (or less if that would result in zooming in
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * more than possible).
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @return True if there was a zoom change, false otherwise.
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This method uses the term 'zoom' for legacy reasons, but relates
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // to what chrome calls the 'page scale factor'.
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public boolean zoomIn() {
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore.zoomIn();
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Zooms out the WebView by 20% (or less if that would result in zooming out
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * more than possible).
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @return True if there was a zoom change, false otherwise.
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This method uses the term 'zoom' for legacy reasons, but relates
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // to what chrome calls the 'page scale factor'.
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public boolean zoomOut() {
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore.zoomOut();
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Resets the zoom factor of the WebView.
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @return True if there was a zoom change, false otherwise.
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This method uses the term 'zoom' for legacy reasons, but relates
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // to what chrome calls the 'page scale factor'.
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public boolean zoomReset() {
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore.zoomReset();
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Return the current scale of the WebView
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @return The current scale.
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public float getScale() {
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore.getScale();
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * If the view is ready to draw contents to the screen. In hardware mode,
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * the initialization of the surface texture may not occur until after the
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * view has been added to the layout. This method will return {@code true}
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * once the texture is actually ready.
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public boolean isReady() {
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore.isReady();
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Returns whether or not accessibility injection is being used.
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public boolean isInjectingAccessibilityScript() {
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mContentViewCore.isInjectingAccessibilityScript();
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Enable or disable accessibility features.
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void setAccessibilityState(boolean state) {
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.setAccessibilityState(state);
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Stop any TTS notifications that are currently going on.
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void stopCurrentAccessibilityNotifications() {
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContentViewCore.stopCurrentAccessibilityNotifications();
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Inform WebKit that Fullscreen mode has been exited by the user.
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void exitFullscreen() {
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mContentViewCore.exitFullscreen();
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * Return content scroll y.
737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     *
738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @return The vertical scroll position in pixels.
739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public int getContentScrollY() {
741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return mContentViewCore.computeVerticalScrollOffset();
742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * Return content height.
746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     *
747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @return The height of the content in pixels.
748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public int getContentHeight() {
750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return mContentViewCore.computeVerticalScrollRange();
751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ///////////////////////////////////////////////////////////////////////////////////////////////
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //              Start Implementation of ContentViewCore.InternalAccessDelegate               //
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ///////////////////////////////////////////////////////////////////////////////////////////////
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public boolean super_onKeyUp(int keyCode, KeyEvent event) {
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return super.onKeyUp(keyCode, event);
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public boolean super_dispatchKeyEventPreIme(KeyEvent event) {
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return super.dispatchKeyEventPreIme(event);
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public boolean super_dispatchKeyEvent(KeyEvent event) {
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return super.dispatchKeyEvent(event);
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public boolean super_onGenericMotionEvent(MotionEvent event) {
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return super.onGenericMotionEvent(event);
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void super_onConfigurationChanged(Configuration newConfig) {
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        super.onConfigurationChanged(newConfig);
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public boolean super_awakenScrollBars(int startDelay, boolean invalidate) {
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return super.awakenScrollBars(startDelay, invalidate);
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ///////////////////////////////////////////////////////////////////////////////////////////////
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //                End Implementation of ContentViewCore.InternalAccessDelegate               //
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ///////////////////////////////////////////////////////////////////////////////////////////////
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
791