Author: solomax
Date: Wed Jan 11 09:15:37 2017
New Revision: 1778259

URL: http://svn.apache.org/viewvc?rev=1778259&view=rev
Log:
[OPENMEETINGS-1376] AV settings are being constructed on server

Modified:
    
openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
    
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/hibernate/hibRtmpConnection.lzx
    
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/mainMethods.lzx
    
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/commonVideoViewContentSWF10.lzx
    
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/main.lzx
    
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/flexibleConferenceRoom/roomSidebar/baseRoomSidebar.lzx
    
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/video/editRecordStreamSWF10.lzx
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ClientIcon.java
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/CamActivityIcon.java
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/MicActivityIcon.java
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/RoomActivityIcon.java
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/public/config.xml
    
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ClientIcon.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/RefreshIcon.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/CamActivityIcon.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/MicActivityIcon.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/RoomActivityIcon.java
    openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/room.css

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
 Wed Jan 11 09:15:37 2017
@@ -990,39 +990,26 @@ public class ScopeApplicationAdapter ext
        }
 
        /**
-        * this must be set _after_ the Video/Audio-Settings have been chosen 
(see
-        * editrecordstream.lzx) but _before_ anything else happens, it cannot 
be
-        * applied _after_ the stream has started! 
-        * avsettings can be: 
-        *              av - video and audio
-        *              a - audio only
-        *              v - video only
-        *              n - no a/v only static image
-        * furthermore
+        * This method is used to set/update broadCastID of current client
         * 
-        * @param avsettings
-        * @param vWidth
-        * @param vHeight
+        * @param updateBroadcastId boolean flag 
         * 
         * @return BroadcastId in case of no errors, -1 otherwise
         */
-       public long setUserAVSettings(String avsettings, Integer vWidth, 
Integer vHeight, boolean updateBroadcastId) {
+       public long setUserAVSettings(boolean updateBroadcastId) {
                try {
                        String streamid = 
Red5.getConnectionLocal().getClient().getId();
-                       log.debug("-----------  setUserAVSettings {} {}", 
streamid, avsettings);
-                       Client currentClient = 
sessionManager.getClientByStreamId(streamid, null);
-                       if (currentClient == null) {
+                       log.debug("-----------  setUserAVSettings {}", 
streamid);
+                       Client rcl = 
sessionManager.getClientByStreamId(streamid, null);
+                       if (rcl == null) {
                                log.warn("Failed to find appropriate clients");
                                return -1;
                        }
-                       currentClient.setAvsettings(avsettings);
-                       currentClient.setVWidth(vWidth);
-                       currentClient.setVHeight(vHeight);
                        if (updateBroadcastId) {
-                               currentClient.setBroadCastID(nextBroadCastId());
+                               rcl.setBroadCastID(nextBroadCastId());
+                               
sessionManager.updateAVClientByStreamId(streamid, rcl, null);
                        }
-                       sessionManager.updateAVClientByStreamId(streamid, 
currentClient, null);
-                       return currentClient.getBroadCastID();
+                       return rcl.getBroadCastID();
                } catch (Exception err) {
                        log.error("[setUserAVSettings]", err);
                }

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/hibernate/hibRtmpConnection.lzx
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/hibernate/hibRtmpConnection.lzx?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/hibernate/hibRtmpConnection.lzx
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/hibernate/hibRtmpConnection.lzx
 Wed Jan 11 09:15:37 2017
@@ -561,7 +561,7 @@
                        canvas.commonVideoViewContent.closeScreenSharing(value);
                } else {
                        //free the VideoContainer
-                       
canvas.commonVideoViewContent.closeStreamclient(value.publicSID);
+                       
canvas.commonVideoViewContent.removeVideoByUser(value.publicSID);
                }
        </method>
 
@@ -854,6 +854,7 @@
                        } else {
                                
canvas.commonVideoViewContent.removeVideoByUser(canvas.publicSID);
                        }
+               } else {
                }
        ]]>
        </method>

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/mainMethods.lzx
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/mainMethods.lzx?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/mainMethods.lzx
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/mainMethods.lzx
 Wed Jan 11 09:15:37 2017
@@ -7,16 +7,16 @@
   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.
-  
+
 -->
 
 <!-- methods for main.lzx -->
@@ -35,7 +35,7 @@
 
        <attribute name="colorArray" value="null" />
        <attribute name="errorLoader" />
