diff --git a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md index abdeecea372..1e1796de73b 100644 --- a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md @@ -1,3 +1,8 @@ +## 3.5.1 + +* Updates pigeon dev dependency to `9.2.4`. +* Fixes Android lint warnings. + ## 3.5.0 * Adds support for `PlatformNavigationDelegate.onUrlChange`. diff --git a/packages/webview_flutter/webview_flutter_android/README.md b/packages/webview_flutter/webview_flutter_android/README.md index 5159c10115f..06ec1a7bad4 100644 --- a/packages/webview_flutter/webview_flutter_android/README.md +++ b/packages/webview_flutter/webview_flutter_android/README.md @@ -57,12 +57,12 @@ import io.flutter.plugins.webviewflutter.WebViewFlutterAndroidExternalApi; This package uses [pigeon][3] to generate the communication layer between Flutter and the host platform (Android). The communication interface is defined in the `pigeons/android_webview.dart` file. After editing the communication interface regenerate the communication layer by running -`flutter pub run pigeon --input pigeons/android_webview.dart`. +`dart run pigeon --input pigeons/android_webview.dart`. Besides [pigeon][3] this package also uses [mockito][4] to generate mock objects for testing purposes. To generate the mock objects run the following command: ```bash -flutter pub run build_runner build --delete-conflicting-outputs +dart run build_runner build --delete-conflicting-outputs ``` If you would like to contribute to the plugin, check out our [contribution guide][5]. diff --git a/packages/webview_flutter/webview_flutter_android/android/build.gradle b/packages/webview_flutter/webview_flutter_android/android/build.gradle index 540c208a189..92b34660863 100644 --- a/packages/webview_flutter/webview_flutter_android/android/build.gradle +++ b/packages/webview_flutter/webview_flutter_android/android/build.gradle @@ -33,7 +33,6 @@ android { checkAllWarnings true warningsAsErrors true disable 'AndroidGradlePluginVersion', 'InvalidPackage', 'GradleDependency' - baseline file("lint-baseline.xml") } dependencies { diff --git a/packages/webview_flutter/webview_flutter_android/android/lint-baseline.xml b/packages/webview_flutter/webview_flutter_android/android/lint-baseline.xml deleted file mode 100644 index 10821e05e8b..00000000000 --- a/packages/webview_flutter/webview_flutter_android/android/lint-baseline.xml +++ /dev/null @@ -1,4107 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/CookieManagerHostApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/CookieManagerHostApiImpl.java index d9a647d67a3..9cd785fc33f 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/CookieManagerHostApiImpl.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/CookieManagerHostApiImpl.java @@ -6,10 +6,12 @@ import android.os.Build; import android.webkit.CookieManager; +import androidx.annotation.NonNull; +import io.flutter.plugins.webviewflutter.GeneratedAndroidWebView.CookieManagerHostApi; -class CookieManagerHostApiImpl implements GeneratedAndroidWebView.CookieManagerHostApi { +class CookieManagerHostApiImpl implements CookieManagerHostApi { @Override - public void clearCookies(GeneratedAndroidWebView.Result result) { + public void clearCookies(@NonNull GeneratedAndroidWebView.Result result) { CookieManager cookieManager = CookieManager.getInstance(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { cookieManager.removeAllCookies(result::success); @@ -19,7 +21,7 @@ public void clearCookies(GeneratedAndroidWebView.Result result) { } @Override - public void setCookie(String url, String value) { + public void setCookie(@NonNull String url, @NonNull String value) { CookieManager.getInstance().setCookie(url, value); } diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/DisplayListenerProxy.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/DisplayListenerProxy.java index 31e3fe08c05..d33a4bd4c12 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/DisplayListenerProxy.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/DisplayListenerProxy.java @@ -6,7 +6,6 @@ import static android.hardware.display.DisplayManager.DisplayListener; -import android.annotation.TargetApi; import android.hardware.display.DisplayManager; import android.os.Build; import android.util.Log; @@ -39,7 +38,6 @@ * first initialization of a webview within the process the difference between the lists is the * webview's display listener. */ -@TargetApi(Build.VERSION_CODES.KITKAT) class DisplayListenerProxy { private static final String TAG = "DisplayListenerProxy"; diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/DownloadListenerFlutterApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/DownloadListenerFlutterApiImpl.java index 0d4797e9a1b..f1ddb3a4817 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/DownloadListenerFlutterApiImpl.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/DownloadListenerFlutterApiImpl.java @@ -5,6 +5,7 @@ package io.flutter.plugins.webviewflutter; import android.webkit.DownloadListener; +import androidx.annotation.NonNull; import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugins.webviewflutter.GeneratedAndroidWebView.DownloadListenerFlutterApi; @@ -23,20 +24,20 @@ public class DownloadListenerFlutterApiImpl extends DownloadListenerFlutterApi { * @param instanceManager maintains instances stored to communicate with Dart objects */ public DownloadListenerFlutterApiImpl( - BinaryMessenger binaryMessenger, InstanceManager instanceManager) { + @NonNull BinaryMessenger binaryMessenger, @NonNull InstanceManager instanceManager) { super(binaryMessenger); this.instanceManager = instanceManager; } /** Passes arguments from {@link DownloadListener#onDownloadStart} to Dart. */ public void onDownloadStart( - DownloadListener downloadListener, - String url, - String userAgent, - String contentDisposition, - String mimetype, + @NonNull DownloadListener downloadListener, + @NonNull String url, + @NonNull String userAgent, + @NonNull String contentDisposition, + @NonNull String mimetype, long contentLength, - Reply callback) { + @NonNull Reply callback) { onDownloadStart( getIdentifierForListener(downloadListener), url, diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/DownloadListenerHostApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/DownloadListenerHostApiImpl.java index a9cbcbdd410..09fffe0b8c1 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/DownloadListenerHostApiImpl.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/DownloadListenerHostApiImpl.java @@ -35,10 +35,10 @@ public DownloadListenerImpl(@NonNull DownloadListenerFlutterApiImpl flutterApi) @Override public void onDownloadStart( - String url, - String userAgent, - String contentDisposition, - String mimetype, + @NonNull String url, + @NonNull String userAgent, + @NonNull String contentDisposition, + @NonNull String mimetype, long contentLength) { flutterApi.onDownloadStart( this, url, userAgent, contentDisposition, mimetype, contentLength, reply -> {}); @@ -53,7 +53,9 @@ public static class DownloadListenerCreator { * @param flutterApi handles sending messages to Dart * @return the created {@link DownloadListenerImpl} */ - public DownloadListenerImpl createDownloadListener(DownloadListenerFlutterApiImpl flutterApi) { + @NonNull + public DownloadListenerImpl createDownloadListener( + @NonNull DownloadListenerFlutterApiImpl flutterApi) { return new DownloadListenerImpl(flutterApi); } } @@ -66,16 +68,16 @@ public DownloadListenerImpl createDownloadListener(DownloadListenerFlutterApiImp * @param flutterApi handles sending messages to Dart */ public DownloadListenerHostApiImpl( - InstanceManager instanceManager, - DownloadListenerCreator downloadListenerCreator, - DownloadListenerFlutterApiImpl flutterApi) { + @NonNull InstanceManager instanceManager, + @NonNull DownloadListenerCreator downloadListenerCreator, + @NonNull DownloadListenerFlutterApiImpl flutterApi) { this.instanceManager = instanceManager; this.downloadListenerCreator = downloadListenerCreator; this.flutterApi = flutterApi; } @Override - public void create(Long instanceId) { + public void create(@NonNull Long instanceId) { final DownloadListener downloadListener = downloadListenerCreator.createDownloadListener(flutterApi); instanceManager.addDartCreatedInstance(downloadListener, instanceId); diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FileChooserParamsFlutterApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FileChooserParamsFlutterApiImpl.java index cacf3642c3e..626d868c69d 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FileChooserParamsFlutterApiImpl.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FileChooserParamsFlutterApiImpl.java @@ -6,6 +6,7 @@ import android.os.Build; import android.webkit.WebChromeClient; +import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; import io.flutter.plugin.common.BinaryMessenger; import java.util.Arrays; @@ -28,7 +29,7 @@ public class FileChooserParamsFlutterApiImpl * @param instanceManager maintains instances stored to communicate with Dart objects */ public FileChooserParamsFlutterApiImpl( - BinaryMessenger binaryMessenger, InstanceManager instanceManager) { + @NonNull BinaryMessenger binaryMessenger, @NonNull InstanceManager instanceManager) { super(binaryMessenger); this.instanceManager = instanceManager; } @@ -58,7 +59,8 @@ private static GeneratedAndroidWebView.FileChooserModeEnumData toFileChooserEnum * Stores the FileChooserParams instance and notifies Dart to create a new FileChooserParams * instance that is attached to this one. */ - public void create(WebChromeClient.FileChooserParams instance, Reply callback) { + public void create( + @NonNull WebChromeClient.FileChooserParams instance, @NonNull Reply callback) { if (!instanceManager.containsInstance(instance)) { create( instanceManager.addHostCreatedInstance(instance), diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterAssetManager.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterAssetManager.java index 1d484d8639a..f50b5bf7280 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterAssetManager.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterAssetManager.java @@ -11,6 +11,7 @@ import java.io.IOException; /** Provides access to the assets registered as part of the App bundle. */ +@SuppressWarnings({"deprecation", "DeprecatedIsStillUsed"}) abstract class FlutterAssetManager { final AssetManager assetManager; diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterAssetManagerHostApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterAssetManagerHostApiImpl.java index 791912adb81..ba6d1e5fd57 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterAssetManagerHostApiImpl.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterAssetManagerHostApiImpl.java @@ -5,6 +5,7 @@ package io.flutter.plugins.webviewflutter; import android.webkit.WebView; +import androidx.annotation.NonNull; import io.flutter.plugins.webviewflutter.GeneratedAndroidWebView.FlutterAssetManagerHostApi; import java.io.IOException; import java.util.ArrayList; @@ -20,12 +21,13 @@ public class FlutterAssetManagerHostApiImpl implements FlutterAssetManagerHostAp final FlutterAssetManager flutterAssetManager; /** Constructs a new instance of {@link FlutterAssetManagerHostApiImpl}. */ - public FlutterAssetManagerHostApiImpl(FlutterAssetManager flutterAssetManager) { + public FlutterAssetManagerHostApiImpl(@NonNull FlutterAssetManager flutterAssetManager) { this.flutterAssetManager = flutterAssetManager; } + @NonNull @Override - public List list(String path) { + public List list(@NonNull String path) { try { String[] paths = flutterAssetManager.list(path); @@ -39,8 +41,9 @@ public List list(String path) { } } + @NonNull @Override - public String getAssetFilePathByName(String name) { + public String getAssetFilePathByName(@NonNull String name) { return flutterAssetManager.getAssetFilePathByName(name); } } diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebViewFactory.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebViewFactory.java index 9b3cd471bb8..ec99e996ae0 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebViewFactory.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebViewFactory.java @@ -5,6 +5,8 @@ package io.flutter.plugins.webviewflutter; import android.content.Context; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import io.flutter.plugin.common.StandardMessageCodec; import io.flutter.plugin.platform.PlatformView; import io.flutter.plugin.platform.PlatformViewFactory; @@ -17,9 +19,15 @@ class FlutterWebViewFactory extends PlatformViewFactory { this.instanceManager = instanceManager; } + @NonNull @Override - public PlatformView create(Context context, int id, Object args) { - final PlatformView view = (PlatformView) instanceManager.getInstance((Integer) args); + public PlatformView create(Context context, int viewId, @Nullable Object args) { + final Integer identifier = (Integer) args; + if (identifier == null) { + throw new IllegalStateException("An identifier is required to retrieve WebView instance."); + } + + final PlatformView view = instanceManager.getInstance(identifier); if (view == null) { throw new IllegalStateException("Unable to find WebView instance: " + args); } diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/GeneratedAndroidWebView.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/GeneratedAndroidWebView.java index 5f26060c72d..31e91a44dab 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/GeneratedAndroidWebView.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/GeneratedAndroidWebView.java @@ -1,7 +1,7 @@ // 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. -// Autogenerated from Pigeon (v9.2.3), do not edit directly. +// Autogenerated from Pigeon (v9.2.4), do not edit directly. // See also: https://pub.dev/packages/pigeon package io.flutter.plugins.webviewflutter; diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/InstanceManager.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/InstanceManager.java index de51ebd0482..5fa19d21ce2 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/InstanceManager.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/InstanceManager.java @@ -7,6 +7,7 @@ import android.os.Handler; import android.os.Looper; import android.util.Log; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; @@ -69,7 +70,8 @@ public interface FinalizationListener { * @param finalizationListener the listener for garbage collected weak references. * @return a new `InstanceManager`. */ - public static InstanceManager open(FinalizationListener finalizationListener) { + @NonNull + public static InstanceManager open(@NonNull FinalizationListener finalizationListener) { return new InstanceManager(finalizationListener); } @@ -113,7 +115,7 @@ public T remove(long identifier) { * null if the manager doesn't contain the value or the manager is closed. */ @Nullable - public Long getIdentifierForStrongReference(Object instance) { + public Long getIdentifierForStrongReference(@Nullable Object instance) { if (assertNotClosed()) { return null; } @@ -137,7 +139,7 @@ public Long getIdentifierForStrongReference(Object instance) { * @param identifier the identifier to be paired with instance. This value must be >= 0 and * unique. */ - public void addDartCreatedInstance(Object instance, long identifier) { + public void addDartCreatedInstance(@NonNull Object instance, long identifier) { if (assertNotClosed()) { return; } @@ -151,7 +153,7 @@ public void addDartCreatedInstance(Object instance, long identifier) { * @return the unique identifier stored with instance. If the manager is closed, returns -1. * Otherwise, returns a value >= 0. */ - public long addHostCreatedInstance(Object instance) { + public long addHostCreatedInstance(@NonNull Object instance) { if (assertNotClosed()) { return INSTANCE_CLOSED; } @@ -193,7 +195,7 @@ public T getInstance(long identifier) { * @return whether this manager contains the given `instance`. If the manager is closed, returns * `false`. */ - public boolean containsInstance(Object instance) { + public boolean containsInstance(@Nullable Object instance) { if (assertNotClosed()) { return false; } diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/JavaObjectHostApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/JavaObjectHostApiImpl.java index 9cbf65b4c61..a10cd77852d 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/JavaObjectHostApiImpl.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/JavaObjectHostApiImpl.java @@ -21,7 +21,7 @@ public class JavaObjectHostApiImpl implements GeneratedAndroidWebView.JavaObject * * @param instanceManager maintains instances stored to communicate with Dart objects */ - public JavaObjectHostApiImpl(InstanceManager instanceManager) { + public JavaObjectHostApiImpl(@NonNull InstanceManager instanceManager) { this.instanceManager = instanceManager; } diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/JavaScriptChannel.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/JavaScriptChannel.java index cf2c2629989..09dbfc9ab5d 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/JavaScriptChannel.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/JavaScriptChannel.java @@ -30,8 +30,8 @@ public class JavaScriptChannel { */ public JavaScriptChannel( @NonNull JavaScriptChannelFlutterApiImpl flutterApi, - String channelName, - Handler platformThreadHandler) { + @NonNull String channelName, + @NonNull Handler platformThreadHandler) { this.flutterApi = flutterApi; this.javaScriptChannelName = channelName; this.platformThreadHandler = platformThreadHandler; @@ -40,11 +40,9 @@ public JavaScriptChannel( // Suppressing unused warning as this is invoked from JavaScript. @SuppressWarnings("unused") @JavascriptInterface - public void postMessage(final String message) { + public void postMessage(@NonNull final String message) { final Runnable postMessageRunnable = - () -> { - flutterApi.postMessage(JavaScriptChannel.this, message, reply -> {}); - }; + () -> flutterApi.postMessage(JavaScriptChannel.this, message, reply -> {}); if (platformThreadHandler.getLooper() == Looper.myLooper()) { postMessageRunnable.run(); diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/JavaScriptChannelFlutterApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/JavaScriptChannelFlutterApiImpl.java index ca089269963..cd78f19a934 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/JavaScriptChannelFlutterApiImpl.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/JavaScriptChannelFlutterApiImpl.java @@ -4,6 +4,7 @@ package io.flutter.plugins.webviewflutter; +import androidx.annotation.NonNull; import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugins.webviewflutter.GeneratedAndroidWebView.JavaScriptChannelFlutterApi; @@ -22,14 +23,16 @@ public class JavaScriptChannelFlutterApiImpl extends JavaScriptChannelFlutterApi * @param instanceManager Maintains instances stored to communicate with Dart objects. */ public JavaScriptChannelFlutterApiImpl( - BinaryMessenger binaryMessenger, InstanceManager instanceManager) { + @NonNull BinaryMessenger binaryMessenger, @NonNull InstanceManager instanceManager) { super(binaryMessenger); this.instanceManager = instanceManager; } /** Passes arguments from {@link JavaScriptChannel#postMessage} to Dart. */ public void postMessage( - JavaScriptChannel javaScriptChannel, String messageArg, Reply callback) { + @NonNull JavaScriptChannel javaScriptChannel, + @NonNull String messageArg, + @NonNull Reply callback) { super.postMessage(getIdentifierForJavaScriptChannel(javaScriptChannel), messageArg, callback); } diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/JavaScriptChannelHostApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/JavaScriptChannelHostApiImpl.java index 44e3b8aa5a2..d4509338c78 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/JavaScriptChannelHostApiImpl.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/JavaScriptChannelHostApiImpl.java @@ -5,6 +5,7 @@ package io.flutter.plugins.webviewflutter; import android.os.Handler; +import androidx.annotation.NonNull; import io.flutter.plugins.webviewflutter.GeneratedAndroidWebView.JavaScriptChannelHostApi; /** @@ -29,10 +30,11 @@ public static class JavaScriptChannelCreator { * @param platformThreadHandler handles making callbacks on the desired thread * @return the created {@link JavaScriptChannel} */ + @NonNull public JavaScriptChannel createJavaScriptChannel( - JavaScriptChannelFlutterApiImpl flutterApi, - String channelName, - Handler platformThreadHandler) { + @NonNull JavaScriptChannelFlutterApiImpl flutterApi, + @NonNull String channelName, + @NonNull Handler platformThreadHandler) { return new JavaScriptChannel(flutterApi, channelName, platformThreadHandler); } } @@ -46,10 +48,10 @@ public JavaScriptChannel createJavaScriptChannel( * @param platformThreadHandler handles making callbacks on the desired thread */ public JavaScriptChannelHostApiImpl( - InstanceManager instanceManager, - JavaScriptChannelCreator javaScriptChannelCreator, - JavaScriptChannelFlutterApiImpl flutterApi, - Handler platformThreadHandler) { + @NonNull InstanceManager instanceManager, + @NonNull JavaScriptChannelCreator javaScriptChannelCreator, + @NonNull JavaScriptChannelFlutterApiImpl flutterApi, + @NonNull Handler platformThreadHandler) { this.instanceManager = instanceManager; this.javaScriptChannelCreator = javaScriptChannelCreator; this.flutterApi = flutterApi; @@ -61,12 +63,12 @@ public JavaScriptChannelHostApiImpl( * * @param platformThreadHandler the new thread handler */ - public void setPlatformThreadHandler(Handler platformThreadHandler) { + public void setPlatformThreadHandler(@NonNull Handler platformThreadHandler) { this.platformThreadHandler = platformThreadHandler; } @Override - public void create(Long instanceId, String channelName) { + public void create(@NonNull Long instanceId, @NonNull String channelName) { final JavaScriptChannel javaScriptChannel = javaScriptChannelCreator.createJavaScriptChannel( flutterApi, channelName, platformThreadHandler); diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebChromeClientFlutterApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebChromeClientFlutterApiImpl.java index ece8e62e8b9..c13e4ae6a46 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebChromeClientFlutterApiImpl.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebChromeClientFlutterApiImpl.java @@ -7,6 +7,7 @@ import android.os.Build; import android.webkit.WebChromeClient; import android.webkit.WebView; +import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugins.webviewflutter.GeneratedAndroidWebView.WebChromeClientFlutterApi; @@ -30,7 +31,7 @@ public class WebChromeClientFlutterApiImpl extends WebChromeClientFlutterApi { * @param instanceManager maintains instances stored to communicate with Dart objects */ public WebChromeClientFlutterApiImpl( - BinaryMessenger binaryMessenger, InstanceManager instanceManager) { + @NonNull BinaryMessenger binaryMessenger, @NonNull InstanceManager instanceManager) { super(binaryMessenger); this.binaryMessenger = binaryMessenger; this.instanceManager = instanceManager; @@ -39,7 +40,10 @@ public WebChromeClientFlutterApiImpl( /** Passes arguments from {@link WebChromeClient#onProgressChanged} to Dart. */ public void onProgressChanged( - WebChromeClient webChromeClient, WebView webView, Long progress, Reply callback) { + @NonNull WebChromeClient webChromeClient, + @NonNull WebView webView, + @NonNull Long progress, + @NonNull Reply callback) { webViewFlutterApi.create(webView, reply -> {}); final Long webViewIdentifier = @@ -51,10 +55,10 @@ public void onProgressChanged( /** Passes arguments from {@link WebChromeClient#onShowFileChooser} to Dart. */ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public void onShowFileChooser( - WebChromeClient webChromeClient, - WebView webView, - WebChromeClient.FileChooserParams fileChooserParams, - Reply> callback) { + @NonNull WebChromeClient webChromeClient, + @NonNull WebView webView, + @NonNull WebChromeClient.FileChooserParams fileChooserParams, + @NonNull Reply> callback) { webViewFlutterApi.create(webView, reply -> {}); new FileChooserParamsFlutterApiImpl(binaryMessenger, instanceManager) diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebChromeClientHostApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebChromeClientHostApiImpl.java index 5bc40e63729..8c35581ddc9 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebChromeClientHostApiImpl.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebChromeClientHostApiImpl.java @@ -46,16 +46,17 @@ public WebChromeClientImpl(@NonNull WebChromeClientFlutterApiImpl flutterApi) { } @Override - public void onProgressChanged(WebView view, int progress) { + public void onProgressChanged(@NonNull WebView view, int progress) { flutterApi.onProgressChanged(this, view, (long) progress, reply -> {}); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + @SuppressWarnings("LambdaLast") @Override public boolean onShowFileChooser( - WebView webView, - ValueCallback filePathCallback, - FileChooserParams fileChooserParams) { + @NonNull WebView webView, + @NonNull ValueCallback filePathCallback, + @NonNull FileChooserParams fileChooserParams) { final boolean currentReturnValueForOnShowFileChooser = returnValueForOnShowFileChooser; flutterApi.onShowFileChooser( this, @@ -86,11 +87,14 @@ public void setReturnValueForOnShowFileChooser(boolean value) { * window. */ public static class SecureWebChromeClient extends WebChromeClient { - @Nullable private WebViewClient webViewClient; + @Nullable WebViewClient webViewClient; @Override public boolean onCreateWindow( - final WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) { + @NonNull final WebView view, + boolean isDialog, + boolean isUserGesture, + @NonNull Message resultMsg) { return onCreateWindow(view, resultMsg, new WebView(view.getContext())); } @@ -109,7 +113,9 @@ public boolean onCreateWindow( */ @VisibleForTesting boolean onCreateWindow( - final WebView view, Message resultMsg, @Nullable WebView onCreateWindowWebView) { + @NonNull final WebView view, + @NonNull Message resultMsg, + @Nullable WebView onCreateWindowWebView) { // WebChromeClient requires a WebViewClient because of a bug fix that makes // calls to WebViewClient.requestLoading/WebViewClient.urlLoading when a new // window is opened. This is to make sure a url opened by `Window.open` has @@ -130,9 +136,8 @@ public boolean shouldOverrideUrlLoading( return true; } - // Legacy codepath for < N. - @SuppressWarnings("deprecation") @Override + @SuppressWarnings({"deprecation", "RedundantSuppression"}) public boolean shouldOverrideUrlLoading(WebView windowWebView, String url) { if (!webViewClient.shouldOverrideUrlLoading(view, url)) { view.loadUrl(url); @@ -167,12 +172,14 @@ public void setWebViewClient(@NonNull WebViewClient webViewClient) { /** Handles creating {@link WebChromeClient}s for a {@link WebChromeClientHostApiImpl}. */ public static class WebChromeClientCreator { /** - * Creates a {@link DownloadListenerHostApiImpl.DownloadListenerImpl}. + * Creates a {@link WebChromeClientHostApiImpl.WebChromeClientImpl}. * * @param flutterApi handles sending messages to Dart * @return the created {@link WebChromeClientHostApiImpl.WebChromeClientImpl} */ - public WebChromeClientImpl createWebChromeClient(WebChromeClientFlutterApiImpl flutterApi) { + @NonNull + public WebChromeClientImpl createWebChromeClient( + @NonNull WebChromeClientFlutterApiImpl flutterApi) { return new WebChromeClientImpl(flutterApi); } } @@ -185,16 +192,16 @@ public WebChromeClientImpl createWebChromeClient(WebChromeClientFlutterApiImpl f * @param flutterApi handles sending messages to Dart */ public WebChromeClientHostApiImpl( - InstanceManager instanceManager, - WebChromeClientCreator webChromeClientCreator, - WebChromeClientFlutterApiImpl flutterApi) { + @NonNull InstanceManager instanceManager, + @NonNull WebChromeClientCreator webChromeClientCreator, + @NonNull WebChromeClientFlutterApiImpl flutterApi) { this.instanceManager = instanceManager; this.webChromeClientCreator = webChromeClientCreator; this.flutterApi = flutterApi; } @Override - public void create(Long instanceId) { + public void create(@NonNull Long instanceId) { final WebChromeClient webChromeClient = webChromeClientCreator.createWebChromeClient(flutterApi); instanceManager.addDartCreatedInstance(webChromeClient, instanceId); diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebSettingsHostApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebSettingsHostApiImpl.java index 2215320e6af..3a6b151fa71 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebSettingsHostApiImpl.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebSettingsHostApiImpl.java @@ -6,7 +6,10 @@ import android.webkit.WebSettings; import android.webkit.WebView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import io.flutter.plugins.webviewflutter.GeneratedAndroidWebView.WebSettingsHostApi; +import java.util.Objects; /** * Host api implementation for {@link WebSettings}. @@ -25,7 +28,8 @@ public static class WebSettingsCreator { * @param webView the {@link WebView} which the settings affect * @return the created {@link WebSettings} */ - public WebSettings createWebSettings(WebView webView) { + @NonNull + public WebSettings createWebSettings(@NonNull WebView webView) { return webView.getSettings(); } } @@ -37,93 +41,95 @@ public WebSettings createWebSettings(WebView webView) { * @param webSettingsCreator handles creating {@link WebSettings}s */ public WebSettingsHostApiImpl( - InstanceManager instanceManager, WebSettingsCreator webSettingsCreator) { + @NonNull InstanceManager instanceManager, @NonNull WebSettingsCreator webSettingsCreator) { this.instanceManager = instanceManager; this.webSettingsCreator = webSettingsCreator; } @Override - public void create(Long instanceId, Long webViewInstanceId) { - final WebView webView = (WebView) instanceManager.getInstance(webViewInstanceId); + public void create(@NonNull Long instanceId, @NonNull Long webViewInstanceId) { + final WebView webView = Objects.requireNonNull(instanceManager.getInstance(webViewInstanceId)); instanceManager.addDartCreatedInstance( webSettingsCreator.createWebSettings(webView), instanceId); } @Override - public void setDomStorageEnabled(Long instanceId, Boolean flag) { - final WebSettings webSettings = (WebSettings) instanceManager.getInstance(instanceId); + public void setDomStorageEnabled(@NonNull Long instanceId, @NonNull Boolean flag) { + final WebSettings webSettings = Objects.requireNonNull(instanceManager.getInstance(instanceId)); webSettings.setDomStorageEnabled(flag); } @Override - public void setJavaScriptCanOpenWindowsAutomatically(Long instanceId, Boolean flag) { - final WebSettings webSettings = (WebSettings) instanceManager.getInstance(instanceId); + public void setJavaScriptCanOpenWindowsAutomatically( + @NonNull Long instanceId, @NonNull Boolean flag) { + final WebSettings webSettings = Objects.requireNonNull(instanceManager.getInstance(instanceId)); webSettings.setJavaScriptCanOpenWindowsAutomatically(flag); } @Override - public void setSupportMultipleWindows(Long instanceId, Boolean support) { - final WebSettings webSettings = (WebSettings) instanceManager.getInstance(instanceId); + public void setSupportMultipleWindows(@NonNull Long instanceId, @NonNull Boolean support) { + final WebSettings webSettings = Objects.requireNonNull(instanceManager.getInstance(instanceId)); webSettings.setSupportMultipleWindows(support); } @Override - public void setJavaScriptEnabled(Long instanceId, Boolean flag) { - final WebSettings webSettings = (WebSettings) instanceManager.getInstance(instanceId); + public void setJavaScriptEnabled(@NonNull Long instanceId, @NonNull Boolean flag) { + final WebSettings webSettings = Objects.requireNonNull(instanceManager.getInstance(instanceId)); webSettings.setJavaScriptEnabled(flag); } @Override - public void setUserAgentString(Long instanceId, String userAgentString) { - final WebSettings webSettings = (WebSettings) instanceManager.getInstance(instanceId); + public void setUserAgentString(@NonNull Long instanceId, @Nullable String userAgentString) { + final WebSettings webSettings = Objects.requireNonNull(instanceManager.getInstance(instanceId)); webSettings.setUserAgentString(userAgentString); } @Override - public void setMediaPlaybackRequiresUserGesture(Long instanceId, Boolean require) { - final WebSettings webSettings = (WebSettings) instanceManager.getInstance(instanceId); + public void setMediaPlaybackRequiresUserGesture( + @NonNull Long instanceId, @NonNull Boolean require) { + final WebSettings webSettings = Objects.requireNonNull(instanceManager.getInstance(instanceId)); webSettings.setMediaPlaybackRequiresUserGesture(require); } @Override - public void setSupportZoom(Long instanceId, Boolean support) { - final WebSettings webSettings = (WebSettings) instanceManager.getInstance(instanceId); + public void setSupportZoom(@NonNull Long instanceId, @NonNull Boolean support) { + final WebSettings webSettings = Objects.requireNonNull(instanceManager.getInstance(instanceId)); webSettings.setSupportZoom(support); } @Override - public void setLoadWithOverviewMode(Long instanceId, Boolean overview) { - final WebSettings webSettings = (WebSettings) instanceManager.getInstance(instanceId); + public void setLoadWithOverviewMode(@NonNull Long instanceId, @NonNull Boolean overview) { + final WebSettings webSettings = Objects.requireNonNull(instanceManager.getInstance(instanceId)); webSettings.setLoadWithOverviewMode(overview); } @Override - public void setUseWideViewPort(Long instanceId, Boolean use) { - final WebSettings webSettings = (WebSettings) instanceManager.getInstance(instanceId); + public void setUseWideViewPort(@NonNull Long instanceId, @NonNull Boolean use) { + final WebSettings webSettings = Objects.requireNonNull(instanceManager.getInstance(instanceId)); webSettings.setUseWideViewPort(use); } @Override - public void setDisplayZoomControls(Long instanceId, Boolean enabled) { - final WebSettings webSettings = (WebSettings) instanceManager.getInstance(instanceId); + public void setDisplayZoomControls(@NonNull Long instanceId, @NonNull Boolean enabled) { + final WebSettings webSettings = Objects.requireNonNull(instanceManager.getInstance(instanceId)); webSettings.setDisplayZoomControls(enabled); } @Override - public void setBuiltInZoomControls(Long instanceId, Boolean enabled) { - final WebSettings webSettings = (WebSettings) instanceManager.getInstance(instanceId); + public void setBuiltInZoomControls(@NonNull Long instanceId, @NonNull Boolean enabled) { + final WebSettings webSettings = Objects.requireNonNull(instanceManager.getInstance(instanceId)); webSettings.setBuiltInZoomControls(enabled); } @Override - public void setAllowFileAccess(Long instanceId, Boolean enabled) { - final WebSettings webSettings = (WebSettings) instanceManager.getInstance(instanceId); + public void setAllowFileAccess(@NonNull Long instanceId, @NonNull Boolean enabled) { + final WebSettings webSettings = Objects.requireNonNull(instanceManager.getInstance(instanceId)); webSettings.setAllowFileAccess(enabled); } @Override - public void setTextZoom(Long instanceId, Long textZoom) { - final WebSettings webSettings = (WebSettings) instanceManager.getInstance(instanceId); + public void setTextZoom(@NonNull Long instanceId, @NonNull Long textZoom) { + final WebSettings webSettings = Objects.requireNonNull(instanceManager.getInstance(instanceId)); webSettings.setTextZoom(textZoom.intValue()); } } diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebStorageHostApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebStorageHostApiImpl.java index c06f2bc5796..036a395eaa5 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebStorageHostApiImpl.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebStorageHostApiImpl.java @@ -5,7 +5,9 @@ package io.flutter.plugins.webviewflutter; import android.webkit.WebStorage; +import androidx.annotation.NonNull; import io.flutter.plugins.webviewflutter.GeneratedAndroidWebView.WebStorageHostApi; +import java.util.Objects; /** * Host api implementation for {@link WebStorage}. @@ -23,6 +25,7 @@ public static class WebStorageCreator { * * @return the created {@link WebStorage}. Defaults to {@link WebStorage#getInstance} */ + @NonNull public WebStorage createWebStorage() { return WebStorage.getInstance(); } @@ -35,19 +38,19 @@ public WebStorage createWebStorage() { * @param webStorageCreator handles creating {@link WebStorage}s */ public WebStorageHostApiImpl( - InstanceManager instanceManager, WebStorageCreator webStorageCreator) { + @NonNull InstanceManager instanceManager, @NonNull WebStorageCreator webStorageCreator) { this.instanceManager = instanceManager; this.webStorageCreator = webStorageCreator; } @Override - public void create(Long instanceId) { + public void create(@NonNull Long instanceId) { instanceManager.addDartCreatedInstance(webStorageCreator.createWebStorage(), instanceId); } @Override - public void deleteAllData(Long instanceId) { - final WebStorage webStorage = (WebStorage) instanceManager.getInstance(instanceId); + public void deleteAllData(@NonNull Long instanceId) { + final WebStorage webStorage = Objects.requireNonNull(instanceManager.getInstance(instanceId)); webStorage.deleteAllData(); } } diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientFlutterApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientFlutterApiImpl.java index 6893af953df..4dee9c0ad3f 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientFlutterApiImpl.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientFlutterApiImpl.java @@ -24,7 +24,10 @@ *

