You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2017/04/10 16:58:56 UTC

svn commit: r1790877 - in /openmeetings/application/trunk: openmeetings-flash/ openmeetings-flash/src/main/flex/ openmeetings-web/src/main/java/org/apache/openmeetings/web/room/ openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/ o...

Author: solomax
Date: Mon Apr 10 16:58:56 2017
New Revision: 1790877

URL: http://svn.apache.org/viewvc?rev=1790877&view=rev
Log:
[OPENMEETINGS-551] basic work on settings dialog

Removed:
    openmeetings/application/trunk/openmeetings-web/src/main/webapp/js/
Modified:
    openmeetings/application/trunk/openmeetings-flash/openlaszlo.xml
    openmeetings/application/trunk/openmeetings-flash/src/main/flex/main.mxml
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html
    openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/room.css

Modified: openmeetings/application/trunk/openmeetings-flash/openlaszlo.xml
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-flash/openlaszlo.xml?rev=1790877&r1=1790876&r2=1790877&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-flash/openlaszlo.xml (original)
+++ openmeetings/application/trunk/openmeetings-flash/openlaszlo.xml Mon Apr 10 16:58:56 2017
@@ -7,9 +7,9 @@
   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
@@ -19,10 +19,10 @@
  -->
 <!DOCTYPE project>
 <project name="openmeetings" basedir="./" default="client.only"
-	xmlns="antlib:org.apache.tools.ant"
-	xmlns:rat="antlib:org.apache.rat.anttasks"
-	xmlns:ivy="antlib:org.apache.ivy.ant"
-	xmlns:artifact="antlib:org.apache.maven.artifact.ant"
+		xmlns="antlib:org.apache.tools.ant"
+		xmlns:rat="antlib:org.apache.rat.anttasks"
+		xmlns:ivy="antlib:org.apache.ivy.ant"
+		xmlns:artifact="antlib:org.apache.maven.artifact.ant"
 	>
 	<property name="laszlo46.home" value="${openlaszlo}/openlaszlo46" />
 	<!-- LPS Properties -->
@@ -32,7 +32,7 @@
 	<path id="laszlo46.lib">
 		<fileset dir="${laszlo46.home}/WEB-INF/lib" includes="*.jar" />
 	</path>
-	
+
 	<target name="client.only" depends="compile.flex, compile.laszlo.networktesting" unless="client-already-built">
 		<property name="client-already-built" value="true"/>
 	</target>
@@ -77,19 +77,19 @@
 	<condition property="isWindows">
 		<os family="windows" />
 	</condition>
-	
+
 	<condition property="isUnix">
 		<os family="unix" />
 	</condition>
-	
+
 	<target name="if_windows" if="isWindows">
 		<property name="mxmlc_bin" value="mxmlc.bat" />
 	</target>
-	
+
 	<target name="if_unix" if="isUnix">
 		<property name="mxmlc_bin" value="mxmlc" />
 	</target>
-	
+
 	<target name="-compile.flex" description="compile flash application" depends="if_windows, if_unix">
 		<exec dir="${flex.src.dir}" executable="${laszlo46.home}/WEB-INF/flexsdk/4.15.0/bin/${mxmlc_bin}">
 			<arg value="main.mxml"/>
@@ -97,11 +97,11 @@
 			<env key="PLAYERGLOBAL_HOME" value="${laszlo46.home}/WEB-INF/flexsdk/4.15.0/frameworks/libs/player"/>
 		</exec>
 	</target>
-	
+
 	<target name="compile.flex" depends="compile.flex.debug">
 		<antcall target="-compile.flex" inheritAll="true" inheritRefs="true"/>
 	</target>
-	
+
 	<target name="compile.flex.debug">
 		<!--antcall target="-compile.flex" inheritAll="true" inheritRefs="true"/-->
 	</target>

Modified: openmeetings/application/trunk/openmeetings-flash/src/main/flex/main.mxml
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-flash/src/main/flex/main.mxml?rev=1790877&r1=1790876&r2=1790877&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-flash/src/main/flex/main.mxml (original)
+++ openmeetings/application/trunk/openmeetings-flash/src/main/flex/main.mxml Mon Apr 10 16:58:56 2017
@@ -20,25 +20,18 @@
 -->
 <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
 		xmlns:s="library://ns.adobe.com/flex/spark"
