Skip to content

Commit 7f15ed9

Browse files
fix(android): Resolve ANR in showSurvey
This fix addresses the ANR issue in the `showSurvey` function on Android. The resolution ensures smoother execution by defaulting it to the background thread.
1 parent a18e8d2 commit 7f15ed9

File tree

4 files changed

+54
-2
lines changed

4 files changed

+54
-2
lines changed

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

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,29 @@
11
package com.instabug.flutter.modules;
22

3+
import android.util.Log;
4+
35
import androidx.annotation.NonNull;
6+
import androidx.annotation.VisibleForTesting;
47

58
import com.instabug.flutter.generated.SurveysPigeon;
9+
import com.instabug.flutter.util.Reflection;
610
import com.instabug.flutter.util.ThreadManager;
711
import com.instabug.library.Feature;
12+
import com.instabug.library.Platform;
813
import com.instabug.survey.Survey;
914
import com.instabug.survey.Surveys;
1015
import com.instabug.survey.callbacks.OnDismissCallback;
1116
import com.instabug.survey.callbacks.OnShowCallback;
1217

18+
import java.lang.reflect.Method;
1319
import java.util.ArrayList;
1420
import java.util.List;
1521

1622
import io.flutter.plugin.common.BinaryMessenger;
1723

1824
public class SurveysApi implements SurveysPigeon.SurveysHostApi {
25+
26+
private final String TAG = InstabugApi.class.getName();
1927
private final SurveysPigeon.SurveysFlutterApi flutterApi;
2028

2129
public static void init(BinaryMessenger messenger) {
@@ -42,9 +50,28 @@ public void showSurveyIfAvailable() {
4250
Surveys.showSurveyIfAvailable();
4351
}
4452

53+
/**
54+
* Displays a survey using reflection, eliminating the need to call it on a background thread.
55+
* This variant does not return a boolean indicating the existence of the survey.
56+
* Invoked through reflection.
57+
*/
58+
@VisibleForTesting
59+
public void showSurveyCP(@NonNull String surveyToken) {
60+
try {
61+
Method method = Reflection.getMethod(Class.forName("com.instabug.survey.Surveys"), "showSurveyCP", String.class);
62+
if (method != null) {
63+
method.invoke(null, surveyToken);
64+
} else {
65+
Log.e(TAG, "showSurveyCP was not found by reflection");
66+
}
67+
} catch (Exception e) {
68+
e.printStackTrace();
69+
}
70+
}
71+
4572
@Override
4673
public void showSurvey(@NonNull String surveyToken) {
47-
Surveys.showSurvey(surveyToken);
74+
showSurveyCP(surveyToken);
4875
}
4976

5077
@Override

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

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

3+
import static com.instabug.flutter.util.GlobalMocks.reflected;
34
import static com.instabug.flutter.util.MockResult.makeResult;
45
import static org.junit.Assert.assertEquals;
56
import static org.mockito.ArgumentMatchers.any;
67
import static org.mockito.ArgumentMatchers.eq;
78
import static org.mockito.Mockito.mock;
89
import static org.mockito.Mockito.mockStatic;
10+
import static org.mockito.Mockito.never;
911
import static org.mockito.Mockito.spy;
1012
import static org.mockito.Mockito.verify;
1113

1214
import com.instabug.flutter.generated.SurveysPigeon;
1315
import com.instabug.flutter.modules.SurveysApi;
1416
import com.instabug.flutter.util.GlobalMocks;
17+
import com.instabug.flutter.util.MockReflected;
1518
import com.instabug.library.Feature;
19+
import com.instabug.library.Platform;
1620
import com.instabug.survey.Survey;
1721
import com.instabug.survey.Surveys;
1822
import com.instabug.survey.callbacks.OnDismissCallback;
@@ -82,13 +86,23 @@ public void testShowSurveyIfAvailable() {
8286
mSurveys.verify(Surveys::showSurveyIfAvailable);
8387
}
8488

89+
@Test
90+
public void testShowSurveyCp() {
91+
String token = "survey-token";
92+
93+
api.showSurveyCP(token);
94+
95+
reflected.verify(() -> MockReflected.showSurveyCP(token));
96+
}
97+
8598
@Test
8699
public void testShowSurvey() {
87100
String token = "survey-token";
88101

89102
api.showSurvey(token);
90103

91-
mSurveys.verify(() -> Surveys.showSurvey(token));
104+
reflected.verify(() -> MockReflected.showSurveyCP(token));
105+
mSurveys.verify(() -> Surveys.showSurvey(token), never());
92106
}
93107

94108
@Test

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,12 @@ public static void setUp() throws NoSuchMethodException {
7777

7878
uri = mockStatic(Uri.class);
7979
uri.when(() -> Uri.fromFile(any())).thenReturn(mock(Uri.class));
80+
81+
Method mShowSurveyCP = MockReflected.class.getDeclaredMethod("showSurveyCP", String.class);
82+
mShowSurveyCP.setAccessible(true);
83+
reflection
84+
.when(() -> Reflection.getMethod(Class.forName("com.instabug.survey.Surveys"), "showSurveyCP", String.class))
85+
.thenReturn(mShowSurveyCP);
8086
}
8187

8288
public static void close() {

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,9 @@ public static void apmNetworkLog(long requestStartTime, long requestDuration, St
3636
* CrashReporting.reportException
3737
*/
3838
public static void crashReportException(JSONObject exception, boolean isHandled) {}
39+
40+
/**
41+
* Surveys.showSurveyCP
42+
*/
43+
public static void showSurveyCP(String surveyToken) {}
3944
}

0 commit comments

Comments
 (0)