Skip to content

Commit 5b2271b

Browse files
authored
Merge pull request #214 from Instabug/release/10.11.0
[MOB-6534] Release/10.11.0
2 parents 4ba9e18 + 9c64fd3 commit 5b2271b

18 files changed

+600
-134
lines changed

.circleci/config.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,13 +125,13 @@ jobs:
125125

126126
gh_ibg_release:
127127
macos:
128-
xcode: "10.1.0"
128+
xcode: "12.5.1"
129129
working_directory: "~"
130130
steps:
131131
- checkout:
132132
path: ~/project
133133
- run: git clone https://InstabugCI:[email protected]/Instabug/Escape.git
134-
- run: cd Escape && swift build -c release -Xswiftc -static-stdlib
134+
- run: cd Escape && swift build -c release
135135
- run: cd Escape/.build/release && cp -f Escape /usr/local/bin/escape
136136
- run: cd project && Escape flutter publish
137137

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## v10.11.0 (2021-12-28)
2+
3+
* Adds support for APM.endAppLaunch API
4+
* Bumps Instabug native SDKs to v10.11
5+
* Fixes an issue with APM logged requests payload size
6+
17
## v10.9.1 (2021-10-13)
28

39
* Bumps Instabug Android SDK to v10.9.1

android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,6 @@ android {
3434
}
3535
}
3636
dependencies {
37-
implementation 'com.instabug.library:instabug:10.9.1'
37+
implementation 'com.instabug.library:instabug:10.11.0'
3838
testImplementation 'junit:junit:4.12'
3939
}

android/src/main/java/com/instabug/instabugflutter/InstabugFlutterPlugin.java

Lines changed: 64 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1131,42 +1131,74 @@ public void run() {
11311131
});
11321132
}
11331133