-		xmlns:mx="library://ns.adobe.com/flex/mx" width="570" height="900" pageTitle="Openmeetings"
+		xmlns:mx="library://ns.adobe.com/flex/mx"
+		width="570" height="900" pageTitle="Openmeetings"
 		preinitialize="init()" fontSize="12" applicationComplete="appInit()">
 	<fx:Declarations>
 		<!-- Place non-visual elements (e.g., services, value objects) here -->
 		<mx:TraceTarget/>
 	</fx:Declarations>
 	<fx:Script><![CDATA[
-		import mx.collections.ArrayCollection;
 		import mx.core.FlexGlobals;
+
 		import org.apache.openmeetings.OmVideo;
 
-		private static const MODE_N:String = "n";
-		private static const MODE_A:String = "a";
-		private static const MODE_V:String = "v";
-		private static const MODE_AV:String = "av";
-		private static const APP_WIDTH:int = 540;
-		private static const LEFT_WIDTH:int = 280;
-		private static const RIGHT_WIDTH:int = 240;
-		private var debugEnabled:Boolean = true;
 		private var sid:String;
 		private var roomid:int;
 		private var audioOnly:Boolean = false;
@@ -49,6 +42,8 @@
 		private var echoPath:int = 256;
 		private var echoSuppression:Boolean = true;
 		private var microphoneRateBest:int = 22;//5, 8, 11, 22, and 44
+		private var selectedMic:int = -1;
+		private var selectedCam:int = -1;
 		private var video:OmVideo;
 		private var recName:String;
 		private var codec:String = OmVideo.CODEC_H264;
@@ -58,42 +53,9 @@
 		private var app:String;
 		[Bindable]
 		private var interview:Boolean = false;
-		[Bindable]
-		private var debugStr:String = "";
-
-		private function setDimensions(width:int, height:int):void {
-			mainSetupGroup.width = width;
-			//mainSetupGroup.height = height;
-		}
-
-		public function debug(str:String):void {
-			if (debugEnabled) {
-				debugStr += str + "\n";
-				trace(str + "\n");
-			}
-		}
-
-		private function store():void {
-			var t:SharedObject = SharedObject.getLocal('userdata');
-			var g:Object = t.data ? t.data : new Object();
-			g["cam"] = cams.selectedItem.data;
-			g["mic"] = mics.selectedItem.data;
-			g["avstored"] = modes.selectedItem.data;
-			g["savecamdata"] = remember.selected;
-			g["width"] = ress.selectedItem.width;
-			g["height"] = ress.selectedItem.height;
-			t.flush();
-		}
-
-		private static function getStoredProp(prop:String):String {
-			//Initialize and get eventually stored property
-			var t:SharedObject = SharedObject.getLocal('userdata');
-			var g:Object = t.data;
-			return g != null ? "" + g[prop] : null;
-		}
 
 		private function init():void {
-			debug("init()");
+			trace("init()");
 			var tla:Object = FlexGlobals.topLevelApplication;
 			sid = tla.parameters['sid'];
 			roomid = tla.parameters['roomid'];
@@ -112,40 +74,8 @@
 			app = tla.parameters['app'];
 		}
 
-		private function selectListItem(combo:ComboBox, selected:int):void {
-			combo.callLater(function ():void {
-				if (combo.dataProvider && combo.dataProvider.length > 0) {
-					combo.selectedItem = combo.dataProvider.getItemAt(selected < combo.dataProvider.length ? selected : 0);
-				}
-			});
-		}
-
-		private function getItemIdx(combo:ComboBox, data:String):int {
-			var idx:int = 0;
-			for (var i:int = 0; i < combo.dataProvider.length; ++i) {
-				if (combo.dataProvider[i].data == data) {
-					idx = i;
-					break;
-				}
-			}
-			return idx;
-		}
-
-		private function fillDeviceList(list:Array, combo:ComboBox, prop:String):int {
-			//Initialize and get eventually stored property
-			var dev:int = parseInt(getStoredProp(prop));
-
-			var items:ArrayCollection = new ArrayCollection();
-			//Get all available devices
-			var foundStoredDev:int = -1;
-			for (var i:int = 0; i < list.length; ++i) {
-				items.addItem({label: list[i], data: i});
-				if (i == dev) {
-					foundStoredDev = i;
-				}
-			}
-			combo.dataProvider = items;
-			return foundStoredDev;
+		private function debug(str:String):void {
+			ExternalInterface.call("console.log", str);
 		}
 
 		private function camAvail():Boolean {
@@ -158,101 +88,41 @@
 
 		private function appInit():void {
 			video = new OmVideo(videoDisplay, codec, protocol + "://" + host + ":" + port + "/" + app);
-			var modItems:ArrayCollection = new ArrayCollection();
-			if (camAvail() && micAvail()) {
-				modItems.addItem({label: getLabel(448), data: MODE_AV});
-			}
-			if (camAvail()) {
-				var cameras:Array = Camera.names;
-				var foundedCam:int = fillDeviceList(cameras, cams, "cam");
-				selectListItem(cams, foundedCam);
-				modItems.addItem({label: getLabel(450), data: MODE_V});
-			}
-			if (micAvail()) {
-				var micros:Array = Microphone.names;
-				var foundedMic:int = fillDeviceList(micros, mics, "mic");
-				selectListItem(mics, foundedMic);
-				modItems.addItem({label: getLabel(449), data: MODE_A});
-			}
-			modItems.addItem({label: getLabel(451), data: MODE_N});
-			modes.dataProvider = modItems;
-
-			var avIdx:int = getItemIdx(modes, getStoredProp("avstored"));
-			debug("selected avIdx::" + avIdx);
-			selectListItem(modes, avIdx);
 
 			var tla:Object = FlexGlobals.topLevelApplication;
-			var resolutions:Array = JSON.parse(tla.parameters['resolutions']) as Array;
-			var resItems:ArrayCollection = new ArrayCollection();
-			var idx:int = 0;
-			var storedWidth:int = parseInt(getStoredProp("width"));
-			var storedHeight:int = parseInt(getStoredProp("height"));
-			for (var i:int = 0; i < resolutions.length; ++i) {
-				var r:Object = resolutions[i];
-				resItems.addItem({label: r.width + 'x' + r.height + ' [' + r.label + ']', width: r.width, height: r.height});
-				if (!isNaN(storedWidth) && storedWidth > 0 && !isNaN(storedHeight) && storedHeight > 0) {
-					if (r.width == storedWidth && r.height == storedHeight) {
-						idx = i;
-					}
-				} else if (r.default) {
-					idx = i;
-				}
-			}
-			ress.dataProvider = resItems;
-			selectListItem(ress, idx);
-			var resI:Object = ress.dataProvider.getItemAt(idx > -1 ? idx : 0);
-			setResolution(resI.width, resI.height, false);
-			setMode(modes.dataProvider.getItemAt(avIdx < modes.dataProvider.length ? avIdx : 0).data);
-
-			remember.selected = true == getStoredProp("savecamdata");
-		}
-
-		public function getLabel(id:int):String {
-			return labels.hasOwnProperty("" + id) ? labels[id] : (debugEnabled ? "[Missing " + id + "]" : "");
-		}
-
-		private function setMode(mode:String):void {
-			var camVisible:Boolean = true;
-			var micVisible:Boolean = true;
-			var textVisible:Boolean = false;
-			switch (mode) {
-				case MODE_AV:
-					break;
-				case MODE_A:
-					camVisible = false;
-					break;
-				case MODE_V:
-					micVisible = false;
-					break;
-				case MODE_N:
-					camVisible = false;
-					micVisible = false;
-					textVisible = true;
-					break;
-				default:
-					debug("no valid device Setup chosen");
-					break;
-			}
-			camGroup.visible = camVisible;
-			micGroup.visible = micVisible;
-			noAv.visible = textVisible;
-			startTest.visible = !textVisible;
-			videoGroup.visible = !textVisible;
-			videoScroller.visible = camVisible;
-			playGroup.visible = !textVisible;
-			resGroup.visible = interview ? false : camVisible;
-			attachCamera();
-		}
-
-		private function modeChanged(e:Event):void {
-			setMode(e.target.selectedItem.data);
+			ExternalInterface.addCallback("getDevices", function ():Object {
+				return {
+					cams: Camera.names
+					, mics: Microphone.names
+				};
+			});
+			ExternalInterface.addCallback("camChanged", function (val:int):void {
+				selectedCam = val;
+				camChanged(null);
+			});
+			ExternalInterface.addCallback("micChanged", function (val:int):void {
+				selectedMic = val;
+				camChanged(null);
+			});
+			ExternalInterface.addCallback("resChanged", function (width:int, height:int):void {
+				setResolution(width, height, true);
+			});
+			ExternalInterface.addCallback("close", function ():void {
+				video.reset();
+			});
+			ExternalInterface.addCallback("init", function (camIdx:int, micIdx:int, width:int, height:int):void {
+				selectedCam = camIdx;
+				selectedMic = micIdx;
+				setResolution(width, height, true);
+			});
+			ExternalInterface.call("VideoSettings.initSwf");
 		}
 
 		private function getMic():Microphone {
 			debug("Entering getMic ...");
 			var _micro:Microphone = null;
-			if (micGroup.visible) {
-				_micro = echoPath == 0 ? Microphone.getMicrophone(mics.selectedItem.data) : Microphone.getEnhancedMicrophone(mics.selectedItem.data);
+			if (selectedMic > -1) {
+				_micro = echoPath == 0 ? Microphone.getMicrophone(selectedMic) : Microphone.getEnhancedMicrophone(selectedMic);
 
 				if (_micro != null && echoPath == 256) {
 					var options:MicrophoneEnhancedOptions = new MicrophoneEnhancedOptions();
@@ -275,31 +145,31 @@
 					debug("canvas.echoSuppression: " + echoSuppression);
 					_micro.setUseEchoSuppression(echoSuppression);
 				}
+				debug("... getMic DONE" + _micro);
 			}
-			debug("... getMic DONE" + _micro);
 			return _micro;
 		}
 
 		private function getCam():Camera {
 			debug("Entering getCam ...");
-			if (!videoScroller.visible) {
-				return null;
-			}
-			var _camera:Camera = Camera.getCamera(cams.selectedItem.data);
-			if (_camera != null && !_camera.muted) {
-				//FIXME need to be unified
-				if (interview) {
-					//we need a fixed frame rate for the videos to merge them later on
-					_camera.setMode(video.width, video.height, 24);
-					debug("IS INTERVIEW ");
-					_camera.setQuality(0, 98);
-				} else {
-					_camera.setMode(video.width, video.height, FPS);
-					debug("IS NO INTERVIEW ");
-					_camera.setQuality(bandwidth, quality);
+			var _camera:Camera = null;
+			if (selectedCam > -1) {
+				_camera = Camera.getCamera("" + selectedCam);
+				if (_camera != null && !_camera.muted) {
+					//FIXME need to be unified
+					if (interview) {
+						//we need a fixed frame rate for the videos to merge them later on
+						_camera.setMode(video.width, video.height, 24);
+						debug("IS INTERVIEW ");
+						_camera.setQuality(0, 98);
+					} else {
+						_camera.setMode(video.width, video.height, FPS);
+						debug("IS NO INTERVIEW ");
+						_camera.setQuality(bandwidth, quality);
+					}
 				}
+				debug("... getCam DONE " + _camera);
 			}
-			debug("... getCam DONE " + _camera);
 			return _camera;
 		}
 
@@ -307,7 +177,7 @@
 			if (!camAvail()) {
 				return;
 			}
-			debug("Camera selected:: " + cams.selectedItem.data);
+			debug("Camera selected:: " + selectedCam);
 			var cam:Camera = getCam();
 			debug("Camera selected:: " + cam);
 			if (cam != null) {
@@ -316,11 +186,14 @@
 					video.attachCamera(cam);
 					cam.addEventListener(StatusEvent.STATUS, function (event:StatusEvent):void {
 						debug("cameraStatusHandler! " + event);
-						cam.removeEventListener(StatusEvent.STATUS, arguments.callee);
-						if (cam.muted) {
-							debug("Unable to connect to active camera.");
-						} else {
-							_attachCamera(cam);
+						//cam.removeEventListener(StatusEvent.STATUS, arguments.callee);
+						switch (event.code) {
+							case 'Camera.Muted':
+								debug("Unable to connect to active camera.");
+								break;
+							case 'Camera.Unmuted':
+								_attachCamera(getCam());
+								break;
 						}
 					});
 				} else {
@@ -345,7 +218,7 @@
 						});
 					}
 				}
- 			}
+			}
 		}
 
 		private function _attachCamera(cam:Camera):void {
@@ -368,141 +241,57 @@
 				debug("onselect WxH :: " + width + "x" + height);
 
 				video.resize(width, height);
-				videoScroller.width = Math.min(width, RIGHT_WIDTH);
-				videoScroller.height = Math.min(height, 200);
-				var newWidth:int = Math.max(APP_WIDTH, APP_WIDTH + videoScroller.width - RIGHT_WIDTH);
-				var newHeight:int = Math.max(500, 500 + videoScroller.height - 180);
-
-				var yPos:int = (startTest as DisplayObject).localToGlobal(new Point()).y;
-				debug("GLOBAL Y:: " + yPos);
-				playGroup.y = Math.max(yPos, videoScroller.height);
-				setDimensions(newWidth, newHeight);
+
 				if (attach) {
 					attachCamera();
 				}
 			}
 		}
 
-		private function resChanged(e:Event):void {
-			setResolution(e.target.selectedItem.width, e.target.selectedItem.height, true);
-		}
-
 		private function camChanged(e:Event):void {
 			attachCamera();
 		}
 
-		private function startConf(e:Event):void {
-			store();
-		}
-
 		private function playTestRecording():void {
 			video.play(recName);
 		}
 
 		private function startTestRecording():void {
-			if (!noAv.visible) {
-				startTest.enabled = false;
-				play.enabled = false;
-				var counter:int = 5;
-				timerText.visible = true;
-				timerText.text = "5 sec";
-				var recTimer:Timer = new Timer(1000, counter);
-				var t:Date = new Date();
-				recName = "TEST_SETUP_" + t.getTime();
-				var mic:Microphone = getMic();
-				video.record(recName, getCam(), mic, function ():void {
-					mic.addEventListener(ActivityEvent.ACTIVITY, micActivityHandler);
-					//mic.onA
-					var micTimer:Timer = new Timer(100, 0);
-					micTimer.addEventListener(TimerEvent.TIMER, function (event:TimerEvent):void {
-						fill.width =  mic.activityLevel * RIGHT_WIDTH / 100;
-						trace("activity: " + mic.activityLevel);
-					});
-					recTimer.addEventListener(TimerEvent.TIMER, function (event:TimerEvent):void {
-						timerText.text = --counter + " sec";
-						if (counter == 0) {
-							timerText.visible = false;
-							startTest.enabled = true;
-							play.enabled = true;
-							playTestRecording();
-							micTimer.stop();
-							mic.removeEventListener(ActivityEvent.ACTIVITY, micActivityHandler);
-						}
-					});
-					recTimer.start();
-					micTimer.start();
+			var counter:int = 5;
+			timerText.visible = true;
+			timerText.text = "5 sec";
+			var recTimer:Timer = new Timer(1000, counter);
+			var t:Date = new Date();
+			recName = "TEST_SETUP_" + t.getTime();
+			var mic:Microphone = getMic();
+			video.record(recName, getCam(), mic, function ():void {
+				mic.addEventListener(ActivityEvent.ACTIVITY, micActivityHandler);
+				//mic.onA
+				var micTimer:Timer = new Timer(100, 0);
+				micTimer.addEventListener(TimerEvent.TIMER, function (event:TimerEvent):void {
+					//FIXME TODO fill.width = mic.activityLevel * RIGHT_WIDTH / 100;
+					debug("activity: " + mic.activityLevel);
 				});
-			}
+				recTimer.addEventListener(TimerEvent.TIMER, function (event:TimerEvent):void {
+					timerText.text = --counter + " sec";
+					if (counter == 0) {
+						timerText.visible = false;
+						playTestRecording();
+						micTimer.stop();
+						mic.removeEventListener(ActivityEvent.ACTIVITY, micActivityHandler);
+					}
+				});
+				recTimer.start();
+				micTimer.start();
+			});
 		}
 
-		function micActivityHandler(event:ActivityEvent):void{
+		private function micActivityHandler(event:ActivityEvent):void {
 			//Do nothing, it just need to be there.
 		}
-	]]>
-	</fx:Script>
+	]]></fx:Script>
 
