Skip to content

Commit af38253

Browse files
feat: add screen loading manual & automatic approaches (#477)
1 parent 356511c commit af38253

Some content is hidden

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

50 files changed

+3078
-217
lines changed

.circleci/config.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -321,4 +321,4 @@ workflows:
321321
- hold_release
322322
filters:
323323
branches:
324-
only: master
324+
only: master

android/src/main/AndroidManifest.xml

+7
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
11
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
22
package="com.instabug.flutter">
3+
4+
<application>
5+
<meta-data
6+
android:name="com.instabug.library.ibg_platform"
7+
android:value="FLUTTER" />
8+
</application>
9+
310
</manifest>

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

+72-54
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,28 @@
11
package com.instabug.flutter.modules;
22

33
import android.util.Log;
4+
45
import androidx.annotation.NonNull;
56
import androidx.annotation.Nullable;
7+
68
import com.instabug.apm.APM;
9+
import com.instabug.apm.InternalAPM;
10+
import com.instabug.apm.configuration.cp.APMFeature;
11+
import com.instabug.apm.configuration.cp.FeatureAvailabilityCallback;
712
import com.instabug.apm.model.ExecutionTrace;
813
import com.instabug.apm.networking.APMNetworkLogger;
9-
import com.instabug.apm.networkinterception.cp.APMCPNetworkLog;
1014
import com.instabug.flutter.generated.ApmPigeon;
1115
import com.instabug.flutter.util.Reflection;
1216
import com.instabug.flutter.util.ThreadManager;
17+
1318
import io.flutter.plugin.common.BinaryMessenger;
14-
import org.json.JSONException;
19+
20+
import org.jetbrains.annotations.NotNull;
1521
import org.json.JSONObject;
22+
1623
import java.lang.reflect.Method;
1724
import java.util.HashMap;
1825
import java.util.Map;
19-
import java.util.Objects;
2026

2127
public class ApmApi implements ApmPigeon.ApmHostApi {
2228
private final String TAG = ApmApi.class.getName();
@@ -203,69 +209,81 @@ public void networkLogAndroid(@NonNull Map<String, Object> data) {
203209
if (data.containsKey("serverErrorMessage")) {
204210
serverErrorMessage = (String) data.get("serverErrorMessage");
205211
}
206-
Boolean w3cc = null;
207-
Long partialId = null;
208-
Long etst = null;
209-
String wgeti = null;
210-
String wceti = null;
211-
212-
try {
213-
w3cc = (Boolean) data.get("w3cc");
214212

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

219-
try {
220-
partialId = (Long) data.get("partialId");
221-
222-
} catch (Exception e) {
223-
e.printStackTrace();
224-
}
220+
} catch (Exception e) {
221+
e.printStackTrace();
222+
}
223+
}
225224

226-
try {
227-
etst = (Long) data.get("etst");
228225

229-
} catch (Exception e) {
230-
e.printStackTrace();
231-
}
232-
233-
try {
226+
@Override
227+
public void startCpUiTrace(@NonNull String screenName, @NonNull Long microTimeStamp, @NonNull Long traceId) {
228+
try {
229+
InternalAPM._startUiTraceCP(screenName, microTimeStamp, traceId);
230+
} catch (Exception e) {
231+
e.printStackTrace();
232+
}
233+
}
234234

235-
wgeti = (String) data.get("wgeti");
236-
if (Objects.equals(wgeti, "null")) {
237-
wgeti = null;
238-
}
235+
@Override
236+
public void reportScreenLoadingCP(@NonNull Long startTimeStampMicro, @NonNull Long durationMicro, @NonNull Long uiTraceId) {
237+
try {
238+
InternalAPM._reportScreenLoadingCP(startTimeStampMicro, durationMicro, uiTraceId);
239+
} catch (Exception e) {
240+
e.printStackTrace();
241+
}
242+
}
239243

240-
} catch (Exception e) {
241-
e.printStackTrace();
242-
}
244+
@Override
245+
public void endScreenLoadingCP(@NonNull Long timeStampMicro, @NonNull Long uiTraceId) {
246+
try {
247+
InternalAPM._endScreenLoadingCP(timeStampMicro, uiTraceId);
248+
} catch (Exception e) {
249+
e.printStackTrace();
250+
}
251+
}
243252

253+
@Override
254+
public void isEndScreenLoadingEnabled(@NonNull ApmPigeon.Result<Boolean> result) {
255+
isScreenLoadingEnabled(result);
256+
}
244257

245-
try {
246-
wceti = (String) data.get("wceti");
258+
@Override
259+
public void isEnabled(@NonNull ApmPigeon.Result<Boolean> result) {
260+
try {
261+
// TODO: replace true with an actual implementation of APM.isEnabled once implemented
262+
// in the Android SDK.
263+
result.success(true);
264+
} catch (Exception e) {
265+
e.printStackTrace();
266+
}
267+
}
247268

248-
if (Objects.equals(wceti, "null")) {
249-
wceti = null;
269+
@Override
270+
public void isScreenLoadingEnabled(@NonNull ApmPigeon.Result<Boolean> result) {
271+
try {
272+
InternalAPM._isFeatureEnabledCP(APMFeature.SCREEN_LOADING, "InstabugCaptureScreenLoading", new FeatureAvailabilityCallback() {
273+
@Override
274+
public void invoke(boolean isFeatureAvailable) {
275+
result.success(isFeatureAvailable);
250276
}
277+
});
278+
} catch (Exception e) {
279+
e.printStackTrace();
280+
}
281+
}
251282

252-
} catch (Exception e) {
253-
e.printStackTrace();
254-
}
255-
APMCPNetworkLog.W3CExternalTraceAttributes w3cExternalTraceAttributes =
256-
new APMCPNetworkLog.W3CExternalTraceAttributes(
257-
w3cc, partialId, etst, wgeti, wceti
258-
259-
);
260-
261-
262-
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);
263-
if (method != null) {
264-
method.invoke(apmNetworkLogger, requestStartTime, requestDuration, requestHeaders, requestBody, requestBodySize, requestMethod, requestUrl, requestContentType, responseHeaders, responseBody, responseBodySize, statusCode, responseContentType, errorMessage, gqlQueryName, serverErrorMessage,w3cExternalTraceAttributes);
265-
} else {
266-
Log.e(TAG, "APMNetworkLogger.log was not found by reflection");
267-
}
268-
283+
@Override
284+
public void setScreenLoadingEnabled(@NonNull Boolean isEnabled) {
285+
try {
286+
APM.setScreenLoadingEnabled(isEnabled);
269287
} catch (Exception e) {
270288
e.printStackTrace();
271289
}

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

+19-67
Original file line numberDiff line numberDiff line change
@@ -6,33 +6,22 @@
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.InternalAPM;
15-
import com.instabug.apm.configuration.cp.APMFeature;
16-
import com.instabug.apm.configuration.cp.APMFeaturesAvailability;
17-
import com.instabug.apm.configuration.cp.FeaturesChangeListener;
18-
import com.instabug.flutter.generated.RepliesPigeon;
19-
import com.instabug.flutter.generated.SurveysPigeon;
20-
import com.instabug.flutter.util.ArgsRegistry;
2112
import com.instabug.flutter.generated.InstabugPigeon;
13+
import com.instabug.flutter.util.ArgsRegistry;
2214
import com.instabug.flutter.util.Reflection;
2315
import com.instabug.flutter.util.ThreadManager;
24-
import com.instabug.library.Feature;
25-
import com.instabug.library.Instabug;
26-
import com.instabug.library.InstabugColorTheme;
27-
import com.instabug.library.InstabugCustomTextPlaceHolder;
28-
import com.instabug.library.IssueType;
29-
import com.instabug.library.Platform;
30-
import com.instabug.library.ReproConfigurations;
16+
import com.instabug.library.*;
3117
import com.instabug.library.internal.module.InstabugLocale;
3218
import com.instabug.library.invocation.InstabugInvocationEvent;
3319
import com.instabug.library.model.NetworkLog;
3420
import com.instabug.library.ui.onboarding.WelcomeMessage;
35-
21+
import io.flutter.FlutterInjector;
22+
import io.flutter.embedding.engine.loader.FlutterLoader;
23+
import io.flutter.plugin.common.BinaryMessenger;
24+
import org.jetbrains.annotations.NotNull;
3625
import org.json.JSONObject;
3726

3827
import java.io.File;
@@ -45,29 +34,20 @@
4534
import java.util.Map;
4635
import java.util.concurrent.Callable;
4736

48-
import io.flutter.FlutterInjector;
49-
import io.flutter.plugin.common.BinaryMessenger;
50-
import io.flutter.embedding.engine.loader.FlutterLoader;
51-
5237
public class InstabugApi implements InstabugPigeon.InstabugHostApi {
5338
private final String TAG = InstabugApi.class.getName();
5439
private final Context context;
5540
private final Callable<Bitmap> screenshotProvider;
5641
private final InstabugCustomTextPlaceHolder placeHolder = new InstabugCustomTextPlaceHolder();
5742

58-
private final InstabugPigeon.FeatureFlagsFlutterApi featureFlagsFlutterApi;
59-
6043
public static void init(BinaryMessenger messenger, Context context, Callable<Bitmap> screenshotProvider) {
61-
final InstabugPigeon.FeatureFlagsFlutterApi flutterApi = new InstabugPigeon.FeatureFlagsFlutterApi(messenger);
62-
63-
final InstabugApi api = new InstabugApi(context, screenshotProvider, flutterApi);
44+
final InstabugApi api = new InstabugApi(context, screenshotProvider);
6445
InstabugPigeon.InstabugHostApi.setup(messenger, api);
6546
}
6647

67-
public InstabugApi(Context context, Callable<Bitmap> screenshotProvider, InstabugPigeon.FeatureFlagsFlutterApi featureFlagsFlutterApi) {
48+
public InstabugApi(Context context, Callable<Bitmap> screenshotProvider) {
6849
this.context = context;
6950
this.screenshotProvider = screenshotProvider;
70-
this.featureFlagsFlutterApi = featureFlagsFlutterApi;
7151
}
7252

7353
@VisibleForTesting
@@ -96,6 +76,16 @@ public void setEnabled(@NonNull Boolean isEnabled) {
9676
}
9777
}
9878

79+
@NotNull
80+
@Override
81+
public Boolean isEnabled() {
82+
return Instabug.isEnabled();
83+
}
84+
85+
@NotNull
86+
@Override
87+
public Boolean isBuilt() { return Instabug.isBuilt(); }
88+
9989
@Override
10090
public void init(@NonNull String token, @NonNull List<String> invocationEvents, @NonNull String debugLogsLevel) {
10191
setCurrentPlatform();
@@ -401,51 +391,13 @@ public void networkLog(@NonNull Map<String, Object> data) {
401391
networkLog.setRequestHeaders((new JSONObject((HashMap<String, String>) data.get("requestHeaders"))).toString(4));
402392
networkLog.setResponseHeaders((new JSONObject((HashMap<String, String>) data.get("responseHeaders"))).toString(4));
403393
networkLog.setTotalDuration(((Number) data.get("duration")).longValue() / 1000);
394+
404395
networkLog.insert();
405396
} catch (Exception e) {
406397
Log.e(TAG, "Network logging failed");
407398
}
408399
}
409400

410-
@Override
411-
public void bindOnW3CFeatureFlagChangeCallback() {
412-
413-
try {
414-
InternalAPM._registerCPFeaturesChangeListener(new FeaturesChangeListener() {
415-
@Override
416-
public void invoke(@NonNull APMFeaturesAvailability apmFeaturesAvailability) {
417-
ThreadManager.runOnMainThread(new Runnable() {
418-
@Override
419-
public void run() {
420-
featureFlagsFlutterApi.onW3CFeatureFlagChange(apmFeaturesAvailability.isW3CExternalTraceIdAvailable(), apmFeaturesAvailability.getShouldAttachGeneratedHeader(), apmFeaturesAvailability.getShouldAttachCapturedHeader(), new InstabugPigeon.FeatureFlagsFlutterApi.Reply<Void>() {
421-
@Override
422-
public void reply(Void reply) {
423-
424-
}
425-
});
426-
}
427-
});
428-
}
429-
430-
});
431-
} catch (Exception e) {
432-
e.printStackTrace();
433-
}
434-
435-
}
436-
437-
@NonNull
438-
@Override
439-
public Map<String, Boolean> isW3FeatureFlagsEnabled() {
440-
Map<String, Boolean> params = new HashMap<String, Boolean>();
441-
params.put("isW3ExternalTraceIDEnabled", InternalAPM._isFeatureEnabledCP(APMFeature.W3C_EXTERNAL_TRACE_ID, " "));
442-
params.put("isW3ExternalGeneratedHeaderEnabled", InternalAPM._isFeatureEnabledCP(APMFeature.W3C_GENERATED_HEADER_ATTACHING, " "));
443-
params.put("isW3CaughtHeaderEnabled", InternalAPM._isFeatureEnabledCP(APMFeature.W3C_CAPTURED_HEADER_ATTACHING, " "));
444-
445-
446-
return params;
447-
}
448-
449401
@Override
450402
public void willRedirectToStore() {
451403
Instabug.willRedirectToStore();

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

-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
11
package com.instabug.flutter.modules;
22

33
import androidx.annotation.NonNull;
4-
import androidx.annotation.Nullable;
5-
64
import com.instabug.flutter.generated.SessionReplayPigeon;
7-
import com.instabug.library.OnSessionReplayLinkReady;
85
import com.instabug.library.sessionreplay.SessionReplay;
9-
106
import io.flutter.plugin.common.BinaryMessenger;
117

128
public class SessionReplayApi implements SessionReplayPigeon.SessionReplayHostApi {

0 commit comments

Comments
 (0)