Skip to content

Commit

Permalink
Fix activity holder access, return build info
Browse files Browse the repository at this point in the history
  • Loading branch information
krystofwoldrich committed Nov 16, 2022
1 parent ec05044 commit 2e19e51
Show file tree
Hide file tree
Showing 7 changed files with 33 additions and 43 deletions.
2 changes: 1 addition & 1 deletion sentry-android-core/api/sentry-android-core.api
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ public final class io/sentry/android/core/PhoneStateBreadcrumbsIntegration : io/
}

public final class io/sentry/android/core/ScreenshotEventProcessor : android/app/Application$ActivityLifecycleCallbacks, io/sentry/EventProcessor, java/io/Closeable {
public fun <init> (Landroid/app/Application;Lio/sentry/android/core/SentryAndroidOptions;)V
public fun <init> (Landroid/app/Application;Lio/sentry/android/core/SentryAndroidOptions;Lio/sentry/android/core/BuildInfoProvider;)V
public fun close ()V
public fun onActivityCreated (Landroid/app/Activity;Landroid/os/Bundle;)V
public fun onActivityDestroyed (Landroid/app/Activity;)V
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ private static void installDefaultIntegrations(
if (isFragmentAvailable) {
options.addIntegration(new FragmentLifecycleIntegration((Application) context, true, true));
}
options.addEventProcessor(new ScreenshotEventProcessor((Application) context, options));
options.addEventProcessor(new ScreenshotEventProcessor((Application) context, options, buildInfoProvider));
} else {
options
.getLogger()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,16 @@
import androidx.annotation.Nullable;
import java.lang.ref.WeakReference;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;

@ApiStatus.Internal
public class CurrentActivityHolder {

private static @Nullable CurrentActivityHolder instance;
private static @NotNull CurrentActivityHolder instance = new CurrentActivityHolder();

private @Nullable WeakReference<Activity> currentActivity;

public static CurrentActivityHolder getInstance() {
if (instance != null) {
return instance;
}
instance = new CurrentActivityHolder();
return instance;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,14 @@ public final class ScreenshotEventProcessor

private final @NotNull Application application;
private final @NotNull SentryAndroidOptions options;
private final @NotNull CurrentActivityHolder currentActivityHolder;
private final @NotNull BuildInfoProvider buildInfoProvider;
private boolean lifecycleCallbackInstalled = true;

public ScreenshotEventProcessor(
final @NotNull Application application, final @NotNull SentryAndroidOptions options) {
final @NotNull Application application, final @NotNull SentryAndroidOptions options, final @NotNull BuildInfoProvider buildInfoProvider) {
this.application = Objects.requireNonNull(application, "Application is required");
this.options = Objects.requireNonNull(options, "SentryAndroidOptions is required");
this.currentActivityHolder = CurrentActivityHolder.getInstance();
this.buildInfoProvider = Objects.requireNonNull(buildInfoProvider, "BuildInfoProvider is required");

application.registerActivityLifecycleCallbacks(this);
}
Expand All @@ -60,24 +60,24 @@ public ScreenshotEventProcessor(

return event;
}
if (currentActivityHolder.getActivity() == null || HintUtils.isFromHybridSdk(hint)) {
if (CurrentActivityHolder.getInstance().getActivity() == null || HintUtils.isFromHybridSdk(hint)) {
return event;
}

final byte[] screenshot =
takeScreenshot(currentActivityHolder.getActivity(), options.getLogger());
takeScreenshot(CurrentActivityHolder.getInstance().getActivity(), options.getLogger(), buildInfoProvider);
if (screenshot == null) {
return event;
}

hint.setScreenshot(Attachment.fromScreenshot(screenshot));
hint.set(ANDROID_ACTIVITY, currentActivityHolder.getActivity());
hint.set(ANDROID_ACTIVITY, CurrentActivityHolder.getInstance().getActivity());
return event;
}

@Override
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
currentActivityHolder.setActivity(activity);
CurrentActivityHolder.getInstance().setActivity(activity);
}

@Override
Expand Down Expand Up @@ -112,17 +112,17 @@ public void onActivityDestroyed(@NonNull Activity activity) {
public void close() throws IOException {
if (options.isAttachScreenshot()) {
application.unregisterActivityLifecycleCallbacks(this);
currentActivityHolder.clearActivity();
CurrentActivityHolder.getInstance().clearActivity();
}
}

private void cleanCurrentActivity(@NonNull Activity activity) {
if (currentActivityHolder.getActivity() == activity) {
currentActivityHolder.clearActivity();
if (CurrentActivityHolder.getInstance().getActivity() == activity) {
CurrentActivityHolder.getInstance().clearActivity();
}
}

private void setCurrentActivity(@NonNull Activity activity) {
currentActivityHolder.setActivity(activity);
CurrentActivityHolder.getInstance().setActivity(activity);
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,27 +1,28 @@
package io.sentry.android.core.internal.util;

import static io.sentry.android.core.internal.util.ActivityUtils.isActivityValid;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.os.Build;
import android.view.View;
import androidx.annotation.Nullable;
import io.sentry.ILogger;
import io.sentry.SentryLevel;
import io.sentry.android.core.BuildInfoProvider;

import java.io.ByteArrayOutputStream;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;

@ApiStatus.Internal
public class ScreenshotUtils {
public static @Nullable byte[] takeScreenshot(
final @Nullable Activity activity, final @NotNull ILogger logger) {
final @Nullable Activity activity, final @NotNull ILogger logger, final @NotNull BuildInfoProvider buildInfoProvider) {
if (activity == null) {
return null;
}

if (!isActivityValid(activity)
if (!isActivityValid(activity, buildInfoProvider)
|| activity.getWindow() == null
|| activity.getWindow().getDecorView() == null
|| activity.getWindow().getDecorView().getRootView() == null) {
Expand Down Expand Up @@ -61,4 +62,15 @@ public class ScreenshotUtils {
}
return null;
}

public static boolean isActivityValid(final @Nullable Activity activity, final @NotNull BuildInfoProvider buildInfoProvider) {
if (activity == null) {
return false;
}
if (buildInfoProvider.getSdkInfoVersion() >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
return !activity.isFinishing() && !activity.isDestroyed();
} else {
return !activity.isFinishing();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ class ScreenshotEventProcessorTest {

private class Fixture {
val application = mock<Application>()
val buildInfo = mock<BuildInfoProvider>()
val activity = mock<Activity>()
val window = mock<Window>()
val view = mock<View>()
Expand All @@ -48,7 +49,7 @@ class ScreenshotEventProcessorTest {
fun getSut(attachScreenshot: Boolean = false): ScreenshotEventProcessor {
options.isAttachScreenshot = attachScreenshot

return ScreenshotEventProcessor(application, options)
return ScreenshotEventProcessor(application, options, buildInfo)
}
}

Expand Down

0 comments on commit 2e19e51

Please sign in to comment.