-	<s:Group id="mainSetupGroup" width="{APP_WIDTH}">
-		<s:layout>
-			<s:VerticalLayout paddingLeft="5" paddingRight="5"/>
-		</s:layout>
-		<mx:Text width="100%" fontWeight="bold" text="{getLabel(758)}"/>
-		<s:HGroup>
-			<s:VGroup width="{LEFT_WIDTH}">
-				<mx:Text text="{getLabel(447)}"/>
-				<mx:ComboBox id="modes" width="{LEFT_WIDTH}" change="modeChanged(event)"/>
-				<s:VGroup id="av">
-					<s:VGroup id="camGroup">
-						<mx:Text text="{getLabel(52)}"/>
-						<mx:ComboBox id="cams" width="{LEFT_WIDTH}" change="camChanged(event)"/>
-					</s:VGroup>
-					<s:VGroup id="micGroup">
-						<mx:Text text="{getLabel(53)}"/>
-						<mx:ComboBox id="mics" width="{LEFT_WIDTH}"/>
-					</s:VGroup>
-					<s:VGroup id="resGroup">
-						<s:Group><mx:Text text="{getLabel(1429)}"/><mx:Image x="260" source="../images/error.png" toolTip="{getLabel(1430)}"/></s:Group>
-						<mx:ComboBox id="ress" width="{LEFT_WIDTH}" change="resChanged(event)"/>
-					</s:VGroup>
-					<s:Group width="100%">
-						<s:layout><s:HorizontalLayout horizontalAlign="right"/></s:layout>
-						<s:Button id="startTest" label="{getLabel(775)}" click="startTestRecording()"/><!--FIXME should be disabled until stream is attached-->
-					</s:Group>
-				</s:VGroup>
-				<mx:Text text="{getLabel(452)}" id="noAv" visible="false"/>
-			</s:VGroup>
-			<s:Group id="videoGroup">
-				<s:Scroller id="videoScroller">
-					<s:Group id="videoScrollGroup">
-						<mx:UIComponent id="videoDisplay" width="0" height="0" />
-					</s:Group>
-				</s:Scroller>
-				<s:Label id="timerText" height="20" width="45" x="{videoGroup.width - 60}" y="5" paddingLeft="5" paddingTop="5"
-						visible="false" backgroundColor="0xf5f5f5" fontWeight="bold"><s:text></s:text></s:Label>
-				<s:VGroup id="playGroup">
-					<s:Group>
-						<s:Graphic x="0" z="1">
-							<s:Rect width="{RIGHT_WIDTH}" height="20">
-								<s:fill><s:SolidColor color="white"/></s:fill>
-								<s:stroke><s:SolidColorStroke color="black" weight="2"/></s:stroke>
-							</s:Rect>
-						</s:Graphic>
-						<mx:Image id="fill" source="../images/level_meter.png" x="2" y="1" z="3" width="0"/>
-						<mx:Text text="{getLabel(767)}" x="0" z="5"/>
-					</s:Group>
-					<s:Group width="100%">
-						<s:layout><s:HorizontalLayout horizontalAlign="right"/></s:layout>
-						<s:Button id="play" label="{getLabel(764)}" enabled="false" click="playTestRecording()"/>
-					</s:Group>
-				</s:VGroup>
-			</s:Group>
-		</s:HGroup>
-		<s:HGroup><mx:Image source="../images/info.png"/><mx:Text text="{getLabel(765)}" width="{APP_WIDTH - 70}"/></s:HGroup>
-		<s:Group width="100%">
-			<s:layout><s:HorizontalLayout horizontalAlign="right"/></s:layout>
-			<s:Button id="cancel" label="{getLabel(918)}"/>
-			<s:Button id="start" label="{getLabel(interview ? 54 : 761)}" click="startConf(event)"/>
-		</s:Group>
-		<s:CheckBox id="remember" label="{getLabel(762)}" />
-	</s:Group>
-	<s:TextArea id="traceArea" y="460" width="400" height="400" text="{debugStr}"/>
+	<mx:UIComponent id="videoDisplay" width="0" height="0" />
+	<s:Label id="timerText" height="20" width="45" x="20" y="5" paddingLeft="5" paddingTop="5"
+			 visible="false" backgroundColor="0xf5f5f5" fontWeight="bold"><s:text></s:text></s:Label>
 </s:Application>

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java?rev=1790877&r1=1790876&r2=1790877&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java Mon Apr 10 16:58:56 2017
@@ -76,6 +76,7 @@ import org.apache.wicket.markup.head.Jav
 import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
 import org.apache.wicket.markup.head.PriorityHeaderItem;
 import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.protocol.http.ClientProperties;
 import org.apache.wicket.protocol.ws.api.event.WebSocketPushPayload;
 import org.apache.wicket.request.resource.JavaScriptResourceReference;
 import org.apache.wicket.request.resource.ResourceReference;
