<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>AllYourFlexAreBelongToUs.com Feed</title>
    <link>http://www.AllYourFlexAreBelongToUs.com</link>
    <description>Feed of the latest items aggregated.</description>
    <item>
      <title>RIATest 2.0 now available</title>
      <link>http://www.dopejam.com/shownewsitem.cfm?NewsID=530</link>
      <description>The folks at &lt;A href="http://www.riatest.com"&gt;RIATest.com&lt;/a&gt; have released a major update to their flagship product, RIATest 2.0.
&lt;P&gt;
Unlike HP's cost-you-an-arm-and-a-leg Quick Test Pro, RIATest is reasonably priced at $500 and helps you automate the process of functional testing with Adobe Flex/Flash RIAs.
&lt;P&gt;
&lt;span class="highlight"&gt;New Stuff&lt;/span&gt;
&lt;ul&gt;
 &lt;li&gt; Regular expressions
 &lt;li&gt; Complex Properties
 &lt;li&gt; Location of GUI Object via dynamic properties
 &lt;li&gt; Programmatic control of browser windows.
 &lt;li&gt; Tabular data queryable in they're native format
 &lt;li&gt; Ability to run adhoc selections of scripts and groups of scripts.
 &lt;li&gt; Scripts can be paused and edited without needing to resume the test session.
 &lt;li&gt; Advanced breakpoints.
 &lt;li&gt; New XML output feature allows you to hook in other tools.
 &lt;li&gt; New Objects: Date, Math, RegExp, UIDUtil, Switch Operator.
&lt;/ul&gt;
&lt;P&gt;
Hook it up a &lt;A href="http://www.riatest.com"&gt;RIATest.com&lt;/a&gt;.</description>
      <pubDate>Sat, 22 Nov 2008 02:14:20 GMT</pubDate>
      <author>DopeJam - Flex</author>
      <comments>http://www.dopejam.com</comments>
      <guid isPermaLink="false">23256</guid>
    </item>
    <item>
      <title>I got FlexBugKit ( T-shirt )</title>
      <link>http://shigeru-nakagaki.com/index.cfm/2008/11/21/20081121-Flex-Bug-Kit</link>
      <description>I&amp;apos;ve posted bugs of Flex SDK and I got a mail from Adobe Flex Marketing Intern (he/she is a university student). Then I replayed the mail.

After two months, I got a special T-shirt of Flex from Adobe US (I live in Japan).


The Fx mark is creat...</description>
      <pubDate>Sat, 22 Nov 2008 01:25:19 GMT</pubDate>
      <author>Shigeru-Nakagaki.com (En)</author>
      <comments>http://Shigeru-Nakagaki.com</comments>
      <guid isPermaLink="false">23255</guid>
    </item>
    <item>
      <title>PureMVC Pirate Internet Radio Conference Takeover</title>
      <link>http://puremvc.org/content/view/101/181/</link>
      <description>UPDATE:Well MAX is over and the we&amp;#39;re declaring the event a success and anyone dissenting can walk the...</description>
      <pubDate>Sat, 22 Nov 2008 01:08:31 GMT</pubDate>
      <author>PureMVC</author>
      <comments>http://puremvc.org</comments>
      <guid isPermaLink="false">23254</guid>
    </item>
    <item>
      <title>Vote now for the MAX Europe awards!</title>
      <link>http://www.ashorten.com/2008/11/22/vote-now-for-the-max-europe-awards/</link>
      <description>With MAX 2008 in San Francisco over, focus now shifts to the companion event happening in Milan at the beginning of December.
