<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    layout="absolute"
    creationComplete="init()" viewSourceURL="srcview/index.html">
    <mx:Script>
        <![CDATA[
            import mx.messaging.AbstractConsumer;
            import mx.containers.Panel;
            import mx.events.FlexEvent;
            import mx.collections.ArrayCollection;
            import mx.controls.Alert;
            import mx.controls.VideoDisplay;
            
            // Total de camaras registradas en el Flash Player
            [Bindable]
            private var totalCams : Number = 0;
            // Camaras encendidas
            [Bindable]
            private var camarasListas : Array;
            
            private function init( ):void
            {
                camarasListas = [];
                //Security.showSettings( SecurityPanel.CAMERA );
                actualizarCamaras();
            }
            
            /**
             * Quita todas las camaras que existan en el Tile y carga nuevamente todas las camaras
             * registradas en el Flash Player.
             * 
             * NOTA: Este metodo no detectara si han sido agregadas nuevas camaras, solo reactivara
             * las que hayan sido desactivadas por eventos tales como desconexion del cable de la
             * camara, por ejemplo. Para detectar nuevas camaras agregadas, es necesario cerrar el
             * navegador y abrir la aplicacion nuevamente. 
             **/
            private function actualizarCamaras():void
            {
                quitarTodasLasCamaras();
                // TODO: eliminar todas las camaras del tileVideos
                iniciarTodasLasCamaras();
            }
            
            /**
             * Inicia el proceso de encendido y agregacion a la vista de todas las camaras registradas
             * en Flash Player.
             **/
            private function iniciarTodasLasCamaras( ):void
            {
                if ( Camera.names.length != 0 )
                {
                    for ( var i : uint = 0; i < Camera.names.length; i++ )
                    {
                        crearVideoDisplay();
                        cargarCamara( i );
                        //var camaras : Array = Camera.names;
                        //var nombreCam : String = Camera.names[ i ].toString();
                    }
                }
                else
                {
                    Alert.show("No hay camaras instaladas. Instale más de una camara y presione " + 
                                "el boton Actualizar.");
                }
            }
            
            /**
             * Crea un VideoDisplay y lo agrega como hijo a un Panel. Este Panel se agrega a la vista
             * como hijo del contenedor tileVideos.
             **/
            private function crearVideoDisplay():void
            {
                var panel : Panel = new Panel();
                var display : VideoDisplay = new VideoDisplay();
                display.addEventListener( FlexEvent.CREATION_COMPLETE, displayCreationCompleteHandler, false, 0, true );
                panel.addChild( display );
                tileVideos.addChild( panel );
            }
            
            /**
             * Carga la camara correspondiente al indice indicado y la agrega a la lista de camaras
             * listas.
             **/
            private function cargarCamara( indice : uint ):void
            {
                var camara : Camera = Camera.getCamera( String( indice ) );
                if ( camara != null )
                {
                    camara.addEventListener( ActivityEvent.ACTIVITY, camaraActivityEventHandler, false, 0, true );
                    camarasListas.push( camara );
                }
            }
            /**
             * Agrega una camara al VideoDisplay que despacho el evento. Es necesario esperar a que el
             * VideoDisplay este creado completamente para poder agregarle la camara; de lo contrario,
             * el tamaño del VideoDisplay no se ajusta al tamaño de presentacion de la camara.
             **/
            private function displayCreationCompleteHandler( event : FlexEvent ):void
            {
                agregarCamaraADisplay(    VideoDisplay( event.currentTarget ),
                                        Camera( camarasListas.pop() ) );
            }
            /**
             * Agrega la camara indicada al VideoDisplay indicado.
             **/
            private function agregarCamaraADisplay( display : VideoDisplay, camara : Camera ):void
            {
                camara.setMode( 320, 240, 15, false );
                display.width = camara.width;
                display.height = camara.height;
                display.attachCamera( camara );
            }
            
            /**
             * Quita todas las camaras y los contenedores del tileVideos. 
             **/
            private function quitarTodasLasCamaras():void
            {
                while ( tileVideos.numChildren > 0 )
                {
                    var panel : Panel = Panel( tileVideos.getChildren()[tileVideos.numChildren - 1] );
                    var display : VideoDisplay = VideoDisplay( panel.getChildAt( 0 ) );
                    
                    display.attachCamera( null );
                    panel.removeChild( display );
                    tileVideos.removeChild( panel );
                    
                    display = null;
                    panel = null;
                }
            }
            
            private function camaraActivityEventHandler( event : ActivityEvent ):void
            {
                trace("Actividad: " + event);
            }
        ]]>
    </mx:Script>
    <mx:Box
        direction="vertical"
        width="100%" height="100%">
        <mx:ApplicationControlBar
            width="100%">
            <mx:Button
                label="Actualizar"
                click="actualizarCamaras()"/>
        </mx:ApplicationControlBar>
        <mx:Tile
            id="tileVideos"
            direction="horizontal"
            width="100%" height="100%">
        </mx:Tile>
    </mx:Box>
</mx:Application>


























<!-- Este ejemplo fue realizado con fines ilustrativos y educacionales para ria212.com 
    por Juan Manrique (DonKenshin). http://groups.google.com/group/flex-air-ve 
                                          RIA212.com 15-julio-2010 -->