@@ -121,7 +122,8 @@ public class RoomPanel extends BasePanel
 				URL url = new URL(WebSession.get().getExtendedProperties().getCodebase());
 				String path = url.getPath();
 				path = path.substring(1, path.indexOf('/', 2) + 1);
-				target.appendJavaScript(String.format("initVideo(%s);", new JSONObject()
+				ClientProperties cp = WebSession.get().getClientInfo().getProperties();
+				target.appendJavaScript(String.format("VideoSettings.init(%s);", new JSONObject()
 						.put("uid", getClient().getUid())
 						.put("audioOnly", r.isAudioOnly())
 						.put("SID", WebSession.getSid())
@@ -130,8 +132,7 @@ public class RoomPanel extends BasePanel
 						.put("host", url.getHost())
 						//.put("port", cfgDao.getConfValue(CONFIG_FLASH_PORT, String.class, ""))
 						.put("app", path + r.getId())
-						.put("labels", SwfPanel.getStringLabels("448", "449", "450", "451", "758", "447", "52", "53"
-								, "1429", "1430", "775", "452", "767", "764", "765", "918", "54", "761", "762"))
+						.put("wmode", cp.isBrowserInternetExplorer() && cp.getBrowserVersionMajor() == 11 ? "opaque" : "direct")
 						.toString()
 						));
 			} catch (NullPointerException|MalformedURLException e) {

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js?rev=1790877&r1=1790876&r2=1790877&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js Mon Apr 10 16:58:56 2017
@@ -16,45 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-function initVideo(_options) {
-	return; //commented until video is implemented
-	var options = $.extend({bgcolor: "#ffffff"
-		, resolutions: JSON.stringify([{label: "4:3 (~6 KByte/sec)", width: 40, height: 30}
-			, {label: "4:3 (~12 KByte/sec)", width: 80, height: 60}
-			, {label: "4:3 (~20 KByte/sec)", width: 120, height: 90, "default": true}
-			, {label: "QQVGA 4:3 (~36 KByte/sec)", width: 160, height: 120}
-			, {label: "4:3 (~40 KByte/sec)", width: 240, height: 180}
-			, {label: "HVGA 4:3 (~56 KByte/sec)", width: 320, height: 240}
-			, {label: "4:3  (~60 KByte/sec)", width: 480, height: 360}
-			, {label: "4:3 (~68 KByte/sec)", width: 640, height: 480}
-			, {label: "XGA 4:3", width: 1024, height: 768}
-			, {label: "16:9", width: 256, height: 150}
-			, {label: "WQVGA 9:5", width: 432, height: 240}
-			, {label: "pseudo 16:9", width: 480, height: 234}
-			, {label: "16:9", width: 512, height: 300}
-			, {label: "nHD 16:9", width: 640, height: 360}
-			, {label: "16:9", width: 1024, height: 600}])
-		}, _options);
+function initVideo(el, id, options) {
 	var type = 'application/x-shockwave-flash';
 	var src = 'public/main.swf?cache' + new Date().getTime();
-	var r = $('<div class="room video">').attr("id", "video" + options.uid);
-	var o = $('<object>').attr('type', type).attr('data', src).attr('width', 640).attr('height', 480);
+	var o = $('<object>').attr('id', id).attr('type', type).attr('data', src).attr('width', options.width).attr('height', options.height);
 	o.append($('<param>').attr('name', 'quality').attr('value', 'best'))
-		.append($('<param>').attr('name', 'wmode').attr('value', 'transparent'))
+		.append($('<param>').attr('name', 'wmode').attr('value', options.wmode))
 		.append($('<param>').attr('name', 'allowscriptaccess').attr('value', 'sameDomain'))
 		.append($('<param>').attr('name', 'allowfullscreen').attr('value', 'false'))
 		.append($('<param>').attr('name', 'flashvars').attr('value', $.param(options)));
-	$('#roomMenu').parent().append(r.append(o));
-	/*
-			.attr('wmode', 'window').attr('allowfullscreen', true)
-			.attr('width', options.width).attr('height', options.height)
-			.attr('id', 'lzapp').attr('name', 'lzapp')
-			.attr('flashvars', escape($.param(options)))
-			.attr('swliveconnect', true).attr('align', 'middle')
-			.attr('allowscriptaccess', 'sameDomain').attr('type', 'application/x-shockwave-flash')
-			.attr('pluginspage', 'http://www.macromedia.com/go/getflashplayer')
-	*/
-	r.dialog({dialogClass: "video"});
+	el.append(o);
+	return o;
 }
 
 function setRoomSizes() {
@@ -105,7 +77,6 @@ function roomLoad() {
 			setRoomSizes();
 		}
 	});
-	VideoSettings.init();
 	Wicket.Event.subscribe("/websocket/closed", roomClosed);
 }
 function roomUnload() {
@@ -122,10 +93,25 @@ function startPrivateChat(el) {
 	$('#chatMessage .wysiwyg-editor').click();
 }
 var VideoSettings = (function() {
-	var self = {}, vs, lm;
-	function _init() {
+	var self = {}, vs, lm, swf, s, cam, mic, res, inited = false;
+	function _load() {
+		s = {};
+		try {
+			s = JSON.parse(localStorage.getItem('openmeetings')) || s;
+		} catch (e) {}
+		if (!s.video) {
+			s.video = {};
+		}
+	}
+	function _save() {
+		localStorage.setItem('openmeetings', JSON.stringify(s));
+	}
+	function _init(options) {
 		vs = $('#video-settings');
 		lm = vs.find('.level-meter');
+		cam = vs.find('select.cam');
+		mic = vs.find('select.mic');
+		res = vs.find('select.cam-resolution');
 		vs.dialog({
 			classes: {
 				'ui-dialog': 'ui-corner-all video'
@@ -139,6 +125,7 @@ var VideoSettings = (function() {
 						primary: "ui-icon-disk"
 					}
 					, click: function() {
+						_save();
 						vs.dialog("close");
 					}
 				}
@@ -151,7 +138,60 @@ var VideoSettings = (function() {
 			]
 		});
 		lm.progressbar({ value: 0 });
+		options.width = 300;
+		options.height = 200;
+		swf = initVideo(vs.find('.vid-block .video-conainer'), 'video-settings-swf', options)[0];
+		vs.find('input, button').prop('disabled', true);
 		vs.find('button').button();
+		_load();
+	}
+	function _readValues() {
+		s.video.cam = cam.val();
+		s.video.mic = mic.val();
+		var o = res.find('option:selected').data();
+		s.video.width = o.width;
+		s.video.height = o.height;
+		$(swf).attr('width', Math.max(300, s.video.width)).attr('height', Math.max(200, s.video.height));
+	}
+	function _initSwf() {
+		if (!inited) {
+			var obj = swf.getDevices();
+			for (var i = 0; i < obj.cams.length; ++i) {
+				var o = $('<option></option>').attr('value', i).text(obj.cams[i]);
+				if (i == s.video.cam) {
+					o.prop('selected', true);
+				}
+				cam.append(o);
+			}
+			cam.prop('disabled', false).change(function() {
+				_readValues();
+				swf.camChanged(s.video.cam);
+			});
+			for (var i = 0; i < obj.mics.length; ++i) {
+				var o = $('<option></option>').attr('value', i).text(obj.mics[i]);
+				if (i == s.video.mic) {
+					o.prop('selected', true);
+				}
+				mic.append(o);
+			}
+			mic.prop('disabled', false).change(function() {
+				_readValues();
+				swf.micChanged(s.video.mic);
+			});
+			res.change(function() {
+				_readValues();
+				swf.resChanged(s.video.width, s.video.height);
+			});
+			res.find('option').each(function(idx) {
+				var o = $(this).data();
+				if (o.width == s.video.width && o.height == s.video.height) {
+					$(this).prop('selected', true);
+					return false;
+				}
+			});
+		}
+		_readValues();
+		swf.init(s.video.cam, s.video.mic, s.video.width, s.video.height);
 	}
 	function _open(interview) {
 		var rr = vs.find('.cam-resolution').parent('.sett-row');
@@ -164,6 +204,7 @@ var VideoSettings = (function() {
 	}
 	return {
 		init: _init
+		, initSwf: _initSwf
 		, open: _open
 		, close: function() { vs.dialog('close'); }
 	};

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html?rev=1790877&r1=1790876&r2=1790877&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html Mon Apr 10 16:58:56 2017
@@ -87,16 +87,15 @@
 						</select>
 					</div>
 				</div>
-				<div class="sett-row">
-					<div class="align-right"><button><wicket:message key="775"/></button></div>
+				<div class="sett-row right">
+					<div><button><wicket:message key="775"/></button></div>
 				</div>
 			</div>
 			<div class="vid-block">
-				<div>
-				</div>
+				<div class="video-conainer"></div>
 				<div class="level-meter"></div>
-				<div class="sett-row">
-					<div class="align-right"><button><wicket:message key="764"/></button></div>
+				<div class="sett-row right">
+					<div><button><wicket:message key="764"/></button></div>
 				</div>
 			</div>
 		</div>

Modified: openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/room.css
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/room.css?rev=1790877&r1=1790876&r2=1790877&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/room.css (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/room.css Mon Apr 10 16:58:56 2017
@@ -390,6 +390,13 @@
 .ui-dialog.video .sett-row {
 	padding-top: 10px;
 }
+.ui-dialog.video .sett-row.right {
+	text-align: right;
+}
+.ui-dialog.video .vid-block .video-conainer {
+	overflow: auto;
+	max-height: 300px;
+}
 .ui-dialog.video .sett-row select, .ui-dialog.video .level-meter {
 	width: 250px;
 }