use of com.flashphoner.fpwcsapi.layout.PercentFrameLayout in project wcs-android-sdk-samples by flashphoner.
the class PhoneMinVideoActivity method onCreate.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_streaming_min);
/**
* Initialization of the API.
*/
Flashphoner.init(this);
/**
* UI controls
*/
SharedPreferences sharedPref = this.getPreferences(Context.MODE_PRIVATE);
mWcsUrlView = (EditText) findViewById(R.id.wcs_url);
mWcsUrlView.setText(sharedPref.getString("wcs_url", getString(R.string.wcs_url)));
mSipLoginView = (EditText) findViewById(R.id.sip_login);
mSipLoginView.setText(sharedPref.getString("sip_login", getString(R.string.sip_login)));
mSipPasswordView = (EditText) findViewById(R.id.sip_password);
mSipPasswordView.setText(sharedPref.getString("sip_password", getString(R.string.sip_password)));
mSipDomainView = (EditText) findViewById(R.id.sip_domain);
mSipDomainView.setText(sharedPref.getString("sip_domain", getString(R.string.sip_domain)));
mSipPortView = (EditText) findViewById(R.id.sip_port);
mSipPortView.setText(sharedPref.getString("sip_port", getString(R.string.sip_port)));
mSipRegisterRequiredView = (CheckBox) findViewById(R.id.register_required);
mSipRegisterRequiredView.setChecked(sharedPref.getBoolean("sip_register_required", true));
callStatusEvent = new CallStatusEvent() {
/**
* WCS received SIP 100 TRYING
* @param call
*/
@Override
public void onTrying(final Call call) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mCallButton.setText(R.string.action_hangup);
mCallButton.setTag(R.string.action_hangup);
mCallButton.setEnabled(true);
mCallStatus.setText(call.getStatus());
}
});
}
/**
* WCS received SIP BUSY_HERE or BUSY_EVERYWHERE from SIP
* @param call
*/
@Override
public void onBusy(final Call call) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mCallButton.setText(R.string.action_call);
mCallButton.setTag(R.string.action_call);
mCallButton.setEnabled(true);
mCallStatus.setText(call.getStatus());
}
});
}
/**
* Call is failed
* @param call
*/
@Override
public void onFailed(Call call) {
}
/**
* WCS received SIP 180 RINGING from SIP
* @param call
*/
@Override
public void onRing(final Call call) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mCallButton.setText(R.string.action_hangup);
mCallButton.setTag(R.string.action_hangup);
mCallButton.setEnabled(true);
mCallStatus.setText(call.getStatus());
}
});
}
/**
* Call is set on hold
* @param call
*/
@Override
public void onHold(final Call call) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mCallStatus.setText(call.getStatus());
}
});
}
/**
* Call established
* @param call
*/
@Override
public void onEstablished(final Call call) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mCallStatus.setText(call.getStatus());
mHoldButton.setEnabled(true);
mMuteAudio.setEnabled(true);
mMuteVideo.setEnabled(true);
}
});
}
/**
* Call is terminated
* @param call
*/
@Override
public void onFinished(final Call call) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mCallButton.setText(R.string.action_call);
mCallButton.setTag(R.string.action_call);
mCallButton.setEnabled(true);
mCallStatus.setText(call.getStatus());
mHoldButton.setText(R.string.action_hold);
mHoldButton.setTag(R.string.action_hold);
mHoldButton.setEnabled(false);
mMuteAudio.setEnabled(false);
mMuteAudio.setChecked(false);
mMuteVideo.setEnabled(false);
mMuteVideo.setChecked(false);
if (incomingCallAlert != null) {
incomingCallAlert.hide();
incomingCallAlert = null;
}
}
});
}
};
mConnectStatus = (TextView) findViewById(R.id.connect_status);
mConnectButton = (Button) findViewById(R.id.connect_button);
/**
* Connect button pressed
*/
mConnectButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (mConnectButton.getTag() == null || Integer.valueOf(R.string.action_connect).equals(mConnectButton.getTag())) {
SessionOptions sessionOptions = new SessionOptions(mWcsUrlView.getText().toString());
sessionOptions.setLocalRenderer(localRender);
sessionOptions.setRemoteRenderer(remoteRender);
session = Flashphoner.createSession(sessionOptions);
session.on(new SessionEvent() {
@Override
public void onAppData(Data data) {
}
/**
* Connection established
* @param connection Current connection state
*/
@Override
public void onConnected(final Connection connection) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mConnectButton.setText(R.string.action_disconnect);
mConnectButton.setTag(R.string.action_disconnect);
mConnectButton.setEnabled(true);
if (!mSipRegisterRequiredView.isChecked()) {
mConnectStatus.setText(connection.getStatus());
mCallButton.setEnabled(true);
} else {
mConnectStatus.setText(connection.getStatus() + ". Registering...");
}
}
});
}
/**
* Phone registered
* @param connection Current connection state
*/
@Override
public void onRegistered(final Connection connection) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mConnectStatus.setText(connection.getStatus());
mCallButton.setEnabled(true);
}
});
}
/**
* Phone disconnected
* @param connection Current connection state
*/
@Override
public void onDisconnection(final Connection connection) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mConnectButton.setText(R.string.action_connect);
mConnectButton.setTag(R.string.action_connect);
mConnectButton.setEnabled(true);
mConnectStatus.setText(connection.getStatus());
mCallButton.setText(R.string.action_call);
mCallButton.setTag(R.string.action_call);
mCallButton.setEnabled(false);
mCallStatus.setText("");
mHoldButton.setText(R.string.action_hold);
mHoldButton.setTag(R.string.action_hold);
mHoldButton.setEnabled(false);
mMuteAudio.setEnabled(false);
mMuteAudio.setChecked(false);
mMuteVideo.setEnabled(false);
mMuteVideo.setChecked(false);
}
});
}
});
/**
* Add handler for incoming call
*/
session.on(new IncomingCallEvent() {
@Override
public void onCall(final Call call) {
call.on(callStatusEvent);
/**
* Display UI alert for the new incoming call
*/
runOnUiThread(new Runnable() {
@Override
public void run() {
AlertDialog.Builder builder = new AlertDialog.Builder(PhoneMinVideoActivity.this);
builder.setTitle("Incoming call");
builder.setMessage("Incoming call from '" + call.getCaller() + "'");
builder.setPositiveButton("Answer", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
PhoneMinVideoActivity.this.call = call;
ActivityCompat.requestPermissions(PhoneMinVideoActivity.this, new String[] { Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA }, INCOMING_CALL_REQUEST_CODE);
}
});
builder.setNegativeButton("Hangup", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
call.hangup();
incomingCallAlert = null;
}
});
incomingCallAlert = builder.show();
}
});
}
});
mConnectButton.setEnabled(false);
/**
* Connection containing SIP details
*/
Connection connection = new Connection();
connection.setSipLogin(mSipLoginView.getText().toString());
connection.setSipPassword(mSipPasswordView.getText().toString());
connection.setSipDomain(mSipDomainView.getText().toString());
connection.setSipOutboundProxy(mSipDomainView.getText().toString());
connection.setSipPort(Integer.parseInt(mSipPortView.getText().toString()));
connection.setSipRegisterRequired(mSipRegisterRequiredView.isChecked());
session.connect(connection);
SharedPreferences sharedPref = PhoneMinVideoActivity.this.getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("wcs_url", mWcsUrlView.getText().toString());
editor.putString("sip_login", mSipLoginView.getText().toString());
editor.putString("sip_password", mSipPasswordView.getText().toString());
editor.putString("sip_domain", mSipDomainView.getText().toString());
editor.putString("sip_port", mSipPortView.getText().toString());
editor.putBoolean("sip_register_required", mSipRegisterRequiredView.isChecked());
editor.apply();
} else {
mConnectButton.setEnabled(false);
session.disconnect();
}
View currentFocus = getCurrentFocus();
if (currentFocus != null) {
InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(currentFocus.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
});
mCalleeView = (EditText) findViewById(R.id.callee);
mCalleeView.setText(sharedPref.getString("callee", getString(R.string.default_callee_name)));
mCallStatus = (TextView) findViewById(R.id.call_status);
mCallButton = (Button) findViewById(R.id.call_button);
/**
* Call button pressed
*/
mCallButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (mCallButton.getTag() == null || Integer.valueOf(R.string.action_call).equals(mCallButton.getTag())) {
if ("".equals(mCalleeView.getText().toString())) {
return;
}
ActivityCompat.requestPermissions(PhoneMinVideoActivity.this, new String[] { Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA }, CALL_REQUEST_CODE);
SharedPreferences sharedPref = PhoneMinVideoActivity.this.getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("callee", mCalleeView.getText().toString());
editor.apply();
} else {
mCallButton.setEnabled(false);
call.hangup();
call = null;
}
View currentFocus = getCurrentFocus();
if (currentFocus != null) {
InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(currentFocus.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
});
mHoldButton = (Button) findViewById(R.id.hold_button);
/**
* Hold or Unhold button pressed
* Hold the call if the call is ESTABLISHED.
* Unhold the call if the call is on hold.
*/
mHoldButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (mHoldButton.getTag() == null || Integer.valueOf(R.string.action_hold).equals(mHoldButton.getTag())) {
call.hold();
mHoldButton.setText(R.string.action_unhold);
mHoldButton.setTag(R.string.action_unhold);
} else {
call.unhold();
mHoldButton.setText(R.string.action_hold);
mHoldButton.setTag(R.string.action_hold);
}
}
});
mMuteAudio = (Switch) findViewById(R.id.mute_audio);
/**
* Mute or Unmute audio for the SIP call
* Mute if it is not muted.
* Unmute if it is muted.
*/
mMuteAudio.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (call != null) {
if (isChecked) {
call.muteAudio();
} else {
call.unmuteAudio();
}
}
}
});
mMuteVideo = (Switch) findViewById(R.id.mute_video);
/**
* Mute or Unmute video for the SIP call
* Mute if it is not muted.
* Unmute if it is muted.
*/
mMuteVideo.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (call != null) {
if (isChecked) {
call.muteVideo();
} else {
call.unmuteVideo();
}
}
}
});
/**
* Set local and remote renderer objects
*/
localRender = (SurfaceViewRenderer) findViewById(R.id.local_video_view);
remoteRender = (SurfaceViewRenderer) findViewById(R.id.remote_video_view);
PercentFrameLayout localRenderLayout = (PercentFrameLayout) findViewById(R.id.local_video_layout);
PercentFrameLayout remoteRenderLayout = (PercentFrameLayout) findViewById(R.id.remote_video_layout);
localRender.setZOrderMediaOverlay(true);
remoteRenderLayout.setPosition(0, 0, 100, 100);
remoteRender.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FIT);
remoteRender.setMirror(false);
remoteRender.requestLayout();
localRenderLayout.setPosition(0, 0, 100, 100);
localRender.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FIT);
localRender.setMirror(true);
localRender.requestLayout();
}
use of com.flashphoner.fpwcsapi.layout.PercentFrameLayout in project wcs-android-sdk-samples by flashphoner.
the class VideoChatActivity method onCreate.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_conference);
/**
* Initialization of the API.
*/
Flashphoner.init(this);
mParticipantVolume = (SeekBar) findViewById(R.id.participant_volume);
mParticipantVolume.setMax(Flashphoner.getMaxVolume());
mParticipantVolume.setProgress(Flashphoner.getVolume());
mParticipantVolume.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
Flashphoner.setVolume(i);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
mWcsUrlView = (EditText) findViewById(R.id.wcs_url);
SharedPreferences sharedPref = this.getPreferences(Context.MODE_PRIVATE);
mWcsUrlView.setText(sharedPref.getString("wcs_url", getString(R.string.wcs_url)));
mLoginView = (EditText) findViewById(R.id.login);
mLoginView.setText(sharedPref.getString("login", ""));
mConnectStatus = (TextView) findViewById(R.id.connect_status);
mConnectButton = (Button) findViewById(R.id.connect_button);
/**
* Connection to server will be established when Connect button is clicked.
*/
mConnectButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (mConnectButton.getTag() == null || Integer.valueOf(R.string.action_connect).equals(mConnectButton.getTag())) {
/**
* The connection options are set.
* WCS server URL and user name are passed when RoomManagerOptions object is created.
*/
RoomManagerOptions roomManagerOptions = new RoomManagerOptions(mWcsUrlView.getText().toString(), mLoginView.getText().toString());
/**
* RoomManager object is created with method createRoomManager().
* Connection session is created when RoomManager object is created.
*/
roomManager = Flashphoner.createRoomManager(roomManagerOptions);
/**
* Callback functions for connection status events are added to make appropriate changes in controls of the interface when connection is established and closed.
*/
roomManager.on(new RoomManagerEvent() {
@Override
public void onConnected(final Connection connection) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mConnectButton.setText(R.string.action_disconnect);
mConnectButton.setTag(R.string.action_disconnect);
mConnectButton.setEnabled(true);
mConnectStatus.setText(connection.getStatus());
mJoinButton.setEnabled(true);
}
});
}
@Override
public void onDisconnection(final Connection connection) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mConnectButton.setText(R.string.action_connect);
mConnectButton.setTag(R.string.action_connect);
mConnectButton.setEnabled(true);
mJoinButton.setText(R.string.action_join);
mJoinButton.setTag(R.string.action_join);
mJoinButton.setEnabled(false);
mPublishStatus.setText("");
mPublishButton.setText(R.string.action_publish);
mPublishButton.setTag(R.string.action_publish);
mPublishButton.setEnabled(false);
mMuteAudio.setEnabled(false);
mMuteAudio.setChecked(false);
mMuteVideo.setEnabled(false);
mMuteVideo.setChecked(false);
stream = null;
mConnectStatus.setText(connection.getStatus());
Iterator<Map.Entry<String, ParticipantView>> i = busyViews.entrySet().iterator();
while (i.hasNext()) {
Map.Entry<String, ParticipantView> e = i.next();
e.getValue().login.setText("NONE");
e.getValue().surfaceViewRenderer.release();
i.remove();
freeViews.add(e.getValue());
}
mSendButton.setEnabled(false);
}
});
}
});
mConnectButton.setEnabled(false);
SharedPreferences sharedPref = VideoChatActivity.this.getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("wcs_url", mWcsUrlView.getText().toString());
editor.putString("login", mLoginView.getText().toString());
editor.apply();
} else {
mConnectButton.setEnabled(false);
/**
* Connection to WCS server is closed with method RoomManager.disconnect().
*/
roomManager.disconnect();
}
View currentFocus = getCurrentFocus();
if (currentFocus != null) {
InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(currentFocus.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
});
mJoinRoomView = (EditText) findViewById(R.id.join_room);
mJoinRoomView.setText(sharedPref.getString("join_room", ""));
mJoinStatus = (TextView) findViewById(R.id.join_status);
mJoinButton = (Button) findViewById(R.id.join_button);
/**
* The participant will join to video chat room when Join button is clicked.
*/
mJoinButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
mJoinButton.setEnabled(false);
if (mJoinButton.getTag() == null || Integer.valueOf(R.string.action_join).equals(mJoinButton.getTag())) {
/**
* Room name is set with method RoomOptions.setName().
*/
RoomOptions roomOptions = new RoomOptions();
roomOptions.setName(mJoinRoomView.getText().toString());
/**
* The participant joins a video chat room with method RoomManager.join().
* RoomOptions object is passed to the method.
* Room object is created and returned by the method.
*/
room = roomManager.join(roomOptions);
/**
* Callback functions for events occurring in video chat room are added.
* If the event is related to actions performed by one of the other participants, Participant object with data of that participant is passed to the corresponding function.
*/
room.on(new RoomEvent() {
@Override
public void onState(final Room room) {
/**
* After joining, Room object with data of the room is received.
* Method Room.getParticipants() is used to check the number of already connected participants.
* The method returns collection of Participant objects.
* The collection size is determined, and, if the maximum allowed number (in this case, three) has already been reached, the user leaves the room with method Room.leave().
*/
if (room.getParticipants().size() >= 2) {
room.leave(null);
runOnUiThread(new Runnable() {
@Override
public void run() {
mJoinStatus.setText("Room is full");
mJoinButton.setEnabled(true);
}
});
return;
}
final StringBuffer chatState = new StringBuffer("participants: ");
/**
* Iterating through the collection of the other participants returned by method Room.getParticipants().
* There is corresponding Participant object for each participant.
*/
for (final Participant participant : room.getParticipants()) {
/**
* A player view is assigned to each of the other participants in the room.
*/
final ParticipantView participantView = freeViews.poll();
if (participantView != null) {
chatState.append(participant.getName()).append(",");
busyViews.put(participant.getName(), participantView);
/**
* Playback of the stream being published by the other participant is started with method Participant.play().
* SurfaceViewRenderer to be used to display the video stream is passed when the method is called.
*/
participant.play(participantView.surfaceViewRenderer);
runOnUiThread(new Runnable() {
@Override
public void run() {
participantView.login.setText(participant.getName());
}
});
}
}
runOnUiThread(new Runnable() {
@Override
public void run() {
mJoinButton.setText(R.string.action_leave);
mJoinButton.setTag(R.string.action_leave);
mJoinButton.setEnabled(true);
mJoinStatus.setText("");
mPublishButton.setEnabled(true);
mSendButton.setEnabled(true);
if (room.getParticipants().size() == 0) {
addMessageHistory("chat", "room is empty");
} else {
addMessageHistory("chat", chatState.substring(0, chatState.length() - 1));
}
}
});
}
@Override
public void onJoined(final Participant participant) {
/**
* When a new participant joins the room, a player view is assigned to that participant.
*/
final ParticipantView participantView = freeViews.poll();
if (participantView != null) {
runOnUiThread(new Runnable() {
@Override
public void run() {
participantView.login.setText(participant.getName());
addMessageHistory(participant.getName(), "joined");
}
});
busyViews.put(participant.getName(), participantView);
}
}
@Override
public void onLeft(final Participant participant) {
/**
* When one of the other participants leaves the room, player view assigned to that participant is freed.
*/
final ParticipantView participantView = busyViews.remove(participant.getName());
if (participantView != null) {
runOnUiThread(new Runnable() {
@Override
public void run() {
participantView.login.setText("NONE");
addMessageHistory(participant.getName(), "left");
participantView.surfaceViewRenderer.release();
}
});
freeViews.add(participantView);
}
}
@Override
public void onPublished(final Participant participant) {
/**
* When one of the other participants starts publishing, playback of the stream published by that participant is started.
*/
final ParticipantView participantView = busyViews.get(participant.getName());
if (participantView != null) {
participant.play(participantView.surfaceViewRenderer);
}
}
@Override
public void onFailed(Room room, final String info) {
room.leave(null);
runOnUiThread(new Runnable() {
@Override
public void run() {
mJoinStatus.setText(info);
mJoinButton.setEnabled(true);
}
});
}
@Override
public void onMessage(final Message message) {
/**
* When one of the participants sends a text message, the received message is added to the messages log.
*/
runOnUiThread(new Runnable() {
@Override
public void run() {
addMessageHistory(message.getFrom(), message.getText());
}
});
}
});
SharedPreferences sharedPref = VideoChatActivity.this.getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("join_room", mJoinRoomView.getText().toString());
editor.apply();
} else {
final Runnable action = new Runnable() {
@Override
public void run() {
mJoinButton.setEnabled(true);
mJoinButton.setText(R.string.action_join);
mJoinButton.setTag(R.string.action_join);
mPublishButton.setEnabled(false);
mSendButton.setEnabled(false);
/**
* The player views assigned to the other participants are freed.
*/
Iterator<Map.Entry<String, ParticipantView>> i = busyViews.entrySet().iterator();
while (i.hasNext()) {
Map.Entry<String, ParticipantView> e = i.next();
e.getValue().login.setText("NONE");
e.getValue().surfaceViewRenderer.release();
i.remove();
freeViews.add(e.getValue());
}
}
};
/**
* The participant leaves the video chat room with method Room.leave().
*/
room.leave(new RestAppCommunicator.Handler() {
@Override
public void onAccepted(Data data) {
runOnUiThread(action);
}
@Override
public void onRejected(Data data) {
runOnUiThread(action);
}
});
}
View currentFocus = getCurrentFocus();
if (currentFocus != null) {
InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(currentFocus.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
});
mPublishStatus = (TextView) findViewById(R.id.publish_status);
mPublishButton = (Button) findViewById(R.id.publish_button);
/**
* The participant starts publishing video stream when Publish button is clicked.
*/
mPublishButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (mPublishButton.getTag() == null || Integer.valueOf(R.string.action_publish).equals(mPublishButton.getTag())) {
ActivityCompat.requestPermissions(VideoChatActivity.this, new String[] { Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA }, PUBLISH_REQUEST_CODE);
} else {
mPublishButton.setEnabled(false);
/**
* Stream is unpublished with method Room.unpublish().
*/
room.unpublish();
}
View currentFocus = getCurrentFocus();
if (currentFocus != null) {
InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(currentFocus.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
});
/**
* MuteAudio switch is used to mute/unmute audio of the published stream.
* Audio is muted with method Stream.muteAudio() and unmuted with method Stream.unmuteAudio().
*/
mMuteAudio = (Switch) findViewById(R.id.mute_audio);
mMuteAudio.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
stream.muteAudio();
} else {
stream.unmuteAudio();
}
}
});
/**
* MuteVideo switch is used to mute/unmute video of the published stream.
* Video is muted with method Stream.muteVideo() and unmuted with method Stream.unmuteVideo().
*/
mMuteVideo = (Switch) findViewById(R.id.mute_video);
mMuteVideo.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
stream.muteVideo();
} else {
stream.unmuteVideo();
}
}
});
localRenderer = (SurfaceViewRenderer) findViewById(R.id.local_video_view);
PercentFrameLayout localRenderLayout = (PercentFrameLayout) findViewById(R.id.local_video_layout);
localRenderLayout.setPosition(0, 0, 100, 100);
localRenderer.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FIT);
localRenderer.setMirror(true);
localRenderer.requestLayout();
SurfaceViewRenderer remote1Render = (SurfaceViewRenderer) findViewById(R.id.remote_video_view);
PercentFrameLayout remote1RenderLayout = (PercentFrameLayout) findViewById(R.id.remote_video_layout);
remote1RenderLayout.setPosition(0, 0, 100, 100);
remote1Render.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FIT);
remote1Render.setMirror(false);
remote1Render.requestLayout();
mParticipantName = (TextView) findViewById(R.id.participant_name);
freeViews.add(new ParticipantView(remote1Render, mParticipantName));
mMessageHistory = (TextView) findViewById(R.id.message_history);
mMessageHistory.setMovementMethod(new ScrollingMovementMethod());
mMessage = (EditText) findViewById(R.id.message);
mSendButton = (Button) findViewById(R.id.send_button);
mSendButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
String text = mMessage.getText().toString();
if (!"".equals(text)) {
for (Participant participant : room.getParticipants()) {
participant.sendMessage(text);
}
addMessageHistory(mLoginView.getText().toString(), text);
mMessage.setText("");
}
}
});
}
use of com.flashphoner.fpwcsapi.layout.PercentFrameLayout in project wcs-android-sdk-samples by flashphoner.
the class ConferenceActivity method onCreate.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_conference);
/**
* Initialization of the API.
*/
Flashphoner.init(this);
mParticipantVolume = (SeekBar) findViewById(R.id.participant_volume);
mParticipantVolume.setMax(Flashphoner.getMaxVolume());
mParticipantVolume.setProgress(Flashphoner.getVolume());
mParticipantVolume.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
Flashphoner.setVolume(i);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
mWcsUrlView = (EditText) findViewById(R.id.wcs_url);
SharedPreferences sharedPref = this.getPreferences(Context.MODE_PRIVATE);
mWcsUrlView.setText(sharedPref.getString("wcs_url", getString(R.string.wcs_url)));
mLoginView = (EditText) findViewById(R.id.login);
mLoginView.setText(sharedPref.getString("login", ""));
mConnectStatus = (TextView) findViewById(R.id.connect_status);
mConnectButton = (Button) findViewById(R.id.connect_button);
mRecord = (CheckBox) findViewById(R.id.record);
/**
* Connection to server will be established when Connect button is clicked.
*/
mConnectButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (mConnectButton.getTag() == null || Integer.valueOf(R.string.action_connect).equals(mConnectButton.getTag())) {
/**
* The connection options are set.
* WCS server URL and user name are passed when RoomManagerOptions object is created.
*/
RoomManagerOptions roomManagerOptions = new RoomManagerOptions(mWcsUrlView.getText().toString(), mLoginView.getText().toString());
/**
* RoomManager object is created with method createRoomManager().
* Connection session is created when RoomManager object is created.
*/
roomManager = Flashphoner.createRoomManager(roomManagerOptions);
/**
* Callback functions for connection status events are added to make appropriate changes in controls of the interface when connection is established and closed.
*/
roomManager.on(new RoomManagerEvent() {
@Override
public void onConnected(final Connection connection) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mConnectButton.setText(R.string.action_disconnect);
mConnectButton.setTag(R.string.action_disconnect);
mConnectButton.setEnabled(true);
mConnectStatus.setText(connection.getStatus());
mJoinButton.setEnabled(true);
}
});
}
@Override
public void onDisconnection(final Connection connection) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mConnectButton.setText(R.string.action_connect);
mConnectButton.setTag(R.string.action_connect);
mConnectButton.setEnabled(true);
mJoinButton.setText(R.string.action_join);
mJoinButton.setTag(R.string.action_join);
mJoinButton.setEnabled(false);
mPublishStatus.setText("");
mPublishButton.setText(R.string.action_publish);
mPublishButton.setTag(R.string.action_publish);
mPublishButton.setEnabled(false);
mMuteAudio.setEnabled(false);
mMuteAudio.setChecked(false);
mMuteVideo.setEnabled(false);
mMuteVideo.setChecked(false);
stream = null;
mConnectStatus.setText(connection.getStatus());
Iterator<Map.Entry<String, ParticipantView>> i = busyViews.entrySet().iterator();
while (i.hasNext()) {
Map.Entry<String, ParticipantView> e = i.next();
e.getValue().login.setText("NONE");
e.getValue().surfaceViewRenderer.release();
i.remove();
freeViews.add(e.getValue());
}
mSendButton.setEnabled(false);
}
});
}
});
mConnectButton.setEnabled(false);
SharedPreferences sharedPref = ConferenceActivity.this.getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("wcs_url", mWcsUrlView.getText().toString());
editor.putString("login", mLoginView.getText().toString());
editor.apply();
} else {
mConnectButton.setEnabled(false);
/**
* Connection to WCS server is closed with method RoomManager.disconnect().
*/
roomManager.disconnect();
}
View currentFocus = getCurrentFocus();
if (currentFocus != null) {
InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(currentFocus.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
});
mJoinRoomView = (EditText) findViewById(R.id.join_room);
mJoinRoomView.setText(sharedPref.getString("join_room", ""));
mJoinStatus = (TextView) findViewById(R.id.join_status);
mJoinButton = (Button) findViewById(R.id.join_button);
/**
* The participant will join to conference room when Join button is clicked.
*/
mJoinButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
mJoinButton.setEnabled(false);
if (mJoinButton.getTag() == null || Integer.valueOf(R.string.action_join).equals(mJoinButton.getTag())) {
/**
* Room name is set with method RoomOptions.setName().
*/
RoomOptions roomOptions = new RoomOptions();
roomOptions.setName(mJoinRoomView.getText().toString());
/**
* The participant joins a conference room with method RoomManager.join().
* RoomOptions object is passed to the method.
* Room object is created and returned by the method.
*/
room = roomManager.join(roomOptions);
/**
* Callback functions for events occurring in conference room are added.
* If the event is related to actions performed by one of the other participants, Participant object with data of that participant is passed to the corresponding function.
*/
room.on(new RoomEvent() {
@Override
public void onState(final Room room) {
/**
* After joining, Room object with data of the room is received.
* Method Room.getParticipants() is used to check the number of already connected participants.
* The method returns collection of Participant objects.
* The collection size is determined, and, if the maximum allowed number (in this case, three) has already been reached, the user leaves the room with method Room.leave().
*/
if (room.getParticipants().size() >= 3) {
room.leave(null);
runOnUiThread(new Runnable() {
@Override
public void run() {
mJoinStatus.setText("Room is full");
mJoinButton.setEnabled(true);
}
});
return;
}
final StringBuffer chatState = new StringBuffer("participants: ");
/**
* Iterating through the collection of the other participants returned by method Room.getParticipants().
* There is corresponding Participant object for each participant.
*/
for (final Participant participant : room.getParticipants()) {
/**
* A player view is assigned to each of the other participants in the room.
*/
final ParticipantView participantView = freeViews.poll();
if (participantView != null) {
chatState.append(participant.getName()).append(",");
busyViews.put(participant.getName(), participantView);
/**
* Playback of the stream being published by the other participant is started with method Participant.play().
* SurfaceViewRenderer to be used to display the video stream is passed when the method is called.
*/
participant.play(participantView.surfaceViewRenderer);
runOnUiThread(new Runnable() {
@Override
public void run() {
participantView.login.setText(participant.getName());
}
});
}
}
runOnUiThread(new Runnable() {
@Override
public void run() {
mJoinButton.setText(R.string.action_leave);
mJoinButton.setTag(R.string.action_leave);
mJoinButton.setEnabled(true);
mJoinStatus.setText("");
mPublishButton.setEnabled(true);
mSendButton.setEnabled(true);
if (room.getParticipants().size() == 0) {
addMessageHistory("chat", "room is empty");
} else {
addMessageHistory("chat", chatState.substring(0, chatState.length() - 1));
}
}
});
}
@Override
public void onJoined(final Participant participant) {
/**
* When a new participant joins the room, a player view is assigned to that participant.
*/
final ParticipantView participantView = freeViews.poll();
if (participantView != null) {
runOnUiThread(new Runnable() {
@Override
public void run() {
participantView.login.setText(participant.getName());
addMessageHistory(participant.getName(), "joined");
}
});
busyViews.put(participant.getName(), participantView);
}
}
@Override
public void onLeft(final Participant participant) {
/**
* When one of the other participants leaves the room, player view assigned to that participant is freed.
*/
final ParticipantView participantView = busyViews.remove(participant.getName());
if (participantView != null) {
runOnUiThread(new Runnable() {
@Override
public void run() {
participantView.login.setText("NONE");
addMessageHistory(participant.getName(), "left");
participantView.surfaceViewRenderer.release();
}
});
freeViews.add(participantView);
}
}
@Override
public void onPublished(final Participant participant) {
/**
* When one of the other participants starts publishing, playback of the stream published by that participant is started.
*/
final ParticipantView participantView = busyViews.get(participant.getName());
if (participantView != null) {
participant.play(participantView.surfaceViewRenderer);
}
}
@Override
public void onFailed(Room room, final String info) {
room.leave(null);
runOnUiThread(new Runnable() {
@Override
public void run() {
mJoinStatus.setText(info);
mJoinButton.setEnabled(true);
}
});
}
@Override
public void onMessage(final Message message) {
/**
* When one of the participants sends a text message, the received message is added to the messages log.
*/
runOnUiThread(new Runnable() {
@Override
public void run() {
addMessageHistory(message.getFrom(), message.getText());
}
});
}
});
SharedPreferences sharedPref = ConferenceActivity.this.getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("join_room", mJoinRoomView.getText().toString());
editor.apply();
} else {
final Runnable action = new Runnable() {
@Override
public void run() {
mJoinButton.setEnabled(true);
mJoinButton.setText(R.string.action_join);
mJoinButton.setTag(R.string.action_join);
mPublishButton.setEnabled(false);
mSendButton.setEnabled(false);
/**
* The player views assigned to the other participants are freed.
*/
Iterator<Map.Entry<String, ParticipantView>> i = busyViews.entrySet().iterator();
while (i.hasNext()) {
Map.Entry<String, ParticipantView> e = i.next();
e.getValue().login.setText("NONE");
e.getValue().surfaceViewRenderer.release();
i.remove();
freeViews.add(e.getValue());
}
}
};
/**
* The participant leaves the conference room with method Room.leave().
*/
room.leave(new RestAppCommunicator.Handler() {
@Override
public void onAccepted(Data data) {
runOnUiThread(action);
}
@Override
public void onRejected(Data data) {
runOnUiThread(action);
}
});
}
View currentFocus = getCurrentFocus();
if (currentFocus != null) {
InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(currentFocus.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
});
mPublishStatus = (TextView) findViewById(R.id.publish_status);
mPublishButton = (Button) findViewById(R.id.publish_button);
/**
* The participant starts publishing video stream when Publish button is clicked.
*/
mPublishButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (mPublishButton.getTag() == null || Integer.valueOf(R.string.action_publish).equals(mPublishButton.getTag())) {
ActivityCompat.requestPermissions(ConferenceActivity.this, new String[] { Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA }, PUBLISH_REQUEST_CODE);
} else {
mPublishButton.setEnabled(false);
/**
* Stream is unpublished with method Room.unpublish().
*/
room.unpublish();
}
View currentFocus = getCurrentFocus();
if (currentFocus != null) {
InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(currentFocus.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
});
/**
* MuteAudio switch is used to mute/unmute audio of the published stream.
* Audio is muted with method Stream.muteAudio() and unmuted with method Stream.unmuteAudio().
*/
mMuteAudio = (Switch) findViewById(R.id.mute_audio);
mMuteAudio.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
stream.muteAudio();
} else {
stream.unmuteAudio();
}
}
});
/**
* MuteVideo switch is used to mute/unmute video of the published stream.
* Video is muted with method Stream.muteVideo() and unmuted with method Stream.unmuteVideo().
*/
mMuteVideo = (Switch) findViewById(R.id.mute_video);
mMuteVideo.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
stream.muteVideo();
} else {
stream.unmuteVideo();
}
}
});
localRenderer = (SurfaceViewRenderer) findViewById(R.id.local_video_view);
PercentFrameLayout localRenderLayout = (PercentFrameLayout) findViewById(R.id.local_video_layout);
localRenderLayout.setPosition(0, 0, 100, 100);
localRenderer.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FIT);
localRenderer.setMirror(true);
localRenderer.requestLayout();
SurfaceViewRenderer remote1Render = (SurfaceViewRenderer) findViewById(R.id.remote1_video_view);
PercentFrameLayout remote1RenderLayout = (PercentFrameLayout) findViewById(R.id.remove1_video_layout);
remote1RenderLayout.setPosition(0, 0, 100, 100);
remote1Render.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FIT);
remote1Render.setMirror(false);
remote1Render.requestLayout();
SurfaceViewRenderer remote2Render = (SurfaceViewRenderer) findViewById(R.id.remote2_video_view);
PercentFrameLayout remote2RenderLayout = (PercentFrameLayout) findViewById(R.id.remote2_video_layout);
remote2RenderLayout.setPosition(0, 0, 100, 100);
remote2Render.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FIT);
remote2Render.setMirror(false);
remote2Render.requestLayout();
mParticipant1Name = (TextView) findViewById(R.id.participant1_name);
freeViews.add(new ParticipantView(remote1Render, mParticipant1Name));
mParticipant2Name = (TextView) findViewById(R.id.participant2_name);
freeViews.add(new ParticipantView(remote2Render, mParticipant2Name));
mMessageHistory = (TextView) findViewById(R.id.message_history);
mMessageHistory.setMovementMethod(new ScrollingMovementMethod());
mMessage = (EditText) findViewById(R.id.message);
mSendButton = (Button) findViewById(R.id.send_button);
mSendButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
String text = mMessage.getText().toString();
if (!"".equals(text)) {
for (Participant participant : room.getParticipants()) {
participant.sendMessage(text);
}
addMessageHistory(mLoginView.getText().toString(), text);
mMessage.setText("");
}
}
});
}
Aggregations