From 32ab7703ed7166aaae8f7fca62f95a2137f967ee Mon Sep 17 00:00:00 2001 From: Ergyun Syuleyman Date: Thu, 4 Jun 2020 17:44:59 +0300 Subject: [PATCH] NY-10129: [AN]: Make back camera to not be mirorred --- app/build.gradle | 4 +-- .../data/sdk/ConferenceSDKPresenter.java | 3 +++ .../data/sdk/calls/ActiveConferenceCall.java | 6 +++++ .../data/sdk/calls/ConferenceSDKListener.java | 3 +++ .../data/sdk/calls/ConferenceSDKModule.java | 13 ++++++++++ .../presenters/ConferenceCallPresenter.java | 7 ++++++ .../communicator/mvp/view/CallView.java | 4 +++ .../conference/ConferenceCallFragment.java | 25 ++++++++++++++++++- 8 files changed, 62 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index dec91bee46..37883ecf7c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -679,8 +679,8 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" // Conference, Calls mobile SDK - implementation 'com.nynja.sdk:NynjaSdk:1.21.5@aar' - //implementation(name: 'NynjaSdk-1.21.5', ext: 'aar') + implementation 'com.nynja.sdk:NynjaSdk:1.22.2.1@aar' + //implementation(name: 'NynjaSdk-1.22.2', ext: 'aar') //ExoPlayer implementation 'com.google.android.exoplayer:exoplayer-core:2.9.6' diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/sdk/ConferenceSDKPresenter.java b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/ConferenceSDKPresenter.java index cf1044ccef..3db6746b71 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/data/sdk/ConferenceSDKPresenter.java +++ b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/ConferenceSDKPresenter.java @@ -8,6 +8,7 @@ import com.nynja.mobile.communicator.mvp.presenters.BaseErrorPresenter; import com.nynja.mobile.communicator.mvp.view.ErrorMvpView; import com.nynja.sdk.NYNCall; import com.nynja.sdk.NYNCallHistoryCode; +import com.nynja.sdk.WebRtcVideoDevicePosition; import java.util.ArrayList; @@ -100,4 +101,6 @@ public abstract class ConferenceSDKPresenter extends Bas @Override public void showPurchaseDialog(boolean isModerator, final String message) {} @Override public void onPurchaseFinished() {} + + @Override public void onCameraSwitched(WebRtcVideoDevicePosition devicePosition) {} } diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ActiveConferenceCall.java b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ActiveConferenceCall.java index d613e9b7b8..119a276347 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ActiveConferenceCall.java +++ b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ActiveConferenceCall.java @@ -7,6 +7,7 @@ import com.nynja.mobile.communicator.utils.StringUtils; import com.nynja.sdk.NYNCall; import com.nynja.sdk.NYNCallParticipant; import com.nynja.sdk.NYNCallRoomType; +import com.nynja.sdk.WebRtcVideoDevicePosition; import java.util.ArrayList; @@ -139,6 +140,11 @@ public class ActiveConferenceCall extends ActiveCallBase { || mIsAdHock); // WORKAROUND SERVER SIDE ISSUE- sometime is missing 'mConference.roomType()' !!!!!!! } + public boolean isBackCamera() { + return (mConference != null && mConference.isCameraRunning() + && mConference.getCameraDevicePosition() == WebRtcVideoDevicePosition.WebRtcVideoDevicePositionBack); + } + public boolean isConference() { return (mConference != null && (mConference.isConference() || mCallType == CallType.ConferenceCall)); diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ConferenceSDKListener.java b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ConferenceSDKListener.java index b6bbde5325..9f02aea1b9 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ConferenceSDKListener.java +++ b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ConferenceSDKListener.java @@ -3,6 +3,7 @@ package com.nynja.mobile.communicator.data.sdk.calls; import com.nynja.mobile.communicator.data.conference.ActiveCallBase; import com.nynja.sdk.NYNCall; import com.nynja.sdk.NYNCallHistoryCode; +import com.nynja.sdk.WebRtcVideoDevicePosition; import java.util.ArrayList; @@ -85,4 +86,6 @@ public interface ConferenceSDKListener { void showPurchaseDialog(boolean isModerator, final String message); void onPurchaseFinished(); + + void onCameraSwitched(WebRtcVideoDevicePosition devicePosition); } 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 791a9ce7c1..11b1afc425 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 @@ -66,6 +66,7 @@ import com.nynja.sdk.NYNConfMemberOption; import com.nynja.sdk.NYNError; import com.nynja.sdk.NynjaCallHistoryManager; import com.nynja.sdk.NynjaCommunicator; +import com.nynja.sdk.WebRtcVideoDevicePosition; import org.appspot.apprtc.AppRTCAudioManager; import org.webrtc.ContextUtils; @@ -871,6 +872,18 @@ public class ConferenceSDKModule extends BaseSDKModule { onStartCapturerFailed(call, code, true); } } + + public void onCameraSwitched(WebRtcVideoDevicePosition devicePosition) { + Timber.d("onCameraSwitched(): devicePosition=" + devicePosition); + new Handler(Looper.getMainLooper()).post(() -> { + 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 57fd65d479..00dbd83a23 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 @@ -18,6 +18,7 @@ import com.nynja.mobile.communicator.data.sdk.calls.ConferenceSDKListener; import com.nynja.mobile.communicator.mvp.view.CallView; import com.nynja.mobile.communicator.utils.navigation.navigators.HomeNavigator; import com.nynja.sdk.NYNCallParticipant; +import com.nynja.sdk.WebRtcVideoDevicePosition; import org.jetbrains.annotations.NotNull; @@ -268,6 +269,7 @@ public class ConferenceCallPresenter extends ConferenceSDKPresenter getViewState().onConferenceRinging(); } + @Override public void onConferenceConnected(ActiveConferenceCall activeConferenceCall) { if (getAttachedViews().size() == 0) return; @@ -426,6 +428,11 @@ public class ConferenceCallPresenter extends ConferenceSDKPresenter getViewState().updateMicrophonState(isMuted); } + @Override public void onCameraSwitched(WebRtcVideoDevicePosition devicePosition) { + if (getAttachedViews().size() == 0) return; + getViewState().onCameraSwitched(devicePosition); + } + public void onClickPortOut() { //TODO StasS implement it } diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/view/CallView.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/view/CallView.java index da0f547e22..8f5e6c8173 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/mvp/view/CallView.java +++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/view/CallView.java @@ -7,6 +7,7 @@ import com.nynja.mobile.communicator.data.sdk.calls.ActiveConferenceCall; import com.nynja.mobile.communicator.data.sdk.calls.ConferenceListItem; import com.nynja.mobile.communicator.data.models.nynjamodels.ContactModel; import com.nynja.mobile.communicator.data.models.nynjamodels.RoomModel; +import com.nynja.sdk.WebRtcVideoDevicePosition; import java.util.ArrayList; @@ -90,4 +91,7 @@ public interface CallView extends ErrorMvpView { void continueWithScreenshare(); + void onCameraSwitched(WebRtcVideoDevicePosition devicePosition); + + } diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/conference/ConferenceCallFragment.java b/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/conference/ConferenceCallFragment.java index 3441886a6b..36b0d2de6a 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/conference/ConferenceCallFragment.java +++ b/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/conference/ConferenceCallFragment.java @@ -55,6 +55,7 @@ import com.nynja.mobile.communicator.utils.ImageUtils; import com.nynja.mobile.communicator.utils.PermissionHelper; import com.nynja.mobile.communicator.utils.StringUtils; import com.nynja.mobile.communicator.utils.iap.InAppPurchaseManager; +import com.nynja.sdk.WebRtcVideoDevicePosition; import org.webrtc.ContextUtils; import org.webrtc.EglBase; @@ -915,6 +916,12 @@ public class ConferenceCallFragment extends BaseFragment implements CallView, } } + @Override public void onCameraSwitched(WebRtcVideoDevicePosition devicePosition) { + if (isAdded()) { + updateLocalFeedMirrorState(devicePosition == WebRtcVideoDevicePosition.WebRtcVideoDevicePositionBack); + } + } + public boolean onBackPressed() { mConferencePresenter.hangUp(); return true; @@ -1303,7 +1310,7 @@ public class ConferenceCallFragment extends BaseFragment implements CallView, videoRemote.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FIT); videoLocal.setZOrderMediaOverlay(true); videoLocal.setEnableHardwareScaler(true); - videoLocal.setMirror(true); + videoLocal.setMirror(!activeConferenceCall.isBackCamera()); videoRemote.setEnableHardwareScaler(true); mIsRenderersInitialized = true; } catch (Exception ex) { @@ -1351,6 +1358,21 @@ public class ConferenceCallFragment extends BaseFragment implements CallView, removeRemoteVideoRenderer(activeConferenceCall, activeConferenceCall.mData.mRemoteVideoTrackId); } + private synchronized void updateLocalFeedMirrorState(ActiveConferenceCall activeConferenceCall) { + if (!mIsRenderersInitialized) return; + if (activeConferenceCall == null) return; + updateLocalFeedMirrorState(activeConferenceCall.isBackCamera()); + } + + private synchronized void updateLocalFeedMirrorState(boolean isBackCamera) { + if (!mIsRenderersInitialized) return; + if (videoLocal != null) { + videoLocal.setMirror(!isBackCamera); + videoLocal.invalidate(); + videoLocal.refreshDrawableState(); + } + } + private void setLocalVideoRenderer(ActiveConferenceCall activeConferenceCall) { if (!mIsRenderersInitialized) return; if (activeConferenceCall == null) return; @@ -1358,6 +1380,7 @@ public class ConferenceCallFragment extends BaseFragment implements CallView, if (activeConferenceCall.mConference == null) return; if (!activeConferenceCall.isVideoEnabled) return; + updateLocalFeedMirrorState(activeConferenceCall); activeConferenceCall.mConference.setLocalVideoRenderer(videoLocal); } -- GitLab