-       
+
        <method name="getColorForUser">
                <![CDATA[
                        var colorArray = 
[0x92E8A4,0xC2F1FF,0xFFFCAE,0xE8C792,0xFF8073,
@@ -43,7 +43,7 @@
                        return colorArray[Math.round(Math.random()*10)];
                ]]>
        </method>
-       
+
        <method name="remoteLogWrite" args="message">
                if ($debug) Debug.warn("remoteLogWrite:: ", message);
                if (!errorLoader) {
@@ -56,7 +56,7 @@
                vars.message = message;
                errorLoader.load(vars);
        </method>
-       
+
        <method name="getHttpHost">
        <![CDATA[
                if (canvas.httphostlocal != null && canvas.httphostlocal.length 
> 0) {
@@ -65,13 +65,13 @@
                return canvas.rtmphostlocal;
        ]]>
        </method>
-       
+
        <method name="getUrl">
        <![CDATA[
                return canvas.protocol + '://' + getHttpHost() + ':' + 
canvas.red5httpport + canvas.httpRootKey;
        ]]>
        </method>
-       
+
        <method name="getServicesUrl">
        <![CDATA[
                return getUrl() + 'services/';
@@ -82,87 +82,92 @@
        <![CDATA[
                canvas.mediaerrortimeout = 30000;
                canvas.medialoadtimeout = 30000;
-               
+
                if($debug) Debug.write("main.lzx/config.xml ondata",this);
-               
+
                //Set Config-values by public/config.xml, see comments on 
public/config.xml
                if (!canvas.isCluster) {
                        
this.setAttribute('rtmphostlocal',canvas.myConfigSet.getPointer().xpathQuery('config/rtmphostlocal/text()'));
                }
-               
this.setAttribute('rtmpport',Number(canvas.myConfigSet.getPointer().xpathQuery('config/rtmpport/text()')));
  
-               
this.setAttribute('rtmpsslport',Number(canvas.myConfigSet.getPointer().xpathQuery('config/rtmpsslport/text()')));
 
-               
+               
this.setAttribute('rtmpport',Number(canvas.myConfigSet.getPointer().xpathQuery('config/rtmpport/text()')));
+               
this.setAttribute('rtmpsslport',Number(canvas.myConfigSet.getPointer().xpathQuery('config/rtmpsslport/text()')));
+
                var userSSLString = 
canvas.myConfigSet.getPointer().xpathQuery('config/useSSL/text()');
                if ($debug) Debug.write("userSSLString",userSSLString)
                if (userSSLString == "yes") {
                        this.setAttribute('useSSL',true);
                }
-               
+
                
this.setAttribute('red5httpport',Number(canvas.myConfigSet.getPointer().xpathQuery('config/red5httpport/text()')));
-               
+
                
this.setAttribute('loudnessAcitviation',canvas.myConfigSet.getPointer().xpathQuery('config/loudnessAcitviation/text()'));
                
this.setAttribute('webAppRootKey',canvas.myConfigSet.getPointer().xpathQuery('config/webAppRootKey/text()'));
                
this.setAttribute('showWindowEffect',canvas.myConfigSet.getPointer().xpathQuery('config/showWindowEffect/text()'));
-               
+
                //Audio-Video-Settings
                
this.setAttribute('loudnessAcitviation',canvas.myConfigSet.getPointer().xpathQuery('config/loudnessAcitviation/text()'));
                
this.setAttribute('codecType',canvas.myConfigSet.getPointer().xpathQuery('config/codecType/text()'));
-               
this.setAttribute('framesPerSecond',Number(canvas.myConfigSet.getPointer().xpathQuery('config/framesPerSecond/text()')));
  
-               
this.setAttribute('bandwidthNeededNormal',Number(canvas.myConfigSet.getPointer().xpathQuery('config/bandwidthNeededNormal/text()')));
  
-               
this.setAttribute('bandwidthNeededBest',Number(canvas.myConfigSet.getPointer().xpathQuery('config/bandwidthNeededBest/text()')));
  
-               
this.setAttribute('camQualityNormal',Number(canvas.myConfigSet.getPointer().xpathQuery('config/camQualityNormal/text()')));
  
+               
this.setAttribute('framesPerSecond',Number(canvas.myConfigSet.getPointer().xpathQuery('config/framesPerSecond/text()')));
+               
this.setAttribute('bandwidthNeededNormal',Number(canvas.myConfigSet.getPointer().xpathQuery('config/bandwidthNeededNormal/text()')));
+               
this.setAttribute('bandwidthNeededBest',Number(canvas.myConfigSet.getPointer().xpathQuery('config/bandwidthNeededBest/text()')));
+               
this.setAttribute('camQualityNormal',Number(canvas.myConfigSet.getPointer().xpathQuery('config/camQualityNormal/text()')));
                
this.setAttribute('camQualityBest',Number(canvas.myConfigSet.getPointer().xpathQuery('config/camQualityBest/text()')));
-               
this.setAttribute('microphoneRateBest',Number(canvas.myConfigSet.getPointer().xpathQuery('config/microphoneRateBest/text()')));
  
+               
this.setAttribute('microphoneRateBest',Number(canvas.myConfigSet.getPointer().xpathQuery('config/microphoneRateBest/text()')));
                
this.setAttribute('echoPath',Number(canvas.myConfigSet.getPointer().xpathQuery('config/echoPath/text()')));
-               
this.setAttribute('echoSuppression',canvas.myConfigSet.getPointer().xpathQuery('config/echoSuppression/text()'));
  
-               
-               
this.setAttribute('defaultWhiteboardWidth',Number(canvas.myConfigSet.getPointer().xpathQuery('config/defaultWhiteboardWidth/text()')));
  
-               
this.setAttribute('defaultWhiteboardHeight',Number(canvas.myConfigSet.getPointer().xpathQuery('config/defaultWhiteboardHeight/text()')));
  
-               
-               
+               
this.setAttribute('echoSuppression',canvas.myConfigSet.getPointer().xpathQuery('config/echoSuppression/text()'));
+
+               
this.setAttribute('defaultWhiteboardWidth',Number(canvas.myConfigSet.getPointer().xpathQuery('config/defaultWhiteboardWidth/text()')));
+               
this.setAttribute('defaultWhiteboardHeight',Number(canvas.myConfigSet.getPointer().xpathQuery('config/defaultWhiteboardHeight/text()')));
+
+
                
this.setAttribute('httpRootKey',canvas.myConfigSet.getPointer().xpathQuery('config/httpRootKey/text()'));
                
this.setAttribute('httphostlocal',canvas.myConfigSet.getPointer().xpathQuery('config/httphostlocal/text()'));
-               
this.setAttribute('protocol',canvas.myConfigSet.getPointer().xpathQuery('config/protocol/text()'));
  
+               
this.setAttribute('protocol',canvas.myConfigSet.getPointer().xpathQuery('config/protocol/text()'));
                
this.setAttribute('proxyType',canvas.myConfigSet.getPointer().xpathQuery('config/proxyType/text()'));
 
+               canvas.commonVideoViewContent.ensureAVsettings(
+                               
canvas.myConfigSet.getPointer().xpathQuery('config/availableCameraResolutions/resolution[@isDefault="true"]/@width')
+                               , 
canvas.myConfigSet.getPointer().xpathQuery('config/availableCameraResolutions/resolution[@isDefault="true"]/@height')
+                       );
+
                //set user color
                canvas.currentusercolor = canvas.getColorForUser();
 
                var _url = this.getDisplayObject().loaderInfo.url;
                if($debug) Debug.write("_url: ",_url);
                var cleanUrl = _url;
-               
+
                var hasParams = _url.indexOf("?");
                if (hasParams != -1) {
                        cleanUrl = _url.substr(0, hasParams);
                }
-               
+
                if ($debug) Debug.write("_url ",_url,cleanUrl);
                var doubleSlash = cleanUrl.indexOf("//");
                var isNotPort80 = cleanUrl.indexOf(":", doubleSlash+2);
                if ($debug) Debug.write("isNotPort80: 
",isNotPort80,doubleSlash);
                if (isNotPort80!=-1){
                        //Debug.write("isNotPort80: ",doubleSlash+2, 
_url.indexOf(":", doubleSlash+2)-doubleSlash-2);
-                       var server = cleanUrl.substr(doubleSlash+2, 
_url.indexOf(":", doubleSlash+2)-doubleSlash-2); 
+                       var server = cleanUrl.substr(doubleSlash+2, 
_url.indexOf(":", doubleSlash+2)-doubleSlash-2);
                } else {
-                       var server = cleanUrl.substr(doubleSlash+2, 
_url.indexOf("/", doubleSlash+2)-doubleSlash-2); 
+                       var server = cleanUrl.substr(doubleSlash+2, 
_url.indexOf("/", doubleSlash+2)-doubleSlash-2);
                }
-               
+
                if ($debug) Debug.write("this zielnr: ",this,server);
-               
+
                this.setAttribute('rtmphost',server);
-       
+
                if (this.rtmphostlocal.length==0){
                        this.setAttribute('rtmphostlocal',server);
                }
-               
+
                if ($debug) Debug.info("###################### -2 ");
-               
+
                var language = lz.Browser.getInitArg('language');
                if (language != undefined) {
                        canvas.language_id = Number(language);
                }
-       
+
                var wicketroomid = lz.Browser.getInitArg('wicketroomid');
                if (wicketroomid != undefined && !isNaN(wicketroomid)) {
                        canvas.setAttribute('wicketroomid', 
Number(wicketroomid));
@@ -206,7 +211,7 @@
                } else {
                        hib.userScope = canvas.wicketroomid;
                        var src = hib.getUrl();
-                       
+
                        canvas.thishib.setAttribute('src',src);
                        canvas.thishib.loaderVar = new lz.autoLoader(canvas);
                        canvas.thishib.loaderVar._src.setAttribute('text',src);
@@ -219,11 +224,11 @@
                //if($debug) Debug.write("main.lzx/getLabelName()",id);
                return getLabelTag(id);
        </method>
-       
+
        <!--
                exportFilePNG exportFileJPG exportFilePDF exportFileSVG 
exportFileTIF
         -->
-        
+
        <method name="doWhiteboardActionmenu" args="action">
                if (action == "exportFilePNG") {
                        
canvas._drawarea.confirmSaveAsImageTypeExport("image","png");
@@ -248,7 +253,7 @@
                }
                ExternalInterface.call("roomExit");
        </method>
-       
+
        <method name="setRoomValues" args="roomObj">
        <![CDATA[
                if ($debug) Debug.warn("setRoomValues ",roomObj);
@@ -261,7 +266,7 @@
                        canvas.isConference = roomObj.type == 'conference';
                        canvas.isInterview = roomObj.type == 'interview';
                        canvas.main_content.setAttribute('visible', true);
-               
+
                        if (roomObj.type == 'conference') {
                                new 
lz.flexibleConferenceRoom(canvas.main_content._content.inner, 
{roomobj:roomObj});
                        } else if (roomObj.type == 'restricted') {
@@ -274,7 +279,7 @@
        </method>
 
        <method name="parseLanugageObject" args="obj">
-       
+
                ////Debug.write('parseLanugageObject: ',obj);
                ////Debug.write('parseLanugageObject: ',obj.childNodes);
                <![CDATA[
@@ -293,17 +298,17 @@
                //Debug.write(t);
                ]]>
        </method>
-       
+
        <!---
-       @doc The function does compare the new moderator list with the old and 
prepares the list 
-               the removeModeratorList is used in the performance optimized 
user list of the restricted 
-               room type to re-render the list items only if really something 
has changed in any 
+       @doc The function does compare the new moderator list with the old and 
prepares the list
+               the removeModeratorList is used in the performance optimized 
user list of the restricted
+               room type to re-render the list items only if really something 
has changed in any
                of the user list items
         -->
        <method name="analyzeModerationList" args="newList">
        <![CDATA[
                canvas.removeModeratorList = new Array();
-               
+
                if (canvas.currentModeratorList != null) {
                        for (var i = 0; i < canvas.currentModeratorList.length; 
++i) {
                                canvas.currentModeratorList[i].found = false;
@@ -321,14 +326,14 @@
                                }
                        }
                }
-               
+
                if ($debug) Debug.write("removeModeratorList :: 
",canvas.removeModeratorList);
        ]]>
        </method>
-       
+
        <!---
                Updates the "ismoderator" flag
-               the setAttribute method will broadcast an event to all event 
listeners that 
+               the setAttribute method will broadcast an event to all event 
listeners that
                did subscribe using the "onismoderator" handler with reference 
to canvas !
         -->
        <method name="updateModerationFlag">
@@ -348,7 +353,7 @@
                                isCurrentModerator = true;
                        }
                }
-               
+
                // do always spread this event, we need to broadcast the 
"onismoderator" event
                // so that we can update the status of other users in the user 
list
                try {
@@ -359,7 +364,7 @@
                }
        ]]>
        </method>
-       
+
        <!---
                Checks if a certain publicSID is a moderator
         -->
@@ -374,9 +379,9 @@
                return false;
        ]]>
        </method>
-        
+
        <!---
-               Sets the flag for the isAllowedToGiveExclusiveAudio status and 
broadcasts it to the 
+               Sets the flag for the isAllowedToGiveExclusiveAudio status and 
broadcasts it to the
                SWF10 container
         -->
        <method name="setExclusiveAudioAllowStatus" args="roomClientObj">
@@ -388,22 +393,22 @@
                }
        ]]>
        </method>
-       
+
        <method name="setMuteStatus" args="roomClientObj">
        <![CDATA[
-               if ($debug) Debug.write("setMuteStatus changes ###### 
",roomClientObj.micMuted);
+               if ($debug) Debug.write("setMuteStatus changes ###### ", 
roomClientObj.micMuted);
                //Check for self status
                if (roomClientObj.publicSID == canvas.publicSID) {
                        canvas.setAttribute("micMuted",roomClientObj.micMuted);
                }
-               
-               canvas._videocontainer.updateMuteStatusVideoView(roomClientObj);
-               
+
+               
canvas.commonVideoViewContent.updateMuteStatusVideoView(roomClientObj);
+
                //Notify all Listeners for change of the item
                canvas.setAttribute("micMutedStatusChangedItem", roomClientObj);
        ]]>
        </method>
-       
+
        <method name="addFolderSequence" args="foldername">
        <![CDATA[
                this.uploadmoduleimgfolder = '/';
@@ -411,8 +416,8 @@
                
this.setAttribute('uploadmoduleimgfolder',this.uploadmoduleimgfolder);
        ]]>
        </method>
-               
-               
+
+
        <handler name="onmousewheeldelta" reference="lz.Keys" args="d">
        <![CDATA[
                var obj = getCurrentMouseWheelObject();
@@ -421,8 +426,8 @@
                        obj.step(-d);
                }
        ]]>
-       </handler>      
-       
+       </handler>
+
        <method name="reverseWordingsBySplit" args="str">
        <![CDATA[
                var words_arr = str.split( " " ); // an array of chars
@@ -434,23 +439,23 @@
                        }
                }
                return str;
-               
+
        ]]>
-       </method> 
-       
+       </method>
+
        <method name="reverseAll" args="str">
        <![CDATA[
                var words_arr = str.split( "" ); // an array of chars
                for ( var i = 0, str = ""; i < words_arr.length; i++ ) // 
reverse their order
                {
                        str += words_arr[ words_arr.length - i - 1 ];
-                       
+
                }
                return str;
-               
+
        ]]>
-       </method> 
-               
+       </method>
+
        <method name="reverseWords" args="str">
        <![CDATA[
                if ( str == "" || str == null ) return ""; // undefined
@@ -462,19 +467,19 @@
                return str;
        ]]>
        </method>
-               
+
        <method name="isLTR" args="c">
        <![CDATA[
                return ( c >= 48 && c <= 57 || c >= 65 && c <= 90 || c >= 97 && 
c <= 122 );
        ]]>
        </method>
-       
+
        <method name="isHEB" args="c">
        <![CDATA[
                return ( c >= 224 && c <= 250 );
        ]]>
-       </method>       
-       
+       </method>
+
        <method name="setTextAlign" args="obj,type">
                switch ( type ) {
                        case "left" :
@@ -487,8 +492,8 @@
                                obj.setX( this.parent.width - 
this.getTextWidth() );
                        break;
                }
-       </method>  
-       
+       </method>
+
        <method name="getUserData">
                var so:SharedObject = SharedObject.getLocal('userdata');
                var g = so.data;
@@ -498,7 +503,7 @@
                }
                return g;
        </method>
-       
+
        <method name="setUserData" args="g">
                var so:SharedObject = SharedObject.getLocal('userdata');
                for (var i in g) {
@@ -507,7 +512,7 @@
                }
                so.flush();
        </method>
