eddieowens / react-native-boundary

Native implementation of geofencing/region monitoring

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Integrate HeadlessJs into Android

eddieowens opened this issue · comments

Currently, Android events will not trigger in the background if the app is in doze mode. In order to get around this, @BrantApps suggested the following

As far as I can tell, the BoundaryEventBroadcastReceiver is going to fire when we enter a geofence - all good there. With the code I wrote, these events would make it through to the JS layer if RNBoundaryModule has a context and a resumed owning activity. For an activity to be resumed, it needs to have been pretty close to being "on-screen" in the recent past or close future if that makes sense.

In native-native land (not RN), you would do your application work in the Job. I think the next evolution of this code for react-native before it can be merged would be to;

  1. In BoundaryEventJobIntentService#sendEvent(String event, ArrayList<String> params) refactor to start a HeadlessJS task with the name of the JS function to invoke with those parameters. Something like;
   private void sendEvent(String event, ArrayList<String> params) {
       final Bundle bundle = new Bundle();
       bundle.putString("event", event);
       bundle.putStringArrayList("params", params);
       new HeadlessJsTaskConfig(
               "GeofenceDataChanged", // JS function to call
               bundle, // The data to send
               5000, // Timeout for the task
               true); // Allowed in foreground
   }
  1. Figure out how to extend both JobIntentService and HeadlessJsTaskService, probably create a custom JobIntentHeadlessJsTaskService - has one of these been done already?
  2. Write the "GeofenceDataChanged" code in the JS layer to handle the events.
  3. Extend the library implementation to handle device restarts/location toggling. (Apparently on Android, the geofences are removed if the device reboots or the location functionality is toggled?)

I agree with this approach and think it's the best way to ensure all events trigger in the background.

@edwinvrgs
Screen Shot 2019-04-02 at 5 23 27 PM

I am getting this error in android when adding geofence I think this is headlessJs issue tell me how to solve it?

@bhalaninimesh please open a separate issue. HeadlessJs has not been integrated.

@eddieowens
It is not HeadlessJS problem getting an error in BoundaryEventJobIntentService.java at line 59

@johnou thanks! I'll check these out.

I have just integrated the HeadlessJSTask into android and simplified the flow for geofence events (see pr #27).

This is now in version 1.0.8 so if you want this fix, grab the latest. Thanks everyone!

@eddieowens documenting on how to use it for dead/background app would be really useful.