ContentView.java revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
1// Copyright (c) 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.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
44    /**
45     * Creates an instance of a ContentView.
46     * @param context The Context the view is running in, through which it can
47     *                access the current theme, resources, etc.
48     * @param nativeWebContents A pointer to the native web contents.
49     * @param windowAndroid An instance of the WindowAndroid.
50     * @return A ContentView instance.
51     */
52    public static ContentView newInstance(Context context, int nativeWebContents,
53            WindowAndroid windowAndroid) {
54        return newInstance(context, nativeWebContents, windowAndroid, null,
55                android.R.attr.webViewStyle);
56    }
57
58    /**
59     * Creates an instance of a ContentView.
60     * @param context The Context the view is running in, through which it can
61     *                access the current theme, resources, etc.
62     * @param nativeWebContents A pointer to the native web contents.
63     * @param windowAndroid An instance of the WindowAndroid.
64     * @param attrs The attributes of the XML tag that is inflating the view.
65     * @return A ContentView instance.
66     */
67    public static ContentView newInstance(Context context, int nativeWebContents,
68            WindowAndroid windowAndroid, AttributeSet attrs) {
69        // TODO(klobag): use the WebViewStyle as the default style for now. It enables scrollbar.
70        // When ContentView is moved to framework, we can define its own style in the res.
71        return newInstance(context, nativeWebContents, windowAndroid, attrs,
72                android.R.attr.webViewStyle);
73    }
74
75    /**
76     * Creates an instance of a ContentView.
77     * @param context The Context the view is running in, through which it can
78     *                access the current theme, resources, etc.
79     * @param nativeWebContents A pointer to the native web contents.
80     * @param windowAndroid An instance of the WindowAndroid.
81     * @param attrs The attributes of the XML tag that is inflating the view.
82     * @param defStyle The default style to apply to this view.
83     * @return A ContentView instance.
84     */
85    public static ContentView newInstance(Context context, int nativeWebContents,
86            WindowAndroid windowAndroid, AttributeSet attrs, int defStyle) {
87        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
88            return new ContentView(context, nativeWebContents, windowAndroid, attrs, defStyle);
89        } else {
90            return new JellyBeanContentView(context, nativeWebContents, windowAndroid, attrs,
91                    defStyle);
92        }
93    }
94
95    protected ContentView(Context context, int nativeWebContents, WindowAndroid windowAndroid,
96            AttributeSet attrs, int defStyle) {
97        super(context, attrs, defStyle);
98
99        if (getScrollBarStyle() == View.SCROLLBARS_INSIDE_OVERLAY) {
100            setHorizontalScrollBarEnabled(false);
101            setVerticalScrollBarEnabled(false);
102        }
103
104        setFocusable(true);
105        setFocusableInTouchMode(true);
106
107        mContentViewCore = new ContentViewCore(context);
108        mContentViewCore.initialize(this, this, nativeWebContents, windowAndroid,
109                Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN ?
110                ContentViewCore.INPUT_EVENTS_DELIVERED_AT_VSYNC :
111                ContentViewCore.INPUT_EVENTS_DELIVERED_IMMEDIATELY);
112    }
113
114    // PageInfo implementation.
115
116    @Override
117    public String getUrl() {
118        return mContentViewCore.getUrl();
119    }
120
121    @Override
122    public String getTitle() {
123        return mContentViewCore.getTitle();
124    }
125
126    @Override
127    public boolean isReadyForSnapshot() {
128        return !isCrashed() && 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     * Reload the current page.
278     */
279    public void reload() {
280        mContentViewCore.reload();
281    }
282
283    /**
284     * Clears the WebView's page history in both the backwards and forwards
285     * directions.
286     */
287    public void clearHistory() {
288        mContentViewCore.clearHistory();
289    }
290
291    /**
292     * Start profiling the update speed. You must call {@link #stopFpsProfiling}
293     * to stop profiling.
294     */
295    @VisibleForTesting
296    public void startFpsProfiling() {
297        // TODO(nileshagrawal): Implement this.
298    }
299
300    /**
301     * Stop profiling the update speed.
302     */
303    @VisibleForTesting
304    public float stopFpsProfiling() {
305        // TODO(nileshagrawal): Implement this.
306        return 0.0f;
307    }
308
309    /**
310     * Fling the ContentView from the current position.
311     * @param x Fling touch starting position
312     * @param y Fling touch starting position
313     * @param velocityX Initial velocity of the fling (X) measured in pixels per second.
314     * @param velocityY Initial velocity of the fling (Y) measured in pixels per second.
315     */
316    @VisibleForTesting
317    public void fling(long timeMs, int x, int y, int velocityX, int velocityY) {
318        mContentViewCore.getContentViewGestureHandler().fling(timeMs, x, y, velocityX, velocityY);
319    }
320
321    /**
322     * Start pinch zoom. You must call {@link #pinchEnd} to stop.
323     */
324    @VisibleForTesting
325    public void pinchBegin(long timeMs, int x, int y) {
326        mContentViewCore.getContentViewGestureHandler().pinchBegin(timeMs, x, y);
327    }
328
329    /**
330     * Stop pinch zoom.
331     */
332    @VisibleForTesting
333    public void pinchEnd(long timeMs) {
334        mContentViewCore.getContentViewGestureHandler().pinchEnd(timeMs);
335    }
336
337    void setIgnoreSingleTap(boolean value) {
338        mContentViewCore.getContentViewGestureHandler().setIgnoreSingleTap(value);
339    }
340
341    /** @see ContentViewGestureHandler#setIgnoreRemainingTouchEvents */
342    public void setIgnoreRemainingTouchEvents() {
343        mContentViewCore.getContentViewGestureHandler().setIgnoreRemainingTouchEvents();
344    }
345
346    /**
347     * Modify the ContentView magnification level. The effect of calling this
348     * method is exactly as after "pinch zoom".
349     *
350     * @param timeMs The event time in milliseconds.
351     * @param delta The ratio of the new magnification level over the current
352     *            magnification level.
353     * @param anchorX The magnification anchor (X) in the current view
354     *            coordinate.
355     * @param anchorY The magnification anchor (Y) in the current view
356     *            coordinate.
357     */
358    @VisibleForTesting
359    public void pinchBy(long timeMs, int anchorX, int anchorY, float delta) {
360        mContentViewCore.getContentViewGestureHandler().pinchBy(timeMs, anchorX, anchorY, delta);
361    }
362
363    /**
364     * Injects the passed JavaScript code in the current page and evaluates it.
365     *
366     * @throws IllegalStateException If the ContentView has been destroyed.
367     */
368    public void evaluateJavaScript(String script) throws IllegalStateException {
369        mContentViewCore.evaluateJavaScript(script, null);
370    }
371
372    /**
373     * To be called when the ContentView is shown.
374     **/
375    public void onShow() {
376        mContentViewCore.onShow();
377    }
378
379    /**
380     * To be called when the ContentView is hidden.
381     **/
382    public void onHide() {
383        mContentViewCore.onHide();
384    }
385
386    /**
387     * Return the ContentSettings object used to retrieve the settings for this
388     * ContentView.
389     * @return A ContentSettings object that can be used to retrieve this ContentView's
390     *         settings.
391     */
392    public ContentSettings getContentSettings() {
393        return mContentViewCore.getContentSettings();
394    }
395
396    /**
397     * Hides the select action bar.
398     */
399    public void hideSelectActionBar() {
400        mContentViewCore.hideSelectActionBar();
401    }
402
403    // FrameLayout overrides.
404
405    // Needed by ContentViewCore.InternalAccessDelegate
406    @Override
407    public boolean drawChild(Canvas canvas, View child, long drawingTime) {
408        return super.drawChild(canvas, child, drawingTime);
409    }
410
411    @Override
412    protected void onSizeChanged(int w, int h, int ow, int oh) {
413        TraceEvent.begin();
414        super.onSizeChanged(w, h, ow, oh);
415        mContentViewCore.onSizeChanged(w, h, ow, oh);
416        TraceEvent.end();
417    }
418
419    @Override
420    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
421        return mContentViewCore.onCreateInputConnection(outAttrs);
422    }
423
424    @Override
425    public boolean onCheckIsTextEditor() {
426        return mContentViewCore.onCheckIsTextEditor();
427    }
428
429    @Override
430    protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
431        TraceEvent.begin();
432        super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
433        mContentViewCore.onFocusChanged(gainFocus);
434        TraceEvent.end();
435    }
436
437    @Override
438    public void onWindowFocusChanged(boolean hasWindowFocus) {
439        super.onWindowFocusChanged(hasWindowFocus);
440        mContentViewCore.onWindowFocusChanged(hasWindowFocus);
441    }
442
443    @Override
444    public boolean onKeyUp(int keyCode, KeyEvent event) {
445        return mContentViewCore.onKeyUp(keyCode, event);
446    }
447
448    @Override
449    public boolean dispatchKeyEventPreIme(KeyEvent event) {
450        return mContentViewCore.dispatchKeyEventPreIme(event);
451    }
452
453    @Override
454    public boolean dispatchKeyEvent(KeyEvent event) {
455        if (isFocused()) {
456            return mContentViewCore.dispatchKeyEvent(event);
457        } else {
458            return super.dispatchKeyEvent(event);
459        }
460    }
461
462    @Override
463    public boolean onTouchEvent(MotionEvent event) {
464        MotionEvent offset = createOffsetMotionEvent(event);
465        boolean consumed = mContentViewCore.onTouchEvent(offset);
466        offset.recycle();
467        return consumed;
468    }
469
470    /**
471     * Mouse move events are sent on hover enter, hover move and hover exit.
472     * They are sent on hover exit because sometimes it acts as both a hover
473     * move and hover exit.
474     */
475    @Override
476    public boolean onHoverEvent(MotionEvent event) {
477        MotionEvent offset = createOffsetMotionEvent(event);
478        boolean consumed = mContentViewCore.onHoverEvent(offset);
479        offset.recycle();
480        return consumed;
481    }
482
483    @Override
484    public boolean onGenericMotionEvent(MotionEvent event) {
485        return mContentViewCore.onGenericMotionEvent(event);
486    }
487
488    @Override
489    public boolean performLongClick() {
490        return false;
491    }
492
493    /**
494     * Sets the current amount to offset incoming touch events by.  This is used to handle content
495     * moving and not lining up properly with the android input system.
496     * @param dx The X offset in pixels to shift touch events.
497     * @param dy The Y offset in pixels to shift touch events.
498     */
499    public void setCurrentMotionEventOffsets(float dx, float dy) {
500        mCurrentTouchOffsetX = dx;
501        mCurrentTouchOffsetY = dy;
502    }
503
504    private MotionEvent createOffsetMotionEvent(MotionEvent src) {
505        MotionEvent dst = MotionEvent.obtain(src);
506        dst.offsetLocation(mCurrentTouchOffsetX, mCurrentTouchOffsetY);
507        return dst;
508    }
509
510    @Override
511    protected void onConfigurationChanged(Configuration newConfig) {
512        mContentViewCore.onConfigurationChanged(newConfig);
513    }
514
515    /**
516     * Currently the ContentView scrolling happens in the native side. In
517     * the Java view system, it is always pinned at (0, 0). scrollBy() and scrollTo()
518     * are overridden, so that View's mScrollX and mScrollY will be unchanged at
519     * (0, 0). This is critical for drawing ContentView correctly.
520     */
521    @Override
522    public void scrollBy(int x, int y) {
523        mContentViewCore.scrollBy(x, y);
524    }
525
526    @Override
527    public void scrollTo(int x, int y) {
528        mContentViewCore.scrollTo(x, y);
529    }
530
531    @Override
532    protected int computeHorizontalScrollExtent() {
533        // TODO (dtrainor): Need to expose scroll events properly to public. Either make getScroll*
534        // work or expose computeHorizontalScrollOffset()/computeVerticalScrollOffset as public.
535        return mContentViewCore.computeHorizontalScrollExtent();
536    }
537
538    @Override
539    protected int computeHorizontalScrollOffset() {
540        return mContentViewCore.computeHorizontalScrollOffset();
541    }
542
543    @Override
544    protected int computeHorizontalScrollRange() {
545        return mContentViewCore.computeHorizontalScrollRange();
546    }
547
548    @Override
549    protected int computeVerticalScrollExtent() {
550        return mContentViewCore.computeVerticalScrollExtent();
551    }
552
553    @Override
554    protected int computeVerticalScrollOffset() {
555        return mContentViewCore.computeVerticalScrollOffset();
556    }
557
558    @Override
559    protected int computeVerticalScrollRange() {
560        return mContentViewCore.computeVerticalScrollRange();
561    }
562
563    // End FrameLayout overrides.
564
565    @Override
566    public boolean awakenScrollBars(int startDelay, boolean invalidate) {
567        return mContentViewCore.awakenScrollBars(startDelay, invalidate);
568    }
569
570    @Override
571    public boolean awakenScrollBars() {
572        return super.awakenScrollBars();
573    }
574
575    public int getSingleTapX()  {
576        return mContentViewCore.getContentViewGestureHandler().getSingleTapX();
577    }
578
579    public int getSingleTapY()  {
580        return mContentViewCore.getContentViewGestureHandler().getSingleTapY();
581    }
582
583    @Override
584    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
585        super.onInitializeAccessibilityNodeInfo(info);
586        mContentViewCore.onInitializeAccessibilityNodeInfo(info);
587    }
588
589    /**
590     * Fills in scrolling values for AccessibilityEvents.
591     * @param event Event being fired.
592     */
593    @Override
594    public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
595        super.onInitializeAccessibilityEvent(event);
596        mContentViewCore.onInitializeAccessibilityEvent(event);
597    }
598
599    @Override
600    protected void onAttachedToWindow() {
601        super.onAttachedToWindow();
602        mContentViewCore.onAttachedToWindow();
603    }
604
605    @Override
606    protected void onDetachedFromWindow() {
607        super.onDetachedFromWindow();
608        mContentViewCore.onDetachedFromWindow();
609    }
610
611    @Override
612    protected void onVisibilityChanged(View changedView, int visibility) {
613        super.onVisibilityChanged(changedView, visibility);
614        mContentViewCore.onVisibilityChanged(changedView, visibility);
615    }
616
617    /**
618     * Register the delegate to be used when content can not be handled by
619     * the rendering engine, and should be downloaded instead. This will replace
620     * the current delegate.
621     * @param delegate An implementation of ContentViewDownloadDelegate.
622     */
623    public void setDownloadDelegate(ContentViewDownloadDelegate delegate) {
624        mContentViewCore.setDownloadDelegate(delegate);
625    }
626
627    // Called by DownloadController.
628    ContentViewDownloadDelegate getDownloadDelegate() {
629        return mContentViewCore.getDownloadDelegate();
630    }
631
632    public boolean getUseDesktopUserAgent() {
633        return mContentViewCore.getUseDesktopUserAgent();
634    }
635
636    /**
637     * Set whether or not we're using a desktop user agent for the currently loaded page.
638     * @param override If true, use a desktop user agent.  Use a mobile one otherwise.
639     * @param reloadOnChange Reload the page if the UA has changed.
640     */
641    public void setUseDesktopUserAgent(boolean override, boolean reloadOnChange) {
642        mContentViewCore.setUseDesktopUserAgent(override, reloadOnChange);
643    }
644
645    /**
646     * @return Whether the native ContentView has crashed.
647     */
648    public boolean isCrashed() {
649        return mContentViewCore.isCrashed();
650    }
651
652    /**
653     * Zooms in the WebView by 25% (or less if that would result in zooming in
654     * more than possible).
655     *
656     * @return True if there was a zoom change, false otherwise.
657     */
658    // This method uses the term 'zoom' for legacy reasons, but relates
659    // to what chrome calls the 'page scale factor'.
660    public boolean zoomIn() {
661        return mContentViewCore.zoomIn();
662    }
663
664    /**
665     * Zooms out the WebView by 20% (or less if that would result in zooming out
666     * more than possible).
667     *
668     * @return True if there was a zoom change, false otherwise.
669     */
670    // This method uses the term 'zoom' for legacy reasons, but relates
671    // to what chrome calls the 'page scale factor'.
672    public boolean zoomOut() {
673        return mContentViewCore.zoomOut();
674    }
675
676    /**
677     * Resets the zoom factor of the WebView.
678     *
679     * @return True if there was a zoom change, false otherwise.
680     */
681    // This method uses the term 'zoom' for legacy reasons, but relates
682    // to what chrome calls the 'page scale factor'.
683    public boolean zoomReset() {
684        return mContentViewCore.zoomReset();
685    }
686
687    /**
688     * Return the current scale of the WebView
689     * @return The current scale.
690     */
691    public float getScale() {
692        return mContentViewCore.getScale();
693    }
694
695    /**
696     * If the view is ready to draw contents to the screen. In hardware mode,
697     * the initialization of the surface texture may not occur until after the
698     * view has been added to the layout. This method will return {@code true}
699     * once the texture is actually ready.
700     */
701    public boolean isReady() {
702        return mContentViewCore.isReady();
703    }
704
705    /**
706     * Returns whether or not accessibility injection is being used.
707     */
708    public boolean isInjectingAccessibilityScript() {
709        return mContentViewCore.isInjectingAccessibilityScript();
710    }
711
712    /**
713     * Enable or disable accessibility features.
714     */
715    public void setAccessibilityState(boolean state) {
716        mContentViewCore.setAccessibilityState(state);
717    }
718
719    /**
720     * Stop any TTS notifications that are currently going on.
721     */
722    public void stopCurrentAccessibilityNotifications() {
723        mContentViewCore.stopCurrentAccessibilityNotifications();
724    }
725
726    /**
727     * Inform WebKit that Fullscreen mode has been exited by the user.
728     */
729    public void exitFullscreen() {
730        mContentViewCore.exitFullscreen();
731    }
732
733    /**
734     * Return content scroll y.
735     *
736     * @return The vertical scroll position in pixels.
737     */
738    public int getContentScrollY() {
739        return mContentViewCore.computeVerticalScrollOffset();
740    }
741
742    /**
743     * Return content height.
744     *
745     * @return The height of the content in pixels.
746     */
747    public int getContentHeight() {
748        return mContentViewCore.computeVerticalScrollRange();
749    }
750
751    ///////////////////////////////////////////////////////////////////////////////////////////////
752    //              Start Implementation of ContentViewCore.InternalAccessDelegate               //
753    ///////////////////////////////////////////////////////////////////////////////////////////////
754
755    @Override
756    public boolean super_onKeyUp(int keyCode, KeyEvent event) {
757        return super.onKeyUp(keyCode, event);
758    }
759
760    @Override
761    public boolean super_dispatchKeyEventPreIme(KeyEvent event) {
762        return super.dispatchKeyEventPreIme(event);
763    }
764
765    @Override
766    public boolean super_dispatchKeyEvent(KeyEvent event) {
767        return super.dispatchKeyEvent(event);
768    }
769
770    @Override
771    public boolean super_onGenericMotionEvent(MotionEvent event) {
772        return super.onGenericMotionEvent(event);
773    }
774
775    @Override
776    public void super_onConfigurationChanged(Configuration newConfig) {
777        super.onConfigurationChanged(newConfig);
778    }
779
780    @Override
781    public boolean super_awakenScrollBars(int startDelay, boolean invalidate) {
782        return super.awakenScrollBars(startDelay, invalidate);
783    }
784
785    ///////////////////////////////////////////////////////////////////////////////////////////////
786    //                End Implementation of ContentViewCore.InternalAccessDelegate               //
787    ///////////////////////////////////////////////////////////////////////////////////////////////
788}
789