1 /* 2 * Copyright 2009, The Android Open Source Project 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * * Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * * Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 package android.webkit; 26 27 import android.content.Context; 28 import android.view.Gravity; 29 import android.view.KeyEvent; 30 import android.view.MotionEvent; 31 import android.view.SurfaceView; 32 import android.view.View; 33 import android.view.ViewGroup; 34 import android.widget.FrameLayout; 35 36 class PluginFullScreenHolder { 37 38 private final WebView mWebView; 39 private final int mNpp; 40 private final int mOrientation; 41 42 // The container for the plugin view 43 private static CustomFrameLayout mLayout; 44 45 private View mContentView; 46 47 PluginFullScreenHolder(WebView webView, int orientation, int npp) { 48 mWebView = webView; 49 mNpp = npp; 50 mOrientation = orientation; 51 } 52 53 public void setContentView(View contentView) { 54 55 // Create a FrameLayout that will contain the plugin's view 56 mLayout = new CustomFrameLayout(mWebView.getContext()); 57 FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams( 58 ViewGroup.LayoutParams.MATCH_PARENT, 59 ViewGroup.LayoutParams.MATCH_PARENT, 60 Gravity.CENTER); 61 62 mLayout.addView(contentView, layoutParams); 63 mLayout.setVisibility(View.VISIBLE); 64 65 // fixed size is only used either during pinch zoom or surface is too 66 // big. Make sure it is not fixed size before setting it to the full 67 // screen content view. The SurfaceView will be set to the correct mode 68 // by the ViewManager when it is re-attached to the WebView. 69 if (contentView instanceof SurfaceView) { 70 final SurfaceView sView = (SurfaceView) contentView; 71 if (sView.isFixedSize()) { 72 sView.getHolder().setSizeFromLayout(); 73 } 74 } 75 76 mContentView = contentView; 77 } 78 79 public void show() { 80 // Other plugins may attempt to draw so hide them while we're active. 81 if (mWebView.getViewManager() != null) 82 mWebView.getViewManager().hideAll(); 83 84 WebChromeClient client = mWebView.getWebChromeClient(); 85 client.onShowCustomView(mLayout, mOrientation, mCallback); 86 } 87 88 public void hide() { 89 WebChromeClient client = mWebView.getWebChromeClient(); 90 client.onHideCustomView(); 91 } 92 93 private class CustomFrameLayout extends FrameLayout { 94 95 CustomFrameLayout(Context context) { 96 super(context); 97 } 98 99 @Override 100 public boolean onKeyDown(int keyCode, KeyEvent event) { 101 if (event.isSystem()) { 102 return super.onKeyDown(keyCode, event); 103 } 104 mWebView.onKeyDown(keyCode, event); 105 // always return true as we are the handler 106 return true; 107 } 108 109 @Override 110 public boolean onKeyUp(int keyCode, KeyEvent event) { 111 if (event.isSystem()) { 112 return super.onKeyUp(keyCode, event); 113 } 114 mWebView.onKeyUp(keyCode, event); 115 // always return true as we are the handler 116 return true; 117 } 118 119 @Override 120 public boolean onTouchEvent(MotionEvent event) { 121 // always return true as we don't want the event to propagate any further 122 return true; 123 } 124 125 @Override 126 public boolean onTrackballEvent(MotionEvent event) { 127 mWebView.onTrackballEvent(event); 128 // always return true as we are the handler 129 return true; 130 } 131 } 132 133 private final WebChromeClient.CustomViewCallback mCallback = 134 new WebChromeClient.CustomViewCallback() { 135 public void onCustomViewHidden() { 136 137 mWebView.mPrivateHandler.obtainMessage(WebView.HIDE_FULLSCREEN) 138 .sendToTarget(); 139 140 mWebView.getWebViewCore().sendMessage( 141 WebViewCore.EventHub.HIDE_FULLSCREEN, mNpp, 0); 142 143 mLayout.removeView(mContentView); 144 mLayout = null; 145 146 // Re enable plugin views. 147 mWebView.getViewManager().showAll(); 148 } 149 }; 150 } 151