package uk.co.martinpearman.b4a.fileobserver;
import android.os.FileObserver;
import android.util.Log;
import anywheresoftware.b4a.BA;
public class B4AFileObserver extends FileObserver {
   //   keep a reference to the parent wrapper instance so it can be used in raiseEventFromDifferentThread
   //   the parent wrapper instance will be the B4A Sub's Sender object
   final private B4AFileObserverWrapper mB4AFileObserverWrapper;
   final private BA mBA;
   final private String mEventName;
   //   these 2 constructors allow the parent wrapper instance to pass a reference to itself and the BA object to this class
   public B4AFileObserver(BA pBA, B4AFileObserverWrapper pB4AFileObserverWrapper, String pEventName, String pPath) {
      super(pPath);
      mB4AFileObserverWrapper = pB4AFileObserverWrapper;
      mBA = pBA;
      mEventName = pEventName;
   }
   public B4AFileObserver(BA pBA, B4AFileObserverWrapper pB4AFileObserverWrapper, String pEventName, String pPath, int pMask) {
      super(pPath, pMask);
      mB4AFileObserverWrapper = pB4AFileObserverWrapper;
      mBA = pBA;
      mEventName = pEventName;
   }
   @Override
   public void onEvent(int pEventType, String pPath) {
      //   eventTypes are all the possible EventTypes
      int[] eventTypes = { FileObserver.ACCESS, FileObserver.ATTRIB, FileObserver.CLOSE_NOWRITE, FileObserver.CLOSE_WRITE, FileObserver.CREATE,
            FileObserver.DELETE, FileObserver.DELETE_SELF, FileObserver.MODIFY, FileObserver.MOVE_SELF, FileObserver.MOVED_FROM, FileObserver.MOVED_TO,
            FileObserver.OPEN };
      //   use -1 as a flag so an unrecognised pEventType can be detected
      int thisEventType = -1;
      int i = eventTypes.length;
      while (i-- > 0) {
         if ((eventTypes[i] & pEventType) != 0) {
            thisEventType = eventTypes[i];
            break;
         }
      }
      if (thisEventType != -1) {
         Log.d("B4A", "Raising event '"+mEventName+"', eventType="+thisEventType+", path="+pPath);
         final Object[] eventParameters = { thisEventType, pPath };
         mBA.raiseEventFromDifferentThread(mB4AFileObserverWrapper, null, 0, mEventName, false, eventParameters);
      } else {
         //   this condition should never be met but...!
         Log.i("B4A", "FileObserver EventType not recognised, EventType=" + pEventType+", Path="+pPath);
      }
   }
}