From a8d2a7741ef837ba55d5158d3821b4800f531230 Mon Sep 17 00:00:00 2001 From: Ergyun Syuleyman Date: Mon, 15 Jun 2020 20:03:20 +0300 Subject: [PATCH] -fixed preview renderer mirroring case on back/front camera switch in conference calls --- .../conference/ConferenceVideoModule.java | 10 +++++++--- .../data/sdk/calls/CallStateData.java | 2 ++ .../data/sdk/calls/ConferenceListItem.java | 13 +++++++++--- .../data/sdk/calls/ConferenceSDKModule.java | 3 +++ .../presenters/ConferenceCallPresenter.java | 10 +++++++--- .../presenters/ConferenceVideoPresenter.java | 9 +++++++++ .../conference/ConferenceVideoItemVh.java | 20 ++++++++++++++++++- 7 files changed, 57 insertions(+), 10 deletions(-) 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 4af37d954e..7842c83c65 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 9775359f09..a5c102e44d 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 7b3b85da4e..a906ec6b77 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 9684a86806..c886edf771 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 58616b7101..65f8ea6f63 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 c1e6df26d1..5e7a742bc0 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); -- GitLab