diff --git a/CHANGELOG.md b/CHANGELOG.md index 448f76c6..e267b9c4 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 5.4.3+1 + +- Fixed "Latest version 5.4.3 crashes on Android" [#1159](https://github.com/pichillilorenzo/flutter_inappwebview/issues/1159) + ## 5.4.3 - Added Bitwise OR operator support for `AndroidActionModeMenuItem` class diff --git a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/chrome_custom_tabs/ChromeCustomTabsActivity.java b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/chrome_custom_tabs/ChromeCustomTabsActivity.java index ff0a38b0..5533ddc9 100755 --- a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/chrome_custom_tabs/ChromeCustomTabsActivity.java +++ b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/chrome_custom_tabs/ChromeCustomTabsActivity.java @@ -36,7 +36,8 @@ public class ChromeCustomTabsActivity extends Activity implements MethodChannel. public String id; public CustomTabsIntent.Builder builder; public ChromeCustomTabsOptions options; - public CustomTabActivityHelper customTabActivityHelper; + public CustomTabActivityHelper customTabActivityHelper = new CustomTabActivityHelper(); + @Nullable public CustomTabsSession customTabsSession; protected final int CHROME_CUSTOM_TAB_REQUEST_CODE = 100; protected boolean onChromeSafariBrowserOpened = false; @@ -60,7 +61,8 @@ public class ChromeCustomTabsActivity extends Activity implements MethodChannel. id = b.getString("id"); String managerId = b.getString("managerId"); - manager = (ChromeSafariBrowserManager) ChromeSafariBrowserManager.shared.get(managerId); + manager = ChromeSafariBrowserManager.shared.get(managerId); + if (manager == null || manager.plugin == null|| manager.plugin.messenger == null) return; channel = new MethodChannel(manager.plugin.messenger, "com.pichillilorenzo/flutter_chromesafaribrowser_" + id); channel.setMethodCallHandler(this); @@ -77,7 +79,6 @@ public class ChromeCustomTabsActivity extends Activity implements MethodChannel. final ChromeCustomTabsActivity chromeCustomTabsActivity = this; - customTabActivityHelper = new CustomTabActivityHelper(); customTabActivityHelper.setConnectionCallback(new CustomTabActivityHelper.ConnectionCallback() { @Override public void onCustomTabsConnected() { diff --git a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/credential_database/CredentialDatabaseHandler.java b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/credential_database/CredentialDatabaseHandler.java index 36a8b573..801a4568 100755 --- a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/credential_database/CredentialDatabaseHandler.java +++ b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/credential_database/CredentialDatabaseHandler.java @@ -112,7 +112,9 @@ public class CredentialDatabaseHandler implements MethodChannel.MethodCallHandle break; case "clearAllAuthCredentials": credentialDatabase.clearAllAuthCredentials(); - WebViewDatabase.getInstance(plugin.applicationContext).clearHttpAuthUsernamePassword(); + if (plugin != null && plugin.applicationContext != null) { + WebViewDatabase.getInstance(plugin.applicationContext).clearHttpAuthUsernamePassword(); + } result.success(true); break; default: diff --git a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/headless_in_app_webview/HeadlessInAppWebView.java b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/headless_in_app_webview/HeadlessInAppWebView.java index c53cec8a..315db61b 100644 --- a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/headless_in_app_webview/HeadlessInAppWebView.java +++ b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/headless_in_app_webview/HeadlessInAppWebView.java @@ -111,12 +111,16 @@ public class HeadlessInAppWebView implements MethodChannel.MethodCallHandler { public void dispose() { channel.setMethodCallHandler(null); - HeadlessInAppWebViewManager.webViews.remove(id); + if (HeadlessInAppWebViewManager.webViews.containsKey(id)) { + HeadlessInAppWebViewManager.webViews.put(id, null); + } if (plugin != null && plugin.activity != null) { ViewGroup contentView = (ViewGroup) plugin.activity.findViewById(android.R.id.content); - ViewGroup mainView = (ViewGroup) (contentView).getChildAt(0); - if (mainView != null && flutterWebView != null) { - mainView.removeView(flutterWebView.getView()); + if (contentView != null) { + ViewGroup mainView = (ViewGroup) (contentView).getChildAt(0); + if (mainView != null && flutterWebView != null) { + mainView.removeView(flutterWebView.getView()); + } } } if (flutterWebView != null) { diff --git a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/headless_in_app_webview/HeadlessInAppWebViewManager.java b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/headless_in_app_webview/HeadlessInAppWebViewManager.java index e15b0095..92916147 100755 --- a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/headless_in_app_webview/HeadlessInAppWebViewManager.java +++ b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/headless_in_app_webview/HeadlessInAppWebViewManager.java @@ -26,6 +26,8 @@ import androidx.annotation.Nullable; import com.pichillilorenzo.flutter_inappwebview.InAppWebViewFlutterPlugin; import com.pichillilorenzo.flutter_inappwebview.in_app_webview.FlutterWebView; +import org.jetbrains.annotations.NotNull; + import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -50,7 +52,7 @@ public class HeadlessInAppWebViewManager implements MethodChannel.MethodCallHand } @Override - public void onMethodCall(final MethodCall call, final Result result) { + public void onMethodCall(final MethodCall call, @NotNull final Result result) { final String id = (String) call.argument("id"); switch (call.method) { @@ -64,10 +66,11 @@ public class HeadlessInAppWebViewManager implements MethodChannel.MethodCallHand default: result.notImplemented(); } - } public void run(String id, HashMap params) { + if (plugin == null || plugin.activity == null) return; + FlutterWebView flutterWebView = new FlutterWebView(plugin, plugin.activity, id, params); HeadlessInAppWebView headlessInAppWebView = new HeadlessInAppWebView(plugin, id, flutterWebView); HeadlessInAppWebViewManager.webViews.put(id, headlessInAppWebView); diff --git a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_browser/InAppBrowserActivity.java b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_browser/InAppBrowserActivity.java index dd35fb3a..caf817a1 100755 --- a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_browser/InAppBrowserActivity.java +++ b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_browser/InAppBrowserActivity.java @@ -73,7 +73,8 @@ public class InAppBrowserActivity extends AppCompatActivity implements InAppBrow id = b.getString("id"); String managerId = b.getString("managerId"); - manager = (InAppBrowserManager) InAppBrowserManager.shared.get(managerId); + manager = InAppBrowserManager.shared.get(managerId); + if (manager == null || manager.plugin == null|| manager.plugin.messenger == null) return; windowId = b.getInt("windowId"); @@ -500,7 +501,7 @@ public class InAppBrowserActivity extends AppCompatActivity implements InAppBrow methodCallDelegate = null; } if (webView != null) { - if (manager.plugin.activityPluginBinding != null) { + if (manager != null && manager.plugin != null && manager.plugin.activityPluginBinding != null) { manager.plugin.activityPluginBinding.removeActivityResultListener(webView.inAppWebViewChromeClient); } ViewGroup vg = (ViewGroup) (webView.getParent()); diff --git a/example/ios/Flutter/Flutter.podspec b/example/ios/Flutter/Flutter.podspec new file mode 100644 index 00000000..663d5b29 --- /dev/null +++ b/example/ios/Flutter/Flutter.podspec @@ -0,0 +1,18 @@ +# +# NOTE: This podspec is NOT to be published. It is only used as a local source! +# This is a generated file; do not edit or check into version control. +# + +Pod::Spec.new do |s| + s.name = 'Flutter' + s.version = '1.0.0' + s.summary = 'High-performance, high-fidelity mobile apps.' + s.homepage = 'https://flutter.io' + s.license = { :type => 'MIT' } + s.author = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' } + s.source = { :git => 'https://github.com/flutter/engine', :tag => s.version.to_s } + s.ios.deployment_target = '9.0' + # Framework linking is handled by Flutter tooling, not CocoaPods. + # Add a placeholder to satisfy `s.dependency 'Flutter'` plugin podspecs. + s.vendored_frameworks = 'path/to/nothing' +end diff --git a/example/ios/Flutter/flutter_export_environment.sh b/example/ios/Flutter/flutter_export_environment.sh index dad54015..03bce7c9 100755 --- a/example/ios/Flutter/flutter_export_environment.sh +++ b/example/ios/Flutter/flutter_export_environment.sh @@ -3,11 +3,12 @@ export "FLUTTER_ROOT=/Users/lorenzopichilli/fvm/versions/2.10.4" export "FLUTTER_APPLICATION_PATH=/Users/lorenzopichilli/Desktop/flutter_inappwebview/example" export "COCOAPODS_PARALLEL_CODE_SIGN=true" -export "FLUTTER_TARGET=lib/main.dart" +export "FLUTTER_TARGET=integration_test/webview_flutter_test.dart" export "FLUTTER_BUILD_DIR=build" export "FLUTTER_BUILD_NAME=1.0.0" export "FLUTTER_BUILD_NUMBER=1" +export "DART_DEFINES=RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ==" export "DART_OBFUSCATION=false" -export "TRACK_WIDGET_CREATION=false" +export "TRACK_WIDGET_CREATION=true" export "TREE_SHAKE_ICONS=false" -export "PACKAGE_CONFIG=.packages" +export "PACKAGE_CONFIG=/Users/lorenzopichilli/Desktop/flutter_inappwebview/example/.dart_tool/package_config.json" diff --git a/ios/Classes/HeadlessInAppWebView/HeadlessInAppWebView.swift b/ios/Classes/HeadlessInAppWebView/HeadlessInAppWebView.swift index b5f2ef62..c34f1436 100644 --- a/ios/Classes/HeadlessInAppWebView/HeadlessInAppWebView.swift +++ b/ios/Classes/HeadlessInAppWebView/HeadlessInAppWebView.swift @@ -89,7 +89,7 @@ public class HeadlessInAppWebView : FlutterMethodCallDelegate { public func dispose() { channel?.setMethodCallHandler(nil) channel = nil - HeadlessInAppWebViewManager.webViews.removeValue(forKey: id) + HeadlessInAppWebViewManager.webViews[id] = nil flutterWebView = nil } diff --git a/ios/Classes/HeadlessInAppWebView/HeadlessInAppWebViewManager.swift b/ios/Classes/HeadlessInAppWebView/HeadlessInAppWebViewManager.swift index 9a75e97e..97e808a0 100644 --- a/ios/Classes/HeadlessInAppWebView/HeadlessInAppWebViewManager.swift +++ b/ios/Classes/HeadlessInAppWebView/HeadlessInAppWebViewManager.swift @@ -16,7 +16,7 @@ import AVFoundation public class HeadlessInAppWebViewManager: NSObject, FlutterPlugin { static var registrar: FlutterPluginRegistrar? static var channel: FlutterMethodChannel? - static var webViews: [String: HeadlessInAppWebView] = [:] + static var webViews: [String: HeadlessInAppWebView?] = [:] public static func register(with registrar: FlutterPluginRegistrar) { @@ -63,8 +63,8 @@ public class HeadlessInAppWebViewManager: NSObject, FlutterPlugin { HeadlessInAppWebViewManager.channel = nil HeadlessInAppWebViewManager.registrar = nil let headlessWebViews = HeadlessInAppWebViewManager.webViews.values - headlessWebViews.forEach { (headlessWebView: HeadlessInAppWebView) in - headlessWebView.dispose() + headlessWebViews.forEach { (headlessWebView: HeadlessInAppWebView?) in + headlessWebView?.dispose() } HeadlessInAppWebViewManager.webViews.removeAll() } diff --git a/pubspec.yaml b/pubspec.yaml index e8ba176e..4817ab3d 100755 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_inappwebview description: A Flutter plugin that allows you to add an inline webview, to use an headless webview, and to open an in-app browser window. -version: 5.4.3 +version: 5.4.3+1 homepage: https://github.com/pichillilorenzo/flutter_inappwebview environment: