From 206822f141546b3ff2c38803e6bae0829aacc2e7 Mon Sep 17 00:00:00 2001
From: Chad Pilkey <capilkey@gmail.com>
Date: Sat, 20 May 2017 16:06:23 -0400
Subject: [PATCH] fix race conditions in the presentation and whiteboard
 startup

---
 .../main/events/PresenterStatusEvent.as       |  2 -
 .../present/ui/views/PresentationWindow.mxml  | 51 +++++++++++--------
 .../whiteboard/managers/WhiteboardManager.as  |  7 ++-
 .../whiteboard/models/WhiteboardModel.as      |  4 ++
 .../whiteboard/views/WhiteboardCanvas.as      |  2 +
 .../whiteboard/views/WhiteboardToolbar.mxml   | 10 +---
 6 files changed, 40 insertions(+), 36 deletions(-)

diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/events/PresenterStatusEvent.as b/bigbluebutton-client/src/org/bigbluebutton/main/events/PresenterStatusEvent.as
index b6139dc226..691e753b69 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/main/events/PresenterStatusEvent.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/main/events/PresenterStatusEvent.as
@@ -25,12 +25,10 @@ package org.bigbluebutton.main.events
 		public static const PRESENTER_NAME_CHANGE:String = "PRESENTER_NAME_CHANGE";
 		public static const SWITCH_TO_VIEWER_MODE:String = "VIEWER_MODE";
 		public static const SWITCH_TO_PRESENTER_MODE:String = "PRESENTER_MODE";
-		public static const ANNOTATIONS_PERMISSION_CHANGE:String = "ANNOTATIONS_PERMISSION_CHANGE";
 		
 		public var presenterName:String;
 		public var assignerBy:Number;
 		public var userID:String;
-		public var enableAnnotations:Boolean;
 		
 		public function PresenterStatusEvent(type:String)
 		{
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/PresentationWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/PresentationWindow.mxml
index 3aaf945041..e2009d8471 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/PresentationWindow.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/PresentationWindow.mxml
@@ -177,6 +177,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 			private var noticeSound:Sound = new noticeSoundClass() as Sound;
 
 			private var whiteboardOverlay:WhiteboardCanvas = null;
+			private var delayedWhiteboardOverlayAdd:String;
 			private var screenshareView:ScreenshareViewWindow = null;
 			
 			private function init():void{
@@ -200,7 +201,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 				hotkeyCapture();
                 
         //Necessary now because of module loading race conditions
-        var t:Timer = new Timer(5000, 1);
+        var t:Timer = new Timer(2000, 1);
         t.addEventListener(TimerEvent.TIMER, requestWhiteboardCanvas);
         t.start();
         
@@ -517,7 +518,24 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
            if (screenshareView) {
              screenshareView.removeOverlayCanvas();
            }
-        } else LOGGER.debug("addWhiteboardCanvasToSlideView: NOT adding whiteboard canvas to Slide View.");
+        } else {
+          LOGGER.debug("addWhiteboardCanvasToSlideView: NOT adding whiteboard canvas to Slide View.");
+          delayedWhiteboardOverlayAdd = "slide";
+        }
+      }
+      
+      private function addWhiteboardCanvasToScreenshareView():void {
+        if(whiteboardOverlay != null) {
+          LOGGER.debug("addWhiteboardCanvasToScreenshareView: Adding whiteboard canvas to Screenshare View");
+          changeWhiteboardPageOnly("deskshare");
+          slideView.removeOverlayCanvas();
+          if (screenshareView) {
+            screenshareView.acceptOverlayCanvas(whiteboardOverlay);
+          }
+        } else {
+          LOGGER.debug("addWhiteboardCanvasToScreenshareView: NOT adding whiteboard canvas to Screenshare View.");
+          delayedWhiteboardOverlayAdd = "screenshare";
+        }
       }
 					
 			override protected function resourcesChanged():void{
@@ -931,7 +949,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 				btnPauseScreenshare.visible = false;
 				if (UsersUtil.amIPresenter()) {
 					setControlBarState("presenter");
-					annotationsPermissionChanged(true);
 				} else if(presenterTabs.getTabAt(SCREENSHARE_PUBLISH_TAB_INDEX).visible) {
 					presenterTabs.getTabAt(SCREENSHARE_PUBLISH_TAB_INDEX).visible = false;
 					presenterTabs.getTabAt(SCREENSHARE_PUBLISH_TAB_INDEX).includeInLayout = false;
@@ -953,24 +970,13 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 				presenterControls.visible = false;
 				presenterControls.includeInLayout = false;
 				pollStartBtn.visible = false;
-				annotationsPermissionChanged(false);
 			}
 
 			private function handleDesktopViewTabSelected():void {
 				LOGGER.debug("Handling Desktop View Tab selected");
 				currentTabIndex = SCREENSHARE_VIEW_TAB_INDEX;
 
-				if (whiteboardOverlay != null && screenshareView != null) {
-					LOGGER.debug("Adding whiteboard layer to Deskshare View Canvas");
-					changeWhiteboardPageOnly("deskshare");
-					screenshareView.acceptOverlayCanvas(whiteboardOverlay);
-					slideView.removeOverlayCanvas();
-					if(UsersUtil.amIPresenter()) {
-						annotationsPermissionChanged(true);
-					}
-				} else {
-					LOGGER.debug("openScreenshareViewTab: whiteboard overlay or desktop view canvas is null!");
-				}
+				addWhiteboardCanvasToScreenshareView();
 
 				if (!pollVoteBox.visible) {
 					btnActualSize.visible = true;
@@ -1065,12 +1071,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 				return presenterTabs.numElements == 3;
 			}
 
-			private function annotationsPermissionChanged(enableAnnotations:Boolean):void {
-				var event:PresenterStatusEvent = new PresenterStatusEvent(PresenterStatusEvent.ANNOTATIONS_PERMISSION_CHANGE);
-				event.enableAnnotations = enableAnnotations;
-				dispatchEvent(event);
-			}
-
 			private function changeVideoDisplayMode():void {
 				var e:ShareEvent = new ShareEvent(ShareEvent.CHANGE_VIDEO_DISPLAY_MODE);
 				e.fullScreen = btnActualSize.selected;
@@ -1112,6 +1112,15 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 			
 			public function receiveCanvas(wc:WhiteboardCanvas):void {
 				whiteboardOverlay = wc;
+				
+				switch (delayedWhiteboardOverlayAdd) {
+					case "slide":
+						addWhiteboardCanvasToSlideView();
+						break;
+					case "screenshare":
+						addWhiteboardCanvasToScreenshareView();
+						break;
+				}
 			}
 		]]>
 	</mx:Script>
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/managers/WhiteboardManager.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/managers/WhiteboardManager.as
index 29e447454a..b6ec2a207f 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/managers/WhiteboardManager.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/managers/WhiteboardManager.as
@@ -29,6 +29,7 @@ package org.bigbluebutton.modules.whiteboard.managers
 	import org.bigbluebutton.modules.present.events.PageLoadedEvent;
 	import org.bigbluebutton.modules.whiteboard.WhiteboardCanvasDisplayModel;
 	import org.bigbluebutton.modules.whiteboard.WhiteboardCanvasModel;
+	import org.bigbluebutton.modules.whiteboard.commands.GetWhiteboardAccessCommand;
 	import org.bigbluebutton.modules.whiteboard.events.RequestNewCanvasEvent;
 	import org.bigbluebutton.modules.whiteboard.events.WhiteboardButtonEvent;
 	import org.bigbluebutton.modules.whiteboard.events.WhiteboardUpdateReceived;
@@ -50,10 +51,8 @@ package org.bigbluebutton.modules.whiteboard.managers
 		
 		public function handleStartModuleEvent():void {
             
-			//Necessary now because of module loading race conditions
-			//var t:Timer = new Timer(1000, 1);
-			//t.addEventListener(TimerEvent.TIMER, addHighlighterCanvas);
-			//t.start();
+			var dispatcher:Dispatcher = new Dispatcher();
+			dispatcher.dispatchEvent(new GetWhiteboardAccessCommand());
 		}
 		
 		public function handleRequestNewCanvas(e:RequestNewCanvasEvent):void {
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/WhiteboardModel.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/WhiteboardModel.as
index fa03f109d1..140ef52ada 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/WhiteboardModel.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/WhiteboardModel.as
@@ -154,6 +154,10 @@ package org.bigbluebutton.modules.whiteboard.models
       event.multiUser = multiUser;
       dispatchEvent(event);
    }
+	
+	public function get multiUser():Boolean {
+		return _multiUser;
+	}
 
 	}
 }
\ No newline at end of file
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardCanvas.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardCanvas.as
index 2e16caeef5..75de21a246 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardCanvas.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardCanvas.as
@@ -78,6 +78,8 @@ package org.bigbluebutton.modules.whiteboard.views {
 			textToolbar = new WhiteboardTextToolbar();
 			textToolbar.canvas = this;
 			
+			whiteboardToolbar.whiteboardAccessModified(wbModel.multiUser);
+			
 			//create the annotation display container
 			this.addChild(graphicObjectHolder);
 			graphicObjectHolder.x = 0;
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardToolbar.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardToolbar.mxml
index 016ee5114a..6adeea26a6 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardToolbar.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardToolbar.mxml
@@ -38,7 +38,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
   <mate:Listener type="{ShortcutEvent.UNDO_WHITEBOARD}" method="undoShortcut" />
   <mate:Listener type="{ChangeMyRole.CHANGE_MY_ROLE_EVENT}" method="refreshRole" />
   <mate:Listener type="{DisplaySlideEvent.DISPLAY_SLIDE_EVENT}" method="handleSlideLoaded" />
-  <mate:Listener type="{PresenterStatusEvent.ANNOTATIONS_PERMISSION_CHANGE}" method="handleEnableAnnotations" />
     
   <mx:Style>
     .colorPickerStyle {
@@ -74,7 +73,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 		import org.bigbluebutton.common.Images;
 		import org.bigbluebutton.core.UsersUtil;
 		import org.bigbluebutton.main.events.MadePresenterEvent;
-		import org.bigbluebutton.main.events.PresenterStatusEvent;
 		import org.bigbluebutton.main.events.ShortcutEvent;
 		import org.bigbluebutton.main.model.users.events.ChangeMyRole;
 		import org.bigbluebutton.modules.present.events.DisplaySlideEvent;
@@ -97,7 +95,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
       
 			private var mousedOver:Boolean = false;
 			private var slideLoaded:Boolean = false;
-			private var enableAnnotations:Boolean = true;
 			
 			public var canvas:WhiteboardCanvas;
 			private var containerToOverlay:MDIWindow;
@@ -225,7 +222,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 			}
 
             private function checkVisibility(e:MadePresenterEvent = null):void {
-                if (toolbarAllowed() && slideLoaded && enableAnnotations && (wbOptions.keepToolbarVisible || mousedOver) && !containerToOverlay.minimized) {
+                if (toolbarAllowed() && slideLoaded && (wbOptions.keepToolbarVisible || mousedOver) && !containerToOverlay.minimized) {
                     setPositionAndDepth();
                     showToolbar();
                 } else {
@@ -297,11 +294,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
       private function get isModerator():Boolean {
         return UsersUtil.amIModerator();
       }
-		           
-      private function handleEnableAnnotations(e:PresenterStatusEvent):void {
-        enableAnnotations = e.enableAnnotations;
-        checkVisibility();
-      }
 
 		]]>
 	</mx:Script>
-- 
GitLab