ContentView.java revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
1// Copyright 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5package org.chromium.content.browser;
6
7import android.app.Activity;
8import android.content.Context;
9import android.content.res.Configuration;
10import android.graphics.Bitmap;
11import android.graphics.Canvas;
12import android.graphics.Rect;
13import android.os.Build;
14import android.util.AttributeSet;
15import android.view.KeyEvent;
16import android.view.MotionEvent;
17import android.view.View;
18import android.view.accessibility.AccessibilityEvent;
19import android.view.accessibility.AccessibilityNodeInfo;
20import android.view.inputmethod.EditorInfo;
21import android.view.inputmethod.InputConnection;
22import android.widget.FrameLayout;
23
24import com.google.common.annotations.VisibleForTesting;
25
26import org.chromium.content.common.TraceEvent;
27import org.chromium.ui.base.WindowAndroid;
28
29/**
30 * The containing view for {@link ContentViewCore} that exists in the Android UI hierarchy and
31 * exposes the various {@link View} functionality to it.
32 *
33 * TODO(joth): Remove any methods overrides from this class that were added for WebView
34 *             compatibility.
35 */
36public class ContentView extends FrameLayout
37        implements ContentViewCore.InternalAccessDelegate, PageInfo {
38
39    private final ContentViewCore mContentViewCore;
40
41    private float mCurrentTouchOffsetX;
42    private float mCurrentTouchOffsetY;
43    private final int[] mLocationInWindow = new int[2];
44
45    /**
46     * Creates an instance of a ContentView.
47     * @param context The Context the view is running in, through which it can
48     *                access the current theme, resources, etc.
49     * @param nativeWebContents A pointer to the native web contents.
50     * @param windowAndroid An instance of the WindowAndroid.
51     * @return A ContentView instance.
52     */
53    public static ContentView newInstance(Context context, long nativeWebContents,
54            WindowAndroid windowAndroid) {
55        return newInstance(context, nativeWebContents, windowAndroid, null,
56                android.R.attr.webViewStyle);
57    }
58
59    /**
60     * Creates an instance of a ContentView.
61     * @param context The Context the view is running in, through which it can
62     *                access the current theme, resources, etc.
63     * @param nativeWebContents A pointer to the native web contents.
64     * @param windowAndroid An instance of the WindowAndroid.
65     * @param attrs The attributes of the XML tag that is inflating the view.
66     * @return A ContentView instance.
67     */
68    public static ContentView newInstance(Context context, long nativeWebContents,
69            WindowAndroid windowAndroid, AttributeSet attrs) {
70        // TODO(klobag): use the WebViewStyle as the default style for now. It enables scrollbar.
71        // When ContentView is moved to framework, we can define its own style in the res.
72        return newInstance(context, nativeWebContents, windowAndroid, attrs,
73                android.R.attr.webViewStyle);
74    }
75
76    /**
77     * Creates an instance of a ContentView.
78     * @param context The Context the view is running in, through which it can
79     *                access the current theme, resources, etc.
80     * @param nativeWebContents A pointer to the native web contents.
81     * @param windowAndroid An instance of the WindowAndroid.
82     * @param attrs The attributes of the XML tag that is inflating the view.
83     * @param defStyle The default style to apply to this view.
84     * @return A ContentView instance.
85     */
86    public static ContentView newInstance(Context context, long nativeWebContents,
87            WindowAndroid windowAndroid, AttributeSet attrs, int defStyle) {
88        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
89            return new ContentView(context, nativeWebContents, windowAndroid, attrs, defStyle);
90        } else {
91            return new JellyBeanContentView(context, nativeWebContents, windowAndroid, attrs,
92                    defStyle);
93        }
94    }
95
96    protected ContentView(Context context, long nativeWebContents, WindowAndroid windowAndroid,
97            AttributeSet attrs, int defStyle) {
98        super(context, attrs, defStyle);
99
100        if (getScrollBarStyle() == View.SCROLLBARS_INSIDE_OVERLAY) {
101            setHorizontalScrollBarEnabled(false);
102            setVerticalScrollBarEnabled(false);
103        }
104
105        setFocusable(true);
106        setFocusableInTouchMode(true);
107
108        mContentViewCore = new ContentViewCore(context);
109        mContentViewCore.initialize(this, this, nativeWebContents, windowAndroid);
110    }
111
112    /**
113     * @return The URL of the page.
114     */
115    public String getUrl() {
116        return mContentViewCore.getUrl();
117    }
118
119    // PageInfo implementation.
120
121    @Override
122    public String getTitle() {
123        return mContentViewCore.getTitle();
124    }
125
126    @Override
127    public boolean isReadyForSnapshot() {
128        return isReady();
129    }
130
131    @Override
132    public Bitmap getBitmap() {
133        return getBitmap(getWidth(), getHeight());
134    }
135
136    @Override
137    public Bitmap getBitmap(int width, int height) {
138        return mContentViewCore.getBitmap(width, height);
139    }
140
141    @Override
142    public int getBackgroundColor() {
143        return mContentViewCore.getBackgroundColor();
144    }
145
146    @Override
147    public View getView() {
148        return this;
149    }
150
151    /**
152     * @return The core component of the ContentView that handles JNI communication.  Should only be
153     *         used for passing to native.
154     */
155    public ContentViewCore getContentViewCore() {
156        return mContentViewCore;
157    }
158
159    /**
160     * @return The cache of scales and positions used to convert coordinates from/to CSS.
161     */
162    public RenderCoordinates getRenderCoordinates() {
163        return mContentViewCore.getRenderCoordinates();
164    }
165
166    /**
167     * Returns true if the given Activity has hardware acceleration enabled
168     * in its manifest, or in its foreground window.
169     *
170     * TODO(husky): Remove when ContentViewCore.initialize() is refactored (see TODO there)
171     * TODO(dtrainor) This is still used by other classes.  Make sure to pull some version of this
172     * out before removing it.
173     */
174    public static boolean hasHardwareAcceleration(Activity activity) {
175        return ContentViewCore.hasHardwareAcceleration(activity);
176    }
177
178    /**
179     * Destroy the internal state of the WebView. This method may only be called
180     * after the WebView has been removed from the view system. No other methods
181     * may be called on this WebView after this method has been called.
182     */
183    public void destroy() {
184        mContentViewCore.destroy();
185    }
186
187    /**
188     * Returns true initially, false after destroy() has been called.
189     * It is illegal to call any other public method after destroy().
190     */
191    public boolean isAlive() {
192        return mContentViewCore.isAlive();
193    }
194
195    /**
196     * For internal use. Throws IllegalStateException if mNativeContentView is 0.
197     * Use this to ensure we get a useful Java stack trace, rather than a native
198     * crash dump, from use-after-destroy bugs in Java code.
199     */
200    void checkIsAlive() throws IllegalStateException {
201        mContentViewCore.checkIsAlive();
202    }
203
204    public void setContentViewClient(ContentViewClient client) {
205        mContentViewCore.setContentViewClient(client);
206    }
207
208    @VisibleForTesting
209    public ContentViewClient getContentViewClient() {
210        return mContentViewCore.getContentViewClient();
211    }
212
213    /**
214     * Load url without fixing up the url string. Consumers of ContentView are responsible for
215     * ensuring the URL passed in is properly formatted (i.e. the scheme has been added if left
216     * off during user input).
217     *
218     * @param params Parameters for this load.
219     */
220    public void loadUrl(LoadUrlParams params) {
221        mContentViewCore.loadUrl(params);
222    }
223
224    /**
225     * Stops loading the current web contents.
226     */
227    public void stopLoading() {
228        mContentViewCore.stopLoading();
229    }
230
231    /**
232     * @return Whether the current WebContents has a previous navigation entry.
233     */
234    public boolean canGoBack() {
235        return mContentViewCore.canGoBack();
236    }
237
238    /**
239     * @return Whether the current WebContents has a navigation entry after the current one.
240     */
241    public boolean canGoForward() {
242        return mContentViewCore.canGoForward();
243    }
244
245    /**
246     * @param offset The offset into the navigation history.
247     * @return Whether we can move in history by given offset
248     */
249    public boolean canGoToOffset(int offset) {
250        return mContentViewCore.canGoToOffset(offset);
251    }
252
253    /**
254     * Navigates to the specified offset from the "current entry". Does nothing if the offset is out
255     * of bounds.
256     * @param offset The offset into the navigation history.
257     */
258    public void goToOffset(int offset) {
259        mContentViewCore.goToOffset(offset);
260    }
261
262    /**
263     * Goes to the navigation entry before the current one.
264     */
265    public void goBack() {
266        mContentViewCore.goBack();
267    }
268
269    /**
270     * Goes to the navigation entry following the current one.
271     */
272    public void goForward() {
273        mContentViewCore.goForward();
274    }
275
276    /**
277     * Clears the WebView's page history in both the backwards and forwards
278     * directions.
279     */
280    public void clearHistory() {
281        mContentViewCore.clearHistory();
282    }
283
284    /**
285     * Start profiling the update speed. You must call {@link #stopFpsProfiling}
286     * to stop profiling.
287     */
288    @VisibleForTesting
289    public void startFpsProfiling() {
290        // TODO(nileshagrawal): Implement this.
291    }
292
293    /**
294     * Stop profiling the update speed.
295     */
296    @VisibleForTesting
297    public float stopFpsProfiling() {
298        // TODO(nileshagrawal): Implement this.
299        return 0.0f;
300    }
301
302    /**
303     * Fling the ContentView from the current position.
304     * @param x Fling touch starting position
305     * @param y Fling touch starting position
306     * @param velocityX Initial velocity of the fling (X) measured in pixels per second.
307     * @param velocityY Initial velocity of the fling (Y) measured in pixels per second.
308     */
309    @VisibleForTesting
310    public void fling(long timeMs, int x, int y, int velocityX, int velocityY) {
311        mContentViewCore.getContentViewGestureHandler().fling(timeMs, x, y, velocityX, velocityY);
312    }
313
314    /**
315     * Start pinch zoom. You must call {@link #pinchEnd} to stop.
316     */
317    @VisibleForTesting
318    public void pinchBegin(long timeMs, int x, int y) {
319        mContentViewCore.getContentViewGestureHandler().pinchBegin(timeMs, x, y);
320    }
321
322    /**
323     * Stop pinch zoom.
324     */
325    @VisibleForTesting
326    public void pinchEnd(long timeMs) {
327        mContentViewCore.getContentViewGestureHandler().pinchEnd(timeMs);
328    }
329
330    void setIgnoreSingleTap(boolean value) {
331        mContentViewCore.getContentViewGestureHandler().setIgnoreSingleTap(value);
332    }
333
334    /** @see ContentViewGestureHandler#setIgnoreRemainingTouchEvents */
335    public void setIgnoreRemainingTouchEvents() {
336        mContentViewCore.getContentViewGestureHandler().setIgnoreRemainingTouchEvents();
337    }
338
339    /**
340     * Modify the ContentView magnification level. The effect of calling this
341     * method is exactly as after "pinch zoom".
342     *
343     * @param timeMs The event time in milliseconds.
344     * @param delta The ratio of the new magnification level over the current
345     *            magnification level.
346     * @param anchorX The magnification anchor (X) in the current view
347     *            coordinate.
348     * @param anchorY The magnification anchor (Y) in the current view
349     *            coordinate.
350     */
351    @VisibleForTesting
352    public void pinchBy(long timeMs, int anchorX, int anchorY, float delta) {
353        mContentViewCore.getContentViewGestureHandler().pinchBy(timeMs, anchorX, anchorY, delta);
354    }
355
356    /**
357     * Injects the passed JavaScript code in the current page and evaluates it.
358     *
359     * @throws IllegalStateException If the ContentView has been destroyed.
360     */
361    public void evaluateJavaScript(String script) throws IllegalStateException {
362        mContentViewCore.evaluateJavaScript(script, null);
363    }
364
365    /**
366     * To be called when the ContentView is shown.
367     **/
368    public void onShow() {
369        mContentViewCore.onShow();
370    }
371
372    /**
373     * To be called when the ContentView is hidden.
374     **/
375    public void onHide() {
376        mContentViewCore.onHide();
377    }
378
379    /**
380     * Return the ContentSettings object used to retrieve the settings for this
381     * ContentView.
382     * @return A ContentSettings object that can be used to retrieve this ContentView's
383     *         settings.
384     */
385    public ContentSettings getContentSettings() {
386        return mContentViewCore.getContentSettings();
387    }
388
389    /**
390     * Hides the select action bar.
391     */
392    public void hideSelectActionBar() {
393        mContentViewCore.hideSelectActionBar();
394    }
395
396    // FrameLayout overrides.
397
398    // Needed by ContentViewCore.InternalAccessDelegate
399    @Override
400    public boolean drawChild(Canvas canvas, View child, long drawingTime) {
401        return super.drawChild(canvas, child, drawingTime);
402    }
403
404    // Needed by ContentViewCore.InternalAccessDelegate
405    @Override
406    public void onScrollChanged(int l, int t, int oldl, int oldt) {
407        super.onScrollChanged(l, t, oldl, oldt);
408    }
409
410    @Override
411    protected void onSizeChanged(int w, int h, int ow, int oh) {
412        TraceEvent.begin();
413        super.onSizeChanged(w, h, ow, oh);
414        mContentViewCore.onSizeChanged(w, h, ow, oh);
415        TraceEvent.end();
416    }
417
418    @Override
419    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
420        super.onLayout(changed, left, top, right, bottom);
421        if (changed) {
422            getLocationInWindow(mLocationInWindow);
423            mContentViewCore.onLocationInWindowChanged(mLocationInWindow[0], mLocationInWindow[1]);
424        }
425    }
426
427    @Override
428    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
429        return mContentViewCore.onCreateInputConnection(outAttrs);
430    }
431
432    @Override
433    public boolean onCheckIsTextEditor() {
434        return mContentViewCore.onCheckIsTextEditor();
435    }
436
437    @Override
438    protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
439        TraceEvent.begin();
440        super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
441        mContentViewCore.onFocusChanged(gainFocus);
442        TraceEvent.end();
443    }
444
445    @Override
446    public void onWindowFocusChanged(boolean hasWindowFocus) {
447        super.onWindowFocusChanged(hasWindowFocus);
448        mContentViewCore.onWindowFocusChanged(hasWindowFocus);
449    }
450
451    @Override
452    public boolean onKeyUp(int keyCode, KeyEvent event) {
453        return mContentViewCore.onKeyUp(keyCode, event);
454    }
455
456    @Override
457    public boolean dispatchKeyEventPreIme(KeyEvent event) {
458        return mContentViewCore.dispatchKeyEventPreIme(event);
459    }
460
461    @Override
462    public boolean dispatchKeyEvent(KeyEvent event) {
463        if (isFocused()) {
464            return mContentViewCore.dispatchKeyEvent(event);
465        } else {
466            return super.dispatchKeyEvent(event);
467        }
468    }
469
470    @Override
471    public boolean onTouchEvent(MotionEvent event) {
472        MotionEvent offset = createOffsetMotionEvent(event);
473        boolean consumed = mContentViewCore.onTouchEvent(offset);
474        offset.recycle();
475        return consumed;
476    }
477
478    /**
479     * Mouse move events are sent on hover enter, hover move and hover exit.
480     * They are sent on hover exit because sometimes it acts as both a hover
481     * move and hover exit.
482     */
483    @Override
484    public boolean onHoverEvent(MotionEvent event) {
485        MotionEvent offset = createOffsetMotionEvent(event);
486        boolean consumed = mContentViewCore.onHoverEvent(offset);
487        offset.recycle();
488        super.onHoverEvent(event);
489        return consumed;
490    }
491
492    @Override
493    public boolean onGenericMotionEvent(MotionEvent event) {
494        return mContentViewCore.onGenericMotionEvent(event);
495    }
496
497    @Override
498    public boolean performLongClick() {
499        return false;
500    }
501
502    /**
503     * Sets the current amount to offset incoming touch events by.  This is used to handle content
504     * moving and not lining up properly with the android input system.
505     * @param dx The X offset in pixels to shift touch events.
506     * @param dy The Y offset in pixels to shift touch events.
507     */
508    public void setCurrentMotionEventOffsets(float dx, float dy) {
509        mCurrentTouchOffsetX = dx;
510        mCurrentTouchOffsetY = dy;
511    }
512
513    private MotionEvent createOffsetMotionEvent(MotionEvent src) {
514        MotionEvent dst = MotionEvent.obtain(src);
515        dst.offsetLocation(mCurrentTouchOffsetX, mCurrentTouchOffsetY);
516        return dst;
517    }
518
519    @Override
520    protected void onConfigurationChanged(Configuration newConfig) {
521        mContentViewCore.onConfigurationChanged(newConfig);
522    }
523
524    /**
525     * Currently the ContentView scrolling happens in the native side. In
526     * the Java view system, it is always pinned at (0, 0). scrollBy() and scrollTo()
527     * are overridden, so that View's mScrollX and mScrollY will be unchanged at
528     * (0, 0). This is critical for drawing ContentView correctly.
529     */
530    @Override
531    public void scrollBy(int x, int y) {
532        mContentViewCore.scrollBy(x, y);
533    }
534
535    @Override
536    public void scrollTo(int x, int y) {
537        mContentViewCore.scrollTo(x, y);
538    }
539
540    @Override
541    protected int computeHorizontalScrollExtent() {
542        // TODO(dtrainor): Need to expose scroll events properly to public. Either make getScroll*
543        // work or expose computeHorizontalScrollOffset()/computeVerticalScrollOffset as public.
544        return mContentViewCore.computeHorizontalScrollExtent();
545    }
546
547    @Override
548    protected int computeHorizontalScrollOffset() {
549        return mContentViewCore.computeHorizontalScrollOffset();
550    }
551
552    @Override
553    protected int computeHorizontalScrollRange() {
554        return mContentViewCore.computeHorizontalScrollRange();
555    }
556
557    @Override
558    protected int computeVerticalScrollExtent() {
559        return mContentViewCore.computeVerticalScrollExtent();
560    }
561
562    @Override
563    protected int computeVerticalScrollOffset() {
564        return mContentViewCore.computeVerticalScrollOffset();
565    }
566
567    @Override
568    protected int computeVerticalScrollRange() {
569        return mContentViewCore.computeVerticalScrollRange();
570    }
571
572    // End FrameLayout overrides.
573
574    @Override
575    public boolean awakenScrollBars(int startDelay, boolean invalidate) {
576        return mContentViewCore.awakenScrollBars(startDelay, invalidate);
577    }
578
579    @Override
580    public boolean awakenScrollBars() {
581        return super.awakenScrollBars();
582    }
583
584    public int getSingleTapX()  {
585        return mContentViewCore.getContentViewGestureHandler().getSingleTapX();
586    }
587
588    public int getSingleTapY()  {
589        return mContentViewCore.getContentViewGestureHandler().getSingleTapY();
590    }
591
592    @Override
593    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
594        super.onInitializeAccessibilityNodeInfo(info);
595        mContentViewCore.onInitializeAccessibilityNodeInfo(info);
596    }
597
598    /**
599     * Fills in scrolling values for AccessibilityEvents.
600     * @param event Event being fired.
601     */
602    @Override
603    public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
604        super.onInitializeAccessibilityEvent(event);
605        mContentViewCore.onInitializeAccessibilityEvent(event);
606    }
607
608    @Override
609    protected void onAttachedToWindow() {
610        super.onAttachedToWindow();
611        mContentViewCore.onAttachedToWindow();
612    }
613
614    @Override
615    protected void onDetachedFromWindow() {
616        super.onDetachedFromWindow();
617        mContentViewCore.onDetachedFromWindow();
618    }
619
620    @Override
621    protected void onVisibilityChanged(View changedView, int visibility) {
622        super.onVisibilityChanged(changedView, visibility);
623        mContentViewCore.onVisibilityChanged(changedView, visibility);
624    }
625
626    /**
627     * Register the delegate to be used when content can not be handled by
628     * the rendering engine, and should be downloaded instead. This will replace
629     * the current delegate.
630     * @param delegate An implementation of ContentViewDownloadDelegate.
631     */
632    public void setDownloadDelegate(ContentViewDownloadDelegate delegate) {
633        mContentViewCore.setDownloadDelegate(delegate);
634    }
635
636    // Called by DownloadController.
637    ContentViewDownloadDelegate getDownloadDelegate() {
638        return mContentViewCore.getDownloadDelegate();
639    }
640
641    public boolean getUseDesktopUserAgent() {
642        return mContentViewCore.getUseDesktopUserAgent();
643    }
644
645    /**
646     * Set whether or not we're using a desktop user agent for the currently loaded page.
647     * @param override If true, use a desktop user agent.  Use a mobile one otherwise.
648     * @param reloadOnChange Reload the page if the UA has changed.
649     */
650    public void setUseDesktopUserAgent(boolean override, boolean reloadOnChange) {
651        mContentViewCore.setUseDesktopUserAgent(override, reloadOnChange);
652    }
653
654    /**
655     * Zooms in the WebView by 25% (or less if that would result in zooming in
656     * more than possible).
657     *
658     * @return True if there was a zoom change, false otherwise.
659     */
660    // This method uses the term 'zoom' for legacy reasons, but relates
661    // to what chrome calls the 'page scale factor'.
662    public boolean zoomIn() {
663        return mContentViewCore.zoomIn();
664    }
665
666    /**
667     * Zooms out the WebView by 20% (or less if that would result in zooming out
668     * more than possible).
669     *
670     * @return True if there was a zoom change, false otherwise.
671     */
672    // This method uses the term 'zoom' for legacy reasons, but relates
673    // to what chrome calls the 'page scale factor'.
674    public boolean zoomOut() {
675        return mContentViewCore.zoomOut();
676    }
677
678    /**
679     * Resets the zoom factor of the WebView.
680     *
681     * @return True if there was a zoom change, false otherwise.
682     */
683    // This method uses the term 'zoom' for legacy reasons, but relates
684    // to what chrome calls the 'page scale factor'.
685    public boolean zoomReset() {
686        return mContentViewCore.zoomReset();
687    }
688
689    /**
690     * Return the current scale of the WebView
691     * @return The current scale.
692     */
693    public float getScale() {
694        return mContentViewCore.getScale();
695    }
696
697    /**
698     * If the view is ready to draw contents to the screen. In hardware mode,
699     * the initialization of the surface texture may not occur until after the
700     * view has been added to the layout. This method will return {@code true}
701     * once the texture is actually ready.
702     */
703    public boolean isReady() {
704        return mContentViewCore.isReady();
705    }
706
707    /**
708     * Returns whether or not accessibility injection is being used.
709     */
710    public boolean isInjectingAccessibilityScript() {
711        return mContentViewCore.isInjectingAccessibilityScript();
712    }
713
714    /**
715     * Enable or disable accessibility features.
716     */
717    public void setAccessibilityState(boolean state) {
718        mContentViewCore.setAccessibilityState(state);
719    }
720
721    /**
722     * Stop any TTS notifications that are currently going on.
723     */
724    public void stopCurrentAccessibilityNotifications() {
725        mContentViewCore.stopCurrentAccessibilityNotifications();
726    }
727
728    /**
729     * Inform WebKit that Fullscreen mode has been exited by the user.
730     */
731    public void exitFullscreen() {
732        mContentViewCore.exitFullscreen();
733    }
734
735    /**
736     * Return content scroll y.
737     *
738     * @return The vertical scroll position in pixels.
739     */
740    public int getContentScrollY() {
741        return mContentViewCore.computeVerticalScrollOffset();
742    }
743
744    /**
745     * Return content height.
746     *
747     * @return The height of the content in pixels.
748     */
749    public int getContentHeight() {
750        return mContentViewCore.computeVerticalScrollRange();
751    }
752
753    ///////////////////////////////////////////////////////////////////////////////////////////////
754    //              Start Implementation of ContentViewCore.InternalAccessDelegate               //
755    ///////////////////////////////////////////////////////////////////////////////////////////////
756
757    @Override
758    public boolean super_onKeyUp(int keyCode, KeyEvent event) {
759        return super.onKeyUp(keyCode, event);
760    }
761
762    @Override
763    public boolean super_dispatchKeyEventPreIme(KeyEvent event) {
764        return super.dispatchKeyEventPreIme(event);
765    }
766
767    @Override
768    public boolean super_dispatchKeyEvent(KeyEvent event) {
769        return super.dispatchKeyEvent(event);
770    }
771
772    @Override
773    public boolean super_onGenericMotionEvent(MotionEvent event) {
774        return super.onGenericMotionEvent(event);
775    }
776
777    @Override
778    public void super_onConfigurationChanged(Configuration newConfig) {
779        super.onConfigurationChanged(newConfig);
780    }
781
782    @Override
783    public boolean super_awakenScrollBars(int startDelay, boolean invalidate) {
784        return super.awakenScrollBars(startDelay, invalidate);
785    }
786
787    ///////////////////////////////////////////////////////////////////////////////////////////////
788    //                End Implementation of ContentViewCore.InternalAccessDelegate               //
789    ///////////////////////////////////////////////////////////////////////////////////////////////
790}
791