package com.ocetnik.timer;

import android.os.Handler;

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.modules.core.DeviceEventManagerModule;

import java.lang.Runnable;

public class BackgroundTimerModule extends ReactContextBaseJavaModule {

    private Handler handler;
    private ReactContext reactContext;
    private Runnable runnable;

    public BackgroundTimerModule(ReactApplicationContext reactContext) {
        super(reactContext);
        this.reactContext = reactContext;
    }

    @Override
    public String getName() {
        return "RNBackgroundTimer";
    }

    @ReactMethod
    public void start(final int delay) {
        handler = new Handler();
        runnable = new Runnable() {
            @Override
            public void run() {
                sendEvent(reactContext, "backgroundTimer");
            }
        };

        handler.post(runnable);
    }

    @ReactMethod
    public void stop() {
        // avoid null pointer exceptio when stop is called without start
        if (handler != null) handler.removeCallbacks(runnable);
    }

    private void sendEvent(ReactContext reactContext, String eventName) {
        reactContext
        .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
        .emit(eventName, null);
    }

    @ReactMethod
    public void setTimeout(final int id, final int timeout) {
        Handler handler = new Handler();
        handler.postDelayed(new Runnable(){
            @Override
            public void run(){
                if (getReactApplicationContext().hasActiveCatalystInstance()) {
                    getReactApplicationContext()
                        .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                        .emit("backgroundTimer.timeout", id);
                }
           }
        }, timeout);
    }

    /*@ReactMethod
    public void clearTimeout(final int id) {
        // todo one day..
        // not really neccessary to have
    }*/
}

@@ -47,16 +47,48 @@
 Handler;
+%0Aimport android.os.PowerManager;
 %0A%0Aimport
@@ -563,151 +563,883 @@
 le;%0A
-%0A    public BackgroundTimerModule(ReactApplicationContext reactContext) %7B%0A        super(reactContext);%0A        this.reactContext = reactContext
+    private PowerManager powerManager;%0A    private PowerManager.WakeLock wakeLock;%0A    private final LifecycleEventListener listener = new LifecycleEventListener()%7B%0A        @Override%0A        public void onHostResume() %7B%0A            wakeLock.acquire();%0A        %7D%0A        @Override%0A        public void onHostPause() %7B%0A            //wakeLock.release();%0A        %7D%0A%0A        @Override%0A        public void onHostDestroy() %7B%0A            wakeLock.release();%0A        %7D%0A    %7D;%0A%0A    public BackgroundTimerModule(ReactApplicationContext reactContext) %7B%0A        super(reactContext);%0A        this.reactContext = reactContext;%0A        this.powerManager = (PowerManager) getReactApplicationContext().getSystemService(POWER_SERVICE);%0A        this.wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, %22rohit_bg_wakelock%22);%0A        reactContext.addLifecycleEventListener(listener)
 ;%0A  

Fix device sleep issue