diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/conference/ConferenceVideoModule.java b/app/src/main/java/com/nynja/mobile/communicator/data/conference/ConferenceVideoModule.java index 4af37d954e7068e09a69cdb8d499a2d8f98ff2c1..7842c83c6552d82050dc8d0e19bd400f7b45f24b 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/data/conference/ConferenceVideoModule.java +++ b/app/src/main/java/com/nynja/mobile/communicator/data/conference/ConferenceVideoModule.java @@ -98,7 +98,9 @@ public class ConferenceVideoModule { if (activeConferenceCall.mData.mParticipantArray != null) { for (int index = 0; index < activeConferenceCall.mData.mParticipantArray.size(); index++) { NYNCallParticipant participant = activeConferenceCall.mData.mParticipantArray.get(index); - ConferenceListItem item = conferenceParticipant(participant, participant.isOwner(), activeConferenceCall.mState.isOwnStreamActive); + ConferenceListItem item = conferenceParticipant(participant, participant.isOwner(), + activeConferenceCall.mState.isOwnStreamActive, + activeConferenceCall.mState.isBackCamera); tempParticipants.add(item); if (//participant.hasVideo() || activeConferenceCall.mData.mActiveParticipanTracks.containsValue(participant.getParticipantId())) { @@ -308,9 +310,11 @@ public class ConferenceVideoModule { protected ConferenceListItem conferenceParticipant(NYNCallParticipant participant, boolean isModerator, - boolean isOwnStreamActive) { + boolean isOwnStreamActive, + boolean isBackCamera) { ContactModel user = mDataManager.getContactsByPhoneId(participant.getAddress()); - ConferenceListItem conferenceListItem = ConferenceListItem.fromSdkParticipant(participant, (user != null), isOwnStreamActive); + ConferenceListItem conferenceListItem = ConferenceListItem.fromSdkParticipant(participant, (user != null), + isOwnStreamActive, isBackCamera); if (user != null) { conferenceListItem.avatar = user.avatar; } diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/CallStateData.java b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/CallStateData.java index 9775359f091ca7a8a255d76e355fd7dffe51cebf..a5c102e44d549d17abd69451452c809b1e14ce1c 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/CallStateData.java +++ b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/CallStateData.java @@ -14,6 +14,7 @@ public class CallStateData { public boolean isSpeakerOn; public boolean isOwnSSActive; public boolean isOwnStreamActive; + public boolean isBackCamera; public AudioRouteType mAudioRouteType; //////////////////////////////////////////////// @@ -63,6 +64,7 @@ public class CallStateData { isSpeakerOn = false; isOwnSSActive = false; isOwnStreamActive = false; + isBackCamera = false; mAudioRouteType = AudioRouteType.NOT_SET; } } diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ConferenceListItem.java b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ConferenceListItem.java index 7b3b85da4e44c3f9c26382d05020509593c7b5ed..a906ec6b772dda8f0f9625cbfefcd81ba818f973 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ConferenceListItem.java +++ b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ConferenceListItem.java @@ -41,6 +41,7 @@ public class ConferenceListItem extends Object { public int isTrackActive; public boolean isVideoFullScreen; public boolean isSpeaking; + public boolean isBackCamera; protected ConferenceListItem() { phoneId = ""; @@ -58,6 +59,7 @@ public class ConferenceListItem extends Object { isTrackActive = 0; isVideoFullScreen = false; isSpeaking = false; + isBackCamera = false; } protected ConferenceListItem(ConferenceItemType type, String phoneId, String memberId, @@ -81,11 +83,13 @@ public class ConferenceListItem extends Object { this.isTrackActive = 0; this.isVideoFullScreen = false; this.isSpeaking = false; + this.isBackCamera = false; } protected ConferenceListItem(ConferenceItemType type, NYNCallParticipant participant, boolean isFriend, - boolean isOwnStreamActive) { + boolean isOwnStreamActive, + boolean isBackCamera) { this.type = type; this.phoneId = participant.getAddress(); this.memberId = participant.getMemberId(); @@ -104,6 +108,7 @@ public class ConferenceListItem extends Object { this.isSpeaking = participant.isSpeaking(); this.isTrackActive = 0; this.isVideoFullScreen = false; + this.isBackCamera = (isMe && isBackCamera); } @Override @@ -139,6 +144,7 @@ public class ConferenceListItem extends Object { this.isFriend = participant.isFriend; this.isMuted = participant.isMuted; this.isSpeaking = participant.isSpeaking; + this.isBackCamera = participant.isBackCamera; } private void setActions(ArrayList itemActions) { @@ -284,9 +290,10 @@ public class ConferenceListItem extends Object { public static ConferenceListItem fromSdkParticipant(NYNCallParticipant participant, boolean isFriend, - boolean isOwnStreamActive) { + boolean isOwnStreamActive, + boolean isBackCamera) { ConferenceListItem item = new ConferenceListItem( - ConferenceItemType.Participant, participant, isFriend, isOwnStreamActive); + ConferenceItemType.Participant, participant, isFriend, isOwnStreamActive, isBackCamera); return item; } diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ConferenceSDKModule.java b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ConferenceSDKModule.java index 9684a86806dae8b7778b21d89fef81d254b00e30..c886edf771f80c5d5e11eaa5e9243c8a56ed11f9 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ConferenceSDKModule.java +++ b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ConferenceSDKModule.java @@ -1019,6 +1019,9 @@ public class ConferenceSDKModule extends BaseSDKModule { public void onCameraSwitched(WebRtcVideoDevicePosition devicePosition) { Timber.d("onCameraSwitched(): devicePosition=" + devicePosition); new Handler(Looper.getMainLooper()).post(() -> { + if (mActiveConference != null) { + mActiveConference.mState.isBackCamera = (devicePosition == WebRtcVideoDevicePosition.WebRtcVideoDevicePositionBack); + } synchronized (mConferenceSDKListener) { for (ConferenceSDKListener sdkListener : mConferenceSDKListener) { sdkListener.onCameraSwitched(devicePosition); diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ConferenceCallPresenter.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ConferenceCallPresenter.java index 58616b7101380940f6b5adada635c5f75e8c3670..65f8ea6f63b6142c3c33241857673494b14633f7 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ConferenceCallPresenter.java +++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ConferenceCallPresenter.java @@ -310,9 +310,11 @@ public class ConferenceCallPresenter extends ConferenceSDKPresenter protected ConferenceListItem conferenceParticipant(NYNCallParticipant participant, boolean isModerator, - boolean isOwnStreamActive) { + boolean isOwnStreamActive, + boolean isBackCamera) { ContactModel user = mDataManager.getContactsByPhoneId(participant.getAddress()); - ConferenceListItem conferenceListItem = ConferenceListItem.fromSdkParticipant(participant, (user != null), isOwnStreamActive); + ConferenceListItem conferenceListItem = ConferenceListItem.fromSdkParticipant(participant, + (user != null), isOwnStreamActive, isBackCamera); if (user != null) { conferenceListItem.avatar = user.avatar; } @@ -329,7 +331,9 @@ public class ConferenceCallPresenter extends ConferenceSDKPresenter if (activeConferenceCall.mData.mParticipantArray != null) { for (int index = 0; index < activeConferenceCall.mData.mParticipantArray.size(); index++) { NYNCallParticipant participant = activeConferenceCall.mData.mParticipantArray.get(index); - members.add(conferenceParticipant(participant, participant.isOwner(), activeConferenceCall.mState.isOwnStreamActive)); + members.add(conferenceParticipant(participant, participant.isOwner(), + activeConferenceCall.mState.isOwnStreamActive, + activeConferenceCall.mState.isBackCamera)); } } else { for (int index = 0; index < activeConferenceCall.getMembers().size(); index++) { diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ConferenceVideoPresenter.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ConferenceVideoPresenter.java index c1e6df26d1cac0eed419d56da022dfbc715b7d05..5e7a742bc0749c419417f2eff78bcc16b599cc17 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ConferenceVideoPresenter.java +++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ConferenceVideoPresenter.java @@ -12,6 +12,7 @@ import com.nynja.mobile.communicator.data.sdk.calls.ConferenceSDKListener; import com.nynja.mobile.communicator.mvp.view.ConferenceVideoView; import com.nynja.mobile.communicator.utils.navigation.navigators.HomeNavigator; import com.nynja.sdk.NYNCallParticipant; +import com.nynja.sdk.WebRtcVideoDevicePosition; import java.util.ArrayList; @@ -176,6 +177,14 @@ public class ConferenceVideoPresenter extends ConferenceSDKPresenter { // Internal Helpers private void setupInConference(ConferenceListItem item) { Timber.d("ConferenceVideoItemVh::setupInConference(): item participant name=%s; ID=%s", mItem.name, mItem.participantId); + updateMyVideoCallRenderer(); initVideoCallRenderer(); if (item.participantId == null || !item.isActive) { // in Conference - but not joined yet @@ -239,7 +240,7 @@ public class ConferenceVideoItemVh extends BaseVH { mVideoFeed.setWillNotDraw(false); mVideoFeed.setEnableHardwareScaler(true); if (mItem != null && mItem.isMe) { - mVideoFeed.setMirror(true); + mVideoFeed.setMirror(!mItem.isBackCamera); } mIsRenderersInitialized = true; } catch (Exception ex) { @@ -247,6 +248,23 @@ public class ConferenceVideoItemVh extends BaseVH { } } + @Synchronized + private void updateMyVideoCallRenderer() { + Timber.d("ConferenceVideoItemVh::updateMyVideoCallRenderer(): item participant ID=%s; mIsRenderersInitialized=%s", mItem.participantId, mIsRenderersInitialized? "true":"false"); + try { + if (mIsRenderersInitialized) { + Timber.d("ConferenceVideoItemVh::updateMyVideoCallRenderer():2"); + if (mItem != null && mItem.isMe && mVideoFeed != null) { + mVideoFeed.setMirror(!mItem.isBackCamera); + mVideoFeed.invalidate(); + mVideoFeed.refreshDrawableState(); + } + } + } catch (Exception ex) { + Timber.e(ex); + } + } + @Synchronized private void setVideoRendererForTrack() { Timber.d("setVideoRendererForTrack::setVideoRendererForTrack(): item participant name=%s; ID=%s", mItem.name, mItem.participantId);