Skip to content

feat: support hybrid apps #575

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 7 commits into
base: dev
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
102 changes: 90 additions & 12 deletions android/src/main/java/com/instabug/flutter/InstabugFlutterPlugin.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
package com.instabug.flutter;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

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;
Expand All @@ -19,6 +21,7 @@
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;

Expand All @@ -31,9 +34,72 @@
public class InstabugFlutterPlugin implements FlutterPlugin, ActivityAware {
private static final String TAG = InstabugFlutterPlugin.class.getName();

@SuppressLint("StaticFieldLeak")
private static Activity activity;
private Activity flutterActivity;

public InstabugFlutterPigeon.InstabugFlutterApi instabugFlutterApi;

private boolean isLastScreenInstabug = false;
Application.ActivityLifecycleCallbacks callbacks = new Application.ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {

}

@Override
public void onActivityStarted(@NonNull Activity activity) {
if (isLastScreenInstabug) {
isLastScreenInstabug = false;
return;
}

isLastScreenInstabug = activity.getComponentName().getClassName().contains("com.instabug.");
if (activity == flutterActivity) {
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) {

}

@Override
public void onActivityStopped(@NonNull Activity activity) {


}

@Override
public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {

}

@Override
public void onActivityDestroyed(@NonNull Activity activity) {

}
};

private InstabugApi instabugApi;

@Override
public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
Expand All @@ -42,30 +108,40 @@ 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();
}

private void initOnActivityResultListener() {
Application app = flutterActivity.getApplication();
app.unregisterActivityLifecycleCallbacks(callbacks);
app.registerActivityLifecycleCallbacks(callbacks);
}


@Override
public void onDetachedFromActivityForConfigChanges() {
activity = null;
flutterActivity = null;

}

@Override
public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) {
activity = binding.getActivity();
flutterActivity = binding.getActivity();
initOnActivityResultListener();
}

@Override
public void onDetachedFromActivity() {
activity = null;
flutterActivity = null;
}

private static void register(Context context, BinaryMessenger messenger, FlutterRenderer renderer) {
private void register(Context context, BinaryMessenger messenger, FlutterRenderer renderer) {
final Callable<Bitmap> screenshotProvider = new Callable<Bitmap>() {
@Override
public Bitmap call() {
Expand All @@ -77,17 +153,19 @@ 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);
SurveysApi.init(messenger);
instabugFlutterApi = new InstabugFlutterPigeon.InstabugFlutterApi(messenger);

}

@Nullable
private static Bitmap takeScreenshot(FlutterRenderer renderer) {
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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;

Expand All @@ -55,11 +59,14 @@ public class InstabugApi implements InstabugPigeon.InstabugHostApi {

private final InstabugPigeon.FeatureFlagsFlutterApi featureFlagsFlutterApi;

public static void init(BinaryMessenger messenger, Context context, Callable<Bitmap> screenshotProvider) {
private String lastScreenChanged = null;

public static InstabugApi init(BinaryMessenger messenger, Context context, Callable<Bitmap> 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<Bitmap> screenshotProvider, InstabugPigeon.FeatureFlagsFlutterApi featureFlagsFlutterApi) {
Expand Down Expand Up @@ -122,7 +129,15 @@ public void init(@NonNull String token, @NonNull List<String> invocationEvents,
.setSdkDebugLogsLevel(parsedLogLevel)
.build();

initHybridMode();

}

@Override
public void initHybridMode() {
setCurrentPlatform();
Instabug.setScreenshotProvider(screenshotProvider);

}

@Override
Expand Down Expand Up @@ -354,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) {
Expand All @@ -370,6 +386,12 @@ public void reportScreenChange(@NonNull String screenName) {
}
}

public void reportLastScreenChange(){
if(lastScreenChanged != null){
reportScreenChange(lastScreenChanged);
}
}

@VisibleForTesting
public Bitmap getBitmapForAsset(String assetName) {
try {
Expand Down Expand Up @@ -500,13 +522,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();
}
}
}
2 changes: 1 addition & 1 deletion example/ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS:
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
Instabug: 97a4e694731f46bbc02dbe49ab29cc552c5e2f41
instabug_flutter: 4e4a9b162d77d5624d08ccdf81745d923745e062
instabug_flutter: ef9cb6bf3c9dd29b1e4bf3129a16dcbcb2d332e6
OCMock: 5ea90566be239f179ba766fd9fbae5885040b992

PODFILE CHECKSUM: 8f7552fd115ace1988c3db54a69e4a123c448f84
Expand Down
1 change: 1 addition & 0 deletions example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ void main() {
FlutterError.onError = (FlutterErrorDetails details) {
Zone.current.handleUncaughtError(details.exception, details.stack!);
};
Instabug.initializeHybridMode()

runApp(const MyApp());
},
Expand Down
Loading