1// Copyright 2014 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.android_webview;
6
7import android.content.res.Configuration;
8import android.graphics.Canvas;
9import android.graphics.Paint;
10import android.graphics.Rect;
11import android.view.KeyEvent;
12import android.view.MotionEvent;
13import android.view.View;
14import android.view.inputmethod.EditorInfo;
15import android.view.inputmethod.InputConnection;
16
17import org.chromium.android_webview.AwContents.InternalAccessDelegate;
18
19/**
20 * No-op implementation of {@link AwViewMethods} that follows the null object pattern.
21 * This {@link NullAwViewMethods} is hooked up to the WebView in fullscreen mode, and
22 * to the {@link FullScreenView} in embedded mode, but not to both at the same time.
23 */
24class NullAwViewMethods implements AwViewMethods {
25    private AwContents mAwContents;
26    private InternalAccessDelegate mInternalAccessAdapter;
27    private View mContainerView;
28
29    public NullAwViewMethods(
30            AwContents awContents, InternalAccessDelegate internalAccessAdapter,
31            View containerView) {
32        mAwContents = awContents;
33        mInternalAccessAdapter = internalAccessAdapter;
34        mContainerView = containerView;
35    }
36
37    @Override
38    public void onDraw(Canvas canvas) {
39        canvas.drawColor(mAwContents.getEffectiveBackgroundColor());
40    }
41
42    @Override
43    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
44        // When the containerView is using the NullAwViewMethods then it is not
45        // attached to the AwContents. As such, we don't have any contents to measure
46        // and using the last measured dimension is the best we can do.
47        mInternalAccessAdapter.setMeasuredDimension(
48                mContainerView.getMeasuredWidth(), mContainerView.getMeasuredHeight());
49    }
50
51    @Override
52    public void requestFocus() {
53        // Intentional no-op.
54    }
55
56    @Override
57    public void setLayerType(int layerType, Paint paint) {
58        // Intentional no-op.
59    }
60
61    @Override
62    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
63        return null; // Intentional no-op.
64    }
65
66    @Override
67    public boolean onKeyUp(int keyCode, KeyEvent event) {
68        return false; // Intentional no-op.
69    }
70
71    @Override
72    public boolean dispatchKeyEvent(KeyEvent event) {
73        return false; // Intentional no-op.
74    }
75
76    @Override
77    public boolean onTouchEvent(MotionEvent event) {
78        return false; // Intentional no-op.
79    }
80
81    @Override
82    public boolean onHoverEvent(MotionEvent event) {
83        return false; // Intentional no-op.
84    }
85
86    @Override
87    public boolean onGenericMotionEvent(MotionEvent event) {
88        return false; // Intentional no-op.
89    }
90
91    @Override
92    public void onConfigurationChanged(Configuration newConfig) {
93        // Intentional no-op.
94    }
95
96    @Override
97    public void onAttachedToWindow() {
98        // Intentional no-op.
99    }
100
101    @Override
102    public void onDetachedFromWindow() {
103        // Intentional no-op.
104    }
105
106    @Override
107    public void onWindowFocusChanged(boolean hasWindowFocus) {
108        // Intentional no-op.
109    }
110
111    @Override
112    public void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
113        // Intentional no-op.
114    }
115
116    @Override
117    public void onSizeChanged(int w, int h, int ow, int oh) {
118        // Intentional no-op.
119    }
120
121    @Override
122    public void onVisibilityChanged(View changedView, int visibility) {
123        // Intentional no-op.
124    }
125
126    @Override
127    public void onWindowVisibilityChanged(int visibility) {
128        // Intentional no-op.
129    }
130}
131