1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)package org.chromium.android_webview; 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)import android.content.ContentResolver; 86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)import android.content.Context; 96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)import android.net.Uri; 106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)import android.os.AsyncTask; 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import android.os.Handler; 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import android.os.Message; 136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)import android.provider.MediaStore; 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import android.util.Log; 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import android.view.KeyEvent; 1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)import android.view.View; 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import android.webkit.ConsoleMessage; 18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochimport android.webkit.ValueCallback; 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)import org.chromium.base.ContentUriUtils; 211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)import org.chromium.base.ThreadUtils; 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdochimport org.chromium.content.browser.ContentVideoView; 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import org.chromium.content.browser.ContentViewCore; 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/** 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Adapts the AwWebContentsDelegate interface to the AwContentsClient interface. 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * This class also serves a secondary function of routing certain callbacks from the content layer 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * to specific listener interfaces. 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */ 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AwWebContentsDelegateAdapter extends AwWebContentsDelegate { 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private static final String TAG = "AwWebContentsDelegateAdapter"; 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) final AwContentsClient mContentsClient; 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch View mContainerView; 356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) final Context mContext; 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public AwWebContentsDelegateAdapter(AwContentsClient contentsClient, 386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) View containerView, Context context) { 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mContentsClient = contentsClient; 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch setContainerView(containerView); 416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) mContext = context; 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public void setContainerView(View containerView) { 4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) mContainerView = containerView; 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @Override 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public void onLoadProgressChanged(int progress) { 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mContentsClient.onProgressChanged(progress); 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @Override 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public void handleKeyboardEvent(KeyEvent event) { 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (event.getAction() == KeyEvent.ACTION_DOWN) { 5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int direction; 5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (event.getKeyCode()) { 5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case KeyEvent.KEYCODE_DPAD_DOWN: 5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) direction = View.FOCUS_DOWN; 6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case KeyEvent.KEYCODE_DPAD_UP: 6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) direction = View.FOCUS_UP; 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case KeyEvent.KEYCODE_DPAD_LEFT: 6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) direction = View.FOCUS_LEFT; 6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case KeyEvent.KEYCODE_DPAD_RIGHT: 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) direction = View.FOCUS_RIGHT; 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) default: 7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) direction = 0; 7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (direction != 0 && tryToMoveFocus(direction)) return; 7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mContentsClient.onUnhandledKeyEvent(event); 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @Override 8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public boolean takeFocus(boolean reverse) { 8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int direction = 8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) (reverse == (mContainerView.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL)) ? 8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) View.FOCUS_RIGHT : View.FOCUS_LEFT; 8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (tryToMoveFocus(direction)) return true; 8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) direction = reverse ? View.FOCUS_UP : View.FOCUS_DOWN; 8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return tryToMoveFocus(direction); 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private boolean tryToMoveFocus(int direction) { 9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) View focus = mContainerView.focusSearch(direction); 9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return focus != null && focus != mContainerView && focus.requestFocus(); 9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) @Override 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public boolean addMessageToConsole(int level, String message, int lineNumber, 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) String sourceId) { 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ConsoleMessage.MessageLevel messageLevel = ConsoleMessage.MessageLevel.DEBUG; 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch(level) { 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case LOG_LEVEL_TIP: 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) messageLevel = ConsoleMessage.MessageLevel.TIP; 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case LOG_LEVEL_LOG: 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) messageLevel = ConsoleMessage.MessageLevel.LOG; 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case LOG_LEVEL_WARNING: 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) messageLevel = ConsoleMessage.MessageLevel.WARNING; 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case LOG_LEVEL_ERROR: 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) messageLevel = ConsoleMessage.MessageLevel.ERROR; 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Log.w(TAG, "Unknown message level, defaulting to DEBUG"); 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return mContentsClient.onConsoleMessage( 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new ConsoleMessage(message, sourceId, lineNumber, messageLevel)); 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @Override 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public void onUpdateUrl(String url) { 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO: implement 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @Override 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public void openNewTab(String url, String extraHeaders, byte[] postData, int disposition, 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) boolean isRendererInitiated) { 128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // This is only called in chrome layers. 129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch assert false; 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @Override 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public void closeContents() { 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mContentsClient.onCloseWindow(); 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @Override 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public void showRepostFormWarningDialog(final ContentViewCore contentViewCore) { 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(mkosiba) We should be using something akin to the JsResultReceiver as the 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // callback parameter (instead of ContentViewCore) and implement a way of converting 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // that to a pair of messages. 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci final int msgContinuePendingReload = 1; 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci final int msgCancelPendingReload = 2; 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(sgurun) Remember the URL to cancel the reload behavior 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // if it is different than the most recent NavigationController entry. 1471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) final Handler handler = new Handler(ThreadUtils.getUiThreadLooper()) { 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @Override 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public void handleMessage(Message msg) { 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch(msg.what) { 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case msgContinuePendingReload: { 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci contentViewCore.getWebContents().getNavigationController() 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .continuePendingReload(); 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case msgCancelPendingReload: { 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci contentViewCore.getWebContents().getNavigationController() 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .cancelPendingReload(); 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) throw new IllegalStateException( 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "WebContentsDelegateAdapter: unhandled message " + msg.what); 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Message resend = handler.obtainMessage(msgContinuePendingReload); 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Message dontResend = handler.obtainMessage(msgCancelPendingReload); 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mContentsClient.onFormResubmission(dontResend, resend); 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @Override 1746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) public void runFileChooser(final int processId, final int renderId, final int modeFlags, 175ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch String acceptTypes, String title, String defaultFilename, boolean capture) { 176ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AwContentsClient.FileChooserParams params = new AwContentsClient.FileChooserParams(); 1776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) params.mode = modeFlags; 178ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch params.acceptTypes = acceptTypes; 179ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch params.title = title; 180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch params.defaultFilename = defaultFilename; 181ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch params.capture = capture; 182ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 183ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch mContentsClient.showFileChooser(new ValueCallback<String[]>() { 1846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) boolean mCompleted = false; 185ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch @Override 186ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch public void onReceiveValue(String[] results) { 1876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (mCompleted) { 188ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch throw new IllegalStateException("Duplicate showFileChooser result"); 189ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 1906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) mCompleted = true; 1916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (results == null) { 1926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) nativeFilesSelectedInChooser( 1936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) processId, renderId, modeFlags, null, null); 1946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return; 1956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 1966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) GetDisplayNameTask task = new GetDisplayNameTask( 1976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) mContext.getContentResolver(), processId, renderId, modeFlags, results); 1986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) task.execute(); 199ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 200ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch }, params); 201ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 202ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 203ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch @Override 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public boolean addNewContents(boolean isDialog, boolean isUserGesture) { 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return mContentsClient.onCreateWindow(isDialog, isUserGesture); 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @Override 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public void activateContents() { 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mContentsClient.onRequestFocus(); 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch @Override 214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public void toggleFullscreenModeForTab(boolean enterFullscreen) { 215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!enterFullscreen) { 216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ContentVideoView videoView = ContentVideoView.getContentVideoView(); 217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (videoView != null) videoView.exitFullscreen(false); 218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 2206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) private static class GetDisplayNameTask extends AsyncTask<Void, Void, String[]> { 2226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) final int mProcessId; 2236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) final int mRenderId; 2246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) final int mModeFlags; 2256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) final String[] mFilePaths; 2266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) final ContentResolver mContentResolver; 2276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) public GetDisplayNameTask(ContentResolver contentResolver, int processId, int renderId, 2296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) int modeFlags, String[] filePaths) { 2306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) mProcessId = processId; 2316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) mRenderId = renderId; 2326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) mModeFlags = modeFlags; 2336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) mFilePaths = filePaths; 2346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) mContentResolver = contentResolver; 2356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 2366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) @Override 2386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) protected String[] doInBackground(Void...voids) { 2396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) String[] displayNames = new String[mFilePaths.length]; 2406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) for (int i = 0; i < mFilePaths.length; i++) { 2416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) displayNames[i] = resolveFileName(mFilePaths[i]); 2426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 2436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return displayNames; 2446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 2456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) @Override 2476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) protected void onPostExecute(String[] result) { 2486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) nativeFilesSelectedInChooser(mProcessId, mRenderId, mModeFlags, mFilePaths, result); 2496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 2506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) /** 2526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * @return the display name of a path if it is a content URI and is present in the database 2536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * or an empty string otherwise. 2546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) */ 2556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) private String resolveFileName(String filePath) { 2566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (mContentResolver == null || filePath == null) return ""; 2576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Uri uri = Uri.parse(filePath); 2586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return ContentUriUtils.getDisplayName( 2596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) uri, mContentResolver, MediaStore.MediaColumns.DISPLAY_NAME); 2606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 2616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 263