-
-
Notifications
You must be signed in to change notification settings - Fork 426
/
UserInteractionIntegration.java
140 lines (117 loc) · 4.53 KB
/
UserInteractionIntegration.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package io.sentry.android.core;
import android.app.Activity;
import android.app.Application;
import android.os.Bundle;
import android.view.Window;
import io.sentry.IHub;
import io.sentry.Integration;
import io.sentry.SentryLevel;
import io.sentry.SentryOptions;
import io.sentry.android.core.internal.gestures.NoOpWindowCallback;
import io.sentry.android.core.internal.gestures.SentryGestureListener;
import io.sentry.android.core.internal.gestures.SentryWindowCallback;
import io.sentry.util.Objects;
import java.io.Closeable;
import java.io.IOException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public final class UserInteractionIntegration
implements Integration, Closeable, Application.ActivityLifecycleCallbacks {
private final @NotNull Application application;
private @Nullable IHub hub;
private @Nullable SentryAndroidOptions options;
private final boolean isAndroidXAvailable;
public UserInteractionIntegration(
final @NotNull Application application, final @NotNull LoadClass classLoader) {
this.application = Objects.requireNonNull(application, "Application is required");
isAndroidXAvailable =
classLoader.isClassAvailable("androidx.core.view.GestureDetectorCompat", options);
}
private void startTracking(final @NotNull Activity activity) {
final Window window = activity.getWindow();
if (window == null) {
if (options != null) {
options.getLogger().log(SentryLevel.INFO, "Window was null in startTracking");
}
return;
}
if (hub != null && options != null) {
Window.Callback delegate = window.getCallback();
if (delegate == null) {
delegate = new NoOpWindowCallback();
}
final SentryGestureListener gestureListener =
new SentryGestureListener(activity, hub, options);
window.setCallback(new SentryWindowCallback(delegate, activity, gestureListener, options));
}
}
private void stopTracking(final @NotNull Activity activity) {
final Window window = activity.getWindow();
if (window == null) {
if (options != null) {
options.getLogger().log(SentryLevel.INFO, "Window was null in stopTracking");
}
return;
}
final Window.Callback current = window.getCallback();
if (current instanceof SentryWindowCallback) {
((SentryWindowCallback) current).stopTracking();
if (((SentryWindowCallback) current).getDelegate() instanceof NoOpWindowCallback) {
window.setCallback(null);
} else {
window.setCallback(((SentryWindowCallback) current).getDelegate());
}
}
}
@Override
public void onActivityCreated(@NotNull Activity activity, @Nullable Bundle bundle) {}
@Override
public void onActivityStarted(@NotNull Activity activity) {}
@Override
public void onActivityResumed(@NotNull Activity activity) {
startTracking(activity);
}
@Override
public void onActivityPaused(@NotNull Activity activity) {
stopTracking(activity);
}
@Override
public void onActivityStopped(@NotNull Activity activity) {}
@Override
public void onActivitySaveInstanceState(@NotNull Activity activity, @NotNull Bundle bundle) {}
@Override
public void onActivityDestroyed(@NotNull Activity activity) {}
@Override
public void register(@NotNull IHub hub, @NotNull SentryOptions options) {
this.options =
Objects.requireNonNull(
(options instanceof SentryAndroidOptions) ? (SentryAndroidOptions) options : null,
"SentryAndroidOptions is required");
this.hub = Objects.requireNonNull(hub, "Hub is required");
final boolean integrationEnabled =
this.options.isEnableUserInteractionBreadcrumbs()
|| this.options.isEnableUserInteractionTracing();
this.options
.getLogger()
.log(SentryLevel.DEBUG, "UserInteractionIntegration enabled: %s", integrationEnabled);
if (integrationEnabled) {
if (isAndroidXAvailable) {
application.registerActivityLifecycleCallbacks(this);
this.options.getLogger().log(SentryLevel.DEBUG, "UserInteractionIntegration installed.");
} else {
options
.getLogger()
.log(
SentryLevel.INFO,
"androidx.core is not available, UserInteractionIntegration won't be installed");
}
}
}
@Override
public void close() throws IOException {
application.unregisterActivityLifecycleCallbacks(this);
if (options != null) {
options.getLogger().log(SentryLevel.DEBUG, "UserInteractionIntegration removed.");
}
}
}