Skip to content

Commit 81705e8

Browse files
feat: add screen loading manual & automatic approaches (#477)
1 parent a8aeaa9 commit 81705e8

File tree

8 files changed

+16
-314
lines changed

8 files changed

+16
-314
lines changed

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

Lines changed: 3 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +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;
1514
import com.instabug.flutter.generated.ApmPigeon;
1615
import com.instabug.flutter.util.Reflection;
1716
import com.instabug.flutter.util.ThreadManager;
1817

1918
import io.flutter.plugin.common.BinaryMessenger;
2019

20+
import org.jetbrains.annotations.NotNull;
2121
import org.json.JSONObject;
2222

2323
import java.lang.reflect.Method;
@@ -209,54 +209,10 @@ public void networkLogAndroid(@NonNull Map<String, Object> data) {
209209
if (data.containsKey("serverErrorMessage")) {
210210
serverErrorMessage = (String) data.get("serverErrorMessage");
211211
}
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"));
226-
227-
}
228-
if (data.containsKey("networkStartTimeInSeconds")) {
229-
networkStartTimeInSeconds = ((Number) data.get("networkStartTimeInSeconds"));
230-
}
231-
232-
if (data.containsKey("w3CGeneratedHeader")) {
233-
234-
w3CGeneratedHeader = (String) data.get("w3CGeneratedHeader");
235-
236-
}
237-
238-
239-
if (data.containsKey("w3CCaughtHeader")) {
240-
w3CCaughtHeader = (String) data.get("w3CCaughtHeader");
241-
242-
}
243-
244-
245-
APMCPNetworkLog.W3CExternalTraceAttributes w3cExternalTraceAttributes =
246-
null;
247-
if (isW3cHeaderFound != null) {
248-
w3cExternalTraceAttributes = new APMCPNetworkLog.W3CExternalTraceAttributes(
249-
isW3cHeaderFound, partialId == null ? null : partialId.longValue(),
250-
networkStartTimeInSeconds == null ? null : networkStartTimeInSeconds.longValue(),
251-
w3CGeneratedHeader, w3CCaughtHeader
252-
253-
);
254-
}
255-
256212

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

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

Lines changed: 4 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -6,31 +6,21 @@
66
import android.graphics.BitmapFactory;
77
import android.net.Uri;
88
import android.util.Log;
9-
109
import androidx.annotation.NonNull;
1110
import androidx.annotation.Nullable;
1211
import androidx.annotation.VisibleForTesting;
13-
14-
import com.instabug.apm.configuration.cp.APMFeature;
15-
16-
import com.instabug.flutter.util.ArgsRegistry;
1712
import com.instabug.flutter.generated.InstabugPigeon;
13+
import com.instabug.flutter.util.ArgsRegistry;
1814
import com.instabug.flutter.util.Reflection;
1915
import com.instabug.flutter.util.ThreadManager;
2016
import com.instabug.library.*;
21-
import com.instabug.library.internal.crossplatform.CoreFeature;
22-
import com.instabug.library.internal.crossplatform.CoreFeaturesState;
23-
import com.instabug.library.internal.crossplatform.FeaturesStateListener;
24-
import com.instabug.library.internal.crossplatform.InternalCore;
2517
import com.instabug.library.internal.module.InstabugLocale;
2618
import com.instabug.library.invocation.InstabugInvocationEvent;
2719
import com.instabug.library.model.NetworkLog;
2820
import com.instabug.library.ui.onboarding.WelcomeMessage;
29-
3021
import io.flutter.FlutterInjector;
3122
import io.flutter.embedding.engine.loader.FlutterLoader;
3223
import io.flutter.plugin.common.BinaryMessenger;
33-
3424
import org.jetbrains.annotations.NotNull;
3525
import org.json.JSONObject;
3626

@@ -50,19 +40,14 @@ public class InstabugApi implements InstabugPigeon.InstabugHostApi {
5040
private final Callable<Bitmap> screenshotProvider;
5141
private final InstabugCustomTextPlaceHolder placeHolder = new InstabugCustomTextPlaceHolder();
5242

53-
private final InstabugPigeon.FeatureFlagsFlutterApi featureFlagsFlutterApi;
54-
5543
public static void init(BinaryMessenger messenger, Context context, Callable<Bitmap> screenshotProvider) {
56-
final InstabugPigeon.FeatureFlagsFlutterApi flutterApi = new InstabugPigeon.FeatureFlagsFlutterApi(messenger);
57-
58-
final InstabugApi api = new InstabugApi(context, screenshotProvider, flutterApi);
44+
final InstabugApi api = new InstabugApi(context, screenshotProvider);
5945
InstabugPigeon.InstabugHostApi.setup(messenger, api);
6046
}
6147

62-
public InstabugApi(Context context, Callable<Bitmap> screenshotProvider, InstabugPigeon.FeatureFlagsFlutterApi featureFlagsFlutterApi) {
48+
public InstabugApi(Context context, Callable<Bitmap> screenshotProvider) {
6349
this.context = context;
6450
this.screenshotProvider = screenshotProvider;
65-
this.featureFlagsFlutterApi = featureFlagsFlutterApi;
6651
}
6752

6853
@VisibleForTesting
@@ -99,9 +84,7 @@ public Boolean isEnabled() {
9984

10085
@NotNull
10186
@Override
102-
public Boolean isBuilt() {
103-
return Instabug.isBuilt();
104-
}
87+
public Boolean isBuilt() { return Instabug.isBuilt(); }
10588

10689
@Override
10790
public void init(@NonNull String token, @NonNull List<String> invocationEvents, @NonNull String debugLogsLevel) {
@@ -415,48 +398,6 @@ public void networkLog(@NonNull Map<String, Object> data) {
415398
}
416399
}
417400

418-
@Override
419-
public void bindOnW3CFeatureFlagChangeCallback() {
420-
421-
try {
422-
InternalCore.INSTANCE._setFeaturesStateListener(new FeaturesStateListener() {
423-
@Override
424-
public void invoke(@NonNull CoreFeaturesState featuresState) {
425-
ThreadManager.runOnMainThread(new Runnable() {
426-
@Override
427-
public void run() {
428-
featureFlagsFlutterApi.onW3CFeatureFlagChange(featuresState.isW3CExternalTraceIdEnabled(),
429-
featuresState.isAttachingGeneratedHeaderEnabled(),
430-
featuresState.isAttachingCapturedHeaderEnabled(),
431-
new InstabugPigeon.FeatureFlagsFlutterApi.Reply<Void>() {
432-
@Override
433-
public void reply(Void reply) {
434-
435-
}
436-
});
437-
}
438-
});
439-
}
440-
441-
});
442-
} catch (Exception e) {
443-
e.printStackTrace();
444-
}
445-
446-
}
447-
448-
@NonNull
449-
@Override
450-
public Map<String, Boolean> isW3CFeatureFlagsEnabled() {
451-
Map<String, Boolean> params = new HashMap<String, Boolean>();
452-
params.put("isW3cExternalTraceIDEnabled", InternalCore.INSTANCE._isFeatureEnabled(CoreFeature.W3C_EXTERNAL_TRACE_ID));
453-
params.put("isW3cExternalGeneratedHeaderEnabled", InternalCore.INSTANCE._isFeatureEnabled(CoreFeature.W3C_ATTACHING_GENERATED_HEADER));
454-
params.put("isW3cCaughtHeaderEnabled", InternalCore.INSTANCE._isFeatureEnabled(CoreFeature.W3C_ATTACHING_CAPTURED_HEADER));
455-
456-
457-
return params;
458-
}
459-
460401
@Override
461402
public void willRedirectToStore() {
462403
Instabug.willRedirectToStore();

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

Lines changed: 1 addition & 153 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,11 @@
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-
163
import com.instabug.apm.APM;
174
import com.instabug.apm.InternalAPM;
185
import com.instabug.apm.configuration.cp.APMFeature;
19-
import com.instabug.apm.InternalAPM;
20-
import com.instabug.apm.configuration.cp.APMFeature;
216
import com.instabug.apm.configuration.cp.FeatureAvailabilityCallback;
227
import com.instabug.apm.model.ExecutionTrace;
238
import com.instabug.apm.networking.APMNetworkLogger;
24-
import com.instabug.apm.networkinterception.cp.APMCPNetworkLog;
259
import com.instabug.flutter.generated.ApmPigeon;
2610
import com.instabug.flutter.modules.ApmApi;
2711
import com.instabug.flutter.util.GlobalMocks;
@@ -278,143 +262,7 @@ public void testNetworkLogAndroid() {
278262
responseContentType,
279263
errorDomain,
280264
null,
281-
serverErrorMessage,
282-
null
283-
));
284-
285-
mAPMNetworkLogger.close();
286-
mJSONObject.close();
287-
}
288-
289-
@Test
290-
public void testNetworkLogAndroidWithCaughtW3Header() {
291-
Map<String, Object> data = new HashMap<>();
292-
String requestUrl = "https://example.com";
293-
String requestBody = "hi";
294-
String responseBody = "{\"hello\":\"world\"}";
295-
String requestMethod = "POST";
296-
String requestContentType = "text/plain";
297-
String responseContentType = "application/json";
298-
long requestBodySize = 20;
299-
long responseBodySize = 50;
300-
int responseCode = 401;
301-
long requestDuration = 23000;
302-
long requestStartTime = System.currentTimeMillis() / 1000;
303-
HashMap<String, String> requestHeaders = new HashMap<>();
304-
requestHeaders.put("traceparent","1234");
305-
HashMap<String, String> responseHeaders = new HashMap<>();
306-
String errorDomain = "ERROR_DOMAIN";
307-
String serverErrorMessage = "SERVER_ERROR_MESSAGE";
308-
data.put("url", requestUrl);
309-
data.put("requestBody", requestBody);
310-
data.put("responseBody", responseBody);
311-
data.put("method", requestMethod);
312-
data.put("requestContentType", requestContentType);
313-
data.put("responseContentType", responseContentType);
314-
data.put("requestBodySize", requestBodySize);
315-
data.put("responseBodySize", responseBodySize);
316-
data.put("errorDomain", errorDomain);
317-
data.put("responseCode", responseCode);
318-
data.put("requestDuration", requestDuration);
319-
data.put("startTime", requestStartTime);
320-
data.put("requestHeaders", requestHeaders);
321-
data.put("responseHeaders", responseHeaders);
322-
data.put("duration", requestDuration);
323-
data.put("serverErrorMessage", serverErrorMessage);
324-
data.put("isW3cHeaderFound", true);
325-
data.put("w3CCaughtHeader", "1234");
326-
327-
MockedConstruction<APMNetworkLogger> mAPMNetworkLogger = mockConstruction(APMNetworkLogger.class);
328-
MockedConstruction<JSONObject> mJSONObject = mockConstruction(JSONObject.class, (mock, context) -> when(mock.toString(anyInt())).thenReturn("{}"));
329-
330-
api.networkLogAndroid(data);
331-
332-
reflected.verify(() -> MockReflected.apmNetworkLog(
333-
requestStartTime * 1000,
334-
requestDuration / 1000,
335-
"{}",
336-
requestBody,
337-
requestBodySize,
338-
requestMethod,
339-
requestUrl,
340-
requestContentType,
341-
"{}",
342-
responseBody,
343-
responseBodySize,
344-
responseCode,
345-
responseContentType,
346-
errorDomain,
347-
null,
348-
serverErrorMessage,
349-
new APMCPNetworkLog.W3CExternalTraceAttributes(true,null,null,null,"1234")
350-
));
351-
352-
mAPMNetworkLogger.close();
353-
mJSONObject.close();
354-
}
355-
356-
@Test
357-
public void testNetworkLogAndroidWithGeneratedW3Header() {
358-
Map<String, Object> data = new HashMap<>();
359-
String requestUrl = "https://example.com";
360-
String requestBody = "hi";
361-
String responseBody = "{\"hello\":\"world\"}";
362-
String requestMethod = "POST";
363-
String requestContentType = "text/plain";
364-
String responseContentType = "application/json";
365-
long requestBodySize = 20;
366-
long responseBodySize = 50;
367-
int responseCode = 401;
368-
long requestDuration = 23000;
369-
long requestStartTime = System.currentTimeMillis() / 1000;
370-
HashMap<String, String> requestHeaders = new HashMap<>();
371-
HashMap<String, String> responseHeaders = new HashMap<>();
372-
String errorDomain = "ERROR_DOMAIN";
373-
String serverErrorMessage = "SERVER_ERROR_MESSAGE";
374-
data.put("url", requestUrl);
375-
data.put("requestBody", requestBody);
376-
data.put("responseBody", responseBody);
377-
data.put("method", requestMethod);
378-
data.put("requestContentType", requestContentType);
379-
data.put("responseContentType", responseContentType);
380-
data.put("requestBodySize", requestBodySize);
381-
data.put("responseBodySize", responseBodySize);
382-
data.put("errorDomain", errorDomain);
383-
data.put("responseCode", responseCode);
384-
data.put("requestDuration", requestDuration);
385-
data.put("startTime", requestStartTime);
386-
data.put("requestHeaders", requestHeaders);
387-
data.put("responseHeaders", responseHeaders);
388-
data.put("duration", requestDuration);
389-
data.put("serverErrorMessage", serverErrorMessage);
390-
data.put("isW3cHeaderFound", false);
391-
data.put("partialId", 12);
392-
data.put("networkStartTimeInSeconds", 34);
393-
data.put("w3CGeneratedHeader", "12-34");
394-
395-
MockedConstruction<APMNetworkLogger> mAPMNetworkLogger = mockConstruction(APMNetworkLogger.class);
396-
MockedConstruction<JSONObject> mJSONObject = mockConstruction(JSONObject.class, (mock, context) -> when(mock.toString(anyInt())).thenReturn("{}"));
397-
398-
api.networkLogAndroid(data);
399-
400-
reflected.verify(() -> MockReflected.apmNetworkLog(
401-
requestStartTime * 1000,
402-
requestDuration / 1000,
403-
"{}",
404-
requestBody,
405-
requestBodySize,
406-
requestMethod,
407-
requestUrl,
408-
requestContentType,
409-
"{}",
410-
responseBody,
411-
responseBodySize,
412-
responseCode,
413-
responseContentType,
414-
errorDomain,
415-
null,
416-
serverErrorMessage,
417-
new APMCPNetworkLog.W3CExternalTraceAttributes(false,12L,34L,"12-34",null)
265+
serverErrorMessage
418266
));
419267

420268
mAPMNetworkLogger.close();

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
import java.util.concurrent.Callable;
6464

6565
import io.flutter.plugin.common.BinaryMessenger;
66+
import org.mockito.verification.VerificationMode;
6667

6768
import org.mockito.verification.VerificationMode;
6869

example/ios/Podfile

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ end
3535

3636
target 'InstabugTests' do
3737
pod 'OCMock', '3.6'
38-
38+
3939
use_frameworks!
4040
use_modular_headers!
4141

@@ -45,5 +45,8 @@ end
4545
post_install do |installer|
4646
installer.pods_project.targets.each do |target|
4747
flutter_additional_ios_build_settings(target)
48+
target.build_configurations.each do |config|
49+
config.build_settings["IPHONEOS_DEPLOYMENT_TARGET"] = "11.0"
50+
end
4851
end
4952
end

example/ios/Podfile.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,6 @@ SPEC CHECKSUMS:
2828
instabug_flutter: 3862054366a3d2c4a93c6817b48467267b79eb89
2929
OCMock: 5ea90566be239f179ba766fd9fbae5885040b992
3030

31-
PODFILE CHECKSUM: 8231e33156f35cebaa9094db274874933be79de7
31+
PODFILE CHECKSUM: f809f4241ff3da61349081a141c44763598f2fbb
3232

3333
COCOAPODS: 1.13.0

0 commit comments

Comments
 (0)