72 lines
2.5 KiB
Kotlin
72 lines
2.5 KiB
Kotlin
package cy.agorise.bitsybitshareswallet.network
|
|
|
|
import android.app.Activity
|
|
import android.app.Application.ActivityLifecycleCallbacks
|
|
import android.os.Bundle
|
|
import android.os.Handler
|
|
import cy.agorise.graphenej.api.android.NetworkService
|
|
import cy.agorise.graphenej.stats.ExponentialMovingAverage
|
|
|
|
/**
|
|
* Class used to manage the connection status of the NetworkService.
|
|
*
|
|
*
|
|
* The basic idea here is to keep track of the sequence of activity life cycle callbacks so that we
|
|
* can infer when the user has left the app and the node connection can be salfely shut down.
|
|
*/
|
|
class NetworkServiceManager(nodes: List<String>) : ActivityLifecycleCallbacks {
|
|
/**
|
|
* Handler instance used to schedule tasks back to the main thread
|
|
*/
|
|
private val mHandler = Handler()
|
|
private var mNetworkService: NetworkService? = null
|
|
private val mNodeUrls: Array<String> = nodes.toTypedArray()
|
|
|
|
/**
|
|
* Runnable used to schedule a service disconnection once the app is not visible to the user for
|
|
* more than DISCONNECT_DELAY milliseconds.
|
|
*/
|
|
private val mDisconnectRunnable = Runnable {
|
|
if (mNetworkService != null) {
|
|
mNetworkService?.stop()
|
|
mNetworkService = null
|
|
}
|
|
}
|
|
|
|
fun onApplicationCreated() {
|
|
startService()
|
|
}
|
|
|
|
override fun onActivityCreated(activity: Activity, bundle: Bundle?) {}
|
|
override fun onActivityStarted(activity: Activity) {}
|
|
override fun onActivityResumed(activity: Activity) {
|
|
startService()
|
|
}
|
|
|
|
override fun onActivityPaused(activity: Activity) {
|
|
mHandler.postDelayed(mDisconnectRunnable, DISCONNECT_DELAY)
|
|
}
|
|
|
|
override fun onActivityStopped(activity: Activity) {}
|
|
override fun onActivitySaveInstanceState(activity: Activity, bundle: Bundle) {}
|
|
override fun onActivityDestroyed(activity: Activity) {}
|
|
|
|
private fun startService() {
|
|
mHandler.removeCallbacks(mDisconnectRunnable)
|
|
if (mNetworkService == null) {
|
|
mNetworkService = NetworkService.getInstance()
|
|
mNetworkService?.start(mNodeUrls, ExponentialMovingAverage.DEFAULT_ALPHA)
|
|
}
|
|
}
|
|
|
|
companion object {
|
|
/**
|
|
* Constant used to specify how long will the app wait for another activity to go through its starting life
|
|
* cycle events before running the teardownConnectionTask task.
|
|
*
|
|
* This is used as a means to detect whether or not the user has left the app.
|
|
*/
|
|
private const val DISCONNECT_DELAY = 1500L
|
|
}
|
|
|
|
} |