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