11package com.expensify.chat
22
3+ import android.app.Activity
34import com.facebook.react.common.assets.ReactFontManager
45
56import android.app.ActivityManager
7+ import android.app.ActivityManager.RunningAppProcessInfo
8+ import android.content.Context
69import android.content.res.Configuration
710import android.database.CursorWindow
11+ import android.os.Bundle
812import android.os.Process
913import androidx.multidex.MultiDexApplication
1014import com.expensify.chat.bootsplash.BootSplashPackage
@@ -27,6 +31,11 @@ import expo.modules.ApplicationLifecycleDispatcher
2731import expo.modules.ReactNativeHostWrapper
2832
2933class MainApplication : MultiDexApplication (), ReactApplication {
34+ var currentState: String = " active"
35+ private set
36+ var prevState: String = " inactive"
37+ private set
38+
3039 override val reactNativeHost: ReactNativeHost = ReactNativeHostWrapper (this , object : DefaultReactNativeHost (this ) {
3140 override fun getUseDeveloperSupport () = BuildConfig .DEBUG
3241
@@ -64,6 +73,30 @@ class MainApplication : MultiDexApplication(), ReactApplication {
6473 return
6574 }
6675
76+ registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
77+ override fun onActivityStarted (p0 : Activity ) {
78+ prevState = currentState
79+ currentState = " active"
80+ }
81+
82+ override fun onActivityStopped (p0 : Activity ) {
83+ val isOnForeground = isAppOnForeground()
84+ prevState = currentState
85+ currentState = if (isOnForeground) " active" else " background"
86+ }
87+
88+ override fun onActivityDestroyed (p0 : Activity ) {
89+ val isOnForeground = isAppOnForeground()
90+ prevState = currentState
91+ currentState = if (isOnForeground) " active" else " background"
92+ }
93+
94+ override fun onActivityCreated (p0 : Activity , p1 : Bundle ? ) {}
95+ override fun onActivityResumed (p0 : Activity ) {}
96+ override fun onActivityPaused (p0 : Activity ) {}
97+ override fun onActivitySaveInstanceState (p0 : Activity , p1 : Bundle ) {}
98+ })
99+
67100 SoLoader .init (this , OpenSourceMergedSoMapping )
68101 if (BuildConfig .IS_NEW_ARCHITECTURE_ENABLED ) {
69102 // If you opted-in for the New Architecture, we load the native entry point for this app.
@@ -106,4 +139,22 @@ class MainApplication : MultiDexApplication(), ReactApplication {
106139 it.pid == pid && it.processName.endsWith(" :onfido_process" )
107140 }
108141 }
142+
143+ /* *
144+ * Checks if the application is currently running in the foreground.
145+ * https://stackoverflow.com/a/8490088/8398300
146+ */
147+ private fun isAppOnForeground (): Boolean {
148+ val activityManager = applicationContext.getSystemService(Context .ACTIVITY_SERVICE ) as ActivityManager
149+ val appProcesses = activityManager.runningAppProcesses ? : return false
150+ val packageName: String = applicationContext.getPackageName()
151+ for (appProcess in appProcesses) {
152+ if (appProcess.importance == RunningAppProcessInfo .IMPORTANCE_FOREGROUND &&
153+ appProcess.processName == packageName
154+ ) {
155+ return true
156+ }
157+ }
158+ return false
159+ }
109160}
0 commit comments