mirror of
https://github.com/afollestad/nock-nock.git
synced 2025-08-18 08:21:15 +00:00
Manage 'app is open' state from the Application class
This commit is contained in:
parent
eeaa68dbe2
commit
999502802a
6 changed files with 87 additions and 13 deletions
|
@ -8,7 +8,7 @@
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:name=".App"
|
android:name=".NockNockApp"
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
|
|
38
app/src/main/java/com/afollestad/nocknock/AppExt.kt
Normal file
38
app/src/main/java/com/afollestad/nocknock/AppExt.kt
Normal 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
|
||||||
|
})
|
||||||
|
}
|
|
@ -6,23 +6,35 @@
|
||||||
package com.afollestad.nocknock
|
package com.afollestad.nocknock
|
||||||
|
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import android.app.NotificationManager
|
import android.util.Log
|
||||||
import android.app.job.JobScheduler
|
|
||||||
import android.content.Context
|
|
||||||
import com.afollestad.nocknock.di.AppComponent
|
import com.afollestad.nocknock.di.AppComponent
|
||||||
import com.afollestad.nocknock.di.DaggerAppComponent
|
import com.afollestad.nocknock.di.DaggerAppComponent
|
||||||
import com.afollestad.nocknock.engine.statuscheck.BootReceiver
|
import com.afollestad.nocknock.engine.statuscheck.BootReceiver
|
||||||
import com.afollestad.nocknock.engine.statuscheck.CheckStatusJob
|
import com.afollestad.nocknock.engine.statuscheck.CheckStatusJob
|
||||||
|
import com.afollestad.nocknock.notifications.NockNotificationManager
|
||||||
import com.afollestad.nocknock.ui.AddSiteActivity
|
import com.afollestad.nocknock.ui.AddSiteActivity
|
||||||
import com.afollestad.nocknock.ui.MainActivity
|
import com.afollestad.nocknock.ui.MainActivity
|
||||||
import com.afollestad.nocknock.ui.ViewSiteActivity
|
import com.afollestad.nocknock.ui.ViewSiteActivity
|
||||||
import com.afollestad.nocknock.utilities.Injector
|
import com.afollestad.nocknock.utilities.Injector
|
||||||
|
import com.afollestad.nocknock.utilities.ext.systemService
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
/** @author Aidan Follestad (afollestad) */
|
/** @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() {
|
override fun onCreate() {
|
||||||
super.onCreate()
|
super.onCreate()
|
||||||
|
@ -36,15 +48,26 @@ class App : Application(), Injector {
|
||||||
chain.proceed(request)
|
chain.proceed(request)
|
||||||
}
|
}
|
||||||
.build()
|
.build()
|
||||||
val jobScheduler = getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
|
|
||||||
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
|
||||||
|
|
||||||
appComponent = DaggerAppComponent.builder()
|
appComponent = DaggerAppComponent.builder()
|
||||||
.application(this)
|
.application(this)
|
||||||
.okHttpClient(okHttpClient)
|
.okHttpClient(okHttpClient)
|
||||||
.jobScheduler(jobScheduler)
|
.jobScheduler(systemService(JOB_SCHEDULER_SERVICE))
|
||||||
.notificationManager(notificationManager)
|
.notificationManager(systemService(NOTIFICATION_SERVICE))
|
||||||
.build()
|
.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) {
|
override fun injectInto(target: Any) = when (target) {
|
|
@ -8,6 +8,7 @@ package com.afollestad.nocknock.di
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import android.app.NotificationManager
|
import android.app.NotificationManager
|
||||||
import android.app.job.JobScheduler
|
import android.app.job.JobScheduler
|
||||||
|
import com.afollestad.nocknock.NockNockApp
|
||||||
import com.afollestad.nocknock.engine.EngineModule
|
import com.afollestad.nocknock.engine.EngineModule
|
||||||
import com.afollestad.nocknock.engine.statuscheck.BootReceiver
|
import com.afollestad.nocknock.engine.statuscheck.BootReceiver
|
||||||
import com.afollestad.nocknock.engine.statuscheck.CheckStatusJob
|
import com.afollestad.nocknock.engine.statuscheck.CheckStatusJob
|
||||||
|
@ -33,6 +34,8 @@ import javax.inject.Singleton
|
||||||
)
|
)
|
||||||
interface AppComponent {
|
interface AppComponent {
|
||||||
|
|
||||||
|
fun inject(app: NockNockApp)
|
||||||
|
|
||||||
fun inject(activity: MainActivity)
|
fun inject(activity: MainActivity)
|
||||||
|
|
||||||
fun inject(activity: ViewSiteActivity)
|
fun inject(activity: ViewSiteActivity)
|
||||||
|
|
|
@ -127,8 +127,6 @@ class MainActivity : AppCompatActivity(), View.OnClickListener {
|
||||||
|
|
||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
super.onResume()
|
super.onResume()
|
||||||
notificationManager.setIsAppOpen(true)
|
|
||||||
|
|
||||||
val filter = IntentFilter().apply {
|
val filter = IntentFilter().apply {
|
||||||
addAction(ACTION_STATUS_UPDATE)
|
addAction(ACTION_STATUS_UPDATE)
|
||||||
}
|
}
|
||||||
|
@ -139,7 +137,6 @@ class MainActivity : AppCompatActivity(), View.OnClickListener {
|
||||||
|
|
||||||
override fun onPause() {
|
override fun onPause() {
|
||||||
super.onPause()
|
super.onPause()
|
||||||
notificationManager.setIsAppOpen(false)
|
|
||||||
safeUnregisterReceiver(intentReceiver)
|
safeUnregisterReceiver(intentReceiver)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue