blob: b4885688f7acd8a6752f9100d59fec2aa4f1d737 [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.annotation.SuppressLint;
import android.os.Build;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import androidx.annotation.RequiresApi;
import androidx.webkit.WebResourceErrorCompat;
import io.flutter.plugin.common.BinaryMessenger;
import io.flutter.plugins.webviewflutter.GeneratedAndroidWebView.WebViewClientFlutterApi;
import java.util.HashMap;
/**
* Flutter Api implementation for {@link WebViewClient}.
*
* <p>Passes arguments of callbacks methods from a {@link WebViewClient} to Dart.
*/
public class WebViewClientFlutterApiImpl extends WebViewClientFlutterApi {
private final InstanceManager instanceManager;
@RequiresApi(api = Build.VERSION_CODES.M)
static GeneratedAndroidWebView.WebResourceErrorData createWebResourceErrorData(
WebResourceError error) {
return new GeneratedAndroidWebView.WebResourceErrorData.Builder()
.setErrorCode((long) error.getErrorCode())
.setDescription(error.getDescription().toString())
.build();
}
@SuppressLint("RequiresFeature")
static GeneratedAndroidWebView.WebResourceErrorData createWebResourceErrorData(
WebResourceErrorCompat error) {
return new GeneratedAndroidWebView.WebResourceErrorData.Builder()
.setErrorCode((long) error.getErrorCode())
.setDescription(error.getDescription().toString())
.build();
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
static GeneratedAndroidWebView.WebResourceRequestData createWebResourceRequestData(
WebResourceRequest request) {
final GeneratedAndroidWebView.WebResourceRequestData.Builder requestData =
new GeneratedAndroidWebView.WebResourceRequestData.Builder()
.setUrl(request.getUrl().toString())
.setIsForMainFrame(request.isForMainFrame())
.setHasGesture(request.hasGesture())
.setMethod(request.getMethod())
.setRequestHeaders(
request.getRequestHeaders() != null
? request.getRequestHeaders()
: new HashMap<>());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
requestData.setIsRedirect(request.isRedirect());
}
return requestData.build();
}
/**
* Creates a Flutter api that sends messages to Dart.
*
* @param binaryMessenger handles sending messages to Dart
* @param instanceManager maintains instances stored to communicate with Dart objects
*/
public WebViewClientFlutterApiImpl(
BinaryMessenger binaryMessenger, InstanceManager instanceManager) {
super(binaryMessenger);
this.instanceManager = instanceManager;
}
/** Passes arguments from {@link WebViewClient#onPageStarted} to Dart. */
public void onPageStarted(
WebViewClient webViewClient, WebView webView, String urlArg, Reply<Void> callback) {
onPageStarted(
instanceManager.getInstanceId(webViewClient),
instanceManager.getInstanceId(webView),
urlArg,
callback);
}
/** Passes arguments from {@link WebViewClient#onPageFinished} to Dart. */
public void onPageFinished(
WebViewClient webViewClient, WebView webView, String urlArg, Reply<Void> callback) {
onPageFinished(
instanceManager.getInstanceId(webViewClient),
instanceManager.getInstanceId(webView),
urlArg,
callback);
}
/**
* Passes arguments from {@link WebViewClient#onReceivedError(WebView, WebResourceRequest,
* WebResourceError)} to Dart.
*/
@RequiresApi(api = Build.VERSION_CODES.M)
public void onReceivedRequestError(
WebViewClient webViewClient,
WebView webView,
WebResourceRequest request,
WebResourceError error,
Reply<Void> callback) {
onReceivedRequestError(
instanceManager.getInstanceId(webViewClient),
instanceManager.getInstanceId(webView),
createWebResourceRequestData(request),
createWebResourceErrorData(error),
callback);
}
/**
* Passes arguments from {@link androidx.webkit.WebViewClientCompat#onReceivedError(WebView,
* WebResourceRequest, WebResourceError)} to Dart.
*/
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public void onReceivedRequestError(
WebViewClient webViewClient,
WebView webView,
WebResourceRequest request,
WebResourceErrorCompat error,
Reply<Void> callback) {
onReceivedRequestError(
instanceManager.getInstanceId(webViewClient),
instanceManager.getInstanceId(webView),
createWebResourceRequestData(request),
createWebResourceErrorData(error),
callback);
}
/**
* Passes arguments from {@link WebViewClient#onReceivedError(WebView, int, String, String)} to
* Dart.
*/
public void onReceivedError(
WebViewClient webViewClient,
WebView webView,
Long errorCodeArg,
String descriptionArg,
String failingUrlArg,
Reply<Void> callback) {
onReceivedError(
instanceManager.getInstanceId(webViewClient),
instanceManager.getInstanceId(webView),
errorCodeArg,
descriptionArg,
failingUrlArg,
callback);
}
/**
* Passes arguments from {@link WebViewClient#shouldOverrideUrlLoading(WebView,
* WebResourceRequest)} to Dart.
*/
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public void requestLoading(
WebViewClient webViewClient,
WebView webView,
WebResourceRequest request,
Reply<Void> callback) {
requestLoading(
instanceManager.getInstanceId(webViewClient),
instanceManager.getInstanceId(webView),
createWebResourceRequestData(request),
callback);
}
/**
* Passes arguments from {@link WebViewClient#shouldOverrideUrlLoading(WebView, String)} to Dart.
*/
public void urlLoading(
WebViewClient webViewClient, WebView webView, String urlArg, Reply<Void> callback) {
urlLoading(
instanceManager.getInstanceId(webViewClient),
instanceManager.getInstanceId(webView),
urlArg,
callback);
}
/**
* Communicates to Dart that the reference to a {@link WebViewClient} was removed.
*
* @param webViewClient the instance whose reference will be removed
* @param callback reply callback with return value from Dart
*/
public void dispose(WebViewClient webViewClient, Reply<Void> callback) {
final Long instanceId = instanceManager.removeInstance(webViewClient);
if (instanceId != null) {
dispose(instanceId, callback);
} else {
callback.reply(null);
}
}
}