Skip to content

Commit a2f777c

Browse files
fix(android): Init with ApplicationContext if available (#4780)
1 parent 6e348f4 commit a2f777c

File tree

4 files changed

+52
-4
lines changed

4 files changed

+52
-4
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@
1212

1313
- Fallback to Current Activity Holder when React Context Activity is not present ([#4779](https://github.com/getsentry/sentry-react-native/pull/4779))
1414

15+
### Fixes
16+
17+
- Initialize Sentry Android with ApplicationContext if available ([#4780](https://github.com/getsentry/sentry-react-native/pull/4780))
18+
1519
### Dependencies
1620

1721
- Bump Cocoa SDK from v8.49.1 to v8.49.2 ([#4792](https://github.com/getsentry/sentry-react-native/pull/4792))
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package io.sentry.react
2+
3+
import android.app.Application
4+
import org.junit.Assert.assertSame
5+
import org.junit.Test
6+
import org.junit.runner.RunWith
7+
import org.mockito.Mockito.mock
8+
import org.mockito.kotlin.whenever
9+
import org.robolectric.RobolectricTestRunner
10+
11+
@RunWith(RobolectricTestRunner::class)
12+
class RNSentryModuleInitWithApplicationTest {
13+
@Test
14+
fun `when application context is null fallback to react context`() {
15+
val mockedReactContext = Utils.makeReactContextMock()
16+
whenever(mockedReactContext.applicationContext).thenReturn(null)
17+
18+
assertSame(RNSentryModuleImpl(mockedReactContext).applicationContext, mockedReactContext)
19+
}
20+
21+
@Test
22+
fun `use application context if available`() {
23+
val mockedApplicationContext = mock(Application::class.java)
24+
val mockedReactContext = Utils.makeReactContextMock()
25+
whenever(mockedReactContext.applicationContext).thenReturn(mockedApplicationContext)
26+
27+
assertSame(RNSentryModuleImpl(mockedReactContext).applicationContext, mockedApplicationContext)
28+
}
29+
}

packages/core/RNSentryAndroidTester/app/src/test/java/io/sentry/react/Utils.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,21 @@ import org.mockito.kotlin.whenever
1010

1111
class Utils {
1212
companion object {
13-
fun createRNSentryModuleWithMockedContext(): RNSentryModuleImpl {
13+
fun makeReactContextMock(): ReactApplicationContext {
1414
val packageManager = mock(PackageManager::class.java)
1515
val packageInfo = mock(PackageInfo::class.java)
1616

1717
val reactContext = mock(ReactApplicationContext::class.java)
1818
whenever(reactContext.packageManager).thenReturn(packageManager)
1919
whenever(packageManager.getPackageInfo(anyString(), anyInt())).thenReturn(packageInfo)
2020

21+
return reactContext
22+
}
23+
24+
fun createRNSentryModuleWithMockedContext(): RNSentryModuleImpl {
2125
RNSentryModuleImpl.lastStartTimestampMs = -1
2226

23-
return RNSentryModuleImpl(reactContext)
27+
return RNSentryModuleImpl(makeReactContextMock())
2428
}
2529
}
2630
}

packages/core/android/src/main/java/io/sentry/react/RNSentryModuleImpl.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
import java.util.concurrent.CountDownLatch;
9191
import org.jetbrains.annotations.NotNull;
9292
import org.jetbrains.annotations.Nullable;
93+
import org.jetbrains.annotations.TestOnly;
9394

9495
public class RNSentryModuleImpl {
9596

@@ -177,12 +178,22 @@ public void initNativeReactNavigationNewFrameTracking(Promise promise) {
177178

178179
public void initNativeSdk(final ReadableMap rnOptions, Promise promise) {
179180
SentryAndroid.init(
180-
this.getReactApplicationContext(),
181-
options -> getSentryAndroidOptions(options, rnOptions, logger));
181+
getApplicationContext(), options -> getSentryAndroidOptions(options, rnOptions, logger));
182182

183183
promise.resolve(true);
184184
}
185185

186+
@TestOnly
187+
protected Context getApplicationContext() {
188+
final Context context = this.getReactApplicationContext().getApplicationContext();
189+
if (context == null) {
190+
logger.log(
191+
SentryLevel.ERROR, "ApplicationContext is null, using ReactApplicationContext fallback.");
192+
return this.getReactApplicationContext();
193+
}
194+
return context;
195+
}
196+
186197
protected void getSentryAndroidOptions(
187198
@NotNull SentryAndroidOptions options, @NotNull ReadableMap rnOptions, ILogger logger) {
188199
@Nullable SdkVersion sdkVersion = options.getSdkVersion();

0 commit comments

Comments
 (0)