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