| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package org.chromium.android_webview.test; |
| |
| import android.content.Context; |
| import android.content.res.Configuration; |
| import android.graphics.Canvas; |
| import android.graphics.Rect; |
| import android.os.Bundle; |
| import android.util.Log; |
| import android.view.KeyEvent; |
| import android.view.MotionEvent; |
| import android.view.View; |
| import android.view.ViewGroup; |
| import android.view.accessibility.AccessibilityEvent; |
| import android.view.accessibility.AccessibilityNodeInfo; |
| import android.view.accessibility.AccessibilityNodeProvider; |
| import android.view.inputmethod.EditorInfo; |
| import android.view.inputmethod.InputConnection; |
| import android.widget.FrameLayout; |
| |
| import org.chromium.android_webview.AwContents; |
| import org.chromium.content.browser.ContentViewCore; |
| |
| /** |
| * A View used for testing the AwContents internals. |
| * |
| * This class takes the place android.webkit.WebView would have in the production configuration. |
| */ |
| public class AwTestContainerView extends FrameLayout { |
| private AwContents mAwContents; |
| private AwContents.InternalAccessDelegate mInternalAccessDelegate; |
| |
| public AwTestContainerView(Context context) { |
| super(context); |
| mInternalAccessDelegate = new InternalAccessAdapter(); |
| setOverScrollMode(View.OVER_SCROLL_ALWAYS); |
| } |
| |
| public void initialize(AwContents awContents) { |
| mAwContents = awContents; |
| } |
| |
| public ContentViewCore getContentViewCore() { |
| return mAwContents.getContentViewCore(); |
| } |
| |
| public AwContents getAwContents() { |
| return mAwContents; |
| } |
| |
| public AwContents.InternalAccessDelegate getInternalAccessDelegate() { |
| return mInternalAccessDelegate; |
| } |
| |
| public void destroy() { |
| mAwContents.destroy(); |
| } |
| |
| @Override |
| public void onConfigurationChanged(Configuration newConfig) { |
| super.onConfigurationChanged(newConfig); |
| mAwContents.onConfigurationChanged(newConfig); |
| } |
| |
| @Override |
| public void onAttachedToWindow() { |
| super.onAttachedToWindow(); |
| mAwContents.onAttachedToWindow(); |
| } |
| |
| @Override |
| public void onDetachedFromWindow() { |
| super.onDetachedFromWindow(); |
| mAwContents.onDetachedFromWindow(); |
| } |
| |
| @Override |
| public void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { |
| super.onFocusChanged(focused, direction, previouslyFocusedRect); |
| mAwContents.onFocusChanged(focused, direction, previouslyFocusedRect); |
| } |
| |
| @Override |
| public InputConnection onCreateInputConnection(EditorInfo outAttrs) { |
| return mAwContents.onCreateInputConnection(outAttrs); |
| } |
| |
| @Override |
| public boolean onKeyUp(int keyCode, KeyEvent event) { |
| return mAwContents.onKeyUp(keyCode, event); |
| } |
| |
| @Override |
| public boolean dispatchKeyEvent(KeyEvent event) { |
| return mAwContents.dispatchKeyEvent(event); |
| } |
| |
| @Override |
| public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { |
| mAwContents.onMeasure(widthMeasureSpec, heightMeasureSpec); |
| } |
| |
| @Override |
| public void onSizeChanged(int w, int h, int ow, int oh) { |
| super.onSizeChanged(w, h, ow, oh); |
| mAwContents.onSizeChanged(w, h, ow, oh); |
| } |
| |
| @Override |
| public void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) { |
| mAwContents.onContainerViewOverScrolled(scrollX, scrollY, clampedX, clampedY); |
| } |
| |
| @Override |
| public void onScrollChanged(int l, int t, int oldl, int oldt) { |
| super.onScrollChanged(l, t, oldl, oldt); |
| if (mAwContents != null) { |
| mAwContents.onContainerViewScrollChanged(l, t, oldl, oldt); |
| } |
| } |
| |
| @Override |
| public void computeScroll() { |
| mAwContents.computeScroll(); |
| } |
| |
| @Override |
| public void onVisibilityChanged(View changedView, int visibility) { |
| super.onVisibilityChanged(changedView, visibility); |
| mAwContents.onVisibilityChanged(changedView, visibility); |
| } |
| |
| @Override |
| public void onWindowVisibilityChanged(int visibility) { |
| super.onWindowVisibilityChanged(visibility); |
| mAwContents.onWindowVisibilityChanged(visibility); |
| } |
| |
| @Override |
| public boolean onTouchEvent(MotionEvent ev) { |
| super.onTouchEvent(ev); |
| return mAwContents.onTouchEvent(ev); |
| } |
| |
| @Override |
| public void onDraw(Canvas canvas) { |
| mAwContents.onDraw(canvas); |
| super.onDraw(canvas); |
| } |
| |
| @Override |
| public AccessibilityNodeProvider getAccessibilityNodeProvider() { |
| AccessibilityNodeProvider provider = |
| mAwContents.getAccessibilityNodeProvider(); |
| return provider == null ? super.getAccessibilityNodeProvider() : provider; |
| } |
| |
| @Override |
| public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { |
| super.onInitializeAccessibilityNodeInfo(info); |
| info.setClassName(AwContents.class.getName()); |
| mAwContents.onInitializeAccessibilityNodeInfo(info); |
| } |
| |
| @Override |
| public void onInitializeAccessibilityEvent(AccessibilityEvent event) { |
| super.onInitializeAccessibilityEvent(event); |
| event.setClassName(AwContents.class.getName()); |
| mAwContents.onInitializeAccessibilityEvent(event); |
| } |
| |
| @Override |
| public boolean performAccessibilityAction(int action, Bundle arguments) { |
| return mAwContents.performAccessibilityAction(action, arguments); |
| } |
| |
| // TODO: AwContents could define a generic class that holds an implementation similar to |
| // the one below. |
| private class InternalAccessAdapter implements AwContents.InternalAccessDelegate { |
| |
| @Override |
| public boolean drawChild(Canvas canvas, View child, long drawingTime) { |
| return AwTestContainerView.super.drawChild(canvas, child, drawingTime); |
| } |
| |
| @Override |
| public boolean super_onKeyUp(int keyCode, KeyEvent event) { |
| return AwTestContainerView.super.onKeyUp(keyCode, event); |
| } |
| |
| @Override |
| public boolean super_dispatchKeyEventPreIme(KeyEvent event) { |
| return AwTestContainerView.super.dispatchKeyEventPreIme(event); |
| } |
| |
| @Override |
| public boolean super_dispatchKeyEvent(KeyEvent event) { |
| return AwTestContainerView.super.dispatchKeyEvent(event); |
| } |
| |
| @Override |
| public boolean super_onGenericMotionEvent(MotionEvent event) { |
| return AwTestContainerView.super.onGenericMotionEvent(event); |
| } |
| |
| @Override |
| public void super_onConfigurationChanged(Configuration newConfig) { |
| AwTestContainerView.super.onConfigurationChanged(newConfig); |
| } |
| |
| @Override |
| public void super_scrollTo(int scrollX, int scrollY) { |
| // We're intentionally not calling super.scrollTo here to make testing easier. |
| AwTestContainerView.this.scrollTo(scrollX, scrollY); |
| } |
| |
| @Override |
| public void overScrollBy(int deltaX, int deltaY, |
| int scrollX, int scrollY, |
| int scrollRangeX, int scrollRangeY, |
| int maxOverScrollX, int maxOverScrollY, |
| boolean isTouchEvent) { |
| // We're intentionally not calling super.scrollTo here to make testing easier. |
| AwTestContainerView.this.overScrollBy(deltaX, deltaY, scrollX, scrollY, |
| scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent); |
| } |
| |
| @Override |
| public void onScrollChanged(int l, int t, int oldl, int oldt) { |
| AwTestContainerView.super.onScrollChanged(l, t, oldl, oldt); |
| } |
| |
| @Override |
| public boolean awakenScrollBars() { |
| return AwTestContainerView.super.awakenScrollBars(); |
| } |
| |
| @Override |
| public boolean super_awakenScrollBars(int startDelay, boolean invalidate) { |
| return AwTestContainerView.super.awakenScrollBars(startDelay, invalidate); |
| } |
| |
| @Override |
| public void setMeasuredDimension(int measuredWidth, int measuredHeight) { |
| AwTestContainerView.super.setMeasuredDimension(measuredWidth, measuredHeight); |
| } |
| |
| @Override |
| public int super_getScrollBarStyle() { |
| return AwTestContainerView.super.getScrollBarStyle(); |
| } |
| |
| @Override |
| public boolean requestDrawGL(Canvas canvas) { |
| return false; |
| } |
| } |
| } |