From 5b503b7f4e25463358e12c68c5200588b86d0b27 Mon Sep 17 00:00:00 2001 From: Krocks Date: Wed, 16 Aug 2017 13:46:28 +0300 Subject: [PATCH 01/29] fixed audio outgoing calls --- .../ui/activities/calls/CallActivity.java | 8 +- app/src/main/res/layout/activity_call.xml | 84 ++++++------------- .../main/res/layout/partial_audio_active.xml | 10 --- 3 files changed, 31 insertions(+), 71 deletions(-) diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java index d8b9c4d85f..8e23cd45a7 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java +++ b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java @@ -13,6 +13,7 @@ import android.widget.ImageView; import android.widget.TextView; import com.arellomobile.mvp.presenter.InjectPresenter; +import com.bumptech.glide.Glide; import com.nynja.mobile.communicator.R; import com.nynja.mobile.communicator.data.models.mqtt.Contact; import com.nynja.mobile.communicator.mvp.presenters.CallPresenter; @@ -61,11 +62,11 @@ public class CallActivity extends BaseActivity implements IEndpointListener, Cal @BindView(R.id.audio_active_mute) ImageView audioMute; @BindView(R.id.audio_active_speaker) ImageView audioSpeaker; @BindView(R.id.audio_active_text) ImageView audioText; - @BindView(R.id.audio_active_photo) ImageView userPhoto; @BindView(R.id.audio_active_duration) TextView audioDuration; @BindView(R.id.call_active_name) TextView name; @BindView(R.id.call_active_status) TextView status; + @BindView(R.id.call_active_user_photo) ImageView userPhoto; @BindView(R.id.audio_active_speaker_image) ImageView speakerImage; @BindView(R.id.audio_active_mute_image) ImageView muteImage; @@ -131,7 +132,7 @@ public class CallActivity extends BaseActivity implements IEndpointListener, Cal if (callInProgress) { audioIncomeLayout.setVisibility(View.VISIBLE); - name.setVisibility(View.VISIBLE ); + name.setVisibility(View.VISIBLE); } else { audioOutgoingLayout.setVisibility(View.VISIBLE); } @@ -239,7 +240,7 @@ public class CallActivity extends BaseActivity implements IEndpointListener, Cal } @Override public void onCallRinging() { - this.runOnUiThread(() -> audioDuration.setText("Call ringing")); + this.runOnUiThread(() -> status.setText("Call ringing")); } @Override public void onCallFailed(String description) { @@ -259,6 +260,7 @@ public class CallActivity extends BaseActivity implements IEndpointListener, Cal @Override public void setUser(Contact contact) { if (contact != null) { name.setText(contact.getFullName()); + Glide.with(this).load(contact.avatar).placeholder(R.drawable.avatar_placeholder).into(userPhoto); } } diff --git a/app/src/main/res/layout/activity_call.xml b/app/src/main/res/layout/activity_call.xml index 158a83d13b..506a0d6e0c 100644 --- a/app/src/main/res/layout/activity_call.xml +++ b/app/src/main/res/layout/activity_call.xml @@ -6,6 +6,15 @@ android:layout_height="match_parent" android:orientation="vertical"> + + + app:layout_constraintTop_toTopOf="parent" + android:layout_marginEnd="16dp" /> - + app:layout_constraintTop_toTopOf="parent" /> - - - - - - + app:layout_constraintTop_toTopOf="parent" /> - - - - - - - - - - - - - + app:layout_constraintTop_toTopOf="parent" /> - + app:layout_constraintTop_toTopOf="parent" + android:visibility="gone" /> diff --git a/app/src/main/res/layout/partial_audio_active.xml b/app/src/main/res/layout/partial_audio_active.xml index 5c2207143d..27c5283a63 100644 --- a/app/src/main/res/layout/partial_audio_active.xml +++ b/app/src/main/res/layout/partial_audio_active.xml @@ -17,16 +17,6 @@ app:layout_constraintTop_toTopOf="parent" tools:text="Name" /> - - Date: Wed, 16 Aug 2017 15:29:29 +0300 Subject: [PATCH 02/29] fixed video outgoing calls --- .../ui/activities/calls/CallActivity.java | 32 +++++++++++++------ app/src/main/res/layout/activity_call.xml | 29 +++++++++-------- 2 files changed, 37 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java index 8e23cd45a7..3aa46511eb 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java +++ b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java @@ -57,6 +57,7 @@ public class CallActivity extends BaseActivity implements IEndpointListener, Cal @BindView(R.id.video_active_remote) SurfaceViewRenderer videoRemote; @BindView(R.id.video_active_local) SurfaceViewRenderer videoLocal; + //audio controls @BindView(R.id.audio_active_hangup) ImageView audioHangUp; @BindView(R.id.audio_active_mute) ImageView audioMute; @@ -109,7 +110,7 @@ public class CallActivity extends BaseActivity implements IEndpointListener, Cal } private void showVideo() { - videoViewLayout.setVisibility(View.VISIBLE); + if (!mIsSpeakerPhoneEnabled) turnSpeaker(); //in case of starting call after callback @@ -120,8 +121,10 @@ public class CallActivity extends BaseActivity implements IEndpointListener, Cal videoIncomeLayout.setVisibility(View.VISIBLE); videoOutgoingLayout.setVisibility(View.GONE); name.setVisibility(View.GONE); + videoViewLayout.setVisibility(View.VISIBLE); } else { videoOutgoingLayout.setVisibility(View.VISIBLE); + videoViewLayout.setVisibility(View.GONE); } } @@ -184,12 +187,21 @@ public class CallActivity extends BaseActivity implements IEndpointListener, Cal microActive = audioWorking; } - @OnClick(R.id.video_active_switch_audio) + @OnClick({R.id.video_active_switch_audio, R.id.video_outcome_switch_audio}) void switchToAudio() { - if (videoViewLayout.getVisibility() == View.VISIBLE) { - mPresenter.sendVideo(true); + + if (callInProgress) { + if (videoViewLayout.getVisibility() == View.VISIBLE) { + mPresenter.sendVideo(false); + } else { + mPresenter.sendVideo(true); + } } else { - mPresenter.sendVideo(false); + mIsVideoEnabled = false; + if (videoOutgoingLayout.getVisibility() == View.VISIBLE) { + videoOutgoingLayout.setVisibility(View.GONE); + audioOutgoingLayout.setVisibility(View.VISIBLE); + } } } @@ -223,24 +235,24 @@ public class CallActivity extends BaseActivity implements IEndpointListener, Cal private void startCall() { mPresenter.startCall(callInProgress); - audioDuration.setText("call connecting"); + status.setText("call connecting"); } @Override public void onCallDisconnected() { - this.runOnUiThread(() -> audioDuration.setText("Call disconnected")); + this.runOnUiThread(() -> status.setText("Call disconnected")); } @Override public void onCallConnected() { this.runOnUiThread(() -> { - audioDuration.setText("call in progress"); + status.setText("call in progress"); callInProgress = true; initUI(); }); } @Override public void onCallRinging() { - this.runOnUiThread(() -> status.setText("Call ringing")); + this.runOnUiThread(() -> status.setText("Ringing...")); } @Override public void onCallFailed(String description) { @@ -252,7 +264,7 @@ public class CallActivity extends BaseActivity implements IEndpointListener, Cal if (mIsVideoEnabled) { videoDuration.setText(time); } else { - audioDuration.setText(getString(R.string.call_voice_call, time)); + status.setText(getString(R.string.call_voice_call, time)); } }); } diff --git a/app/src/main/res/layout/activity_call.xml b/app/src/main/res/layout/activity_call.xml index 506a0d6e0c..ed5adb3ee0 100644 --- a/app/src/main/res/layout/activity_call.xml +++ b/app/src/main/res/layout/activity_call.xml @@ -10,10 +10,11 @@ android:id="@+id/call_active_user_photo" android:layout_width="0dp" android:layout_height="0dp" - app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toRightOf="parent" /> + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:background="@drawable/avatar_placeholder" /> + app:layout_constraintTop_toTopOf="parent" /> @@ -79,16 +80,16 @@ app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> - + Date: Wed, 16 Aug 2017 16:03:15 +0300 Subject: [PATCH 03/29] fixes to vox accepting audio --- .../communicator/data/voximplant/VoxImplantModule.java | 6 +++--- .../communicator/ui/activities/calls/CallActivity.java | 10 ++++++++-- .../ui/activities/calls/IncomeCallActivity.java | 6 +++--- app/src/main/res/layout/activity_call.xml | 6 +++--- 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/VoxImplantModule.java b/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/VoxImplantModule.java index e15a0af852..892f1b9f70 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/VoxImplantModule.java +++ b/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/VoxImplantModule.java @@ -66,12 +66,12 @@ public class VoxImplantModule implements IClientLoginListener, IClientSessionLis private void makeCall(String to, boolean isVideoCall) { mCall = mVoxClient.callTo(to, isVideoCall, null); if (mCall != null) { - onStartCall(to); + onStartCall(to, isVideoCall); } } - private void onStartCall(String to) { - Intent intent = CallActivity.getLaunchIntent(mContext, to); + private void onStartCall(String to, boolean withVideo) { + Intent intent = CallActivity.getLaunchIntent(mContext, to, withVideo); mContext.startActivity(intent); } diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java index 3aa46511eb..6732193109 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java +++ b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java @@ -41,6 +41,7 @@ public class CallActivity extends BaseActivity implements IEndpointListener, Cal private static final int FRONT_CAMERA = 1; private static final String USER_NAME_TAG = "username"; + private static final String WITH_VIDEO = "with_video"; private static final VideoQuality DEFAULT_VIDEO_QUALITY = VideoQuality.VIDEO_QUALITY_HIGH; //Base layouts for audio or video @BindView(R.id.audio_active_layout) ConstraintLayout audioIncomeLayout; @@ -78,13 +79,15 @@ public class CallActivity extends BaseActivity implements IEndpointListener, Cal private boolean mIsVideoEnabled; private boolean callInProgress; private boolean microActive = true; + private boolean withVideoIfCan = true; private IEndpoint mEndpoint; - public static Intent getLaunchIntent(Context context, String to) { + public static Intent getLaunchIntent(Context context, String to, boolean withVideo) { Intent intent = new Intent(context, CallActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra(USER_NAME_TAG, to); + intent.putExtra(WITH_VIDEO, withVideo); return intent; } @@ -97,10 +100,13 @@ public class CallActivity extends BaseActivity implements IEndpointListener, Cal if (getIntent() != null && getIntent().hasExtra(USER_NAME_TAG)) { mPresenter.getUser(getIntent().getStringExtra(USER_NAME_TAG)); } + if (getIntent() != null && getIntent().hasExtra(WITH_VIDEO)) { + withVideoIfCan = getIntent().getBooleanExtra(WITH_VIDEO, true); + } } private void initUI() { - if (mIsVideoEnabled) { + if (mIsVideoEnabled && withVideoIfCan) { mPresenter.sendVideo(true); showVideo(); } else { diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/IncomeCallActivity.java b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/IncomeCallActivity.java index 10dbac5b9d..2ee9b8c917 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/IncomeCallActivity.java +++ b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/IncomeCallActivity.java @@ -84,11 +84,11 @@ public class IncomeCallActivity extends BaseActivity implements IncomeCallView { if (mCall.getEndpoints() != null && !mCall.getEndpoints().isEmpty()) { mUserName = mCall.getEndpoints().get(0).getUserName(); } - if (mCall.isVideoEnabled()) { + if (mCall.isVideoEnabled() && withVideoIfCan) { mRxPermissions.request(Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA) .subscribe(granted -> { if (granted) { - startActivity(CallActivity.getLaunchIntent(IncomeCallActivity.this, mUserName)); + startActivity(CallActivity.getLaunchIntent(IncomeCallActivity.this, mUserName, withVideoIfCan)); } finish(); }); @@ -96,7 +96,7 @@ public class IncomeCallActivity extends BaseActivity implements IncomeCallView { mRxPermissions.request(Manifest.permission.RECORD_AUDIO) .subscribe(granted -> { if (granted) { - startActivity(CallActivity.getLaunchIntent(IncomeCallActivity.this, mUserName)); + startActivity(CallActivity.getLaunchIntent(IncomeCallActivity.this, mUserName, withVideoIfCan)); } finish(); }); diff --git a/app/src/main/res/layout/activity_call.xml b/app/src/main/res/layout/activity_call.xml index ed5adb3ee0..7fb8a60417 100644 --- a/app/src/main/res/layout/activity_call.xml +++ b/app/src/main/res/layout/activity_call.xml @@ -20,7 +20,7 @@ android:id="@+id/video_active_layout" android:layout_width="0dp" android:layout_height="0dp" - android:visibility="gone" + android:visibility="visible" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" @@ -37,8 +37,8 @@ Date: Wed, 16 Aug 2017 16:23:02 +0300 Subject: [PATCH 04/29] added transition to chat --- .../communicator/mvp/presenters/CallPresenter.java | 9 +++++++++ .../communicator/ui/activities/calls/CallActivity.java | 9 ++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/CallPresenter.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/CallPresenter.java index 5bc762b075..b326175c09 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/CallPresenter.java +++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/CallPresenter.java @@ -1,8 +1,11 @@ package com.nynja.mobile.communicator.mvp.presenters; import com.arellomobile.mvp.InjectViewState; +import com.nynja.mobile.communicator.data.models.ChatModel; +import com.nynja.mobile.communicator.data.models.mqtt.Contact; import com.nynja.mobile.communicator.data.models.mqtt.Response; import com.nynja.mobile.communicator.mvp.view.CallView; +import com.nynja.mobile.communicator.ui.fragments.chats.ChatFragment; import com.voximplant.sdk.call.CallException; import com.voximplant.sdk.call.ICall; import com.voximplant.sdk.call.ICallCompletionHandler; @@ -125,6 +128,12 @@ public class CallPresenter extends BasePresenter implements ICallListe } } + public void openChat(Contact item) { + ChatModel chatModel = mDataManager.getChatWith(item.phoneId); + mRouter.replaceScreen(ChatFragment.class.getSimpleName(), chatModel); + getViewState().fatality(); + } + @Override public void onCallConnected(ICall iCall, Map map) { Timber.i("Call connected"); startTimer(); diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java index 6732193109..fe7a383172 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java +++ b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java @@ -63,7 +63,7 @@ public class CallActivity extends BaseActivity implements IEndpointListener, Cal @BindView(R.id.audio_active_hangup) ImageView audioHangUp; @BindView(R.id.audio_active_mute) ImageView audioMute; @BindView(R.id.audio_active_speaker) ImageView audioSpeaker; - @BindView(R.id.audio_active_text) ImageView audioText; + ImageView audioText; @BindView(R.id.audio_active_duration) TextView audioDuration; @BindView(R.id.call_active_name) TextView name; @@ -80,6 +80,7 @@ public class CallActivity extends BaseActivity implements IEndpointListener, Cal private boolean callInProgress; private boolean microActive = true; private boolean withVideoIfCan = true; + private Contact mContact; private IEndpoint mEndpoint; @@ -169,6 +170,11 @@ public class CallActivity extends BaseActivity implements IEndpointListener, Cal mPresenter.speaker(mIsSpeakerPhoneEnabled); } + @OnClick(R.id.audio_active_text) + void openChat() { + mPresenter.openChat(mContact); + } + @Override public void onCameraSwitch() { mCameraType = (mCameraType == 0) ? 1 : 0; mCameraManager.setCamera(mCameraType, DEFAULT_VIDEO_QUALITY); @@ -276,6 +282,7 @@ public class CallActivity extends BaseActivity implements IEndpointListener, Cal } @Override public void setUser(Contact contact) { + this.mContact = contact; if (contact != null) { name.setText(contact.getFullName()); Glide.with(this).load(contact.avatar).placeholder(R.drawable.avatar_placeholder).into(userPhoto); -- GitLab From 4a6cac064decba31b9ac6cfce0897f9288e9011f Mon Sep 17 00:00:00 2001 From: Krocks Date: Wed, 16 Aug 2017 23:54:47 +0300 Subject: [PATCH 05/29] added layouts --- app/src/main/res/layout/fragment_chat.xml | 16 +++++ .../main/res/layout/partial_chat_audio.xml | 63 +++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 3 files changed, 80 insertions(+) create mode 100644 app/src/main/res/layout/partial_chat_audio.xml diff --git a/app/src/main/res/layout/fragment_chat.xml b/app/src/main/res/layout/fragment_chat.xml index 3dd5924782..73b44d19ec 100644 --- a/app/src/main/res/layout/fragment_chat.xml +++ b/app/src/main/res/layout/fragment_chat.xml @@ -6,10 +6,26 @@ android:layout_height="match_parent"> + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 74970852ac..6cb7046d14 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -105,6 +105,7 @@ Write your message 00:00:00 + Return to call -- GitLab From 817419fbf220d1af15144bb4f1d45e55ac7e0465 Mon Sep 17 00:00:00 2001 From: Krocks Date: Thu, 17 Aug 2017 10:23:50 +0300 Subject: [PATCH 06/29] added UI, starting working on logic --- .../mobile/communicator/mvp/view/ChatView.java | 3 +++ .../ui/activities/calls/CallActivity.java | 1 - .../ui/fragments/chats/ChatFragment.java | 17 +++++++++++++++++ app/src/main/res/layout/fragment_chat.xml | 2 +- app/src/main/res/layout/partial_chat_audio.xml | 4 ++-- 5 files changed, 23 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/view/ChatView.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/view/ChatView.java index 9f986b274a..114bcc1e94 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/mvp/view/ChatView.java +++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/view/ChatView.java @@ -2,6 +2,7 @@ package com.nynja.mobile.communicator.mvp.view; import com.nynja.mobile.communicator.data.models.mqtt.Message; import com.nynja.mobile.communicator.data.server.bert.BertAtom; +import com.voximplant.sdk.call.ICall; import java.util.ArrayList; import java.util.List; @@ -51,4 +52,6 @@ public interface ChatView extends ErrorMvpView { void recordIsPlaying(boolean isPlaying); void updateUnreadMessages(Long src); + + void onActiveCall(ICall call); } diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java index fe7a383172..9cb50ad77e 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java +++ b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java @@ -63,7 +63,6 @@ public class CallActivity extends BaseActivity implements IEndpointListener, Cal @BindView(R.id.audio_active_hangup) ImageView audioHangUp; @BindView(R.id.audio_active_mute) ImageView audioMute; @BindView(R.id.audio_active_speaker) ImageView audioSpeaker; - ImageView audioText; @BindView(R.id.audio_active_duration) TextView audioDuration; @BindView(R.id.call_active_name) TextView name; diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java b/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java index d0a98773bb..99a83ac652 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java +++ b/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java @@ -42,6 +42,9 @@ import com.nynja.mobile.communicator.ui.views.WaveFormView; import com.nynja.mobile.communicator.utils.ImageUtils; import com.nynja.mobile.communicator.utils.StringUtils; import com.nynja.mobile.communicator.utils.Utils; +import com.voximplant.sdk.call.ICall; + +import org.webrtc.SurfaceViewRenderer; import java.io.File; import java.io.IOException; @@ -90,6 +93,8 @@ public class ChatFragment extends BaseFragment implements ChatView, @BindView(R.id.f_chat_wave) WaveFormView mWaveFormView; @BindView(R.id.f_chat_view_mic) MicView mMicView; + @BindView(R.id.chat_active_video) SurfaceViewRenderer video; + @BindView(R.id.chat_audio_layout) View chatAudioLayout; private ChatAdapter mAdapter; private Disposable mDisposable; @@ -104,6 +109,7 @@ public class ChatFragment extends BaseFragment implements ChatView, return chatFragment; } + @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { @@ -469,4 +475,15 @@ public class ChatFragment extends BaseFragment implements ChatView, @Override public void onPhotoClick(Message message) { mChatPresenter.onPhotoClick(message); } + + @Override public void onActiveCall(ICall call) { + if (call != null) { + if (call.isVideoEnabled()) { + video.setVisibility(View.VISIBLE); +// video. + } else { + chatAudioLayout.setVisibility(View.VISIBLE); + } + } + } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_chat.xml b/app/src/main/res/layout/fragment_chat.xml index 73b44d19ec..e9a4ac9e9b 100644 --- a/app/src/main/res/layout/fragment_chat.xml +++ b/app/src/main/res/layout/fragment_chat.xml @@ -16,7 +16,7 @@ layout="@layout/partial_chat_header"/> + app:layout_constraintBottom_toTopOf="@+id/chat_audio_name" /> + app:layout_constraintBottom_toBottomOf="@+id/chat_audio_name" /> \ No newline at end of file -- GitLab From 39e392e746167b5fc0fadad1beb5164e5d6c0150 Mon Sep 17 00:00:00 2001 From: Krocks Date: Thu, 17 Aug 2017 11:09:26 +0300 Subject: [PATCH 07/29] saving code to pull dev --- .../mobile/communicator/data/DataManager.java | 6 ++- .../data/voximplant/VoxImplantModule.java | 37 ++++++++++++++++++- .../mvp/presenters/CallPresenter.java | 11 ++++++ .../mvp/presenters/ChatPresenter.java | 6 +++ .../ui/activities/calls/CallActivity.java | 29 +++++++-------- .../ui/fragments/chats/ChatFragment.java | 2 +- 6 files changed, 73 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/DataManager.java b/app/src/main/java/com/nynja/mobile/communicator/data/DataManager.java index 6c96f10789..2d8f7ff345 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/data/DataManager.java +++ b/app/src/main/java/com/nynja/mobile/communicator/data/DataManager.java @@ -24,6 +24,7 @@ import com.nynja.mobile.communicator.data.models.mqtt.Auth; import com.nynja.mobile.communicator.data.models.mqtt.BaseModelMQQT; import com.nynja.mobile.communicator.data.models.mqtt.Confirm; import com.nynja.mobile.communicator.data.models.mqtt.Contact; +import com.nynja.mobile.communicator.data.models.mqtt.Cursor; import com.nynja.mobile.communicator.data.models.mqtt.Desc; import com.nynja.mobile.communicator.data.models.mqtt.Friend; import com.nynja.mobile.communicator.data.models.mqtt.History; @@ -35,7 +36,6 @@ import com.nynja.mobile.communicator.data.models.mqtt.Response; import com.nynja.mobile.communicator.data.models.mqtt.Roster; import com.nynja.mobile.communicator.data.models.mqtt.Search; import com.nynja.mobile.communicator.data.models.mqtt.Token; -import com.nynja.mobile.communicator.data.models.mqtt.Cursor; import com.nynja.mobile.communicator.data.server.bert.BertAtom; import com.nynja.mobile.communicator.data.telesign.TelesignModule; import com.nynja.mobile.communicator.data.upload.IFileUploadModule; @@ -540,4 +540,8 @@ public class DataManager { public void stopPlayRecord() { mAudioModule.stopPlay(); } + + public VoxImplantModule getVoxImlant() { + return mVoxClientManager; + } } diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/VoxImplantModule.java b/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/VoxImplantModule.java index 892f1b9f70..92470f1e6a 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/VoxImplantModule.java +++ b/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/VoxImplantModule.java @@ -8,6 +8,10 @@ import com.nynja.mobile.communicator.ui.activities.calls.CallActivity; import com.nynja.mobile.communicator.ui.activities.calls.IncomeCallActivity; import com.voximplant.sdk.Voximplant; import com.voximplant.sdk.call.ICall; +import com.voximplant.sdk.call.IEndpoint; +import com.voximplant.sdk.call.IEndpointListener; +import com.voximplant.sdk.call.IVideoStream; +import com.voximplant.sdk.call.RenderScaleType; import com.voximplant.sdk.client.AuthParams; import com.voximplant.sdk.client.ClientConfig; import com.voximplant.sdk.client.IClient; @@ -16,6 +20,8 @@ import com.voximplant.sdk.client.IClientLoginListener; import com.voximplant.sdk.client.IClientSessionListener; import com.voximplant.sdk.client.LoginError; +import org.webrtc.SurfaceViewRenderer; + import java.util.ArrayList; import java.util.Map; import java.util.concurrent.Executors; @@ -27,14 +33,17 @@ import timber.log.Timber; **/ public class VoxImplantModule implements IClientLoginListener, IClientSessionListener, - IClientIncomingCallListener { + IClientIncomingCallListener, IEndpointListener { + private static final RenderScaleType RENDER_TYPE = RenderScaleType.SCALE_FIT; private static final String POSTFIX = "@videoconf.nynja.voximplant.com"; private final Context mContext; private Person mPerson; private IClient mVoxClient; private ICall mCall; private ArrayList mServers = new ArrayList<>(); + private IVideoStream mVideoStream; + private SurfaceViewRenderer mSurfaceViewRenderer; public VoxImplantModule(Context context) { mContext = context; @@ -120,4 +129,30 @@ public class VoxImplantModule implements IClientLoginListener, IClientSessionLis public void endCall() { mCall = null; } + + + // ENDPOINT INTERFACE + VIDEO + @Override public void onRemoteVideoStreamAdded(IEndpoint iEndpoint, IVideoStream iVideoStream) { + this.mVideoStream = iVideoStream; + if (this.mSurfaceViewRenderer != null) { + mVideoStream.addVideoRenderer(mSurfaceViewRenderer, RENDER_TYPE); + } + } + + @Override + public void onRemoteVideoStreamRemoved(IEndpoint iEndpoint, IVideoStream iVideoStream) { + if (mSurfaceViewRenderer != null) { + iVideoStream.removeVideoRenderer(mSurfaceViewRenderer); + mVideoStream = null; + mSurfaceViewRenderer = null; + } + } + + public void setSurfaceViewRenderer(SurfaceViewRenderer surfaceViewRenderer) { + this.mSurfaceViewRenderer = surfaceViewRenderer; + if (mVideoStream != null) { + mVideoStream.addVideoRenderer(mSurfaceViewRenderer, RENDER_TYPE); + } + } + // ENDPOINT INTERFACE + VIDEO END } diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/CallPresenter.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/CallPresenter.java index b326175c09..17468e78cb 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/CallPresenter.java +++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/CallPresenter.java @@ -10,8 +10,11 @@ import com.voximplant.sdk.call.CallException; import com.voximplant.sdk.call.ICall; import com.voximplant.sdk.call.ICallCompletionHandler; import com.voximplant.sdk.call.ICallListener; +import com.voximplant.sdk.call.IEndpoint; import com.voximplant.sdk.call.IVideoStream; +import org.webrtc.SurfaceViewRenderer; + import java.util.Map; import java.util.Timer; import java.util.TimerTask; @@ -38,9 +41,17 @@ public class CallPresenter extends BasePresenter implements ICallListe if (mCall != null) { mCall.addCallListener(this); getViewState().onCallSet(mCall); + if (!mCall.getEndpoints().isEmpty()) { + IEndpoint mEndpoint = mCall.getEndpoints().get(0); + mEndpoint.setEndpointListener(mDataManager.getVoxImlant()); + } } } + public void setRenderer(SurfaceViewRenderer renderer) { + mDataManager.getVoxImlant().setSurfaceViewRenderer(renderer); + } + public void switchCamera() { getViewState().onCameraSwitch(); } diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ChatPresenter.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ChatPresenter.java index 16dca89790..02e67d58c4 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ChatPresenter.java +++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ChatPresenter.java @@ -13,6 +13,8 @@ import com.nynja.mobile.communicator.data.upload.UploadProgressInterface; import com.nynja.mobile.communicator.mvp.view.ChatView; import com.nynja.mobile.communicator.utils.StringUtils; +import org.webrtc.SurfaceViewRenderer; + import java.io.File; import java.util.ArrayList; import java.util.Collections; @@ -214,4 +216,8 @@ public class ChatPresenter extends BaseErrorPresenter { public void sendCursor(Message message) { mDataManager.sendCursor(message); } + + public void setRenderer(SurfaceViewRenderer renderer) { + mDataManager.getVoxImlant().setSurfaceViewRenderer(renderer); + } } diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java index 9cb50ad77e..0ce55e4c3d 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java +++ b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java @@ -22,8 +22,6 @@ import com.nynja.mobile.communicator.ui.base.BaseActivity; import com.nynja.mobile.communicator.utils.DialogFactory; import com.voximplant.sdk.Voximplant; import com.voximplant.sdk.call.ICall; -import com.voximplant.sdk.call.IEndpoint; -import com.voximplant.sdk.call.IEndpointListener; import com.voximplant.sdk.call.IVideoStream; import com.voximplant.sdk.call.RenderScaleType; import com.voximplant.sdk.hardware.ICameraEventsListener; @@ -36,7 +34,9 @@ import butterknife.BindView; import butterknife.OnClick; import timber.log.Timber; -public class CallActivity extends BaseActivity implements IEndpointListener, CallView, +public class CallActivity extends BaseActivity implements +// IEndpointListener, + CallView, ICameraEventsListener { private static final int FRONT_CAMERA = 1; @@ -81,7 +81,7 @@ public class CallActivity extends BaseActivity implements IEndpointListener, Cal private boolean withVideoIfCan = true; private Contact mContact; - private IEndpoint mEndpoint; +// private IEndpoint mEndpoint; public static Intent getLaunchIntent(Context context, String to, boolean withVideo) { Intent intent = new Intent(context, CallActivity.class); @@ -237,10 +237,9 @@ public class CallActivity extends BaseActivity implements IEndpointListener, Cal @Override public void onCallSet(ICall call) { if (!call.getEndpoints().isEmpty()) { mIsVideoEnabled = call.isVideoEnabled(); - mEndpoint = call.getEndpoints().get(0); - mEndpoint.setEndpointListener(this); startCall(); initUI(); + mPresenter.setRenderer(videoRemote); } } @@ -296,15 +295,15 @@ public class CallActivity extends BaseActivity implements IEndpointListener, Cal } } - @Override - public void onRemoteVideoStreamAdded(IEndpoint endpoint, IVideoStream videoStream) { - videoStream.addVideoRenderer(videoRemote, RenderScaleType.SCALE_FIT); - } - - @Override - public void onRemoteVideoStreamRemoved(IEndpoint endpoint, IVideoStream videoStream) { - videoStream.removeVideoRenderer(videoRemote); - } +// @Override +// public void onRemoteVideoStreamAdded(IEndpoint endpoint, IVideoStream videoStream) { +// videoStream.addVideoRenderer(videoRemote, RenderScaleType.SCALE_FIT); +// } +// +// @Override +// public void onRemoteVideoStreamRemoved(IEndpoint endpoint, IVideoStream videoStream) { +// videoStream.removeVideoRenderer(videoRemote); +// } //Callback for camera events diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java b/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java index 99a83ac652..229d4bec2d 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java +++ b/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java @@ -480,7 +480,7 @@ public class ChatFragment extends BaseFragment implements ChatView, if (call != null) { if (call.isVideoEnabled()) { video.setVisibility(View.VISIBLE); -// video. + mChatPresenter.setRenderer(video); } else { chatAudioLayout.setVisibility(View.VISIBLE); } -- GitLab From c61af99cad45c9f687d889a7cb71b853c8b134e3 Mon Sep 17 00:00:00 2001 From: Krocks Date: Thu, 17 Aug 2017 11:53:22 +0300 Subject: [PATCH 08/29] saving code before refactoring vox module --- .../communicator/mvp/presenters/ChatPresenter.java | 4 ++++ .../communicator/ui/activities/calls/CallActivity.java | 2 +- .../communicator/ui/fragments/chats/ChatFragment.java | 1 + app/src/main/res/layout/partial_video_active.xml | 9 +++++++++ 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ChatPresenter.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ChatPresenter.java index 19f44a1de2..24062dbacf 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ChatPresenter.java +++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ChatPresenter.java @@ -234,4 +234,8 @@ public class ChatPresenter extends BaseErrorPresenter { public void setRenderer(SurfaceViewRenderer renderer) { mDataManager.getVoxImlant().setSurfaceViewRenderer(renderer); } + + public void checkCall() { + getViewState().onActiveCall(mDataManager.getVoxImlant().getActiveCall()); + } } diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java index 0ce55e4c3d..2f049fee14 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java +++ b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java @@ -169,7 +169,7 @@ public class CallActivity extends BaseActivity implements mPresenter.speaker(mIsSpeakerPhoneEnabled); } - @OnClick(R.id.audio_active_text) + @OnClick({R.id.audio_active_text, R.id.video_active_chat}) void openChat() { mPresenter.openChat(mContact); } diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java b/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java index fc83f4d038..84ab7e5a8e 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java +++ b/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java @@ -173,6 +173,7 @@ public class ChatFragment extends BaseFragment implements ChatView, super.onResume(); mDisposable = RxTextView.textChanges(mMessageText) .subscribe(charSequence -> mSendButton.setEnabled(charSequence.length() > 0)); + mChatPresenter.checkCall(); } private void getHistory() { diff --git a/app/src/main/res/layout/partial_video_active.xml b/app/src/main/res/layout/partial_video_active.xml index 8e66a7f132..f20f9d61c8 100644 --- a/app/src/main/res/layout/partial_video_active.xml +++ b/app/src/main/res/layout/partial_video_active.xml @@ -69,4 +69,13 @@ app:layout_constraintRight_toRightOf="@+id/video_active_switch_camera" app:layout_constraintTop_toBottomOf="@+id/video_active_switch_camera" /> + + \ No newline at end of file -- GitLab From c6a850c0c70708def0169dca7fe147090f1f57dd Mon Sep 17 00:00:00 2001 From: Krocks Date: Thu, 17 Aug 2017 14:01:27 +0300 Subject: [PATCH 09/29] refactored vox --- .../mobile/communicator/data/DataManager.java | 7 +- .../data/voximplant/CallToPresenter.java | 29 ++ .../data/voximplant/VoxImplantModule.java | 220 ++++++++++++- .../mvp/presenters/CallPresenter.java | 299 ++++++++++-------- .../mvp/presenters/ChatPresenter.java | 58 +++- .../communicator/mvp/view/CallView.java | 13 +- .../communicator/mvp/view/ChatView.java | 13 +- .../ui/activities/calls/CallActivity.java | 108 ++++--- .../ui/fragments/chats/ChatFragment.java | 53 +++- 9 files changed, 589 insertions(+), 211 deletions(-) create mode 100644 app/src/main/java/com/nynja/mobile/communicator/data/voximplant/CallToPresenter.java diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/DataManager.java b/app/src/main/java/com/nynja/mobile/communicator/data/DataManager.java index 2d8f7ff345..4280a98166 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/data/DataManager.java +++ b/app/src/main/java/com/nynja/mobile/communicator/data/DataManager.java @@ -40,11 +40,11 @@ import com.nynja.mobile.communicator.data.server.bert.BertAtom; import com.nynja.mobile.communicator.data.telesign.TelesignModule; import com.nynja.mobile.communicator.data.upload.IFileUploadModule; import com.nynja.mobile.communicator.data.upload.UploadProgressInterface; +import com.nynja.mobile.communicator.data.voximplant.CallToPresenter; import com.nynja.mobile.communicator.data.voximplant.VoxImplantModule; import com.nynja.mobile.communicator.injection.ApplicationContext; import com.nynja.mobile.communicator.utils.ContactsUtil; import com.nynja.mobile.communicator.utils.ImageUtils; -import com.voximplant.sdk.call.ICall; import java.io.File; import java.util.ArrayList; @@ -419,8 +419,9 @@ public class DataManager { mVoxClientManager.videoCall(userId); } - public ICall getCall() { - return mVoxClientManager.getActiveCall(); + public void getCall(CallToPresenter callToPresenter) { +// public ICall getCall(CallToPresenter callToPresenter) { +// return mVoxClientManager.getActiveCall(callToPresenter); } public void callEnd() { diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/CallToPresenter.java b/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/CallToPresenter.java new file mode 100644 index 0000000000..e787aae3ff --- /dev/null +++ b/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/CallToPresenter.java @@ -0,0 +1,29 @@ +package com.nynja.mobile.communicator.data.voximplant; + +import com.voximplant.sdk.call.ICall; +import com.voximplant.sdk.call.IVideoStream; + +public interface CallToPresenter { + void activeVideoCall(ICall Call); + + void activeAudioCall(ICall call); + + void remoteVideoStreamAdded(IVideoStream iVideoStream); + + void timeTicksTicksAway(String time); //duration of call + + void callEnded(); + + // TO DETAILED CALL ACTIVITY + void onSpeaker(boolean on); + + void onMute(boolean audioOn); + + void onCallRinging(); + + void onCallConnected(); + + void onCallFailed(String reason); + + void onLocalVideoStreamAdded(IVideoStream iVideoStream, boolean added); +} diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/VoxImplantModule.java b/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/VoxImplantModule.java index 92470f1e6a..2d95471a65 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/VoxImplantModule.java +++ b/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/VoxImplantModule.java @@ -7,7 +7,10 @@ import com.nynja.mobile.communicator.data.models.mqtt.Person; import com.nynja.mobile.communicator.ui.activities.calls.CallActivity; import com.nynja.mobile.communicator.ui.activities.calls.IncomeCallActivity; import com.voximplant.sdk.Voximplant; +import com.voximplant.sdk.call.CallException; import com.voximplant.sdk.call.ICall; +import com.voximplant.sdk.call.ICallCompletionHandler; +import com.voximplant.sdk.call.ICallListener; import com.voximplant.sdk.call.IEndpoint; import com.voximplant.sdk.call.IEndpointListener; import com.voximplant.sdk.call.IVideoStream; @@ -24,6 +27,8 @@ import org.webrtc.SurfaceViewRenderer; import java.util.ArrayList; import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; import java.util.concurrent.Executors; import timber.log.Timber; @@ -33,8 +38,10 @@ import timber.log.Timber; **/ public class VoxImplantModule implements IClientLoginListener, IClientSessionListener, - IClientIncomingCallListener, IEndpointListener { + IClientIncomingCallListener, IEndpointListener, ICallListener { + private static final int SECOND = 1000; + private static final int SECOND_IN_MINUTE = 60; private static final RenderScaleType RENDER_TYPE = RenderScaleType.SCALE_FIT; private static final String POSTFIX = "@videoconf.nynja.voximplant.com"; private final Context mContext; @@ -44,6 +51,8 @@ public class VoxImplantModule implements IClientLoginListener, IClientSessionLis private ArrayList mServers = new ArrayList<>(); private IVideoStream mVideoStream; private SurfaceViewRenderer mSurfaceViewRenderer; + private Timer mTimer; + private CallToPresenter mCallToPresenter; public VoxImplantModule(Context context) { mContext = context; @@ -60,10 +69,44 @@ public class VoxImplantModule implements IClientLoginListener, IClientSessionLis mVoxClient.connect(true, mServers); } - public ICall getActiveCall() { - return mCall; + public void getActiveCall(CallToPresenter callToPresenter) { + this.mCallToPresenter = callToPresenter; + + if (mCall == null) { + mCallToPresenter.callEnded(); + return; + } + + mCall.addCallListener(this); + if (!mCall.getEndpoints().isEmpty()) { + IEndpoint mEndpoint = mCall.getEndpoints().get(0); + mEndpoint.setEndpointListener(this); + } + if (mCall.isVideoEnabled()) { + mCallToPresenter.activeVideoCall(mCall); + } else { + mCallToPresenter.activeAudioCall(mCall); + } + + +// return mCall; } +// public void getActiveCall(CallToPresenter callToPresenter, boolean forceAudio) { +// this.mCallToPresenter = callToPresenter; +// mCall.addCallListener(this); +// if (!mCall.getEndpoints().isEmpty()) { +// IEndpoint mEndpoint = mCall.getEndpoints().get(0); +// mEndpoint.setEndpointListener(this); +// } +// if (mCall.isVideoEnabled()){ +// mCallToPresenter.activeVideoCall(mCall); +// } else { +// mCallToPresenter.activeAudioCall(mCall); +// } +//// return mCall; +// } + public void videoCall(String userId) { makeCall(userId, true); } @@ -79,11 +122,65 @@ public class VoxImplantModule implements IClientLoginListener, IClientSessionLis } } + public void startCall(boolean mIsIncomingCall) { + if (mIsIncomingCall) { + try { + if (mCall != null) { + mCall.answer(null, null); + } + } catch (CallException e) { + Timber.e(e); + } + } else { + if (mCall != null) { + mCall.start(null); +// Timber.e("VOX", "start call " + mCall); + } + } + } + private void onStartCall(String to, boolean withVideo) { Intent intent = CallActivity.getLaunchIntent(mContext, to, withVideo); mContext.startActivity(intent); } + private void startTimer() { + mTimer = new Timer(); + mTimer.scheduleAtFixedRate(new TimerTask() { + @Override public void run() { + if (mCall != null) { + mCallToPresenter.timeTicksTicksAway(getTime()); + } else { + mTimer.cancel(); + } + } + }, SECOND, SECOND); + } + + private String getTime() { + long milliseconds; + try { + milliseconds = mCall.getCallDuration(); + } catch (NullPointerException e) { //sometimes vox sdk can throw null pointer exception from here + e.printStackTrace(); + return ""; + } + if (milliseconds > SECOND * SECOND_IN_MINUTE * 60 * 24) + return ""; //sometimes voximplant returns current time milis or something like that + int seconds = (int) milliseconds / SECOND; + int minutes = seconds / SECOND_IN_MINUTE; + + String time; + if (seconds % SECOND_IN_MINUTE >= 10) { + time = minutes + ":" + seconds % SECOND_IN_MINUTE; + } else { + time = minutes + ":0" + seconds % SECOND_IN_MINUTE; + } + + return time; + + } + //Client Login @Override public void onLoginSuccessful(String s, AuthParams authParams) { Timber.i("VoxImplant login success"); @@ -128,31 +225,126 @@ public class VoxImplantModule implements IClientLoginListener, IClientSessionLis public void endCall() { mCall = null; + mCallToPresenter = null; } // ENDPOINT INTERFACE + VIDEO @Override public void onRemoteVideoStreamAdded(IEndpoint iEndpoint, IVideoStream iVideoStream) { this.mVideoStream = iVideoStream; - if (this.mSurfaceViewRenderer != null) { - mVideoStream.addVideoRenderer(mSurfaceViewRenderer, RENDER_TYPE); - } +// if (this.mSurfaceViewRenderer != null) { +// mVideoStream.addVideoRenderer(mSurfaceViewRenderer, RENDER_TYPE); +// } + mCallToPresenter.remoteVideoStreamAdded(iVideoStream); } @Override public void onRemoteVideoStreamRemoved(IEndpoint iEndpoint, IVideoStream iVideoStream) { - if (mSurfaceViewRenderer != null) { - iVideoStream.removeVideoRenderer(mSurfaceViewRenderer); - mVideoStream = null; - mSurfaceViewRenderer = null; - } + //TODO nothing maybe? this is not going to happen? +// if (mSurfaceViewRenderer != null) { +// iVideoStream.removeVideoRenderer(mSurfaceViewRenderer); + mVideoStream = null; +// mSurfaceViewRenderer = null; +// } } - public void setSurfaceViewRenderer(SurfaceViewRenderer surfaceViewRenderer) { - this.mSurfaceViewRenderer = surfaceViewRenderer; + public void reloadSurfaceRenderer() { if (mVideoStream != null) { - mVideoStream.addVideoRenderer(mSurfaceViewRenderer, RENDER_TYPE); + mCallToPresenter.remoteVideoStreamAdded(mVideoStream); } +// mCallToPresenter +// this.mSurfaceViewRenderer = surfaceViewRenderer; +// if (mVideoStream != null) { +// mVideoStream.addVideoRenderer(mSurfaceViewRenderer, RENDER_TYPE); +// } } + // ENDPOINT INTERFACE + VIDEO END + + //CAL INTERFACE START + + @Override public void onCallConnected(ICall iCall, Map map) { + mCallToPresenter.onCallConnected(); + startTimer(); + } + + @Override public void onCallDisconnected(ICall iCall, Map map, boolean b) { + mCallToPresenter.callEnded(); + if (mTimer != null) mTimer.cancel(); + endCall(); + } + + @Override public void onCallRinging(ICall iCall, Map map) { + mCallToPresenter.onCallRinging(); + } + + @Override public void onCallFailed(ICall iCall, int i, String s, Map map) { + mCallToPresenter.onCallFailed(s); + endCall(); + } + + @Override public void onCallAudioStarted(ICall iCall) { + + } + + @Override + public void onSIPInfoReceived(ICall iCall, String s, String s1, Map map) { + + } + + @Override public void onMessageReceived(ICall iCall, String s) { + + } + + @Override public void onLocalVideoStreamAdded(ICall iCall, IVideoStream iVideoStream) { + mCallToPresenter.onLocalVideoStreamAdded(iVideoStream, true); + } + + @Override public void onLocalVideoStreamRemoved(ICall iCall, IVideoStream iVideoStream) { + mCallToPresenter.onLocalVideoStreamAdded(iVideoStream, false); + } + + @Override public void onICETimeout(ICall iCall) { + endCall(); + } + + @Override public void onICECompleted(ICall iCall) { + + } + + //CAL INTERFACE END + + public void mute(boolean audioOn) { + mCall.sendAudio(audioOn); + mCallToPresenter.onMute(audioOn); + } + + public void hangUp() { + if (mCall != null) mCall.hangup(null); + } + + public void switchToAudio() { + mCall.sendVideo(false, new ICallCompletionHandler() { + @Override public void onComplete() { + mCallToPresenter.activeAudioCall(mCall); + } + + @Override public void onFailure(CallException e) { + Timber.e(e); + } + }); + } + + public void switchToVideo() { + mCall.sendVideo(true, new ICallCompletionHandler() { + @Override public void onComplete() { + mCallToPresenter.activeVideoCall(mCall); + } + + @Override public void onFailure(CallException e) { + Timber.e(e); + } + }); + } + } diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/CallPresenter.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/CallPresenter.java index 17468e78cb..a84adf6d97 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/CallPresenter.java +++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/CallPresenter.java @@ -4,30 +4,24 @@ import com.arellomobile.mvp.InjectViewState; import com.nynja.mobile.communicator.data.models.ChatModel; import com.nynja.mobile.communicator.data.models.mqtt.Contact; import com.nynja.mobile.communicator.data.models.mqtt.Response; +import com.nynja.mobile.communicator.data.voximplant.CallToPresenter; +import com.nynja.mobile.communicator.data.voximplant.VoxImplantModule; import com.nynja.mobile.communicator.mvp.view.CallView; import com.nynja.mobile.communicator.ui.fragments.chats.ChatFragment; -import com.voximplant.sdk.call.CallException; import com.voximplant.sdk.call.ICall; -import com.voximplant.sdk.call.ICallCompletionHandler; -import com.voximplant.sdk.call.ICallListener; -import com.voximplant.sdk.call.IEndpoint; import com.voximplant.sdk.call.IVideoStream; -import org.webrtc.SurfaceViewRenderer; - -import java.util.Map; -import java.util.Timer; -import java.util.TimerTask; - -import timber.log.Timber; - @InjectViewState -public class CallPresenter extends BasePresenter implements ICallListener { +public class CallPresenter extends BasePresenter + implements CallToPresenter +// implements ICallListener +{ - private static final int SECOND = 1000; - private static final int SECOND_IN_MINUTE = 60; + // private static final int SECOND = 1000; +// private static final int SECOND_IN_MINUTE = 60; private ICall mCall; - private Timer mTimer; + // private Timer mTimer; + private VoxImplantModule mVoxImplantModule; @Override protected Class[] getFilter() { return new Class[0]; @@ -37,107 +31,112 @@ public class CallPresenter extends BasePresenter implements ICallListe } public void getCall() { - mCall = mDataManager.getCall(); - if (mCall != null) { - mCall.addCallListener(this); - getViewState().onCallSet(mCall); - if (!mCall.getEndpoints().isEmpty()) { - IEndpoint mEndpoint = mCall.getEndpoints().get(0); - mEndpoint.setEndpointListener(mDataManager.getVoxImlant()); - } - } + mDataManager.getCall(this); +// mCall = mDataManager.getCall(this); +// if (mCall != null) { +// mCall.addCallListener(this); +// getViewState().onCallSet(mCall); +// if (!mCall.getEndpoints().isEmpty()) { +// IEndpoint mEndpoint = mCall.getEndpoints().get(0); +// mEndpoint.setEndpointListener(mDataManager.getVoxImlant()); +// } } - public void setRenderer(SurfaceViewRenderer renderer) { - mDataManager.getVoxImlant().setSurfaceViewRenderer(renderer); - } + +// public void reloadVideo(SurfaceViewRenderer renderer) { +// mDataManager.getVoxImlant().reloadSurfaceRenderer(renderer); +// } public void switchCamera() { getViewState().onCameraSwitch(); } - public void sendVideo(boolean sendVideo) { - //// TODO: 10.08.17 switch audio-video - mCall.sendVideo(sendVideo, new ICallCompletionHandler() { - @Override public void onComplete() { - getViewState().switchUi(sendVideo); - } +// public void sendVideo(boolean sendVideo) { +// //// TODO: 10.08.17 switch audio-video +// mCall.sendVideo(sendVideo, new ICallCompletionHandler() { +// @Override public void onComplete() { +// getViewState().switchUi(sendVideo); +// } +// +// @Override public void onFailure(CallException e) { +// Timber.e(e); +// } +// }); +// } - @Override public void onFailure(CallException e) { - Timber.e(e); - } - }); + public void switchToAudio() { + mVoxImplantModule.switchToAudio(); } public void hanUp() { - if (mCall != null) mCall.hangup(null); +// if (mCall != null) mCall.hangup(null); + mVoxImplantModule.hangUp(); getViewState().fatality(); } public void mute(boolean on) { - mCall.sendAudio(on); - getViewState().onMute(on); +// mCall.sendAudio(on); +// getViewState().onMute(on); + mVoxImplantModule.mute(on); } public void speaker(boolean on) { getViewState().onSpeaker(on); } - public void text() { - //TODO transfer to chat, oh, wait we have no chat - } public void startCall(boolean mIsIncomingCall) { - if (mIsIncomingCall) { - try { - if (mCall != null) { - mCall.answer(null, null); - } - } catch (CallException e) { - Timber.e(e); - } - } else { - if (mCall != null) { - mCall.start(null); - Timber.e("VOX", "start call " + mCall); - } - } - } - - private void startTimer() { - mTimer = new Timer(); - mTimer.scheduleAtFixedRate(new TimerTask() { - @Override public void run() { - if (mCall != null) { - getViewState().callTimeUpdated(getTime()); - } else { - mTimer.cancel(); - } - } - }, SECOND, SECOND); - } - - private String getTime() { - try { - long milliseconds = mCall.getCallDuration(); - if (milliseconds > SECOND * SECOND_IN_MINUTE * 60 * 24) - return ""; //sometimes voximplant returns current time milis or something like that - int seconds = (int) milliseconds / SECOND; - int minutes = seconds / SECOND_IN_MINUTE; - - String time; - if (seconds % SECOND_IN_MINUTE >= 10) { - time = minutes + ":" + seconds % SECOND_IN_MINUTE; - } else { - time = minutes + ":0" + seconds % SECOND_IN_MINUTE; - } - - return time; - } catch (NullPointerException e) { - e.printStackTrace(); - return ""; - } - } + mVoxImplantModule.startCall(mIsIncomingCall); +// if (mIsIncomingCall) { +// try { +// if (mCall != null) { +// mCall.answer(null, null); +// } +// } catch (CallException e) { +// Timber.e(e); +// } +// } else { +// if (mCall != null) { +// mCall.start(null); +// Timber.e("VOX", "start call " + mCall); +// } +// } + } + +// private void startTimer() { +// mTimer = new Timer(); +// mTimer.scheduleAtFixedRate(new TimerTask() { +// @Override public void run() { +// if (mCall != null) { +// getViewState().callTimeUpdated(getTime()); +// } else { +// mTimer.cancel(); +// } +// } +// }, SECOND, SECOND); +// } +// +// private String getTime() { +// try { +// long milliseconds = mCall.getCallDuration(); +// if (milliseconds > SECOND * SECOND_IN_MINUTE * 60 * 24) +// return ""; //sometimes voximplant returns current time milis or something like that +// int seconds = (int) milliseconds / SECOND; +// int minutes = seconds / SECOND_IN_MINUTE; +// +// String time; +// if (seconds % SECOND_IN_MINUTE >= 10) { +// time = minutes + ":" + seconds % SECOND_IN_MINUTE; +// } else { +// time = minutes + ":0" + seconds % SECOND_IN_MINUTE; +// } +// +// return time; +// } catch (NullPointerException e) { +// e.printStackTrace(); +// return ""; +// } +// } public void openChat(Contact item) { ChatModel chatModel = mDataManager.getChatWith(item.phoneId); @@ -145,61 +144,105 @@ public class CallPresenter extends BasePresenter implements ICallListe getViewState().fatality(); } - @Override public void onCallConnected(ICall iCall, Map map) { - Timber.i("Call connected"); - startTimer(); - getViewState().onCallConnected(); - } +// @Override public void onCallConnected(ICall iCall, Map map) { +// Timber.i("Call connected"); +// startTimer(); +// getViewState().onCallConnected(); +// } + +// @Override public void onCallEnded(ICall iCall, Map map, boolean b) { +// Timber.i("Call disconnected"); +// getViewState().onCallEnded(); +// getViewState().fatality(); //TODO add activity finish on disconnect +// if (mTimer != null) mTimer.cancel(); +// mDataManager.callEnd(); +// } + +// @Override public void onCallRinging(ICall iCall, Map map) { +// Timber.i("Call ringing..."); +// getViewState().onCallRinging(); +// } + +// @Override public void onCallFailed(ICall iCall, int i, String s, Map map) { +// Timber.i("Call failed"); +// getViewState().onCallFailed(s); +// mDataManager.callEnd(); +// } + +// @Override public void onCallAudioStarted(ICall iCall) { +// +// } +// +// @Override +// public void onSIPInfoReceived(ICall iCall, String s, String s1, Map map) { +// +// } +// +// @Override public void onMessageReceived(ICall iCall, String s) { +// +// } + +// @Override public void onLocalVideoStreamAdded(ICall iCall, IVideoStream iVideoStream) { +// getViewState().onLocalVideoStreamAdded(iVideoStream, true); +// } +// +// @Override public void onLocalVideoStreamRemoved(ICall iCall, IVideoStream iVideoStream) { +// getViewState().onLocalVideoStreamAdded(iVideoStream, false); +// } + +// @Override public void onICETimeout(ICall iCall) { +// mDataManager.callEnd(); +// } +// +// @Override public void onICECompleted(ICall iCall) { +// +// } - @Override public void onCallDisconnected(ICall iCall, Map map, boolean b) { - Timber.i("Call disconnected"); - getViewState().onCallDisconnected(); - getViewState().fatality(); - if (mTimer != null) mTimer.cancel(); - mDataManager.callEnd(); + public void getUser(String username) { + getViewState().setUser(mDataManager.getProfile().getRoster().getContactByVoxUser(username)); } - @Override public void onCallRinging(ICall iCall, Map map) { - Timber.i("Call ringing..."); - getViewState().onCallRinging(); + @Override public void activeVideoCall(ICall Call) { + getViewState().activeVideoCall(); } - @Override public void onCallFailed(ICall iCall, int i, String s, Map map) { - Timber.i("Call failed"); - getViewState().onCallFailed(s); - mDataManager.callEnd(); + @Override public void activeAudioCall(ICall call) { + getViewState().activeAudioCall(); } - @Override public void onCallAudioStarted(ICall iCall) { - + @Override public void remoteVideoStreamAdded(IVideoStream iVideoStream) { + getViewState().onRemoteVideoStreamAdded(iVideoStream); } - @Override - public void onSIPInfoReceived(ICall iCall, String s, String s1, Map map) { - + @Override public void timeTicksTicksAway(String time) { + getViewState().callTimeUpdated(time); } - @Override public void onMessageReceived(ICall iCall, String s) { - + @Override public void callEnded() { + getViewState().onCallEnded(); } - @Override public void onLocalVideoStreamAdded(ICall iCall, IVideoStream iVideoStream) { - getViewState().onLocalVideoStreamAdded(iVideoStream, true); + @Override public void onSpeaker(boolean on) { + getViewState().onSpeaker(on); } - @Override public void onLocalVideoStreamRemoved(ICall iCall, IVideoStream iVideoStream) { - getViewState().onLocalVideoStreamAdded(iVideoStream, false); + @Override public void onMute(boolean audioOn) { + getViewState().onMute(audioOn); } - @Override public void onICETimeout(ICall iCall) { - mDataManager.callEnd(); + @Override public void onCallRinging() { + getViewState().onCallRinging(); } - @Override public void onICECompleted(ICall iCall) { + @Override public void onCallConnected() { + getViewState().onCallConnected(); + } + @Override public void onCallFailed(String reason) { + getViewState().onCallFailed(reason); } - public void getUser(String username) { - getViewState().setUser(mDataManager.getProfile().getRoster().getContactByVoxUser(username)); + @Override public void onLocalVideoStreamAdded(IVideoStream iVideoStream, boolean added) { + getViewState().onLocalVideoStreamAdded(iVideoStream, added); } } diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ChatPresenter.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ChatPresenter.java index 24062dbacf..bf41b78c97 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ChatPresenter.java +++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ChatPresenter.java @@ -12,10 +12,11 @@ import com.nynja.mobile.communicator.data.models.mqtt.Message; import com.nynja.mobile.communicator.data.models.mqtt.Ok2; import com.nynja.mobile.communicator.data.models.mqtt.Response; import com.nynja.mobile.communicator.data.upload.UploadProgressInterface; +import com.nynja.mobile.communicator.data.voximplant.CallToPresenter; import com.nynja.mobile.communicator.mvp.view.ChatView; import com.nynja.mobile.communicator.utils.StringUtils; - -import org.webrtc.SurfaceViewRenderer; +import com.voximplant.sdk.call.ICall; +import com.voximplant.sdk.call.IVideoStream; import java.io.File; import java.util.ArrayList; @@ -26,7 +27,7 @@ import java.util.Collections; **/ @InjectViewState -public class ChatPresenter extends BaseErrorPresenter { +public class ChatPresenter extends BaseErrorPresenter implements CallToPresenter { private ChatModel mChatModel; @@ -231,11 +232,56 @@ public class ChatPresenter extends BaseErrorPresenter { mDataManager.sendMessageInChat(mChatModel.id, desc); } - public void setRenderer(SurfaceViewRenderer renderer) { - mDataManager.getVoxImlant().setSurfaceViewRenderer(renderer); + public void reloadVideo() { + mDataManager.getVoxImlant().reloadSurfaceRenderer(); } public void checkCall() { - getViewState().onActiveCall(mDataManager.getVoxImlant().getActiveCall()); + mDataManager.getVoxImlant().getActiveCall(this); + } + + //CALL CALlBACKS + @Override public void activeVideoCall(ICall Call) { + getViewState().onActiveVideoCall(); + } + + @Override public void activeAudioCall(ICall call) { + getViewState().onActiveAudioCall(); + } + + @Override public void remoteVideoStreamAdded(IVideoStream iVideoStream) { + getViewState().onVideoStreamAdded(iVideoStream); + } + + @Override public void timeTicksTicksAway(String time) { + getViewState().onCallTimeChange(time); + } + + @Override public void callEnded() { + getViewState().onCallEnded(); + } + + @Override public void onSpeaker(boolean on) { + + } + + @Override public void onMute(boolean audioOn) { + + } + + @Override public void onCallRinging() { + + } + + @Override public void onCallConnected() { + + } + + @Override public void onCallFailed(String reason) { + + } + + @Override public void onLocalVideoStreamAdded(IVideoStream iVideoStream, boolean added) { + } } 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 5408be1116..1802821f19 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 @@ -2,7 +2,6 @@ package com.nynja.mobile.communicator.mvp.view; import com.arellomobile.mvp.MvpView; import com.nynja.mobile.communicator.data.models.mqtt.Contact; -import com.voximplant.sdk.call.ICall; import com.voximplant.sdk.call.IVideoStream; public interface CallView extends MvpView { @@ -12,23 +11,29 @@ public interface CallView extends MvpView { void onMute(boolean audioWorking); - void switchUi(boolean on); +// void switchUi(boolean on); void onLocalVideoStreamAdded(IVideoStream iVideoStream, boolean added); + void onRemoteVideoStreamAdded(IVideoStream iVideoStream); + void onCallFailed(String description); void onCallRinging(); void onCallConnected(); - void onCallDisconnected(); + void onCallEnded(); - void onCallSet(ICall call); +// void onCallSet(ICall call); void fatality(); void callTimeUpdated(String time); void setUser(Contact contact); + + void activeAudioCall(); + + void activeVideoCall(); } diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/view/ChatView.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/view/ChatView.java index 01255b4bc2..5990721529 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/mvp/view/ChatView.java +++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/view/ChatView.java @@ -2,7 +2,7 @@ package com.nynja.mobile.communicator.mvp.view; import com.nynja.mobile.communicator.data.models.mqtt.Message; import com.nynja.mobile.communicator.data.server.bert.BertAtom; -import com.voximplant.sdk.call.ICall; +import com.voximplant.sdk.call.IVideoStream; import java.util.ArrayList; import java.util.List; @@ -57,5 +57,14 @@ public interface ChatView extends ErrorMvpView { void navigateToFileExplorer(); - void onActiveCall(ICall call); + void onActiveAudioCall(); + + void onActiveVideoCall(); + + void onCallTimeChange(String time); + + void onCallEnded(); + + void onVideoStreamAdded(IVideoStream iVideoStream); + } diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java index 2f049fee14..933d21f04e 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java +++ b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java @@ -21,7 +21,6 @@ import com.nynja.mobile.communicator.mvp.view.CallView; import com.nynja.mobile.communicator.ui.base.BaseActivity; import com.nynja.mobile.communicator.utils.DialogFactory; import com.voximplant.sdk.Voximplant; -import com.voximplant.sdk.call.ICall; import com.voximplant.sdk.call.IVideoStream; import com.voximplant.sdk.call.RenderScaleType; import com.voximplant.sdk.hardware.ICameraEventsListener; @@ -75,7 +74,7 @@ public class CallActivity extends BaseActivity implements private int mCameraType = FRONT_CAMERA; private boolean mIsSpeakerPhoneEnabled; private ICameraManager mCameraManager; - private boolean mIsVideoEnabled; + // private boolean mIsVideoEnabled; private boolean callInProgress; private boolean microActive = true; private boolean withVideoIfCan = true; @@ -96,28 +95,32 @@ public class CallActivity extends BaseActivity implements super.onCreate(savedInstanceState); setContentView(R.layout.activity_call); - mPresenter.getCall(); + if (getIntent() != null && getIntent().hasExtra(USER_NAME_TAG)) { mPresenter.getUser(getIntent().getStringExtra(USER_NAME_TAG)); } + startCall(); //TODO not sure if here + mPresenter.getCall(); if (getIntent() != null && getIntent().hasExtra(WITH_VIDEO)) { withVideoIfCan = getIntent().getBooleanExtra(WITH_VIDEO, true); + if (!withVideoIfCan) { + mPresenter.switchToAudio(); + } } - } - private void initUI() { - if (mIsVideoEnabled && withVideoIfCan) { - mPresenter.sendVideo(true); - showVideo(); - } else { - mPresenter.sendVideo(false); - showAudio(); - } } - private void showVideo() { - +// private void initUI() { +// if (mIsVideoEnabled && withVideoIfCan) { +// mPresenter.sendVideo(true); +// showVideo(); +// } else { +// mPresenter.sendVideo(false); +// showAudio(); +// } +// } + private void showVideo() { if (!mIsSpeakerPhoneEnabled) turnSpeaker(); //in case of starting call after callback videoLocal.setZOrderMediaOverlay(true); @@ -202,53 +205,55 @@ public class CallActivity extends BaseActivity implements void switchToAudio() { if (callInProgress) { - if (videoViewLayout.getVisibility() == View.VISIBLE) { - mPresenter.sendVideo(false); - } else { - mPresenter.sendVideo(true); - } +// if (videoViewLayout.getVisibility() == View.VISIBLE) { +// mPresenter.sendVideo(false); +// } else { +// mPresenter.sendVideo(true); +// } + mPresenter.switchToAudio(); } else { - mIsVideoEnabled = false; +// mIsVideoEnabled = false; if (videoOutgoingLayout.getVisibility() == View.VISIBLE) { videoOutgoingLayout.setVisibility(View.GONE); audioOutgoingLayout.setVisibility(View.VISIBLE); } + mPresenter.switchToAudio(); } } - @Override public void switchUi(boolean showVideo) { - runOnUiThread(() -> { - if (showVideo) { - mIsVideoEnabled = true; - showVideo(); - } else { - mIsVideoEnabled = false; - showAudio(); - turnSpeaker(); - } - }); - - } +// @Override public void switchUi(boolean showVideo) { +// runOnUiThread(() -> { +// if (showVideo) { +// mIsVideoEnabled = true; +// showVideo(); +// } else { +// mIsVideoEnabled = false; +// showAudio(); +// turnSpeaker(); +// } +// }); +// +// } @Override public void fatality() { finish(); } - @Override public void onCallSet(ICall call) { - if (!call.getEndpoints().isEmpty()) { - mIsVideoEnabled = call.isVideoEnabled(); - startCall(); - initUI(); - mPresenter.setRenderer(videoRemote); - } - } +// @Override public void onCallSet(ICall call) { +// if (!call.getEndpoints().isEmpty()) { +// mIsVideoEnabled = call.isVideoEnabled(); +// startCall(); +// initUI(); +// mPresenter.reloadVideo(videoRemote); +// } +// } private void startCall() { mPresenter.startCall(callInProgress); status.setText("call connecting"); } - @Override public void onCallDisconnected() { + @Override public void onCallEnded() { this.runOnUiThread(() -> status.setText("Call disconnected")); } @@ -257,7 +262,7 @@ public class CallActivity extends BaseActivity implements this.runOnUiThread(() -> { status.setText("call in progress"); callInProgress = true; - initUI(); +// initUI(); }); } @@ -271,7 +276,7 @@ public class CallActivity extends BaseActivity implements @Override public void callTimeUpdated(String time) { runOnUiThread(() -> { - if (mIsVideoEnabled) { + if (videoViewLayout.getVisibility() == View.VISIBLE) { videoDuration.setText(time); } else { status.setText(getString(R.string.call_voice_call, time)); @@ -295,7 +300,11 @@ public class CallActivity extends BaseActivity implements } } -// @Override + @Override public void onRemoteVideoStreamAdded(IVideoStream iVideoStream) { + iVideoStream.addVideoRenderer(videoRemote, RenderScaleType.SCALE_FIT); + } + + // @Override // public void onRemoteVideoStreamAdded(IEndpoint endpoint, IVideoStream videoStream) { // videoStream.addVideoRenderer(videoRemote, RenderScaleType.SCALE_FIT); // } @@ -322,4 +331,13 @@ public class CallActivity extends BaseActivity implements @Override public void onCameraSwitchError(String s) { Timber.e("Camera switch error"); } + + @Override public void activeAudioCall() { + showAudio(); + } + + @Override public void activeVideoCall() { + showVideo(); + } + } diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java b/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java index 84ab7e5a8e..6664e41781 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java +++ b/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java @@ -45,7 +45,8 @@ import com.nynja.mobile.communicator.utils.ImageUtils; import com.nynja.mobile.communicator.utils.StringUtils; import com.nynja.mobile.communicator.utils.Utils; import com.timehop.stickyheadersrecyclerview.StickyRecyclerHeadersDecoration; -import com.voximplant.sdk.call.ICall; +import com.voximplant.sdk.call.IVideoStream; +import com.voximplant.sdk.call.RenderScaleType; import org.webrtc.SurfaceViewRenderer; @@ -98,6 +99,8 @@ public class ChatFragment extends BaseFragment implements ChatView, @BindView(R.id.f_chat_view_mic) MicView mMicView; @BindView(R.id.chat_active_video) SurfaceViewRenderer video; @BindView(R.id.chat_audio_layout) View chatAudioLayout; + @BindView(R.id.f_chat_header) View chatHeader; + @BindView(R.id.chat_audio_duration) TextView duration; private ChatAdapter mAdapter; private Disposable mDisposable; @@ -508,14 +511,46 @@ public class ChatFragment extends BaseFragment implements ChatView, }); } - @Override public void onActiveCall(ICall call) { - if (call != null) { - if (call.isVideoEnabled()) { - video.setVisibility(View.VISIBLE); - mChatPresenter.setRenderer(video); - } else { - chatAudioLayout.setVisibility(View.VISIBLE); - } +// @Override public void onActiveCall(ICall call) { +// if (call != null) { +// if (call.isVideoEnabled()) { +// video.setVisibility(View.VISIBLE); +// mChatPresenter.reloadVideo(video); +// } else { +// chatAudioLayout.setVisibility(View.VISIBLE); +// } +// } +// } + + @Override public void onActiveAudioCall() { + chatHeader.setVisibility(View.GONE); + chatAudioLayout.setVisibility(View.VISIBLE); + } + + @Override public void onActiveVideoCall() { + video.setVisibility(View.VISIBLE); + mChatPresenter.reloadVideo(); + } + + @Override public void onCallTimeChange(String time) { + if (chatAudioLayout.getVisibility() == View.VISIBLE) { + duration.setText(getString(R.string.call_voice_call, time)); + } + } + + @Override public void onCallEnded() { + if (video.getVisibility() == View.VISIBLE) { + video.setVisibility(View.GONE); + } + + if (chatAudioLayout.getVisibility() == View.VISIBLE) { + chatAudioLayout.setVisibility(View.GONE); } + + chatHeader.setVisibility(View.VISIBLE); + } + + @Override public void onVideoStreamAdded(IVideoStream iVideoStream) { + iVideoStream.addVideoRenderer(video, RenderScaleType.SCALE_FIT); } } \ No newline at end of file -- GitLab From 159aeff284da381e4209349e40a0f4d4fdf54a5b Mon Sep 17 00:00:00 2001 From: Krocks Date: Thu, 17 Aug 2017 14:42:12 +0300 Subject: [PATCH 10/29] refactored income call activity --- .../data/voximplant/VoxImplantModule.java | 12 ++ .../mvp/presenters/IncomeCallPresenter.java | 130 ++++++++++++------ .../communicator/mvp/view/IncomeCallView.java | 4 +- .../activities/calls/IncomeCallActivity.java | 33 +++-- 4 files changed, 119 insertions(+), 60 deletions(-) diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/VoxImplantModule.java b/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/VoxImplantModule.java index 2d95471a65..519d1e875a 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/VoxImplantModule.java +++ b/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/VoxImplantModule.java @@ -347,4 +347,16 @@ public class VoxImplantModule implements IClientLoginListener, IClientSessionLis }); } + public void declineCall() { + try { + if (mCall != null) { + mCall.reject(null); + mCall.removeCallListener(this); + } + } catch (CallException e) { + Timber.e("VoxImplantSDKDemo", "exception on reject call ", e); + } + endCall(); + } + } diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/IncomeCallPresenter.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/IncomeCallPresenter.java index e2caa1c31f..d8b5ceb361 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/IncomeCallPresenter.java +++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/IncomeCallPresenter.java @@ -3,18 +3,16 @@ package com.nynja.mobile.communicator.mvp.presenters; import com.arellomobile.mvp.InjectViewState; import com.nynja.mobile.communicator.data.models.mqtt.Contact; import com.nynja.mobile.communicator.data.models.mqtt.Response; +import com.nynja.mobile.communicator.data.voximplant.CallToPresenter; import com.nynja.mobile.communicator.mvp.view.IncomeCallView; -import com.voximplant.sdk.call.CallException; import com.voximplant.sdk.call.ICall; -import com.voximplant.sdk.call.ICallListener; import com.voximplant.sdk.call.IVideoStream; -import java.util.Map; - -import timber.log.Timber; - @InjectViewState -public class IncomeCallPresenter extends BasePresenter implements ICallListener { +public class IncomeCallPresenter extends BasePresenter + implements CallToPresenter +// implements ICallListener +{ private ICall mCall; @@ -29,78 +27,124 @@ public class IncomeCallPresenter extends BasePresenter implement } public void declineCall() { - try { - if (mCall != null) { - mCall.reject(null); - mCall.removeCallListener(this); - } - } catch (CallException e) { - Timber.e("VoxImplantSDKDemo", "exception on reject call ", e); - } - mDataManager.callEnd(); +// try { +// if (mCall != null) { +// mCall.reject(null); +// mCall.removeCallListener(this); +// } +// } catch (CallException e) { +// Timber.e("VoxImplantSDKDemo", "exception on reject call ", e); +// } +// mDataManager.callEnd(); + mDataManager.getVoxImlant().declineCall(); getViewState().onCallDisconnected(); } public void geCall() { - mCall = mDataManager.getCall(); - if (mCall != null && mCall.getEndpoints() != null) { + mDataManager.getCall(this); +// if (mCall != null && mCall.getEndpoints() != null) { String userName = mCall.getEndpoints().get(0).getUserName(); Contact contact = mDataManager.getProfile().getRoster().getContactByVoxUser(userName); - getViewState().setCall(mCall, contact); - mCall.addCallListener(this); +// getViewState().setCall(mCall, contact); + getViewState().setCall(contact); +// mCall.addCallListener(this); getViewState().hasVideo(mCall.isVideoEnabled()); - } +// } } - @Override public void onCallConnected(ICall iCall, Map map) { +// @Override public void onCallConnected(ICall iCall, Map map) { +// +// } +// +// @Override public void onCallDisconnected(ICall mCall, Map map, boolean b) { +// mCall.removeCallListener(this); +// getViewState().onCallDisconnected(); +// mDataManager.callEnd(); +// } +// +// @Override public void onCallRinging(ICall iCall, Map map) { +// +// } +// +// @Override public void onCallFailed(ICall iCall, int i, String s, Map map) { +// mDataManager.callEnd(); +// } +// +// @Override public void onCallAudioStarted(ICall iCall) { +// +// } +// +// @Override +// public void onSIPInfoReceived(ICall iCall, String s, String s1, Map map) { +// +// } +// +// @Override public void onMessageReceived(ICall iCall, String s) { +// +// } +// +// @Override public void onLocalVideoStreamAdded(ICall iCall, IVideoStream iVideoStream) { +// +// } +// +// @Override public void onLocalVideoStreamRemoved(ICall iCall, IVideoStream iVideoStream) { +// +// } +// +// @Override public void onICETimeout(ICall iCall) { +// mDataManager.callEnd(); +// } +// +// @Override public void onICECompleted(ICall iCall) { +// +// } +// +// @Override public void detachView(IncomeCallView view) { +// super.detachView(view); +// if (mCall != null) mCall.removeCallListener(this); +// } + @Override public void activeVideoCall(ICall Call) { + getViewState().hasVideo(true); } - @Override public void onCallDisconnected(ICall mCall, Map map, boolean b) { - mCall.removeCallListener(this); - getViewState().onCallDisconnected(); - mDataManager.callEnd(); + @Override public void activeAudioCall(ICall call) { + getViewState().hasVideo(false); } - @Override public void onCallRinging(ICall iCall, Map map) { + @Override public void remoteVideoStreamAdded(IVideoStream iVideoStream) { } - @Override public void onCallFailed(ICall iCall, int i, String s, Map map) { - mDataManager.callEnd(); - } - - @Override public void onCallAudioStarted(ICall iCall) { + @Override public void timeTicksTicksAway(String time) { } - @Override - public void onSIPInfoReceived(ICall iCall, String s, String s1, Map map) { + @Override public void callEnded() { } - @Override public void onMessageReceived(ICall iCall, String s) { + @Override public void onSpeaker(boolean on) { } - @Override public void onLocalVideoStreamAdded(ICall iCall, IVideoStream iVideoStream) { + @Override public void onMute(boolean audioOn) { } - @Override public void onLocalVideoStreamRemoved(ICall iCall, IVideoStream iVideoStream) { + @Override public void onCallRinging() { } - @Override public void onICETimeout(ICall iCall) { - mDataManager.callEnd(); + @Override public void onCallConnected() { + } - @Override public void onICECompleted(ICall iCall) { + @Override public void onCallFailed(String reason) { } - @Override public void detachView(IncomeCallView view) { - super.detachView(view); - if (mCall != null) mCall.removeCallListener(this); + @Override public void onLocalVideoStreamAdded(IVideoStream iVideoStream, boolean added) { + } } diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/view/IncomeCallView.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/view/IncomeCallView.java index 5091d6d6eb..8e06d95900 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/mvp/view/IncomeCallView.java +++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/view/IncomeCallView.java @@ -2,7 +2,6 @@ package com.nynja.mobile.communicator.mvp.view; import com.arellomobile.mvp.MvpView; import com.nynja.mobile.communicator.data.models.mqtt.Contact; -import com.voximplant.sdk.call.ICall; public interface IncomeCallView extends MvpView { @@ -12,5 +11,6 @@ public interface IncomeCallView extends MvpView { void hasVideo(boolean video); - void setCall(ICall call, Contact contact); + // void setCall(ICall call, Contact contact); + void setCall(Contact contact); } diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/IncomeCallActivity.java b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/IncomeCallActivity.java index 2ee9b8c917..eef8df13a8 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/IncomeCallActivity.java +++ b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/IncomeCallActivity.java @@ -15,7 +15,6 @@ import com.nynja.mobile.communicator.data.models.mqtt.Contact; import com.nynja.mobile.communicator.mvp.presenters.IncomeCallPresenter; import com.nynja.mobile.communicator.mvp.view.IncomeCallView; import com.nynja.mobile.communicator.ui.base.BaseActivity; -import com.voximplant.sdk.call.ICall; import butterknife.BindView; import butterknife.OnClick; @@ -30,8 +29,9 @@ public class IncomeCallActivity extends BaseActivity implements IncomeCallView { @InjectPresenter IncomeCallPresenter mPresenter; - private ICall mCall; + // private ICall mCall; private String mUserName; + boolean hasVideo; public static Intent getLaunchIntent(Context context) { Intent intent = new Intent(context, IncomeCallActivity.class); @@ -39,7 +39,7 @@ public class IncomeCallActivity extends BaseActivity implements IncomeCallView { return intent; } - private void initUI(boolean hasVideo) { + private void initUI() { if (hasVideo) { callStatus.setText(R.string.call_incoming_video); videoLayout.setVisibility(View.VISIBLE); @@ -80,11 +80,11 @@ public class IncomeCallActivity extends BaseActivity implements IncomeCallView { } @Override public void onAnswerCall(boolean withVideoIfCan) { - if (mCall != null) { - if (mCall.getEndpoints() != null && !mCall.getEndpoints().isEmpty()) { - mUserName = mCall.getEndpoints().get(0).getUserName(); - } - if (mCall.isVideoEnabled() && withVideoIfCan) { +// if (mCall != null) { +// if (mCall.getEndpoints() != null && !mCall.getEndpoints().isEmpty()) { +// mUserName = mCall.getEndpoints().get(0).getUserName(); +// } + if (hasVideo && withVideoIfCan) { mRxPermissions.request(Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA) .subscribe(granted -> { if (granted) { @@ -101,22 +101,25 @@ public class IncomeCallActivity extends BaseActivity implements IncomeCallView { finish(); }); } - } else { +// } else { finish(); - } +// } } @Override public void hasVideo(boolean video) { - initUI(video); + hasVideo = video; + initUI(); } - @Override public void setCall(ICall call, Contact contact) { - mCall = call; + @Override public void setCall(Contact contact) { +// mCall = call; if (contact != null) { callFrom.setText(contact.getFullName()); + mUserName = contact.person_id; Glide.with(this).load(contact.avatar).placeholder(R.drawable.contact_placeholder).into(userAvatar); - } else if (call != null && call.getEndpoints() != null) { - callFrom.setText(call.getEndpoints().get(0).getUserName()); } +// else if (call != null && call.getEndpoints() != null) { +// callFrom.setText(call.getEndpoints().get(0).getUserName()); +// } } } -- GitLab From fc0297096bf27c2be66a99232276eed16522f81b Mon Sep 17 00:00:00 2001 From: Krocks Date: Thu, 17 Aug 2017 15:10:41 +0300 Subject: [PATCH 11/29] at least getting call now --- .../mobile/communicator/data/DataManager.java | 1 + .../mvp/presenters/IncomeCallPresenter.java | 24 +++++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/DataManager.java b/app/src/main/java/com/nynja/mobile/communicator/data/DataManager.java index 4280a98166..03e5ef293a 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/data/DataManager.java +++ b/app/src/main/java/com/nynja/mobile/communicator/data/DataManager.java @@ -422,6 +422,7 @@ public class DataManager { public void getCall(CallToPresenter callToPresenter) { // public ICall getCall(CallToPresenter callToPresenter) { // return mVoxClientManager.getActiveCall(callToPresenter); + mVoxClientManager.getActiveCall(callToPresenter); } public void callEnd() { diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/IncomeCallPresenter.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/IncomeCallPresenter.java index d8b5ceb361..b3efc5af74 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/IncomeCallPresenter.java +++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/IncomeCallPresenter.java @@ -8,6 +8,8 @@ import com.nynja.mobile.communicator.mvp.view.IncomeCallView; import com.voximplant.sdk.call.ICall; import com.voximplant.sdk.call.IVideoStream; +import timber.log.Timber; + @InjectViewState public class IncomeCallPresenter extends BasePresenter implements CallToPresenter @@ -43,12 +45,12 @@ public class IncomeCallPresenter extends BasePresenter public void geCall() { mDataManager.getCall(this); // if (mCall != null && mCall.getEndpoints() != null) { - String userName = mCall.getEndpoints().get(0).getUserName(); - Contact contact = mDataManager.getProfile().getRoster().getContactByVoxUser(userName); +// String userName = mCall.getEndpoints().get(0).getUserName(); +// Contact contact = mDataManager.getProfile().getRoster().getContactByVoxUser(userName); // getViewState().setCall(mCall, contact); - getViewState().setCall(contact); +// getViewState().setCall(contact); // mCall.addCallListener(this); - getViewState().hasVideo(mCall.isVideoEnabled()); +// getViewState().hasVideo(mCall.isVideoEnabled()); // } } @@ -104,12 +106,20 @@ public class IncomeCallPresenter extends BasePresenter // if (mCall != null) mCall.removeCallListener(this); // } - @Override public void activeVideoCall(ICall Call) { + @Override public void activeVideoCall(ICall call) { getViewState().hasVideo(true); + String userName = call.getEndpoints().get(0).getUserName(); + Contact contact = mDataManager.getProfile().getRoster().getContactByVoxUser(userName); +// getViewState().setCall(mCall, contact); + getViewState().setCall(contact); } @Override public void activeAudioCall(ICall call) { getViewState().hasVideo(false); + String userName = call.getEndpoints().get(0).getUserName(); + Contact contact = mDataManager.getProfile().getRoster().getContactByVoxUser(userName); +// getViewState().setCall(mCall, contact); + getViewState().setCall(contact); } @Override public void remoteVideoStreamAdded(IVideoStream iVideoStream) { @@ -133,11 +143,11 @@ public class IncomeCallPresenter extends BasePresenter } @Override public void onCallRinging() { - + Timber.i("CAll ringing"); } @Override public void onCallConnected() { - + Timber.i("CAll connected"); } @Override public void onCallFailed(String reason) { -- GitLab From e22ebd5ca71ebd0a552322b1d21a3524a5f48712 Mon Sep 17 00:00:00 2001 From: Krocks Date: Thu, 17 Aug 2017 16:58:52 +0300 Subject: [PATCH 12/29] refactoring --- .../mobile/communicator/data/DataManager.java | 6 +- .../data/voximplant/CallToPresenter.java | 6 ++ .../data/voximplant/VoxImplantModule.java | 56 +++++++++++---- .../mvp/presenters/CallPresenter.java | 36 +++++++--- .../mvp/presenters/ChatPresenter.java | 32 +++++++-- .../mvp/presenters/IncomeCallPresenter.java | 16 ++++- .../communicator/mvp/view/CallView.java | 6 ++ .../communicator/mvp/view/ChatView.java | 2 + .../ui/activities/calls/CallActivity.java | 71 ++++++++++++------- .../ui/fragments/chats/ChatFragment.java | 44 +++++++++--- .../main/res/layout/partial_chat_audio.xml | 3 +- 11 files changed, 209 insertions(+), 69 deletions(-) diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/DataManager.java b/app/src/main/java/com/nynja/mobile/communicator/data/DataManager.java index 03e5ef293a..37ec52b773 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/data/DataManager.java +++ b/app/src/main/java/com/nynja/mobile/communicator/data/DataManager.java @@ -425,9 +425,9 @@ public class DataManager { mVoxClientManager.getActiveCall(callToPresenter); } - public void callEnd() { - mVoxClientManager.endCall(); - } +// public void callEnd() { +// mVoxClientManager.endCall(); +// } //VoxImplant end public List getChats() { diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/CallToPresenter.java b/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/CallToPresenter.java index e787aae3ff..a71dcc69fa 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/CallToPresenter.java +++ b/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/CallToPresenter.java @@ -4,12 +4,18 @@ import com.voximplant.sdk.call.ICall; import com.voximplant.sdk.call.IVideoStream; public interface CallToPresenter { + void videoCall(ICall Call); + + void audioCall(ICall call); + void activeVideoCall(ICall Call); void activeAudioCall(ICall call); void remoteVideoStreamAdded(IVideoStream iVideoStream); + void remoteVideoStreanRemoved(IVideoStream iVideoStream); + void timeTicksTicksAway(String time); //duration of call void callEnded(); diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/VoxImplantModule.java b/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/VoxImplantModule.java index 519d1e875a..88ad35ca7c 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/VoxImplantModule.java +++ b/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/VoxImplantModule.java @@ -23,8 +23,6 @@ import com.voximplant.sdk.client.IClientLoginListener; import com.voximplant.sdk.client.IClientSessionListener; import com.voximplant.sdk.client.LoginError; -import org.webrtc.SurfaceViewRenderer; - import java.util.ArrayList; import java.util.Map; import java.util.Timer; @@ -50,9 +48,9 @@ public class VoxImplantModule implements IClientLoginListener, IClientSessionLis private ICall mCall; private ArrayList mServers = new ArrayList<>(); private IVideoStream mVideoStream; - private SurfaceViewRenderer mSurfaceViewRenderer; private Timer mTimer; private CallToPresenter mCallToPresenter; + private boolean connected; public VoxImplantModule(Context context) { mContext = context; @@ -82,13 +80,20 @@ public class VoxImplantModule implements IClientLoginListener, IClientSessionLis IEndpoint mEndpoint = mCall.getEndpoints().get(0); mEndpoint.setEndpointListener(this); } - if (mCall.isVideoEnabled()) { - mCallToPresenter.activeVideoCall(mCall); + if (connected) { + if (mCall.isVideoEnabled()) { + mCallToPresenter.activeVideoCall(mCall); + } else { + mCallToPresenter.activeAudioCall(mCall); + } } else { - mCallToPresenter.activeAudioCall(mCall); + if (mCall.isVideoEnabled()) { + mCallToPresenter.videoCall(mCall); + } else { + mCallToPresenter.audioCall(mCall); + } } - // return mCall; } @@ -100,9 +105,9 @@ public class VoxImplantModule implements IClientLoginListener, IClientSessionLis // mEndpoint.setEndpointListener(this); // } // if (mCall.isVideoEnabled()){ -// mCallToPresenter.activeVideoCall(mCall); +// mCallToPresenter.videoCall(mCall); // } else { -// mCallToPresenter.activeAudioCall(mCall); +// mCallToPresenter.audioCall(mCall); // } //// return mCall; // } @@ -122,6 +127,23 @@ public class VoxImplantModule implements IClientLoginListener, IClientSessionLis } } +// public void startCall(boolean mIsIncomingCall) { +// if (mIsIncomingCall) { +// try { +// if (mCall != null) { +// mCall.answer(null, null); +// } +// } catch (CallException e) { +// Timber.e(e); +// } +// } else { +// if (mCall != null) { +// mCall.start(null); +//// Timber.e("VOX", "start call " + mCall); +// } +// } +// } + public void startCall(boolean mIsIncomingCall) { if (mIsIncomingCall) { try { @@ -139,6 +161,7 @@ public class VoxImplantModule implements IClientLoginListener, IClientSessionLis } } + private void onStartCall(String to, boolean withVideo) { Intent intent = CallActivity.getLaunchIntent(mContext, to, withVideo); mContext.startActivity(intent); @@ -148,7 +171,7 @@ public class VoxImplantModule implements IClientLoginListener, IClientSessionLis mTimer = new Timer(); mTimer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { - if (mCall != null) { + if (mCall != null && mCallToPresenter != null) { mCallToPresenter.timeTicksTicksAway(getTime()); } else { mTimer.cancel(); @@ -226,6 +249,7 @@ public class VoxImplantModule implements IClientLoginListener, IClientSessionLis public void endCall() { mCall = null; mCallToPresenter = null; + connected = false; } @@ -264,12 +288,18 @@ public class VoxImplantModule implements IClientLoginListener, IClientSessionLis //CAL INTERFACE START @Override public void onCallConnected(ICall iCall, Map map) { + connected = true; mCallToPresenter.onCallConnected(); startTimer(); + if (iCall.isVideoEnabled()) { + mCallToPresenter.activeVideoCall(iCall); + } else { + mCallToPresenter.activeAudioCall(iCall); + } } @Override public void onCallDisconnected(ICall iCall, Map map, boolean b) { - mCallToPresenter.callEnded(); + if (mCallToPresenter != null) mCallToPresenter.callEnded(); if (mTimer != null) mTimer.cancel(); endCall(); } @@ -326,7 +356,7 @@ public class VoxImplantModule implements IClientLoginListener, IClientSessionLis public void switchToAudio() { mCall.sendVideo(false, new ICallCompletionHandler() { @Override public void onComplete() { - mCallToPresenter.activeAudioCall(mCall); + mCallToPresenter.audioCall(mCall); } @Override public void onFailure(CallException e) { @@ -338,7 +368,7 @@ public class VoxImplantModule implements IClientLoginListener, IClientSessionLis public void switchToVideo() { mCall.sendVideo(true, new ICallCompletionHandler() { @Override public void onComplete() { - mCallToPresenter.activeVideoCall(mCall); + mCallToPresenter.videoCall(mCall); } @Override public void onFailure(CallException e) { diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/CallPresenter.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/CallPresenter.java index a84adf6d97..61cff3fa94 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/CallPresenter.java +++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/CallPresenter.java @@ -5,7 +5,6 @@ import com.nynja.mobile.communicator.data.models.ChatModel; import com.nynja.mobile.communicator.data.models.mqtt.Contact; import com.nynja.mobile.communicator.data.models.mqtt.Response; import com.nynja.mobile.communicator.data.voximplant.CallToPresenter; -import com.nynja.mobile.communicator.data.voximplant.VoxImplantModule; import com.nynja.mobile.communicator.mvp.view.CallView; import com.nynja.mobile.communicator.ui.fragments.chats.ChatFragment; import com.voximplant.sdk.call.ICall; @@ -21,7 +20,6 @@ public class CallPresenter extends BasePresenter // private static final int SECOND_IN_MINUTE = 60; private ICall mCall; // private Timer mTimer; - private VoxImplantModule mVoxImplantModule; @Override protected Class[] getFilter() { return new Class[0]; @@ -65,19 +63,19 @@ public class CallPresenter extends BasePresenter // } public void switchToAudio() { - mVoxImplantModule.switchToAudio(); + mDataManager.getVoxImlant().switchToAudio(); } - public void hanUp() { + public void hangUp() { // if (mCall != null) mCall.hangup(null); - mVoxImplantModule.hangUp(); + mDataManager.getVoxImlant().hangUp(); getViewState().fatality(); } public void mute(boolean on) { // mCall.sendAudio(on); // getViewState().onMute(on); - mVoxImplantModule.mute(on); + mDataManager.getVoxImlant().mute(on); } public void speaker(boolean on) { @@ -86,7 +84,7 @@ public class CallPresenter extends BasePresenter public void startCall(boolean mIsIncomingCall) { - mVoxImplantModule.startCall(mIsIncomingCall); + mDataManager.getVoxImlant().startCall(mIsIncomingCall); // if (mIsIncomingCall) { // try { // if (mCall != null) { @@ -202,18 +200,26 @@ public class CallPresenter extends BasePresenter getViewState().setUser(mDataManager.getProfile().getRoster().getContactByVoxUser(username)); } - @Override public void activeVideoCall(ICall Call) { - getViewState().activeVideoCall(); + public void reloadVideo() { + mDataManager.getVoxImlant().reloadSurfaceRenderer(); } - @Override public void activeAudioCall(ICall call) { - getViewState().activeAudioCall(); + @Override public void videoCall(ICall Call) { + getViewState().videoCall(); + } + + @Override public void audioCall(ICall call) { + getViewState().audioCall(); } @Override public void remoteVideoStreamAdded(IVideoStream iVideoStream) { getViewState().onRemoteVideoStreamAdded(iVideoStream); } + @Override public void remoteVideoStreanRemoved(IVideoStream iVideoStream) { + getViewState().onRemoteVideoStreamAdded(iVideoStream); + } + @Override public void timeTicksTicksAway(String time) { getViewState().callTimeUpdated(time); } @@ -245,4 +251,12 @@ public class CallPresenter extends BasePresenter @Override public void onLocalVideoStreamAdded(IVideoStream iVideoStream, boolean added) { getViewState().onLocalVideoStreamAdded(iVideoStream, added); } + + @Override public void activeVideoCall(ICall Call) { + getViewState().activeVideoCall(); + } + + @Override public void activeAudioCall(ICall call) { + getViewState().activeAudioCall(); + } } diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ChatPresenter.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ChatPresenter.java index bf41b78c97..4257bd7dd4 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ChatPresenter.java +++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ChatPresenter.java @@ -22,6 +22,8 @@ import java.io.File; import java.util.ArrayList; import java.util.Collections; +import timber.log.Timber; + /** * Created by dmitro.boiko on 27/07/2017. **/ @@ -240,19 +242,33 @@ public class ChatPresenter extends BaseErrorPresenter implements CallT mDataManager.getVoxImlant().getActiveCall(this); } + public void openCall(boolean video) { + if (video) { + mDataManager.videoCall(mChatModel.members.get(0).person_id); + } else { + mDataManager.audioCall(mChatModel.members.get(0).person_id); + } + } + //CALL CALlBACKS - @Override public void activeVideoCall(ICall Call) { - getViewState().onActiveVideoCall(); + @Override public void videoCall(ICall Call) { + Timber.e("SHOULD BE HERE"); +// NOT POSSIBLE HERE } - @Override public void activeAudioCall(ICall call) { - getViewState().onActiveAudioCall(); + @Override public void audioCall(ICall call) { + Timber.e("SHOULD BE HERE"); + // NOT POSSIBLE HERE } @Override public void remoteVideoStreamAdded(IVideoStream iVideoStream) { getViewState().onVideoStreamAdded(iVideoStream); } + @Override public void remoteVideoStreanRemoved(IVideoStream iVideoStream) { + getViewState().onVideoStreamRemoved(iVideoStream); + } + @Override public void timeTicksTicksAway(String time) { getViewState().onCallTimeChange(time); } @@ -284,4 +300,12 @@ public class ChatPresenter extends BaseErrorPresenter implements CallT @Override public void onLocalVideoStreamAdded(IVideoStream iVideoStream, boolean added) { } + + @Override public void activeVideoCall(ICall Call) { + getViewState().onActiveVideoCall(); + } + + @Override public void activeAudioCall(ICall call) { + getViewState().onActiveAudioCall(); + } } diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/IncomeCallPresenter.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/IncomeCallPresenter.java index b3efc5af74..35f29cd817 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/IncomeCallPresenter.java +++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/IncomeCallPresenter.java @@ -106,7 +106,7 @@ public class IncomeCallPresenter extends BasePresenter // if (mCall != null) mCall.removeCallListener(this); // } - @Override public void activeVideoCall(ICall call) { + @Override public void videoCall(ICall call) { getViewState().hasVideo(true); String userName = call.getEndpoints().get(0).getUserName(); Contact contact = mDataManager.getProfile().getRoster().getContactByVoxUser(userName); @@ -114,7 +114,7 @@ public class IncomeCallPresenter extends BasePresenter getViewState().setCall(contact); } - @Override public void activeAudioCall(ICall call) { + @Override public void audioCall(ICall call) { getViewState().hasVideo(false); String userName = call.getEndpoints().get(0).getUserName(); Contact contact = mDataManager.getProfile().getRoster().getContactByVoxUser(userName); @@ -157,4 +157,16 @@ public class IncomeCallPresenter extends BasePresenter @Override public void onLocalVideoStreamAdded(IVideoStream iVideoStream, boolean added) { } + + @Override public void remoteVideoStreanRemoved(IVideoStream iVideoStream) { + + } + + @Override public void activeVideoCall(ICall Call) { + //not possible here + } + + @Override public void activeAudioCall(ICall call) { +//not possible here + } } 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 1802821f19..c14a53a3ea 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 @@ -17,6 +17,8 @@ public interface CallView extends MvpView { void onRemoteVideoStreamAdded(IVideoStream iVideoStream); + void onRemoteVideoStreamRemoved(IVideoStream iVideoStream); + void onCallFailed(String description); void onCallRinging(); @@ -33,6 +35,10 @@ public interface CallView extends MvpView { void setUser(Contact contact); + void audioCall(); + + void videoCall(); + void activeAudioCall(); void activeVideoCall(); diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/view/ChatView.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/view/ChatView.java index 5990721529..bddc4b8c9b 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/mvp/view/ChatView.java +++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/view/ChatView.java @@ -67,4 +67,6 @@ public interface ChatView extends ErrorMvpView { void onVideoStreamAdded(IVideoStream iVideoStream); + void onVideoStreamRemoved(IVideoStream iVideoStream); + } diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java index 933d21f04e..415bf51f30 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java +++ b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java @@ -105,6 +105,8 @@ public class CallActivity extends BaseActivity implements withVideoIfCan = getIntent().getBooleanExtra(WITH_VIDEO, true); if (!withVideoIfCan) { mPresenter.switchToAudio(); + } else { + mPresenter.reloadVideo(); } } @@ -121,39 +123,43 @@ public class CallActivity extends BaseActivity implements // } private void showVideo() { - if (!mIsSpeakerPhoneEnabled) turnSpeaker(); //in case of starting call after callback + runOnUiThread(() -> { + if (!mIsSpeakerPhoneEnabled) turnSpeaker(); //in case of starting call after callback - videoLocal.setZOrderMediaOverlay(true); - mCameraManager = Voximplant.getCameraManager(this); + videoLocal.setZOrderMediaOverlay(true); + mCameraManager = Voximplant.getCameraManager(this); - if (callInProgress) { - videoIncomeLayout.setVisibility(View.VISIBLE); - videoOutgoingLayout.setVisibility(View.GONE); - name.setVisibility(View.GONE); - videoViewLayout.setVisibility(View.VISIBLE); - } else { - videoOutgoingLayout.setVisibility(View.VISIBLE); - videoViewLayout.setVisibility(View.GONE); - } + if (callInProgress) { + videoIncomeLayout.setVisibility(View.VISIBLE); + videoOutgoingLayout.setVisibility(View.GONE); + name.setVisibility(View.GONE); + videoViewLayout.setVisibility(View.VISIBLE); + } else { + videoOutgoingLayout.setVisibility(View.VISIBLE); + videoViewLayout.setVisibility(View.GONE); + } + }); } private void showAudio() { - videoViewLayout.setVisibility(View.GONE); - videoIncomeLayout.setVisibility(View.GONE); - videoOutgoingLayout.setVisibility(View.GONE); + runOnUiThread(() -> { + videoViewLayout.setVisibility(View.GONE); + videoIncomeLayout.setVisibility(View.GONE); + videoOutgoingLayout.setVisibility(View.GONE); - if (callInProgress) { - audioIncomeLayout.setVisibility(View.VISIBLE); - name.setVisibility(View.VISIBLE); - } else { - audioOutgoingLayout.setVisibility(View.VISIBLE); - } + if (callInProgress) { + audioIncomeLayout.setVisibility(View.VISIBLE); + name.setVisibility(View.VISIBLE); + } else { + audioOutgoingLayout.setVisibility(View.VISIBLE); + } + }); } @OnClick({R.id.audio_active_hangup, R.id.video_active_hangup, R.id.audio_call_outgoing_hangup, R.id.video_outgoing_hangup}) void hangUp() { - mPresenter.hanUp(); + mPresenter.hangUp(); } @OnClick(R.id.video_active_switch_camera) @@ -254,8 +260,10 @@ public class CallActivity extends BaseActivity implements } @Override public void onCallEnded() { - this.runOnUiThread(() -> status.setText("Call disconnected")); - + this.runOnUiThread(() -> { + status.setText("Call disconnected"); + fatality(); + }); } @Override public void onCallConnected() { @@ -304,6 +312,10 @@ public class CallActivity extends BaseActivity implements iVideoStream.addVideoRenderer(videoRemote, RenderScaleType.SCALE_FIT); } + @Override public void onRemoteVideoStreamRemoved(IVideoStream iVideoStream) { + iVideoStream.removeVideoRenderer(videoRemote); + } + // @Override // public void onRemoteVideoStreamAdded(IEndpoint endpoint, IVideoStream videoStream) { // videoStream.addVideoRenderer(videoRemote, RenderScaleType.SCALE_FIT); @@ -332,12 +344,21 @@ public class CallActivity extends BaseActivity implements Timber.e("Camera switch error"); } + @Override public void audioCall() { + showAudio(); + } + + @Override public void videoCall() { + showVideo(); + } + @Override public void activeAudioCall() { + callInProgress = true; showAudio(); } @Override public void activeVideoCall() { + callInProgress = true; showVideo(); } - } diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java b/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java index 6664e41781..56dff072ed 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java +++ b/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java @@ -101,6 +101,7 @@ public class ChatFragment extends BaseFragment implements ChatView, @BindView(R.id.chat_audio_layout) View chatAudioLayout; @BindView(R.id.f_chat_header) View chatHeader; @BindView(R.id.chat_audio_duration) TextView duration; + @BindView(R.id.chat_audio_photo) ImageView audioAvatar; private ChatAdapter mAdapter; private Disposable mDisposable; @@ -456,6 +457,16 @@ public class ChatFragment extends BaseFragment implements ChatView, mChatPresenter.sendAudio(); } + @OnClick(R.id.chat_active_video) + void openVideoCall() { + mChatPresenter.openCall(true); + } + + @OnClick(R.id.chat_return_call) + void openAudioCall() { + mChatPresenter.openCall(false); + } + @Override public void recordIsPlaying(boolean isPlaying) { mPlayRecordImage.setImageResource(isPlaying ? R.drawable.v_stop : R.drawable.v_play); } @@ -525,6 +536,11 @@ public class ChatFragment extends BaseFragment implements ChatView, @Override public void onActiveAudioCall() { chatHeader.setVisibility(View.GONE); chatAudioLayout.setVisibility(View.VISIBLE); + Glide.with(getActivity()) + .load(mChatModel.avatar) + .placeholder(R.drawable.contact_placeholder) + .bitmapTransform(new CropCircleTransformation(getContext())) + .into(audioAvatar); } @Override public void onActiveVideoCall() { @@ -533,24 +549,32 @@ public class ChatFragment extends BaseFragment implements ChatView, } @Override public void onCallTimeChange(String time) { - if (chatAudioLayout.getVisibility() == View.VISIBLE) { - duration.setText(getString(R.string.call_voice_call, time)); - } + getActivity().runOnUiThread(() -> { + if (chatAudioLayout.getVisibility() == View.VISIBLE) { + duration.setText(time); + } + }); } @Override public void onCallEnded() { - if (video.getVisibility() == View.VISIBLE) { - video.setVisibility(View.GONE); - } + getActivity().runOnUiThread(() -> { + if (video.getVisibility() == View.VISIBLE) { + video.setVisibility(View.GONE); + } - if (chatAudioLayout.getVisibility() == View.VISIBLE) { - chatAudioLayout.setVisibility(View.GONE); - } + if (chatAudioLayout.getVisibility() == View.VISIBLE) { + chatAudioLayout.setVisibility(View.GONE); + } - chatHeader.setVisibility(View.VISIBLE); + chatHeader.setVisibility(View.VISIBLE); + }); } @Override public void onVideoStreamAdded(IVideoStream iVideoStream) { iVideoStream.addVideoRenderer(video, RenderScaleType.SCALE_FIT); } + + @Override public void onVideoStreamRemoved(IVideoStream iVideoStream) { + iVideoStream.removeVideoRenderer(video); + } } \ No newline at end of file diff --git a/app/src/main/res/layout/partial_chat_audio.xml b/app/src/main/res/layout/partial_chat_audio.xml index a27dcd7619..09060a747b 100644 --- a/app/src/main/res/layout/partial_chat_audio.xml +++ b/app/src/main/res/layout/partial_chat_audio.xml @@ -5,7 +5,8 @@ xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:padding="16dp" - android:background="#fd3333"> + android:background="#fd3333" + android:id="@+id/chat_audio_active_layout"> Date: Thu, 17 Aug 2017 17:51:33 +0300 Subject: [PATCH 13/29] saving code before revert --- .../communicator/ui/fragments/chats/ChatFragment.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java b/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java index 56dff072ed..9a15985fa8 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java +++ b/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java @@ -457,13 +457,11 @@ public class ChatFragment extends BaseFragment implements ChatView, mChatPresenter.sendAudio(); } - @OnClick(R.id.chat_active_video) - void openVideoCall() { + @OnClick(R.id.chat_active_video) void openVideoCall() { mChatPresenter.openCall(true); } - @OnClick(R.id.chat_return_call) - void openAudioCall() { + @OnClick(R.id.chat_return_call) void openAudioCall() { mChatPresenter.openCall(false); } -- GitLab From ad78426102db5d0bdb897d4aec8fb4a12c026b94 Mon Sep 17 00:00:00 2001 From: Krocks Date: Thu, 17 Aug 2017 18:47:38 +0300 Subject: [PATCH 14/29] cleaned up a bit --- .../data/voximplant/VoxImplantModule.java | 48 ------ .../mvp/presenters/CallPresenter.java | 138 +----------------- .../mvp/presenters/IncomeCallPresenter.java | 75 +--------- .../ui/fragments/chats/ChatFragment.java | 21 ++- app/src/main/res/layout/fragment_chat.xml | 8 +- .../main/res/layout/partial_chat_audio.xml | 4 +- 6 files changed, 23 insertions(+), 271 deletions(-) diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/VoxImplantModule.java b/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/VoxImplantModule.java index 88ad35ca7c..fc68e3f7d7 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/VoxImplantModule.java +++ b/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/VoxImplantModule.java @@ -93,25 +93,8 @@ public class VoxImplantModule implements IClientLoginListener, IClientSessionLis mCallToPresenter.audioCall(mCall); } } - -// return mCall; } -// public void getActiveCall(CallToPresenter callToPresenter, boolean forceAudio) { -// this.mCallToPresenter = callToPresenter; -// mCall.addCallListener(this); -// if (!mCall.getEndpoints().isEmpty()) { -// IEndpoint mEndpoint = mCall.getEndpoints().get(0); -// mEndpoint.setEndpointListener(this); -// } -// if (mCall.isVideoEnabled()){ -// mCallToPresenter.videoCall(mCall); -// } else { -// mCallToPresenter.audioCall(mCall); -// } -//// return mCall; -// } - public void videoCall(String userId) { makeCall(userId, true); } @@ -127,23 +110,6 @@ public class VoxImplantModule implements IClientLoginListener, IClientSessionLis } } -// public void startCall(boolean mIsIncomingCall) { -// if (mIsIncomingCall) { -// try { -// if (mCall != null) { -// mCall.answer(null, null); -// } -// } catch (CallException e) { -// Timber.e(e); -// } -// } else { -// if (mCall != null) { -// mCall.start(null); -//// Timber.e("VOX", "start call " + mCall); -// } -// } -// } - public void startCall(boolean mIsIncomingCall) { if (mIsIncomingCall) { try { @@ -156,7 +122,6 @@ public class VoxImplantModule implements IClientLoginListener, IClientSessionLis } else { if (mCall != null) { mCall.start(null); -// Timber.e("VOX", "start call " + mCall); } } } @@ -256,31 +221,18 @@ public class VoxImplantModule implements IClientLoginListener, IClientSessionLis // ENDPOINT INTERFACE + VIDEO @Override public void onRemoteVideoStreamAdded(IEndpoint iEndpoint, IVideoStream iVideoStream) { this.mVideoStream = iVideoStream; -// if (this.mSurfaceViewRenderer != null) { -// mVideoStream.addVideoRenderer(mSurfaceViewRenderer, RENDER_TYPE); -// } mCallToPresenter.remoteVideoStreamAdded(iVideoStream); } @Override public void onRemoteVideoStreamRemoved(IEndpoint iEndpoint, IVideoStream iVideoStream) { - //TODO nothing maybe? this is not going to happen? -// if (mSurfaceViewRenderer != null) { -// iVideoStream.removeVideoRenderer(mSurfaceViewRenderer); mVideoStream = null; -// mSurfaceViewRenderer = null; -// } } public void reloadSurfaceRenderer() { if (mVideoStream != null) { mCallToPresenter.remoteVideoStreamAdded(mVideoStream); } -// mCallToPresenter -// this.mSurfaceViewRenderer = surfaceViewRenderer; -// if (mVideoStream != null) { -// mVideoStream.addVideoRenderer(mSurfaceViewRenderer, RENDER_TYPE); -// } } // ENDPOINT INTERFACE + VIDEO END diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/CallPresenter.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/CallPresenter.java index 61cff3fa94..9973b709dc 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/CallPresenter.java +++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/CallPresenter.java @@ -11,15 +11,7 @@ import com.voximplant.sdk.call.ICall; import com.voximplant.sdk.call.IVideoStream; @InjectViewState -public class CallPresenter extends BasePresenter - implements CallToPresenter -// implements ICallListener -{ - - // private static final int SECOND = 1000; -// private static final int SECOND_IN_MINUTE = 60; - private ICall mCall; - // private Timer mTimer; +public class CallPresenter extends BasePresenter implements CallToPresenter { @Override protected Class[] getFilter() { return new Class[0]; @@ -30,51 +22,25 @@ public class CallPresenter extends BasePresenter public void getCall() { mDataManager.getCall(this); -// mCall = mDataManager.getCall(this); -// if (mCall != null) { -// mCall.addCallListener(this); -// getViewState().onCallSet(mCall); -// if (!mCall.getEndpoints().isEmpty()) { -// IEndpoint mEndpoint = mCall.getEndpoints().get(0); -// mEndpoint.setEndpointListener(mDataManager.getVoxImlant()); -// } } -// public void reloadVideo(SurfaceViewRenderer renderer) { -// mDataManager.getVoxImlant().reloadSurfaceRenderer(renderer); -// } public void switchCamera() { getViewState().onCameraSwitch(); } -// public void sendVideo(boolean sendVideo) { -// //// TODO: 10.08.17 switch audio-video -// mCall.sendVideo(sendVideo, new ICallCompletionHandler() { -// @Override public void onComplete() { -// getViewState().switchUi(sendVideo); -// } -// -// @Override public void onFailure(CallException e) { -// Timber.e(e); -// } -// }); -// } public void switchToAudio() { mDataManager.getVoxImlant().switchToAudio(); } public void hangUp() { -// if (mCall != null) mCall.hangup(null); mDataManager.getVoxImlant().hangUp(); getViewState().fatality(); } public void mute(boolean on) { -// mCall.sendAudio(on); -// getViewState().onMute(on); mDataManager.getVoxImlant().mute(on); } @@ -85,56 +51,8 @@ public class CallPresenter extends BasePresenter public void startCall(boolean mIsIncomingCall) { mDataManager.getVoxImlant().startCall(mIsIncomingCall); -// if (mIsIncomingCall) { -// try { -// if (mCall != null) { -// mCall.answer(null, null); -// } -// } catch (CallException e) { -// Timber.e(e); -// } -// } else { -// if (mCall != null) { -// mCall.start(null); -// Timber.e("VOX", "start call " + mCall); -// } -// } } -// private void startTimer() { -// mTimer = new Timer(); -// mTimer.scheduleAtFixedRate(new TimerTask() { -// @Override public void run() { -// if (mCall != null) { -// getViewState().callTimeUpdated(getTime()); -// } else { -// mTimer.cancel(); -// } -// } -// }, SECOND, SECOND); -// } -// -// private String getTime() { -// try { -// long milliseconds = mCall.getCallDuration(); -// if (milliseconds > SECOND * SECOND_IN_MINUTE * 60 * 24) -// return ""; //sometimes voximplant returns current time milis or something like that -// int seconds = (int) milliseconds / SECOND; -// int minutes = seconds / SECOND_IN_MINUTE; -// -// String time; -// if (seconds % SECOND_IN_MINUTE >= 10) { -// time = minutes + ":" + seconds % SECOND_IN_MINUTE; -// } else { -// time = minutes + ":0" + seconds % SECOND_IN_MINUTE; -// } -// -// return time; -// } catch (NullPointerException e) { -// e.printStackTrace(); -// return ""; -// } -// } public void openChat(Contact item) { ChatModel chatModel = mDataManager.getChatWith(item.phoneId); @@ -142,60 +60,6 @@ public class CallPresenter extends BasePresenter getViewState().fatality(); } -// @Override public void onCallConnected(ICall iCall, Map map) { -// Timber.i("Call connected"); -// startTimer(); -// getViewState().onCallConnected(); -// } - -// @Override public void onCallEnded(ICall iCall, Map map, boolean b) { -// Timber.i("Call disconnected"); -// getViewState().onCallEnded(); -// getViewState().fatality(); //TODO add activity finish on disconnect -// if (mTimer != null) mTimer.cancel(); -// mDataManager.callEnd(); -// } - -// @Override public void onCallRinging(ICall iCall, Map map) { -// Timber.i("Call ringing..."); -// getViewState().onCallRinging(); -// } - -// @Override public void onCallFailed(ICall iCall, int i, String s, Map map) { -// Timber.i("Call failed"); -// getViewState().onCallFailed(s); -// mDataManager.callEnd(); -// } - -// @Override public void onCallAudioStarted(ICall iCall) { -// -// } -// -// @Override -// public void onSIPInfoReceived(ICall iCall, String s, String s1, Map map) { -// -// } -// -// @Override public void onMessageReceived(ICall iCall, String s) { -// -// } - -// @Override public void onLocalVideoStreamAdded(ICall iCall, IVideoStream iVideoStream) { -// getViewState().onLocalVideoStreamAdded(iVideoStream, true); -// } -// -// @Override public void onLocalVideoStreamRemoved(ICall iCall, IVideoStream iVideoStream) { -// getViewState().onLocalVideoStreamAdded(iVideoStream, false); -// } - -// @Override public void onICETimeout(ICall iCall) { -// mDataManager.callEnd(); -// } -// -// @Override public void onICECompleted(ICall iCall) { -// -// } - public void getUser(String username) { getViewState().setUser(mDataManager.getProfile().getRoster().getContactByVoxUser(username)); } diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/IncomeCallPresenter.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/IncomeCallPresenter.java index 35f29cd817..674fd6ab65 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/IncomeCallPresenter.java +++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/IncomeCallPresenter.java @@ -11,12 +11,8 @@ import com.voximplant.sdk.call.IVideoStream; import timber.log.Timber; @InjectViewState -public class IncomeCallPresenter extends BasePresenter - implements CallToPresenter -// implements ICallListener -{ +public class IncomeCallPresenter extends BasePresenter implements CallToPresenter { - private ICall mCall; @Override protected Class[] getFilter() { return new Class[0]; @@ -29,88 +25,20 @@ public class IncomeCallPresenter extends BasePresenter } public void declineCall() { -// try { -// if (mCall != null) { -// mCall.reject(null); -// mCall.removeCallListener(this); -// } -// } catch (CallException e) { -// Timber.e("VoxImplantSDKDemo", "exception on reject call ", e); -// } -// mDataManager.callEnd(); mDataManager.getVoxImlant().declineCall(); getViewState().onCallDisconnected(); } public void geCall() { mDataManager.getCall(this); -// if (mCall != null && mCall.getEndpoints() != null) { -// String userName = mCall.getEndpoints().get(0).getUserName(); -// Contact contact = mDataManager.getProfile().getRoster().getContactByVoxUser(userName); -// getViewState().setCall(mCall, contact); -// getViewState().setCall(contact); -// mCall.addCallListener(this); -// getViewState().hasVideo(mCall.isVideoEnabled()); -// } } -// @Override public void onCallConnected(ICall iCall, Map map) { // -// } -// -// @Override public void onCallDisconnected(ICall mCall, Map map, boolean b) { -// mCall.removeCallListener(this); -// getViewState().onCallDisconnected(); -// mDataManager.callEnd(); -// } -// -// @Override public void onCallRinging(ICall iCall, Map map) { -// -// } -// -// @Override public void onCallFailed(ICall iCall, int i, String s, Map map) { -// mDataManager.callEnd(); -// } -// -// @Override public void onCallAudioStarted(ICall iCall) { -// -// } -// -// @Override -// public void onSIPInfoReceived(ICall iCall, String s, String s1, Map map) { -// -// } -// -// @Override public void onMessageReceived(ICall iCall, String s) { -// -// } -// -// @Override public void onLocalVideoStreamAdded(ICall iCall, IVideoStream iVideoStream) { -// -// } -// -// @Override public void onLocalVideoStreamRemoved(ICall iCall, IVideoStream iVideoStream) { -// -// } -// -// @Override public void onICETimeout(ICall iCall) { -// mDataManager.callEnd(); -// } -// -// @Override public void onICECompleted(ICall iCall) { -// -// } -// -// @Override public void detachView(IncomeCallView view) { -// super.detachView(view); -// if (mCall != null) mCall.removeCallListener(this); -// } @Override public void videoCall(ICall call) { getViewState().hasVideo(true); String userName = call.getEndpoints().get(0).getUserName(); Contact contact = mDataManager.getProfile().getRoster().getContactByVoxUser(userName); -// getViewState().setCall(mCall, contact); getViewState().setCall(contact); } @@ -118,7 +46,6 @@ public class IncomeCallPresenter extends BasePresenter getViewState().hasVideo(false); String userName = call.getEndpoints().get(0).getUserName(); Contact contact = mDataManager.getProfile().getRoster().getContactByVoxUser(userName); -// getViewState().setCall(mCall, contact); getViewState().setCall(contact); } diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java b/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java index 9a15985fa8..8f90ca7d31 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java +++ b/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java @@ -102,6 +102,7 @@ public class ChatFragment extends BaseFragment implements ChatView, @BindView(R.id.f_chat_header) View chatHeader; @BindView(R.id.chat_audio_duration) TextView duration; @BindView(R.id.chat_audio_photo) ImageView audioAvatar; +// @BindView(R.id.chat_return_call) ImageView activeCall; private ChatAdapter mAdapter; private Disposable mDisposable; @@ -156,6 +157,7 @@ public class ChatFragment extends BaseFragment implements ChatView, initHeader(); initFooter(); mFusedLocationClient = LocationServices.getFusedLocationProviderClient(getContext()); + } private void initFooter() { @@ -171,6 +173,12 @@ public class ChatFragment extends BaseFragment implements ChatView, .bitmapTransform(new CropCircleTransformation(getContext())) .into(headerPhoto); //TODO set status online/offline e.g. + + Glide.with(getActivity()) + .load(mChatModel.avatar) + .placeholder(R.drawable.contact_placeholder) + .bitmapTransform(new CropCircleTransformation(getContext())) + .into(audioAvatar); //for audio heder } @Override public void onResume() { @@ -462,6 +470,7 @@ public class ChatFragment extends BaseFragment implements ChatView, } @OnClick(R.id.chat_return_call) void openAudioCall() { +// @OnClick(R.id.chat_audio_layout) void openAudioCall() { mChatPresenter.openCall(false); } @@ -532,13 +541,13 @@ public class ChatFragment extends BaseFragment implements ChatView, // } @Override public void onActiveAudioCall() { - chatHeader.setVisibility(View.GONE); chatAudioLayout.setVisibility(View.VISIBLE); - Glide.with(getActivity()) - .load(mChatModel.avatar) - .placeholder(R.drawable.contact_placeholder) - .bitmapTransform(new CropCircleTransformation(getContext())) - .into(audioAvatar); + +// activeCall.setOnClickListener(new View.OnClickListener() { +// @Override public void onClick(View v) { +// mChatPresenter.openCall(false); +// } +// }); } @Override public void onActiveVideoCall() { diff --git a/app/src/main/res/layout/fragment_chat.xml b/app/src/main/res/layout/fragment_chat.xml index e9a4ac9e9b..29befb0cdc 100644 --- a/app/src/main/res/layout/fragment_chat.xml +++ b/app/src/main/res/layout/fragment_chat.xml @@ -6,15 +6,15 @@ android:layout_height="match_parent"> + + - - - -- GitLab From c7d0dc50da6f2e5af5201108b96762216d97bc5f Mon Sep 17 00:00:00 2001 From: Krocks Date: Thu, 17 Aug 2017 19:50:23 +0300 Subject: [PATCH 15/29] added icons, bug fixes --- .../data/voximplant/VoxImplantModule.java | 3 ++- .../mvp/presenters/CallPresenter.java | 5 ++++ .../ui/activities/calls/CallActivity.java | 25 ++++++++++++++++--- .../activities/calls/IncomeCallActivity.java | 4 +-- .../main/res/drawable/ic_featured_video.xml | 9 +++++++ .../main/res/layout/partial_chat_audio.xml | 9 ++++--- .../main/res/layout/partial_video_active.xml | 6 ++--- 7 files changed, 47 insertions(+), 14 deletions(-) create mode 100644 app/src/main/res/drawable/ic_featured_video.xml diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/VoxImplantModule.java b/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/VoxImplantModule.java index fc68e3f7d7..9447fc4ded 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/VoxImplantModule.java +++ b/app/src/main/java/com/nynja/mobile/communicator/data/voximplant/VoxImplantModule.java @@ -111,6 +111,7 @@ public class VoxImplantModule implements IClientLoginListener, IClientSessionLis } public void startCall(boolean mIsIncomingCall) { + if (connected) return; if (mIsIncomingCall) { try { if (mCall != null) { @@ -128,7 +129,7 @@ public class VoxImplantModule implements IClientLoginListener, IClientSessionLis private void onStartCall(String to, boolean withVideo) { - Intent intent = CallActivity.getLaunchIntent(mContext, to, withVideo); + Intent intent = CallActivity.getLaunchIntent(mContext, to, withVideo, false); mContext.startActivity(intent); } diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/CallPresenter.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/CallPresenter.java index 9973b709dc..2063b0ef7d 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/CallPresenter.java +++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/CallPresenter.java @@ -60,6 +60,7 @@ public class CallPresenter extends BasePresenter implements CallToPres getViewState().fatality(); } + public void getUser(String username) { getViewState().setUser(mDataManager.getProfile().getRoster().getContactByVoxUser(username)); } @@ -123,4 +124,8 @@ public class CallPresenter extends BasePresenter implements CallToPres @Override public void activeAudioCall(ICall call) { getViewState().activeAudioCall(); } + + public void checkCall() { + mDataManager.getVoxImlant().getActiveCall(this); + } } diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java index 415bf51f30..0c3e66d51b 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java +++ b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/CallActivity.java @@ -40,6 +40,7 @@ public class CallActivity extends BaseActivity implements private static final int FRONT_CAMERA = 1; private static final String USER_NAME_TAG = "username"; + private static final String INCOME = "income"; private static final String WITH_VIDEO = "with_video"; private static final VideoQuality DEFAULT_VIDEO_QUALITY = VideoQuality.VIDEO_QUALITY_HIGH; //Base layouts for audio or video @@ -90,16 +91,32 @@ public class CallActivity extends BaseActivity implements return intent; } + public static Intent getLaunchIntent(Context context, String to, boolean withVideo, boolean income) { + Intent intent = new Intent(context, CallActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.putExtra(USER_NAME_TAG, to); + intent.putExtra(WITH_VIDEO, withVideo); + intent.putExtra(INCOME, income); + return intent; + } + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_call); - + boolean income = true; if (getIntent() != null && getIntent().hasExtra(USER_NAME_TAG)) { mPresenter.getUser(getIntent().getStringExtra(USER_NAME_TAG)); } - startCall(); //TODO not sure if here + + if (getIntent() != null && getIntent().hasExtra(INCOME)) { + income = getIntent().getBooleanExtra(WITH_VIDEO, true); + } + + startCall(income); + mPresenter.checkCall(); + mPresenter.getCall(); if (getIntent() != null && getIntent().hasExtra(WITH_VIDEO)) { withVideoIfCan = getIntent().getBooleanExtra(WITH_VIDEO, true); @@ -254,8 +271,8 @@ public class CallActivity extends BaseActivity implements // } // } - private void startCall() { - mPresenter.startCall(callInProgress); + private void startCall(boolean income) { + mPresenter.startCall(income); status.setText("call connecting"); } diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/IncomeCallActivity.java b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/IncomeCallActivity.java index eef8df13a8..2289856e79 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/IncomeCallActivity.java +++ b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/calls/IncomeCallActivity.java @@ -88,7 +88,7 @@ public class IncomeCallActivity extends BaseActivity implements IncomeCallView { mRxPermissions.request(Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA) .subscribe(granted -> { if (granted) { - startActivity(CallActivity.getLaunchIntent(IncomeCallActivity.this, mUserName, withVideoIfCan)); + startActivity(CallActivity.getLaunchIntent(IncomeCallActivity.this, mUserName, withVideoIfCan, true)); } finish(); }); @@ -96,7 +96,7 @@ public class IncomeCallActivity extends BaseActivity implements IncomeCallView { mRxPermissions.request(Manifest.permission.RECORD_AUDIO) .subscribe(granted -> { if (granted) { - startActivity(CallActivity.getLaunchIntent(IncomeCallActivity.this, mUserName, withVideoIfCan)); + startActivity(CallActivity.getLaunchIntent(IncomeCallActivity.this, mUserName, withVideoIfCan, true)); } finish(); }); diff --git a/app/src/main/res/drawable/ic_featured_video.xml b/app/src/main/res/drawable/ic_featured_video.xml new file mode 100644 index 0000000000..a7da6f33c4 --- /dev/null +++ b/app/src/main/res/drawable/ic_featured_video.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/partial_chat_audio.xml b/app/src/main/res/layout/partial_chat_audio.xml index 4402d8403c..b6f0783b55 100644 --- a/app/src/main/res/layout/partial_chat_audio.xml +++ b/app/src/main/res/layout/partial_chat_audio.xml @@ -18,13 +18,14 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintRight_toRightOf="parent" /> -