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.
5 package org.chromium.content.browser;
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;
15 import org.chromium.content.browser.SelectActionModeCallback.ActionHandler;
17 import java.net.URISyntaxException;
20 * Main callback class used by ContentView.
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
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
31 public class ContentViewClient {
32 // Tag used for logging.
33 private static final String TAG = "ContentViewClient";
35 public void onUpdateTitle(String title) {
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.
42 public void onBackgroundColorChanged(int color) {
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.
51 public void onOffsetsForFullscreenChanged(
52 float topControlsOffsetYPix, float contentOffsetYPix, float overdrawBottomHeightPix) {
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) {
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)) {
91 * Called when an ImeEvent is sent to the page. Can be used to know when some text is entered
94 public void onImeEvent() {
98 * Notified when a change to the IME was requested.
100 * @param requestShow Whether the IME was requested to be shown (may already be showing
103 public void onImeStateChangeRequested(boolean requestShow) {
107 * Returns an ActionMode.Callback for in-page selection.
109 public ActionMode.Callback getSelectActionModeCallback(
110 Context context, ActionHandler actionHandler, boolean incognito) {
111 return new SelectActionModeCallback(context, actionHandler, incognito);
115 * Called when the contextual ActionBar is shown.
117 public void onContextualActionBarShown() {
121 * Called when the contextual ActionBar is hidden.
123 public void onContextualActionBarHidden() {
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.
131 public void performWebSearch(String searchQuery) {
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.
140 public boolean doesPerformWebSearch() {
145 * Called when a new content intent is requested to be started.
147 public void onStartContentIntent(Context context, String intentUrl) {
149 // Perform generic parsing of the URI to turn it into an Intent.
151 intent = Intent.parseUri(intentUrl, Intent.URI_INTENT_SCHEME);
152 } catch (URISyntaxException ex) {
153 Log.w(TAG, "Bad URI " + intentUrl + ": " + ex.getMessage());
158 context.startActivity(intent);
159 } catch (ActivityNotFoundException ex) {
160 Log.w(TAG, "No application can handle " + intentUrl);
164 public void onExternalVideoSurfaceRequested(int playerId) {
167 public void onGeometryChanged(int playerId, RectF rect) {
170 public ContentVideoViewClient getContentVideoViewClient() {
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.
179 public boolean shouldBlockMediaRequest(String url) {
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.
188 public void onFlingStarted() {
192 * Called when a fling is stopped, or a fling start event didn't trigger a fling.
194 public void onFlingStopped() {
198 * Called when a scroll gesture has begun.
200 public void onScrollBeginEvent() {
204 * Called when a scroll gesture has ended.
206 public void onScrollEndEvent() {
210 * Called when the scroll offsets or viewport dimensions may have changed.
212 public void onScrollOrViewportChanged() {