From 9fce758cecc956a530ad2b77eea3d86eb4ba2567 Mon Sep 17 00:00:00 2001 From: Nicholas Kwiatkowski Date: Fri, 8 Feb 2013 01:28:44 +0000 Subject: [PATCH] Refactoring ImageGate, preparing for mustella tests git-svn-id: https://svn.apache.org/repos/asf/flex/whiteboard@1443816 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/components/BitmapImageGate.as | 301 ++++++++++++++++++ .../src/org/apache/components/ImageGate.as | 4 +- 2 files changed, 303 insertions(+), 2 deletions(-) create mode 100644 quetwo/ImageGate/trunk/ImageGate/src/org/apache/components/BitmapImageGate.as diff --git a/quetwo/ImageGate/trunk/ImageGate/src/org/apache/components/BitmapImageGate.as b/quetwo/ImageGate/trunk/ImageGate/src/org/apache/components/BitmapImageGate.as new file mode 100644 index 000000000..ffb8b456f --- /dev/null +++ b/quetwo/ImageGate/trunk/ImageGate/src/org/apache/components/BitmapImageGate.as @@ -0,0 +1,301 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// 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. +// +//////////////////////////////////////////////////////////////////////////////// +// Original component created by Dan Florio (http://www.polygeek.com), and donated +// via Nick Kwiatkowski (quetwo) to the Apache Flex Project +//////////////////////////////////////////////////////////////////////////////// + +package org.apache.components +{ + + import flash.display.Bitmap; + import flash.display.Loader; + import flash.events.Event; + import flash.events.IOErrorEvent; + import flash.filesystem.File; + import flash.filesystem.FileMode; + import flash.filesystem.FileStream; + import flash.net.URLLoader; + import flash.net.URLLoaderDataFormat; + import flash.net.URLRequest; + import flash.system.Capabilities; + import flash.utils.ByteArray; + + import spark.primitives.BitmapImage; + + public class BitmapImageGate extends BitmapImage + { + private var _urlRequest:URLRequest; + private var _urlLoader:URLLoader; + private var _loader:Loader; + private var _fileStream:FileStream; + + private var _url:String; + private var _filename:String; + private var _file:File; + + private var _assetURLallDPI:String; + private var _assetURL160:String; + private var _assetURL240:String; + private var _assetURL320:String; + + private var _cacheFolder:String = "imageCache"; + + public function BitmapImageGate() + { + super(); + } + + private function findImage():void + { + + /** + * The _cacheFolder must be set in order to proceed. + */ + if (_cacheFolder == null) + { + return; + } + + var gotAllMultiScreenURLs:Boolean = false; + + if (_assetURL160 != null + && _assetURL240 != null + && _assetURL320 != null) + { + + gotAllMultiScreenURLs = true; + } + + /** + * If we don't have either of the _assetURL or all of the + * multi-screen URLs then we can not proceed. + */ + if (_assetURLallDPI == null && !gotAllMultiScreenURLs) + { + return + } + + if (_assetURLallDPI == '') + { + return + } + + /** + * Check to see what the _url is going to be for this particular image. + * -If _assetURL != null then use that url. + * -Otherwise find the correct _url based on the current screen resolution. + */ + + if (_assetURLallDPI != null) + { + _url = _assetURLallDPI; + } + else if (Capabilities.screenDPI >= 280) + { + _url = _assetURL320 + } + else if (Capabilities.screenDPI >= 200) + { + _url = _assetURL240 + } + else + { + _url = _assetURL160 + } + + _filename = _url.substring(_url.lastIndexOf('/') + 1); + + if (Capabilities.os.toLowerCase().indexOf('iphone') != -1 || Capabilities.os.toLowerCase().indexOf('ipad') != -1 || Capabilities.os.toLowerCase().indexOf('ipod') != -1) + { + // Store the downloaded files in the Cache directory on iOS devices only. This is to comply with the + // new AppStore guidelines that are in effect as of iOS 5.1 + _file = new File(File.applicationDirectory.nativePath + "/\.\./Library/Caches").resolvePath(_cacheFolder + '/' + _filename); + } + else + { + // Store the downloaded files in the applicationStorage Directory. + _file = File.applicationStorageDirectory.resolvePath(_cacheFolder + '/' + _filename); + } + + if (_file.exists) + { + var byteArray:ByteArray = new ByteArray(); + _fileStream = new FileStream(); + _fileStream.open(_file, FileMode.READ); + _fileStream.readBytes(byteArray); + _fileStream.close(); + _fileStream = null; + _file = null; + + _loader = new Loader(); + _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onBytesLoaded); + _loader.loadBytes(byteArray); + + } + else + { + downloadRemoteFile(); + } + } + + private function onBytesLoaded(e:Event):void + { + this.source = new Bitmap(e.target.content.bitmapData); + _loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onBytesLoaded); + + // Cleanup + _loader = null; + _filename = null; + } + + + private function downloadRemoteFile():void + { + _urlLoader = new URLLoader(); + _urlRequest = new URLRequest(_url); + _urlLoader.dataFormat = URLLoaderDataFormat.BINARY; + _urlLoader.addEventListener(Event.COMPLETE, onDownloadComplete); + _urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onIOerror); + _urlLoader.load(_urlRequest); + } + + private function onDownloadComplete(e:Event):void + { + var byteArray:ByteArray = _urlLoader.data; + _fileStream = new FileStream(); + _fileStream.open(_file, FileMode.WRITE); + _fileStream.writeBytes(byteArray, 0, byteArray.length); + _fileStream.close(); + + _loader = new Loader(); + _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onBytesLoaded); + _loader.loadBytes(byteArray); + + cleanupAfterDownload(); + } + + private function onIOerror(e:IOErrorEvent):void + { + throw("image download error : " + _url + " : " + _filename); + cleanupAfterDownload(); + } + + private function cleanupAfterDownload():void + { + _urlLoader.close(); + _urlLoader = null; + _fileStream = null; + _urlRequest = null; + _url = null; + } + + /* ************************************************************ + * Setters + * ************************************************************ */ + override public function set source(value:Object):void + { + //super.source = value; + if (_assetURLallDPI != value) + { + _assetURLallDPI = String(value); + findImage(); + } + } + + public function setMultiDPIsource(value:String, dpi:Number = 0):void + { + if (dpi == 0) + { + source = value; + } + if (dpi > 280) + { + _assetURL160 = value; + findImage(); + return; + } + if (dpi > 200) + { + _assetURL240 = value; + findImage(); + return; + } + if (dpi <= 200) + { + _assetURL160 = value; + findImage(); + } + } + + public function set cacheFolder(value:String):void + { + if (_cacheFolder == value) + { + return; + } + _cacheFolder = value; + findImage(); + } + + /* ************************************************************ + * Getters + * ************************************************************ */ + + public function get cacheFolder():String + { + return _cacheFolder; + } + + public function getMultiDPIsource(dpi:Number = 0):String + { + if (dpi == 0) + { + return _assetURLallDPI; + } + if (dpi > 280) + { + return _assetURL320; + } + if (dpi > 200) + { + return _assetURL240; + } + return _assetURL160; + } + + [Inspectable(category="General")] + [Bindable("sourceChanged")] + override public function get source():Object + { + if ((Capabilities.screenDPI > 280 )&&(_assetURL320 != null)) + { + return _assetURL320; + } + if ((Capabilities.screenDPI > 200 )&&(_assetURL240 != null)) + { + return _assetURL240; + } + if ((Capabilities.screenDPI <= 200 )&&(_assetURL160 != null)) + { + return _assetURL160; + } + return _assetURLallDPI; + } + } +} diff --git a/quetwo/ImageGate/trunk/ImageGate/src/org/apache/components/ImageGate.as b/quetwo/ImageGate/trunk/ImageGate/src/org/apache/components/ImageGate.as index b72c33214..cb155ae94 100644 --- a/quetwo/ImageGate/trunk/ImageGate/src/org/apache/components/ImageGate.as +++ b/quetwo/ImageGate/trunk/ImageGate/src/org/apache/components/ImageGate.as @@ -36,9 +36,9 @@ package org.apache.components import flash.system.Capabilities; import flash.utils.ByteArray; - import spark.primitives.BitmapImage; + import spark.components.Image; - public class ImageGate extends BitmapImage + public class ImageGate extends Image { private var _urlRequest:URLRequest;