111438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba/* 211438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba * Copyright 2009, The Android Open Source Project 311438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba * 411438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba * Redistribution and use in source and binary forms, with or without 511438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba * modification, are permitted provided that the following conditions 611438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba * are met: 711438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba * * Redistributions of source code must retain the above copyright 811438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba * notice, this list of conditions and the following disclaimer. 911438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba * * Redistributions in binary form must reproduce the above copyright 1011438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba * notice, this list of conditions and the following disclaimer in the 1111438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba * documentation and/or other materials provided with the distribution. 1211438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba * 1311438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY 1411438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1511438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1611438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 1711438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 1811438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 1911438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 2011438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 2111438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2211438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2311438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2411438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba */ 2511438c371e5757bde2a5c08eb81aedb794805fc1Grace Klobapackage android.webkit; 2611438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba 277ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenbergerimport android.content.Context; 287ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenbergerimport android.view.Gravity; 2911438c371e5757bde2a5c08eb81aedb794805fc1Grace Klobaimport android.view.KeyEvent; 3011438c371e5757bde2a5c08eb81aedb794805fc1Grace Klobaimport android.view.MotionEvent; 316edb3792d83e6e299a9d330db938075634e76d14Grace Klobaimport android.view.SurfaceView; 3211438c371e5757bde2a5c08eb81aedb794805fc1Grace Klobaimport android.view.View; 337c5bf4666cb8f2f79a61f46f14dd2272b0ba41dbDerek Sollenbergerimport android.view.ViewGroup; 347ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenbergerimport android.widget.FrameLayout; 3511438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba 367ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenbergerclass PluginFullScreenHolder { 3711438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba 3811438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba private final WebView mWebView; 3911438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba private final int mNpp; 407ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger private final int mOrientation; 417ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger 427ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger // The container for the plugin view 437ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger private static CustomFrameLayout mLayout; 447ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger 457c5bf4666cb8f2f79a61f46f14dd2272b0ba41dbDerek Sollenberger private View mContentView; 4611438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba 477ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger PluginFullScreenHolder(WebView webView, int orientation, int npp) { 4811438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba mWebView = webView; 4911438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba mNpp = npp; 507ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger mOrientation = orientation; 5111438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba } 5211438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba 537c5bf4666cb8f2f79a61f46f14dd2272b0ba41dbDerek Sollenberger public void setContentView(View contentView) { 547ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger 557ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger // Create a FrameLayout that will contain the plugin's view 567ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger mLayout = new CustomFrameLayout(mWebView.getContext()); 577ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams( 587ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger ViewGroup.LayoutParams.MATCH_PARENT, 597ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger ViewGroup.LayoutParams.MATCH_PARENT, 607ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger Gravity.CENTER); 617ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger 627ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger mLayout.addView(contentView, layoutParams); 637ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger mLayout.setVisibility(View.VISIBLE); 647ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger 656edb3792d83e6e299a9d330db938075634e76d14Grace Kloba // fixed size is only used either during pinch zoom or surface is too 666edb3792d83e6e299a9d330db938075634e76d14Grace Kloba // big. Make sure it is not fixed size before setting it to the full 67f706ef857bd14501d2c91b52e12e6bd387f63dadGrace Kloba // screen content view. The SurfaceView will be set to the correct mode 68f706ef857bd14501d2c91b52e12e6bd387f63dadGrace Kloba // by the ViewManager when it is re-attached to the WebView. 696edb3792d83e6e299a9d330db938075634e76d14Grace Kloba if (contentView instanceof SurfaceView) { 706edb3792d83e6e299a9d330db938075634e76d14Grace Kloba final SurfaceView sView = (SurfaceView) contentView; 716edb3792d83e6e299a9d330db938075634e76d14Grace Kloba if (sView.isFixedSize()) { 726edb3792d83e6e299a9d330db938075634e76d14Grace Kloba sView.getHolder().setSizeFromLayout(); 736edb3792d83e6e299a9d330db938075634e76d14Grace Kloba } 746edb3792d83e6e299a9d330db938075634e76d14Grace Kloba } 757ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger 767c5bf4666cb8f2f79a61f46f14dd2272b0ba41dbDerek Sollenberger mContentView = contentView; 777c5bf4666cb8f2f79a61f46f14dd2272b0ba41dbDerek Sollenberger } 787c5bf4666cb8f2f79a61f46f14dd2272b0ba41dbDerek Sollenberger 797ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger public void show() { 807ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger // Other plugins may attempt to draw so hide them while we're active. 817ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger if (mWebView.getViewManager() != null) 827ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger mWebView.getViewManager().hideAll(); 837ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger 847ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger WebChromeClient client = mWebView.getWebChromeClient(); 857ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger client.onShowCustomView(mLayout, mOrientation, mCallback); 8611438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba } 8711438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba 887ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger public void hide() { 897ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger WebChromeClient client = mWebView.getWebChromeClient(); 907ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger client.onHideCustomView(); 9111438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba } 9211438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba 937ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger private class CustomFrameLayout extends FrameLayout { 947ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger 957ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger CustomFrameLayout(Context context) { 967ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger super(context); 9711438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba } 9811438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba 997ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger @Override 1007ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger public boolean onKeyDown(int keyCode, KeyEvent event) { 1017ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger if (event.isSystem()) { 1027ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger return super.onKeyDown(keyCode, event); 1037ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger } 1047ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger mWebView.onKeyDown(keyCode, event); 1057ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger // always return true as we are the handler 1067ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger return true; 1077ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger } 10811438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba 1097ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger @Override 1107ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger public boolean onKeyUp(int keyCode, KeyEvent event) { 1117ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger if (event.isSystem()) { 1127ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger return super.onKeyUp(keyCode, event); 1137ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger } 1147ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger mWebView.onKeyUp(keyCode, event); 1157ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger // always return true as we are the handler 1167ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger return true; 1177ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger } 11811438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba 1197ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger @Override 1207ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger public boolean onTouchEvent(MotionEvent event) { 1217ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger // always return true as we don't want the event to propagate any further 1227ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger return true; 1237ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger } 1247ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger 1257ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger @Override 1267ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger public boolean onTrackballEvent(MotionEvent event) { 1277ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger mWebView.onTrackballEvent(event); 1287ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger // always return true as we are the handler 1297ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger return true; 1307c5bf4666cb8f2f79a61f46f14dd2272b0ba41dbDerek Sollenberger } 13111438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba } 1327ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger 1337ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger private final WebChromeClient.CustomViewCallback mCallback = 1347ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger new WebChromeClient.CustomViewCallback() { 1357ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger public void onCustomViewHidden() { 1367ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger 1377ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger mWebView.mPrivateHandler.obtainMessage(WebView.HIDE_FULLSCREEN) 1387ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger .sendToTarget(); 1397ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger 1407ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger mWebView.getWebViewCore().sendMessage( 1417ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger WebViewCore.EventHub.HIDE_FULLSCREEN, mNpp, 0); 14211438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba 1437ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger mLayout.removeView(mContentView); 1447ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger mLayout = null; 1457ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger 1467ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger // Re enable plugin views. 1477ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger mWebView.getViewManager().showAll(); 1487ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger } 1497ab3d673ba341db5a44a9c754a25961cfd16f8cdDerek Sollenberger }; 15011438c371e5757bde2a5c08eb81aedb794805fc1Grace Kloba} 151