blob: d3cd1d57cdaecf240a249bb3058db613b70fceed [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package io.flutter.plugins.webviewflutter;
import android.content.Context;
import android.view.View;
import android.webkit.DownloadListener;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
/** Builder used to create {@link android.webkit.WebView} objects. */
public class WebViewBuilder {
/** Factory used to create a new {@link android.webkit.WebView} instance. */
static class WebViewFactory {
/**
* Creates a new {@link android.webkit.WebView} instance.
*
* @param context an Activity Context to access application assets. This value cannot be null.
* @param usesHybridComposition If {@code false} a {@link InputAwareWebView} instance is
* returned.
* @param containerView must be supplied when the {@code useHybridComposition} parameter is set
* to {@code false}. Used to create an InputConnection on the WebView's dedicated input, or
* IME, thread (see also {@link InputAwareWebView})
* @return A new instance of the {@link android.webkit.WebView} object.
*/
static WebView create(Context context, boolean usesHybridComposition, View containerView) {
return usesHybridComposition
? new WebView(context)
: new InputAwareWebView(context, containerView);
}
}
private final Context context;
private final View containerView;
private boolean enableDomStorage;
private boolean javaScriptCanOpenWindowsAutomatically;
private boolean supportMultipleWindows;
private boolean usesHybridComposition;
private WebChromeClient webChromeClient;
private DownloadListener downloadListener;
/**
* Constructs a new {@link WebViewBuilder} object with a custom implementation of the {@link
* WebViewFactory} object.
*
* @param context an Activity Context to access application assets. This value cannot be null.
* @param containerView must be supplied when the {@code useHybridComposition} parameter is set to
* {@code false}. Used to create an InputConnection on the WebView's dedicated input, or IME,
* thread (see also {@link InputAwareWebView})
*/
WebViewBuilder(@NonNull final Context context, View containerView) {
this.context = context;
this.containerView = containerView;
}
/**
* Sets whether the DOM storage API is enabled. The default value is {@code false}.
*
* @param flag {@code true} is {@link android.webkit.WebView} should use the DOM storage API.
* @return This builder. This value cannot be {@code null}.
*/
public WebViewBuilder setDomStorageEnabled(boolean flag) {
this.enableDomStorage = flag;
return this;
}
/**
* Sets whether JavaScript is allowed to open windows automatically. This applies to the
* JavaScript function {@code window.open()}. The default value is {@code false}.
*
* @param flag {@code true} if JavaScript is allowed to open windows automatically.
* @return This builder. This value cannot be {@code null}.
*/
public WebViewBuilder setJavaScriptCanOpenWindowsAutomatically(boolean flag) {
this.javaScriptCanOpenWindowsAutomatically = flag;
return this;
}
/**
* Sets whether the {@link WebView} supports multiple windows. If set to {@code true}, {@link
* WebChromeClient#onCreateWindow} must be implemented by the host application. The default is
* {@code false}.
*
* @param flag {@code true} if multiple windows are supported.
* @return This builder. This value cannot be {@code null}.
*/
public WebViewBuilder setSupportMultipleWindows(boolean flag) {
this.supportMultipleWindows = flag;
return this;
}
/**
* Sets whether the hybrid composition should be used.
*
* <p>If set to {@code true} a standard {@link WebView} is created. If set to {@code false} the
* {@link WebViewBuilder} will create a {@link InputAwareWebView} to workaround issues using the
* {@link WebView} on Android versions below N.
*
* @param flag {@code true} if uses hybrid composition. The default is {@code false}.
* @return This builder. This value cannot be {@code null}
*/
public WebViewBuilder setUsesHybridComposition(boolean flag) {
this.usesHybridComposition = flag;
return this;
}
/**
* Sets the chrome handler. This is an implementation of WebChromeClient for use in handling
* JavaScript dialogs, favicons, titles, and the progress. This will replace the current handler.
*
* @param webChromeClient an implementation of WebChromeClient This value may be null.
* @return This builder. This value cannot be {@code null}.
*/
public WebViewBuilder setWebChromeClient(@Nullable WebChromeClient webChromeClient) {
this.webChromeClient = webChromeClient;
return this;
}
/**
* Registers the interface to be used when content can not be handled by the rendering engine, and
* should be downloaded instead. This will replace the current handler.
*
* @param downloadListener an implementation of DownloadListener This value may be null.
* @return This builder. This value cannot be {@code null}.
*/
public WebViewBuilder setDownloadListener(@Nullable DownloadListener downloadListener) {
this.downloadListener = downloadListener;
return this;
}
/**
* Build the {@link android.webkit.WebView} using the current settings.
*
* @return The {@link android.webkit.WebView} using the current settings.
*/
public WebView build() {
WebView webView = WebViewFactory.create(context, usesHybridComposition, containerView);
WebSettings webSettings = webView.getSettings();
webSettings.setDomStorageEnabled(enableDomStorage);
webSettings.setJavaScriptCanOpenWindowsAutomatically(javaScriptCanOpenWindowsAutomatically);
webSettings.setSupportMultipleWindows(supportMultipleWindows);
webView.setWebChromeClient(webChromeClient);
webView.setDownloadListener(downloadListener);
return webView;
}
}