parent
7bb70eb7d9
commit
3a9bee5af8
|
@ -1,3 +1,8 @@
|
||||||
|
## 1.0.6
|
||||||
|
|
||||||
|
- Fixed "getFavicons: _TypeError: type '_Map<String, dynamic>' is not a subtype of type 'Iterable<dynamic>'" [#1897](https://github.com/pichillilorenzo/flutter_inappwebview/issues/1897)
|
||||||
|
- Fixed "onClosed not considering back navigation or up button / close button in ChromeSafariBrowser when using noHistory: true" [#1882](https://github.com/pichillilorenzo/flutter_inappwebview/issues/1882)
|
||||||
|
|
||||||
## 1.0.5
|
## 1.0.5
|
||||||
|
|
||||||
- Call `super.dispose();` on `InAppBrowser` and `ChromeSafari` implementations
|
- Call `super.dispose();` on `InAppBrowser` and `ChromeSafari` implementations
|
||||||
|
|
|
@ -8,6 +8,7 @@ import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
import com.pichillilorenzo.flutter_inappwebview_android.chrome_custom_tabs.ChromeSafariBrowserManager;
|
import com.pichillilorenzo.flutter_inappwebview_android.chrome_custom_tabs.ChromeSafariBrowserManager;
|
||||||
|
import com.pichillilorenzo.flutter_inappwebview_android.chrome_custom_tabs.NoHistoryCustomTabsActivityCallbacks;
|
||||||
import com.pichillilorenzo.flutter_inappwebview_android.credential_database.CredentialDatabaseHandler;
|
import com.pichillilorenzo.flutter_inappwebview_android.credential_database.CredentialDatabaseHandler;
|
||||||
import com.pichillilorenzo.flutter_inappwebview_android.headless_in_app_webview.HeadlessInAppWebViewManager;
|
import com.pichillilorenzo.flutter_inappwebview_android.headless_in_app_webview.HeadlessInAppWebViewManager;
|
||||||
import com.pichillilorenzo.flutter_inappwebview_android.in_app_browser.InAppBrowserManager;
|
import com.pichillilorenzo.flutter_inappwebview_android.in_app_browser.InAppBrowserManager;
|
||||||
|
@ -40,6 +41,8 @@ public class InAppWebViewFlutterPlugin implements FlutterPlugin, ActivityAware {
|
||||||
@Nullable
|
@Nullable
|
||||||
public ChromeSafariBrowserManager chromeSafariBrowserManager;
|
public ChromeSafariBrowserManager chromeSafariBrowserManager;
|
||||||
@Nullable
|
@Nullable
|
||||||
|
public NoHistoryCustomTabsActivityCallbacks noHistoryCustomTabsActivityCallbacks;
|
||||||
|
@Nullable
|
||||||
public InAppWebViewManager inAppWebViewManager;
|
public InAppWebViewManager inAppWebViewManager;
|
||||||
@Nullable
|
@Nullable
|
||||||
public MyCookieManager myCookieManager;
|
public MyCookieManager myCookieManager;
|
||||||
|
@ -103,6 +106,7 @@ public class InAppWebViewFlutterPlugin implements FlutterPlugin, ActivityAware {
|
||||||
inAppBrowserManager = new InAppBrowserManager(this);
|
inAppBrowserManager = new InAppBrowserManager(this);
|
||||||
headlessInAppWebViewManager = new HeadlessInAppWebViewManager(this);
|
headlessInAppWebViewManager = new HeadlessInAppWebViewManager(this);
|
||||||
chromeSafariBrowserManager = new ChromeSafariBrowserManager(this);
|
chromeSafariBrowserManager = new ChromeSafariBrowserManager(this);
|
||||||
|
noHistoryCustomTabsActivityCallbacks = new NoHistoryCustomTabsActivityCallbacks(this);
|
||||||
flutterWebViewFactory = new FlutterWebViewFactory(this);
|
flutterWebViewFactory = new FlutterWebViewFactory(this);
|
||||||
platformViewRegistry.registerViewFactory(
|
platformViewRegistry.registerViewFactory(
|
||||||
FlutterWebViewFactory.VIEW_TYPE_ID, flutterWebViewFactory);
|
FlutterWebViewFactory.VIEW_TYPE_ID, flutterWebViewFactory);
|
||||||
|
@ -144,6 +148,10 @@ public class InAppWebViewFlutterPlugin implements FlutterPlugin, ActivityAware {
|
||||||
chromeSafariBrowserManager.dispose();
|
chromeSafariBrowserManager.dispose();
|
||||||
chromeSafariBrowserManager = null;
|
chromeSafariBrowserManager = null;
|
||||||
}
|
}
|
||||||
|
if (noHistoryCustomTabsActivityCallbacks != null) {
|
||||||
|
noHistoryCustomTabsActivityCallbacks.dispose();
|
||||||
|
noHistoryCustomTabsActivityCallbacks = null;
|
||||||
|
}
|
||||||
if (myCookieManager != null) {
|
if (myCookieManager != null) {
|
||||||
myCookieManager.dispose();
|
myCookieManager.dispose();
|
||||||
myCookieManager = null;
|
myCookieManager = null;
|
||||||
|
@ -190,23 +198,39 @@ public class InAppWebViewFlutterPlugin implements FlutterPlugin, ActivityAware {
|
||||||
public void onAttachedToActivity(ActivityPluginBinding activityPluginBinding) {
|
public void onAttachedToActivity(ActivityPluginBinding activityPluginBinding) {
|
||||||
this.activityPluginBinding = activityPluginBinding;
|
this.activityPluginBinding = activityPluginBinding;
|
||||||
this.activity = activityPluginBinding.getActivity();
|
this.activity = activityPluginBinding.getActivity();
|
||||||
|
|
||||||
|
if (noHistoryCustomTabsActivityCallbacks != null) {
|
||||||
|
this.activity.getApplication().registerActivityLifecycleCallbacks(noHistoryCustomTabsActivityCallbacks.activityLifecycleCallbacks);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDetachedFromActivityForConfigChanges() {
|
public void onDetachedFromActivityForConfigChanges() {
|
||||||
this.activityPluginBinding = null;
|
if (activity != null && noHistoryCustomTabsActivityCallbacks != null) {
|
||||||
this.activity = null;
|
this.activity.getApplication().unregisterActivityLifecycleCallbacks(noHistoryCustomTabsActivityCallbacks.activityLifecycleCallbacks);
|
||||||
|
}
|
||||||
|
|
||||||
|
activityPluginBinding = null;
|
||||||
|
activity = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onReattachedToActivityForConfigChanges(ActivityPluginBinding activityPluginBinding) {
|
public void onReattachedToActivityForConfigChanges(ActivityPluginBinding activityPluginBinding) {
|
||||||
this.activityPluginBinding = activityPluginBinding;
|
this.activityPluginBinding = activityPluginBinding;
|
||||||
this.activity = activityPluginBinding.getActivity();
|
this.activity = activityPluginBinding.getActivity();
|
||||||
|
|
||||||
|
if (noHistoryCustomTabsActivityCallbacks != null) {
|
||||||
|
this.activity.getApplication().registerActivityLifecycleCallbacks(noHistoryCustomTabsActivityCallbacks.activityLifecycleCallbacks);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDetachedFromActivity() {
|
public void onDetachedFromActivity() {
|
||||||
this.activityPluginBinding = null;
|
if (activity != null && noHistoryCustomTabsActivityCallbacks != null) {
|
||||||
this.activity = null;
|
this.activity.getApplication().unregisterActivityLifecycleCallbacks(noHistoryCustomTabsActivityCallbacks.activityLifecycleCallbacks);
|
||||||
|
}
|
||||||
|
|
||||||
|
activityPluginBinding = null;
|
||||||
|
activity = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,7 +47,8 @@ public class ChromeCustomTabsActivity extends Activity implements Disposable {
|
||||||
public CustomTabActivityHelper customTabActivityHelper = new CustomTabActivityHelper();
|
public CustomTabActivityHelper customTabActivityHelper = new CustomTabActivityHelper();
|
||||||
@Nullable
|
@Nullable
|
||||||
public CustomTabsSession customTabsSession;
|
public CustomTabsSession customTabsSession;
|
||||||
protected final int CHROME_CUSTOM_TAB_REQUEST_CODE = 100;
|
public final static int CHROME_CUSTOM_TAB_REQUEST_CODE = 100;
|
||||||
|
public final static int NO_HISTORY_CHROME_CUSTOM_TAB_REQUEST_CODE = 101;
|
||||||
protected boolean onOpened = false;
|
protected boolean onOpened = false;
|
||||||
protected boolean onCompletedInitialLoad = false;
|
protected boolean onCompletedInitialLoad = false;
|
||||||
protected boolean isBindSuccess = false;
|
protected boolean isBindSuccess = false;
|
||||||
|
@ -104,6 +105,10 @@ public class ChromeCustomTabsActivity extends Activity implements Disposable {
|
||||||
menuItems.add(CustomTabsMenuItem.fromMap(menuItem));
|
menuItems.add(CustomTabsMenuItem.fromMap(menuItem));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (customSettings.noHistory && manager.plugin.noHistoryCustomTabsActivityCallbacks != null) {
|
||||||
|
manager.plugin.noHistoryCustomTabsActivityCallbacks.noHistoryBrowserIDs.put(id, id);
|
||||||
|
}
|
||||||
|
|
||||||
final ChromeCustomTabsActivity chromeCustomTabsActivity = this;
|
final ChromeCustomTabsActivity chromeCustomTabsActivity = this;
|
||||||
|
|
||||||
customTabActivityHelper.setConnectionCallback(new CustomTabActivityHelper.ConnectionCallback() {
|
customTabActivityHelper.setConnectionCallback(new CustomTabActivityHelper.ConnectionCallback() {
|
||||||
|
|
|
@ -0,0 +1,77 @@
|
||||||
|
package com.pichillilorenzo.flutter_inappwebview_android.chrome_custom_tabs;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.app.Application;
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import com.pichillilorenzo.flutter_inappwebview_android.InAppWebViewFlutterPlugin;
|
||||||
|
import com.pichillilorenzo.flutter_inappwebview_android.types.Disposable;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import io.flutter.embedding.android.FlutterActivity;
|
||||||
|
|
||||||
|
public class NoHistoryCustomTabsActivityCallbacks implements Disposable {
|
||||||
|
@Nullable
|
||||||
|
public InAppWebViewFlutterPlugin plugin;
|
||||||
|
|
||||||
|
public final Map<String, String> noHistoryBrowserIDs = new HashMap<>();
|
||||||
|
|
||||||
|
public NoHistoryCustomTabsActivityCallbacks(@NonNull final InAppWebViewFlutterPlugin plugin) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Application.ActivityLifecycleCallbacks activityLifecycleCallbacks = new Application.ActivityLifecycleCallbacks() {
|
||||||
|
@Override
|
||||||
|
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onActivityStarted(@NonNull Activity activity) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onActivityResumed(@NonNull Activity activity) {
|
||||||
|
if (activity instanceof FlutterActivity && plugin != null && plugin.chromeSafariBrowserManager != null) {
|
||||||
|
Collection<String> browserIds = noHistoryBrowserIDs.values();
|
||||||
|
for (String browserId : browserIds) {
|
||||||
|
if (browserId != null) {
|
||||||
|
noHistoryBrowserIDs.put(browserId, null);
|
||||||
|
ChromeCustomTabsActivity browser = plugin.chromeSafariBrowserManager.browsers.get(browserId);
|
||||||
|
if (browser != null) {
|
||||||
|
browser.close();
|
||||||
|
browser.dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onActivityPaused(@NonNull Activity activity) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onActivityStopped(@NonNull Activity activity) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onActivityDestroyed(@NonNull Activity activity) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void dispose() {
|
||||||
|
noHistoryBrowserIDs.clear();
|
||||||
|
plugin = null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1712,7 +1712,7 @@ class AndroidInAppWebViewController extends PlatformInAppWebViewController
|
||||||
manifestResponse.headers.contentType?.mimeType == "application/json";
|
manifestResponse.headers.contentType?.mimeType == "application/json";
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
developer.log("Manifest file not found: " + e.toString(),
|
developer.log("Manifest file not found: " + e.toString(),
|
||||||
name: this.runtimeType.toString());
|
name: runtimeType.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (manifestFound) {
|
if (manifestFound) {
|
||||||
|
@ -1725,9 +1725,12 @@ class AndroidInAppWebViewController extends PlatformInAppWebViewController
|
||||||
icon["src"], icon["rel"], icon["sizes"], true));
|
icon["src"], icon["rel"], icon["sizes"], true));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} on FormatException catch (_) {
|
} catch (e) {
|
||||||
/// The [manifestResponse] might not has a valid JSON string, catch and
|
developer.log(
|
||||||
/// ignore the error
|
"Cannot get favicons from Manifest file. It might not have a valid format: " +
|
||||||
|
e.toString(),
|
||||||
|
error: e,
|
||||||
|
name: runtimeType.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
name: flutter_inappwebview_android
|
name: flutter_inappwebview_android
|
||||||
description: Android implementation of the flutter_inappwebview plugin.
|
description: Android implementation of the flutter_inappwebview plugin.
|
||||||
version: 1.0.5
|
version: 1.0.6
|
||||||
homepage: https://inappwebview.dev/
|
homepage: https://inappwebview.dev/
|
||||||
repository: https://github.com/pichillilorenzo/flutter_inappwebview/tree/master/flutter_inappwebview_android
|
repository: https://github.com/pichillilorenzo/flutter_inappwebview/tree/master/flutter_inappwebview_android
|
||||||
issue_tracker: https://github.com/pichillilorenzo/flutter_inappwebview/issues
|
issue_tracker: https://github.com/pichillilorenzo/flutter_inappwebview/issues
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
## 1.0.7
|
||||||
|
|
||||||
|
- Fixed "getFavicons: _TypeError: type '_Map<String, dynamic>' is not a subtype of type 'Iterable<dynamic>'" [#1897](https://github.com/pichillilorenzo/flutter_inappwebview/issues/1897)
|
||||||
|
|
||||||
## 1.0.6
|
## 1.0.6
|
||||||
|
|
||||||
- Possible fix for "iOS Fatal Crash" [#1894](https://github.com/pichillilorenzo/flutter_inappwebview/issues/1894)
|
- Possible fix for "iOS Fatal Crash" [#1894](https://github.com/pichillilorenzo/flutter_inappwebview/issues/1894)
|
||||||
|
|
|
@ -1689,7 +1689,7 @@ class IOSInAppWebViewController extends PlatformInAppWebViewController
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
developer.log("/favicon.ico file not found: " + e.toString(),
|
developer.log("/favicon.ico file not found: " + e.toString(),
|
||||||
name: this.runtimeType.toString());
|
name: runtimeType.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
// try to get the manifest file
|
// try to get the manifest file
|
||||||
|
@ -1721,9 +1721,12 @@ class IOSInAppWebViewController extends PlatformInAppWebViewController
|
||||||
icon["src"], icon["rel"], icon["sizes"], true));
|
icon["src"], icon["rel"], icon["sizes"], true));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} on FormatException catch (_) {
|
} catch (e) {
|
||||||
/// The [manifestResponse] might not has a valid JSON string, catch and
|
developer.log(
|
||||||
/// ignore the error
|
"Cannot get favicons from Manifest file. It might not have a valid format: " +
|
||||||
|
e.toString(),
|
||||||
|
error: e,
|
||||||
|
name: runtimeType.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
name: flutter_inappwebview_ios
|
name: flutter_inappwebview_ios
|
||||||
description: iOS implementation of the flutter_inappwebview plugin.
|
description: iOS implementation of the flutter_inappwebview plugin.
|
||||||
version: 1.0.6
|
version: 1.0.7
|
||||||
homepage: https://inappwebview.dev/
|
homepage: https://inappwebview.dev/
|
||||||
repository: https://github.com/pichillilorenzo/flutter_inappwebview/tree/master/flutter_inappwebview_ios
|
repository: https://github.com/pichillilorenzo/flutter_inappwebview/tree/master/flutter_inappwebview_ios
|
||||||
issue_tracker: https://github.com/pichillilorenzo/flutter_inappwebview/issues
|
issue_tracker: https://github.com/pichillilorenzo/flutter_inappwebview/issues
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
## 1.0.5
|
||||||
|
|
||||||
|
- Fixed "getFavicons: _TypeError: type '_Map<String, dynamic>' is not a subtype of type 'Iterable<dynamic>'" [#1897](https://github.com/pichillilorenzo/flutter_inappwebview/issues/1897)
|
||||||
|
|
||||||
## 1.0.4
|
## 1.0.4
|
||||||
|
|
||||||
- Possible fix for "iOS Fatal Crash" [#1894](https://github.com/pichillilorenzo/flutter_inappwebview/issues/1894)
|
- Possible fix for "iOS Fatal Crash" [#1894](https://github.com/pichillilorenzo/flutter_inappwebview/issues/1894)
|
||||||
|
|
|
@ -1690,7 +1690,7 @@ class MacOSInAppWebViewController extends PlatformInAppWebViewController
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
developer.log("/favicon.ico file not found: " + e.toString(),
|
developer.log("/favicon.ico file not found: " + e.toString(),
|
||||||
name: this.runtimeType.toString());
|
name: runtimeType.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
// try to get the manifest file
|
// try to get the manifest file
|
||||||
|
@ -1722,9 +1722,12 @@ class MacOSInAppWebViewController extends PlatformInAppWebViewController
|
||||||
icon["src"], icon["rel"], icon["sizes"], true));
|
icon["src"], icon["rel"], icon["sizes"], true));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} on FormatException catch (_) {
|
} catch (e) {
|
||||||
/// The [manifestResponse] might not has a valid JSON string, catch and
|
developer.log(
|
||||||
/// ignore the error
|
"Cannot get favicons from Manifest file. It might not have a valid format: " +
|
||||||
|
e.toString(),
|
||||||
|
error: e,
|
||||||
|
name: runtimeType.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
name: flutter_inappwebview_macos
|
name: flutter_inappwebview_macos
|
||||||
description: macOS implementation of the flutter_inappwebview plugin.
|
description: macOS implementation of the flutter_inappwebview plugin.
|
||||||
version: 1.0.4
|
version: 1.0.5
|
||||||
homepage: https://inappwebview.dev/
|
homepage: https://inappwebview.dev/
|
||||||
repository: https://github.com/pichillilorenzo/flutter_inappwebview/tree/master/flutter_inappwebview_macos
|
repository: https://github.com/pichillilorenzo/flutter_inappwebview/tree/master/flutter_inappwebview_macos
|
||||||
issue_tracker: https://github.com/pichillilorenzo/flutter_inappwebview/issues
|
issue_tracker: https://github.com/pichillilorenzo/flutter_inappwebview/issues
|
||||||
|
|
Loading…
Reference in New Issue