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 +}