• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 WebViewClassic 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 
PluginFullScreenHolder(WebViewClassic webView, int orientation, int npp)47     PluginFullScreenHolder(WebViewClassic webView, int orientation, int npp) {
48         mWebView = webView;
49         mNpp = npp;
50         mOrientation = orientation;
51     }
52 
setContentView(View contentView)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 
show()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 
hide()88     public void hide() {
89         WebChromeClient client = mWebView.getWebChromeClient();
90         client.onHideCustomView();
91     }
92 
93     private class CustomFrameLayout extends FrameLayout {
94 
CustomFrameLayout(Context context)95         CustomFrameLayout(Context context) {
96             super(context);
97         }
98 
99         @Override
onKeyDown(int keyCode, KeyEvent event)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
onKeyUp(int keyCode, KeyEvent event)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
onTouchEvent(MotionEvent event)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
onTrackballEvent(MotionEvent event)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(WebViewClassic.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