-       
+
        <method name="getThemeImage" args="tName">
                //if ($debug) Debug.write("load Image by Name: ",tName);
                var tPath = 
canvas.mainTheme.getPointer().xpathQuery("theme/resource[@name='"+tName+"']/@src");
@@ -515,11 +520,11 @@
                if (tPath == null) {
                        if ($debug) Debug.warn("getThemeImage - No Image found 
for config: ",tName);
                } else {
-                       tPath = canvas.getUrl() + 'public/' + tPath; 
+                       tPath = canvas.getUrl() + 'public/' + tPath;
                }
                return tPath;
        </method>
-       
+
        <method name="getThemeColor" args="tColor">
                //if ($debug) Debug.write("load Color by Name: ",tColor);
                var tResColor = 
canvas.mainTheme.getPointer().xpathQuery("theme/color[@name='"+tColor+"']/@value");
@@ -529,7 +534,7 @@
                }
                return tResColor;
        </method>
-       
+
        <method name="setColors">
                
defaultstyle.setAttribute("basecolor",canvas.getThemeColor('basebgcolorizer'));
                
itemStyle.setAttribute("basecolor",canvas.getThemeColor('basebgcolorizer'));
@@ -552,7 +557,7 @@
        <method name="getNotNullString" args="value">
                return value == null ? '' : value;
        </method>
-       
+
        <method name="loadImgBySrc" args="cmp, imgUrl, completeCallback">
                cmp.sprite.resource = imgUrl;
                if (!cmp.sprite.imgLoader) {

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/commonVideoViewContentSWF10.lzx
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/commonVideoViewContentSWF10.lzx?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/commonVideoViewContentSWF10.lzx
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/commonVideoViewContentSWF10.lzx
 Wed Jan 11 09:15:37 2017
@@ -7,16 +7,16 @@
   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.
-  
+
 -->
 <library>
 
@@ -40,12 +40,12 @@
        <attribute name="videoHeight" type="number" value="132"/>
        <attribute name="SIDEPANEL_WIDTH" type="number" value="270" />
        <attribute name="baseVideoStream" value="null" />
-       
+
        <method name="toggleVideo" args="value">
                if($debug) Debug.info("toggleVideo ", canvas.currentClient, 
value);
                canvas.currentClient.canVideo = value;
        </method>
-       
+
        <method name="createEditRecordStream" args="isInterview">
                if($debug) Debug.info("createEditRecordStream,", isInterview);
                new lz.editRecordStreamSWF10(canvas, {
@@ -68,9 +68,9 @@
                }
        ]]>
        </method>
-       
-       <!-- 
-               Method that creates the video views when another user enters a 
room and his 
+
+       <!--
+               Method that creates the video views when another user enters a 
room and his
                item in the list of participants is created.
                The method to "play" the stream is invoked later, when the user
                really starts to stream and not only when he just enters the 
room.
@@ -116,8 +116,8 @@
                obj.setAttribute('chatpartnername', dispName);
        </method>
 
-       <!-- 
-               
+       <!--
+
                Method that creates the video views when user(self) initially 
entering a room.
                Creates the video-view AND starts to stream/play the video
         -->
@@ -161,7 +161,7 @@
                return vidContainer;
        ]]>
        </method>
-       
+
        <method name="getVideoObjectByPublicSID" args="publicSID">
        <![CDATA[
                //if ($debug) Debug.write("getVideoObjectByPublicSid SEARCH: ", 
publicSID);
@@ -288,9 +288,9 @@
 
        <method name="closeStreamclient" args="publicSID">
        <![CDATA[
-               if ($debug) Debug.write("closeStreamthis: ", publicSID);
+               if ($debug) Debug.write("closeStream this: ", publicSID);
                var obj = this.getVideoObjectByPublicSID(publicSID);
-               if ($debug) Debug.write("closeStreamthis obj: ", obj);
+               if ($debug) Debug.write("closeStream this obj: ", obj);
                if (obj != null) {
                        obj.resetValues();
                }
@@ -357,7 +357,7 @@
        <method name="startStream" args="value">
        <![CDATA[
                
//value.publicSID,value.broadCastID,value.firstname,value.lastname,value.interviewPodId,value.VWidth,value.VHeight
-               
+
                if ($debug) Debug.write("startStream: ", value);
                var obj = null;
                if (!!value.securityCode) {
@@ -387,7 +387,7 @@
                return;
        ]]>
        </method>
-       
+
        <method name="setExclusiveAudioAllowStatus" args="canGiveAudio">
                <![CDATA[
                        if ($debug) Debug.write("setExclusiveAudioAllowStatus 
:: ",canGiveAudio);
@@ -468,8 +468,8 @@
                        width:width,
                        height:height
                });
-       </method> 
-       
+       </method>
+
        <!---
                plays a recorded stream
         -->
@@ -486,10 +486,10 @@
                this.baseVideoStream.setAttribute("visibility","visible");
                this.baseVideoStream.playRecordingStream(streamName,delay);
        </method>
-       
+
        <!---
-               Updates the width/height property of the recording playback 
video 
-        -->    
+               Updates the width/height property of the recording playback 
video
+        -->
        <method name="updateRecordingVideoPosition" args="width,height">
                if (this.baseVideoStream == null) {
                        if ($debug) Debug.warn("baseVideoStream is NULL");
@@ -498,7 +498,7 @@
                this.baseVideoStream.setAttribute("width",width);
                this.baseVideoStream.setAttribute("height",height);
        </method>
-       
+
        <!---
                stops and hides the recording playback video
         -->
@@ -512,8 +512,8 @@
                this.baseVideoStream.stopRecording();
                this.baseVideoStream.setAttribute("visibility","hidden");
        </method>
-       
-       <!--- 
+
+       <!---
                pauses the current video or continue at the same position
         -->
        <method name="pauseRecordingPlayback" args="pauseBool">
@@ -524,7 +524,7 @@
                }
                this.baseVideoStream.pause(pauseBool);
        </method>
-       
+
        <method name="seekRecordingPlayback" args="flvTime">
                if($debug) Debug.write("seekRecordingPlayback ",flvTime);
                if (this.baseVideoStream == null) {
@@ -533,7 +533,7 @@
                }
                this.baseVideoStream.seekStream(flvTime);
        </method>
-       
+
        <method name="stopAndCloseRecordingConnection">
                if($debug) Debug.write("stopAndCloseRecordingConnection ");
                if (this.baseVideoStream == null) {
@@ -544,12 +544,12 @@
                this.baseVideoStream.destroy();
                this.baseVideoStream = null;
        </method>
-       
+
        <!---
           #################################
           Methods to handle screen sharing video playback and cursor
         -->
-        
+
        <!---
                Adds a new screen sharing playback video
         -->
@@ -560,15 +560,15 @@
                                canvas.screenSharingDialogContainer = new 
lz.screenSharingDialogContainer(canvas);
                        }
                        if ($debug) Debug.warn("New Screen Sharing", value);
-                       new 
lz.screenSharingDialog(canvas.screenSharingDialogContainer, {initObject: 
value}); 
+                       new 
lz.screenSharingDialog(canvas.screenSharingDialogContainer, {initObject: 
value});
                } else {
                        if ($debug) Debug.warn("Self Screen Sharing");
                }
        ]]>
-       </method> 
-       
+       </method>
+
        <!---
-               Add a list of screen sharing playback videos 
+               Add a list of screen sharing playback videos
                (initially when entering the room invoked)
         -->
        <method name="newScreenSharings" args="value">
@@ -581,7 +581,7 @@
 
        <!---
                Close a single screen sharing playback video
-        --> 
+        -->
        <method name="closeScreenSharing" args="value">
        <![CDATA[
                if (canvas.screenSharingDialogContainer != null) {
@@ -594,7 +594,7 @@
        </method>
 
        <!---
-          Closes all screen sharing playback videos, whiteboard videos, user 
videos 
+          Closes all screen sharing playback videos, whiteboard videos, user 
videos
           and closes the rtmp connection
         -->
        <method name="closeAllScreenSharings">
@@ -608,9 +608,9 @@
                canvas.commonVideoViewContent.clearAll();
        ]]>
        </method>
-       
+
        <!---
-               change Screen Sharing frame height 
+               change Screen Sharing frame height
         -->
        <method name="hideChatContent" args="hide">
        <![CDATA[
@@ -620,7 +620,7 @@
                }
        ]]>
        </method>
-       
+
        <!---
                Update the position of the cursor from the sharing screen
         -->
@@ -635,9 +635,9 @@
                }
        ]]>
        </method>
-       
+
        <!---
