Skip to content

Commit 855aade

Browse files
authored
Merge pull request #496 from Instabug/dev
2 parents ea27866 + 64d08e2 commit 855aade

File tree

21 files changed

+374
-75
lines changed

21 files changed

+374
-75
lines changed

CHANGELOG.md

+35-16
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,24 @@
11
# Changelog
22

3+
## [13.3.0](https://github.com/Instabug/Instabug-Flutter/compare/v13.2.0...v13.3.0) (August 5, 2024)
4+
5+
### Added
6+
7+
- Add support for variants in Feature Flags through the APIs `Instabug.addFeatureFlags`, `Instabug.removeFeatureFlags` and `Instabug.clearAllFeatureFlags` ([#471](https://github.com/Instabug/Instabug-Flutter/pull/471)).
8+
9+
### Changed
10+
11+
- Bump Instabug Android SDK to v13.3.0 ([#492](https://github.com/Instabug/Instabug-Flutter/pull/492)). [See release notes](https://github.com/Instabug/Instabug-Android/releases/tag/v13.3.0).
12+
- Bump Instabug iOS SDK to v13.3.0 ([#493](https://github.com/Instabug/Instabug-Flutter/pull/493)). [See release notes](https://github.com/Instabug/Instabug-iOS/releases/tag/13.3.0).
13+
14+
### Deprecated
15+
16+
- Deprecate Experiments APIs `Instabug.addExperiments`, `Instabug.removeExperiments` and `Instabug.clearAllExperiments` in favor of the new Feature Flags APIs ([#471](https://github.com/Instabug/Instabug-Flutter/pull/471)).
17+
18+
### Fixed
19+
20+
- Fix APM network logging on Android ([#491](https://github.com/Instabug/Instabug-Flutter/pull/491)).
21+
322
## [13.2.0](https://github.com/Instabug/Instabug-Flutter/compare/v13.1.1...v13.2.0)
423

524
### Added
@@ -159,18 +178,18 @@
159178

160179
Below is a list of all the affected APIs:
161180

162-
- `APM.startExecutionTrace`
163-
- `BugReporting.setOnInvokeCallback`
164-
- `BugReporting.setOnDismissCallback`
165-
- `Instabug.getTags`
166-
- `Instabug.getUserAttributeForKey`
167-
- `Instabug.getUserAttributes`
168-
- `Replies.getUnreadRepliesCount`
169-
- `Replies.hasChats`
170-
- `Replies.setOnNewReplyReceivedCallback`
171-
- `Surveys.hasRespondToSurvey`
172-
- `Surveys.setOnShowCallback`
173-
- `Surveys.setOnDismissCallback`
181+
- `APM.startExecutionTrace`
182+
- `BugReporting.setOnInvokeCallback`
183+
- `BugReporting.setOnDismissCallback`
184+
- `Instabug.getTags`
185+
- `Instabug.getUserAttributeForKey`
186+
- `Instabug.getUserAttributes`
187+
- `Replies.getUnreadRepliesCount`
188+
- `Replies.hasChats`
189+
- `Replies.setOnNewReplyReceivedCallback`
190+
- `Surveys.hasRespondToSurvey`
191+
- `Surveys.setOnShowCallback`
192+
- `Surveys.setOnDismissCallback`
174193

175194
## [11.12.0](https://github.com/Instabug/Instabug-Flutter/compare/v11.10.1...v11.12.0) (May 30, 2023)
176195

@@ -247,10 +266,10 @@
247266
- Deprecates Instabug.enableAndroid and Instabug.disableAndroid APIs in favour of the new API
248267
Instabug.setEnabled, which works on both platforms
249268
- Deprecates callbacks in favor of return values in the following APIs:
250-
1. Replies.getUnreadRepliesCount
251-
2. Replies.hasChats
252-
3. Surveys.hasRespondedToSurvey
253-
4. Surveys.getAvailableSurveys
269+
1. Replies.getUnreadRepliesCount
270+
2. Replies.hasChats
271+
3. Surveys.hasRespondedToSurvey
272+
4. Surveys.getAvailableSurveys
254273

255274
## 11.3.0 (2022-09-30)
256275

android/build.gradle

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
group 'com.instabug.flutter'
2-
version '13.2.0'
2+
version '13.3.0'
33

44
buildscript {
55
repositories {
@@ -41,7 +41,7 @@ android {
4141
}
4242

4343
dependencies {
44-
api 'com.instabug.library:instabug:13.2.0'
44+
api 'com.instabug.library:instabug:13.3.0'
4545

4646
testImplementation 'junit:junit:4.13.2'
4747
testImplementation "org.mockito:mockito-inline:3.12.1"

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

+3-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import com.instabug.flutter.generated.ApmPigeon;
1515
import com.instabug.flutter.util.Reflection;
1616
import com.instabug.flutter.util.ThreadManager;
17+
import com.instabug.apm.networkinterception.cp.APMCPNetworkLog;
1718

1819
import io.flutter.plugin.common.BinaryMessenger;
1920

@@ -210,9 +211,9 @@ public void networkLogAndroid(@NonNull Map<String, Object> data) {
210211
serverErrorMessage = (String) data.get("serverErrorMessage");
211212
}
212213

213-
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);
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);
214215
if (method != null) {
215-
method.invoke(apmNetworkLogger, requestStartTime, requestDuration, requestHeaders, requestBody, requestBodySize, requestMethod, requestUrl, requestContentType, responseHeaders, responseBody, responseBodySize, statusCode, responseContentType, errorMessage, gqlQueryName, serverErrorMessage);
216+
method.invoke(apmNetworkLogger, requestStartTime, requestDuration, requestHeaders, requestBody, requestBodySize, requestMethod, requestUrl, requestContentType, responseHeaders, responseBody, responseBodySize, statusCode, responseContentType, errorMessage, gqlQueryName, serverErrorMessage, null);
216217
} else {
217218
Log.e(TAG, "APMNetworkLogger.log was not found by reflection");
218219
}

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

+40-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,14 @@
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.*;
16+
import com.instabug.library.Feature;
17+
import com.instabug.library.Instabug;
18+
import com.instabug.library.InstabugColorTheme;
19+
import com.instabug.library.InstabugCustomTextPlaceHolder;
20+
import com.instabug.library.IssueType;
21+
import com.instabug.library.Platform;
22+
import com.instabug.library.ReproConfigurations;
23+
import com.instabug.library.featuresflags.model.IBGFeatureFlag;
1724
import com.instabug.library.internal.module.InstabugLocale;
1825
import com.instabug.library.invocation.InstabugInvocationEvent;
1926
import com.instabug.library.model.NetworkLog;
@@ -28,6 +35,7 @@
2835
import java.io.IOException;
2936
import java.io.InputStream;
3037
import java.lang.reflect.Method;
38+
import java.util.ArrayList;
3139
import java.util.HashMap;
3240
import java.util.List;
3341
import java.util.Locale;
@@ -225,6 +233,37 @@ public void clearAllExperiments() {
225233
Instabug.clearAllExperiments();
226234
}
227235

236+
@Override
237+
public void addFeatureFlags(@NonNull Map<String, String> featureFlags) {
238+
try {
239+
List<IBGFeatureFlag> features = new ArrayList<>();
240+
for (Map.Entry<String, String> entry : featureFlags.entrySet()) {
241+
features.add(new IBGFeatureFlag(entry.getKey(), entry.getValue().isEmpty() ? null : entry.getValue()));
242+
}
243+
Instabug.addFeatureFlags(features);
244+
} catch (Exception e) {
245+
e.printStackTrace();
246+
}
247+
}
248+
249+
@Override
250+
public void removeFeatureFlags(@NonNull List<String> featureFlags) {
251+
try {
252+
Instabug.removeFeatureFlag(featureFlags);
253+
} catch (Exception e) {
254+
e.printStackTrace();
255+
}
256+
}
257+
258+
@Override
259+
public void removeAllFeatureFlags() {
260+
try {
261+
Instabug.removeAllFeatureFlags();
262+
} catch (Exception e) {
263+
e.printStackTrace();
264+
}
265+
}
266+
228267
@Override
229268
public void setUserAttribute(@NonNull String value, @NonNull String key) {
230269
Instabug.setUserAttribute(key, value);

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,8 @@ public void testNetworkLogAndroid() {
262262
responseContentType,
263263
errorDomain,
264264
null,
265-
serverErrorMessage
265+
serverErrorMessage,
266+
null
266267
));
267268

268269
mAPMNetworkLogger.close();

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

+28
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import com.instabug.library.Platform;
3636
import com.instabug.library.ReproConfigurations;
3737
import com.instabug.library.ReproMode;
38+
import com.instabug.library.featuresflags.model.IBGFeatureFlag;
3839
import com.instabug.library.invocation.InstabugInvocationEvent;
3940
import com.instabug.library.model.NetworkLog;
4041
import com.instabug.library.ui.onboarding.WelcomeMessage;
@@ -48,6 +49,7 @@
4849

4950
import java.io.File;
5051
import java.io.IOException;
52+
import java.util.ArrayList;
5153
import java.util.Arrays;
5254
import java.util.Collections;
5355
import java.util.HashMap;
@@ -345,6 +347,32 @@ public void testClearAllExperiments() {
345347
mInstabug.verify(Instabug::clearAllExperiments);
346348
}
347349

350+
@Test
351+
public void testAddFeatureFlags() {
352+
Map<String,String > featureFlags = new HashMap<>();
353+
featureFlags.put("key1","variant1");
354+
api.addFeatureFlags(featureFlags);
355+
List<IBGFeatureFlag> flags=new ArrayList<IBGFeatureFlag>();
356+
flags.add(new IBGFeatureFlag("key1","variant1"));
357+
mInstabug.verify(() -> Instabug.addFeatureFlags(flags));
358+
}
359+
360+
@Test
361+
public void testRemoveFeatureFlags() {
362+
List<String> featureFlags = Arrays.asList("premium", "star");
363+
364+
api.removeFeatureFlags(featureFlags);
365+
366+
mInstabug.verify(() -> Instabug.removeFeatureFlag(featureFlags));
367+
}
368+
369+
@Test
370+
public void testClearAllFeatureFlags() {
371+
api.removeAllFeatureFlags();
372+
373+
mInstabug.verify(Instabug::removeAllFeatureFlags);
374+
}
375+
348376
@Test
349377
public void testSetUserAttribute() {
350378
String key = "is_premium";

android/src/test/java/com/instabug/flutter/util/GlobalMocks.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import android.net.Uri;
99
import android.util.Log;
1010

11+
import com.instabug.apm.networkinterception.cp.APMCPNetworkLog;
1112
import com.instabug.crash.models.IBGNonFatalException;
1213

1314
import org.json.JSONObject;
@@ -69,10 +70,10 @@ public static void setUp() throws NoSuchMethodException {
6970
.when(() -> Reflection.getMethod(Class.forName("com.instabug.library.Instabug"), "setCurrentPlatform", int.class))
7071
.thenReturn(mSetCurrentPlatform);
7172

72-
Method mAPMNetworkLog = MockReflected.class.getDeclaredMethod("apmNetworkLog", 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);
73+
Method mAPMNetworkLog = MockReflected.class.getDeclaredMethod("apmNetworkLog", 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);
7374
mAPMNetworkLog.setAccessible(true);
7475
reflection
75-
.when(() -> 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))
76+
.when(() -> 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))
7677
.thenReturn(mAPMNetworkLog);
7778

7879
Method mCrashReportException = MockReflected.class.getDeclaredMethod("crashReportException", JSONObject.class, boolean.class);

android/src/test/java/com/instabug/flutter/util/MockReflected.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import android.graphics.Bitmap;
44
import androidx.annotation.Nullable;
55

6+
import com.instabug.apm.networkinterception.cp.APMCPNetworkLog;
67
import com.instabug.crash.models.IBGNonFatalException;
78

89
import org.json.JSONObject;
@@ -33,7 +34,7 @@ public static void setCurrentPlatform(int platform) {}
3334
/**
3435
* APMNetworkLogger.log
3536
*/
36-
public static void apmNetworkLog(long requestStartTime, long requestDuration, String requestHeaders, String requestBody, long requestBodySize, String requestMethod, String requestUrl, String responseHeaders, String responseBody, String responseBodySize, long statusCode, int responseContentType, String errorMessage, String var18, @Nullable String gqlQueryName, @Nullable String serverErrorMessage) {}
37+
public static void apmNetworkLog(long requestStartTime, long requestDuration, String requestHeaders, String requestBody, long requestBodySize, String requestMethod, String requestUrl, String responseHeaders, String responseBody, String responseBodySize, long statusCode, int responseContentType, String errorMessage, String var18, @Nullable String gqlQueryName, @Nullable String serverErrorMessage, @Nullable APMCPNetworkLog.W3CExternalTraceAttributes w3CExternalTraceAttributes) {}
3738

3839
/**
3940
* CrashReporting.reportException

example/ios/InstabugTests/InstabugApiTests.m

+40
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,46 @@ - (void)testClearAllExperiments {
224224
OCMVerify([self.mInstabug clearAllExperiments]);
225225
}
226226

227+
- (void)testAddFeatureFlags {
228+
NSDictionary *featureFlagsMap = @{ @"key13" : @"value1", @"key2" : @"value2"};
229+
FlutterError *error;
230+
231+
[self.api addFeatureFlagsFeatureFlagsMap:featureFlagsMap error:&error];
232+
OCMVerify([self.mInstabug addFeatureFlags: [OCMArg checkWithBlock:^(id value) {
233+
NSArray<IBGFeatureFlag *> *featureFlags = value;
234+
NSString* firstFeatureFlagName = [featureFlags objectAtIndex:0 ].name;
235+
NSString* firstFeatureFlagKey = [[featureFlagsMap allKeys] objectAtIndex:0] ;
236+
if([ firstFeatureFlagKey isEqualToString: firstFeatureFlagName]){
237+
return YES;
238+
}
239+
return NO;
240+
}]]);
241+
}
242+
243+
- (void)testRemoveFeatureFlags {
244+
NSArray *featureFlags = @[@"exp1"];
245+
FlutterError *error;
246+
247+
[self.api removeFeatureFlagsFeatureFlags:featureFlags error:&error];
248+
OCMVerify([self.mInstabug removeFeatureFlags: [OCMArg checkWithBlock:^(id value) {
249+
NSArray<IBGFeatureFlag *> *featureFlagsObJ = value;
250+
NSString* firstFeatureFlagName = [featureFlagsObJ objectAtIndex:0 ].name;
251+
NSString* firstFeatureFlagKey = [featureFlags firstObject] ;
252+
if([ firstFeatureFlagKey isEqualToString: firstFeatureFlagName]){
253+
return YES;
254+
}
255+
return NO;
256+
}]]);}
257+
258+
- (void)testRemoveAllFeatureFlags {
259+
FlutterError *error;
260+
261+
[self.api removeAllFeatureFlagsWithError:&error];
262+
OCMVerify([self.mInstabug removeAllFeatureFlags]);
263+
}
264+
265+
266+
227267
- (void)testSetUserAttribute {
228268
NSString *key = @"is_premium";
229269
NSString *value = @"true";

example/ios/Podfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Uncomment this line to define a global platform for your project
2-
platform :ios, '13.0'
2+
platform :ios, '13.4'
33

44
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
55
ENV['COCOAPODS_DISABLE_STATS'] = 'true'

example/ios/Podfile.lock

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
PODS:
22
- Flutter (1.0.0)
3-
- Instabug (13.2.0)
4-
- instabug_flutter (13.2.0):
3+
- Instabug (13.3.0)
4+
- instabug_flutter (13.3.0):
55
- Flutter
6-
- Instabug (= 13.2.0)
6+
- Instabug (= 13.3.0)
77
- OCMock (3.6)
88

99
DEPENDENCIES:
@@ -23,11 +23,11 @@ EXTERNAL SOURCES:
2323
:path: ".symlinks/plugins/instabug_flutter/ios"
2424

2525
SPEC CHECKSUMS:
26-
Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
27-
Instabug: aee76898789d17c55b36c7fbaa697e443effe3b1
28-
instabug_flutter: 8fe63955937c73205d4e71667aea9d56ed8d921b
26+
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
27+
Instabug: 4f26295103a330ec0236918359eef7ccaa74e2fa
28+
instabug_flutter: 6be22be13b3dda72b293151d2c009952bb20b940
2929
OCMock: 5ea90566be239f179ba766fd9fbae5885040b992
3030

31-
PODFILE CHECKSUM: f809f4241ff3da61349081a141c44763598f2fbb
31+
PODFILE CHECKSUM: 8f7552fd115ace1988c3db54a69e4a123c448f84
3232

33-
COCOAPODS: 1.13.0
33+
COCOAPODS: 1.14.3

0 commit comments

Comments
 (0)