OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.android_webview; | 5 package org.chromium.android_webview; |
6 | 6 |
7 import android.content.ContentResolver; | |
8 import android.content.Context; | |
9 import android.net.Uri; | |
7 import android.os.Handler; | 10 import android.os.Handler; |
8 import android.os.Message; | 11 import android.os.Message; |
9 import android.util.Log; | 12 import android.util.Log; |
10 import android.view.KeyEvent; | 13 import android.view.KeyEvent; |
11 import android.view.View; | 14 import android.view.View; |
12 import android.webkit.ConsoleMessage; | 15 import android.webkit.ConsoleMessage; |
13 import android.webkit.ValueCallback; | 16 import android.webkit.ValueCallback; |
14 | 17 |
18 import org.chromium.base.ContentUriUtils; | |
15 import org.chromium.base.ThreadUtils; | 19 import org.chromium.base.ThreadUtils; |
16 import org.chromium.content.browser.ContentVideoView; | 20 import org.chromium.content.browser.ContentVideoView; |
17 import org.chromium.content.browser.ContentViewCore; | 21 import org.chromium.content.browser.ContentViewCore; |
18 | 22 |
19 /** | 23 /** |
20 * Adapts the AwWebContentsDelegate interface to the AwContentsClient interface. | 24 * Adapts the AwWebContentsDelegate interface to the AwContentsClient interface. |
21 * This class also serves a secondary function of routing certain callbacks from the content layer | 25 * This class also serves a secondary function of routing certain callbacks from the content layer |
22 * to specific listener interfaces. | 26 * to specific listener interfaces. |
23 */ | 27 */ |
24 class AwWebContentsDelegateAdapter extends AwWebContentsDelegate { | 28 class AwWebContentsDelegateAdapter extends AwWebContentsDelegate { |
25 private static final String TAG = "AwWebContentsDelegateAdapter"; | 29 private static final String TAG = "AwWebContentsDelegateAdapter"; |
26 | 30 |
27 final AwContentsClient mContentsClient; | 31 final AwContentsClient mContentsClient; |
28 View mContainerView; | 32 View mContainerView; |
33 final Context mContext; | |
29 | 34 |
30 public AwWebContentsDelegateAdapter(AwContentsClient contentsClient, | 35 public AwWebContentsDelegateAdapter(AwContentsClient contentsClient, |
31 View containerView) { | 36 View containerView, Context context) { |
32 mContentsClient = contentsClient; | 37 mContentsClient = contentsClient; |
33 setContainerView(containerView); | 38 setContainerView(containerView); |
39 mContext = context; | |
34 } | 40 } |
35 | 41 |
36 public void setContainerView(View containerView) { | 42 public void setContainerView(View containerView) { |
37 mContainerView = containerView; | 43 mContainerView = containerView; |
38 } | 44 } |
39 | 45 |
40 @Override | 46 @Override |
41 public void onLoadProgressChanged(int progress) { | 47 public void onLoadProgressChanged(int progress) { |
42 mContentsClient.onProgressChanged(progress); | 48 mContentsClient.onProgressChanged(progress); |
43 } | 49 } |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
171 params.capture = capture; | 177 params.capture = capture; |
172 | 178 |
173 mContentsClient.showFileChooser(new ValueCallback<String[]>() { | 179 mContentsClient.showFileChooser(new ValueCallback<String[]>() { |
174 boolean mCompleted = false; | 180 boolean mCompleted = false; |
175 @Override | 181 @Override |
176 public void onReceiveValue(String[] results) { | 182 public void onReceiveValue(String[] results) { |
177 if (mCompleted) { | 183 if (mCompleted) { |
178 throw new IllegalStateException("Duplicate showFileChooser r esult"); | 184 throw new IllegalStateException("Duplicate showFileChooser r esult"); |
179 } | 185 } |
180 mCompleted = true; | 186 mCompleted = true; |
181 nativeFilesSelectedInChooser(processId, renderId, mode_flags, re sults); | 187 if (results == null) { |
188 nativeFilesSelectedInChooser( | |
189 processId, renderId, mode_flags, null, null); | |
190 return; | |
191 } | |
192 String[] displayNames = new String[results.length]; | |
193 for (int i = 0; i < results.length; ++i) { | |
194 displayNames[i] = resolveFileName(results[i]); | |
195 } | |
196 nativeFilesSelectedInChooser( | |
197 processId, renderId, mode_flags, results, displayNames); | |
182 } | 198 } |
183 }, params); | 199 }, params); |
184 } | 200 } |
185 | 201 |
186 @Override | 202 @Override |
187 public boolean addNewContents(boolean isDialog, boolean isUserGesture) { | 203 public boolean addNewContents(boolean isDialog, boolean isUserGesture) { |
188 return mContentsClient.onCreateWindow(isDialog, isUserGesture); | 204 return mContentsClient.onCreateWindow(isDialog, isUserGesture); |
189 } | 205 } |
190 | 206 |
191 @Override | 207 @Override |
192 public void activateContents() { | 208 public void activateContents() { |
193 mContentsClient.onRequestFocus(); | 209 mContentsClient.onRequestFocus(); |
194 } | 210 } |
195 | 211 |
196 @Override | 212 @Override |
197 public void toggleFullscreenModeForTab(boolean enterFullscreen) { | 213 public void toggleFullscreenModeForTab(boolean enterFullscreen) { |
198 if (!enterFullscreen) { | 214 if (!enterFullscreen) { |
199 ContentVideoView videoView = ContentVideoView.getContentVideoView(); | 215 ContentVideoView videoView = ContentVideoView.getContentVideoView(); |
200 if (videoView != null) videoView.exitFullscreen(false); | 216 if (videoView != null) videoView.exitFullscreen(false); |
201 } | 217 } |
202 } | 218 } |
219 | |
220 /** | |
221 * @return the display name of a path if it is a content URI and is present in the database | |
222 * or an empty string otherwise. | |
223 */ | |
224 private String resolveFileName(String filePath) { | |
225 // Querying the ContentResolver on the UI thread may introduce extra lat ency. | |
226 // However, that is incomparable to the latency introduce by user intera ction | |
boliu
2014/08/11 19:58:14
That's a bad argument, because this delay is *afte
sgurun-gerrit only
2014/08/11 21:23:24
agreed with Bo. This is after user already chose t
qinmin
2014/08/11 22:49:29
Ok, moved all the contentResolver queries to an as
| |
227 // with the select file dialog. | |
228 // TODO(qinmin): Run an async task to resolve all the file names, and pa ss | |
229 // the result back to the UI thread to run nativeFilesSelectedInChooser. | |
230 ContentResolver contentResolver = mContext.getContentResolver(); | |
231 if (contentResolver == null || filePath == null) return ""; | |
232 Uri uri = Uri.parse(filePath); | |
233 return ContentUriUtils.getDisplayName(uri, contentResolver); | |
234 } | |
203 } | 235 } |
OLD | NEW |