Skip to content

Commit 8969506

Browse files
justacodefanbruno-garcia
authored andcommitted
[ANDROID] Support for passing in an Application directly to the AndroidSentryClientFactory (getsentry#714)
1 parent dd5613b commit 8969506

4 files changed

Lines changed: 91 additions & 12 deletions

File tree

sentry-android/src/main/java/io/sentry/android/AndroidSentryClientFactory.java

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package io.sentry.android;
22

33
import android.Manifest;
4+
import android.app.Application;
45
import android.content.Context;
56
import android.content.pm.PackageInfo;
67
import android.content.pm.PackageManager;
78
import android.util.Log;
8-
import io.sentry.*;
9+
import io.sentry.DefaultSentryClientFactory;
10+
import io.sentry.SentryClient;
911
import io.sentry.android.event.helper.AndroidEventBuilderHelper;
1012
import io.sentry.buffer.Buffer;
1113
import io.sentry.buffer.DiskBuffer;
@@ -14,7 +16,6 @@
1416
import io.sentry.context.SingletonContextManager;
1517
import io.sentry.dsn.Dsn;
1618
import io.sentry.util.Util;
17-
1819
import java.io.File;
1920
import java.util.ArrayList;
2021
import java.util.Collection;
@@ -30,24 +31,40 @@ public class AndroidSentryClientFactory extends DefaultSentryClientFactory {
3031
* Logger tag.
3132
*/
3233
public static final String TAG = AndroidSentryClientFactory.class.getName();
34+
3335
/**
3436
* Default Buffer directory name.
3537
*/
3638
private static final String DEFAULT_BUFFER_DIR = "sentry-buffered-events";
3739

3840
private Context ctx;
3941

42+
/**
43+
* Construct an AndroidSentryClientFactory using the base Context from the specified Android Application.
44+
*
45+
* @param app Android Application
46+
*/
47+
public AndroidSentryClientFactory(Application app) {
48+
Log.d(TAG, "Construction of Android Sentry from Android Application.");
49+
50+
this.ctx = app.getApplicationContext();
51+
}
52+
4053
/**
4154
* Construct an AndroidSentryClientFactory using the specified Android Context.
4255
*
4356
* @param ctx Android Context.
4457
*/
4558
public AndroidSentryClientFactory(Context ctx) {
46-
Log.d(TAG, "Construction of Android Sentry.");
59+
Log.d(TAG, "Construction of Android Sentry from Android Context.");
4760

4861
this.ctx = ctx.getApplicationContext();
62+
if (this.ctx == null) {
63+
this.ctx = ctx;
64+
}
4965
}
5066

67+
5168
@Override
5269
public SentryClient createSentryClient(Dsn dsn) {
5370
if (!checkPermission(Manifest.permission.INTERNET)) {
@@ -123,11 +140,11 @@ protected ContextManager getContextManager(Dsn dsn) {
123140
* Check whether the application has been granted a certain permission.
124141
*
125142
* @param permission Permission as a string
143+
*
126144
* @return true if permissions is granted
127145
*/
128146
private boolean checkPermission(String permission) {
129147
int res = ctx.checkCallingOrSelfPermission(permission);
130148
return (res == PackageManager.PERMISSION_GRANTED);
131149
}
132-
133150
}

sentry-android/src/test/java/io/sentry/android/SentryAndroidIT.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,31 @@
1212
public class SentryAndroidIT extends AndroidTest {
1313

1414
@Test
15-
public void test() throws Exception {
15+
public void testInitializingUsingBaseContext() throws Exception {
1616
verifyProject1PostRequestCount(0);
1717
verifyStoredEventCount(0);
1818

19-
SentryITActivity activity = Robolectric.setupActivity(SentryITActivity.class);
19+
SentryITActivityUsingBaseContext activity = Robolectric.setupActivity(SentryITActivityUsingBaseContext.class);
20+
Assert.assertEquals(activity.getCustomFactoryUsed(), true);
21+
22+
activity.sendEvent();
23+
waitUntilTrue(1000, new Callable<Boolean>() {
24+
@Override
25+
public Boolean call() throws Exception {
26+
return getStoredEvents().size() == 1;
27+
}
28+
});
29+
30+
verifyProject1PostRequestCount(1);
31+
verifyStoredEventCount(1);
32+
}
33+
34+
@Test
35+
public void testInitializingUsingApplication() throws Exception {
36+
verifyProject1PostRequestCount(0);
37+
verifyStoredEventCount(0);
38+
39+
SentryITActivityUsingApplication activity = Robolectric.setupActivity(SentryITActivityUsingApplication.class);
2040
Assert.assertEquals(activity.getCustomFactoryUsed(), true);
2141

2242
activity.sendEvent();
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package io.sentry.android;
2+
3+
import android.app.Activity;
4+
import android.app.Application;
5+
import android.content.Context;
6+
import android.os.Bundle;
7+
import io.sentry.Sentry;
8+
import java.util.concurrent.atomic.AtomicBoolean;
9+
10+
public class SentryITActivityUsingApplication extends Activity {
11+
12+
private AtomicBoolean customFactoryUsed = new AtomicBoolean(false);
13+
14+
class CustomAndroidSentryClientFactory extends AndroidSentryClientFactory {
15+
16+
/**
17+
* Construct an AndroidSentryClientFactory using the specified Android Context.
18+
*
19+
* @param app Android Application
20+
*/
21+
CustomAndroidSentryClientFactory(Application app) {
22+
super(app);
23+
customFactoryUsed.set(true);
24+
}
25+
}
26+
27+
@Override
28+
protected void onCreate(Bundle savedInstanceState) {
29+
super.onCreate(savedInstanceState);
30+
Sentry.init(
31+
"http://8292bf61d620417282e68a72ae03154a:e3908e05ad874b24b7a168992bfa3577@localhost:8080/1",
32+
new CustomAndroidSentryClientFactory(getApplication()));
33+
}
34+
35+
public void sendEvent() {
36+
Sentry.capture("sendEvent()");
37+
}
38+
39+
public boolean getCustomFactoryUsed() {
40+
return customFactoryUsed.get();
41+
}
42+
}

sentry-android/src/test/java/io/sentry/android/SentryITActivity.java renamed to sentry-android/src/test/java/io/sentry/android/SentryITActivityUsingBaseContext.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,24 @@
11
package io.sentry.android;
22

33
import android.app.Activity;
4+
import android.app.Application;
45
import android.content.Context;
56
import android.os.Bundle;
67
import io.sentry.Sentry;
7-
88
import java.util.concurrent.atomic.AtomicBoolean;
99

10-
public class SentryITActivity extends Activity {
10+
public class SentryITActivityUsingBaseContext extends Activity {
1111

1212
private AtomicBoolean customFactoryUsed = new AtomicBoolean(false);
1313

1414
class CustomAndroidSentryClientFactory extends AndroidSentryClientFactory {
15+
1516
/**
1617
* Construct an AndroidSentryClientFactory using the specified Android Context.
1718
*
18-
* @param ctx Android Context.
19+
* @param ctx Android Context
1920
*/
20-
public CustomAndroidSentryClientFactory(Context ctx) {
21+
CustomAndroidSentryClientFactory(Context ctx) {
2122
super(ctx);
2223
customFactoryUsed.set(true);
2324
}
@@ -28,7 +29,7 @@ protected void onCreate(Bundle savedInstanceState) {
2829
super.onCreate(savedInstanceState);
2930
Sentry.init(
3031
"http://8292bf61d620417282e68a72ae03154a:e3908e05ad874b24b7a168992bfa3577@localhost:8080/1",
31-
new CustomAndroidSentryClientFactory(getApplicationContext()));
32+
new CustomAndroidSentryClientFactory(getBaseContext()));
3233
}
3334

3435
public void sendEvent() {
@@ -38,5 +39,4 @@ public void sendEvent() {
3839
public boolean getCustomFactoryUsed() {
3940
return customFactoryUsed.get();
4041
}
41-
4242
}

0 commit comments

Comments
 (0)