Manage 'app is open' state from the Application class

This commit is contained in:
Aidan Follestad 2018-11-30 13:54:01 -08:00
parent eeaa68dbe2
commit 999502802a
6 changed files with 87 additions and 13 deletions

View file

@ -8,7 +8,7 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application
android:name=".App"
android:name=".NockNockApp"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"

View file

@ -0,0 +1,38 @@
/*
* Licensed under Apache-2.0
*
* Designed and developed by Aidan Follestad (@afollestad)
*/
package com.afollestad.nocknock
import android.app.Activity
import android.app.Application
import android.app.Application.ActivityLifecycleCallbacks
import android.os.Bundle
typealias ActivityLifeChange = (activity: Activity, resumed: Boolean) -> Unit
/** @author Aidan Follestad (afollestad) */
fun Application.onActivityLifeChange(cb: ActivityLifeChange) {
registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
override fun onActivitySaveInstanceState(
activity: Activity?,
outState: Bundle?
) = Unit
override fun onActivityPaused(activity: Activity) = cb(activity, false)
override fun onActivityResumed(activity: Activity) = cb(activity, true)
override fun onActivityStarted(activity: Activity) = Unit
override fun onActivityDestroyed(activity: Activity) = Unit
override fun onActivityStopped(activity: Activity) = Unit
override fun onActivityCreated(
activity: Activity?,
savedInstanceState: Bundle?
) = Unit
})
}

View file

@ -6,23 +6,35 @@
package com.afollestad.nocknock
import android.app.Application
import android.app.NotificationManager
import android.app.job.JobScheduler
import android.content.Context
import android.util.Log
import com.afollestad.nocknock.di.AppComponent
import com.afollestad.nocknock.di.DaggerAppComponent
import com.afollestad.nocknock.engine.statuscheck.BootReceiver
import com.afollestad.nocknock.engine.statuscheck.CheckStatusJob
import com.afollestad.nocknock.notifications.NockNotificationManager
import com.afollestad.nocknock.ui.AddSiteActivity
import com.afollestad.nocknock.ui.MainActivity
import com.afollestad.nocknock.ui.ViewSiteActivity
import com.afollestad.nocknock.utilities.Injector
import com.afollestad.nocknock.utilities.ext.systemService
import okhttp3.OkHttpClient
import javax.inject.Inject
/** @author Aidan Follestad (afollestad) */
class App : Application(), Injector {
class NockNockApp : Application(), Injector {
lateinit var appComponent: AppComponent
companion object {
private fun log(message: String) {
if (BuildConfig.DEBUG) {
Log.d("NockNockApp", message)
}
}
}
private lateinit var appComponent: AppComponent
@Inject lateinit var nockNotificationManager: NockNotificationManager
private var resumedActivities: Int = 0
override fun onCreate() {
super.onCreate()
@ -36,15 +48,26 @@ class App : Application(), Injector {
chain.proceed(request)
}
.build()
val jobScheduler = getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
appComponent = DaggerAppComponent.builder()
.application(this)
.okHttpClient(okHttpClient)
.jobScheduler(jobScheduler)
.notificationManager(notificationManager)
.jobScheduler(systemService(JOB_SCHEDULER_SERVICE))
.notificationManager(systemService(NOTIFICATION_SERVICE))
.build()
appComponent.inject(this)
onActivityLifeChange { activity, resumed ->
if (resumed) {
resumedActivities++
log("Activity resumed: $activity, resumedActivities = $resumedActivities")
} else {
resumedActivities--
log("Activity paused: $activity, resumedActivities = $resumedActivities")
}
check(resumedActivities >= 0) { "resumedActivities can't go below 0." }
nockNotificationManager.setIsAppOpen(resumedActivities > 0)
}
}
override fun injectInto(target: Any) = when (target) {

View file

@ -8,6 +8,7 @@ package com.afollestad.nocknock.di
import android.app.Application
import android.app.NotificationManager
import android.app.job.JobScheduler
import com.afollestad.nocknock.NockNockApp
import com.afollestad.nocknock.engine.EngineModule
import com.afollestad.nocknock.engine.statuscheck.BootReceiver
import com.afollestad.nocknock.engine.statuscheck.CheckStatusJob
@ -33,6 +34,8 @@ import javax.inject.Singleton
)
interface AppComponent {
fun inject(app: NockNockApp)
fun inject(activity: MainActivity)
fun inject(activity: ViewSiteActivity)

View file

@ -127,8 +127,6 @@ class MainActivity : AppCompatActivity(), View.OnClickListener {
override fun onResume() {
super.onResume()
notificationManager.setIsAppOpen(true)
val filter = IntentFilter().apply {
addAction(ACTION_STATUS_UPDATE)
}
@ -139,7 +137,6 @@ class MainActivity : AppCompatActivity(), View.OnClickListener {
override fun onPause() {
super.onPause()
notificationManager.setIsAppOpen(false)
safeUnregisterReceiver(intentReceiver)
}

View file

@ -0,0 +1,13 @@
/*
* Licensed under Apache-2.0
*
* Designed and developed by Aidan Follestad (@afollestad)
*/
package com.afollestad.nocknock.utilities.ext
import android.content.Context
/** @author Aidan Follestad (afollestad) */
inline fun <reified T> Context.systemService(name: String): T {
return getSystemService(name) as T
}