Just as there are new, Europe-only, sessions at MAX in Milan, there are also a set of Europe-only MAX awards up for grabs at the conference. Voting for the awards are now open, so [...]</description>
      <pubDate>Sat, 22 Nov 2008 00:01:52 GMT</pubDate>
      <author>Andrew Shorten</author>
      <comments>http://www.ashorten.com</comments>
      <guid isPermaLink="false">23253</guid>
    </item>
    <item>
      <title>Degrafa.org and Beta 3 is a go!</title>
      <link>http://www.degrafa.com/2008/11/21/degrafaorg-and-beta-3-is-a-go/</link>
      <description>For those of you who use Degrafa and follow this blog, you may have noticed that things have been a bit quiet lately. Well, that&amp;#8217;s because there has been significant work done on a new website and release. If you went to the presentation or Birds of a Feather at Adobe MAX, you got to [...]</description>
      <pubDate>Fri, 21 Nov 2008 23:45:31 GMT</pubDate>
      <author>Degrafa</author>
      <comments>http://www.degrafa.com</comments>
      <guid isPermaLink="false">23252</guid>
    </item>
    <item>
      <title>Friday Insanity</title>
      <link>http://www.coldfusionjedi.com/index.cfm/2008/11/21/Friday-Insanity</link>
      <description>First off, sorry for my lack of postings (and replying to emails). I went straight from MAX to meetings at Broadchoice. I had to share this story though and I think you guys might enjoy it.

I went to the gym this morning and climbed on a treadmill...</description>
      <pubDate>Fri, 21 Nov 2008 22:56:20 GMT</pubDate>
      <author>Raymond Camden's ColdFusion Blog</author>
      <comments>http://www.coldfusionjedi.com</comments>
      <guid isPermaLink="false">23251</guid>
    </item>
    <item>
      <title>Content From MAX &amp; AIR++</title>
      <link>http://www.cynergysystems.com/blogs/page/andrewtrice?entry=content_from_max_air</link>
      <description>MAX was a great event.  This was my first MAX, and I thoroughly enjoyed it.  There were lots of great sessions, lots of great people, and one heck of a reception.   Below you'll find the content of my MAX presentation "Adobe AIR++".
&lt;br/&gt;&lt;br/&gt;
You may be wondering why I chose the name "AIR++"... Well, my common theme was pushing the limits of what you think AIR is capable of; hence the "++" suffix akin to the "increment" operator in many programming languages.  My major focus was on presenting concepts how you can get the most out of your AIR applications, as well as real-world application of those concepts to back it up.
&lt;br/&gt;&lt;br/&gt;
First, here's my presentation:
&lt;br/&gt;&lt;br/&gt;
&lt;iframe src="http://www.cynergysystems.com/blogs/blogs/andrew.trice/max2008/AIR++.pdf" width="600" height="480"&gt;&lt;/iframe&gt;&lt;br/&gt;
Or, you can view it directly at: &lt;a href="http://www.cynergysystems.com/blogs/blogs/andrew.trice/max2008/AIR++.pdf" target="_blank"&gt;http://www.cynergysystems.com/blogs/blogs/andrew.trice/max2008/AIR++.pdf&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
I also demonstrated applications the showed seamless interoperability between desktop and web experiences, and real-world AIR and Flex applications that work together and share a codebase.
&lt;br/&gt;&lt;br/&gt;
The first code example that I did was a walkthough how to do some interesting things with the Flex + AIR.  Namely:  detect if AIR is installed from your flex application, launch an installed air application from a Flex application, and share application session between a flex application and an AIR application.
&lt;br/&gt;&lt;br/&gt;
The basic workflow is this:

&lt;ol&gt;
&lt;li&gt;The Flex application loads.&lt;/li&gt;
&lt;li&gt;The Flex application requests session information from the server.&lt;/li&gt;
&lt;li&gt;The Flex application is now server-session aware.&lt;/li&gt;
&lt;li&gt;The user clicks a button in the Flex application to launch an AIR application.  That action passes the session identification information into the AIR application invokation; thus session is based from the browser-based Flex application&lt;/li&gt;
&lt;li&gt;The AIR application is now server-session aware.&lt;/li&gt;
&lt;li&gt;The AIR application launches a browser, and passes session back to the browser.&lt;/li&gt;
&lt;/ol&gt;
&lt;br/&gt;&lt;br/&gt;
By passing sessions back and forth, your applications can share data that is associated with the session on the server.  Thus it can have a seamless web and desktop experience, and can even enable single-sign-on between web and desktop applications.  If you are concenerned about security and session hijacking, just use SSL and you should be fine.
&lt;br/&gt;&lt;br/&gt;
First, let's examine the sessionOutput.cfm page about that provides the ColdFusion session information to the Flex application.    Just a fYI: I used a simple generated xml file instead of AMF remoting to keep things extremely simple.
&lt;br/&gt;&lt;br/&gt;
&lt;pre&gt;&amp;lt;cfparam name="output" default="HTML"&amp;gt;