-               Make regExpTest 
+               Make regExpTest
         -->
        <method name="regExpTest" args="fieldValue,regExStr">
        <![CDATA[
@@ -655,7 +655,7 @@
                        valMic = 0; //select first one by default
                }
                var _micro = canvas.echoPath == 0 ? 
Microphone.getMicrophone(valMic) : Microphone.getEnhancedMicrophone(valMic);
-               
+
                if (_micro != null) {
                        if (canvas.echoPath == 256) {
                                var options:MicrophoneEnhancedOptions = new 
MicrophoneEnhancedOptions();
@@ -682,7 +682,7 @@
                return _micro;
        ]]>
        </method>
-       
+
        <method name="getCam" args="valCam, videoview">
        <![CDATA[
                if ($debug) Debug.write("Entering getCam ...", valCam);
@@ -692,7 +692,7 @@
                var _camera = Camera.getCamera(valCam);
                if (_camera != null) {
                        if ($debug) Debug.write("videoview: ", videoview);
-                       
+
                        if ($debug) Debug.write("_camera.setQuality BEST: ", 
canvas.isInterview, (canvas.bandwidthNeededBest * 2), canvas.camQualityBest);
                        if (canvas.isInterview) {
                                //we need a fixed frame rate for the videos to 
merge them later on
@@ -711,6 +711,25 @@
        ]]>
        </method>
 
+       <method name="syncAVsettings" args="g">
+               ExternalInterface.call("avSettings", JSON.stringify(g));
+       </method>
+
+       <method name="storeAVsettings" args="cam, mic, w, h">
+       <![CDATA[
+               //if ($debug) Debug.write("sharedobject store::  [width, 
height] : [" + w + ", " + h + "]");
+               var t:SharedObject = SharedObject.getLocal('userdata');
+               var g = t.data;
+               if (!g) g = new Array();
+               g["cam"] = cam;
+               g["mic"] = mic;
+               g["width"] = w;
+               g["height"] = h;
+               t.flush();
+               syncAVsettings(g);
+       ]]>
+       </method>
+
        <method name="loadAVsettings">
        <![CDATA[
                var t:SharedObject = SharedObject.getLocal('userdata');
@@ -724,6 +743,16 @@
        ]]>
        </method>
 
+       <method name="ensureAVsettings" args="w, h">
+               if ($debug) Debug.write("ensureAVsettings::  [width, height] : 
[" + w + ", " + h + "]");
+               var g = loadAVsettings();
+               if (!g) {
+                       storeAVsettings(Camera.names.length > 0 ? 0 : -1, 
Microphone.names.length > 0 ? 0 : -1, w, h);
+               } else {
+                       syncAVsettings(g);
+               }
+       </method>
+
        <method name="getAvSetting" args="prop, g=null, def=null">
                //Initialize and get eventually stored property
                if (!g) {
@@ -733,37 +762,18 @@
                return val != null ? val : def;
        </method>
 
-       <method name="getAVmode" args="g">
+       <method name="getAVmode">
                var settings = canvas.currentClient.avsettings;
-               if (!settings) {
-                       settings = getAvSetting('avstored', g, 'av'); //stored 
av settings are overriden by HTML5 (need to be merged)
-                       if (!settings) {
-                               settings = 'n';
-                       }
-               }
-               return settings;
+               return !settings ? 'n' : settings;
        </method>
 
        <method name="_startAvBroadcast" args="restart=false">
-               var g = canvas.commonVideoViewContent.loadAVsettings();
-               var vWidth = canvas.isInterview ? 320 : getAvSetting('width', 
g, 120);
-               var vHeight = canvas.isInterview ? 260 : getAvSetting('height', 
g, 90);
-               setUserAVSettings.avsetting = getAVmode(g);
-               setUserAVSettings.vWidth = vWidth;
-               setUserAVSettings.vHeight = vHeight;
-               setUserAVSettings.vHeight = vHeight;
                setUserAVSettings.updateBroadcastId = restart;
                setUserAVSettings.doCall();
        </method>
 
        <netRemoteCallHib name="setUserAVSettings" funcname="setUserAVSettings" 
remotecontext="$once{ canvas.thishib }" >
-               <attribute name="avsetting" value="" type="string" />
-               <attribute name="vWidth" value="0" type="number" />
-               <attribute name="vHeight" value="0" type="number" />
                <attribute name="updateBroadcastId" value="false" 
type="boolean" />
-               <netparam><method name="getValue">return 
parent.avsetting;</method></netparam>
-               <netparam><method name="getValue">return 
parent.vWidth;</method></netparam>
-               <netparam><method name="getValue">return 
parent.vHeight;</method></netparam>
                <netparam><method name="getValue">return 
parent.updateBroadcastId;</method></netparam>
                <handler name="ondata" args="value">
                        if ($debug) Debug.write("setUserAVSettings:: done", 
value);
@@ -779,10 +789,10 @@
                var g = canvas.commonVideoViewContent.loadAVsettings();
                var myvideocontainer = createVideoObject(canvas.publicSID, 
true, canvas.currentClient.interviewPodId, canvas.currentClient);
                if ($debug) Debug.write("startAvBroadcast::doninitalize");
-               var settings = getAVmode(g);
+               var settings = getAVmode();
                if ($debug) Debug.write("startAvBroadcast::mode, ", settings, 
canvas.currentClient.avsettings);
-               var vWidth = canvas.isInterview ? 320 : getAvSetting('width', 
g, 120);
-               var vHeight = canvas.isInterview ? 260 : getAvSetting('height', 
g, 90);
+               var vWidth = canvas.currentClient.VWidth;
+               var vHeight = canvas.currentClient.VHeight;
                if (!canvas.isInterview) {
                        myvideocontainer.setDefaultVideoSize(vWidth, vHeight);
                }
@@ -792,8 +802,8 @@
                myvideocontainer.setAttribute('isremote', false);
                var _micro = getMic(getAvSetting('mic', g, 0));
                var _camera = getCam(getAvSetting('cam', g, 0), videoview);
-               if ($debug) Debug.write(_camera , _micro, settings);
-               
+               if ($debug) Debug.write("startAvBroadcast", _camera, _micro, 
settings, videoview);
+
                if ($debug) Debug.write("BroadcastId: ", 
canvas.currentClient.broadCastID);
                switch (settings){
                        case "av":

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/main.lzx
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/main.lzx?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/main.lzx
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/main.lzx
 Wed Jan 11 09:15:37 2017
@@ -7,16 +7,16 @@
   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
-                 
+
+      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.
-  
+
 -->
 <canvas width="100%" height="100%" title="OpenMeetings">
        <switch>
@@ -41,7 +41,7 @@
        </switch>
 
        <include href="base/" /><!-- attributes,methods,datasets,are moved into 
/base -->
-       <include href="resources/" /> 
+       <include href="resources/" />
        <include href="modules/" />
        <include href="video/" />
        <include href="screensharing/" />
@@ -66,23 +66,23 @@
                canvas.currentModeratorList = [];
                canvas.removeModeratorList = [];
        ]]></handler>
-       
+
        <handler name="onerror" args="errmsg">
                canvas.remoteLogWrite("error " + errmsg);
        </handler>
-       
+
        <!-- View for Contents. All Windows will be loaded on this view. -->
-       <view name="main_content" y="0" width="${canvas.width}" 
+       <view name="main_content" y="0" width="${canvas.width}"
                                        height="${ canvas.height }"
                                        visibility="hidden" 
showhandcursor="false">
-               
+
                <handler name="onmouseover">
                        setCurrentMouseWheelObject(this._scrollbar);
                </handler>
                <handler name="onmouseout">
                        disableCurrentMouseWheelObject();
                </handler>
-               
+
                <view x="0" name="_content" >
                        <view name="inner" />
                        <method name="clearAll">
@@ -104,10 +104,10 @@
                </view>
                <om_hscrollbar name="_scrollbarH" id="_mainScrollHBar" 
visibility="hidden" />
                <om_vscrollbar name="_scrollbar" id="_mainScrollBar" />
-       </view>  
-         
+       </view>
+
        <!-- View for Conference menu bar at the top side. Visible on 
conference -->
-       <view name="_conferencemenu" y="0" x="0" width="100%" height="20" 
visible="false" > 
+       <view name="_conferencemenu" y="0" x="0" width="100%" height="20" 
visible="false" >
                <method name="removeAll">
                <![CDATA[
                        if($debug) 
Debug.write("main.lzx/_coferencemenu.removeAll(): ");
@@ -117,8 +117,8 @@
                        parent._moderatormenu.removeAll();
                ]]>
                </method>
-       </view> 
-       
+       </view>
+
        <view name="_moderatormenu" y="0" x="0" width="100%" height="20">
                <method name="removeAll">
                <![CDATA[
@@ -128,11 +128,11 @@
                        }
                ]]>
                </method>
-       </view>  
-               
+       </view>
+
        <!-- View for "Loading" -->
-       <view name="_loadingAll" visible="false" opacity="0.7" 
-               width="${ canvas.width }" height="${ canvas.height }" 
+       <view name="_loadingAll" visible="false" opacity="0.7"
+               width="${ canvas.width }" height="${ canvas.height }"
                bgcolor="0xFFFFFF" clickable="true" showhandcursor="false">
                <method name="hideContentOnly">
                        this.showLoadingAnni.setAttribute('started', true);
@@ -147,7 +147,7 @@
                <method name="hideLoading">
                        this.setAttribute("visibility","hidden");
                </method>
-               <animator name="showLoadingAnni" attribute="opacity" 
+               <animator name="showLoadingAnni" attribute="opacity"
                                from="0" to="0.7" started="false" 
duration="250" />
                <text name="_text" align="right" y="56" fontsize="14" 
fgcolor="red">Loading...</text>
        </view>

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/flexibleConferenceRoom/roomSidebar/baseRoomSidebar.lzx
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/flexibleConferenceRoom/roomSidebar/baseRoomSidebar.lzx?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/flexibleConferenceRoom/roomSidebar/baseRoomSidebar.lzx
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/flexibleConferenceRoom/roomSidebar/baseRoomSidebar.lzx
 Wed Jan 11 09:15:37 2017
@@ -144,7 +144,6 @@
        ]]>
        </method>
 
-
        <method name="addItem" 
args="connectedSince,isMod,streamid,username,userroom,formatedDate,position,color,object">
        <![CDATA[
                if ($debug) Debug.write("initializeStreams addItem: 
",connectedSince,isMod,streamid,username,formatedDate);
@@ -165,18 +164,6 @@
                }
        ]]>
        </method>
-               
-       <method name="closeStreamClient" args="publicSID">
-               canvas.commonVideoViewContent.closeStreamClient(publicSID);
-       </method>
-
-       <method name="resetAllValues">
-               canvas.commonVideoViewContent.resetAllValues();
-       </method>
-
-       <method name="updateMuteStatusVideoView" args="roomClient">
-               
canvas.commonVideoViewContent.updateMuteStatusVideoView(roomClient);
-       </method>
 </class>
 
 </library>

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/video/editRecordStreamSWF10.lzx
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/video/editRecordStreamSWF10.lzx?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/video/editRecordStreamSWF10.lzx
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/video/editRecordStreamSWF10.lzx
 Wed Jan 11 09:15:37 2017
@@ -7,31 +7,31 @@
   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.
-  
+
 -->
 <library>
 
 <!-- #######################
        Class editRecordStream
-       
+
        Description:
        This Class shows a window where you can alter you Video-/Microphone- 
Input-Resources
        and start to stream. The app could also use the default values for 
Cam/Mic but
        most users don't know how to alter this (weather in 
System-Control-Panel or by Right Clicking
        on the Flash-Screen and *>Preferences>Camera* )
        So I think it is better if Users are forced to choose something from 
this list
-       
+
  -->
- 
+
 <class name="editRecordStreamSWF10" extends="labelExplorerBox" labelid="51"
                width="680" height="540" x="14" y="-540" >
        <switch>
@@ -40,7 +40,6 @@
                                import flash.events.StatusEvent;
                                import flash.media.Camera;
                                import flash.media.Microphone;
-                               import flash.net.SharedObject;
                        </passthrough>
                </when>
        </switch>
@@ -59,18 +58,18 @@
        <attribute name="timerIsRunning" value="false" type="boolean" />
        <attribute name="counterDelegate" value="null" />
        <attribute name="executeAttachCamera" value="false" type="boolean" />
-       
+
        <method name="startTimer">
                this.timerIsRunning = true;
                this.timerWasUnmutedTheFirstTime = true;
                lz.Timer.addTimer( this.counterDelegate, 1000 );
        </method>
