ContentViewClient.java revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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.content.ActivityNotFoundException;
8import android.content.Context;
9import android.content.Intent;
10import android.graphics.RectF;
11import android.util.Log;
12import android.view.ActionMode;
13import android.view.KeyEvent;
14
15import org.chromium.content.browser.SelectActionModeCallback.ActionHandler;
16
17import 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 */
31public 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