PageRenderTime 52ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/examples/BatchRequests_AIR/src/BatchRequests.as

http://facebook-actionscript-api.googlecode.com/
ActionScript | 389 lines | 298 code | 77 blank | 14 comment | 19 complexity | 5f3331949b5fb37dafafc292f70e5164 MD5 | raw file
  1. package {
  2. import com.adobe.serialization.json.JSON;
  3. import com.facebook.graph.FacebookDesktop;
  4. import com.facebook.graph.data.Batch;
  5. import fl.controls.ComboBox;
  6. import fl.data.DataProvider;
  7. import flash.display.Bitmap;
  8. import flash.display.BitmapData;
  9. import flash.display.Sprite;
  10. import flash.events.MouseEvent;
  11. import flash.net.URLRequestMethod;
  12. import flash.text.TextField;
  13. import flash.text.TextFieldAutoSize;
  14. import flash.text.TextFieldType;
  15. import flash.text.TextFormat;
  16. [SWF(width="640", height="480", backgroundColor="0xffffff", frameRate="15")]
  17. public class BatchRequests extends Sprite {
  18. // Static/Constant Properties:
  19. protected static const APP_ID:String = "YOUR_APP_ID"; // Your App ID.
  20. protected static const APP_ORIGIN:String = "YOUR_APP_ORGIN"; // The site URL of your application (specified in your app settings); needed for clearing cookie when logging out.
  21. public static const PADDING_LARGE:Number = 20;
  22. public static const PADDING_SMALL:Number = 10;
  23. // Public Properties:
  24. public var loginBtn:CustomButton;
  25. public var makeBatchRequestBtn:CustomButton;
  26. public var getMyInfoToggle:ToggleButton;
  27. public var getMyInfoBtn:CustomButton;
  28. public var myInfoText:TextField;
  29. public var postMessageToggle:ToggleButton;
  30. public var postMessageBtn:CustomButton;
  31. public var postMessageInput:TextField;
  32. public var postMessageCompleteText:TextField;
  33. public var uploadImagesToggle:ToggleButton;
  34. public var uploadImagesBtn:CustomButton;
  35. public var albumPickerText:TextField;
  36. public var albumPicker:ComboBox;
  37. public var uploadPhotosCompleteText:TextField;
  38. public var imagesList:Array;
  39. public var imagesContainer:Sprite;
  40. // Protected Properties:
  41. protected var isLoggedIn:Boolean = false;
  42. protected var permissions:Array = ["user_photos"];
  43. protected var isMakingRequest:Boolean = false;
  44. protected var getMyInfoEnabled:Boolean = true;
  45. protected var postMessagesEnabled:Boolean = true;
  46. protected var uploadImagesEnabled:Boolean = true;
  47. protected var uploadedImages:uint;
  48. // Getter/Setter Properties:
  49. // Initialization:
  50. public function BatchRequests() {
  51. configUI();
  52. updateDisplayList();
  53. FacebookDesktop.init(APP_ID, handleLogin);
  54. }
  55. // Protected Methods:
  56. protected function configUI():void {
  57. loginBtn = new CustomButton();
  58. loginBtn.label = "Checking Login...";
  59. loginBtn.addEventListener(MouseEvent.CLICK, handleLoginBtnClick, false, 0, true);
  60. loginBtn.enabled = false;
  61. addChild(loginBtn);
  62. makeBatchRequestBtn = new CustomButton();
  63. makeBatchRequestBtn.label = "Make Batch Request";
  64. makeBatchRequestBtn.addEventListener(MouseEvent.CLICK, handleMakeBatchRequestBtnClick, false, 0, true);
  65. makeBatchRequestBtn.enabled = false;
  66. addChild(makeBatchRequestBtn);
  67. getMyInfoToggle = new ToggleButton();
  68. addChild(getMyInfoToggle);
  69. getMyInfoBtn = new CustomButton();
  70. getMyInfoBtn.label = "Get My Info";
  71. getMyInfoBtn.addEventListener(MouseEvent.CLICK, handleGetMyInfoBtnClick, false, 0, true);
  72. getMyInfoBtn.enabled = false;
  73. addChild(getMyInfoBtn);
  74. myInfoText = new TextField();
  75. myInfoText.border = true;
  76. myInfoText.alpha = 0.5;
  77. myInfoText.multiline = myInfoText.wordWrap = true;
  78. addChild(myInfoText);
  79. postMessageToggle = new ToggleButton();
  80. addChild(postMessageToggle);
  81. postMessageBtn = new CustomButton();
  82. postMessageBtn.label = "Post Message";
  83. postMessageBtn.addEventListener(MouseEvent.CLICK, handlePostMessageBtnClick, false, 0, true);
  84. postMessageBtn.enabled = false;
  85. addChild(postMessageBtn);
  86. postMessageInput = new TextField();
  87. postMessageInput.defaultTextFormat = new TextFormat("_sans", 12);
  88. postMessageInput.text = "This is a message to post.";
  89. postMessageInput.type = TextFieldType.INPUT;
  90. postMessageInput.border = true;
  91. postMessageInput.visible = false;
  92. addChild(postMessageInput);
  93. postMessageCompleteText = new TextField();
  94. postMessageCompleteText.text = "Posted!";
  95. postMessageCompleteText.visible = false;
  96. addChild(postMessageCompleteText);
  97. uploadImagesToggle = new ToggleButton();
  98. uploadImagesToggle.diameter = 10;
  99. addChild(uploadImagesToggle);
  100. uploadImagesBtn = new CustomButton();
  101. uploadImagesBtn.label = "Upload Sample Images";
  102. uploadImagesBtn.addEventListener(MouseEvent.CLICK, handleUploadImagesBtnClick, false, 0, true);
  103. uploadImagesBtn.enabled = false;
  104. addChild(uploadImagesBtn);
  105. albumPickerText = new TextField();
  106. albumPickerText.autoSize = TextFieldAutoSize.LEFT;
  107. albumPickerText.text = "Albums:";
  108. addChild(albumPickerText);
  109. albumPicker = new ComboBox();
  110. albumPicker.enabled = false;
  111. addChild(albumPicker);
  112. uploadPhotosCompleteText = new TextField();
  113. uploadPhotosCompleteText.visible = false;
  114. addChild(uploadPhotosCompleteText);
  115. getMyInfoEnabled = postMessagesEnabled = uploadImagesEnabled = false;
  116. imagesContainer = new Sprite();
  117. addChild(imagesContainer);
  118. imagesList = [];
  119. var size:Number = 150;
  120. var columns:int = 3;//(stage.stageWidth - PADDING_SMALL - PADDING_SMALL) / (size + PADDING_SMALL);
  121. for (var i:int, numImages:int = 3; i < numImages; i++) {
  122. var img:Bitmap = new Bitmap(new BitmapData(size, size, false, Math.random()*0xffffff));
  123. img.x = (i % columns) * (size + PADDING_SMALL);
  124. img.y = Math.floor(i / columns) * (size + PADDING_SMALL);
  125. imagesList.push(img);
  126. imagesContainer.addChild(img);
  127. }
  128. }
  129. protected function updateDisplay():void {
  130. makeBatchRequestBtn.enabled = getMyInfoBtn.enabled = uploadImagesBtn.enabled = postMessageBtn.enabled = isLoggedIn && !isMakingRequest;
  131. postMessageInput.visible = isLoggedIn && postMessageToggle.selected;
  132. loginBtn.enabled = !isMakingRequest;
  133. getMyInfoToggle.selected = getMyInfoEnabled;
  134. postMessageToggle.selected = postMessageInput.visible = postMessagesEnabled;
  135. uploadImagesToggle.selected = uploadImagesEnabled;
  136. albumPicker.enabled = albumPicker.dataProvider.length > 0 && !isMakingRequest;
  137. }
  138. protected function updateDisplayList():void {
  139. loginBtn.x = PADDING_SMALL;
  140. loginBtn.y = PADDING_SMALL;
  141. makeBatchRequestBtn.x = (stage.stageWidth / 2) - (makeBatchRequestBtn.width / 2);
  142. makeBatchRequestBtn.y = loginBtn.y;
  143. getMyInfoToggle.diameter = 10;
  144. getMyInfoToggle.x = PADDING_SMALL;
  145. getMyInfoBtn.x = getMyInfoToggle.x + getMyInfoToggle.width + PADDING_SMALL;
  146. getMyInfoBtn.y = loginBtn.y + loginBtn.height + PADDING_LARGE;
  147. getMyInfoToggle.y = getMyInfoBtn.y + (getMyInfoBtn.height / 2) - (getMyInfoToggle.height / 2);
  148. myInfoText.x = getMyInfoBtn.x + getMyInfoBtn.width + PADDING_SMALL;
  149. myInfoText.y = getMyInfoBtn.y;
  150. myInfoText.width = stage.stageWidth - PADDING_SMALL - myInfoText.x;
  151. myInfoText.height = 100;
  152. postMessageToggle.diameter = 10;
  153. postMessageToggle.x = PADDING_SMALL;
  154. postMessageToggle.y = myInfoText.y + myInfoText.height + PADDING_LARGE;
  155. postMessageBtn.x = postMessageToggle.x + postMessageToggle.width + PADDING_SMALL;
  156. postMessageBtn.y = myInfoText.y + myInfoText.height + PADDING_SMALL;
  157. postMessageToggle.y = postMessageBtn.y + (postMessageBtn.height / 2) - (postMessageToggle.height / 2);
  158. postMessageInput.x = postMessageBtn.x + postMessageBtn.width + PADDING_SMALL;
  159. postMessageInput.y = postMessageBtn.y;
  160. postMessageInput.width = 350;
  161. postMessageInput.height = postMessageBtn.height;
  162. postMessageCompleteText.x = postMessageInput.x + postMessageInput.width + PADDING_SMALL;
  163. postMessageCompleteText.y = postMessageInput.y;
  164. uploadImagesToggle.diameter = 10;
  165. uploadImagesToggle.x = PADDING_SMALL;
  166. uploadImagesToggle.y = postMessageBtn.y + postMessageBtn.height + PADDING_LARGE;
  167. uploadImagesBtn.x = uploadImagesToggle.x + uploadImagesToggle.width + PADDING_SMALL;
  168. uploadImagesBtn.y = postMessageBtn.y + postMessageBtn.height + PADDING_SMALL;
  169. uploadImagesToggle.y = uploadImagesBtn.y + (uploadImagesBtn.height / 2) - (uploadImagesToggle.height / 2);
  170. albumPickerText.x = uploadImagesBtn.x + uploadImagesBtn.width + PADDING_SMALL;
  171. albumPickerText.y = uploadImagesBtn.y;
  172. albumPicker.x = albumPickerText.x + albumPickerText.width + PADDING_SMALL;
  173. albumPicker.y = uploadImagesBtn.y;
  174. albumPicker.width = 200;
  175. uploadPhotosCompleteText.x = albumPicker.x + albumPicker.width + PADDING_SMALL;
  176. uploadPhotosCompleteText.y = uploadImagesBtn.y;
  177. imagesContainer.x = uploadImagesBtn.x;
  178. imagesContainer.y = uploadImagesBtn.y + uploadImagesBtn.height + PADDING_SMALL;
  179. }
  180. // Event Handlers:
  181. protected function handleMakeBatchRequestBtnClick(event:MouseEvent):void {
  182. // Create a new Batch object:
  183. var batch:Batch = new Batch();
  184. // Check if user wants to get their info:
  185. if (getMyInfoEnabled) {
  186. myInfoText.text = "";
  187. myInfoText.alpha = 0.5;
  188. batch.add("me/", handleGetInfoComplete);
  189. }
  190. // Check if user wants to post a message:
  191. if (postMessagesEnabled) {
  192. postMessageCompleteText.visible = false;
  193. batch.add("me/feed/", handlePostMessageComplete, {message:postMessageInput.text}, URLRequestMethod.POST);
  194. }
  195. // Check if user wants to upload photos:
  196. if (uploadImagesEnabled) {
  197. var albumId:String = albumPicker.selectedItem.id;
  198. uploadedImages = 0;
  199. uploadPhotosCompleteText.visible = false;
  200. for (var i:int, l:int = imagesList.length; i < l; i++) {
  201. //Add each photo to this batch.
  202. batch.add(
  203. '/'+albumId+'/photos', //Upload photos to this album
  204. handleUploadImageComplete, //Called after the batch operation is complete.
  205. {
  206. message:'My photo ' + (i + 1),
  207. fileName:'FILE_NAME' + i,
  208. image:(imagesList[i] as Bitmap).bitmapData
  209. }, //Add the image data and related data (the batch operation will format the image for upload)
  210. URLRequestMethod.POST
  211. );
  212. }
  213. }
  214. isMakingRequest = true;
  215. updateDisplay();
  216. // Make the batch request call.
  217. //handleBatchRequestComplete: Will be called after the individual batch callbacks
  218. FacebookDesktop.batchRequest(batch, handleBatchRequestComplete);
  219. }
  220. protected function handleGetInfoComplete(result:Object):void {
  221. if (!("error" in result.body)) {
  222. myInfoText.alpha = 1;
  223. myInfoText.text = JSON.encode(result.body);
  224. } else {
  225. myInfoText.text = "An Error Occured.";
  226. }
  227. }
  228. protected function handlePostMessageComplete(result:Object):void {
  229. postMessageCompleteText.visible = true;
  230. postMessageCompleteText.text = ("error" in result.body) ? "An Error Occured" : "Message Posted!";
  231. }
  232. protected function handleUploadImageComplete(result:Object):void {
  233. if (++uploadedImages == imagesList.length) {
  234. uploadPhotosCompleteText.visible = true;
  235. uploadPhotosCompleteText.text = ("error" in result.body) ? "An Error Occured" : "Images Posted!";
  236. }
  237. }
  238. protected function handleBatchRequestComplete(result:Object):void {
  239. isMakingRequest = false;
  240. updateDisplay();
  241. }
  242. protected function handleGetMyInfoBtnClick(event:MouseEvent):void {
  243. getMyInfoEnabled = !getMyInfoEnabled;
  244. updateDisplay();
  245. }
  246. protected function handlePostMessageBtnClick(event:MouseEvent):void {
  247. postMessagesEnabled = !postMessagesEnabled;
  248. postMessageCompleteText.visible = postMessagesEnabled;
  249. postMessageCompleteText.text = "";
  250. updateDisplay();
  251. }
  252. protected function handleUploadImagesBtnClick(event:MouseEvent):void {
  253. uploadImagesEnabled = !uploadImagesEnabled;
  254. uploadPhotosCompleteText.visible = uploadImagesEnabled;
  255. uploadPhotosCompleteText.text = "";
  256. updateDisplay();
  257. }
  258. protected function handleLogin(result:Object, fail:Object):void {
  259. loginBtn.enabled = true;
  260. if (result) { // User successfully logged in.
  261. loginBtn.label = "Logout";
  262. isLoggedIn = true;
  263. getMyInfoEnabled = postMessagesEnabled = uploadImagesEnabled = true;
  264. updateDisplay();
  265. albumPickerText.text = "Loading Albums...";
  266. FacebookDesktop.api("me/albums", handleAlbumsComplete);
  267. updateDisplayList();
  268. } else { // User unsuccessfully logged in.
  269. loginBtn.label = "Login";
  270. }
  271. }
  272. protected function handleAlbumsComplete(result:Object, error:Object):void {
  273. if (result && !result.error) {
  274. var albums:Array = result as Array;
  275. albumPicker.dataProvider = new DataProvider(albums);
  276. albumPicker.labelField = "name";
  277. albumPickerText.text = "Albums:";
  278. uploadImagesEnabled = true;
  279. uploadImagesBtn.enabled = true;
  280. updateDisplay();
  281. updateDisplayList();
  282. } else {
  283. albumPicker.dataProvider = new DataProvider();
  284. albumPicker.visible = true;
  285. albumPickerText.text = "No Albums";
  286. uploadImagesEnabled = false;
  287. updateDisplay();
  288. updateDisplayList();
  289. uploadImagesBtn.enabled = false;
  290. }
  291. }
  292. protected function handleLogout(success:Boolean):void {
  293. albumPicker.dataProvider = new DataProvider();
  294. loginBtn.enabled = true;
  295. loginBtn.label = "Login";
  296. isLoggedIn = false;
  297. getMyInfoEnabled = postMessagesEnabled = uploadImagesEnabled = false;
  298. postMessageCompleteText.visible = uploadPhotosCompleteText.visible = false;
  299. updateDisplay();
  300. }
  301. protected function handleLoginBtnClick(event:MouseEvent):void {
  302. loginBtn.enabled = false;
  303. if (isLoggedIn) {
  304. loginBtn.label = "Logging Out...";
  305. FacebookDesktop.logout(handleLogout, APP_ORIGIN);
  306. } else {
  307. loginBtn.label = "Logging In...";
  308. FacebookDesktop.login(handleLogin, permissions);
  309. }
  310. }
  311. }
  312. }