-       
+
        <method name="count" args="calleeObj">
                if (this.recordingsCounter != 0){
                        this.recordingsCounter -= 1;
                        lz.Timer.resetTimer(this.counterDelegate, 1000);
-                       
+
                        
this._text._info.setAttribute("text",""+this.recordingsCounter+" sec");
                } else {
                        this._text.setAttribute("visibility","hidden");
@@ -80,20 +79,20 @@
                        this.doPlay();
                }
        </method>
-       
+
        <method name="startTimerToCount">
                if (!this.timerIsRunning) {
                        this.startTimer();
                }
        </method>
-       
+
        <handler name="oninit">
        <![CDATA[
                if (canvas.editRecordStream != null) {
                        canvas.editRecordStream.destroy();
                }
                canvas.editRecordStream = this;
-               
+
                this.counterDelegate = new LzDelegate(this, "count");
 
                if ($debug) Debug.write("editrecordstream 
###################### ");
@@ -118,17 +117,12 @@
        </handler>
 
        <method name="storeAVsettings">
-       <![CDATA[
-               //if ($debug) Debug.write("sharedobject store::  [width, 
height] : [" + this.cam_default_width + ", " + this.cam_default_height + "]");
-               var t:SharedObject = SharedObject.getLocal('userdata');
-               var g = t.data;
-               if (g==null) g = new Array();
-               g["cam"] = this.availableCams.getValue();
-               g["mic"] = this.availableMics.getValue();
-               g["width"] = this.cam_default_width;
-               g["height"] = this.cam_default_height;
-               t.flush();
-       ]]>
+               canvas.commonVideoViewContent.storeAVsettings(
+                               this.availableCams.getValue()
+                               , this.availableMics.getValue()
+                               , this.cam_default_width
+                               , this.cam_default_height
+                       );
        </method>
 
        <method name="doStartRecording">
@@ -139,18 +133,18 @@
                this._text.setAttribute("visibility","visible");
                this._text._info.setAttribute("text","5 sec");
                this.isRunning = true;
-               
+
                var videoview = 
this._video.content._publisher._chatvideoinner._videostream;
                var _micro = 
canvas.commonVideoViewContent.getMic(this.availableMics.getValue());
                var _camera = 
canvas.commonVideoViewContent.getCam(this.availableCams.getValue(), videoview);
                if ($debug) Debug.write(_camera, _micro);
-               
+
                if ($debug && _camera != null) Debug.warn("_camera.muted ", 
_camera.muted);
                if ($debug && _micro != null) Debug.warn("_micro.muted ", 
_micro.muted);
                if ((_camera != null && !_camera.muted) || (_micro != null && 
!_micro.muted)) {
                        this.startTimer();
                }
-               
+
                //start recording of client stream
                var t = new Date();
                this.lastRecorded = "TEST_SETUP_"+t.getTime();
@@ -159,7 +153,7 @@
                videoview.record(this.lastRecorded,_camera,_micro);
        ]]>
        </method>
-       
+
        <method name="doPlay">
        <![CDATA[
                if (this.lastRecorded == "") {
@@ -174,7 +168,7 @@
                }
        ]]>
        </method>
-       
+
        <method name="doStop">
                if (this.isRunning) {
                        this.isRunning = false;
@@ -188,14 +182,14 @@
        </method>
 
        <animator name="_chooseDeviceAnimation" started="false" attribute="y" 
to="40" duration="750" />
-       
+
        <labelText fontstyle="bold" labelid="758" width="${ parent.width-2 }" 
height="30" multiline="true" y="20" />
 
        <method name="fillDeviceList" args="list,combo,prop">
        <![CDATA[
                //Initialize and get eventually stored property
                var dev = canvas.commonVideoViewContent.getAvSetting(prop);
-               
+
                //Get all availible devices
                var foundStoredDev = null;
                combo.addItem(canvas.getLabelName(159), -1);
@@ -209,7 +203,7 @@
                return foundStoredDev;
        ]]>
        </method>
-       
+
        <method name="selectListItem" args="combo, selected, select">
                if (selected != null) {
                        combo.selectItem(selected);
@@ -217,9 +211,9 @@
                        combo.selectItemAt(0);
                }
        </method>
-       
-       <!-- 
-               Initialize the default settings for cam and resolution and 
attach the camera 
+
+       <!--
+               Initialize the default settings for cam and resolution and 
attach the camera
                after we have made sure the values are there one time
         -->
        <method name="initItems">
@@ -228,7 +222,7 @@
                var cameras = Camera.names;
                var foundStoredCam = fillDeviceList(cameras, availableCams, 
"cam");
                selectListItem(availableCams, foundStoredCam, cameras.length > 
0);
-               
+
                //fill list of Mics
                var mics = Microphone.names;
                var foundStoredMic = fillDeviceList(mics, availableMics, "mic");
@@ -239,7 +233,7 @@
                var addMics = mics.length > 0;
        ]]>
        </method>
-       
+
        <method name="attachCamera">
        <![CDATA[
                //Don't execute before combobox items are not initialized
@@ -310,14 +304,14 @@
        <labelText name="infoTextNoAV" labelid="452" multiline="true" 
width="280"
                        fontsize="11" x="10" y="164" visibility="hidden" />
 
-       <labelText name="availibleResolutionsLabel" labelid="1429" 
+       <labelText name="availibleResolutionsLabel" labelid="1429"
                        fontsize="11" x="10" y="164" width="$once{ 
parent.width-20 }" />
 
-       <view name="availibleResolutionsWarning" x="272" y="164" 
+       <view name="availibleResolutionsWarning" x="272" y="164"
                        resource="warning_icon_popup_devices_rsc" 
clickable="true">
                <labelTooltip multiline="true" labelid="1430" />
        </view>
-       
+
        <resetCombobox fontsize="11" name="availibleResolutions" x="10" 
shownitems="10"
                        y="184" width="280" editable="false">
                <!--- @keywords private -->
@@ -338,7 +332,7 @@
                                if ($debug) 
Debug.write("availibleResolutions::onselect cam [W x H] ", item.cam_width, 
item.cam_height);
                                parent.setAttribute("cam_default_width", 
item.cam_width);
                                parent.setAttribute("cam_default_height", 
item.cam_height);
-                               
+
                                var py = parent.y < 0 ? 5 : parent.y;
                                var maxWidth = Math.min(600, canvas.width - 
parent.x - 10)
                                        , maxHeight = Math.min(500, 
canvas.height - py - 10)
@@ -349,7 +343,7 @@
                                if (item.cam_height > 180) {
                                        newHeight = maxHeight + item.cam_height 
- 180;
                                }
-                               
+
                                if (newWidth + parent.x + 10 > canvas.width) {
                                        newWidth = maxWidth;
                                }
@@ -373,7 +367,7 @@
                                this.cam_height = 
Number(this.datapath.xpathQuery('@height'));
                                this.setAttribute("text", "" + this.cam_width + 
"x" + this.cam_height + " [" + type + "]");
                                var isDefault = 
this.datapath.xpathQuery('@isDefault') == "true";
-                               
+
                                var width = 
canvas.commonVideoViewContent.getAvSetting("width");
                                var height = 
canvas.commonVideoViewContent.getAvSetting("height");
                                if (!!width && !!height && width == 
this.cam_width && height == this.cam_height) {
@@ -390,7 +384,7 @@
                        </handler>
                </textlistitem>
        </resetCombobox>
-       
+
        <simpleLabelButton name="_btnStartRecording" labelid="775" width="140" 
x="150" y="220" height="28">
                <handler name="onclick">
                        parent._level_meter.startLevel();
@@ -398,11 +392,11 @@
                </handler>
        </simpleLabelButton>
 
-       <view x="340" y="60" name="_video" clip="true" 
-                       width="${ parent.width-this.x-10 }" height="${ 
parent.height-260 }"> 
+       <view x="340" y="60" name="_video" clip="true"
+                       width="${ parent.width-this.x-10 }" height="${ 
parent.height-260 }">
                <view name="content">
-                       <videoObjectTestBroadcast name="_publisher"  
-                                       width="${ 
parent.parent.parent.cam_default_width }" 
+                       <videoObjectTestBroadcast name="_publisher"
+                                       width="${ 
parent.parent.parent.cam_default_width }"
                                        height="${ 
parent.parent.parent.cam_default_height }">
                                <handler name="sendCameraStatus" 
args="camStatus">
                                        if ($debug) 
Debug.write("sendCameraStatus -1- ",camStatus);
@@ -410,7 +404,7 @@
                                                
parent.parent.parent.startTimerToCount();
                                        }
                                </handler>
-                               
+
                                <handler name="sendMicroStatus" 
args="micStatus">
                                        if ($debug) 
Debug.write("sendMicroStatus -1- ",micStatus);
                                        if (micStatus == "Microphone.Unmuted") {
@@ -418,20 +412,20 @@
                                        }
                                </handler>
                        </videoObjectTestBroadcast>
-                       
-                       <videoObjectPlayTestBroadcast name="_viewer" 
visibility="hidden" 
-                                       width="${ 
parent.parent.parent.cam_default_width }" 
+
+                       <videoObjectPlayTestBroadcast name="_viewer" 
visibility="hidden"
+                                       width="${ 
parent.parent.parent.cam_default_width }"
                                        height="${ 
parent.parent.parent.cam_default_height }" />
                </view>
-               
+
                <om_vscrollbar />
                <om_hscrollbar />
        </view>
-       
+
        <view name="_text" x="340" y="60" width="240" height="180" 
visibility="hidden">
                <text name="_info" resize="true" bgcolor="0xFFFFFF" 
align="right" fontsize="12" fontstyle="bold" />
        </view>
-       
+
        <simpleLabelButton name="_play" y="${ parent.height-166 }" x="490" 
enabled="false" width="90" labelid="764">
                <handler name="onclick">
                        parent.doPlay();
@@ -442,7 +436,7 @@
                 <!--- Level delegate, used to track level changes.
                        @keywords private -->
                <attribute name="_leveldel" value="$once{new LzDelegate(this, 
