6c410eb49a5cb453937bafd1ef562720778491a0
[platform/framework/web/crosswalk.git] / src / content / public / android / java / src / org / chromium / content / browser / ContentViewClient.java
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
5 package org.chromium.content.browser;
6
7 import android.content.ActivityNotFoundException;
8 import android.content.Context;
9 import android.content.Intent;
10 import android.graphics.RectF;
11 import android.util.Log;
12 import android.view.ActionMode;
13 import android.view.KeyEvent;
14
15 import org.chromium.content.browser.SelectActionModeCallback.ActionHandler;
16
17 import java.net.URISyntaxException;
18
19 /**
20  *  Main callback class used by ContentView.
21  *
22  *  This contains the superset of callbacks required to implement the browser UI and the callbacks
23  *  required to implement the WebView API.
24  *  The memory and reference ownership of this class is unusual - see the .cc file and ContentView
25  *  for more details.
26  *
27  *  TODO(mkosiba): Rid this guy of default implementations. This class is used by both WebView and
28  *  the browser and we don't want a the browser-specific default implementation to accidentally leak
29  *  over to WebView.
30  */
31 public class ContentViewClient {
32     // Tag used for logging.
33     private static final String TAG = "ContentViewClient";
34
35     public void onUpdateTitle(String title) {
36     }
37
38     /**
39      * Called whenever the background color of the page changes as notified by WebKit.
40      * @param color The new ARGB color of the page background.
41      */
42     public void onBackgroundColorChanged(int color) {
43     }
44
45     /**
46      * Notifies the client that the position of the top controls has changed.
47      * @param topControlsOffsetYPix The Y offset of the top controls in physical pixels.
48      * @param contentOffsetYPix The Y offset of the content in physical pixels.
49      * @param overdrawBottomHeightPix The overdraw height.
50      */
51     public void onOffsetsForFullscreenChanged(
52             float topControlsOffsetYPix, float contentOffsetYPix, float overdrawBottomHeightPix) {
53     }
54
55     public boolean shouldOverrideKeyEvent(KeyEvent event) {
56         int keyCode = event.getKeyCode();
57         // We need to send almost every key to WebKit. However:
58         // 1. We don't want to block the device on the renderer for
59         // some keys like menu, home, call.
60         // 2. There are no WebKit equivalents for some of these keys
61         // (see app/keyboard_codes_win.h)
62         // Note that these are not the same set as KeyEvent.isSystemKey:
63         // for instance, AKEYCODE_MEDIA_* will be dispatched to webkit.
64         if (keyCode == KeyEvent.KEYCODE_MENU ||
65             keyCode == KeyEvent.KEYCODE_HOME ||
66             keyCode == KeyEvent.KEYCODE_BACK ||
67             keyCode == KeyEvent.KEYCODE_CALL ||
68             keyCode == KeyEvent.KEYCODE_ENDCALL ||
69             keyCode == KeyEvent.KEYCODE_POWER ||
70             keyCode == KeyEvent.KEYCODE_HEADSETHOOK ||
71             keyCode == KeyEvent.KEYCODE_CAMERA ||
72             keyCode == KeyEvent.KEYCODE_FOCUS ||
73             keyCode == KeyEvent.KEYCODE_VOLUME_DOWN ||
74             keyCode == KeyEvent.KEYCODE_VOLUME_MUTE ||
75             keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
76             return true;
77         }
78
79         // We also have to intercept some shortcuts before we send them to the ContentView.
80         if (event.isCtrlPressed() && (
81                 keyCode == KeyEvent.KEYCODE_TAB ||
82                 keyCode == KeyEvent.KEYCODE_W ||
83                 keyCode == KeyEvent.KEYCODE_F4)) {
84             return true;
85         }
86
87         return false;
88     }
89
90     /**
91      * Called when an ImeEvent is sent to the page. Can be used to know when some text is entered
92      * in a page.
93      */
94     public void onImeEvent() {
95     }
96
97     /**
98      * Notified when a change to the IME was requested.
99      *
100      * @param requestShow Whether the IME was requested to be shown (may already be showing
101      *                    though).
102      */
103     public void onImeStateChangeRequested(boolean requestShow) {
104     }
105
106     /**
107      * Returns an ActionMode.Callback for in-page selection.
108      */
109     public ActionMode.Callback getSelectActionModeCallback(
110             Context context, ActionHandler actionHandler, boolean incognito) {
111         return new SelectActionModeCallback(context, actionHandler, incognito);
112     }
113
114     /**
115      * Called when the contextual ActionBar is shown.
116      */
117     public void onContextualActionBarShown() {
118     }
119
120     /**
121      * Called when the contextual ActionBar is hidden.
122      */
123     public void onContextualActionBarHidden() {
124     }
125
126     /**
127      * Perform a search on {@code searchQuery}.  This method is only called if
128      * {@link #doesPerformWebSearch()} returns {@code true}.
129      * @param searchQuery The string to search for.
130      */
131     public void performWebSearch(String searchQuery) {
132     }
133
134     /**
135      * If this returns {@code true} contextual web search attempts will be forwarded to
136      * {@link #performWebSearch(String)}.
137      * @return {@code true} iff this {@link ContentViewClient} wants to consume web search queries
138      *         and override the default intent behavior.
139      */
140     public boolean doesPerformWebSearch() {
141         return false;
142     }
143
144     /**
145      * Called when a new content intent is requested to be started.
146      */
147     public void onStartContentIntent(Context context, String intentUrl) {
148         Intent intent;
149         // Perform generic parsing of the URI to turn it into an Intent.
150         try {
151             intent = Intent.parseUri(intentUrl, Intent.URI_INTENT_SCHEME);
152         } catch (URISyntaxException ex) {
153             Log.w(TAG, "Bad URI " + intentUrl + ": " + ex.getMessage());
154             return;
155         }
156
157         try {
158             context.startActivity(intent);
159         } catch (ActivityNotFoundException ex) {
160             Log.w(TAG, "No application can handle " + intentUrl);
161         }
162     }
163
164     public void onExternalVideoSurfaceRequested(int playerId) {
165     }
166
167     public void onGeometryChanged(int playerId, RectF rect) {
168     }
169
170     public ContentVideoViewClient getContentVideoViewClient() {
171         return null;
172     }
173
174     /**
175      * Called when BrowserMediaPlayerManager wants to load a media resource.
176      * @param url the URL of media resource to load.
177      * @return true to prevent the resource from being loaded.
178      */
179     public boolean shouldBlockMediaRequest(String url) {
180         return false;
181     }
182
183     /**
184      * Called when a fling start event is sent. Note: onFlingStopped() of the previous
185      * fling may be called after onFlingStarted() of the current fling, so if the
186      * client wants to manage the fling status, a counter should be used.
187      */
188     public void onFlingStarted() {
189     }
190
191     /**
192      * Called when a fling is stopped, or a fling start event didn't trigger a fling.
193      */
194     public void onFlingStopped() {
195     }
196
197     /**
198      * Called when a scroll gesture has begun.
199      */
200     public void onScrollBeginEvent() {
201     }
202
203     /**
204      * Called when a scroll gesture has ended.
205      */
206     public void onScrollEndEvent() {
207     }
208
209     /**
210      * Called when the scroll offsets or viewport dimensions may have changed.
211      */
212     public void onScrollOrViewportChanged() {
213     }
214 }