diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0c46d28..08b0af2 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -8,7 +8,7 @@
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
+ })
+}
diff --git a/app/src/main/java/com/afollestad/nocknock/App.kt b/app/src/main/java/com/afollestad/nocknock/NockNockApp.kt
similarity index 57%
rename from app/src/main/java/com/afollestad/nocknock/App.kt
rename to app/src/main/java/com/afollestad/nocknock/NockNockApp.kt
index db2842b..c6eab86 100644
--- a/app/src/main/java/com/afollestad/nocknock/App.kt
+++ b/app/src/main/java/com/afollestad/nocknock/NockNockApp.kt
@@ -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) {
diff --git a/app/src/main/java/com/afollestad/nocknock/di/AppComponent.kt b/app/src/main/java/com/afollestad/nocknock/di/AppComponent.kt
index f6bd78f..84534a9 100644
--- a/app/src/main/java/com/afollestad/nocknock/di/AppComponent.kt
+++ b/app/src/main/java/com/afollestad/nocknock/di/AppComponent.kt
@@ -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)
diff --git a/app/src/main/java/com/afollestad/nocknock/ui/MainActivity.kt b/app/src/main/java/com/afollestad/nocknock/ui/MainActivity.kt
index e292e57..18224fd 100644
--- a/app/src/main/java/com/afollestad/nocknock/ui/MainActivity.kt
+++ b/app/src/main/java/com/afollestad/nocknock/ui/MainActivity.kt
@@ -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)
}
diff --git a/utilities/src/main/java/com/afollestad/nocknock/utilities/ext/ContextExt.kt b/utilities/src/main/java/com/afollestad/nocknock/utilities/ext/ContextExt.kt
new file mode 100644
index 0000000..9635ad2
--- /dev/null
+++ b/utilities/src/main/java/com/afollestad/nocknock/utilities/ext/ContextExt.kt
@@ -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 Context.systemService(name: String): T {
+ return getSystemService(name) as T
+}