'_updateLevel')}"/>
-               
+
                <method name="_updateLevel" args="no">
                        <![CDATA[
                                if 
(parent._video.content._publisher._chatvideoinner._videostream.micro == null) {
@@ -451,16 +445,16 @@
                                
this.setNewLevel(parent._video.content._publisher._chatvideoinner._videostream.micro.activityLevel);
                        ]]>
                </method>
-               
+
                <method name="startLevel">
                        this._leveldel.register(lz.Idle, "onidle");
                </method>
-               
+
                <method name="resetNewLevel">
                        this._leveldel.unregisterAll();
                        this.setNewLevel(0);
                </method>
-               
+
                <method name="setNewLevel" args="no">
                <![CDATA[
                        var newLevel = (238 / 100) * no;
@@ -468,15 +462,15 @@
                        this._over.setAttribute("x", 1 + newLevel);
                ]]>
                </method>
-               
+
                <view name="_bg" width="238" height="18" x="1" y="1" 
bgcolor="0xFFFFFF" />
                <view name="_grip" resource="level_meter_rsc" x="1" y="1" />
                <view name="_over" width="238" height="18" x="1" y="1" 
bgcolor="0xFFFFFF" />
                <labelText labelid="767" x="2" y="2" height="16" width="236" 
resize="false" />
        </view>
-       
+
        <view y="${ parent.height-98 }" resource="test_setup_info_rsc" x="16" />
-       
+
        <labelText fontstyle="bold" labelid="765" x="39" y="${ 
parent.height-100 }"
                        width="${ parent.width-50 }" multiline="true" />
 

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
 Wed Jan 11 09:15:37 2017
@@ -232,9 +232,11 @@ public class Application extends Authent
                        
rcl.setIsSuperModerator(client.hasRight(Right.superModerator));
                        rcl.setIsMod(client.hasRight(Right.moderator));
                        rcl.setIsBroadcasting(client.hasRight(Right.audio));
-                       rcl.setCanVideo(client.hasRight(Right.video) && 
client.hasActivity(Activity.broadcastV));
+                       rcl.setCanVideo(client.hasRight(Right.video) && 
client.isCamEnabled() && client.hasActivity(Activity.broadcastV));
                        rcl.setCanDraw(client.hasRight(Right.whiteBoard));
                        if (client.hasActivity(Activity.broadcastA) || 
client.hasActivity(Activity.broadcastV)) {
+                               rcl.setVWidth(client.getWidth());
+                               rcl.setVHeight(client.getHeight());
                                if (client.getPod() != Pod.none) {
                                        rcl.setInterviewPodId(client.getPod() 
== Pod.left ? 1 : 2);
                                }

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java
 Wed Jan 11 09:15:37 2017
@@ -61,11 +61,15 @@ public class Client implements IDataProv
        private final Set<Activity> activities = new HashSet<>();
        private final Date connectedSince;
        private Pod pod;
+       private int cam = -1;
+       private int mic = -1;
+       private int width = 0;
+       private int height = 0;
 
        public Client(String sessionId, Long userId) {
                this(sessionId, 0, userId);
        }
-       
+
        public Client(String sessionId, int pageId, Long userId) {
                this.sessionId = sessionId;
                this.pageId = pageId;
@@ -196,6 +200,46 @@ public class Client implements IDataProv
                }
        }
 