1134-
public void apmNetworkLogByReflection(HashMap<String, Object> jsonObject) throws JSONException {
1135-
APMNetworkLogger apmNetworkLogger = new APMNetworkLogger();
1136-
final String requestUrl = (String) jsonObject.get("url");
1137-
final String requestBody = (String) jsonObject.get("requestBody");
1138-
final String responseBody = (String) jsonObject.get("responseBody");
1139-
final String requestMethod = (String) jsonObject.get("method");
1140-
//--------------------------------------------
1141-
final String requestContentType = (String) jsonObject.get("contentType");
1142-
final String responseContentType = (String) jsonObject.get("responseContentType");
1143-
//--------------------------------------------
1144-
final String errorDomain = (String) jsonObject.get("errorDomain");
1145-
final Integer statusCode = (Integer) jsonObject.get("responseCode");
1146-
final long requestDuration = ((Number) jsonObject.get("duration")).longValue() / 1000;
1147-
final long requestStartTime = ((Number) jsonObject.get("startTime")).longValue() * 1000;
1148-
final String requestHeaders = (new JSONObject((HashMap<String, String>) jsonObject.get("requestHeaders"))).toString(4);
1149-
final String responseHeaders = (new JSONObject((HashMap<String, String>) jsonObject.get("responseHeaders"))).toString(4);
1150-
final String errorMessage;
1151-
1152-
if(errorDomain.equals("")) {
1153-
errorMessage = null;
1154-
} else {
1155-
errorMessage = errorDomain;
1156-
}
1134+
/**
1135+
* Ends app launch
1136+
*/
1137+
public void endAppLaunch() {
1138+
new Handler(Looper.getMainLooper()).post(new Runnable() {
1139+
@Override
1140+
public void run() {
1141+
try {
1142+
APM.endAppLaunch();
1143+
} catch (Exception e) {
1144+
e.printStackTrace();
1145+
}
1146+
}
1147+
});
1148+
}
11571149

1150+
public void apmNetworkLogByReflection(HashMap<String, Object> jsonObject) throws JSONException {
11581151
try {
1159-
Method method = getMethod(Class.forName("com.instabug.apm.networking.APMNetworkLogger"), "log", long.class, long.class, String.class, String.class, String.class, String.class, String.class, String.class, String.class, int.class, String.class, String.class);
1160-
if (method != null) {
1161-
method.invoke(apmNetworkLogger, requestStartTime, requestDuration, requestHeaders, requestBody, requestMethod, requestUrl, requestContentType, responseHeaders, responseBody, statusCode, responseContentType, errorMessage);
1152+
APMNetworkLogger apmNetworkLogger = new APMNetworkLogger();
1153+
final String requestUrl = (String) jsonObject.get("url");
1154+
final String requestBody = (String) jsonObject.get("requestBody");
1155+
final String responseBody = (String) jsonObject.get("responseBody");
1156+
final String requestMethod = (String) jsonObject.get("method");
1157+
//--------------------------------------------
1158+
final String requestContentType = (String) jsonObject.get("requestContentType");
1159+
final String responseContentType = (String) jsonObject.get("responseContentType");
1160+
//--------------------------------------------
1161+
final long requestBodySize = ((Number) jsonObject.get("requestBodySize")).longValue();
1162+
final long responseBodySize = ((Number) jsonObject.get("responseBodySize")).longValue();
1163+
//--------------------------------------------
1164+
final String errorDomain = (String) jsonObject.get("errorDomain");
1165+
final Integer statusCode = (Integer) jsonObject.get("responseCode");
1166+
final long requestDuration = ((Number) jsonObject.get("duration")).longValue() / 1000;
1167+
final long requestStartTime = ((Number) jsonObject.get("startTime")).longValue() * 1000;
1168+
final String requestHeaders = (new JSONObject((HashMap<String, String>) jsonObject.get("requestHeaders"))).toString(4);
1169+
final String responseHeaders = (new JSONObject((HashMap<String, String>) jsonObject.get("responseHeaders"))).toString(4);
1170+
final String errorMessage;
1171+
1172+
if(errorDomain.equals("")) {
1173+
errorMessage = null;
11621174
} else {
1163-
Log.e("IB-CP-Bridge", "apmNetworkLogByReflection was not found by reflection");
1175+
errorMessage = errorDomain;
11641176
}
1165-
} catch (ClassNotFoundException e) {
1166-
e.printStackTrace();
1167-
} catch (IllegalAccessException e) {
1168-
e.printStackTrace();
1169-
} catch (InvocationTargetException e) {
1177+
//--------------------------------------------------
1178+
String gqlQueryName = null;
1179+
if(jsonObject.containsKey("gqlQueryName")){
1180+
gqlQueryName = (String) jsonObject.get("gqlQueryName");
1181+
}
1182+
String serverErrorMessage = "";
1183+
if(jsonObject.containsKey("serverErrorMessage")){
1184+
serverErrorMessage = (String) jsonObject.get("serverErrorMessage");
1185+
}
1186+
1187+
try {
1188+
Method method = 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);
1189+
if (method != null) {
1190+
method.invoke(apmNetworkLogger, requestStartTime, requestDuration, requestHeaders, requestBody, requestBodySize, requestMethod, requestUrl, requestContentType, responseHeaders, responseBody, responseBodySize, statusCode, responseContentType, errorMessage, gqlQueryName, serverErrorMessage);
1191+
} else {
1192+
Log.e("IB-CP-Bridge", "apmNetworkLogByReflection was not found by reflection");
1193+
}
1194+
} catch (ClassNotFoundException e) {
1195+
e.printStackTrace();
1196+
} catch (IllegalAccessException e) {
1197+
e.printStackTrace();
1198+
} catch (InvocationTargetException e) {
1199+
e.printStackTrace();
1200+
}
1201+
} catch (Exception e) {
11701202
e.printStackTrace();
11711203
}
11721204

example/android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
buildscript {
2-
ext.kotlin_version = '1.3.50'
2+
ext.kotlin_version = '1.4.32'
33
repositories {
44
google()
55
jcenter()

ios/Classes/InstabugFlutterPlugin.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,4 +493,10 @@
493493
*/
494494
+ (void)endUITrace;
495495

496+
/**
497+
* Ends the current session’s App Launch. Calling this API is optional, App Launches will still be captured and ended automatically by the SDK;
498+
* this API just allows you to change when an App Launch actually ends.
499+
*/
500+
+ (void)endAppLaunch;
501+
496502
@end

ios/Classes/InstabugFlutterPlugin.m

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -766,7 +766,7 @@ + (void)networkLog:(NSDictionary *) networkData {
766766
requestHeaders = @{};
767767
}
768768
NSDictionary* responseHeaders = networkData[@"responseHeaders"];
769-
NSString* contentType = @"application/json";
769+
NSString* contentType = networkData[@"responseContentType"];
770770
int64_t duration = [networkData[@"duration"] integerValue];
771771
int64_t startTime = [networkData[@"startTime"] integerValue] * 1000;
772772

@@ -775,7 +775,16 @@ + (void)networkLog:(NSDictionary *) networkData {
775775
NSLog(@"value: %@",[requestHeaders objectForKey:key]);
776776
}
777777

778-
SEL networkLogSEL = NSSelectorFromString(@"addNetworkLogWithUrl:method:requestBody:requestBodySize:responseBody:responseBodySize:responseCode:requestHeaders:responseHeaders:contentType:errorDomain:errorCode:startTime:duration:");
778+
NSString* gqlQueryName = nil;
779+
NSString* serverErrorMessage = nil;
780+
if (networkData[@"gqlQueryName"] != [NSNull null]) {
781+
gqlQueryName = networkData[@"gqlQueryName"];
782+
}
783+
if (networkData[@"serverErrorMessage"] != [NSNull null]) {
784+
serverErrorMessage = networkData[@"serverErrorMessage"];
785+
}
786+
787+
SEL networkLogSEL = NSSelectorFromString(@"addNetworkLogWithUrl:method:requestBody:requestBodySize:responseBody:responseBodySize:responseCode:requestHeaders:responseHeaders:contentType:errorDomain:errorCode:startTime:duration:gqlQueryName:serverErrorMessage:");
779788

780789
if([[IBGNetworkLogger class] respondsToSelector:networkLogSEL]) {
781790
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[[IBGNetworkLogger class] methodSignatureForSelector:networkLogSEL]];
@@ -796,6 +805,8 @@ + (void)networkLog:(NSDictionary *) networkData {
796805
[inv setArgument:&(errorCode) atIndex:13];
797806
[inv setArgument:&(startTime) atIndex:14];
798807
[inv setArgument:&(duration) atIndex:15];
808+
[inv setArgument:&(gqlQueryName) atIndex:16];
809+
[inv setArgument:&(serverErrorMessage) atIndex:17];
799810

800811
[inv invoke];
801812
}
@@ -934,6 +945,13 @@ + (void)endUITrace {
934945
[IBGAPM endUITrace];
935946
}
936947

948+
/**
949+
* Ends app launch.
950+
*/
951+
+ (void)endAppLaunch {
952+
[IBGAPM endAppLaunch];
953+
}
954+
937955
/** Reports that the screen has been changed (Repro Steps) the screen sent to this method will be the 'current view' on the dashboard
938956
*
939957
* @param screenName string containing the screen name

ios/instabug_flutter.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ A new flutter plugin project.
1515
s.source_files = 'Classes/**/*'
1616
s.public_header_files = 'Classes/**/*.h'
1717
s.dependency 'Flutter'
18-
s.dependency 'Instabug', '10.9.3'
18+
s.dependency 'Instabug', '10.11.2'
1919

2020
s.ios.deployment_target = '10.0'
2121
s.pod_target_xcconfig = { 'OTHER_LDFLAGS' => '-framework "Flutter" -framework "Instabug"'}

lib/APM.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,10 @@ class APM {
113113
static void endUITrace() async {
114114
await _channel.invokeMethod<Object>('endUITrace');
115115
}
116+
/// Ends UI trace.
117+
static void endAppLaunch() async {
118+
await _channel.invokeMethod<Object>('endAppLaunch');
119+
}
116120

117121
static Future<bool?> networkLogAndroid(NetworkData data) async {
118122
if (Platform.isAndroid) {

lib/NetworkLogger.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class NetworkLogger {
1212
static Future<String?> get platformVersion async =>
1313
await _channel.invokeMethod<String>('getPlatformVersion');
1414

15-
static Future<bool?> networkLog(NetworkData data) async {
15+
Future<bool?> networkLog(NetworkData data) async {
1616
final params = <dynamic>[data.toMap()];
1717
await _channel.invokeMethod<bool>('networkLog:', params);
1818
await APM.networkLogAndroid(data);

lib/instabug_custom_http_client_request.dart

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ class InstabugCustomHttpClientRequest implements HttpClientRequest {
1515

1616
HttpClientRequest _originalClientRequest;
1717

18+
StringBuffer _requestBody = StringBuffer();
19+
1820
late HttpClientLogger logger;
1921

2022
@override
@@ -89,20 +91,32 @@ class InstabugCustomHttpClientRequest implements HttpClientRequest {
8991
@override
9092
void write(Object? object) {
9193
_originalClientRequest.write(object);
94+
_requestBody.write(object);
95+
logger.onRequestUpdate(_originalClientRequest,
96+
requestBody: _requestBody.toString());
9297
}
9398

9499
@override
95-
void writeAll(Iterable objects, [String separator = ""]) {
100+
void writeAll(Iterable objects, [String separator = '']) {
96101
_originalClientRequest.writeAll(objects, separator);
102+
_requestBody.writeAll(objects, separator);
103+
logger.onRequestUpdate(_originalClientRequest,
104+
requestBody: _requestBody.toString());
97105
}
98106

99107
@override
100108
void writeCharCode(int charCode) {
101109
_originalClientRequest.writeCharCode(charCode);
110+
_requestBody.writeCharCode(charCode);
111+
logger.onRequestUpdate(_originalClientRequest,
112+
requestBody: _requestBody.toString());
102113
}
103114

104115
@override
105-
void writeln([Object? object = ""]) {
116+
void writeln([Object? object = '']) {
106117
_originalClientRequest.writeln(object);
118+
_requestBody.writeln(object);
119+
logger.onRequestUpdate(_originalClientRequest,
120+
requestBody: _requestBody.toString());
107121
}
108122
}

lib/models/network_data.dart

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ class NetworkData {
1010
this.requestHeaders = const <String, dynamic>{},
1111
this.responseHeaders = const <String, dynamic>{},
1212
this.duration,
13-
this.contentType = '',
13+
this.requestContentType = '',
14+
this.responseContentType = '',
1415
this.endTime,
1516
required this.startTime,
1617
this.errorCode = 0,
@@ -26,7 +27,8 @@ class NetworkData {
2627
final Map<String, dynamic> requestHeaders;
2728
final Map<String, dynamic> responseHeaders;
2829
final int? duration;
29-
final String? contentType;
30+
final String? requestContentType;
31+
final String? responseContentType;
3032
final DateTime? endTime;
3133
final DateTime startTime;
3234
final int errorCode;
@@ -43,7 +45,8 @@ class NetworkData {
4345
Map<String, dynamic>? requestHeaders,
4446
Map<String, dynamic>? responseHeaders,
4547
int? duration,
46-
String? contentType,
48+
String? requestContentType,
49+
String? responseContentType,
4750
DateTime? endTime,
4851
DateTime? startTime,
4952
int? errorCode,
@@ -60,7 +63,8 @@ class NetworkData {
6063
requestHeaders: requestHeaders ?? this.requestHeaders,
6164
responseHeaders: responseHeaders ?? this.responseHeaders,
6265
duration: duration ?? this.duration,
63-
contentType: contentType ?? this.contentType,
66+
requestContentType: requestContentType ?? this.requestContentType,
67+
responseContentType: responseContentType ?? this.responseContentType,
6468
endTime: endTime ?? this.endTime,
6569
startTime: startTime ?? this.startTime,
6670
errorCode: errorCode ?? this.errorCode,
@@ -76,7 +80,8 @@ class NetworkData {
7680
map['responseCode'] = status;
7781
map['requestHeaders'] = requestHeaders;
7882
map['responseHeaders'] = responseHeaders;
79-
map['contentType'] = contentType;
83+
map['requestContentType'] = requestContentType;
84+
map['responseContentType'] = responseContentType;
8085
map['duration'] = duration;
8186
map['startTime'] = startTime.millisecondsSinceEpoch;
8287
map['requestBodySize'] = requestBodySize;

lib/utils/http_client_logger.dart

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
import 'dart:convert';
12
import 'dart:io';
23

34
import 'package:instabug_flutter/NetworkLogger.dart';
45
import 'package:instabug_flutter/models/network_data.dart';
56

67
class HttpClientLogger {
78
final requests = <int, NetworkData>{};
9+
var networkLogger = NetworkLogger();
810

911
NetworkData? _getRequestData(int requestHashCode) {
1012
if (requests[requestHashCode] != null) {
@@ -30,29 +32,49 @@ class HttpClientLogger {
3032
requests[request.hashCode] = requestData;
3133
}
3234

35+
void onRequestUpdate(HttpClientRequest request, {dynamic requestBody}) {
36+
final networkData = _getRequestData(request.hashCode);
37+
if (networkData == null) {
38+
return;
39+
}
40+
requests[request.hashCode] = networkData.copyWith(
41+
requestBody: requestBody,
42+
);
43+
}
44+
3345
void onResponse(HttpClientResponse response, HttpClientRequest request,
3446
{dynamic responseBody}) {
3547
final DateTime endTime = DateTime.now();
3648
final networkData = _getRequestData(request.hashCode);
3749
final responseHeaders = <String, dynamic>{};
50+
final requestHeaders = <String, dynamic>{};
3851

3952
if (networkData == null) {
4053
return;
4154
}
4255

43-
request.headers.forEach((String header, dynamic value) {
56+
response.headers.forEach((String header, dynamic value) {
4457
responseHeaders[header] = value[0];
4558
});
59+
request.headers.forEach((String header, dynamic value) {
60+
requestHeaders[header] = value[0];
61+
});
62+
63+
final int requestBodySize =
64+
json.decode(json.encode(networkData.requestBody)).length;
4665

47-
NetworkLogger.networkLog(networkData.copyWith(
66+
networkLogger.networkLog(networkData.copyWith(
4867
status: response.statusCode,
4968
duration: endTime.difference(networkData.startTime).inMicroseconds,
50-
contentType: response.headers.contentType?.value,
69+
responseContentType: response.headers.contentType?.value,
70+
requestContentType: request.headers.contentType?.value,
5171
responseHeaders: responseHeaders,
5272
responseBody: responseBody,
5373
errorCode: 0,
5474
errorDomain: response.statusCode != 0 ? '' : 'ClientError',
5575
responseBodySize: int.parse(responseHeaders['content-length'] ?? '0'),
76+
requestBodySize: requestBodySize,
77+
requestHeaders: requestHeaders,
5678
));
5779
}
5880
}

0 commit comments

Comments
 (0)