Skip to content

Commit

Permalink
refactor: extract activity lifecycle callbacks from process lifecycle…
Browse files Browse the repository at this point in the history
… callbacks
  • Loading branch information
fractalwrench committed Nov 14, 2023
1 parent 5168910 commit d364e76
Show file tree
Hide file tree
Showing 51 changed files with 876 additions and 646 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,10 @@ import io.embrace.android.embracesdk.logging.InternalStaticEmbraceLogger.Compani
import io.embrace.android.embracesdk.samples.AutomaticVerificationChecker
import io.embrace.android.embracesdk.samples.VerificationActions
import io.embrace.android.embracesdk.samples.VerifyIntegrationException
import io.embrace.android.embracesdk.session.ActivityListener
import io.embrace.android.embracesdk.session.ActivityService
import io.embrace.android.embracesdk.session.lifecycle.ActivityLifecycleListener
import io.embrace.android.embracesdk.session.lifecycle.ActivityTracker
import io.embrace.android.embracesdk.session.lifecycle.ProcessStateListener
import io.embrace.android.embracesdk.session.lifecycle.ProcessStateService
import java.io.IOException
import java.util.concurrent.Executors
import java.util.concurrent.RejectedExecutionException
Expand All @@ -33,13 +35,16 @@ import kotlin.system.exitProcess
*/
internal class EmbraceAutomaticVerification(
private val scheduledExecutorService: ScheduledExecutorService = Executors.newSingleThreadScheduledExecutor()
) : ActivityListener {
) : ActivityLifecycleListener, ProcessStateListener {
private val handler = Handler(Looper.getMainLooper())

private var foregroundEventTriggered = false

@VisibleForTesting
internal lateinit var activityService: ActivityService
internal lateinit var activityLifecycleTracker: ActivityTracker

@VisibleForTesting
internal lateinit var processStateService: ProcessStateService

Check warning on line 47 in embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/EmbraceAutomaticVerification.kt

View check run for this annotation

Codecov / codecov/patch

embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/EmbraceAutomaticVerification.kt#L47

Added line #L47 was not covered by tests

@VisibleForTesting
var automaticVerificationChecker = AutomaticVerificationChecker()
Expand Down Expand Up @@ -69,10 +74,14 @@ internal class EmbraceAutomaticVerification(

@VisibleForTesting
fun setActivityListener() {
if (!::activityService.isInitialized) {
activityService = checkNotNull(Embrace.getImpl().activityService)
if (!::activityLifecycleTracker.isInitialized) {
activityLifecycleTracker = checkNotNull(Embrace.getImpl().activityLifecycleTracker)
}
if (!::processStateService.isInitialized) {
processStateService = checkNotNull(Embrace.getImpl().activityService)
}
activityService.addListener(this)
activityLifecycleTracker.addListener(this)
processStateService.addListener(this)

Check warning on line 84 in embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/EmbraceAutomaticVerification.kt

View check run for this annotation

Codecov / codecov/patch

embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/EmbraceAutomaticVerification.kt#L83-L84

Added lines #L83 - L84 were not covered by tests
}

/**
Expand All @@ -94,7 +103,7 @@ internal class EmbraceAutomaticVerification(

@VisibleForTesting
fun startVerification() {
val activity = activityService.foregroundActivity
val activity = activityLifecycleTracker.foregroundActivity
if (activity != null) {
try {
if (automaticVerificationChecker.createFile(activity)) {
Expand Down Expand Up @@ -189,7 +198,7 @@ internal class EmbraceAutomaticVerification(
*/
fun restartAppFromPendingIntent() {
val exitStatus = 2
val activity = activityService.foregroundActivity
val activity = activityLifecycleTracker.foregroundActivity

Check warning on line 201 in embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/EmbraceAutomaticVerification.kt

View check run for this annotation

Codecov / codecov/patch

embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/EmbraceAutomaticVerification.kt#L201

Added line #L201 was not covered by tests
if (activity != null) {
val intent = activity.intent
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
Expand All @@ -207,7 +216,7 @@ internal class EmbraceAutomaticVerification(

override fun onForeground(coldStart: Boolean, startupTime: Long, timestamp: Long) {
foregroundEventTriggered = true
val activity = activityService.foregroundActivity
val activity = activityLifecycleTracker.foregroundActivity

Check warning on line 219 in embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/EmbraceAutomaticVerification.kt

View check run for this annotation

Codecov / codecov/patch

embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/EmbraceAutomaticVerification.kt#L219

Added line #L219 was not covered by tests

if (activity != null) {
val fromVerification = activity.intent.getBooleanExtra("from_verification", false)
Expand Down Expand Up @@ -265,7 +274,7 @@ internal class EmbraceAutomaticVerification(
}

private fun showSuccessDialog() {
val activity = activityService.foregroundActivity
val activity = activityLifecycleTracker.foregroundActivity

Check warning on line 277 in embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/EmbraceAutomaticVerification.kt

View check run for this annotation

Codecov / codecov/patch

embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/EmbraceAutomaticVerification.kt#L277

Added line #L277 was not covered by tests
if (activity != null) {
val dialogBuilder = AlertDialog.Builder(activity)
dialogBuilder
Expand All @@ -282,7 +291,7 @@ internal class EmbraceAutomaticVerification(
}

private fun showDialogWithError(errorMessage: Int? = null) {
val activity = activityService.foregroundActivity
val activity = activityLifecycleTracker.foregroundActivity

Check warning on line 294 in embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/EmbraceAutomaticVerification.kt

View check run for this annotation

Codecov / codecov/patch

embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/EmbraceAutomaticVerification.kt#L294

Added line #L294 was not covered by tests
if (activity != null) {
val exceptions = automaticVerificationChecker.getExceptions().map { it.message }.toMutableList()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,9 +89,10 @@
import io.embrace.android.embracesdk.payload.TapBreadcrumb;
import io.embrace.android.embracesdk.prefs.PreferencesService;
import io.embrace.android.embracesdk.registry.ServiceRegistry;
import io.embrace.android.embracesdk.session.ActivityService;
import io.embrace.android.embracesdk.session.lifecycle.ActivityLifecycleTracker;
import io.embrace.android.embracesdk.session.lifecycle.ActivityTracker;
import io.embrace.android.embracesdk.session.lifecycle.ProcessStateService;
import io.embrace.android.embracesdk.session.BackgroundActivityService;
import io.embrace.android.embracesdk.session.EmbraceActivityService;
import io.embrace.android.embracesdk.session.EmbraceSessionProperties;
import io.embrace.android.embracesdk.session.EmbraceSessionService;
import io.embrace.android.embracesdk.session.SessionService;
Expand Down Expand Up @@ -169,7 +170,10 @@ final class EmbraceImpl {
private volatile MetadataService metadataService;

@Nullable
private volatile ActivityService activityService;
private volatile ProcessStateService processStateService;

@Nullable
private volatile ActivityTracker activityTracker;

@Nullable
private volatile NetworkLoggingService networkLoggingService;
Expand Down Expand Up @@ -379,18 +383,21 @@ private void startImpl(@NonNull Context context,
() -> null,
new DeviceArchitectureImpl());

final ActivityService nonNullActivityService = essentialServiceModule.getActivityService();
activityService = nonNullActivityService;
final ProcessStateService nonNullProcessStateService = essentialServiceModule.getProcessStateService();
processStateService = nonNullProcessStateService;
final MetadataService nonNullMetadataService = essentialServiceModule.getMetadataService();
metadataService = nonNullMetadataService;
final ConfigService nonNullConfigService = essentialServiceModule.getConfigService();
configService = nonNullConfigService;

// example usage.
ActivityTracker nonNullLifecycleTracker = essentialServiceModule.getActivityLifecycleTracker();
this.activityTracker = nonNullLifecycleTracker;
serviceRegistry.registerServices(
activityService,
processStateService,
metadataService,
configService
configService,
nonNullLifecycleTracker
);

// only call after ConfigService has initialized.
Expand Down Expand Up @@ -652,14 +659,15 @@ private void startImpl(@NonNull Context context,
// no more services can be added to the registry. It sets listeners for any services that were
// registered.
serviceRegistry.closeRegistration();
serviceRegistry.registerActivityListeners(nonNullActivityService);
serviceRegistry.registerActivityListeners(nonNullProcessStateService);
serviceRegistry.registerConfigListeners(nonNullConfigService);
serviceRegistry.registerMemoryCleanerListeners(essentialServiceModule.getMemoryCleanerService());
serviceRegistry.registerActivityLifecycleListeners(nonNullLifecycleTracker);

// Attempt to send the startup event if the app is already in the foreground. We registered to send this when
// we went to the foreground, but if an activity had already gone to the foreground, we may have missed
// sending this, so to ensure the startup message is sent, we force it to be sent here.
if (!nonNullActivityService.isInBackground()) {
if (!nonNullProcessStateService.isInBackground()) {
internalEmbraceLogger.logDeveloper("Embrace", "Sending startup moment");
nonNullEventService.sendStartupMoment();
}
Expand Down Expand Up @@ -1518,8 +1526,13 @@ EventService getEventService() {
}

@Nullable
ActivityService getActivityService() {
return activityService;
ProcessStateService getActivityService() {
return processStateService;
}

@Nullable
ActivityTracker getActivityLifecycleTracker() {
return activityTracker;

Check warning on line 1535 in embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/EmbraceImpl.java

View check run for this annotation

Codecov / codecov/patch

embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/EmbraceImpl.java#L1535

Added line #L1535 was not covered by tests
}

@Nullable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ import io.embrace.android.embracesdk.internal.clock.Clock
import io.embrace.android.embracesdk.internal.enforceThread
import io.embrace.android.embracesdk.logging.InternalEmbraceLogger
import io.embrace.android.embracesdk.payload.AnrInterval
import io.embrace.android.embracesdk.session.ActivityListener
import io.embrace.android.embracesdk.session.MemoryCleanerListener
import io.embrace.android.embracesdk.session.lifecycle.ProcessStateListener
import java.util.concurrent.Callable
import java.util.concurrent.CopyOnWriteArrayList
import java.util.concurrent.ScheduledExecutorService
Expand All @@ -39,7 +39,7 @@ internal class EmbraceAnrService(
private val anrProcessErrorSampler: AnrProcessErrorSampler,
@field:VisibleForTesting val clock: Clock,
private val anrMonitorThread: AtomicReference<Thread>
) : AnrService, MemoryCleanerListener, ActivityListener, BlockedThreadListener {
) : AnrService, MemoryCleanerListener, ProcessStateListener, BlockedThreadListener {

private val state: ThreadMonitoringState
private val targetThread: Thread
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ import io.embrace.android.embracesdk.payload.TapBreadcrumb
import io.embrace.android.embracesdk.payload.TapBreadcrumb.TapBreadcrumbType
import io.embrace.android.embracesdk.payload.ViewBreadcrumb
import io.embrace.android.embracesdk.payload.WebViewBreadcrumb
import io.embrace.android.embracesdk.session.ActivityListener
import io.embrace.android.embracesdk.session.MemoryCleanerListener
import io.embrace.android.embracesdk.session.lifecycle.ActivityLifecycleListener
import io.embrace.android.embracesdk.utils.filter
import java.util.Collections
import java.util.Deque
Expand All @@ -42,7 +42,7 @@ internal class EmbraceBreadcrumbService(
clock: Clock,
configService: ConfigService,
logger: InternalEmbraceLogger
) : BreadcrumbService, ActivityListener, MemoryCleanerListener {
) : BreadcrumbService, ActivityLifecycleListener, MemoryCleanerListener {

/**
* Clock used by the service
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@ import android.os.Bundle
import androidx.annotation.VisibleForTesting
import io.embrace.android.embracesdk.logging.InternalEmbraceLogger
import io.embrace.android.embracesdk.payload.PushNotificationBreadcrumb.NotificationType
import io.embrace.android.embracesdk.session.ActivityListener
import io.embrace.android.embracesdk.session.lifecycle.ActivityLifecycleListener

/**
* In charge of handling all notifications related functionality.
*/
internal class PushNotificationCaptureService(
private val breadCrumbService: BreadcrumbService,
private val logger: InternalEmbraceLogger
) : ActivityListener {
) : ActivityLifecycleListener {

@VisibleForTesting
companion object Utils {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ import io.embrace.android.embracesdk.payload.AppInfo
import io.embrace.android.embracesdk.payload.DeviceInfo
import io.embrace.android.embracesdk.payload.DiskUsage
import io.embrace.android.embracesdk.prefs.PreferencesService
import io.embrace.android.embracesdk.session.ActivityListener
import io.embrace.android.embracesdk.session.ActivityService
import io.embrace.android.embracesdk.session.lifecycle.ActivityLifecycleListener
import io.embrace.android.embracesdk.session.lifecycle.ProcessStateService
import io.embrace.android.embracesdk.utils.eagerLazyLoad
import java.io.ByteArrayOutputStream
import java.io.FileInputStream
Expand Down Expand Up @@ -60,7 +60,7 @@ internal class EmbraceMetadataService private constructor(
private val appUpdated: Lazy<Boolean>,
private val osUpdated: Lazy<Boolean>,
private val preferencesService: PreferencesService,
private val activityService: ActivityService,
private val processStateService: ProcessStateService,
reactNativeBundleId: Lazy<String?>,
javaScriptPatchNumber: String?,
reactNativeVersion: String?,
Expand All @@ -72,7 +72,7 @@ internal class EmbraceMetadataService private constructor(
private val clock: Clock,
private val embraceCpuInfoDelegate: CpuInfoDelegate,
private val deviceArchitecture: DeviceArchitecture
) : MetadataService, ActivityListener {
) : MetadataService, ActivityLifecycleListener {

private val statFs = lazy { StatFs(Environment.getDataDirectory().path) }
private val javaScriptPatchNumber: String?
Expand Down Expand Up @@ -406,7 +406,7 @@ internal class EmbraceMetadataService private constructor(
}

override fun getAppState(): String {
return if (activityService.isInBackground) {
return if (processStateService.isInBackground) {
logDeveloper("EmbraceMetadataService", "App state: BACKGROUND")
"background"
} else {
Expand Down Expand Up @@ -517,7 +517,7 @@ internal class EmbraceMetadataService private constructor(
configService: ConfigService,
appFramework: AppFramework,
preferencesService: PreferencesService,
activityService: ActivityService,
processStateService: ProcessStateService,
metadataRetrieveExecutorService: ExecutorService,
storageStatsManager: StorageStatsManager?,
windowManager: WindowManager?,
Expand Down Expand Up @@ -630,7 +630,7 @@ internal class EmbraceMetadataService private constructor(
isAppUpdated,
isOsUpdated,
preferencesService,
activityService,
processStateService,
reactNativeBundleId,
javaScriptPatchNumber,
reactNativeVersion,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@ import io.embrace.android.embracesdk.logging.InternalStaticEmbraceLogger
import io.embrace.android.embracesdk.logging.InternalStaticEmbraceLogger.Companion.logDebug
import io.embrace.android.embracesdk.logging.InternalStaticEmbraceLogger.Companion.logDeveloper
import io.embrace.android.embracesdk.payload.PowerModeInterval
import io.embrace.android.embracesdk.session.ActivityListener
import io.embrace.android.embracesdk.session.lifecycle.ProcessStateListener
import java.util.concurrent.ExecutorService

internal class EmbracePowerSaveModeService(
private val context: Context,
private val executorService: ExecutorService,
private val clock: Clock,
private val powerManager: PowerManager?
) : BroadcastReceiver(), PowerSaveModeService, ActivityListener {
) : BroadcastReceiver(), PowerSaveModeService, ProcessStateListener {

private val tag = "EmbracePowerSaveModeService"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ import io.embrace.android.embracesdk.logging.InternalEmbraceLogger
import io.embrace.android.embracesdk.payload.UserInfo
import io.embrace.android.embracesdk.payload.UserInfo.Companion.ofStored
import io.embrace.android.embracesdk.prefs.PreferencesService
import io.embrace.android.embracesdk.session.ActivityListener
import io.embrace.android.embracesdk.session.lifecycle.ProcessStateListener
import java.util.regex.Pattern

internal class EmbraceUserService(
private val preferencesService: PreferencesService,
private val logger: InternalEmbraceLogger
) : ActivityListener, UserService {
) : ProcessStateListener, UserService {

@Volatile
@VisibleForTesting
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import io.embrace.android.embracesdk.config.remote.RemoteConfig
import io.embrace.android.embracesdk.internal.clock.Clock
import io.embrace.android.embracesdk.logging.InternalEmbraceLogger
import io.embrace.android.embracesdk.prefs.PreferencesService
import io.embrace.android.embracesdk.session.ActivityListener
import io.embrace.android.embracesdk.session.lifecycle.ProcessStateListener
import io.embrace.android.embracesdk.utils.stream
import java.util.concurrent.Callable
import java.util.concurrent.CopyOnWriteArraySet
Expand All @@ -45,7 +45,7 @@ internal class EmbraceConfigService @JvmOverloads constructor(
isDebug: Boolean,
private val stopBehavior: () -> Unit = {},
internal val thresholdCheck: BehaviorThresholdCheck = BehaviorThresholdCheck(preferencesService::deviceIdentifier)
) : ConfigService, ActivityListener {
) : ConfigService, ProcessStateListener {

/**
* The listeners subscribed to configuration changes.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@ import io.embrace.android.embracesdk.internal.spans.toEmbraceSpanName
import io.embrace.android.embracesdk.internal.utils.Uuid.getEmbUuid
import io.embrace.android.embracesdk.logging.InternalEmbraceLogger
import io.embrace.android.embracesdk.logging.InternalStaticEmbraceLogger.Companion.logDeveloper
import io.embrace.android.embracesdk.session.ActivityListener
import io.embrace.android.embracesdk.session.EmbraceSessionProperties
import io.embrace.android.embracesdk.session.MemoryCleanerListener
import io.embrace.android.embracesdk.session.lifecycle.ActivityLifecycleListener
import io.embrace.android.embracesdk.session.lifecycle.ProcessStateListener
import io.embrace.android.embracesdk.utils.stream
import io.embrace.android.embracesdk.worker.ExecutorName
import io.embrace.android.embracesdk.worker.WorkerThreadModule
Expand Down Expand Up @@ -46,7 +47,7 @@ internal class EmbraceEventService(
workerThreadModule: WorkerThreadModule,
private val clock: Clock,
private val spansService: SpansService
) : EventService, ActivityListener, MemoryCleanerListener {
) : EventService, ActivityLifecycleListener, ProcessStateListener, MemoryCleanerListener {
private val executorService: ExecutorService

/**
Expand Down
Loading

0 comments on commit d364e76

Please sign in to comment.