Search code examples
actionscript-3airflash-cs5

NotificationType.CRITICAL needs only to only fire when file loaded is a new file


I have an Adobe Air desktop message board App built in Flash cs5, it loads an external ".txt" file in a dynamic text field and checks for a new file every 2 minutes. I need it to notify user with (NotificationType.CRITICAL) only if the file is new not just everytime it loads it. is it possible?

all the code in the app:

NativeApplication.nativeApplication.startAtLogin=true

stage.nativeWindow.alwaysInFront=true;

//external text file load and recheck every 2 minutes

var myInterval:uint  = setInterval (loadUrl, 120000);
var loader:URLLoader = new URLLoader(new URLRequest("https://my_text_file.txt"));
loader.addEventListener(Event.COMPLETE, completeHandler);

function completeHandler(event:Event):void {
  var loadedText:URLLoader = URLLoader(event.target);
if(myText_txt.htmlText!=loadedText.data){
   myText_txt.htmlText = loadedText.data;
     stage.nativeWindow.notifyUser(NotificationType.CRITICAL) 
}else {
  //do nothing
   }
}

function loadUrl():void {
    loader = new URLLoader(new URLRequest("https:///my_text_file.txt"));
loader.addEventListener(Event.COMPLETE, completeHandler);
}

 // button control


Minimize_BTN.addEventListener(MouseEvent.CLICK, minimize);
function minimize(e:MouseEvent){
stage.nativeWindow.minimize();

}

drag_BTN.addEventListener(MouseEvent.MOUSE_DOWN, drag);
function drag(e:MouseEvent){
stage.nativeWindow.startMove();

}

stop(); //Stop on the frame you want

Solution

  • Your code might not work if the myText_txt field is modifying the loaded text (e.g., if myText_txt's condenseWhite property is set to true). A more accurate way to determine if the text has changed would be to store it in a String variable named, for example, oldText and then comparing oldText with the newly loaded text.

    Here's part of your code re-written to include the oldText variable. This code is also more efficient because it instantiates some variables only once and it avoids duplicating some code:

    import flash.net.URLRequest;
    
    function completeHandler(event:Event):void
    {
        var newText:String = loader.data;
        if(newText != oldText)
        {
                myText_txt.htmlText = newText;
                stage.nativeWindow.notifyUser(NotificationType.CRITICAL);
                oldText = newText;
        }
    }
    
    function loadUrl():void
    {
        loader.load(req);
    }
    
    // Initialize your variables and event handlers only one time
    var req:URLRequest = new URLRequest("https:///my_text_file.txt");
    
    // Set cacheResponse to false to prevent a successful response
    // from being cached.
    req.cacheResponse = false;
    
    // And don't bother checking the cache, either. 
    // Not necessary, but the request will execute a little faster.
    req.useCache = false;
    
    var loader:URLLoader = new URLLoader();
    loader.addEventListener(Event.COMPLETE, completeHandler);
    
    // Use oldText inside completeHandler() to determine 
    // whether the file's text has changed
    var oldText:String = "";
    
    var myInterval:uint = setInterval(loadUrl, 120000);
    
    // Start loading the text right away
    loadUrl();