Passes arguments of callbacks methods from a {@link WebViewClient} to Dart. */ public class WebViewClientFlutterApiImpl extends WebViewClientFlutterApi { + // To ease adding additional methods, this value is added prematurely. + @SuppressWarnings({"unused", "FieldCanBeLocal"}) private final BinaryMessenger binaryMessenger; + private final InstanceManager instanceManager; private final WebViewFlutterApiImpl webViewFlutterApi; @@ -73,7 +76,7 @@ static GeneratedAndroidWebView.WebResourceRequestData createWebResourceRequestDa * @param instanceManager maintains instances stored to communicate with Dart objects */ public WebViewClientFlutterApiImpl( - BinaryMessenger binaryMessenger, InstanceManager instanceManager) { + @NonNull BinaryMessenger binaryMessenger, @NonNull InstanceManager instanceManager) { super(binaryMessenger); this.binaryMessenger = binaryMessenger; this.instanceManager = instanceManager; @@ -82,7 +85,10 @@ public WebViewClientFlutterApiImpl( /** Passes arguments from {@link WebViewClient#onPageStarted} to Dart. */ public void onPageStarted( - WebViewClient webViewClient, WebView webView, String urlArg, Reply callback) { + @NonNull WebViewClient webViewClient, + @NonNull WebView webView, + @NonNull String urlArg, + @NonNull Reply callback) { webViewFlutterApi.create(webView, reply -> {}); final Long webViewIdentifier = @@ -92,7 +98,10 @@ public void onPageStarted( /** Passes arguments from {@link WebViewClient#onPageFinished} to Dart. */ public void onPageFinished( - WebViewClient webViewClient, WebView webView, String urlArg, Reply callback) { + @NonNull WebViewClient webViewClient, + @NonNull WebView webView, + @NonNull String urlArg, + @NonNull Reply callback) { webViewFlutterApi.create(webView, reply -> {}); final Long webViewIdentifier = @@ -106,11 +115,11 @@ public void onPageFinished( */ @RequiresApi(api = Build.VERSION_CODES.M) public void onReceivedRequestError( - WebViewClient webViewClient, - WebView webView, - WebResourceRequest request, - WebResourceError error, - Reply callback) { + @NonNull WebViewClient webViewClient, + @NonNull WebView webView, + @NonNull WebResourceRequest request, + @NonNull WebResourceError error, + @NonNull Reply callback) { webViewFlutterApi.create(webView, reply -> {}); final Long webViewIdentifier = @@ -129,11 +138,11 @@ public void onReceivedRequestError( */ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public void onReceivedRequestError( - WebViewClient webViewClient, - WebView webView, - WebResourceRequest request, - WebResourceErrorCompat error, - Reply callback) { + @NonNull WebViewClient webViewClient, + @NonNull WebView webView, + @NonNull WebResourceRequest request, + @NonNull WebResourceErrorCompat error, + @NonNull Reply callback) { webViewFlutterApi.create(webView, reply -> {}); final Long webViewIdentifier = @@ -151,12 +160,12 @@ public void onReceivedRequestError( * Dart. */ public void onReceivedError( - WebViewClient webViewClient, - WebView webView, - Long errorCodeArg, - String descriptionArg, - String failingUrlArg, - Reply callback) { + @NonNull WebViewClient webViewClient, + @NonNull WebView webView, + @NonNull Long errorCodeArg, + @NonNull String descriptionArg, + @NonNull String failingUrlArg, + @NonNull Reply callback) { webViewFlutterApi.create(webView, reply -> {}); final Long webViewIdentifier = @@ -176,10 +185,10 @@ public void onReceivedError( */ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public void requestLoading( - WebViewClient webViewClient, - WebView webView, - WebResourceRequest request, - Reply callback) { + @NonNull WebViewClient webViewClient, + @NonNull WebView webView, + @NonNull WebResourceRequest request, + @NonNull Reply callback) { webViewFlutterApi.create(webView, reply -> {}); final Long webViewIdentifier = @@ -195,7 +204,10 @@ public void requestLoading( * Passes arguments from {@link WebViewClient#shouldOverrideUrlLoading(WebView, String)} to Dart. */ public void urlLoading( - WebViewClient webViewClient, WebView webView, String urlArg, Reply callback) { + @NonNull WebViewClient webViewClient, + @NonNull WebView webView, + @NonNull String urlArg, + @NonNull Reply callback) { webViewFlutterApi.create(webView, reply -> {}); final Long webViewIdentifier = diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientHostApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientHostApiImpl.java index b5764f4ac8f..35ae02a7625 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientHostApiImpl.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientHostApiImpl.java @@ -45,17 +45,20 @@ public WebViewClientImpl(@NonNull WebViewClientFlutterApiImpl flutterApi) { } @Override - public void onPageStarted(WebView view, String url, Bitmap favicon) { + public void onPageStarted(@NonNull WebView view, @NonNull String url, @NonNull Bitmap favicon) { flutterApi.onPageStarted(this, view, url, reply -> {}); } @Override - public void onPageFinished(WebView view, String url) { + public void onPageFinished(@NonNull WebView view, @NonNull String url) { flutterApi.onPageFinished(this, view, url, reply -> {}); } @Override - public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { + public void onReceivedError( + @NonNull WebView view, + @NonNull WebResourceRequest request, + @NonNull WebResourceError error) { flutterApi.onReceivedRequestError(this, view, request, error, reply -> {}); } @@ -63,13 +66,17 @@ public void onReceivedError(WebView view, WebResourceRequest request, WebResourc @SuppressWarnings("deprecation") @Override public void onReceivedError( - WebView view, int errorCode, String description, String failingUrl) { + @NonNull WebView view, + int errorCode, + @NonNull String description, + @NonNull String failingUrl) { flutterApi.onReceivedError( this, view, (long) errorCode, description, failingUrl, reply -> {}); } @Override - public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { + public boolean shouldOverrideUrlLoading( + @NonNull WebView view, @NonNull WebResourceRequest request) { flutterApi.requestLoading(this, view, request, reply -> {}); return returnValueForShouldOverrideUrlLoading; } @@ -77,18 +84,19 @@ public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request // Legacy codepath for < 24; newer versions use the variant above. @SuppressWarnings("deprecation") @Override - public boolean shouldOverrideUrlLoading(WebView view, String url) { + public boolean shouldOverrideUrlLoading(@NonNull WebView view, @NonNull String url) { flutterApi.urlLoading(this, view, url, reply -> {}); return returnValueForShouldOverrideUrlLoading; } @Override - public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) { + public void doUpdateVisitedHistory( + @NonNull WebView view, @NonNull String url, boolean isReload) { flutterApi.doUpdateVisitedHistory(this, view, url, isReload, reply -> {}); } @Override - public void onUnhandledKeyEvent(WebView view, KeyEvent event) { + public void onUnhandledKeyEvent(@NonNull WebView view, @NonNull KeyEvent event) { // Deliberately empty. Occasionally the webview will mark events as having failed to be // handled even though they were handled. We don't want to propagate those as they're not // truly lost. @@ -113,12 +121,12 @@ public WebViewClientCompatImpl(@NonNull WebViewClientFlutterApiImpl flutterApi) } @Override - public void onPageStarted(WebView view, String url, Bitmap favicon) { + public void onPageStarted(@NonNull WebView view, @NonNull String url, @NonNull Bitmap favicon) { flutterApi.onPageStarted(this, view, url, reply -> {}); } @Override - public void onPageFinished(WebView view, String url) { + public void onPageFinished(@NonNull WebView view, @NonNull String url) { flutterApi.onPageFinished(this, view, url, reply -> {}); } @@ -138,7 +146,10 @@ public void onReceivedError( @SuppressWarnings("deprecation") @Override public void onReceivedError( - WebView view, int errorCode, String description, String failingUrl) { + @NonNull WebView view, + int errorCode, + @NonNull String description, + @NonNull String failingUrl) { flutterApi.onReceivedError( this, view, (long) errorCode, description, failingUrl, reply -> {}); } @@ -154,13 +165,14 @@ public boolean shouldOverrideUrlLoading( // Legacy codepath for < Lollipop; newer versions use the variant above. @SuppressWarnings("deprecation") @Override - public boolean shouldOverrideUrlLoading(WebView view, String url) { + public boolean shouldOverrideUrlLoading(@NonNull WebView view, @NonNull String url) { flutterApi.urlLoading(this, view, url, reply -> {}); return returnValueForShouldOverrideUrlLoading; } @Override - public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) { + public void doUpdateVisitedHistory( + @NonNull WebView view, @NonNull String url, boolean isReload) { flutterApi.doUpdateVisitedHistory(this, view, url, isReload, reply -> {}); } @@ -211,9 +223,9 @@ public WebViewClient createWebViewClient(@NonNull WebViewClientFlutterApiImpl fl * @param flutterApi handles sending messages to Dart */ public WebViewClientHostApiImpl( - InstanceManager instanceManager, - WebViewClientCreator webViewClientCreator, - WebViewClientFlutterApiImpl flutterApi) { + @NonNull InstanceManager instanceManager, + @NonNull WebViewClientCreator webViewClientCreator, + @NonNull WebViewClientFlutterApiImpl flutterApi) { this.instanceManager = instanceManager; this.webViewClientCreator = webViewClientCreator; this.flutterApi = flutterApi; diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewFlutterAndroidExternalApi.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewFlutterAndroidExternalApi.java index 3819d7b26f6..9542e3d3dca 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewFlutterAndroidExternalApi.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewFlutterAndroidExternalApi.java @@ -5,6 +5,7 @@ package io.flutter.plugins.webviewflutter; import android.webkit.WebView; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import io.flutter.embedding.engine.FlutterEngine; @@ -34,7 +35,7 @@ public interface WebViewFlutterAndroidExternalApi { * with `identifier` could not be found. */ @Nullable - static WebView getWebView(FlutterEngine engine, long identifier) { + static WebView getWebView(@NonNull FlutterEngine engine, long identifier) { final WebViewFlutterPlugin webViewPlugin = (WebViewFlutterPlugin) engine.getPlugins().get(WebViewFlutterPlugin.class); diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewFlutterPlugin.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewFlutterPlugin.java index 8067f895bca..d1c239c3636 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewFlutterPlugin.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewFlutterPlugin.java @@ -61,7 +61,8 @@ public WebViewFlutterPlugin() {} * won't react to changes in activity or context, unlike {@link WebViewFlutterPlugin}. */ @SuppressWarnings({"unused", "deprecation"}) - public static void registerWith(io.flutter.plugin.common.PluginRegistry.Registrar registrar) { + public static void registerWith( + @NonNull io.flutter.plugin.common.PluginRegistry.Registrar registrar) { new WebViewFlutterPlugin() .setUp( registrar.messenger(), diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewHostApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewHostApiImpl.java index 9f41a4dcb73..14c2b3db5d6 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewHostApiImpl.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewHostApiImpl.java @@ -10,7 +10,6 @@ import android.os.Build; import android.view.View; import android.view.ViewParent; -import android.webkit.DownloadListener; import android.webkit.WebChromeClient; import android.webkit.WebView; import android.webkit.WebViewClient; @@ -47,8 +46,11 @@ public static class WebViewProxy { * in Dart * @return the created {@link WebViewPlatformView} */ + @NonNull public WebViewPlatformView createWebView( - Context context, BinaryMessenger binaryMessenger, InstanceManager instanceManager) { + @NonNull Context context, + @NonNull BinaryMessenger binaryMessenger, + @NonNull InstanceManager instanceManager) { return new WebViewPlatformView(context, binaryMessenger, instanceManager); } @@ -78,7 +80,9 @@ public static class WebViewPlatformView extends WebView implements PlatformView * @param context an Activity Context to access application assets. This value cannot be null. */ public WebViewPlatformView( - Context context, BinaryMessenger binaryMessenger, InstanceManager instanceManager) { + @NonNull Context context, + @NonNull BinaryMessenger binaryMessenger, + @NonNull InstanceManager instanceManager) { super(context); currentWebViewClient = new WebViewClient(); currentWebChromeClient = new WebChromeClientHostApiImpl.SecureWebChromeClient(); @@ -88,6 +92,7 @@ public WebViewPlatformView( setWebChromeClient(currentWebChromeClient); } + @Nullable @Override public View getView() { return this; @@ -126,14 +131,14 @@ private FlutterView tryFindFlutterView() { } @Override - public void setWebViewClient(WebViewClient webViewClient) { + public void setWebViewClient(@NonNull WebViewClient webViewClient) { super.setWebViewClient(webViewClient); currentWebViewClient = webViewClient; currentWebChromeClient.setWebViewClient(webViewClient); } @Override - public void setWebChromeClient(WebChromeClient client) { + public void setWebChromeClient(@Nullable WebChromeClient client) { super.setWebChromeClient(client); if (!(client instanceof WebChromeClientHostApiImpl.SecureWebChromeClient)) { throw new AssertionError("Client must be a SecureWebChromeClient."); @@ -172,10 +177,10 @@ void setApi(WebViewFlutterApiImpl api) { * @param context an Activity Context to access application assets. This value cannot be null. */ public WebViewHostApiImpl( - InstanceManager instanceManager, - BinaryMessenger binaryMessenger, - WebViewProxy webViewProxy, - Context context) { + @NonNull InstanceManager instanceManager, + @NonNull BinaryMessenger binaryMessenger, + @NonNull WebViewProxy webViewProxy, + @Nullable Context context) { this.instanceManager = instanceManager; this.binaryMessenger = binaryMessenger; this.webViewProxy = webViewProxy; @@ -187,7 +192,7 @@ public WebViewHostApiImpl( * * @param context the new context. */ - public void setContext(Context context) { + public void setContext(@Nullable Context context) { this.context = context; } @@ -205,111 +210,124 @@ public void create(@NonNull Long instanceId) { } @Override - public void loadData(Long instanceId, String data, String mimeType, String encoding) { - final WebView webView = (WebView) instanceManager.getInstance(instanceId); + public void loadData( + @NonNull Long instanceId, + @NonNull String data, + @Nullable String mimeType, + @Nullable String encoding) { + final WebView webView = Objects.requireNonNull(instanceManager.getInstance(instanceId)); webView.loadData(data, mimeType, encoding); } @Override public void loadDataWithBaseUrl( - Long instanceId, - String baseUrl, - String data, - String mimeType, - String encoding, - String historyUrl) { - final WebView webView = (WebView) instanceManager.getInstance(instanceId); + @NonNull Long instanceId, + @Nullable String baseUrl, + @NonNull String data, + @Nullable String mimeType, + @Nullable String encoding, + @Nullable String historyUrl) { + final WebView webView = Objects.requireNonNull(instanceManager.getInstance(instanceId)); webView.loadDataWithBaseURL(baseUrl, data, mimeType, encoding, historyUrl); } @Override - public void loadUrl(Long instanceId, String url, Map headers) { - final WebView webView = (WebView) instanceManager.getInstance(instanceId); + public void loadUrl( + @NonNull Long instanceId, @NonNull String url, @NonNull Map headers) { + final WebView webView = Objects.requireNonNull(instanceManager.getInstance(instanceId)); webView.loadUrl(url, headers); } @Override - public void postUrl(Long instanceId, String url, byte[] data) { - final WebView webView = (WebView) instanceManager.getInstance(instanceId); + public void postUrl(@NonNull Long instanceId, @NonNull String url, @NonNull byte[] data) { + final WebView webView = Objects.requireNonNull(instanceManager.getInstance(instanceId)); webView.postUrl(url, data); } + @Nullable @Override - public String getUrl(Long instanceId) { - final WebView webView = (WebView) instanceManager.getInstance(instanceId); + public String getUrl(@NonNull Long instanceId) { + final WebView webView = Objects.requireNonNull(instanceManager.getInstance(instanceId)); return webView.getUrl(); } + @NonNull @Override - public Boolean canGoBack(Long instanceId) { - final WebView webView = (WebView) instanceManager.getInstance(instanceId); + public Boolean canGoBack(@NonNull Long instanceId) { + final WebView webView = Objects.requireNonNull(instanceManager.getInstance(instanceId)); return webView.canGoBack(); } + @NonNull @Override - public Boolean canGoForward(Long instanceId) { - final WebView webView = (WebView) instanceManager.getInstance(instanceId); + public Boolean canGoForward(@NonNull Long instanceId) { + final WebView webView = Objects.requireNonNull(instanceManager.getInstance(instanceId)); return webView.canGoForward(); } @Override - public void goBack(Long instanceId) { - final WebView webView = (WebView) instanceManager.getInstance(instanceId); + public void goBack(@NonNull Long instanceId) { + final WebView webView = Objects.requireNonNull(instanceManager.getInstance(instanceId)); webView.goBack(); } @Override - public void goForward(Long instanceId) { - final WebView webView = (WebView) instanceManager.getInstance(instanceId); + public void goForward(@NonNull Long instanceId) { + final WebView webView = Objects.requireNonNull(instanceManager.getInstance(instanceId)); webView.goForward(); } @Override - public void reload(Long instanceId) { - final WebView webView = (WebView) instanceManager.getInstance(instanceId); + public void reload(@NonNull Long instanceId) { + final WebView webView = Objects.requireNonNull(instanceManager.getInstance(instanceId)); webView.reload(); } @Override - public void clearCache(Long instanceId, Boolean includeDiskFiles) { - final WebView webView = (WebView) instanceManager.getInstance(instanceId); + public void clearCache(@NonNull Long instanceId, @NonNull Boolean includeDiskFiles) { + final WebView webView = Objects.requireNonNull(instanceManager.getInstance(instanceId)); webView.clearCache(includeDiskFiles); } @Override public void evaluateJavascript( - Long instanceId, String javascriptString, GeneratedAndroidWebView.Result result) { - final WebView webView = (WebView) instanceManager.getInstance(instanceId); + @NonNull Long instanceId, + @NonNull String javascriptString, + @NonNull GeneratedAndroidWebView.Result result) { + final WebView webView = Objects.requireNonNull(instanceManager.getInstance(instanceId)); webView.evaluateJavascript(javascriptString, result::success); } + @Nullable @Override - public String getTitle(Long instanceId) { - final WebView webView = (WebView) instanceManager.getInstance(instanceId); + public String getTitle(@NonNull Long instanceId) { + final WebView webView = Objects.requireNonNull(instanceManager.getInstance(instanceId)); return webView.getTitle(); } @Override - public void scrollTo(Long instanceId, Long x, Long y) { - final WebView webView = (WebView) instanceManager.getInstance(instanceId); + public void scrollTo(@NonNull Long instanceId, @NonNull Long x, @NonNull Long y) { + final WebView webView = Objects.requireNonNull(instanceManager.getInstance(instanceId)); webView.scrollTo(x.intValue(), y.intValue()); } @Override - public void scrollBy(Long instanceId, Long x, Long y) { - final WebView webView = (WebView) instanceManager.getInstance(instanceId); + public void scrollBy(@NonNull Long instanceId, @NonNull Long x, @NonNull Long y) { + final WebView webView = Objects.requireNonNull(instanceManager.getInstance(instanceId)); webView.scrollBy(x.intValue(), y.intValue()); } + @NonNull @Override - public Long getScrollX(Long instanceId) { - final WebView webView = (WebView) instanceManager.getInstance(instanceId); + public Long getScrollX(@NonNull Long instanceId) { + final WebView webView = Objects.requireNonNull(instanceManager.getInstance(instanceId)); return (long) webView.getScrollX(); } + @NonNull @Override - public Long getScrollY(Long instanceId) { - final WebView webView = (WebView) instanceManager.getInstance(instanceId); + public Long getScrollY(@NonNull Long instanceId) { + final WebView webView = Objects.requireNonNull(instanceManager.getInstance(instanceId)); return (long) webView.getScrollY(); } @@ -324,51 +342,57 @@ public GeneratedAndroidWebView.WebViewPoint getScrollPosition(@NonNull Long inst } @Override - public void setWebContentsDebuggingEnabled(Boolean enabled) { + public void setWebContentsDebuggingEnabled(@NonNull Boolean enabled) { webViewProxy.setWebContentsDebuggingEnabled(enabled); } @Override - public void setWebViewClient(Long instanceId, Long webViewClientInstanceId) { - final WebView webView = (WebView) instanceManager.getInstance(instanceId); - webView.setWebViewClient((WebViewClient) instanceManager.getInstance(webViewClientInstanceId)); + public void setWebViewClient(@NonNull Long instanceId, @NonNull Long webViewClientInstanceId) { + final WebView webView = Objects.requireNonNull(instanceManager.getInstance(instanceId)); + webView.setWebViewClient(instanceManager.getInstance(webViewClientInstanceId)); } + @SuppressLint("JavascriptInterface") @Override - public void addJavaScriptChannel(Long instanceId, Long javaScriptChannelInstanceId) { - final WebView webView = (WebView) instanceManager.getInstance(instanceId); + public void addJavaScriptChannel( + @NonNull Long instanceId, @NonNull Long javaScriptChannelInstanceId) { + final WebView webView = Objects.requireNonNull(instanceManager.getInstance(instanceId)); final JavaScriptChannel javaScriptChannel = - (JavaScriptChannel) instanceManager.getInstance(javaScriptChannelInstanceId); + Objects.requireNonNull(instanceManager.getInstance(javaScriptChannelInstanceId)); webView.addJavascriptInterface(javaScriptChannel, javaScriptChannel.javaScriptChannelName); } @Override - public void removeJavaScriptChannel(Long instanceId, Long javaScriptChannelInstanceId) { - final WebView webView = (WebView) instanceManager.getInstance(instanceId); + public void removeJavaScriptChannel( + @NonNull Long instanceId, @NonNull Long javaScriptChannelInstanceId) { + final WebView webView = Objects.requireNonNull(instanceManager.getInstance(instanceId)); final JavaScriptChannel javaScriptChannel = - (JavaScriptChannel) instanceManager.getInstance(javaScriptChannelInstanceId); + Objects.requireNonNull((instanceManager.getInstance(javaScriptChannelInstanceId))); webView.removeJavascriptInterface(javaScriptChannel.javaScriptChannelName); } @Override - public void setDownloadListener(Long instanceId, Long listenerInstanceId) { - final WebView webView = (WebView) instanceManager.getInstance(instanceId); - webView.setDownloadListener((DownloadListener) instanceManager.getInstance(listenerInstanceId)); + public void setDownloadListener(@NonNull Long instanceId, @Nullable Long listenerInstanceId) { + final WebView webView = Objects.requireNonNull(instanceManager.getInstance(instanceId)); + webView.setDownloadListener( + instanceManager.getInstance(Objects.requireNonNull(listenerInstanceId))); } @Override - public void setWebChromeClient(Long instanceId, Long clientInstanceId) { - final WebView webView = (WebView) instanceManager.getInstance(instanceId); - webView.setWebChromeClient((WebChromeClient) instanceManager.getInstance(clientInstanceId)); + public void setWebChromeClient(@NonNull Long instanceId, @Nullable Long clientInstanceId) { + final WebView webView = Objects.requireNonNull(instanceManager.getInstance(instanceId)); + webView.setWebChromeClient( + instanceManager.getInstance(Objects.requireNonNull(clientInstanceId))); } @Override - public void setBackgroundColor(Long instanceId, Long color) { - final WebView webView = (WebView) instanceManager.getInstance(instanceId); + public void setBackgroundColor(@NonNull Long instanceId, @NonNull Long color) { + final WebView webView = Objects.requireNonNull(instanceManager.getInstance(instanceId)); webView.setBackgroundColor(color.intValue()); } /** Maintains instances used to communicate with the corresponding WebView Dart object. */ + @NonNull public InstanceManager getInstanceManager() { return instanceManager; } diff --git a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/CookieManagerHostApiImplTest.java b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/CookieManagerHostApiImplTest.java index 79edf9c06f2..11cdddfd333 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/CookieManagerHostApiImplTest.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/CookieManagerHostApiImplTest.java @@ -33,8 +33,7 @@ public void setup() { when(cookieManager.hasCookies()).thenReturn(true); doAnswer( answer -> { - @SuppressWarnings("unchecked") - ValueCallback callback = (ValueCallback) answer.getArgument(0); + ValueCallback callback = answer.getArgument(0); (callback).onReceiveValue(true); return null; }) diff --git a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebChromeClientTest.java b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebChromeClientTest.java index be301fa49ea..f7a174091a9 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebChromeClientTest.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebChromeClientTest.java @@ -19,6 +19,7 @@ import android.webkit.WebView; import android.webkit.WebView.WebViewTransport; import android.webkit.WebViewClient; +import androidx.annotation.NonNull; import io.flutter.plugins.webviewflutter.WebChromeClientHostApiImpl.WebChromeClientCreator; import io.flutter.plugins.webviewflutter.WebChromeClientHostApiImpl.WebChromeClientImpl; import org.junit.After; @@ -50,8 +51,9 @@ public void setUp() { final WebChromeClientCreator webChromeClientCreator = new WebChromeClientCreator() { @Override + @NonNull public WebChromeClientImpl createWebChromeClient( - WebChromeClientFlutterApiImpl flutterApi) { + @NonNull WebChromeClientFlutterApiImpl flutterApi) { webChromeClient = super.createWebChromeClient(flutterApi); return webChromeClient; } diff --git a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebSettingsTest.java b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebSettingsTest.java index 3abb4247c18..5c7c7a6f470 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebSettingsTest.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebSettingsTest.java @@ -5,10 +5,12 @@ package io.flutter.plugins.webviewflutter; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.webkit.WebSettings; +import android.webkit.WebView; import io.flutter.plugins.webviewflutter.WebSettingsHostApiImpl.WebSettingsCreator; import org.junit.After; import org.junit.Before; @@ -34,7 +36,9 @@ public void setUp() { when(mockWebSettingsCreator.createWebSettings(any())).thenReturn(mockWebSettings); testHostApiImpl = new WebSettingsHostApiImpl(testInstanceManager, mockWebSettingsCreator); - testHostApiImpl.create(0L, 0L); + + testInstanceManager.addDartCreatedInstance(mock(WebView.class), 1); + testHostApiImpl.create(0L, 1L); } @After diff --git a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebViewClientTest.java b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebViewClientTest.java index 2462ef392eb..230e81441a3 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebViewClientTest.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebViewClientTest.java @@ -47,7 +47,9 @@ public void setUp() { final WebViewClientCreator webViewClientCreator = new WebViewClientCreator() { @Override - public WebViewClient createWebViewClient(WebViewClientFlutterApiImpl flutterApi) { + @NonNull + public WebViewClient createWebViewClient( + @NonNull WebViewClientFlutterApiImpl flutterApi) { webViewClient = (WebViewClientCompatImpl) super.createWebViewClient(flutterApi); return webViewClient; } diff --git a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebViewTest.java b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebViewTest.java index b57cd7867ef..e0e641ac35a 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebViewTest.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebViewTest.java @@ -21,6 +21,7 @@ import android.webkit.ValueCallback; import android.webkit.WebChromeClient; import android.webkit.WebViewClient; +import androidx.annotation.NonNull; import io.flutter.embedding.android.FlutterView; import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugins.webviewflutter.GeneratedAndroidWebView.WebViewFlutterApi; @@ -175,7 +176,7 @@ public void success(String result) { } @Override - public void error(Throwable error) {} + public void error(@NonNull Throwable error) {} }); @SuppressWarnings("unchecked") diff --git a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/utils/TestUtils.java b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/utils/TestUtils.java index 31e7d58ee13..deebc417564 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/utils/TestUtils.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/utils/TestUtils.java @@ -23,25 +23,4 @@ public static void setFinalStatic(Class classToModify, String fieldName, Assert.fail("Unable to mock static field: " + fieldName); } } - - public static void setPrivateField(T instance, String fieldName, Object newValue) { - try { - Field field = instance.getClass().getDeclaredField(fieldName); - field.setAccessible(true); - field.set(instance, newValue); - } catch (Exception e) { - Assert.fail("Unable to mock private field: " + fieldName); - } - } - - public static Object getPrivateField(T instance, String fieldName) { - try { - Field field = instance.getClass().getDeclaredField(fieldName); - field.setAccessible(true); - return field.get(instance); - } catch (Exception e) { - Assert.fail("Unable to mock private field: " + fieldName); - return null; - } - } } diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.g.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.g.dart index 652928489ec..f5a4564802a 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.g.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.g.dart @@ -1,7 +1,7 @@ // 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. -// Autogenerated from Pigeon (v9.2.3), do not edit directly. +// Autogenerated from Pigeon (v9.2.4), do not edit directly. // See also: https://pub.dev/packages/pigeon // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import diff --git a/packages/webview_flutter/webview_flutter_android/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/pubspec.yaml index 7eb5411640e..7fca5618dd2 100644 --- a/packages/webview_flutter/webview_flutter_android/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_android/pubspec.yaml @@ -2,7 +2,7 @@ name: webview_flutter_android description: A Flutter plugin that provides a WebView widget on Android. repository: https://github.com/flutter/packages/tree/main/packages/webview_flutter/webview_flutter_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22 -version: 3.5.0 +version: 3.5.1 environment: sdk: ">=2.18.0 <4.0.0" @@ -29,4 +29,4 @@ dev_dependencies: flutter_test: sdk: flutter mockito: 5.4.0 - pigeon: ^9.0.4 + pigeon: ^9.2.4 diff --git a/packages/webview_flutter/webview_flutter_android/test/test_android_webview.g.dart b/packages/webview_flutter/webview_flutter_android/test/test_android_webview.g.dart index 5857a09876c..6b0c31ab1c1 100644 --- a/packages/webview_flutter/webview_flutter_android/test/test_android_webview.g.dart +++ b/packages/webview_flutter/webview_flutter_android/test/test_android_webview.g.dart @@ -1,7 +1,7 @@ // 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. -// Autogenerated from Pigeon (v9.2.3), do not edit directly. +// Autogenerated from Pigeon (v9.2.4), do not edit directly. // See also: https://pub.dev/packages/pigeon // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, unnecessary_import // ignore_for_file: avoid_relative_lib_imports