<?xml version="1.0" encoding="utf-8"?>
<!--

Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License.  You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

-->
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
		xmlns:s="library://ns.adobe.com/flex/spark" 
		title="CameraUI" >
	
	<fx:Script>
		<![CDATA[
			
			import spark.events.ViewNavigatorEvent;
			
			private var cameraUI:CameraUI;
			private var mpLoader:Loader;
			
			protected function launchCameraUI(event:MouseEvent):void
			{
				if( CameraUI.isSupported )
				{
					cameraUI= new CameraUI();
					cameraUI.addEventListener(MediaEvent.COMPLETE, onCameraUIComplete);
					/*cameraUI.addEventListener(Event.CANCEL, onCameraUICanceled);*/
					cameraUI.addEventListener(ErrorEvent.ERROR, onCameraError);
					cameraUI.launch(MediaType.IMAGE);
				}
				else
				{
					trace( "Camera interface is not supported.");
				}		
			}
			
			private function onCameraUIComplete(e:MediaEvent):void
			{
				/*cameraUI.removeEventListener(MediaEvent.COMPLETE, onCameraUIComplete);
				cameraUI.removeEventListener(Event.CANCEL, onCameraUICanceled);
				cameraUI.removeEventListener(ErrorEvent.ERROR, onCameraError);*/
				
				var mediaPromise:MediaPromise = e.data;
				
				this.mpLoader = new Loader();
				this.mpLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onMediaPromiseLoaded);
				/*this.mpLoader.addEventListener(IOErrorEvent.IO_ERROR, onMediaPromiseLoadError);*/
				this.mpLoader.loadFilePromise(mediaPromise);
			}
			
			private function onMediaPromiseLoaded(e:Event):void
			{
				var mpLoaderInfo:LoaderInfo = e.target as LoaderInfo;
				mpLoaderInfo.removeEventListener(Event.COMPLETE, onMediaPromiseLoaded);
			/*	mpLoaderInfo.loader.removeEventListener(IOErrorEvent.IO_ERROR, onMediaPromiseLoadError);*/
				this.image.source = mpLoaderInfo.loader;
			}
			
			
			protected function onCameraError(event:ErrorEvent):void
			{
				trace();
			}
			
			protected function buttonHandler(event:MouseEvent):void
			{
				if(currentState == "DemoState")
				{
					currentState = "InfoState";				
				}
				else if(currentState == "InfoState")
				{
					currentState = "DemoState";
				}
			}
		]]>
	</fx:Script>
	
	<s:states>
		<s:State name="DemoState"/>
		<s:State name="InfoState"/>
	</s:states>
	<fx:Declarations>
		<s:MultiDPIBitmapSource id="aboutIcon" source160dpi="@Embed('assets/icons/160/about.png')" source240dpi="@Embed('assets/icons/240/about.png')" 
								source320dpi="@Embed('assets/icons/320/about.png')" source480dpi="assets/icons/480/about.png"/>
		<s:MultiDPIBitmapSource id="demoIcon" source160dpi="@Embed('assets/icons/160/dock.png')" source240dpi="@Embed('assets/icons/240/dock.png')" 
								source320dpi="@Embed('assets/icons/320/dock.png')" source480dpi="assets/icons/480/dock.png"/>
	</fx:Declarations>
	<s:VGroup width="100%" height="100%" includeIn="DemoState" horizontalAlign="center">
		<s:Button label="Launch Camera UI" click="launchCameraUI(event)" />
		<s:Image id="image" width="100%" height="100%" scaleMode="letterbox" />
	</s:VGroup>
	<s:TextArea includeIn="InfoState" selectable="false" left="10" right="10" top="10" bottom="10" editable="false" text="The CameraUI class allows you to capture a still image or video using the default camera application on a device.
				&#xd; &#xd;The launch() method requests that the device open the default camera application. The captured image or video is available in the MediaEvent object dispatched for the complete event. Since the default camera application can save the image or video in a variety of formats, there is no guarantee that returned media object can be loaded and displayed by the AIR runtime.
				&#xd; &#xd;On some platforms, the media object returned by the camera is accessible as a file-based media promise. On others, the media promise is not file-based and the file and relativePath properties of the MediaPromise object are null. Do not use these properties in code that is used on more than one platform.
				&#xd; &#xd;On Android, the default camera application does not open if the external storage card is not available (such as when the user has mounted the card as a USB mass storage device). In addition, the AIR application that launches the camera loses focus. If the device runs low on resources, the AIR application can be terminated by the operating system before the media capture is complete.
				&#xd; &#xd;On some platforms, the media object is automatically stored in the device media library. On platforms on which images and video are not automatically stored by the default camera application, you can use the CameraRoll addBitmapData() function to store the media object."/>
	
	<s:actionContent>
		<s:Button click="buttonHandler(event)" icon.DemoState="{aboutIcon}" icon.InfoState="{demoIcon}"/>
	</s:actionContent>
	
</s:View>
