Skip to content

Commit

Permalink
refactor: use non deprecated api for lifecycle callbacks
Browse files Browse the repository at this point in the history
  • Loading branch information
fractalwrench committed May 14, 2024
1 parent 4ef3996 commit ca009cd
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 13 deletions.
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
@file:Suppress("DEPRECATION")

package io.embrace.android.embracesdk.session.lifecycle

import androidx.lifecycle.Lifecycle
import androidx.lifecycle.OnLifecycleEvent
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.ProcessLifecycleOwner
import io.embrace.android.embracesdk.internal.clock.Clock
import io.embrace.android.embracesdk.logging.EmbLogger
Expand All @@ -19,8 +18,9 @@ import java.util.concurrent.CopyOnWriteArrayList
*/
internal class EmbraceProcessStateService(
private val clock: Clock,
private val logger: EmbLogger
) : ProcessStateService {
private val logger: EmbLogger,
private val lifecycleOwner: LifecycleOwner = ProcessLifecycleOwner.get()
) : ProcessStateService, LifecycleEventObserver {

/**
* List of listeners that subscribe to process lifecycle events.
Expand All @@ -39,8 +39,7 @@ internal class EmbraceProcessStateService(
* Returns if the app's in background or not.
*/
@Volatile
// TODO: future: investigate setting via ProcessLifecycleOwner initial state
override var isInBackground = true
override var isInBackground = !lifecycleOwner.lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)
private set

init {
Expand All @@ -49,17 +48,25 @@ internal class EmbraceProcessStateService(
ThreadUtils.runOnMainThread(
logger,
Runnable {
ProcessLifecycleOwner.get().lifecycle
.addObserver(this@EmbraceProcessStateService)
lifecycleOwner.lifecycle.addObserver(this)
}
)
}

override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
when (event) {
Lifecycle.Event.ON_START -> onForeground()
Lifecycle.Event.ON_STOP -> onBackground()

Check warning on line 59 in embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/session/lifecycle/EmbraceProcessStateService.kt

View check run for this annotation

Codecov / codecov/patch

embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/session/lifecycle/EmbraceProcessStateService.kt#L58-L59

Added lines #L58 - L59 were not covered by tests
else -> {
// no-op
}
}
}

/**
* This method will be called by the ProcessLifecycleOwner when the main app process calls
* ON START.
*/
@OnLifecycleEvent(Lifecycle.Event.ON_START)
override fun onForeground() {
logger.logDebug("AppState: App entered foreground.")

Expand All @@ -84,7 +91,6 @@ internal class EmbraceProcessStateService(
* This method will be called by the ProcessLifecycleOwner when the main app process calls
* ON STOP.
*/
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
override fun onBackground() {
logger.logDebug("AppState: App entered background")
isInBackground = true
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package io.embrace.android.embracesdk.session.lifecycle

import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.LifecycleEventObserver
import java.io.Closeable

/**
* Service which handles Android process lifecycle callbacks.
*/
internal interface ProcessStateService : LifecycleObserver, Closeable {
internal interface ProcessStateService : LifecycleEventObserver, Closeable {

/**
* Whether the application is in the background.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
package io.embrace.android.embracesdk.fakes

import android.content.res.Configuration
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import io.embrace.android.embracesdk.session.lifecycle.ProcessStateListener
import io.embrace.android.embracesdk.session.lifecycle.ProcessStateService

internal class FakeProcessStateService(
override var isInBackground: Boolean = false,
) : ProcessStateService {

override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
}

val listeners: MutableList<ProcessStateListener> = mutableListOf()
var config: Configuration? = null

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package io.embrace.android.embracesdk.session

import android.app.Application
import android.os.Looper
import androidx.lifecycle.Lifecycle
import io.embrace.android.embracesdk.fakes.FakeClock
import io.embrace.android.embracesdk.fakes.FakeEmbLogger
import io.embrace.android.embracesdk.fakes.FakeProcessStateListener
Expand Down Expand Up @@ -217,6 +218,34 @@ internal class EmbraceProcessStateServiceTest {
assertTrue(messages.isEmpty())
}

@Test
fun `launched in background`() {
stateService = EmbraceProcessStateService(
fakeClock,
fakeEmbLogger,
mockk {
every { lifecycle } returns mockk<Lifecycle> {
every { currentState } returns Lifecycle.State.INITIALIZED
}
}
)
assertTrue(stateService.isInBackground)
}

@Test
fun `launched in foreground`() {
stateService = EmbraceProcessStateService(
fakeClock,
fakeEmbLogger,
mockk {
every { lifecycle } returns mockk<Lifecycle> {
every { currentState } returns Lifecycle.State.STARTED
}
}
)
assertFalse(stateService.isInBackground)
}

private class DecoratedListener(
private val invocations: MutableList<String>
) : ProcessStateListener {
Expand Down

0 comments on commit ca009cd

Please sign in to comment.