+       public boolean isCamEnabled() {
+               return cam > -1;
+       }
+
+       public int getCam() {
+               return cam;
+       }
+
+       public void setCam(int cam) {
+               this.cam = cam;
+       }
+
+       public boolean isMicEnabled() {
+               return mic > -1;
+       }
+
+       public int getMic() {
+               return mic;
+       }
+
+       public void setMic(int mic) {
+               this.mic = mic;
+       }
+
+       public int getWidth() {
+               return width;
+       }
+
+       public void setWidth(int width) {
+               this.width = width;
+       }
+
+       public int getHeight() {
+               return height;
+       }
+
+       public void setHeight(int height) {
+               this.height = height;
+       }
+
        @Override
        public int hashCode() {
                final int prime = 31;

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
 Wed Jan 11 09:15:37 2017
@@ -38,6 +38,7 @@ import org.apache.openmeetings.web.room.
 import org.apache.openmeetings.web.room.RoomPanel.Action;
 import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.json.JSONObject;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.extensions.markup.html.tabs.ITab;
 import org.apache.wicket.markup.head.IHeaderResponse;
@@ -50,6 +51,7 @@ import org.apache.wicket.markup.html.pan
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
+import org.apache.wicket.util.string.StringValue;
 import org.apache.wicket.util.string.Strings;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
@@ -62,11 +64,13 @@ public class RoomSidebar extends Panel {
        public static final String FUNC_TOGGLE_RIGHT = "toggleRight";
        public static final String FUNC_TOGGLE_ACTIVITY = "toggleActivity";
        public static final String FUNC_ACTION = "roomAction";
+       public static final String FUNC_SETTINGS = "avSettings";
        public static final String PARAM_ACTION = "action";
        public static final String PARAM_ACTIVITY = "activity";
        public static final String PARAM_RIGHT = "right";
        public static final String PARAM_UID = "uid";
        public static final String PARAM_POD = "pod";
+       public static final String PARAM_SETTINGS = "s";
        private final RoomPanel room;
        private final TabbedPanel tabs;
        private final ITab userTab;
@@ -91,12 +95,12 @@ public class RoomSidebar extends Panel {
                @Override
                protected void respond(AjaxRequestTarget target) {
                        try {
-                               String uid = 
getRequest().getRequestParameters().getParameterValue(PARAM_UID).toString(); 
+                               String uid = 
getRequest().getRequestParameters().getParameterValue(PARAM_UID).toString();
                                if (Strings.isEmpty(uid)) {
                                        return;
                                }
                                if (room.getClient().hasRight(Right.moderator)) 
{
-                                       Action a = 
Action.valueOf(getRequest().getRequestParameters().getParameterValue(PARAM_ACTION).toString());
 
+                                       Action a = 
Action.valueOf(getRequest().getRequestParameters().getParameterValue(PARAM_ACTION).toString());
                                        kickedClient = getOnlineClient(uid);
                                        if (kickedClient == null) {
                                                return;
@@ -121,11 +125,11 @@ public class RoomSidebar extends Panel {
                @Override
                protected void respond(AjaxRequestTarget target) {
                        try {
-                               String uid = 
getRequest().getRequestParameters().getParameterValue(PARAM_UID).toString(); 
+                               String uid = 
getRequest().getRequestParameters().getParameterValue(PARAM_UID).toString();
                                if (Strings.isEmpty(uid)) {
                                        return;
                                }
-                               Right right = 
Right.valueOf(getRequest().getRequestParameters().getParameterValue(PARAM_RIGHT).toString());
 
+                               Right right = 
Right.valueOf(getRequest().getRequestParameters().getParameterValue(PARAM_RIGHT).toString());
                                if (room.getClient().hasRight(Right.moderator)) 
{
                                        Client client = getOnlineClient(uid);
                                        if (client == null) {
@@ -158,11 +162,11 @@ public class RoomSidebar extends Panel {
                @Override
                protected void respond(AjaxRequestTarget target) {
                        try {
-                               String uid = 
getRequest().getRequestParameters().getParameterValue(PARAM_UID).toString(); 
+                               String uid = 
getRequest().getRequestParameters().getParameterValue(PARAM_UID).toString();
                                if (Strings.isEmpty(uid)) {
                                        return;
                                }
-                               Activity a = 
Activity.valueOf(getRequest().getRequestParameters().getParameterValue(PARAM_ACTIVITY).toString());
 
+                               Activity a = 
Activity.valueOf(getRequest().getRequestParameters().getParameterValue(PARAM_ACTIVITY).toString());
                                Client c = getOnlineClient(uid);
                                if (c == null) {
                                        return;
@@ -176,6 +180,15 @@ public class RoomSidebar extends Panel {
                                        }
                                }
                                if (activityAllowed(c, a, room.getRoom())) {
+                                       if (a == Activity.broadcastA && 
!c.isMicEnabled()) {
+                                               return;
+                                       }
+                                       if (a == Activity.broadcastV && 
!c.isCamEnabled()) {
+                                               return;
+                                       }
+                                       if (a == Activity.broadcastAV && 
!c.isMicEnabled() && !c.isCamEnabled()) {
+                                               return;
+                                       }
                                        Pod pod = c.getPod();
                                        
c.setPod(getRequest().getRequestParameters().getParameterValue(PARAM_POD).toOptionalInteger());
                                        if (pod != Pod.none && pod != 
c.getPod()) {
@@ -191,6 +204,23 @@ public class RoomSidebar extends Panel {
                        }
                }
        };
+       private final AbstractDefaultAjaxBehavior avSettings = new 
AbstractDefaultAjaxBehavior() {
+               private static final long serialVersionUID = 1L;
+
+               @Override
+               protected void respond(AjaxRequestTarget target) {
+                       StringValue s = 
getRequest().getRequestParameters().getParameterValue(PARAM_SETTINGS);
+                       if (!s.isEmpty()) {
+                               JSONObject o = new JSONObject(s.toString());
+                               room.getClient().setCam(o.getInt("cam"));
+                               room.getClient().setMic(o.getInt("mic"));
+                               boolean interview = Room.Type.interview == 
room.getRoom().getType();
+                               room.getClient().setWidth(interview ? 320 : 
o.getInt("width"));
+                               room.getClient().setHeight(interview ? 260 : 
o.getInt("height"));
+                               room.broadcast(target, room.getClient());
+                       }
+               }
+       };
 
        public RoomSidebar(String id, final RoomPanel room) {
                super(id);
@@ -204,12 +234,12 @@ public class RoomSidebar extends Panel {
                        public boolean isVisible() {
                                return true;
                        }
-                       
+
                        @Override
                        public IModel<String> getTitle() {
                                return Model.of(getString("613"));
                        }
-                       
+
                        @Override
                        public WebMarkupContainer getPanel(String containerId) {
                                return new UserFragment(containerId, 
"user-panel");
@@ -222,12 +252,12 @@ public class RoomSidebar extends Panel {
                        public boolean isVisible() {
                                return showFiles;
                        }
-                       
+
                        @Override
                        public IModel<String> getTitle() {
                                return Model.of(getString("614"));
                        }
-                       
+
                        @Override
                        public WebMarkupContainer getPanel(String containerId) {
                                return new FileFragment(containerId, 
"file-panel");
@@ -245,23 +275,24 @@ public class RoomSidebar extends Panel {
                                room.kickUser(target, kickedClient);
                        }
                });
-               add(toggleRight, toggleActivity, roomAction);
+               add(toggleRight, toggleActivity, roomAction, avSettings);
        }
-       
+
        @Override
        public void renderHead(IHeaderResponse response) {
                super.renderHead(response);
                response.render(new 
PriorityHeaderItem(getNamedFunction(FUNC_TOGGLE_RIGHT, toggleRight, 
explicit(PARAM_RIGHT), explicit(PARAM_UID))));
                response.render(new 
PriorityHeaderItem(getNamedFunction(FUNC_TOGGLE_ACTIVITY, toggleActivity, 
explicit(PARAM_ACTIVITY), explicit(PARAM_UID), explicit(PARAM_POD))));
                response.render(new 
PriorityHeaderItem(getNamedFunction(FUNC_ACTION, roomAction, 
explicit(PARAM_ACTION), explicit(PARAM_UID))));
+               response.render(new 
PriorityHeaderItem(getNamedFunction(FUNC_SETTINGS, avSettings, 
explicit(PARAM_SETTINGS))));
        }
-       
+
        private ListView<Client> updateUsers() {
                //TODO do we need sort??
                users.setList(getRoomClients(room.getRoom().getId()));
                return users;
        }
-       
+
        public class UserFragment extends Fragment {
                private static final long serialVersionUID = 1L;
 
@@ -271,7 +302,7 @@ public class RoomSidebar extends Panel {
                        add(updateUsers());
                }
        }
-       
+
        public class FileFragment extends Fragment {
                private static final long serialVersionUID = 1L;
 
@@ -300,7 +331,7 @@ public class RoomSidebar extends Panel {
        public boolean isShowFiles() {
                return showFiles;
        }
-       
+
        public void showUpload(IPartialPageRequestHandler handler) {
                upload.open(handler);
        }

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ClientIcon.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ClientIcon.java?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ClientIcon.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ClientIcon.java
 Wed Jan 11 09:15:37 2017
@@ -72,6 +72,8 @@ public abstract class ClientIcon extends
                        //request/remove
                        cls.append(CLS_CLICKABLE);
                        add(AttributeAppender.replace("onclick", getScript()));
+               } else {
+                       add(AttributeAppender.replace("onclick", ""));
                }
                internalUpdate();
                add(AttributeAppender.replace("title", getTitle()));

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/CamActivityIcon.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/CamActivityIcon.java?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/CamActivityIcon.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/CamActivityIcon.java
 Wed Jan 11 09:15:37 2017
@@ -37,7 +37,7 @@ public class CamActivityIcon extends Roo
        }
 
        @Override
-       protected boolean isClickable() {
-               return true;
+       public boolean isEnabled() {
+               return client.isCamEnabled();
        }
 }

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/MicActivityIcon.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/MicActivityIcon.java?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/MicActivityIcon.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/MicActivityIcon.java
 Wed Jan 11 09:15:37 2017
@@ -37,7 +37,7 @@ public class MicActivityIcon extends Roo
        }
 
        @Override
-       protected boolean isClickable() {
-               return true;
+       public boolean isEnabled() {
+               return client.isMicEnabled();
        }
 }

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/RoomActivityIcon.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/RoomActivityIcon.java?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/RoomActivityIcon.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/RoomActivityIcon.java
 Wed Jan 11 09:15:37 2017
@@ -31,6 +31,7 @@ import org.apache.openmeetings.web.room.
 public abstract class RoomActivityIcon extends ClientIcon {
        private static final long serialVersionUID = 1L;
        private static final String CLS_ENABLED = "enabled ";
+       private static final String CLS_DISABLED = "disabled";
        protected final Activity activity;
        protected final Pod pod = Pod.none;
 
@@ -50,9 +51,16 @@ public abstract class RoomActivityIcon e
        }
 
        @Override
+       protected boolean isClickable() {
+               return isEnabled();
+       }
+
+       @Override
        protected void internalUpdate() {
                setVisible(visible());
-               if (client.hasActivity(activity)) {
+               if (!isEnabled()) {
+                       cssClass.append(CLS_DISABLED);
+               } else if (client.hasActivity(activity)) {
                        cssClass.append(CLS_ENABLED);
                }
        }

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css
 Wed Jan 11 09:15:37 2017
@@ -228,6 +228,10 @@
 .activity.mic.ui-icon {
        background-image: url(images/microphone_enable.png);
 }
+.activity.ui-icon.disabled {
+       -webkit-filter: grayscale(100%); /* Safari 6.0 - 9.0 */
+       filter: grayscale(100%);
+}
 .activity.mic.enabled.ui-icon {
        background-image: url(images/microphone_disable.png);
 }

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/public/config.xml
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/public/config.xml?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/public/config.xml
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/public/config.xml
 Wed Jan 11 09:15:37 2017
@@ -7,46 +7,46 @@
   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.
-  
+
 -->
-<config 
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
-    xsi:noNamespaceSchemaLocation="config.xsd">
+<config
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+       xsi:noNamespaceSchemaLocation="config.xsd">
 
 <!-- URL/IP to use for the Server for RTMP and RTMPT traffic.
-    If this value is empty it will try to connect to the 
-    domain-name the OpenMeetings-Client has been loading from
-    
-    Can be either and IP or a domain name. 
-    For example: 
-    <rtmphostlocal>192.168.254.182</rtmphostlocal>
-    or
-    <rtmphostlocal>mysubdomain.streaming.to</rtmphostlocal>
-    -->
+       If this value is empty it will try to connect to the
+       domain-name the OpenMeetings-Client has been loading from
+
+       Can be either and IP or a domain name.
+       For example:
+       <rtmphostlocal>192.168.254.182</rtmphostlocal>
+       or
+       <rtmphostlocal>mysubdomain.streaming.to</rtmphostlocal>
+-->
 <rtmphostlocal></rtmphostlocal>
 
 <!-- URL/IP to use for the Server for HTTP and HTTPS traffic.
-    If this value is empty it will use the rtmphostlocal 
-    variable (and in that way try to connect to the 
-    domain-name the OpenMeetings-Client has been loading from)
-    -->
+       If this value is empty it will use the rtmphostlocal
+       variable (and in that way try to connect to the
+       domain-name the OpenMeetings-Client has been loading from)
+       -->
 <httphostlocal></httphostlocal>
 
-<!--  
+<!--
 Port to use for the Server
 To this port the default server lookup is done
 
 You can find all this configuration in your red5-Config in: 
$RED5_HOME/conf/red5.properties
- -->
+-->
 <rtmpport>1935</rtmpport>
 
 <rtmpsslport>8443</rtmpsslport>
@@ -56,177 +56,175 @@ Valid values: yes / no
 
 NOTE: The OSx and Linux Flash Player are NOT able to connect via rtmps
 The support for Windows is experimental
- -->
+-->
 <useSSL>no</useSSL>
 
-<!-- 
+<!--
 Port to use for the Server
 This port is used to connect to the http-servlet
 of the red5-servlet
- -->
+-->
 <red5httpport>5080</red5httpport>
 
 <!--
-    The protocol to use for the http connections
-    for example upload/download of files 
- -->
+       The protocol to use for the http connections
+       for example upload/download of files
+-->
 <protocol>http</protocol>
 
 <!--
-    The setting for the NetConnection
-    default settings is "none"
-    set to value "best" if you are trying to use rtmp over native SSL
-    see: 
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/NetConnection.html#proxyType
- -->
+       The setting for the NetConnection
+       default settings is "none"
+       set to value "best" if you are trying to use rtmp over native SSL
+       see: 
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/NetConnection.html#proxyType
+-->
 <proxyType>none</proxyType>
-       
+
+<!--
+       Video-Settings
+
+       Number that specifies the amount of sound required to activate the 
microphone
+       Acceptable values from 0 to 100.
+       this value is used in Audio_Streaming, at which the *activity-meter* 
will
+       send a notification for all connected hosts of a conference
+       the result of this notification is that you see the green-light 
highlighted if
+       a remote user is speaking
+-->
+<loudnessAcitviation>0</loudnessAcitviation>
+
+<!--
+       OpenMeetings-Webapp Name
+       This is the name of the WebApp the Client will try to connect
+       in former versions (till 0.5 Beta7) the name was xmlcrm
+       the same param kann be find in the webapp in the Red5-Webapp
+       red5-web.properties
+       web.xml
+-->
+<webAppRootKey>openmeetings</webAppRootKey>
+
 <!--
-    Video-Settings
-    
-    Number that specifies the amount of sound required to activate the 
microphone 
-       Acceptable values from 0 to 100.        
-    this value is used in Audio_Streaming, at which the *activity-meter* will
-    send a notification for all connected hosts of a conference
-    the result of this notification is that you see the green-light 
highlighted if
-    a remote user is speaking
- -->
-<loudnessAcitviation>0</loudnessAcitviation>  
-    
-<!--
-    OpenMeetings-Webapp Name
-    This is the name of the WebApp the Client will try to connect
-    in former versions (till 0.5 Beta7) the name was xmlcrm
-    the same param kann be find in the webapp in the Red5-Webapp
-    red5-web.properties
-    web.xml
- -->
-<webAppRootKey>openmeetings</webAppRootKey>  
-
-<!--
-    We need this additional ROOT-Key as we have to deploy the application 
-    as Global Contex Root. 
-    
-    If the rtmpt issues is solved sothat several Webapps can use different 
RTMPT connection
-    we might change this value again to its origin / webapp-context
-
- -->
-<httpRootKey>/openmeetings/</httpRootKey>  
-    
-<!--
-    Window-Effect Settings
-    showWindowEffect-values:
-    y = yes
-    n = no
-    showWindowEffectOpacity-values
-    between 0 and 1
- -->
-<showWindowEffect>n</showWindowEffect> 
-
-<!--
-    
#############################################################################
-    Audio and Video Settings
-    Before you change settings here,
-    you should first Play and learn how the Settings work in the Documentation:
-    http://code.google.com/p/openmeetings/wiki/AudioVideoTestingApplication
-    
#############################################################################
- -->
- 
+       We need this additional ROOT-Key as we have to deploy the application
+       as Global Contex Root.
+
+       If the rtmpt issues is solved sothat several Webapps can use different 
RTMPT connection
+       we might change this value again to its origin / webapp-context
+
+-->
+<httpRootKey>/openmeetings/</httpRootKey>
+
+<!--
+       Window-Effect Settings
+       showWindowEffect-values:
+       y = yes
+       n = no
+       showWindowEffectOpacity-values
+       between 0 and 1
+-->
+<showWindowEffect>n</showWindowEffect>
+
+<!--
+       
#############################################################################
+       Audio and Video Settings
+       Before you change settings here,
+       you should first Play and learn how the Settings work in the 
Documentation:
+       http://code.google.com/p/openmeetings/wiki/AudioVideoTestingApplication
+       
#############################################################################
+-->
+
 <!-- Camera Settings for codecType
 
-    codecType possible values:
-    h263
-    h264
-    If you want to use red5sip, set value to "h264"
- -->
-<codecType>h263</codecType>
- 
+       codecType possible values:
+       h263
+       h264
+       If you want to use red5sip, set value to "h264"
+-->
+<codecType>h264</codecType>
+
 <!-- Camera Settings for the FramesPerSecond
-    
-    fps:Number [optional] - The requested rate at which the camera should 
capture 
-    data, in frames per second. The default value is 15.
- -->    
+
+       fps:Number [optional] - The requested rate at which the camera should 
capture
+       data, in frames per second. The default value is 15.
+-->
 <framesPerSecond>30</framesPerSecond>
-    
-    
+
 <!-- Camera Settings for the Bandwidth:
-    
-    bandwidth:Number [optional] - An integer that specifies the maximum amount 
-    of bandwidth that the current outgoing video feed can use, in bytes per 
second. 
-    To specify that Flash video can use as much bandwidth as needed to 
maintain 
-    the value of frameQuality, pass 0 for bandwidth. The default value is 
16384.
- -->
+
+       bandwidth:Number [optional] - An integer that specifies the maximum 
amount
+       of bandwidth that the current outgoing video feed can use, in bytes per 
second.
+       To specify that Flash video can use as much bandwidth as needed to 
maintain
+       the value of frameQuality, pass 0 for bandwidth. The default value is 
16384.
+-->
 <!-- These are the settings for the Quality-Modus *normal*
-    The Quality-Modus can be chosen in the Login-Box --> 
-<bandwidthNeededNormal>16384</bandwidthNeededNormal>    
-<!-- These are the settings for the Quality-Modus *best* -->    
+       The Quality-Modus can be chosen in the Login-Box -->
+<bandwidthNeededNormal>16384</bandwidthNeededNormal>
+<!-- These are the settings for the Quality-Modus *best* -->
 <bandwidthNeededBest>0</bandwidthNeededBest>
-    
-    
+
 <!-- Camera Settings for the Quality
-    
-    quality:Number [optional] - An integer that specifies the required level 
of 
-    picture quality, as determined by the amount of compression being applied 
to 
-    each video frame. Acceptable values range from 1 (lowest quality, maximum 
-    compression) to 100 (highest quality, no compression). To specify that 
picture 
-    quality can vary as needed to avoid exceeding bandwidth, pass 0 for 
quality. 
-    The default value is 0.
- --> 
-<!-- These are the settings for the Quality-Modus *normal* -->  
-<camQualityNormal>85</camQualityNormal>     
-<!-- These are the settings for the Quality-Modus *best* -->       
-<camQualityBest>90</camQualityBest> 
-    
-    
+
+       quality:Number [optional] - An integer that specifies the required 
level of
+       picture quality, as determined by the amount of compression being 
applied to
+       each video frame. Acceptable values range from 1 (lowest quality, 
maximum
+       compression) to 100 (highest quality, no compression). To specify that 
picture
+       quality can vary as needed to avoid exceeding bandwidth, pass 0 for 
quality.
+       The default value is 0.
+-->
+<!-- These are the settings for the Quality-Modus *normal* -->
+<camQualityNormal>85</camQualityNormal>
+<!-- These are the settings for the Quality-Modus *best* -->
+<camQualityBest>90</camQualityBest>
+
+
 <!-- Microphone Settings for the Rate:
-    
-    rate:Number - 
-    The rate at which the microphone should capture sound, in kHz. 
-    Acceptable values are 5, 8, 11, 22, and 44. 
-    The default value is 8 kHz if your sound capture 
-    device supports this value. Otherwise, the default value 
-    is the next available capture level above 8 kHz that your sound 
-    capture device supports, usually 11 kHz.
- -->
+
+       rate:Number -
+       The rate at which the microphone should capture sound, in kHz.
+       Acceptable values are 5, 8, 11, 22, and 44.
+       The default value is 8 kHz if your sound capture
+       device supports this value. Otherwise, the default value
+       is the next available capture level above 8 kHz that your sound
+       capture device supports, usually 11 kHz.
+-->
 <!-- Microphone Settings Quality-Modus -->
 <microphoneRateBest>22</microphoneRateBest>
 
 <!-- AEC configuration value
-Specifies the echo path length (in milliseconds). A longer echo path means 
better 
-echo cancellation but also introduces longer delays and requires more 
processing power. 
+Specifies the echo path length (in milliseconds). A longer echo path means 
better
+echo cancellation but also introduces longer delays and requires more 
processing power.
 The default value is 128; the only other possible value is 256.
 To disable AEC please specify 0.
- -->
+-->
 <echoPath>128</echoPath>
 
 <!--
-    Set "true" or "false" to enable/disable microphone echo suppression
- -->
+       Set "true" or "false" to enable/disable microphone echo suppression
+-->
 <echoSuppression>true</echoSuppression>
 
 <!--
-    The Size of the Whiteboard
-    The Whiteboard has scrollbars so you may increase the size without problems
- -->
-<defaultWhiteboardWidth>2400</defaultWhiteboardWidth>  
-<defaultWhiteboardHeight>1200</defaultWhiteboardHeight>  
+       The Size of the Whiteboard
+       The Whiteboard has scrollbars so you may increase the size without 
problems
+-->
+<defaultWhiteboardWidth>2400</defaultWhiteboardWidth>
+<defaultWhiteboardHeight>1200</defaultWhiteboardHeight>
 
 <!-- Available Configurations -->
 
 <availableCameraResolutions>
-    <resolution type="4:3 (~6 KByte/sec)" width="40" height="30" 
isDefault="false" />
-    <resolution type="4:3 (~12 KByte/sec)" width="80" height="60" 
isDefault="false" />
-    <resolution type="4:3 (~20 KByte/sec)" width="120" height="90" 
isDefault="true" />
-    <resolution type="QQVGA 4:3 (~36 KByte/sec)" width="160" height="120" 
isDefault="false" />
-    <resolution type="4:3 (~40 KByte/sec)" width="240" height="180" 
isDefault="false" />
-    <resolution type="HVGA 4:3 (~56 KByte/sec)" width="320" height="240" 
isDefault="false" />
-    <resolution type="4:3  (~60 KByte/sec)" width="480" height="360" 
isDefault="false" />
-    <resolution type="4:3 (~68 KByte/sec)" width="640" height="480" 
isDefault="false" />
-    <resolution type="XGA 4:3" width="1024" height="768" isDefault="false" />
-    <resolution type="16:9" width="256" height="150" isDefault="false" />
-    <resolution type="WQVGA 9:5" width="432" height="240" isDefault="false" />
-    <resolution type="pseudo 16:9" width="480" height="234" isDefault="false" 
/>
-    <resolution type="16:9" width="512" height="300" isDefault="false" />
-    <resolution type="nHD 16:9" width="640" height="360" isDefault="false" />
-    <resolution type="16:9" width="1024" height="600" isDefault="false" />
+       <resolution type="4:3 (~6 KByte/sec)" width="40" height="30" 
isDefault="false" />
+       <resolution type="4:3 (~12 KByte/sec)" width="80" height="60" 
isDefault="false" />
+       <resolution type="4:3 (~20 KByte/sec)" width="120" height="90" 
isDefault="true" />
+       <resolution type="QQVGA 4:3 (~36 KByte/sec)" width="160" height="120" 
isDefault="false" />
+       <resolution type="4:3 (~40 KByte/sec)" width="240" height="180" 
isDefault="false" />
+       <resolution type="HVGA 4:3 (~56 KByte/sec)" width="320" height="240" 
isDefault="false" />
+       <resolution type="4:3  (~60 KByte/sec)" width="480" height="360" 
isDefault="false" />
+       <resolution type="4:3 (~68 KByte/sec)" width="640" height="480" 
isDefault="false" />
+       <resolution type="XGA 4:3" width="1024" height="768" isDefault="false" 
/>
+       <resolution type="16:9" width="256" height="150" isDefault="false" />
+       <resolution type="WQVGA 9:5" width="432" height="240" isDefault="false" 
/>
+       <resolution type="pseudo 16:9" width="480" height="234" 
isDefault="false" />
+       <resolution type="16:9" width="512" height="300" isDefault="false" />
+       <resolution type="nHD 16:9" width="640" height="360" isDefault="false" 
/>
+       <resolution type="16:9" width="1024" height="600" isDefault="false" />
 </availableCameraResolutions>
 </config>

Modified: 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
 Wed Jan 11 09:15:37 2017
@@ -990,39 +990,26 @@ public class ScopeApplicationAdapter ext
        }
 
        /**
-        * this must be set _after_ the Video/Audio-Settings have been chosen 
(see
-        * editrecordstream.lzx) but _before_ anything else happens, it cannot 
be
-        * applied _after_ the stream has started! 
-        * avsettings can be: 
-        *              av - video and audio
-        *              a - audio only
-        *              v - video only
-        *              n - no a/v only static image
-        * furthermore
+        * This method is used to set/update broadCastID of current client
         * 
-        * @param avsettings
-        * @param vWidth
-        * @param vHeight
+        * @param updateBroadcastId boolean flag 
         * 
         * @return BroadcastId in case of no errors, -1 otherwise
         */
-       public long setUserAVSettings(String avsettings, Integer vWidth, 
Integer vHeight, boolean updateBroadcastId) {
+       public long setUserAVSettings(boolean updateBroadcastId) {
                try {
                        String streamid = 
Red5.getConnectionLocal().getClient().getId();
-                       log.debug("-----------  setUserAVSettings {} {}", 
streamid, avsettings);
-                       Client currentClient = 
sessionManager.getClientByStreamId(streamid, null);
-                       if (currentClient == null) {
+                       log.debug("-----------  setUserAVSettings {}", 
streamid);
+                       Client rcl = 
sessionManager.getClientByStreamId(streamid, null);
+                       if (rcl == null) {
                                log.warn("Failed to find appropriate clients");
                                return -1;
                        }
-                       currentClient.setAvsettings(avsettings);
-                       currentClient.setVWidth(vWidth);
-                       currentClient.setVHeight(vHeight);
                        if (updateBroadcastId) {
-                               currentClient.setBroadCastID(nextBroadCastId());
+                               rcl.setBroadCastID(nextBroadCastId());
+                               
sessionManager.updateAVClientByStreamId(streamid, rcl, null);
                        }
-                       sessionManager.updateAVClientByStreamId(streamid, 
currentClient, null);
-                       return currentClient.getBroadCastID();
+                       return rcl.getBroadCastID();
                } catch (Exception err) {
                        log.error("[setUserAVSettings]", err);
                }


Reply via email to