Skip to content

Commit 2e19e51

Browse files
Fix activity holder access, return build info
1 parent ec05044 commit 2e19e51

7 files changed

Lines changed: 33 additions & 43 deletions

File tree

sentry-android-core/api/sentry-android-core.api

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ public final class io/sentry/android/core/PhoneStateBreadcrumbsIntegration : io/
122122
}
123123

124124
public final class io/sentry/android/core/ScreenshotEventProcessor : android/app/Application$ActivityLifecycleCallbacks, io/sentry/EventProcessor, java/io/Closeable {
125-
public fun <init> (Landroid/app/Application;Lio/sentry/android/core/SentryAndroidOptions;)V
125+
public fun <init> (Landroid/app/Application;Lio/sentry/android/core/SentryAndroidOptions;Lio/sentry/android/core/BuildInfoProvider;)V
126126
public fun close ()V
127127
public fun onActivityCreated (Landroid/app/Activity;Landroid/os/Bundle;)V
128128
public fun onActivityDestroyed (Landroid/app/Activity;)V

sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ private static void installDefaultIntegrations(
209209
if (isFragmentAvailable) {
210210
options.addIntegration(new FragmentLifecycleIntegration((Application) context, true, true));
211211
}
212-
options.addEventProcessor(new ScreenshotEventProcessor((Application) context, options));
212+
options.addEventProcessor(new ScreenshotEventProcessor((Application) context, options, buildInfoProvider));
213213
} else {
214214
options
215215
.getLogger()

sentry-android-core/src/main/java/io/sentry/android/core/CurrentActivityHolder.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,16 @@
55
import androidx.annotation.Nullable;
66
import java.lang.ref.WeakReference;
77
import org.jetbrains.annotations.ApiStatus;
8+
import org.jetbrains.annotations.NotNull;
89

910
@ApiStatus.Internal
1011
public class CurrentActivityHolder {
1112

12-
private static @Nullable CurrentActivityHolder instance;
13+
private static @NotNull CurrentActivityHolder instance = new CurrentActivityHolder();
1314

1415
private @Nullable WeakReference<Activity> currentActivity;
1516

1617
public static CurrentActivityHolder getInstance() {
17-
if (instance != null) {
18-
return instance;
19-
}
20-
instance = new CurrentActivityHolder();
2118
return instance;
2219
}
2320

sentry-android-core/src/main/java/io/sentry/android/core/ScreenshotEventProcessor.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,14 @@ public final class ScreenshotEventProcessor
3030

3131
private final @NotNull Application application;
3232
private final @NotNull SentryAndroidOptions options;
33-
private final @NotNull CurrentActivityHolder currentActivityHolder;
33+
private final @NotNull BuildInfoProvider buildInfoProvider;
3434
private boolean lifecycleCallbackInstalled = true;
3535

3636
public ScreenshotEventProcessor(
37-
final @NotNull Application application, final @NotNull SentryAndroidOptions options) {
37+
final @NotNull Application application, final @NotNull SentryAndroidOptions options, final @NotNull BuildInfoProvider buildInfoProvider) {
3838
this.application = Objects.requireNonNull(application, "Application is required");
3939
this.options = Objects.requireNonNull(options, "SentryAndroidOptions is required");
40-
this.currentActivityHolder = CurrentActivityHolder.getInstance();
40+
this.buildInfoProvider = Objects.requireNonNull(buildInfoProvider, "BuildInfoProvider is required");
4141

4242
application.registerActivityLifecycleCallbacks(this);
4343
}
@@ -60,24 +60,24 @@ public ScreenshotEventProcessor(
6060

6161
return event;
6262
}
63-
if (currentActivityHolder.getActivity() == null || HintUtils.isFromHybridSdk(hint)) {
63+
if (CurrentActivityHolder.getInstance().getActivity() == null || HintUtils.isFromHybridSdk(hint)) {
6464
return event;
6565
}
6666

6767
final byte[] screenshot =
68-
takeScreenshot(currentActivityHolder.getActivity(), options.getLogger());
68+
takeScreenshot(CurrentActivityHolder.getInstance().getActivity(), options.getLogger(), buildInfoProvider);
6969
if (screenshot == null) {
7070
return event;
7171
}
7272

7373
hint.setScreenshot(Attachment.fromScreenshot(screenshot));
74-
hint.set(ANDROID_ACTIVITY, currentActivityHolder.getActivity());
74+
hint.set(ANDROID_ACTIVITY, CurrentActivityHolder.getInstance().getActivity());
7575
return event;
7676
}
7777

7878
@Override
7979
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
80-
currentActivityHolder.setActivity(activity);
80+
CurrentActivityHolder.getInstance().setActivity(activity);
8181
}
8282

8383
@Override
@@ -112,17 +112,17 @@ public void onActivityDestroyed(@NonNull Activity activity) {
112112
public void close() throws IOException {
113113
if (options.isAttachScreenshot()) {
114114
application.unregisterActivityLifecycleCallbacks(this);
115-
currentActivityHolder.clearActivity();
115+
CurrentActivityHolder.getInstance().clearActivity();
116116
}
117117
}
118118

119119
private void cleanCurrentActivity(@NonNull Activity activity) {
120-
if (currentActivityHolder.getActivity() == activity) {
121-
currentActivityHolder.clearActivity();
120+
if (CurrentActivityHolder.getInstance().getActivity() == activity) {
121+
CurrentActivityHolder.getInstance().clearActivity();
122122
}
123123
}
124124

125125
private void setCurrentActivity(@NonNull Activity activity) {
126-
currentActivityHolder.setActivity(activity);
126+
CurrentActivityHolder.getInstance().setActivity(activity);
127127
}
128128
}

sentry-android-core/src/main/java/io/sentry/android/core/internal/util/ActivityUtils.java

Lines changed: 0 additions & 20 deletions
This file was deleted.

sentry-android-core/src/main/java/io/sentry/android/core/internal/util/ScreenshotUtils.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,28 @@
11
package io.sentry.android.core.internal.util;
22

3-
import static io.sentry.android.core.internal.util.ActivityUtils.isActivityValid;
4-
53
import android.app.Activity;
64
import android.graphics.Bitmap;
75
import android.graphics.Canvas;
6+
import android.os.Build;
87
import android.view.View;
98
import androidx.annotation.Nullable;
109
import io.sentry.ILogger;
1110
import io.sentry.SentryLevel;
11+
import io.sentry.android.core.BuildInfoProvider;
12+
1213
import java.io.ByteArrayOutputStream;
1314
import org.jetbrains.annotations.ApiStatus;
1415
import org.jetbrains.annotations.NotNull;
1516

1617
@ApiStatus.Internal
1718
public class ScreenshotUtils {
1819
public static @Nullable byte[] takeScreenshot(
19-
final @Nullable Activity activity, final @NotNull ILogger logger) {
20+
final @Nullable Activity activity, final @NotNull ILogger logger, final @NotNull BuildInfoProvider buildInfoProvider) {
2021
if (activity == null) {
2122
return null;
2223
}
2324

24-
if (!isActivityValid(activity)
25+
if (!isActivityValid(activity, buildInfoProvider)
2526
|| activity.getWindow() == null
2627
|| activity.getWindow().getDecorView() == null
2728
|| activity.getWindow().getDecorView().getRootView() == null) {
@@ -61,4 +62,15 @@ public class ScreenshotUtils {
6162
}
6263
return null;
6364
}
65+
66+
public static boolean isActivityValid(final @Nullable Activity activity, final @NotNull BuildInfoProvider buildInfoProvider) {
67+
if (activity == null) {
68+
return false;
69+
}
70+
if (buildInfoProvider.getSdkInfoVersion() >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
71+
return !activity.isFinishing() && !activity.isDestroyed();
72+
} else {
73+
return !activity.isFinishing();
74+
}
75+
}
6476
}

sentry-android-core/src/test/java/io/sentry/android/core/ScreenshotEventProcessorTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class ScreenshotEventProcessorTest {
2828

2929
private class Fixture {
3030
val application = mock<Application>()
31+
val buildInfo = mock<BuildInfoProvider>()
3132
val activity = mock<Activity>()
3233
val window = mock<Window>()
3334
val view = mock<View>()
@@ -48,7 +49,7 @@ class ScreenshotEventProcessorTest {
4849
fun getSut(attachScreenshot: Boolean = false): ScreenshotEventProcessor {
4950
options.isAttachScreenshot = attachScreenshot
5051

51-
return ScreenshotEventProcessor(application, options)
52+
return ScreenshotEventProcessor(application, options, buildInfo)
5253
}
5354
}
5455

0 commit comments

Comments
 (0)