&amp;lt;cfif output EQ "XML"&amp;gt;

  &amp;lt;cfoutput&amp;gt;
    &amp;lt;data&amp;gt;
      &amp;lt;session_cfid&amp;gt;#session.cfid#&amp;lt;/session_cfid&amp;gt;
      &amp;lt;session_cftoken&amp;gt;#session.cftoken#&amp;lt;/session_cftoken&amp;gt;
      &amp;lt;session_sessionid&amp;gt;#session.sessionid#&amp;lt;/session_sessionid&amp;gt;
      &amp;lt;session_urltoken&amp;gt;&amp;lt;![CDATA[#session.urltoken#]]&amp;gt;&amp;lt;/session_urltoken&amp;gt;
    &amp;lt;/data&amp;gt;
  &amp;lt;/cfoutput&amp;gt;
 
&amp;lt;cfelse&amp;gt;

  &amp;lt;cfdump var="#session#" /&amp;gt;
  
  &amp;lt;br/&amp;gt;
  &amp;lt;a href="sessionOutput.cfm?output=XML"&amp;gt;Click to see XML&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;

&amp;lt;/cfif&amp;gt;&lt;/pre&gt;
&lt;br/&gt;&lt;br/&gt;

Now, the Flex application...   
&lt;br/&gt;&lt;br/&gt;

&lt;img src="http://www.cynergysystems.com/blogs/blogs/andrew.trice/max2008/01.jpg" /&gt;
&lt;br/&gt;&lt;br/&gt;
You'll notice in the onCreationComplete event handler, it loads the AIR detection swf from Adobe.  Once that is loaded, it will load the session information from the server.
&lt;br/&gt;&lt;br/&gt;


&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;mx:Application 
  xmlns:mx="http://www.adobe.com/2006/mxml" 
  layout="absolute"
  creationComplete="onCreationComplete()"&amp;gt;
  
  &amp;lt;mx:Script&amp;gt;
    &amp;lt;![CDATA[
      import mx.rpc.events.FaultEvent;
      import mx.rpc.events.ResultEvent;
    
      [Bindable]
      private var output : String = "";
      
      private const AIR_DETECTION_URL: String = "http://airdownload.adobe.com/air/browserapi/air.swf";
  
      private const applicationID : String = "put app id here";
      private const publisherID : String = "put publisher id here";
  
      private var loader:Loader;
      private var air:Object;
      
      private var cfid : String = "";
      private var cftoken : String = "";
    
      private function onCreationComplete() : void
      {
        output += "Detecting AIR Installation...\n"; 
        
        loader = new Loader();
        loader.contentLoaderInfo.addEventListener(Event.INIT, onContentInit);
        loader.load(new URLRequest(AIR_DETECTION_URL));
      }

      private function onContentInit(e:Event):void {
        air = e.target.content;
        if ( air.getStatus() == "installed" )
        {
          output += "SUCCESS: AIR installation detected\n\n" + 
                "Attempting to load session data...\n"; 
          httpService.send();
        } 
        else
        {
          output += "ERROR: AIR was not installed detected\n"; 
        }
      }
      
      private function onHTTPResult( event : ResultEvent ) : void
      {
        var result : XML = new XML( event.result );
        output += "SUCCESS: session information loaded:\n\n" +  
              "cfid: " + result.session_cfid.toString() + "\n" +
              "cftoken: " + result.session_cftoken.toString() + "\n" +
              "sessionid: " + result.session_sessionid.toString() + "\n" +
              "urltoken: " + result.session_urltoken.toString() + "\n\n";
              
        cfid = result.session_cfid.toString();
        cftoken = result.session_cftoken.toString();
        launchButton.enabled = true;
      }
      
      private function onHTTPError( event : FaultEvent ) : void
      {
        output += "ERROR: unable to load session\n" + event.fault.message + "\n\n"; 
      }
      
      private function onButtonClick() : void
      {
        output += "Attempting to launch AIR application";
        
        var arguments : Array = [ cfid, cftoken ];
        
        air.launchApplication( applicationID, publisherID, arguments );
      }
    ]]&amp;gt;
  &amp;lt;/mx:Script&amp;gt;
  
  &amp;lt;mx:HTTPService 
    id="httpService"
    url="sessionOutput.cfm?output=XML"
    result="onHTTPResult( event )"
    fault="onHTTPError( event )" 
    resultFormat="text"/&amp;gt;
  
  &amp;lt;mx:ApplicationControlBar dock="true"&amp;gt;
    
    &amp;lt;mx:Button 
      id="launchButton"
      label="Launch AIR Application"
      enabled="false" 
      click="onButtonClick()"/&amp;gt;
    
  &amp;lt;/mx:ApplicationControlBar&amp;gt;
  
  &amp;lt;mx:TextArea 
    text="{ output }"
    editable="false" 
    width="100%" height="100%"  /&amp;gt;
  
&amp;lt;/mx:Application&amp;gt;&lt;/pre&gt;
&lt;br/&gt;&lt;br/&gt;
If you click on the "Launch AIR Application" button, the AIR application would be launched using the &lt;i&gt;air.launchApplication&lt;/i&gt; command.   In order for this to work, the AIR applicaiton must have a recognized application id, recognized publisher, must be installed, and just as important, must have &lt;allowBrowserInvocation&gt;true&lt;/allowBrowserInvocation&gt; in teh application descriptor xml file.
&lt;br/&gt;&lt;br/&gt;
You can find more information about installing and running AIR from within a Flex/Flash application 
&lt;a href="http://help.adobe.com/en_US/AIR/1.1/devappsflash/WS5b3ccc516d4fbf351e63e3d118666ade46-7e15.html#WS5b3ccc516d4fbf351e63e3d118666ade46-7cd2" target="_blank"&gt;here in the Adobe documentation&lt;/a&gt;.
&lt;br/&gt;&lt;br/&gt;
Next, let's look at the AIR application that gets launched.   
&lt;br/&gt;&lt;br/&gt;

&lt;img src="http://www.cynergysystems.com/blogs/blogs/andrew.trice/max2008/02.jpg" /&gt;
&lt;br/&gt;&lt;br/&gt;
When this applciation is invoked from a BrowserInvokeEvent, it grabs a copy of the cfid and cftoken and uses those to load the server session information.  The web applciation session is now active in the desktop.
&lt;br/&gt;&lt;br/&gt;
&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;mx:WindowedApplication 
  xmlns:mx="http://www.adobe.com/2006/mxml" 
  layout="absolute"
  initialize="onInitialize()"
  applicationComplete="onApplicationComplete()"&amp;gt;
  
  &amp;lt;mx:Script&amp;gt;
    &amp;lt;![CDATA[
      import flash.net.navigateToURL;
      import mx.rpc.events.FaultEvent;
      import mx.rpc.events.ResultEvent;
    
      [Bindable]
      private var output : String = "";
      
      private var cfid : String = "";
      private var cftoken : String = "";
      
      private function onInitialize() : void
      {
        output = "Initializing...\n" + 
             "appID: " + nativeApplication.applicationID + "\n" +  
             "pubID: " + nativeApplication.publisherID + "\n\n"; 
          
        NativeApplication.nativeApplication.addEventListener( BrowserInvokeEvent.BROWSER_INVOKE, onBrowserInvoke );
      }
      
      private function onApplicationComplete() : void
      {
        output += "Application Complete: requesting session data...\n";
        output += httpService.url + "\n\n"; 
        httpService.send();
      }
      
      private function onBrowserInvoke( event : BrowserInvokeEvent ) : void
      {
        output += "Browser Invoke Event: " + event.type + "\n"; 
         var arguments : Array = event.arguments;
        output += "args: " + arguments.toString() + "\n\n";
        
        
        var cfid : String = arguments[0].toString();
        var cftoken : String = arguments[1].toString();
        
        httpService.url += "&amp;cfid=" + cfid + "&amp;cftoken=" + cftoken; 
      }
      
      private function onHTTPResult( event : ResultEvent ) : void
      {
        var result : XML = new XML( event.result );
        output += "SUCCESS: session information loaded:\n\n" +  
              "cfid: " + result.session_cfid.toString() + "\n" +
              "cftoken: " + result.session_cftoken.toString() + "\n" +
              "sessionid: " + result.session_sessionid.toString() + "\n" +
              "urltoken: " + result.session_urltoken.toString() + "\n\n";
              
        cfid = result.session_cfid.toString();
        cftoken = result.session_cftoken.toString();
      }
      
      private function onHTTPError( event : FaultEvent ) : void
      {
        output += "ERROR: unable to load session\n" + event.fault.message + "\n\n"; 
      }
      
      private function launchCFM() : void
      {
        var url : String = "http://localhost:8500/MAX/sessionOutput.cfm?cfid=" + cfid + "&amp;cftoken=" + cftoken;
        navigateToURL( new URLRequest( url ) );
      }
      
    ]]&amp;gt;
  &amp;lt;/mx:Script&amp;gt;
  
  &amp;lt;mx:ApplicationControlBar dock="true"&amp;gt;
      
    &amp;lt;mx:Button 
      label="Launch CFM Application"
      click="launchCFM()"/&amp;gt;
    
  &amp;lt;/mx:ApplicationControlBar&amp;gt;
  
  &amp;lt;mx:HTTPService 
    id="httpService"
    url="http://localhost:8500/MAX/sessionOutput.cfm?output=XML"
    result="onHTTPResult( event )"
    fault="onHTTPError( event )" 
    resultFormat="text"/&amp;gt;
  
  &amp;lt;mx:TextArea 
    text="{ output }"
    editable="false" 
    width="100%" height="100%"  /&amp;gt;
  
  
&amp;lt;/mx:WindowedApplication&amp;gt;&lt;/pre&gt;
&lt;br/&gt;&lt;br/&gt;
If you click on the Launch CFM button, it launches the browser again, and dumps the session object to screen just to show that the same session has once again been passed back into the browser.&lt;br/&gt;
&lt;img src="http://www.cynergysystems.com/blogs/blogs/andrew.trice/max2008/03.jpg" /&gt;
&lt;br/&gt;
&lt;hr&gt;
&lt;br/&gt;
The next demo that I presented showed how to read information into AIR from computer hardware via a middleware tier.   In this case, it used Java and the open source &lt;a href="http://www.merapiproject.net" target="_blank"&gt;Merapi&lt;/a&gt; framework to pass data from the hardware, to the AIR application.   The example used an open source &lt;a href="http://en.wikipedia.org/wiki/NMEA_0183" target="_blank"&gt;NMEA&lt;/a&gt; GPS reader/parser from &lt;a href="http://jgps.sourceforge.net" target="_blank"&gt;jgps.sourceforge.net&lt;/a&gt; to interact directly with the hardware.


&lt;br/&gt;&lt;br/&gt;
&lt;b&gt;GPS-aware AIR:&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;
&lt;img src="http://www.cynergysystems.com/blogs/blogs/andrew.trice/airgps/1.jpg" /&gt;
&lt;br/&gt;&lt;br/&gt;
&lt;b&gt;GPS-aware Image Capture in AIR:&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;

&lt;img src="http://www.cynergysystems.com/blogs/blogs/andrew.trice/airgps/2.jpg" /&gt;
&lt;br/&gt;&lt;br/&gt;
&lt;b&gt;The rig used to capture the data:&lt;/b&gt;
&lt;br/&gt;&lt;br/&gt;

&lt;img src="http://www.cynergysystems.com/blogs/blogs/andrew.trice/airgps/3.jpg" /&gt;&amp;nbsp;&amp;nbsp;
&lt;img src="http://www.cynergysystems.com/blogs/blogs/andrew.trice/airgps/4.jpg" /&gt;
&lt;br/&gt;&lt;br/&gt;

Helpful links:

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.merapiproject.net" target="_blank"&gt;Merapi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jgps.sourceforge.net" target="_blank"&gt;jgps.sourceforge.net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/NMEA_0183" target-"_blank"&gt;http://en.wikipedia.org/wiki/NMEA_0183&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.gpsinformation.org/dale/nmea.htm" target="_blank"&gt;http://www.gpsinformation.org/dale/nmea.htm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;&lt;br/&gt;
In Java, the MerapiGPSListener class gets registered with the GPS handler and communication from the jgps.sourceforge.net project, and responds to changes in the GPS state by sending that information across the Merapi bridge into the AIR client.   Any time that the latitude, longitude, or altitude changes, the GPSState is sent "across the wire" to the AIR application.
&lt;br/&gt;&lt;br/&gt;
&lt;pre&gt;package merapigps;


import merapi.Bridge;
import merapi.messages.IMessage;
import merapi.messages.IMessageHandler;
import merapi.messages.Message;
import gps.NmeaGpsListener;

public class MerapiGPSListener implements NmeaGpsListener, IMessageHandler {
  
  protected GPSState gpsState = new GPSState();
  
  public MerapiGPSListener() {
    
    Bridge.getInstance().registerMessageHandler("merapiGps", this);
  }
  
  public void handleMessage( IMessage message )
  {
    System.out.println( "Received \"" + message.getData() + "\" from Merapi Flex" );
    sendMessage();
  }
  
  private void sendMessage()
  {
    try 
    {
      //  Instantiate a Message to respond to Merapi Flex
      Message response = new Message( "merapiGps", null, gpsState );
      
      //  Send message to Merapi Flex
      Bridge.getInstance().sendMessage( response );
    }
    catch( Exception exception )
    {
      exception.printStackTrace();
    }
  }

  @Override
  public void altitudeChanged(float altitude, String unit) {
    // TODO Auto-generated method stub
    System.out.println( "altitudeChanged: " + altitude + " uint: " + unit );
    
    gpsState.altitude = Float.toString( altitude );
    gpsState.altitudeUnit = unit;
    sendMessage();
  }

  @Override
  public void dateTimeChanged(long date, long time) {
    // TODO Auto-generated method stub
    System.out.println( "dateTimeChanged: " + date + " time: " + time );
    
    
  }

  @Override
  public void dilutionOfPrecisionChanged(float horizontal, float vertical,
      float p) {
    // TODO Auto-generated method stub

  }

  @Override
  public void moveChanged(float sog, float tmg) {
    // TODO Auto-generated method stub

  }

  @Override
  public void positionChanged(float lat, float lon) {
    // TODO Auto-generated method stub
    System.out.println( "positionChanged: lat: " + lat + " lon: " + lon );


    gpsState.latitude = Float.toString( lat );
    gpsState.longitude = Float.toString( lon );
    sendMessage();
  }

  @Override
  public void satelliteChangeBegin() {
    // TODO Auto-generated method stub

  }

  @Override
  public void satelliteChangeEnd() {
    // TODO Auto-generated method stub

  }

  @Override
  public void satelliteChanged(int id, float elevation, float azimuth,
      float snr) {
    // TODO Auto-generated method stub

  }

}
&lt;/pre&gt;
&lt;br/&gt;&lt;br/&gt;
The GPSState class that gets sent across the Merapi bridge is just a simple value object.
&lt;br/&gt;&lt;br/&gt;
&lt;pre&gt;package merapigps;

public class GPSState {
  public String altitude = "";
  public String altitudeUnit = "";
  public String latitude = "";
  public String longitude = ""; 
}&lt;/pre&gt;
&lt;br/&gt;&lt;br/&gt;
Back on the AIR side of things, everything is very simple.   The following is a simple example that reads from the Merapi bridge and shows the current latitude, longitude, and altitude based on the information coming from the Merapi bridge.   Any time that data is pushed from Merapi into AIR, the onResult event gets triggered, which updates the the gpsState, which updates the UI based on bindings.
&lt;br/&gt;&lt;br/&gt;
&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;mx:WindowedApplication 
  xmlns:mx="http://www.adobe.com/2006/mxml" 
  xmlns:merapi="merapi.*"
  layout="absolute"
  creationComplete="onCreationComplete()"
  xmlns:pushpin="com.navtrak.pushpin.*"&amp;gt;
  
  &amp;lt;mx:Style source="styles/styles.css" /&amp;gt;
  
  &amp;lt;mx:Script&amp;gt;
    &amp;lt;![CDATA[
      import merapigps.GPSState;
      import mx.collections.ArrayCollection;
      import mx.utils.ObjectUtil;
      import mx.rpc.events.ResultEvent;
      import merapi.messages.Message;
      
      [Bindable]
      private var gpsState : GPSState = new GPSState();
      
      private function onCreationComplete() : void
      {
        bridge.sendMessage( new Message( 'merapiGps', null, 'request gpsState ' ) );
      }
      
      private function onResult( event : ResultEvent ) : void
      {
        gpsState.latitude = bridge.lastMessageData.latitude;
        gpsState.longitude = bridge.lastMessageData.longitude; 
        gpsState.altitude = bridge.lastMessageData.altitude;
      }
    ]]&amp;gt;
  &amp;lt;/mx:Script&amp;gt;
  
  &amp;lt;merapi:BridgeInstance id="bridge" 
      result="onResult(event);" /&amp;gt;
      
  &amp;lt;mx:Label x="10" y="10" text="Latitude" fontSize="20"/&amp;gt;
  &amp;lt;mx:Label x="10" y="30" text="{ gpsState.latitude }" fontSize="28"/&amp;gt;
  
  &amp;lt;mx:Label x="180" y="10" text="Longitude" fontSize="20"/&amp;gt;
  &amp;lt;mx:Label x="180" y="30" text="{ gpsState.longitude }" fontSize="28"/&amp;gt;
  
  &amp;lt;mx:Label x="10" y="72" text="Altitude" fontSize="20"/&amp;gt;
  &amp;lt;mx:Label x="10" y="92" text="{ gpsState.altitude } M." fontSize="28"/&amp;gt;
  
&amp;lt;/mx:WindowedApplication&amp;gt;&lt;/pre&gt;</description>
      <pubDate>Fri, 21 Nov 2008 22:55:53 GMT</pubDate>
      <author>Cynergy Systems Blogs</author>
      <comments>http://www.cynergysystems.com/blogs</comments>
      <guid isPermaLink="false">23250</guid>
    </item>
    <item>
      <title>Avatar'd</title>
      <link>http://blog.joshbuhler.com/2008/11/21/avatard/</link>
      <description>Got home from MAX, and the next morning I fired up my Xbox360 to get the dashboard update. Best feature so far? The Netflix streaming. I love 30 Rock, and one of my favorite episodes is &amp;#8220;Hard Ball&amp;#8221;, especially the ending musical number. (Season 1, ep 15, if you&amp;#8217;d like to watch it.) That was [...]</description>
      <pubDate>Fri, 21 Nov 2008 22:23:04 GMT</pubDate>
      <author>joshbuhler.com</author>
      <comments>http://blog.joshbuhler.com</comments>
      <guid isPermaLink="false">23249</guid>
    </item>
    <item>
      <title>Quick tour of ASDoc support in Gumbo (Flex Builder 4)</title>
      <link>http://feeds.feedburner.com/~r/MarkingOccurrences/~3/461114417/</link>
      <description>If you were lucky enough to be at MAX this year, and even luckier to see the &amp;#8220;Looking ahead to Flex Builder 4&amp;#8243; session, then you saw me demo ASDoc support in the next version of Flex Builder, code-named &amp;#8220;Gumbo&amp;#8221;.  For everyone else, this feature is way too cool (and useful) not to know [...]</description>
      <pubDate>Fri, 21 Nov 2008 20:10:37 GMT</pubDate>
      <author>david zuckerman.com</author>
      <comments>http://www.davidzuckerman.com/adobe</comments>
      <guid isPermaLink="false">23248</guid>
    </item>
    <item>
      <title>My fun time at MAX</title>
      <link>http://thefactoryfactory.com/wordpress/?p=485</link>
      <description>I had a good time at MAX, learned a few new things about some Flash Player 10 internals, learned some new things about performance tuning from Sean Christmann, and found out that there&amp;#8217;s a lot of stuff going on with getting the Flash Player to run on ARM, which you should read as &amp;#8220;on powerful [...]</description>
      <pubDate>Fri, 21 Nov 2008 18:48:29 GMT</pubDate>
      <author>thefactoryfactory</author>
      <comments>http://thefactoryfactory.com/wordpress</comments>
      <guid isPermaLink="false">23247</guid>
    </item>
  </channel>
</rss>


