diff --git a/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseJSON.java b/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseJSON.java index b45ad2f01b..2236f79b29 100644 --- a/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseJSON.java +++ b/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseJSON.java @@ -24,6 +24,8 @@ import org.json.JSONException; import org.json.JSONObject; +import java.util.ArrayList; + import io.invertase.firebase.BuildConfig; public class ReactNativeFirebaseJSON { @@ -68,6 +70,25 @@ public String getStringValue(String key, String defaultValue) { return jsonObject.optString(key, defaultValue); } + public ArrayList getArrayValue(String key) { + ArrayList result = new ArrayList(); + if (jsonObject == null) return result; + + try { + JSONArray array = jsonObject.optJSONArray(key); + if (array != null) { + for (int i = 0; i < array.length(); i++) { + result.add(array.getString(i)); + } + } + } + catch (JSONException e) { + // do nothing + } + + return result; + } + public String getRawJSON() { return BuildConfig.FIREBASE_JSON_RAW; } diff --git a/android/src/reactnative/java/io/invertase/firebase/common/SharedUtils.java b/android/src/reactnative/java/io/invertase/firebase/common/SharedUtils.java index b7859adc41..2764b201fc 100644 --- a/android/src/reactnative/java/io/invertase/firebase/common/SharedUtils.java +++ b/android/src/reactnative/java/io/invertase/firebase/common/SharedUtils.java @@ -22,6 +22,7 @@ import android.graphics.Point; import android.graphics.Rect; import android.net.Uri; +import android.os.Build; import android.util.Log; import com.facebook.react.bridge.*; import com.facebook.react.common.LifecycleState; @@ -130,6 +131,38 @@ public static boolean isAppInForeground(Context context) { List appProcesses = activityManager.getRunningAppProcesses(); if (appProcesses == null) return false; + // Check if current activity is a background activity + ReactNativeFirebaseJSON json = ReactNativeFirebaseJSON.getSharedInstance(); + if (json.contains("android_background_activity_names")) { + ArrayList backgroundActivities = json.getArrayValue("android_background_activity_names"); + + if (backgroundActivities.size() != 0) { + String currentActivity = ""; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + List taskInfo = activityManager.getAppTasks(); + if (taskInfo.size() > 0) { + ActivityManager.RecentTaskInfo task = taskInfo.get(0).getTaskInfo(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + currentActivity = task.baseActivity.getShortClassName(); + } else { + currentActivity = task.origActivity != null ? + task.origActivity.getShortClassName() : + task.baseIntent.getComponent().getShortClassName(); + } + } + } else { + List taskInfo = activityManager.getRunningTasks(1); + if (taskInfo.size() > 0) { + currentActivity = taskInfo.get(0).topActivity.getShortClassName(); + } + } + + if (!"".equals(currentActivity) && backgroundActivities.contains(currentActivity)) { + return false; + } + } + } + final String packageName = context.getPackageName(); for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) { if ( diff --git a/firebase-schema.json b/firebase-schema.json index bb52386c87..693dc67ae5 100644 --- a/firebase-schema.json +++ b/firebase-schema.json @@ -81,6 +81,10 @@ "android_task_executor_keep_alive_seconds": { "description": "Keep-alive time of ThreadPoolExecutor used by RNFirebase for Android, in seconds. Defaults to `3`.\n Excess threads in the pool executor will be terminated if they have been idle for more than the keep-alive time.", "type": "number" + }, + "android_background_activity_names": { + "description": "The names (as returned by `getShortClassName()` of Activities used outside the context of react native.\nThese are ignored when determining if the app is in foreground for purposes of calling javascript background handlers", + "type": "array" } } }