From 9c6916d99c65d6ad7eb4e0079595ed3d9ef93daa Mon Sep 17 00:00:00 2001 From: Ahmed alaa Date: Mon, 28 Apr 2025 13:03:34 +0300 Subject: [PATCH 1/7] feat: expose native api --- CHANGELOG.md | 7 ++++ android/build.gradle | 2 +- .../flutter/InstabugFlutterPlugin.java | 40 ++++++++++++++++++- .../instabug/flutter/modules/InstabugApi.java | 30 ++++++++++---- example/ios/Podfile.lock | 2 +- example/pubspec.lock | 34 ++++++++-------- ios/Classes/Modules/InstabugApi.m | 5 +++ lib/src/modules/instabug.dart | 12 ++++++ lib/src/utils/hybrid_utils.dart | 26 ++++++++++++ .../utils/instabug_navigator_observer.dart | 18 ++++++++- pigeons/instabug.api.dart | 1 + pigeons/instabug_flutter.api.dart | 6 +++ 12 files changed, 153 insertions(+), 30 deletions(-) create mode 100644 lib/src/utils/hybrid_utils.dart create mode 100644 pigeons/instabug_flutter.api.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index 950d295b0..766f01748 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [Unreleased](https://github.com/Instabug/Instabug-Flutter/compare/v14.3.0...dev) + +### Added + +- Add support for hybrid apps. ([#561](https://github.com/Instabug/Instabug-Flutter/pull/561)) + + ## [14.3.0](https://github.com/Instabug/Instabug-Flutter/compare/v14.1.0...14.3.0) (April 21, 2025) ### Added diff --git a/android/build.gradle b/android/build.gradle index a6c41ffd0..cae901fce 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -44,7 +44,7 @@ android { } dependencies { - api 'com.instabug.library:instabug:14.3.0' + api 'com.instabug.library:instabug:14.2.1.6702511-SNAPSHOT' testImplementation 'junit:junit:4.13.2' testImplementation "org.mockito:mockito-inline:3.12.1" testImplementation "io.mockk:mockk:1.13.13" diff --git a/android/src/main/java/com/instabug/flutter/InstabugFlutterPlugin.java b/android/src/main/java/com/instabug/flutter/InstabugFlutterPlugin.java index bb3b043fa..e702d0a47 100644 --- a/android/src/main/java/com/instabug/flutter/InstabugFlutterPlugin.java +++ b/android/src/main/java/com/instabug/flutter/InstabugFlutterPlugin.java @@ -3,6 +3,7 @@ import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; +import android.content.Intent; import android.graphics.Bitmap; import android.util.Log; import android.view.View; @@ -10,6 +11,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.instabug.flutter.generated.InstabugFlutterPigeon; import com.instabug.flutter.modules.ApmApi; import com.instabug.flutter.modules.BugReportingApi; import com.instabug.flutter.modules.CrashReportingApi; @@ -27,6 +29,7 @@ import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; import io.flutter.embedding.engine.renderer.FlutterRenderer; import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.plugin.common.PluginRegistry; public class InstabugFlutterPlugin implements FlutterPlugin, ActivityAware { private static final String TAG = InstabugFlutterPlugin.class.getName(); @@ -34,6 +37,8 @@ public class InstabugFlutterPlugin implements FlutterPlugin, ActivityAware { @SuppressLint("StaticFieldLeak") private static Activity activity; + private InstabugFlutterPigeon.InstabugFlutterApi instabugFlutterApi; + PluginRegistry.ActivityResultListener resultListener; @Override public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { @@ -48,16 +53,47 @@ public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { @Override public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) { activity = binding.getActivity(); + initOnActivityResultListener(binding); + + } + + private void initOnActivityResultListener(@NonNull ActivityPluginBinding binding) { + if(resultListener!=null) { + binding.removeActivityResultListener(resultListener); + } + + resultListener = new PluginRegistry.ActivityResultListener() { + @Override + public boolean onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + if (instabugFlutterApi != null) { + instabugFlutterApi.reportLastScreenChange(new InstabugFlutterPigeon.InstabugFlutterApi.Reply() { + @Override + public void reply(Void reply) { + + } + }); + } + + + return false; + } + }; + + + binding.addActivityResultListener(resultListener); } + @Override public void onDetachedFromActivityForConfigChanges() { activity = null; + } @Override public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) { activity = binding.getActivity(); + initOnActivityResultListener(binding); } @Override @@ -65,7 +101,7 @@ public void onDetachedFromActivity() { activity = null; } - private static void register(Context context, BinaryMessenger messenger, FlutterRenderer renderer) { + private void register(Context context, BinaryMessenger messenger, FlutterRenderer renderer) { final Callable screenshotProvider = new Callable() { @Override public Bitmap call() { @@ -82,6 +118,8 @@ public Bitmap call() { RepliesApi.init(messenger); SessionReplayApi.init(messenger); SurveysApi.init(messenger); + instabugFlutterApi = new InstabugFlutterPigeon.InstabugFlutterApi(messenger); + } @Nullable diff --git a/android/src/main/java/com/instabug/flutter/modules/InstabugApi.java b/android/src/main/java/com/instabug/flutter/modules/InstabugApi.java index edfde055a..47d8cd52e 100644 --- a/android/src/main/java/com/instabug/flutter/modules/InstabugApi.java +++ b/android/src/main/java/com/instabug/flutter/modules/InstabugApi.java @@ -6,9 +6,11 @@ import android.graphics.BitmapFactory; import android.net.Uri; import android.util.Log; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; + import com.instabug.flutter.generated.InstabugPigeon; import com.instabug.flutter.util.ArgsRegistry; import com.instabug.flutter.util.Reflection; @@ -30,9 +32,11 @@ import com.instabug.library.invocation.InstabugInvocationEvent; import com.instabug.library.model.NetworkLog; import com.instabug.library.ui.onboarding.WelcomeMessage; + import io.flutter.FlutterInjector; import io.flutter.embedding.engine.loader.FlutterLoader; import io.flutter.plugin.common.BinaryMessenger; + import org.jetbrains.annotations.NotNull; import org.json.JSONObject; @@ -55,11 +59,12 @@ public class InstabugApi implements InstabugPigeon.InstabugHostApi { private final InstabugPigeon.FeatureFlagsFlutterApi featureFlagsFlutterApi; - public static void init(BinaryMessenger messenger, Context context, Callable screenshotProvider) { + public static InstabugApi init(BinaryMessenger messenger, Context context, Callable screenshotProvider) { final InstabugPigeon.FeatureFlagsFlutterApi flutterApi = new InstabugPigeon.FeatureFlagsFlutterApi(messenger); final InstabugApi api = new InstabugApi(context, screenshotProvider, flutterApi); InstabugPigeon.InstabugHostApi.setup(messenger, api); + return api; } public InstabugApi(Context context, Callable screenshotProvider, InstabugPigeon.FeatureFlagsFlutterApi featureFlagsFlutterApi) { @@ -102,7 +107,9 @@ public Boolean isEnabled() { @NotNull @Override - public Boolean isBuilt() { return Instabug.isBuilt(); } + public Boolean isBuilt() { + return Instabug.isBuilt(); + } @Override public void init(@NonNull String token, @NonNull List invocationEvents, @NonNull String debugLogsLevel) { @@ -122,7 +129,14 @@ public void init(@NonNull String token, @NonNull List invocationEvents, .setSdkDebugLogsLevel(parsedLogLevel) .build(); + initHybridMode(); + + } + + @Override + public void initHybridMode() { Instabug.setScreenshotProvider(screenshotProvider); + } @Override @@ -500,13 +514,13 @@ public void willRedirectToStore() { Instabug.willRedirectToStore(); } - + @Override public void setNetworkLogBodyEnabled(@NonNull Boolean isEnabled) { - try { - Instabug.setNetworkLogBodyEnabled(isEnabled); - } catch (Exception e) { - e.printStackTrace(); - } +// try { +// Instabug.setNetworkLogBodyEnabled(isEnabled); +// } catch (Exception e) { +// e.printStackTrace(); +// } } } diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 484d0ae99..fb6db9601 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -25,7 +25,7 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 Instabug: 97a4e694731f46bbc02dbe49ab29cc552c5e2f41 - instabug_flutter: 4e4a9b162d77d5624d08ccdf81745d923745e062 + instabug_flutter: ef9cb6bf3c9dd29b1e4bf3129a16dcbcb2d332e6 OCMock: 5ea90566be239f179ba766fd9fbae5885040b992 PODFILE CHECKSUM: 8f7552fd115ace1988c3db54a69e4a123c448f84 diff --git a/example/pubspec.lock b/example/pubspec.lock index 93971dc8b..ba4cc0a6d 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -37,10 +37,10 @@ packages: dependency: transitive description: name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf url: "https://pub.dev" source: hosted - version: "1.18.0" + version: "1.19.0" fake_async: dependency: transitive description: @@ -120,18 +120,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" url: "https://pub.dev" source: hosted - version: "10.0.5" + version: "10.0.7" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.8" leak_tracker_testing: dependency: transitive description: @@ -200,7 +200,7 @@ packages: dependency: transitive description: flutter source: sdk - version: "0.0.99" + version: "0.0.0" source_span: dependency: transitive description: @@ -213,10 +213,10 @@ packages: dependency: transitive description: name: stack_trace - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "1.12.0" stream_channel: dependency: transitive description: @@ -229,10 +229,10 @@ packages: dependency: transitive description: name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.0" sync_http: dependency: transitive description: @@ -253,10 +253,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" url: "https://pub.dev" source: hosted - version: "0.7.2" + version: "0.7.3" typed_data: dependency: transitive description: @@ -277,18 +277,18 @@ packages: dependency: transitive description: name: vm_service - sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" + sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b url: "https://pub.dev" source: hosted - version: "14.2.5" + version: "14.3.0" webdriver: dependency: transitive description: name: webdriver - sha256: "003d7da9519e1e5f329422b36c4dcdf18d7d2978d1ba099ea4e45ba490ed845e" + sha256: "3d773670966f02a646319410766d3b5e1037efb7f07cc68f844d5e06cd4d61c8" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.4" sdks: dart: ">=3.5.0 <4.0.0" flutter: ">=3.18.0-18.0.pre.54" diff --git a/ios/Classes/Modules/InstabugApi.m b/ios/Classes/Modules/InstabugApi.m index 95222a4c8..e42b52bd4 100644 --- a/ios/Classes/Modules/InstabugApi.m +++ b/ios/Classes/Modules/InstabugApi.m @@ -396,4 +396,9 @@ - (void)setNetworkLogBodyEnabledIsEnabled:(NSNumber *)isEnabled IBGNetworkLogger.logBodyEnabled = [isEnabled boolValue]; } +- (void)initHybridModeWithError:(FlutterError * _Nullable __autoreleasing * _Nonnull)error { + +} + + @end diff --git a/lib/src/modules/instabug.dart b/lib/src/modules/instabug.dart index 6bba8ed1f..c6e36f6df 100644 --- a/lib/src/modules/instabug.dart +++ b/lib/src/modules/instabug.dart @@ -1,6 +1,7 @@ // ignore_for_file: avoid_classes_with_only_static_members import 'dart:async'; +import 'dart:io'; // to maintain supported versions prior to Flutter 3.3 // ignore: unnecessary_import @@ -11,11 +12,13 @@ import 'dart:typed_data'; import 'dart:ui'; import 'package:flutter/material.dart'; + // to maintain supported versions prior to Flutter 3.3 // ignore: unused_import import 'package:flutter/services.dart'; import 'package:instabug_flutter/instabug_flutter.dart'; import 'package:instabug_flutter/src/generated/instabug.api.g.dart'; +import 'package:instabug_flutter/src/utils/hybrid_utils.dart'; import 'package:instabug_flutter/src/utils/enum_converter.dart'; import 'package:instabug_flutter/src/utils/feature_flags_manager.dart'; import 'package:instabug_flutter/src/utils/ibg_build_info.dart'; @@ -153,6 +156,7 @@ class Instabug { BugReporting.$setup(); Replies.$setup(); Surveys.$setup(); + HybridUtils.$setup(); } /// @nodoc @@ -482,4 +486,12 @@ class Instabug { static Future willRedirectToStore() async { return _host.willRedirectToStore(); } + + /// Initializes hybrid mode for applications that combine Flutter and native screens. + /// + /// This method should be called when using the Flutter SDK in a hybrid app to enable + /// proper communication and integration between native and Flutter screens. + static Future initializeHybridMode() { + return _host.initHybridMode(); + } } diff --git a/lib/src/utils/hybrid_utils.dart b/lib/src/utils/hybrid_utils.dart new file mode 100644 index 000000000..dc6f70952 --- /dev/null +++ b/lib/src/utils/hybrid_utils.dart @@ -0,0 +1,26 @@ +import 'package:instabug_flutter/src/generated/instabug_flutter.api.g.dart'; +import 'package:instabug_flutter/src/utils/instabug_navigator_observer.dart'; + +class HybridUtils implements InstabugFlutterApi { + + // Access the singleton instance + factory HybridUtils() { + return _instance; + } + // Private constructor to prevent instantiation from outside the class + HybridUtils._(); + + // Singleton instance + static final HybridUtils _instance = HybridUtils._(); + + static void $setup(){ + InstabugFlutterApi.setup(_instance); // Use 'this' instead of _instance + } + + @override + void reportLastScreenChange() { + InstabugNavigatorObserver.reportLastScreenChange(); + } + + +} diff --git a/lib/src/utils/instabug_navigator_observer.dart b/lib/src/utils/instabug_navigator_observer.dart index d9d6b02db..207eb071e 100644 --- a/lib/src/utils/instabug_navigator_observer.dart +++ b/lib/src/utils/instabug_navigator_observer.dart @@ -8,10 +8,13 @@ import 'package:instabug_flutter/src/utils/screen_loading/screen_loading_manager import 'package:instabug_flutter/src/utils/screen_name_masker.dart'; class InstabugNavigatorObserver extends NavigatorObserver { - final List _steps = []; + static final List _steps = []; - void screenChanged(Route newRoute) { + static Route? lastRoute; + + static void screenChanged(Route newRoute) { try { + lastRoute = newRoute; final rawScreenName = newRoute.settings.name.toString().trim(); final screenName = rawScreenName.isEmpty ? ReproStepsConstants.emptyScreenFallback @@ -58,4 +61,15 @@ class InstabugNavigatorObserver extends NavigatorObserver { void didPush(Route route, Route? previousRoute) { screenChanged(route); } + + static void reportLastScreenChange() { + print("Called reportLastScreenChange"); + + if (lastRoute != null) { + print( + "Called reportLastScreenChange screenChanged ${lastRoute!.settings.name}"); + + screenChanged(lastRoute!); + } + } } diff --git a/pigeons/instabug.api.dart b/pigeons/instabug.api.dart index 275306987..c2ca17f93 100644 --- a/pigeons/instabug.api.dart +++ b/pigeons/instabug.api.dart @@ -15,6 +15,7 @@ abstract class InstabugHostApi { bool isEnabled(); bool isBuilt(); void init(String token, List invocationEvents, String debugLogsLevel); + void initHybridMode(); void show(); void showWelcomeMessageWithMode(String mode); diff --git a/pigeons/instabug_flutter.api.dart b/pigeons/instabug_flutter.api.dart new file mode 100644 index 000000000..e729b9440 --- /dev/null +++ b/pigeons/instabug_flutter.api.dart @@ -0,0 +1,6 @@ +import 'package:pigeon/pigeon.dart'; + +@FlutterApi() +abstract class InstabugFlutterApi { + void reportLastScreenChange(); +} \ No newline at end of file From ba9197d4a64c8e3afbdb07d24eb5e3219d74cdda Mon Sep 17 00:00:00 2001 From: Ahmed alaa Date: Wed, 30 Apr 2025 13:51:54 +0300 Subject: [PATCH 2/7] feat: support hybrid apps --- .../flutter/InstabugFlutterPlugin.java | 3 ++- .../instabug/flutter/modules/InstabugApi.java | 9 ++++---- .../flutter/util/InstabugHybirdUtils.java | 21 +++++++++++++++++++ 3 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 android/src/main/java/com/instabug/flutter/util/InstabugHybirdUtils.java diff --git a/android/src/main/java/com/instabug/flutter/InstabugFlutterPlugin.java b/android/src/main/java/com/instabug/flutter/InstabugFlutterPlugin.java index e702d0a47..b7c20e95c 100644 --- a/android/src/main/java/com/instabug/flutter/InstabugFlutterPlugin.java +++ b/android/src/main/java/com/instabug/flutter/InstabugFlutterPlugin.java @@ -5,6 +5,7 @@ import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; +import android.os.Bundle; import android.util.Log; import android.view.View; @@ -37,7 +38,7 @@ public class InstabugFlutterPlugin implements FlutterPlugin, ActivityAware { @SuppressLint("StaticFieldLeak") private static Activity activity; - private InstabugFlutterPigeon.InstabugFlutterApi instabugFlutterApi; + public static InstabugFlutterPigeon.InstabugFlutterApi instabugFlutterApi; PluginRegistry.ActivityResultListener resultListener; @Override diff --git a/android/src/main/java/com/instabug/flutter/modules/InstabugApi.java b/android/src/main/java/com/instabug/flutter/modules/InstabugApi.java index 47d8cd52e..1bc9f4798 100644 --- a/android/src/main/java/com/instabug/flutter/modules/InstabugApi.java +++ b/android/src/main/java/com/instabug/flutter/modules/InstabugApi.java @@ -135,6 +135,7 @@ public void init(@NonNull String token, @NonNull List invocationEvents, @Override public void initHybridMode() { + setCurrentPlatform(); Instabug.setScreenshotProvider(screenshotProvider); } @@ -517,10 +518,10 @@ public void willRedirectToStore() { @Override public void setNetworkLogBodyEnabled(@NonNull Boolean isEnabled) { -// try { + try { // Instabug.setNetworkLogBodyEnabled(isEnabled); -// } catch (Exception e) { -// e.printStackTrace(); -// } + } catch (Exception e) { + e.printStackTrace(); + } } } diff --git a/android/src/main/java/com/instabug/flutter/util/InstabugHybirdUtils.java b/android/src/main/java/com/instabug/flutter/util/InstabugHybirdUtils.java new file mode 100644 index 000000000..692bcfb82 --- /dev/null +++ b/android/src/main/java/com/instabug/flutter/util/InstabugHybirdUtils.java @@ -0,0 +1,21 @@ +package com.instabug.flutter.util; + +import android.app.Activity; +import android.content.Intent; + +import com.instabug.flutter.InstabugFlutterPlugin; +import com.instabug.flutter.generated.InstabugFlutterPigeon; + +public class InstabugHybirdUtils { + + public static void startFlutterScreen(Activity activity, Intent intent) { + activity.startActivityForResult(intent, 1000); + InstabugFlutterPlugin.instabugFlutterApi.reportLastScreenChange(new InstabugFlutterPigeon.InstabugFlutterApi.Reply() { + @Override + public void reply(Void reply) { + + } + }); + + } +} From a74a5d759659081beb8616b910d9e95fb307f379 Mon Sep 17 00:00:00 2001 From: Ahmed alaa Date: Wed, 30 Apr 2025 16:28:25 +0300 Subject: [PATCH 3/7] feat : add extra logs --- .../instabug/flutter/InstabugFlutterPlugin.java | 6 +++--- .../instabug/flutter/util/InstabugHybirdUtils.java | 14 ++++++++++++-- .../InstabugExampleMethodCallHandler.kt | 6 +++++- lib/src/utils/hybrid_utils.dart | 2 ++ lib/src/utils/instabug_navigator_observer.dart | 2 ++ 5 files changed, 24 insertions(+), 6 deletions(-) diff --git a/android/src/main/java/com/instabug/flutter/InstabugFlutterPlugin.java b/android/src/main/java/com/instabug/flutter/InstabugFlutterPlugin.java index b7c20e95c..523996049 100644 --- a/android/src/main/java/com/instabug/flutter/InstabugFlutterPlugin.java +++ b/android/src/main/java/com/instabug/flutter/InstabugFlutterPlugin.java @@ -35,8 +35,7 @@ public class InstabugFlutterPlugin implements FlutterPlugin, ActivityAware { private static final String TAG = InstabugFlutterPlugin.class.getName(); - @SuppressLint("StaticFieldLeak") - private static Activity activity; + private Activity activity; public static InstabugFlutterPigeon.InstabugFlutterApi instabugFlutterApi; PluginRegistry.ActivityResultListener resultListener; @@ -56,6 +55,7 @@ public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) { activity = binding.getActivity(); initOnActivityResultListener(binding); + } private void initOnActivityResultListener(@NonNull ActivityPluginBinding binding) { @@ -124,7 +124,7 @@ public Bitmap call() { } @Nullable - private static Bitmap takeScreenshot(FlutterRenderer renderer) { + private Bitmap takeScreenshot(FlutterRenderer renderer) { try { final View view = activity.getWindow().getDecorView().getRootView(); diff --git a/android/src/main/java/com/instabug/flutter/util/InstabugHybirdUtils.java b/android/src/main/java/com/instabug/flutter/util/InstabugHybirdUtils.java index 692bcfb82..b9cbce160 100644 --- a/android/src/main/java/com/instabug/flutter/util/InstabugHybirdUtils.java +++ b/android/src/main/java/com/instabug/flutter/util/InstabugHybirdUtils.java @@ -2,20 +2,30 @@ import android.app.Activity; import android.content.Intent; +import android.os.Handler; +import android.os.Looper; import com.instabug.flutter.InstabugFlutterPlugin; import com.instabug.flutter.generated.InstabugFlutterPigeon; + public class InstabugHybirdUtils { public static void startFlutterScreen(Activity activity, Intent intent) { activity.startActivityForResult(intent, 1000); - InstabugFlutterPlugin.instabugFlutterApi.reportLastScreenChange(new InstabugFlutterPigeon.InstabugFlutterApi.Reply() { + android.os.Handler handler = new Handler(Looper.getMainLooper()); + ThreadManager.runOnMainThread(new Runnable() { @Override - public void reply(Void reply) { + public void run() { + InstabugFlutterPlugin.instabugFlutterApi.reportLastScreenChange(new InstabugFlutterPigeon.InstabugFlutterApi.Reply() { + @Override + public void reply(Void reply) { + } + }); } }); + } } diff --git a/example/android/app/src/main/kotlin/com/example/InstabugSample/InstabugExampleMethodCallHandler.kt b/example/android/app/src/main/kotlin/com/example/InstabugSample/InstabugExampleMethodCallHandler.kt index 17a7d35c6..a64f0df45 100644 --- a/example/android/app/src/main/kotlin/com/example/InstabugSample/InstabugExampleMethodCallHandler.kt +++ b/example/android/app/src/main/kotlin/com/example/InstabugSample/InstabugExampleMethodCallHandler.kt @@ -7,7 +7,7 @@ import com.instabug.crash.models.IBGNonFatalException import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel -class InstabugExampleMethodCallHandler : MethodChannel.MethodCallHandler { +class InstabugExampleMethodCallHandler(val activity:Activity) : MethodChannel.MethodCallHandler { override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { when (call.method) { @@ -22,6 +22,10 @@ class InstabugExampleMethodCallHandler : MethodChannel.MethodCallHandler { sendNativeFatalCrash() result.success(null) } + "ahmed" -> { + com.instabug.flutter.util.InstabugHybirdUtils.startFlutterScreen(activity,android.content.Intent(activity,activity)) + result.success(null) + } SEND_NATIVE_FATAL_HANG -> { Log.d(TAG, "Sending native fatal hang for 3000 ms") sendANR() diff --git a/lib/src/utils/hybrid_utils.dart b/lib/src/utils/hybrid_utils.dart index dc6f70952..ae6024a67 100644 --- a/lib/src/utils/hybrid_utils.dart +++ b/lib/src/utils/hybrid_utils.dart @@ -1,3 +1,4 @@ + import 'package:instabug_flutter/src/generated/instabug_flutter.api.g.dart'; import 'package:instabug_flutter/src/utils/instabug_navigator_observer.dart'; @@ -19,6 +20,7 @@ class HybridUtils implements InstabugFlutterApi { @override void reportLastScreenChange() { + print("reportLastScreenChange2"); InstabugNavigatorObserver.reportLastScreenChange(); } diff --git a/lib/src/utils/instabug_navigator_observer.dart b/lib/src/utils/instabug_navigator_observer.dart index 207eb071e..4fac73fbf 100644 --- a/lib/src/utils/instabug_navigator_observer.dart +++ b/lib/src/utils/instabug_navigator_observer.dart @@ -14,6 +14,8 @@ class InstabugNavigatorObserver extends NavigatorObserver { static void screenChanged(Route newRoute) { try { + + print("screenChanged"); lastRoute = newRoute; final rawScreenName = newRoute.settings.name.toString().trim(); final screenName = rawScreenName.isEmpty From f1462567b3823467fb488d78aac765c4fda4f8d5 Mon Sep 17 00:00:00 2001 From: Ahmed alaa Date: Thu, 1 May 2025 19:04:23 +0300 Subject: [PATCH 4/7] support hybrid mode --- analysis_options.yaml | 2 +- .../flutter/InstabugFlutterPlugin.java | 134 +++++++++++++----- .../instabug/flutter/modules/InstabugApi.java | 21 ++- .../flutter/util/InstabugHybirdUtils.java | 31 ---- .../InstabugExampleMethodCallHandler.kt | 6 +- lib/src/modules/instabug.dart | 4 - lib/src/utils/hybrid_utils.dart | 28 ---- .../utils/instabug_navigator_observer.dart | 20 +-- pigeons/instabug_flutter.api.dart | 6 - 9 files changed, 118 insertions(+), 134 deletions(-) delete mode 100644 android/src/main/java/com/instabug/flutter/util/InstabugHybirdUtils.java delete mode 100644 lib/src/utils/hybrid_utils.dart delete mode 100644 pigeons/instabug_flutter.api.dart diff --git a/analysis_options.yaml b/analysis_options.yaml index 9e956095e..b41eb7034 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -2,7 +2,7 @@ include: package:lint/analysis_options_package.yaml analyzer: exclude: - - "example/**" +# - "example/**" - "**/*.g.dart" linter: diff --git a/android/src/main/java/com/instabug/flutter/InstabugFlutterPlugin.java b/android/src/main/java/com/instabug/flutter/InstabugFlutterPlugin.java index 523996049..ae6ed5cfe 100644 --- a/android/src/main/java/com/instabug/flutter/InstabugFlutterPlugin.java +++ b/android/src/main/java/com/instabug/flutter/InstabugFlutterPlugin.java @@ -1,10 +1,11 @@ package com.instabug.flutter; -import android.annotation.SuppressLint; import android.app.Activity; +import android.app.Application; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; +import android.nfc.Tag; import android.os.Bundle; import android.util.Log; import android.view.View; @@ -22,9 +23,11 @@ import com.instabug.flutter.modules.RepliesApi; import com.instabug.flutter.modules.SessionReplayApi; import com.instabug.flutter.modules.SurveysApi; +import com.instabug.flutter.util.ThreadManager; import java.util.concurrent.Callable; +import io.flutter.embedding.engine.FlutterEngine; import io.flutter.embedding.engine.plugins.FlutterPlugin; import io.flutter.embedding.engine.plugins.activity.ActivityAware; import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; @@ -35,10 +38,74 @@ public class InstabugFlutterPlugin implements FlutterPlugin, ActivityAware { private static final String TAG = InstabugFlutterPlugin.class.getName(); - private Activity activity; + private Activity flutterActivity; + + public InstabugFlutterPigeon.InstabugFlutterApi instabugFlutterApi; + + Application.ActivityLifecycleCallbacks callbacks = new Application.ActivityLifecycleCallbacks() { + @Override + public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) { + if (activity == flutterActivity) { + Log.v(TAG, "onActivityCreated"); + } + } + + @Override + public void onActivityStarted(@NonNull Activity activity) { + + if (activity == flutterActivity) { + Log.v(TAG, "onActivityStarted"); + ThreadManager.runOnMainThread(new Runnable() { + @Override + public void run() { + try { + if (instabugApi != null) { + instabugApi.reportLastScreenChange(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + + } + + } + + @Override + public void onActivityResumed(@NonNull Activity activity) { + + } + + + @Override + public void onActivityPaused(@NonNull Activity activity) { + if (activity == flutterActivity) { + Log.v(TAG, "onActivityPaused"); + } + } + + @Override + public void onActivityStopped(@NonNull Activity activity) { + if (activity == flutterActivity) { + Log.v(TAG, "onActivityStopped"); + } + + } + + @Override + public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) { + + } + + @Override + public void onActivityDestroyed(@NonNull Activity activity) { + + } + }; - public static InstabugFlutterPigeon.InstabugFlutterApi instabugFlutterApi; PluginRegistry.ActivityResultListener resultListener; + private InstabugApi instabugApi; @Override public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { @@ -47,59 +114,58 @@ public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { @Override public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { - activity = null; + flutterActivity = null; } @Override public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) { - activity = binding.getActivity(); + flutterActivity = binding.getActivity(); initOnActivityResultListener(binding); - - } private void initOnActivityResultListener(@NonNull ActivityPluginBinding binding) { - if(resultListener!=null) { - binding.removeActivityResultListener(resultListener); - } - - resultListener = new PluginRegistry.ActivityResultListener() { - @Override - public boolean onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { - if (instabugFlutterApi != null) { - instabugFlutterApi.reportLastScreenChange(new InstabugFlutterPigeon.InstabugFlutterApi.Reply() { - @Override - public void reply(Void reply) { - - } - }); - } - - - return false; - } - }; - - binding.addActivityResultListener(resultListener); + Application app = flutterActivity.getApplication(); + + app.unregisterActivityLifecycleCallbacks(callbacks); + app.registerActivityLifecycleCallbacks(callbacks); + +// if (resultListener != null) { +// binding.removeActivityResultListener(resultListener); +// } + +// resultListener = new PluginRegistry.ActivityResultListener() { +// @Override +// public boolean onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { +// Log.v(TAG, "onActivityResult"); +// +// +// +// +// return false; +// } +// }; +// +// +// binding.addActivityResultListener(resultListener); } @Override public void onDetachedFromActivityForConfigChanges() { - activity = null; + flutterActivity = null; } @Override public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) { - activity = binding.getActivity(); + flutterActivity = binding.getActivity(); initOnActivityResultListener(binding); } @Override public void onDetachedFromActivity() { - activity = null; + flutterActivity = null; } private void register(Context context, BinaryMessenger messenger, FlutterRenderer renderer) { @@ -114,7 +180,7 @@ public Bitmap call() { BugReportingApi.init(messenger); CrashReportingApi.init(messenger); FeatureRequestsApi.init(messenger); - InstabugApi.init(messenger, context, screenshotProvider); + instabugApi = InstabugApi.init(messenger, context, screenshotProvider); InstabugLogApi.init(messenger); RepliesApi.init(messenger); SessionReplayApi.init(messenger); @@ -126,7 +192,7 @@ public Bitmap call() { @Nullable private Bitmap takeScreenshot(FlutterRenderer renderer) { try { - final View view = activity.getWindow().getDecorView().getRootView(); + final View view = flutterActivity.getWindow().getDecorView().getRootView(); view.setDrawingCacheEnabled(true); final Bitmap bitmap = renderer.getBitmap(); diff --git a/android/src/main/java/com/instabug/flutter/modules/InstabugApi.java b/android/src/main/java/com/instabug/flutter/modules/InstabugApi.java index 1bc9f4798..6bd6c876e 100644 --- a/android/src/main/java/com/instabug/flutter/modules/InstabugApi.java +++ b/android/src/main/java/com/instabug/flutter/modules/InstabugApi.java @@ -59,6 +59,8 @@ public class InstabugApi implements InstabugPigeon.InstabugHostApi { private final InstabugPigeon.FeatureFlagsFlutterApi featureFlagsFlutterApi; + private String lastScreenChanged = null; + public static InstabugApi init(BinaryMessenger messenger, Context context, Callable screenshotProvider) { final InstabugPigeon.FeatureFlagsFlutterApi flutterApi = new InstabugPigeon.FeatureFlagsFlutterApi(messenger); @@ -107,9 +109,7 @@ public Boolean isEnabled() { @NotNull @Override - public Boolean isBuilt() { - return Instabug.isBuilt(); - } + public Boolean isBuilt() { return Instabug.isBuilt(); } @Override public void init(@NonNull String token, @NonNull List invocationEvents, @NonNull String debugLogsLevel) { @@ -369,6 +369,7 @@ public void setReproStepsConfig(@Nullable String bugMode, @Nullable String crash @Override public void reportScreenChange(@NonNull String screenName) { try { + lastScreenChanged=screenName; Method method = Reflection.getMethod(Class.forName("com.instabug.library.Instabug"), "reportScreenChange", Bitmap.class, String.class); if (method != null) { @@ -385,6 +386,12 @@ public void reportScreenChange(@NonNull String screenName) { } } + public void reportLastScreenChange(){ + if(lastScreenChanged!=null){ + reportScreenChange(lastScreenChanged); + } + } + @VisibleForTesting public Bitmap getBitmapForAsset(String assetName) { try { @@ -518,10 +525,10 @@ public void willRedirectToStore() { @Override public void setNetworkLogBodyEnabled(@NonNull Boolean isEnabled) { - try { + try { // Instabug.setNetworkLogBodyEnabled(isEnabled); - } catch (Exception e) { - e.printStackTrace(); - } + } catch (Exception e) { + e.printStackTrace(); + } } } diff --git a/android/src/main/java/com/instabug/flutter/util/InstabugHybirdUtils.java b/android/src/main/java/com/instabug/flutter/util/InstabugHybirdUtils.java deleted file mode 100644 index b9cbce160..000000000 --- a/android/src/main/java/com/instabug/flutter/util/InstabugHybirdUtils.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.instabug.flutter.util; - -import android.app.Activity; -import android.content.Intent; -import android.os.Handler; -import android.os.Looper; - -import com.instabug.flutter.InstabugFlutterPlugin; -import com.instabug.flutter.generated.InstabugFlutterPigeon; - - -public class InstabugHybirdUtils { - - public static void startFlutterScreen(Activity activity, Intent intent) { - activity.startActivityForResult(intent, 1000); - android.os.Handler handler = new Handler(Looper.getMainLooper()); - ThreadManager.runOnMainThread(new Runnable() { - @Override - public void run() { - InstabugFlutterPlugin.instabugFlutterApi.reportLastScreenChange(new InstabugFlutterPigeon.InstabugFlutterApi.Reply() { - @Override - public void reply(Void reply) { - - } - }); - } - }); - - - } -} diff --git a/example/android/app/src/main/kotlin/com/example/InstabugSample/InstabugExampleMethodCallHandler.kt b/example/android/app/src/main/kotlin/com/example/InstabugSample/InstabugExampleMethodCallHandler.kt index a64f0df45..17a7d35c6 100644 --- a/example/android/app/src/main/kotlin/com/example/InstabugSample/InstabugExampleMethodCallHandler.kt +++ b/example/android/app/src/main/kotlin/com/example/InstabugSample/InstabugExampleMethodCallHandler.kt @@ -7,7 +7,7 @@ import com.instabug.crash.models.IBGNonFatalException import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel -class InstabugExampleMethodCallHandler(val activity:Activity) : MethodChannel.MethodCallHandler { +class InstabugExampleMethodCallHandler : MethodChannel.MethodCallHandler { override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { when (call.method) { @@ -22,10 +22,6 @@ class InstabugExampleMethodCallHandler(val activity:Activity) : MethodChannel.Me sendNativeFatalCrash() result.success(null) } - "ahmed" -> { - com.instabug.flutter.util.InstabugHybirdUtils.startFlutterScreen(activity,android.content.Intent(activity,activity)) - result.success(null) - } SEND_NATIVE_FATAL_HANG -> { Log.d(TAG, "Sending native fatal hang for 3000 ms") sendANR() diff --git a/lib/src/modules/instabug.dart b/lib/src/modules/instabug.dart index c6e36f6df..b005760ab 100644 --- a/lib/src/modules/instabug.dart +++ b/lib/src/modules/instabug.dart @@ -1,7 +1,6 @@ // ignore_for_file: avoid_classes_with_only_static_members import 'dart:async'; -import 'dart:io'; // to maintain supported versions prior to Flutter 3.3 // ignore: unnecessary_import @@ -12,13 +11,11 @@ import 'dart:typed_data'; import 'dart:ui'; import 'package:flutter/material.dart'; - // to maintain supported versions prior to Flutter 3.3 // ignore: unused_import import 'package:flutter/services.dart'; import 'package:instabug_flutter/instabug_flutter.dart'; import 'package:instabug_flutter/src/generated/instabug.api.g.dart'; -import 'package:instabug_flutter/src/utils/hybrid_utils.dart'; import 'package:instabug_flutter/src/utils/enum_converter.dart'; import 'package:instabug_flutter/src/utils/feature_flags_manager.dart'; import 'package:instabug_flutter/src/utils/ibg_build_info.dart'; @@ -156,7 +153,6 @@ class Instabug { BugReporting.$setup(); Replies.$setup(); Surveys.$setup(); - HybridUtils.$setup(); } /// @nodoc diff --git a/lib/src/utils/hybrid_utils.dart b/lib/src/utils/hybrid_utils.dart deleted file mode 100644 index ae6024a67..000000000 --- a/lib/src/utils/hybrid_utils.dart +++ /dev/null @@ -1,28 +0,0 @@ - -import 'package:instabug_flutter/src/generated/instabug_flutter.api.g.dart'; -import 'package:instabug_flutter/src/utils/instabug_navigator_observer.dart'; - -class HybridUtils implements InstabugFlutterApi { - - // Access the singleton instance - factory HybridUtils() { - return _instance; - } - // Private constructor to prevent instantiation from outside the class - HybridUtils._(); - - // Singleton instance - static final HybridUtils _instance = HybridUtils._(); - - static void $setup(){ - InstabugFlutterApi.setup(_instance); // Use 'this' instead of _instance - } - - @override - void reportLastScreenChange() { - print("reportLastScreenChange2"); - InstabugNavigatorObserver.reportLastScreenChange(); - } - - -} diff --git a/lib/src/utils/instabug_navigator_observer.dart b/lib/src/utils/instabug_navigator_observer.dart index 4fac73fbf..d9d6b02db 100644 --- a/lib/src/utils/instabug_navigator_observer.dart +++ b/lib/src/utils/instabug_navigator_observer.dart @@ -8,15 +8,10 @@ import 'package:instabug_flutter/src/utils/screen_loading/screen_loading_manager import 'package:instabug_flutter/src/utils/screen_name_masker.dart'; class InstabugNavigatorObserver extends NavigatorObserver { - static final List _steps = []; + final List _steps = []; - static Route? lastRoute; - - static void screenChanged(Route newRoute) { + void screenChanged(Route newRoute) { try { - - print("screenChanged"); - lastRoute = newRoute; final rawScreenName = newRoute.settings.name.toString().trim(); final screenName = rawScreenName.isEmpty ? ReproStepsConstants.emptyScreenFallback @@ -63,15 +58,4 @@ class InstabugNavigatorObserver extends NavigatorObserver { void didPush(Route route, Route? previousRoute) { screenChanged(route); } - - static void reportLastScreenChange() { - print("Called reportLastScreenChange"); - - if (lastRoute != null) { - print( - "Called reportLastScreenChange screenChanged ${lastRoute!.settings.name}"); - - screenChanged(lastRoute!); - } - } } diff --git a/pigeons/instabug_flutter.api.dart b/pigeons/instabug_flutter.api.dart deleted file mode 100644 index e729b9440..000000000 --- a/pigeons/instabug_flutter.api.dart +++ /dev/null @@ -1,6 +0,0 @@ -import 'package:pigeon/pigeon.dart'; - -@FlutterApi() -abstract class InstabugFlutterApi { - void reportLastScreenChange(); -} \ No newline at end of file From 7b6874856267c65cdfc34dcacec13c305ed8060b Mon Sep 17 00:00:00 2001 From: Ahmed alaa Date: Thu, 1 May 2025 19:36:34 +0300 Subject: [PATCH 5/7] feat: support hybrid mode --- analysis_options.yaml | 2 +- .../flutter/InstabugFlutterPlugin.java | 50 +++++-------------- .../instabug/flutter/modules/InstabugApi.java | 4 +- 3 files changed, 15 insertions(+), 41 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index b41eb7034..9e956095e 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -2,7 +2,7 @@ include: package:lint/analysis_options_package.yaml analyzer: exclude: -# - "example/**" + - "example/**" - "**/*.g.dart" linter: diff --git a/android/src/main/java/com/instabug/flutter/InstabugFlutterPlugin.java b/android/src/main/java/com/instabug/flutter/InstabugFlutterPlugin.java index ae6ed5cfe..d7bef0928 100644 --- a/android/src/main/java/com/instabug/flutter/InstabugFlutterPlugin.java +++ b/android/src/main/java/com/instabug/flutter/InstabugFlutterPlugin.java @@ -3,9 +3,7 @@ import android.app.Activity; import android.app.Application; import android.content.Context; -import android.content.Intent; import android.graphics.Bitmap; -import android.nfc.Tag; import android.os.Bundle; import android.util.Log; import android.view.View; @@ -27,13 +25,11 @@ import java.util.concurrent.Callable; -import io.flutter.embedding.engine.FlutterEngine; import io.flutter.embedding.engine.plugins.FlutterPlugin; import io.flutter.embedding.engine.plugins.activity.ActivityAware; import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; import io.flutter.embedding.engine.renderer.FlutterRenderer; import io.flutter.plugin.common.BinaryMessenger; -import io.flutter.plugin.common.PluginRegistry; public class InstabugFlutterPlugin implements FlutterPlugin, ActivityAware { private static final String TAG = InstabugFlutterPlugin.class.getName(); @@ -42,17 +38,21 @@ public class InstabugFlutterPlugin implements FlutterPlugin, ActivityAware { public InstabugFlutterPigeon.InstabugFlutterApi instabugFlutterApi; + private boolean isLastScreenInstabug = false; Application.ActivityLifecycleCallbacks callbacks = new Application.ActivityLifecycleCallbacks() { @Override public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) { - if (activity == flutterActivity) { - Log.v(TAG, "onActivityCreated"); - } + } @Override public void onActivityStarted(@NonNull Activity activity) { + if (isLastScreenInstabug) { + isLastScreenInstabug = false; + return; + } + isLastScreenInstabug = activity.getComponentName().getClassName().contains("com.instabug."); if (activity == flutterActivity) { Log.v(TAG, "onActivityStarted"); ThreadManager.runOnMainThread(new Runnable() { @@ -80,16 +80,12 @@ public void onActivityResumed(@NonNull Activity activity) { @Override public void onActivityPaused(@NonNull Activity activity) { - if (activity == flutterActivity) { - Log.v(TAG, "onActivityPaused"); - } + } @Override public void onActivityStopped(@NonNull Activity activity) { - if (activity == flutterActivity) { - Log.v(TAG, "onActivityStopped"); - } + } @@ -104,7 +100,6 @@ public void onActivityDestroyed(@NonNull Activity activity) { } }; - PluginRegistry.ActivityResultListener resultListener; private InstabugApi instabugApi; @Override @@ -120,34 +115,13 @@ public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { @Override public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) { flutterActivity = binding.getActivity(); - initOnActivityResultListener(binding); + initOnActivityResultListener(); } - private void initOnActivityResultListener(@NonNull ActivityPluginBinding binding) { - + private void initOnActivityResultListener() { Application app = flutterActivity.getApplication(); - app.unregisterActivityLifecycleCallbacks(callbacks); app.registerActivityLifecycleCallbacks(callbacks); - -// if (resultListener != null) { -// binding.removeActivityResultListener(resultListener); -// } - -// resultListener = new PluginRegistry.ActivityResultListener() { -// @Override -// public boolean onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { -// Log.v(TAG, "onActivityResult"); -// -// -// -// -// return false; -// } -// }; -// -// -// binding.addActivityResultListener(resultListener); } @@ -160,7 +134,7 @@ public void onDetachedFromActivityForConfigChanges() { @Override public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) { flutterActivity = binding.getActivity(); - initOnActivityResultListener(binding); + initOnActivityResultListener(); } @Override diff --git a/android/src/main/java/com/instabug/flutter/modules/InstabugApi.java b/android/src/main/java/com/instabug/flutter/modules/InstabugApi.java index 6bd6c876e..887923e29 100644 --- a/android/src/main/java/com/instabug/flutter/modules/InstabugApi.java +++ b/android/src/main/java/com/instabug/flutter/modules/InstabugApi.java @@ -369,7 +369,7 @@ public void setReproStepsConfig(@Nullable String bugMode, @Nullable String crash @Override public void reportScreenChange(@NonNull String screenName) { try { - lastScreenChanged=screenName; + lastScreenChanged = screenName; Method method = Reflection.getMethod(Class.forName("com.instabug.library.Instabug"), "reportScreenChange", Bitmap.class, String.class); if (method != null) { @@ -387,7 +387,7 @@ public void reportScreenChange(@NonNull String screenName) { } public void reportLastScreenChange(){ - if(lastScreenChanged!=null){ + if(lastScreenChanged != null){ reportScreenChange(lastScreenChanged); } } From ccab5f6753392260f977ca86b574ab63d35e9a64 Mon Sep 17 00:00:00 2001 From: Ahmed alaa Date: Thu, 1 May 2025 19:38:10 +0300 Subject: [PATCH 6/7] feat: support hybrid mode --- .../main/java/com/instabug/flutter/InstabugFlutterPlugin.java | 1 - 1 file changed, 1 deletion(-) diff --git a/android/src/main/java/com/instabug/flutter/InstabugFlutterPlugin.java b/android/src/main/java/com/instabug/flutter/InstabugFlutterPlugin.java index d7bef0928..dc1cdd726 100644 --- a/android/src/main/java/com/instabug/flutter/InstabugFlutterPlugin.java +++ b/android/src/main/java/com/instabug/flutter/InstabugFlutterPlugin.java @@ -54,7 +54,6 @@ public void onActivityStarted(@NonNull Activity activity) { isLastScreenInstabug = activity.getComponentName().getClassName().contains("com.instabug."); if (activity == flutterActivity) { - Log.v(TAG, "onActivityStarted"); ThreadManager.runOnMainThread(new Runnable() { @Override public void run() { From b33e4cfcff72d25f28be2885cdd85d1abf6a5ffd Mon Sep 17 00:00:00 2001 From: Ahmed alaa Date: Tue, 6 May 2025 11:16:13 +0300 Subject: [PATCH 7/7] feat: support hybrid mode --- example/lib/main.dart | 1 + scripts/pigeon.sh | 0 2 files changed, 1 insertion(+) mode change 100644 => 100755 scripts/pigeon.sh diff --git a/example/lib/main.dart b/example/lib/main.dart index 91b0a67e7..0c4308203 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -56,6 +56,7 @@ void main() { FlutterError.onError = (FlutterErrorDetails details) { Zone.current.handleUncaughtError(details.exception, details.stack!); }; + Instabug.initializeHybridMode() runApp(const MyApp()); }, diff --git a/scripts/pigeon.sh b/scripts/pigeon.sh old mode 100644 new mode 100755