/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd * * Licensed 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. */ package net.java.sip.communicator.impl.protocol.gibberish; import java.util.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.event.*; /** * A Gibberish implementation of the <tt>CallPeer</tt> interface. * * @author Yana Stamcheva */ public class CallPeerGibberishImpl extends AbstractCallPeer<CallGibberishImpl, ProtocolProviderServiceGibberishImpl> { /** * The sip address of this peer */ private String peerAddress = null; /** * The call peer belongs to. */ private CallGibberishImpl call; /** * A string uniquely identifying the peer. */ private String peerID; /** * A list of listeners registered for stream user sound level events. */ private final List<SoundLevelListener> soundLevelListeners = new Vector<SoundLevelListener>(); /** * A list of listeners registered for stream user sound level events. */ private final List<ConferenceMembersSoundLevelListener> confMemebrSoundLevelListeners = new Vector<ConferenceMembersSoundLevelListener>(); /** * Creates an instance of <tt>CallPeerGibberishImpl</tt> by specifying the * call peer <tt>address</tt> and the parent <tt>owningCall</tt>. * @param address the address of the peer * @param owningCall the parent call */ public CallPeerGibberishImpl(String address, CallGibberishImpl owningCall) { this.peerAddress = address; this.call = owningCall; //create the uid this.peerID = String.valueOf( System.currentTimeMillis()) + String.valueOf(hashCode()); final Random random = new Random(); // Make this peer a conference focus. if (owningCall.getCallPeerCount() > 1) { this.setConferenceFocus(true); final ConferenceMemberGibberishImpl member1 = new ConferenceMemberGibberishImpl(this, "Dragancho@gibberish"); member1.setDisplayName("Dragancho"); member1.setState(ConferenceMemberState.CONNECTED); this.addConferenceMember(member1); final ConferenceMemberGibberishImpl member2 = new ConferenceMemberGibberishImpl(this, "Ivancho@gibberish"); member2.setDisplayName("Ivancho"); member2.setState(ConferenceMemberState.CONNECTED); this.addConferenceMember(member2); Timer timer1 = new Timer(false); timer1.scheduleAtFixedRate(new TimerTask() { @Override public void run() { fireConferenceMembersSoundLevelEvent( new HashMap<ConferenceMember, Integer>() { { put(member1, new Integer(random.nextInt(255))); put(member2, new Integer(random.nextInt(255))); } }); } }, 500, 100); } } /** * Returns a String locator for that peer. * * @return the peer's address or phone number. */ public String getAddress() { return peerAddress; } /** * Returns full URI of the address. * * @return full URI of the address */ public String getURI() { return "gibberish:" + peerAddress; } /** * Returns a reference to the call that this peer belongs to. * * @return a reference to the call containing this peer. */ @Override public CallGibberishImpl getCall() { return call; } /** * Returns a human readable name representing this peer. * * @return a String containing a name for that peer. */ public String getDisplayName() { return peerAddress; } /** * The method returns an image representation of the call peer * (e.g. * * @return byte[] a byte array containing the image or null if no image * is available. */ public byte[] getImage() { return null; } /** * Returns a unique identifier representing this peer. * * @return an identifier representing this call peer. */ public String getPeerID() { return peerID; } /** * Returns the contact corresponding to this peer or null if no * particular contact has been associated. * <p> * @return the <tt>Contact</tt> corresponding to this peer or null * if no particular contact has been associated. */ public Contact getContact() { /** @todo implement getContact() */ return null; } /** * Returns the protocol provider that this peer belongs to. * * @return a reference to the ProtocolProviderService that this peer * belongs to. */ @Override public ProtocolProviderServiceGibberishImpl getProtocolProvider() { return call.getProtocolProvider(); } /** * Adds a specific <tt>SoundLevelListener</tt> to the list of * listeners interested in and notified about changes in stream sound level * related information. * * @param listener the <tt>SoundLevelListener</tt> to add */ public void addStreamSoundLevelListener( SoundLevelListener listener) { synchronized(soundLevelListeners) { if (!soundLevelListeners.contains(listener)) soundLevelListeners.add(listener); } } /** * Removes a specific <tt>SoundLevelListener</tt> of the list of * listeners interested in and notified about changes in stream sound level * related information. * * @param listener the <tt>SoundLevelListener</tt> to remove */ public void removeStreamSoundLevelListener( SoundLevelListener listener) { synchronized(soundLevelListeners) { soundLevelListeners.remove(listener); } } /** * Adds a specific <tt>SoundLevelListener</tt> to the list * of listeners interested in and notified about changes in conference * members sound level. * * @param listener the <tt>SoundLevelListener</tt> to add */ public void addConferenceMembersSoundLevelListener( ConferenceMembersSoundLevelListener listener) { synchronized(confMemebrSoundLevelListeners) { if (!confMemebrSoundLevelListeners.contains(listener)) confMemebrSoundLevelListeners.add(listener); } } /** * Removes a specific <tt>SoundLevelListener</tt> of the * list of listeners interested in and notified about changes in conference * members sound level. * * @param listener the <tt>SoundLevelListener</tt> to * remove */ public void removeConferenceMembersSoundLevelListener( ConferenceMembersSoundLevelListener listener) { synchronized(confMemebrSoundLevelListeners) { confMemebrSoundLevelListeners.remove(listener); } } /** * Fires a <tt>StreamSoundLevelEvent</tt> and notifies all registered * listeners. * * @param level the new sound level */ void fireStreamSoundLevelEvent(int level) { SoundLevelListener[] listeners; synchronized(soundLevelListeners) { listeners = soundLevelListeners.toArray( new SoundLevelListener[soundLevelListeners.size()]); } for (SoundLevelListener listener : listeners) listener.soundLevelChanged(this, level); } /** * Fires a <tt>StreamSoundLevelEvent</tt> and notifies all registered * listeners. * * @param levels the new sound levels */ void fireConferenceMembersSoundLevelEvent( Map<ConferenceMember,Integer> levels) { ConferenceMembersSoundLevelEvent event = new ConferenceMembersSoundLevelEvent(this, levels); ConferenceMembersSoundLevelListener[] ls; synchronized(confMemebrSoundLevelListeners) { ls = confMemebrSoundLevelListeners.toArray( new ConferenceMembersSoundLevelListener[ confMemebrSoundLevelListeners.size()]); } for (ConferenceMembersSoundLevelListener listener : ls) { listener.soundLevelChanged(event); } } }