/*
 * Copyright 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.example.androidx.webkit;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

/**
 * An Activity to demonstrate how to properly display fullscreen web content with WebView.
 */
public class FullscreenActivity extends AppCompatActivity {

    // Use YouTube as an example website, but any site with a video player should suffice to
    // demonstrate fullscreen usage.
    private static final String EXAMPLE_SITE_WITH_VIDEO_PLAYER = "https://m.youtube.com/";

    private WebView mWebView;
    private FullScreenWebChromeClient mWebChromeClient;

    /**
     * An example {@link WebChromeClient} implementation which supports showing web content in
     * fullscreen.
     */
    private static class FullScreenWebChromeClient extends WebChromeClient {
        private Window mWindow;

        // Store the View passed from onShowCustomView in a member variable, because we need to
        // access this again during onHideCustomView().
        private View mFullScreenView;

        // Optional: store the CustomViewCallback in a member variable in case the app needs to
        // force WebView to exit fullscreen mode.
        private CustomViewCallback mCustomViewCallback;

        /* package */ FullScreenWebChromeClient(Window window) {
            mWindow = window;
        }

        @Override
        public void onShowCustomView(View view, CustomViewCallback callback) {
            // At this point, the WebView is no longer drawing the content. We should cover it up
            // with the new View.
            mFullScreenView = view;
            mWindow.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
            mWindow.addContentView(mFullScreenView,
                    new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                            ViewGroup.LayoutParams.MATCH_PARENT));
            mCustomViewCallback = callback;
        }

        @Override
        public void onHideCustomView() {
            // At this point, mFullScreenView is no longer drawing content. Remove this from the
            // layout to show the underlying WebView, and remove the reference to the View so it can
            // be GC'ed.
            mWindow.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
            ((ViewGroup) mFullScreenView.getParent()).removeView(mFullScreenView);
            mFullScreenView = null;
            mCustomViewCallback = null;
        }

        /* package */ void exitFullScreen() {
            if (mCustomViewCallback == null) return;
            mCustomViewCallback.onCustomViewHidden();
        }

        /* package */ boolean inFullScreenMode() {
            return mFullScreenView != null;
        }
    }

    @SuppressLint("SetJavaScriptEnabled")
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fullscreen);
        setTitle(R.string.fullscreen_activity_title);
        WebkitHelpers.appendWebViewVersionToTitle(this);
        mWebView = findViewById(R.id.webview_supports_fullscreen);
        mWebView.getSettings().setJavaScriptEnabled(true);

        mWebView.setWebViewClient(new WebViewClient()); // Open links in this WebView.
        mWebChromeClient = new FullScreenWebChromeClient(getWindow());
        mWebView.setWebChromeClient(mWebChromeClient);

        mWebView.loadUrl(EXAMPLE_SITE_WITH_VIDEO_PLAYER);
    }

    @SuppressWarnings("deprecation")
    @Override
    public void onBackPressed() {
        if (mWebChromeClient.inFullScreenMode()) {
            mWebChromeClient.exitFullScreen();
        } else if (mWebView.canGoBack()) {
            mWebView.goBack();
        } else {
            super.onBackPressed();
        }
    }
}
