Skip to content

Commit 20356c0

Browse files
Merge remote-tracking branch 'refs/remotes/origin/refactor/monorepo' into refactor/monorepo-dio-package
# Conflicts: # packages/instabug_flutter/example/android/app/build.gradle # scripts/init.sh
2 parents ea35739 + 4bbafb0 commit 20356c0

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+1091
-74
lines changed

packages/instabug_flutter/CHANGELOG.md

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
# Changelog
22

3-
## [Unreleased](https://github.com/Instabug/Instabug-Flutter/compare/v13.4.0...dev)
3+
## [14.0.0](https://github.com/Instabug/Instabug-Flutter/compare/v13.4.0...v14.0.0) (November 11, 2024)
44

5-
### Changed
5+
### Added
66

7-
- Set the minimum Flutter SDK version to v2.10.0. ([#518](https://github.com/Instabug/Instabug-Flutter/pull/518))
7+
- Add support for tracing network requests from Instabug to services like Datadog and New Relic ([#481](https://github.com/Instabug/Instabug-Flutter/pull/481)).
8+
9+
### Changed
810

11+
- Bump Instabug Android SDK to v14.0.0 ([#532](https://github.com/Instabug/Instabug-Flutter/pull/532)). [See release notes](https://github.com/Instabug/Instabug-Android/releases/tag/v14.0.0).
12+
- Bump Instabug iOS SDK to v14.0.0 ([#532](https://github.com/Instabug/Instabug-Flutter/pull/532)). [See release notes](https://github.com/Instabug/Instabug-iOS/releases/tag/14.0.0),
913

1014
## [13.4.0](https://github.com/Instabug/Instabug-Flutter/compare/v13.3.0...v13.4.0) (September 29, 2024)
1115

packages/instabug_flutter/android/build.gradle

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
group 'com.instabug.flutter'
2-
version '13.4.0'
2+
version '14.0.0'
33

44
buildscript {
55
repositories {
@@ -22,7 +22,10 @@ rootProject.allprojects {
2222
apply plugin: 'com.android.library'
2323

2424
android {
25-
compileSdkVersion 28
25+
if (project.android.hasProperty("namespace")) {
26+
namespace "com.instabug.flutter"
27+
}
28+
compileSdkVersion 33
2629

2730
compileOptions {
2831
sourceCompatibility JavaVersion.VERSION_1_8
@@ -41,10 +44,11 @@ android {
4144
}
4245

4346
dependencies {
44-
api 'com.instabug.library:instabug:13.4.1'
45-
47+
api 'com.instabug.library:instabug:14.0.0'
4648
testImplementation 'junit:junit:4.13.2'
4749
testImplementation "org.mockito:mockito-inline:3.12.1"
50+
testImplementation "io.mockk:mockk:1.13.13"
51+
4852
}
4953

5054
// add upload_symbols task

packages/instabug_flutter/android/src/main/AndroidManifest.xml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
2-
package="com.instabug.flutter">
1+
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
32

43
<application>
54
<meta-data

packages/instabug_flutter/android/src/main/java/com/instabug/flutter/modules/ApmApi.java

Lines changed: 53 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,13 @@
1111
import com.instabug.apm.configuration.cp.FeatureAvailabilityCallback;
1212
import com.instabug.apm.model.ExecutionTrace;
1313
import com.instabug.apm.networking.APMNetworkLogger;
14+
import com.instabug.apm.networkinterception.cp.APMCPNetworkLog;
1415
import com.instabug.flutter.generated.ApmPigeon;
1516
import com.instabug.flutter.util.Reflection;
1617
import com.instabug.flutter.util.ThreadManager;
17-
import com.instabug.apm.networkinterception.cp.APMCPNetworkLog;
1818

1919
import io.flutter.plugin.common.BinaryMessenger;
2020

21-
import org.jetbrains.annotations.NotNull;
2221
import org.json.JSONObject;
2322

2423
import java.lang.reflect.Method;
@@ -210,18 +209,62 @@ public void networkLogAndroid(@NonNull Map<String, Object> data) {
210209
if (data.containsKey("serverErrorMessage")) {
211210
serverErrorMessage = (String) data.get("serverErrorMessage");
212211
}
212+
Boolean isW3cHeaderFound = null;
213+
Number partialId = null;
214+
Number networkStartTimeInSeconds = null;
215+
String w3CGeneratedHeader = null;
216+
String w3CCaughtHeader = null;
217+
218+
if (data.containsKey("isW3cHeaderFound")) {
219+
isW3cHeaderFound = (Boolean) data.get("isW3cHeaderFound");
220+
}
221+
222+
if (data.containsKey("partialId")) {
223+
224+
225+
partialId = ((Number) data.get("partialId"));
213226

214-
Method method = Reflection.getMethod(Class.forName("com.instabug.apm.networking.APMNetworkLogger"), "log", long.class, long.class, String.class, String.class, long.class, String.class, String.class, String.class, String.class, String.class, long.class, int.class, String.class, String.class, String.class, String.class, APMCPNetworkLog.W3CExternalTraceAttributes.class);
215-
if (method != null) {
216-
method.invoke(apmNetworkLogger, requestStartTime, requestDuration, requestHeaders, requestBody, requestBodySize, requestMethod, requestUrl, requestContentType, responseHeaders, responseBody, responseBodySize, statusCode, responseContentType, errorMessage, gqlQueryName, serverErrorMessage, null);
217-
} else {
218-
Log.e(TAG, "APMNetworkLogger.log was not found by reflection");
227+
}
228+
if (data.containsKey("networkStartTimeInSeconds")) {
229+
networkStartTimeInSeconds = ((Number) data.get("networkStartTimeInSeconds"));
219230
}
220231

221-
} catch (Exception e) {
222-
e.printStackTrace();
232+
if (data.containsKey("w3CGeneratedHeader")) {
233+
234+
w3CGeneratedHeader = (String) data.get("w3CGeneratedHeader");
235+
236+
237+
}
238+
if (data.containsKey("w3CCaughtHeader")) {
239+
w3CCaughtHeader = (String) data.get("w3CCaughtHeader");
240+
241+
}
242+
243+
244+
APMCPNetworkLog.W3CExternalTraceAttributes w3cExternalTraceAttributes =
245+
null;
246+
if (isW3cHeaderFound != null) {
247+
w3cExternalTraceAttributes = new APMCPNetworkLog.W3CExternalTraceAttributes(
248+
isW3cHeaderFound, partialId == null ? null : partialId.longValue(),
249+
networkStartTimeInSeconds == null ? null : networkStartTimeInSeconds.longValue(),
250+
w3CGeneratedHeader, w3CCaughtHeader
251+
252+
);
253+
}
254+
255+
Method method = Reflection.getMethod(Class.forName("com.instabug.apm.networking.APMNetworkLogger"), "log", long.class, long.class, String.class, String.class, long.class, String.class, String.class, String.class, String.class, String.class, long.class, int.class, String.class, String.class, String.class, String.class, APMCPNetworkLog.W3CExternalTraceAttributes.class);
256+
if (method != null) {
257+
method.invoke(apmNetworkLogger, requestStartTime, requestDuration, requestHeaders, requestBody, requestBodySize, requestMethod, requestUrl, requestContentType, responseHeaders, responseBody, responseBodySize, statusCode, responseContentType, errorMessage, gqlQueryName, serverErrorMessage, w3cExternalTraceAttributes);
258+
} else {
259+
Log.e(TAG, "APMNetworkLogger.log was not found by reflection");
260+
}
261+
262+
} catch(Exception e){
263+
e.printStackTrace();
264+
}
223265
}
224-
}
266+
267+
225268

226269

227270
@Override

packages/instabug_flutter/android/src/main/java/com/instabug/flutter/modules/InstabugApi.java

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
import com.instabug.flutter.util.ArgsRegistry;
1414
import com.instabug.flutter.util.Reflection;
1515
import com.instabug.flutter.util.ThreadManager;
16+
import com.instabug.library.internal.crossplatform.CoreFeature;
17+
import com.instabug.library.internal.crossplatform.CoreFeaturesState;
18+
import com.instabug.library.internal.crossplatform.FeaturesStateListener;
19+
import com.instabug.library.internal.crossplatform.InternalCore;
1620
import com.instabug.library.Feature;
1721
import com.instabug.library.Instabug;
1822
import com.instabug.library.InstabugColorTheme;
@@ -48,14 +52,19 @@ public class InstabugApi implements InstabugPigeon.InstabugHostApi {
4852
private final Callable<Bitmap> screenshotProvider;
4953
private final InstabugCustomTextPlaceHolder placeHolder = new InstabugCustomTextPlaceHolder();
5054

55+
private final InstabugPigeon.FeatureFlagsFlutterApi featureFlagsFlutterApi;
56+
5157
public static void init(BinaryMessenger messenger, Context context, Callable<Bitmap> screenshotProvider) {
52-
final InstabugApi api = new InstabugApi(context, screenshotProvider);
58+
final InstabugPigeon.FeatureFlagsFlutterApi flutterApi = new InstabugPigeon.FeatureFlagsFlutterApi(messenger);
59+
60+
final InstabugApi api = new InstabugApi(context, screenshotProvider, flutterApi);
5361
InstabugPigeon.InstabugHostApi.setup(messenger, api);
5462
}
5563

56-
public InstabugApi(Context context, Callable<Bitmap> screenshotProvider) {
64+
public InstabugApi(Context context, Callable<Bitmap> screenshotProvider, InstabugPigeon.FeatureFlagsFlutterApi featureFlagsFlutterApi) {
5765
this.context = context;
5866
this.screenshotProvider = screenshotProvider;
67+
this.featureFlagsFlutterApi = featureFlagsFlutterApi;
5968
}
6069

6170
@VisibleForTesting
@@ -437,6 +446,48 @@ public void networkLog(@NonNull Map<String, Object> data) {
437446
}
438447
}
439448

449+
@Override
450+
public void registerFeatureFlagChangeListener() {
451+
452+
try {
453+
InternalCore.INSTANCE._setFeaturesStateListener(new FeaturesStateListener() {
454+
@Override
455+
public void invoke(@NonNull CoreFeaturesState featuresState) {
456+
ThreadManager.runOnMainThread(new Runnable() {
457+
@Override
458+
public void run() {
459+
featureFlagsFlutterApi.onW3CFeatureFlagChange(featuresState.isW3CExternalTraceIdEnabled(),
460+
featuresState.isAttachingGeneratedHeaderEnabled(),
461+
featuresState.isAttachingCapturedHeaderEnabled(),
462+
new InstabugPigeon.FeatureFlagsFlutterApi.Reply<Void>() {
463+
@Override
464+
public void reply(Void reply) {
465+
466+
}
467+
});
468+
}
469+
});
470+
}
471+
472+
});
473+
} catch (Exception e) {
474+
e.printStackTrace();
475+
}
476+
477+
}
478+
479+
@NonNull
480+
@Override
481+
public Map<String, Boolean> isW3CFeatureFlagsEnabled() {
482+
Map<String, Boolean> params = new HashMap<String, Boolean>();
483+
params.put("isW3cExternalTraceIDEnabled", InternalCore.INSTANCE._isFeatureEnabled(CoreFeature.W3C_EXTERNAL_TRACE_ID));
484+
params.put("isW3cExternalGeneratedHeaderEnabled", InternalCore.INSTANCE._isFeatureEnabled(CoreFeature.W3C_ATTACHING_GENERATED_HEADER));
485+
params.put("isW3cCaughtHeaderEnabled", InternalCore.INSTANCE._isFeatureEnabled(CoreFeature.W3C_ATTACHING_CAPTURED_HEADER));
486+
487+
488+
return params;
489+
}
490+
440491
@Override
441492
public void willRedirectToStore() {
442493
Instabug.willRedirectToStore();

packages/instabug_flutter/android/src/test/java/com/instabug/flutter/ApmApiTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
11
package com.instabug.flutter;
22

3+
import static com.instabug.flutter.util.GlobalMocks.reflected;
4+
import static com.instabug.flutter.util.MockResult.makeResult;
5+
import static org.junit.Assert.assertEquals;
6+
import static org.mockito.ArgumentMatchers.any;
7+
import static org.mockito.ArgumentMatchers.anyInt;
8+
import static org.mockito.ArgumentMatchers.anyString;
9+
import static org.mockito.ArgumentMatchers.eq;
10+
import static org.mockito.Mockito.mock;
11+
import static org.mockito.Mockito.mockConstruction;
12+
import static org.mockito.Mockito.mockStatic;
13+
import static org.mockito.Mockito.verify;
14+
import static org.mockito.Mockito.when;
15+
316
import com.instabug.apm.APM;
417
import com.instabug.apm.InternalAPM;
518
import com.instabug.apm.configuration.cp.APMFeature;

packages/instabug_flutter/android/src/test/java/com/instabug/flutter/InstabugApiTest.java

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,16 @@
1717
import static org.mockito.Mockito.verify;
1818
import static org.mockito.Mockito.when;
1919

20+
import static io.mockk.MockKKt.every;
21+
import static io.mockk.MockKKt.mockkObject;
22+
23+
import io.mockk.*;
24+
2025
import android.app.Application;
2126
import android.graphics.Bitmap;
2227
import android.net.Uri;
2328

29+
import com.instabug.apm.InternalAPM;
2430
import com.instabug.bug.BugReporting;
2531
import com.instabug.flutter.generated.InstabugPigeon;
2632
import com.instabug.flutter.modules.InstabugApi;
@@ -36,9 +42,15 @@
3642
import com.instabug.library.ReproConfigurations;
3743
import com.instabug.library.ReproMode;
3844
import com.instabug.library.featuresflags.model.IBGFeatureFlag;
45+
import com.instabug.library.internal.crossplatform.CoreFeature;
46+
import com.instabug.library.internal.crossplatform.FeaturesStateListener;
47+
import com.instabug.library.internal.crossplatform.InternalCore;
48+
import com.instabug.library.featuresflags.model.IBGFeatureFlag;
3949
import com.instabug.library.invocation.InstabugInvocationEvent;
4050
import com.instabug.library.model.NetworkLog;
4151
import com.instabug.library.ui.onboarding.WelcomeMessage;
52+
import com.instabug.survey.Surveys;
53+
import com.instabug.survey.callbacks.OnShowCallback;
4254

4355
import org.json.JSONObject;
4456
import org.junit.After;
@@ -56,9 +68,16 @@
5668
import java.util.List;
5769
import java.util.Locale;
5870
import java.util.Map;
71+
import java.util.Random;
5972
import java.util.concurrent.Callable;
6073

6174
import io.flutter.plugin.common.BinaryMessenger;
75+
import kotlin.jvm.functions.Function1;
76+
77+
import org.mockito.Mockito;
78+
import org.mockito.invocation.InvocationOnMock;
79+
import org.mockito.stubbing.Answer;
80+
import org.mockito.verification.VerificationMode;
6281
import org.mockito.verification.VerificationMode;
6382

6483
public class InstabugApiTest {
@@ -69,11 +88,15 @@ public class InstabugApiTest {
6988
private MockedStatic<BugReporting> mBugReporting;
7089
private MockedConstruction<InstabugCustomTextPlaceHolder> mCustomTextPlaceHolder;
7190
private MockedStatic<InstabugPigeon.InstabugHostApi> mHostApi;
72-
91+
private InternalCore internalCore;
7392
@Before
7493
public void setUp() throws NoSuchMethodException {
7594
mCustomTextPlaceHolder = mockConstruction(InstabugCustomTextPlaceHolder.class);
76-
api = spy(new InstabugApi(mContext, screenshotProvider));
95+
internalCore=spy(InternalCore.INSTANCE);
96+
97+
BinaryMessenger mMessenger = mock(BinaryMessenger.class);
98+
final InstabugPigeon.FeatureFlagsFlutterApi flutterApi = new InstabugPigeon.FeatureFlagsFlutterApi(mMessenger);
99+
api = spy(new InstabugApi(mContext, screenshotProvider, flutterApi));
77100
mInstabug = mockStatic(Instabug.class);
78101
mBugReporting = mockStatic(BugReporting.class);
79102
mHostApi = mockStatic(InstabugPigeon.InstabugHostApi.class);
@@ -87,6 +110,7 @@ public void cleanUp() {
87110
mBugReporting.close();
88111
mHostApi.close();
89112
GlobalMocks.close();
113+
90114
}
91115

92116
@Test
@@ -349,11 +373,11 @@ public void testClearAllExperiments() {
349373

350374
@Test
351375
public void testAddFeatureFlags() {
352-
Map<String,String > featureFlags = new HashMap<>();
353-
featureFlags.put("key1","variant1");
376+
Map<String, String> featureFlags = new HashMap<>();
377+
featureFlags.put("key1", "variant1");
354378
api.addFeatureFlags(featureFlags);
355-
List<IBGFeatureFlag> flags=new ArrayList<IBGFeatureFlag>();
356-
flags.add(new IBGFeatureFlag("key1","variant1"));
379+
List<IBGFeatureFlag> flags = new ArrayList<IBGFeatureFlag>();
380+
flags.add(new IBGFeatureFlag("key1", "variant1"));
357381
mInstabug.verify(() -> Instabug.addFeatureFlags(flags));
358382
}
359383

@@ -598,4 +622,25 @@ public void testWillRedirectToStore() {
598622
api.willRedirectToStore();
599623
mInstabug.verify(Instabug::willRedirectToStore);
600624
}
625+
626+
627+
@Test
628+
public void isW3CFeatureFlagsEnabled() {
629+
mockkObject(new InternalCore[]{InternalCore.INSTANCE},false);
630+
Random random=new Random();
631+
Boolean isW3cExternalGeneratedHeaderEnabled = random.nextBoolean();
632+
Boolean isW3cExternalTraceIDEnabled = random.nextBoolean();
633+
Boolean isW3cCaughtHeaderEnabled = random.nextBoolean();
634+
635+
every((Function1<MockKMatcherScope, Boolean>) mockKMatcherScope -> InternalCore.INSTANCE._isFeatureEnabled(CoreFeature.W3C_ATTACHING_GENERATED_HEADER)).returns(isW3cExternalGeneratedHeaderEnabled);
636+
every((Function1<MockKMatcherScope, Boolean>) mockKMatcherScope -> InternalCore.INSTANCE._isFeatureEnabled(CoreFeature.W3C_EXTERNAL_TRACE_ID)).returns(isW3cExternalTraceIDEnabled);
637+
every((Function1<MockKMatcherScope, Boolean>) mockKMatcherScope -> InternalCore.INSTANCE._isFeatureEnabled(CoreFeature.W3C_ATTACHING_CAPTURED_HEADER)).returns(isW3cCaughtHeaderEnabled);
638+
639+
640+
Map<String, Boolean> flags = api.isW3CFeatureFlagsEnabled();
641+
assertEquals(isW3cExternalGeneratedHeaderEnabled, flags.get("isW3cExternalGeneratedHeaderEnabled"));
642+
assertEquals(isW3cExternalTraceIDEnabled, flags.get("isW3cExternalTraceIDEnabled"));
643+
assertEquals(isW3cCaughtHeaderEnabled, flags.get("isW3cCaughtHeaderEnabled"));
644+
645+
}
601646
}

packages/instabug_flutter/example/android/app/build.gradle

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ apply plugin: 'kotlin-android'
2626
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
2727

2828
android {
29-
compileSdkVersion flutter.compileSdkVersion
29+
compileSdkVersion 34
3030
ndkVersion flutter.ndkVersion
3131

3232
compileOptions {
@@ -45,7 +45,7 @@ android {
4545
defaultConfig {
4646
applicationId "com.instabug.flutter.example"
4747
minSdkVersion 21
48-
targetSdkVersion 30
48+
targetSdkVersion 34
4949
versionCode flutterVersionCode.toInteger()
5050
versionName flutterVersionName
5151
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@@ -59,6 +59,7 @@ android {
5959
signingConfig signingConfigs.debug
6060
}
6161
}
62+
namespace 'com.instabug.flutter.example'
6263

6364
configurations.all {
6465
resolutionStrategy.force 'org.hamcrest:hamcrest-core:1.3'

packages/instabug_flutter/example/android/app/src/debug/AndroidManifest.xml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
2-
package="com.instabug.flutter.example">
1+
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
32
<!-- Flutter needs it to communicate with the running application
43
to allow setting breakpoints, to provide hot reload, etc.
54
-->

0 commit comments

Comments
 (0)