diff --git a/app/build.gradle b/app/build.gradle
index 37883ecf7c01374d33085dd990b7dcff1275af98..df102aa9bc0f06e2fcc8ef55518e187ff9d36f30 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -679,7 +679,7 @@ dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
// Conference, Calls mobile SDK
- implementation 'com.nynja.sdk:NynjaSdk:1.22.2.1@aar'
+ implementation 'com.nynja.sdk:NynjaSdk:1.22.3@aar'
//implementation(name: 'NynjaSdk-1.22.2', ext: 'aar')
//ExoPlayer
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 36e1aa2b854158763787344c87d81261abff361f..ebac35fcd4044237a2ea495e07d1b44393cef67a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -282,6 +282,15 @@
+
+
+
+
+
diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/conference/ActiveCallBase.java b/app/src/main/java/com/nynja/mobile/communicator/data/conference/ActiveCallBase.java
index fce484df70291f732c2b534815501c5316c692a3..a1960465e8ae169662a809e8d049d99f0f231f6d 100644
--- a/app/src/main/java/com/nynja/mobile/communicator/data/conference/ActiveCallBase.java
+++ b/app/src/main/java/com/nynja/mobile/communicator/data/conference/ActiveCallBase.java
@@ -12,20 +12,10 @@ public abstract class ActiveCallBase {
P2PCall, ConferenceCall
}
- public enum AudioRouteType {
- SPEAKER,
- EARPIECE,
- BLUETOOTH,
- NOT_SET
- }
-
public String name;
public String mEndPointId;
public CallType mCallType;
public boolean isOutgoingCall;
- public boolean isMuted;
- public boolean isSpeakerOn;
- public AudioRouteType mAudioRouteType;
public boolean isCallInProgress;
public boolean isRinging;
public boolean isSwitchToAudio;
@@ -43,9 +33,6 @@ public abstract class ActiveCallBase {
isVideoEnabled = true;//(callType == CallType.P2PCall);
isVideoFullScreen = false;
isOutgoingCall = outgoingCall;
- isMuted = false;
- isSpeakerOn = false;
- mAudioRouteType = AudioRouteType.NOT_SET;
isRinging = false;
isCallInProgress = false;
isSwitchToAudio = false;
diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/conference/ConferenceVideoModule.java b/app/src/main/java/com/nynja/mobile/communicator/data/conference/ConferenceVideoModule.java
index 21c32cc16055c1af1ebbd8fcd2ac57aa22ba7195..4af37d954e7068e09a69cdb8d499a2d8f98ff2c1 100644
--- a/app/src/main/java/com/nynja/mobile/communicator/data/conference/ConferenceVideoModule.java
+++ b/app/src/main/java/com/nynja/mobile/communicator/data/conference/ConferenceVideoModule.java
@@ -98,7 +98,7 @@ public class ConferenceVideoModule {
if (activeConferenceCall.mData.mParticipantArray != null) {
for (int index = 0; index < activeConferenceCall.mData.mParticipantArray.size(); index++) {
NYNCallParticipant participant = activeConferenceCall.mData.mParticipantArray.get(index);
- ConferenceListItem item = conferenceParticipant(participant, participant.isOwner(), activeConferenceCall.mData.isOwnStreamActive);
+ ConferenceListItem item = conferenceParticipant(participant, participant.isOwner(), activeConferenceCall.mState.isOwnStreamActive);
tempParticipants.add(item);
if (//participant.hasVideo() ||
activeConferenceCall.mData.mActiveParticipanTracks.containsValue(participant.getParticipantId())) {
@@ -112,7 +112,7 @@ public class ConferenceVideoModule {
} else if (//participant.hasVideo() &&
participant.getParticipantId().contentEquals(activeConferenceCall.mConference.participantId()) &&
participant.isMe() &&
- activeConferenceCall.mData.isOwnStreamActive) {
+ activeConferenceCall.mState.isOwnStreamActive) {
//////////////////////////////////////////////////////////////////////////////////////////////////
// WORKAROUND !!!!!!!!!!
item.hasVideo = true;
@@ -129,9 +129,9 @@ public class ConferenceVideoModule {
// if (participant == null) participant = activeConferenceCall.mConference.getParticipantById(set.getValue());
// if (participant != null &&
// (participant.hasVideo() ||
-// (participant.isMe() && activeConferenceCall.mData.isOwnStreamActive) ||
+// (participant.isMe() && activeConferenceCall.mState.isOwnStreamActive) ||
// activeConferenceCall.mData.mActiveParticipanTracks.containsKey(participant.getParticipantId()))) {
-// ConferenceListItem item = conferenceParticipant(participant, participant.isOwner(), activeConferenceCall.mData.isOwnStreamActive);
+// ConferenceListItem item = conferenceParticipant(participant, participant.isOwner(), activeConferenceCall.mState.isOwnStreamActive);
// item.hasVideo = true;
// item.participantId = set.getValue();
// mActiveVideoParticipantsMap.put(item.participantId, item);
diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/conference/PhoneCallReceiver.java b/app/src/main/java/com/nynja/mobile/communicator/data/conference/PhoneCallReceiver.java
new file mode 100644
index 0000000000000000000000000000000000000000..f18d171d0c128558a7f9537484a764f3f5a9dfa8
--- /dev/null
+++ b/app/src/main/java/com/nynja/mobile/communicator/data/conference/PhoneCallReceiver.java
@@ -0,0 +1,43 @@
+package com.nynja.mobile.communicator.data.conference;
+
+import android.app.Service;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.telephony.TelephonyManager;
+
+import com.nynja.mobile.communicator.NynjaApp;
+import com.nynja.mobile.communicator.data.DataManager;
+
+import timber.log.Timber;
+
+public class PhoneCallReceiver extends BroadcastReceiver {
+
+// public static final String PHONE_STATE = "android.intent.action.PHONE_STATE";
+
+ private DataManager mDataManager;
+ TelephonyManager mTelephonyManager;
+ private int mLastPhoneCallState = TelephonyManager.CALL_STATE_IDLE;
+
+ public PhoneCallReceiver() {
+ super();
+ mDataManager = NynjaApp.getComponent().dataManager();
+ mTelephonyManager = (TelephonyManager) mDataManager.getContext().getSystemService(Service.TELEPHONY_SERVICE);
+ if (mTelephonyManager != null) mLastPhoneCallState = mTelephonyManager.getCallState();
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Timber.d("PhoneCallReceiver::onReceive(): Telephony service event");
+ String action = intent.getAction();
+ if (action != null && action.equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)) {
+ if (mTelephonyManager != null) {
+ mDataManager.getConferenceSDK().onPstnCallState(mLastPhoneCallState, mTelephonyManager.getCallState());
+ mLastPhoneCallState = mTelephonyManager.getCallState();
+ } else {
+ Timber.w("PhoneCallReceiver::onReceive(): Telephony Manager is NULL !!!!");
+ }
+ }
+ }
+}
+
diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/sdk/ConferenceSDKPresenter.java b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/ConferenceSDKPresenter.java
index 3db6746b715dc68ab1c82de3add49848533c0e72..cbb2dcba531df942c327e6a2804621a783c2109d 100644
--- a/app/src/main/java/com/nynja/mobile/communicator/data/sdk/ConferenceSDKPresenter.java
+++ b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/ConferenceSDKPresenter.java
@@ -2,6 +2,7 @@ package com.nynja.mobile.communicator.data.sdk;
import com.nynja.mobile.communicator.data.conference.ActiveCallBase;
import com.nynja.mobile.communicator.data.sdk.calls.ActiveConferenceCall;
+import com.nynja.mobile.communicator.data.sdk.calls.CallStateData;
import com.nynja.mobile.communicator.data.sdk.calls.ConferenceSDKListener;
import com.nynja.mobile.communicator.data.sdk.calls.RejoinConferenceCallData;
import com.nynja.mobile.communicator.mvp.presenters.BaseErrorPresenter;
@@ -74,7 +75,7 @@ public abstract class ConferenceSDKPresenter extends Bas
@Override public void onSpeakerStateChanged(boolean isSpeakerOn) {}
- @Override public void onAudioRouteChange(ActiveCallBase.AudioRouteType audioRouteType) { }
+ @Override public void onAudioRouteChange(CallStateData.AudioRouteType audioRouteType) { }
@Override public void tryCallCameraStateChange(boolean pause) {}
@@ -102,5 +103,9 @@ public abstract class ConferenceSDKPresenter extends Bas
@Override public void onPurchaseFinished() {}
+ @Override public void onBluetoothConnectivityChanged(boolean connected) {}
+
+ @Override public void onCallPauseStateChanged(boolean paused) {}
+
@Override public void onCameraSwitched(WebRtcVideoDevicePosition devicePosition) {}
}
diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ActiveConferenceCall.java b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ActiveConferenceCall.java
index 119a27634740a2e6cc2e2598fa650eecaf210e89..881a7088e044a52d1a879931dbd1fee3dbc1003c 100644
--- a/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ActiveConferenceCall.java
+++ b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ActiveConferenceCall.java
@@ -26,6 +26,7 @@ public class ActiveConferenceCall extends ActiveCallBase {
public boolean mWaiting;
public boolean mAutoCreateAndStart;
public ConferenceCallData mData;
+ public CallStateData mState;
public static final int ANDROID_10_PUSH_CALL_NTFN_ID = 1234567890;
@@ -33,7 +34,8 @@ public class ActiveConferenceCall extends ActiveCallBase {
public ActiveConferenceCall(NYNCall conference, String endPointId,
CallType callType, boolean isVideoEnabled, boolean outgoingCall) {
super(endPointId, callType, isVideoEnabled, outgoingCall);
- mData = new ConferenceCallData((callType == CallType.P2PCall), isVideoEnabled);
+ mData = new ConferenceCallData((callType == CallType.P2PCall));
+ mState = new CallStateData(false, isVideoEnabled);
mConference = conference;
mMembers = new ArrayList();
mMyDisplayName = "";
@@ -99,7 +101,7 @@ public class ActiveConferenceCall extends ActiveCallBase {
public boolean isCameraRunning() {
return (mConference != null
- && mData.isOwnStreamActive
+ && mState.isOwnStreamActive
&& isCallInProgress()
&& mConference.isCameraRunning());
}
@@ -197,11 +199,11 @@ public class ActiveConferenceCall extends ActiveCallBase {
"name='" + name + '\'' +
", isOutComingConference=" + isOutgoingCall +
", mEndPointId='" + mEndPointId + '\'' +
- ", isMuted=" + isMuted +
- ", isSpeakerOn=" + isSpeakerOn +
- ", mAudioRouteType=" + mAudioRouteType.toString() +
+ ", isMuted=" + mState.isMuted +
+ ", isSpeakerOn=" + mState.isSpeakerOn +
+ ", mAudioRouteType=" + mState.mAudioRouteType.toString() +
", mConference=" + mConference +
- ", isOwnStreamActive=" + mData.isOwnStreamActive +
+ ", isOwnStreamActive=" + mState.isOwnStreamActive +
", hasRemoteVideoTrack=" + mData.hasRemoteVideoTrack +
", hasRemoteScreenShareTrack=" + mData.hasRemoteScreenShareTrack +
", isVideoEnabled=" + isVideoEnabled +
diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/BluetoothConnectivityListener.java b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/BluetoothConnectivityListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..71f1a6981fda5a4fb29981964a7ed5fdea5f0a5e
--- /dev/null
+++ b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/BluetoothConnectivityListener.java
@@ -0,0 +1,8 @@
+package com.nynja.mobile.communicator.data.sdk.calls;
+
+public interface BluetoothConnectivityListener {
+
+ void onBluetoothDeviceConnected();
+
+ void onBluetoothDeviceDisconnected();
+}
diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/CallStateData.java b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/CallStateData.java
new file mode 100644
index 0000000000000000000000000000000000000000..9775359f091ca7a8a255d76e355fd7dffe51cebf
--- /dev/null
+++ b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/CallStateData.java
@@ -0,0 +1,68 @@
+package com.nynja.mobile.communicator.data.sdk.calls;
+
+public class CallStateData {
+
+ public enum AudioRouteType {
+ SPEAKER,
+ EARPIECE,
+ BLUETOOTH,
+ NOT_SET
+ }
+
+ public boolean isPaused;
+ public boolean isMuted;
+ public boolean isSpeakerOn;
+ public boolean isOwnSSActive;
+ public boolean isOwnStreamActive;
+ public AudioRouteType mAudioRouteType;
+
+ ////////////////////////////////////////////////
+ // store paused state
+ public CallStateData pauseRestoreState;
+
+
+ public CallStateData() {
+ init();
+ }
+
+ public CallStateData(CallStateData copy) {
+ this.isPaused = copy.isPaused;
+ this.isMuted = copy.isMuted;
+ this.isSpeakerOn = copy.isSpeakerOn;
+ this.isOwnSSActive = copy.isOwnSSActive;
+ this.isOwnStreamActive = copy.isOwnStreamActive;
+ this.mAudioRouteType = copy.mAudioRouteType;
+ }
+
+ public void resume() {
+ if (pauseRestoreState != null) {
+ this.isPaused = false;
+ this.isMuted = pauseRestoreState.isMuted;
+ this.isSpeakerOn = pauseRestoreState.isSpeakerOn;
+ this.isOwnSSActive = pauseRestoreState.isOwnSSActive;
+ this.isOwnStreamActive = pauseRestoreState.isOwnStreamActive;
+ this.mAudioRouteType = pauseRestoreState.mAudioRouteType;
+ pauseRestoreState = null;
+ }
+ }
+
+ public void pause() {
+ this.isPaused = true;
+ pauseRestoreState = new CallStateData(this);
+ }
+
+ public CallStateData(boolean isOwnSSActive, boolean isOwnStreamActive) {
+ init();
+ this.isOwnSSActive = isOwnSSActive;
+ this.isOwnStreamActive = isOwnStreamActive;
+ }
+
+ private void init() {
+ isPaused = false;
+ isMuted = false;
+ isSpeakerOn = false;
+ isOwnSSActive = false;
+ isOwnStreamActive = false;
+ mAudioRouteType = AudioRouteType.NOT_SET;
+ }
+}
diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ConferenceCallData.java b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ConferenceCallData.java
index 5fac62702aada9b24aad3a438ac3c028e1f06bc6..f03dfddcf8eb7e883461ada4a67886aa19d1f26c 100644
--- a/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ConferenceCallData.java
+++ b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ConferenceCallData.java
@@ -25,17 +25,15 @@ public class ConferenceCallData {
public boolean hasRemoteVideoTrack;
public boolean hasRemoteScreenShareTrack;
public boolean mIsConference;
- public boolean isOwnStreamActive;
public ConferenceCallData() {
init();
mIsConference = false;
}
- public ConferenceCallData(boolean isConference, boolean videoEnabled) {
+ public ConferenceCallData(boolean isConference) {
init();
mIsConference = isConference;
- isOwnStreamActive = videoEnabled;
}
private void init() {
diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ConferenceSDKListener.java b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ConferenceSDKListener.java
index 9f02aea1b9686880ab09c11dfc2eec9b941d415b..2e55779de861260da07b9dccb76cb98256fe1078 100644
--- a/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ConferenceSDKListener.java
+++ b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ConferenceSDKListener.java
@@ -59,7 +59,7 @@ public interface ConferenceSDKListener {
void onSpeakerStateChanged(boolean isSpeakerOn);
- void onAudioRouteChange(ActiveCallBase.AudioRouteType audioRouteType);
+ void onAudioRouteChange(CallStateData.AudioRouteType audioRouteType);
void tryCallCameraStateChange(boolean pause);
@@ -87,5 +87,9 @@ public interface ConferenceSDKListener {
void onPurchaseFinished();
+ void onBluetoothConnectivityChanged(boolean connected);
+
+ void onCallPauseStateChanged(boolean paused);
+
void onCameraSwitched(WebRtcVideoDevicePosition devicePosition);
}
diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ConferenceSDKModule.java b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ConferenceSDKModule.java
index ec4cb739d8307c05e17631253d7e82515449b9a6..1aa0b0a82541123de55738aad3d69e84acc872a3 100644
--- a/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ConferenceSDKModule.java
+++ b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ConferenceSDKModule.java
@@ -98,7 +98,6 @@ public class ConferenceSDKModule extends BaseSDKModule {
private static final int TOAST_COUNT_DOWN_INTERVAL = TOAST_DURATION_IN_MILLISECONDS / 2;
private static final int SECOND = 1000;
private static final int SECOND_IN_MINUTE = 60;
- private static final String PHONE_STATE = "android.intent.action.PHONE_STATE";
private static final String FREE_TRIAL_180_DAYS = "ndfg9e58u9e8vh0w948t";
public static long READ_PHONE_STATE_RECORD_AUDIO_FLAG = 3; // (1|2)
@@ -149,8 +148,6 @@ public class ConferenceSDKModule extends BaseSDKModule {
private HashMap mConferenceWaitingRoomLNames = new HashMap<>();
private HashMap mMyAcceptedElsewhereCalls = new HashMap<>();
- private int mLastPhoneCallState = TelephonyManager.CALL_STATE_IDLE;
-
private enum States {
Connecting, Connected, Disconnecting, Disconnected
}
@@ -192,19 +189,7 @@ public class ConferenceSDKModule extends BaseSDKModule {
}
public void mute() {
- if (mActiveConference == null) return;
- if (mActiveConference.mConference != null) {
- if (mActiveConference.isMuted) {
- mActiveConference.mConference.unmute();
- } else {
- mActiveConference.mConference.mute();
- }
- mActiveConference.isMuted = !mActiveConference.isMuted;
-
-
- for (ConferenceSDKListener conferenceSDKListener : mConferenceSDKListener)
- conferenceSDKListener.onMicrophoneStateChanged(mActiveConference.isMuted);
- }
+ muteMic(!mActiveConference.mState.isMuted);
}
public void resetCallLink() {
@@ -214,17 +199,17 @@ public class ConferenceSDKModule extends BaseSDKModule {
public void setMuteState(boolean mute) {
if (mActiveConference == null) return;
if (mActiveConference.mConference != null) {
- if (mute == mActiveConference.isMuted) return;
+ if (mute == mActiveConference.mState.isMuted) return;
if (mute) {
mActiveConference.mConference.mute();
} else {
mActiveConference.mConference.unmute();
}
- mActiveConference.isMuted = mute;
+ mActiveConference.mState.isMuted = mute;
for (ConferenceSDKListener conferenceSDKListener : mConferenceSDKListener)
- conferenceSDKListener.onMicrophoneStateChanged(mActiveConference.isMuted);
+ conferenceSDKListener.onMicrophoneStateChanged(mActiveConference.mState.isMuted);
}
}
@@ -249,6 +234,25 @@ public class ConferenceSDKModule extends BaseSDKModule {
}
}
+ public void muteMic(boolean mute) {
+ if (mActiveConference == null) return;
+ if (mActiveConference.mConference != null) {
+ boolean changed = false;
+ if (mActiveConference.mState.isMuted && !mute) {
+ mActiveConference.mConference.unmute();
+ changed = true;
+ } else if (!mActiveConference.mState.isMuted && mute) {
+ mActiveConference.mConference.mute();
+ changed = true;
+ }
+ if (changed) {
+ mActiveConference.mState.isMuted = mute;
+ }
+ for (ConferenceSDKListener conferenceSDKListener : mConferenceSDKListener)
+ conferenceSDKListener.onMicrophoneStateChanged(mActiveConference.mState.isMuted);
+ }
+ }
+
private boolean isCallAdHoc() {
if (!hasCreatedActiveCall()) return false;
if (mActiveConference.mConference == null) return false;
@@ -571,7 +575,7 @@ public class ConferenceSDKModule extends BaseSDKModule {
}
if (hasCreatedActiveCall()) {
- mActiveConference.isSpeakerOn = on;
+ mActiveConference.mState.isSpeakerOn = on;
if (forced) mActiveConference.mIsSpeakerForceStopped = (forced && !on);
}
@@ -582,11 +586,11 @@ public class ConferenceSDKModule extends BaseSDKModule {
}
}
- public void setAudioRoute(ActiveCallBase.AudioRouteType routeType) {
+ public void setAudioRoute(CallStateData.AudioRouteType routeType) {
setAudioRoute(routeType, true);
}
- public void setAudioRoute(ActiveCallBase.AudioRouteType routeType, boolean updateWith, boolean delayed) {
+ public void setAudioRoute(CallStateData.AudioRouteType routeType, boolean updateWith, boolean delayed) {
if (delayed) {
mHandler.postDelayed(() -> {
setAudioRoute(routeType, true);
@@ -596,7 +600,7 @@ public class ConferenceSDKModule extends BaseSDKModule {
}
}
- public void setAudioRoute(ActiveCallBase.AudioRouteType routeType, boolean updateWith) {
+ public void setAudioRoute(CallStateData.AudioRouteType routeType, boolean updateWith) {
if (mConferenceAudioManager == null) {
mConferenceAudioManager = AppRTCAudioManager.create(getContext());
}
@@ -616,7 +620,7 @@ public class ConferenceSDKModule extends BaseSDKModule {
break;
}
if (updateWith && hasCreatedActiveCall()) {
- mActiveConference.mAudioRouteType = routeType;
+ mActiveConference.mState.mAudioRouteType = routeType;
}
for (ConferenceSDKListener conferenceSDKListener : mConferenceSDKListener)
@@ -1151,7 +1155,7 @@ public class ConferenceSDKModule extends BaseSDKModule {
NYNCallParticipant participant = participantArray.get(index);
if (!participant.isSpeaking()) {
continue;
- } else if (participant.isMe() && mActiveConference.isMuted) {
+ } else if (participant.isMe() && mActiveConference.mState.isMuted) {
continue;
}
if (!activeSpeakers.isEmpty()) activeSpeakers += ", ";
@@ -1172,8 +1176,8 @@ public class ConferenceSDKModule extends BaseSDKModule {
NYNCallParticipant participant = participantArray.get(index);
if (participant.isMe()) {
for (ConferenceSDKListener conferenceSDKListener : mConferenceSDKListener) {
- mActiveConference.isMuted = isMuted;
- conferenceSDKListener.onMuteStateChangedByHost(mActiveConference.isMuted);
+ mActiveConference.mState.isMuted = isMuted;
+ conferenceSDKListener.onMuteStateChangedByHost(mActiveConference.mState.isMuted);
}
return;
}
@@ -1305,11 +1309,7 @@ public class ConferenceSDKModule extends BaseSDKModule {
});
}
- public boolean isReadPhoneStatePermissionGranted() {
- return (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED);
- }
-
- public boolean isForAudioCallsPermissionGranted() {
+ public boolean isForAudioCallsPermissionGranted() {
return (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED);
}
@@ -1343,9 +1343,7 @@ public class ConferenceSDKModule extends BaseSDKModule {
}
private void addCallManagerListener() {
- if (isReadPhoneStatePermissionGranted()) {
- registerIncomingCallReceiver(getContext());
- }
+ // TODO: request READ_PHONE_STATE permission!!!!
mCallManagerListener = new INYNCallManagerListener() {
@Override
@@ -1623,6 +1621,9 @@ public class ConferenceSDKModule extends BaseSDKModule {
private void onScreenShareState(String callId, boolean active) {
// not need twice for active call or not!!!
+ if (mActiveConference != null) {
+ mActiveConference.mState.isOwnSSActive = active;
+ }
for (ConferenceSDKListener conferenceListener : mConferenceSDKListener) {
conferenceListener.onScreenShareState(active);
}
@@ -1719,7 +1720,7 @@ public class ConferenceSDKModule extends BaseSDKModule {
if (!hasCreatedActiveCall()) return;
if (mActiveConference.mConference == null) return;
if (mActiveConference.mConference.callId().contentEquals(callId)) {
- mActiveConference.mData.isOwnStreamActive = true;
+ mActiveConference.mState.isOwnStreamActive = true;
for (ConferenceSDKListener conferenceSDKListener : mConferenceSDKListener) {
conferenceSDKListener.onLocalVideoCapturerStarted(mActiveConference);
}
@@ -1730,7 +1731,7 @@ public class ConferenceSDKModule extends BaseSDKModule {
if (!hasCreatedActiveCall()) return;
if (mActiveConference.mConference == null) return;
if (mActiveConference.mConference.callId().contentEquals(callId)) {
- mActiveConference.mData.isOwnStreamActive = false;
+ mActiveConference.mState.isOwnStreamActive = false;
if (mActiveConference.isConference()) {
new Handler(Looper.getMainLooper()).post(() -> {
mActiveConference.mConference.setLocalVideoRenderer(null);
@@ -2163,7 +2164,7 @@ public class ConferenceSDKModule extends BaseSDKModule {
mConferenceDetails = new ConferenceDetails(getDeviceId());
mActiveConference = createActiveConference(null, contact.phoneId, true,
isVideoEnabled, ActiveCallBase.CallType.P2PCall);
- mActiveConference.mData.isOwnStreamActive = isVideoEnabled;
+ mActiveConference.mState.isOwnStreamActive = isVideoEnabled;
mActiveConference.addMember(contact);
setConferenceCallName(mActiveConference, contact.getFullName());
AppsTrackerUtils.getCleverTapInstance().trackEvent(getContext(), AppsTrackerConsts.ATEventMakeP2PCall);
@@ -2676,9 +2677,9 @@ public class ConferenceSDKModule extends BaseSDKModule {
if (mActiveConference.isCallInProgress()) return;
if (mConferenceAudioManager != null) {
mConferenceAudioManager.start(null);
- mActiveConference.isSpeakerOn = mActiveConference.isReceivingVideo();
+ mActiveConference.mState.isSpeakerOn = mActiveConference.isReceivingVideo();
if (!isSpeakerPhoneForced) {
- if (mActiveConference.isSpeakerOn) {
+ if (mActiveConference.mState.isSpeakerOn) {
mConferenceAudioManager.setDefaultAudioDevice(AppRTCAudioManager.AudioDevice.SPEAKER_PHONE);
} else {
mConferenceAudioManager.setDefaultAudioDevice(AppRTCAudioManager.AudioDevice.EARPIECE);
@@ -2930,7 +2931,7 @@ public class ConferenceSDKModule extends BaseSDKModule {
mConferenceDetails = new ConferenceDetails(getDeviceId(), iConference.callId());
mActiveConference = createActiveConference(iConference);
if (!hasCreatedActiveCall()) return false;
- mActiveConference.mData.isOwnStreamActive = false;
+ mActiveConference.mState.isOwnStreamActive = false;
initConferenceCall(startActivity);
Timber.d("createIncomingCallAndStartRinging with \'ConferenceId\'=\'" + callId +
"; startActivity=" + (startActivity?"true": "false"));
@@ -3123,7 +3124,7 @@ public class ConferenceSDKModule extends BaseSDKModule {
onCallReady(callId, videoEnabled);
if (mActiveConference != null &&
mActiveConference.mInitialStartCapturer &&
- mActiveConference.mData.isOwnStreamActive &&
+ mActiveConference.mState.isOwnStreamActive &&
mActiveConference.isOutgoingCall &&
mActiveConference.mConference != null &&
mActiveConference.mConference.isModerator()) {
@@ -3156,7 +3157,7 @@ public class ConferenceSDKModule extends BaseSDKModule {
mActiveConference.mCallStartTime = System.currentTimeMillis();
}
stopRinging();
- mActiveConference.isSpeakerOn = mActiveConference.isReceivingVideo();
+ mActiveConference.mState.isSpeakerOn = mActiveConference.isReceivingVideo();
for (ConferenceSDKListener conferenceSDKListener : mConferenceSDKListener)
conferenceSDKListener.onConferenceConnected(mActiveConference);
startTimer();
@@ -3481,13 +3482,6 @@ public class ConferenceSDKModule extends BaseSDKModule {
}
}
- private void registerIncomingCallReceiver(Context context) {
- IntentFilter phoneCall = new IntentFilter();
- phoneCall.addAction(PHONE_STATE);
- incomingCallReceiver = new PhoneCallReceiver();
- context.registerReceiver(incomingCallReceiver, phoneCall);
- }
-
public void endActiveCall() {
if (mActiveConference != null && mActiveConference.mConference != null
&& !mActiveConference.mConference.isOutgoing()) {
@@ -3503,34 +3497,6 @@ public class ConferenceSDKModule extends BaseSDKModule {
}
}
- private class PhoneCallReceiver extends BroadcastReceiver {
-
- @Override
- public void onReceive(Context context, Intent intent) {
- Timber.d("ConferenceModule::onReceive(): Telephony service event");
- String action = intent.getAction();
- if (action != null && action.equals(PHONE_STATE)) {
- TelephonyManager tm = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE);
- if (isConferenceActive()) {
- if (tm != null) {
- if (tm.getCallState() == TelephonyManager.CALL_STATE_OFFHOOK) {
- endActiveCall();
- } else if (tm.getCallState() == TelephonyManager.CALL_STATE_RINGING) {
- setAudioRoute(ActiveCallBase.AudioRouteType.EARPIECE, false);
- //setSpeakerState(false, true, true);
- } else if (mLastPhoneCallState == TelephonyManager.CALL_STATE_RINGING
- && tm.getCallState() == TelephonyManager.CALL_STATE_IDLE) {
- setAudioRoute(mActiveConference.mAudioRouteType, true);
- }
- }
- }
- if (tm != null) {
- mLastPhoneCallState = tm.getCallState();//TelephonyManager.CALL_STATE_IDLE;
- }
- }
- }
- }
-
public void createConferenceEx(String subject,
String chatRoomId,
boolean deleteGroupIfNoMessages,
@@ -3551,7 +3517,7 @@ public class ConferenceSDKModule extends BaseSDKModule {
replaceCallEx(subject, deleteGroupIfNoMessages,
deleteAfterCall, isVideoConference,
mActiveConference.mConference.callId(),
- contacts, mActiveConference.mData.isOwnStreamActive);
+ contacts, mActiveConference.mState.isOwnStreamActive);
} else {
createAndStartConferenceEx(subject, chatRoomId, deleteGroupIfNoMessages,
deleteAfterCall, isVideoConference, contacts);
@@ -3741,7 +3707,15 @@ public class ConferenceSDKModule extends BaseSDKModule {
private void switchToBTDevice() {
setSpeakerState(false, true, false);
- setAudioRoute(ActiveCallBase.AudioRouteType.BLUETOOTH, true, true);
+ setAudioRoute(CallStateData.AudioRouteType.BLUETOOTH, true, true);
+ }
+
+ private void onBluetoothConnectivityChanged(boolean connected) {
+ synchronized (mConferenceSDKListener) {
+ for (ConferenceSDKListener sdkListener : mConferenceSDKListener) {
+ sdkListener.onBluetoothConnectivityChanged(connected);
+ }
+ }
}
@Override
@@ -3751,9 +3725,11 @@ public class ConferenceSDKModule extends BaseSDKModule {
switch (hs.getState()) {
case Connected:
switchToBTDevice();
+ onBluetoothConnectivityChanged(true);
break;
case Disconnected:
- setAudioRoute(ActiveCallBase.AudioRouteType.EARPIECE, true, true);
+ setAudioRoute(CallStateData.AudioRouteType.EARPIECE, true, true);
+ onBluetoothConnectivityChanged(false);
break;
case Play:
case Pause:
@@ -3805,6 +3781,80 @@ public class ConferenceSDKModule extends BaseSDKModule {
return false;
}
+ // PSTN calls state handling
+ public void onPstnCallState(int oldState, int newState) {
+ if (isConferenceActive()) {
+ switch (newState) {
+ case TelephonyManager.CALL_STATE_OFFHOOK: {
+// endActiveCall();
+ onPstnCallStateChaged(true);
+ }
+ break;
+ case TelephonyManager.CALL_STATE_RINGING: {
+ setAudioRoute(CallStateData.AudioRouteType.EARPIECE, false);
+ }
+ break;
+ case TelephonyManager.CALL_STATE_IDLE: {
+ if (oldState == TelephonyManager.CALL_STATE_RINGING) {
+ setAudioRoute(mActiveConference.mState.mAudioRouteType, true);
+ } else if (oldState == TelephonyManager.CALL_STATE_OFFHOOK) {
+ onPstnCallStateChaged(false);
+ }
+ }
+ break;
+ }
+ }
+ }
+
+ public synchronized boolean isCallPaused() {
+ if (mActiveConference == null) return false;
+ return (mActiveConference.mState.isPaused &&
+ mActiveConference.mState.pauseRestoreState != null);
+ }
+
+ private synchronized void pauseCall() {
+ mActiveConference.mState.pause();
+ pauseCallVideoCapturer();
+ muteMic(true);
+ stopScreenCapture();
+
+ synchronized (mConferenceSDKListener) {
+ for (ConferenceSDKListener sdkListener : mConferenceSDKListener) {
+ sdkListener.onCallPauseStateChanged(mActiveConference.mState.isPaused);
+ }
+ }
+ }
+
+
+ public synchronized void resumeCall() {
+ mActiveConference.mState.isPaused = false;
+ if (mActiveConference.mState.pauseRestoreState != null) {
+ if (mActiveConference.mState.pauseRestoreState.isOwnStreamActive) {
+ resumeCallVideoCapturer();
+ }
+ muteMic(mActiveConference.mState.pauseRestoreState.isMuted);
+ setAudioRoute(mActiveConference.mState.pauseRestoreState.mAudioRouteType, true);
+ if (mActiveConference.mState.pauseRestoreState.isOwnSSActive) {
+ startScreenCapture();
+ }
+ mActiveConference.mState.resume();
+ }
+
+ synchronized (mConferenceSDKListener) {
+ for (ConferenceSDKListener sdkListener : mConferenceSDKListener) {
+ sdkListener.onCallPauseStateChanged(mActiveConference.mState.isPaused);
+ }
+ }
+ }
+
+ private void onPstnCallStateChaged(boolean pstnActive) {
+ if (pstnActive) {
+ pauseCall();
+ } else {
+ resumeCall();
+ }
+ }
+
private class AsyncJoinToConferenceByLink extends AsyncTask {
@Override
protected Void doInBackground(String... strings) {
diff --git a/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ConferenceService.java b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ConferenceService.java
index 125887423e6753ef4e038090920e7d9fa4b85778..7be8384755c9bce6102946072519ce84712bdb17 100644
--- a/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ConferenceService.java
+++ b/app/src/main/java/com/nynja/mobile/communicator/data/sdk/calls/ConferenceService.java
@@ -259,11 +259,11 @@ public class ConferenceService extends Service implements SensorEventListener {
private void setSpeakerData(boolean isProximityNear) {
ConferenceSDKModule conferenceSDKModule = mDataManager.getConferenceSDK();
ActiveConferenceCall activeConference = conferenceSDKModule.getActiveConference();
- if (activeConference != null && ((activeConference.isSpeakerOn && isProximityNear)
- || (!activeConference.isSpeakerOn && !isProximityNear))) {
- if ((activeConference.isSpeakerOn && isProximityNear)) {
+ if (activeConference != null && ((activeConference.mState.isSpeakerOn && isProximityNear)
+ || (!activeConference.mState.isSpeakerOn && !isProximityNear))) {
+ if ((activeConference.mState.isSpeakerOn && isProximityNear)) {
conferenceSDKModule.setSpeakerState(false);
- } else if ((!activeConference.isSpeakerOn && !isProximityNear)) {
+ } else if ((!activeConference.mState.isSpeakerOn && !isProximityNear)) {
// set speaker on - if not forced stop...
if (!activeConference.mIsSpeakerForceStopped)
conferenceSDKModule.setSpeakerState(true);
diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/CallActivityPresenter.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/CallActivityPresenter.java
index 23b74d341ee06dbda76456e36180dee56a05fec7..29945a56c3d0ee9c82fc03a58af6147966a69924 100644
--- a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/CallActivityPresenter.java
+++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/CallActivityPresenter.java
@@ -6,6 +6,7 @@ import com.nynja.mobile.communicator.data.models.events.local.Event;
import com.nynja.mobile.communicator.data.models.events.local.SimpleEvent;
import com.nynja.mobile.communicator.data.sdk.ConferenceSDKPresenter;
import com.nynja.mobile.communicator.data.sdk.calls.ActiveConferenceCall;
+import com.nynja.mobile.communicator.data.sdk.calls.CallStateData;
import com.nynja.mobile.communicator.mvp.view.CallActivityView;
/**
@@ -101,25 +102,22 @@ public class CallActivityPresenter extends ConferenceSDKPresenter
public boolean isMuted() {
- return mDataManager.getConferenceSDK().getActiveConference().isMuted;
+ return mDataManager.getConferenceSDK().getActiveConference().mState.isMuted;
}
- public void setAudioRoute(ActiveCallBase.AudioRouteType audioRouteType) {
+ public void setAudioRoute(CallStateData.AudioRouteType audioRouteType) {
mDataManager.getConferenceSDK().setAudioRoute(audioRouteType);
}
@@ -328,7 +329,7 @@ public class ConferenceCallPresenter extends ConferenceSDKPresenter
if (activeConferenceCall.mData.mParticipantArray != null) {
for (int index = 0; index < activeConferenceCall.mData.mParticipantArray.size(); index++) {
NYNCallParticipant participant = activeConferenceCall.mData.mParticipantArray.get(index);
- members.add(conferenceParticipant(participant, participant.isOwner(), activeConferenceCall.mData.isOwnStreamActive));
+ members.add(conferenceParticipant(participant, participant.isOwner(), activeConferenceCall.mState.isOwnStreamActive));
}
} else {
for (int index = 0; index < activeConferenceCall.getMembers().size(); index++) {
@@ -403,7 +404,7 @@ public class ConferenceCallPresenter extends ConferenceSDKPresenter
}
@Override
- public void onAudioRouteChange(ActiveCallBase.AudioRouteType audioRouteType) {
+ public void onAudioRouteChange(CallStateData.AudioRouteType audioRouteType) {
if (getAttachedViews().size() == 0) return;
getViewState().onAudioRouteChange(audioRouteType);
}
@@ -428,6 +429,11 @@ public class ConferenceCallPresenter extends ConferenceSDKPresenter
getViewState().updateMicrophonState(isMuted);
}
+ @Override public void onBluetoothConnectivityChanged(boolean connected) {
+ if (getAttachedViews().size() == 0) return;
+ getViewState().onBluetoothConnectivityChanged(connected);
+ }
+
@Override public void onCameraSwitched(WebRtcVideoDevicePosition devicePosition) {
if (getAttachedViews().size() == 0) return;
getViewState().onCameraSwitched(devicePosition);
@@ -654,10 +660,6 @@ public class ConferenceCallPresenter extends ConferenceSDKPresenter
return mDataManager.getConferenceSDK().getIsCallFromHome();
}
- public boolean isReadPhoneStatePermissionGranted() {
- return mDataManager.getConferenceSDK().isReadPhoneStatePermissionGranted();
- }
-
public boolean isForAudioCallsPermissionGranted() {
return mDataManager.getConferenceSDK().isForAudioCallsPermissionGranted();
}
diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/view/CallActivityView.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/view/CallActivityView.java
index 2ffd3c3131984c1da4d6b928efec1fa6e6293908..974bced6a0ed7a676171463f5ad123f2ff87e8b1 100644
--- a/app/src/main/java/com/nynja/mobile/communicator/mvp/view/CallActivityView.java
+++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/view/CallActivityView.java
@@ -29,4 +29,6 @@ public interface CallActivityView extends ErrorMvpView {
void showPurchaseDialog(boolean isModerator, final String message);
void closeActivity();
+
+ void onCallPauseStateChanged(boolean paused);
}
\ No newline at end of file
diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/view/CallTapToSpeakView.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/view/CallTapToSpeakView.java
index 2f87ef02936c472c23948bb3063edeabafb6e755..8ea6de3f4aec04e051450a7d51f5ce08e8dbb1fe 100644
--- a/app/src/main/java/com/nynja/mobile/communicator/mvp/view/CallTapToSpeakView.java
+++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/view/CallTapToSpeakView.java
@@ -1,6 +1,6 @@
package com.nynja.mobile.communicator.mvp.view;
-import com.nynja.mobile.communicator.data.conference.ActiveCallBase;
+import com.nynja.mobile.communicator.data.sdk.calls.CallStateData;
/**
* Created by Ergyun Syuleyman on 9/14/18.
@@ -19,6 +19,8 @@ public interface CallTapToSpeakView extends BaseMvpView, ErrorMvpView {
void onSpeakerStateChanged(boolean isSpeakerOn);
- void onAudioRouteChange(ActiveCallBase.AudioRouteType audioRouteType);
+ void onAudioRouteChange(CallStateData.AudioRouteType audioRouteType);
+
+ void onBluetoothConnectivityChanged(boolean connected);
}
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 8f5e6c817339496bb3023fcafc3d6f637fb708ce..47da5ab525bcd1cd60adac9c9ec8dd9cc6425a1d 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,8 +2,8 @@ package com.nynja.mobile.communicator.mvp.view;
import android.support.annotation.StringRes;
-import com.nynja.mobile.communicator.data.conference.ActiveCallBase;
import com.nynja.mobile.communicator.data.sdk.calls.ActiveConferenceCall;
+import com.nynja.mobile.communicator.data.sdk.calls.CallStateData;
import com.nynja.mobile.communicator.data.sdk.calls.ConferenceListItem;
import com.nynja.mobile.communicator.data.models.nynjamodels.ContactModel;
import com.nynja.mobile.communicator.data.models.nynjamodels.RoomModel;
@@ -77,7 +77,7 @@ public interface CallView extends ErrorMvpView {
void showLeaveConferenceCallConfirmation();
- void onAudioRouteChange(ActiveCallBase.AudioRouteType audioRouteType);
+ void onAudioRouteChange(CallStateData.AudioRouteType audioRouteType);
void closenConference();
@@ -91,6 +91,8 @@ public interface CallView extends ErrorMvpView {
void continueWithScreenshare();
+ void onBluetoothConnectivityChanged(boolean connected);
+
void onCameraSwitched(WebRtcVideoDevicePosition devicePosition);
diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/MainActivity.java b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/MainActivity.java
index 8a05b760f4a8ec52231449324c344e2a31410f56..95187f2dcde87cb44b9a869164c47a995c3c4244 100644
--- a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/MainActivity.java
+++ b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/MainActivity.java
@@ -196,6 +196,8 @@ public class MainActivity extends BaseActivity implements MainActivityView,
mNynjaNavigationView.hideAllWheels();
initFirstWheel();
});
+
+ requestStorageAndPhoneStatePermissions();
}
@Override
@@ -217,7 +219,6 @@ public class MainActivity extends BaseActivity implements MainActivityView,
@Override
protected void onStart() {
super.onStart();
- requestStoragePermissions();
}
@Override
@@ -246,8 +247,9 @@ public class MainActivity extends BaseActivity implements MainActivityView,
}
}
- private void requestStoragePermissions() {
- addDisposable(mRxPermissions.requestEachCombined(Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ private void requestStorageAndPhoneStatePermissions() {
+ addDisposable(mRxPermissions.requestEachCombined(Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE)
.subscribe(permission -> {
}, Timber::e));
@@ -611,7 +613,7 @@ public class MainActivity extends BaseActivity implements MainActivityView,
chatAudioLayout.setVisibility(View.VISIBLE);
mPresenter.requestUser();
//TODO: video feeds support in next features
- //if (!activeConferenceCall.mData.isOwnStreamActive || !activeConferenceCall.hasRemoteVideoTrack) {
+ //if (!activeConferenceCall.mState.isOwnStreamActive || !activeConferenceCall.hasRemoteVideoTrack) {
// video.setVisibility(View.GONE);
// chatAudioLayout.setVisibility(View.VISIBLE);
// mPresenter.requestUser();
@@ -985,4 +987,5 @@ public class MainActivity extends BaseActivity implements MainActivityView,
}
);
}
+
}
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 41540caf4aa576ff8a80e10c52e8b1391dff2460..b7ba56b0fa2c5dba9dc0517d22c4c85170f0e044 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
@@ -14,10 +14,16 @@ import android.media.projection.MediaProjectionManager;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.RelativeLayout;
import com.arellomobile.mvp.presenter.InjectPresenter;
import com.nynja.mobile.communicator.R;
+import com.nynja.mobile.communicator.data.audio.headphones.HeadphoneMonitoringService;
+import com.nynja.mobile.communicator.data.audio.headphones.HeadphoneStateBroadcastReceiver;
import com.nynja.mobile.communicator.data.sdk.calls.ActiveConferenceCall;
+import com.nynja.mobile.communicator.data.sdk.calls.BluetoothConnectivityListener;
import com.nynja.mobile.communicator.mvp.presenters.CallActivityPresenter;
import com.nynja.mobile.communicator.mvp.view.CallActivityView;
import com.nynja.mobile.communicator.ui.adapters.conference.ActiveCallPagerAdapter;
@@ -31,6 +37,7 @@ import org.webrtc.ContextUtils;
import org.webrtc.VideoSourceUtility;
import butterknife.BindView;
+import butterknife.OnClick;
import kotlin.jvm.Synchronized;
import ru.terrakok.cicerone.Navigator;
import timber.log.Timber;
@@ -41,17 +48,12 @@ public class CallActivity extends BaseActivity implements CallActivityView {
@BindView(R.id.active_call_viewpager) CustomViewPager mViewPager;
@BindView(R.id.active_call_indicator) CirclePageIndicator mIndicator;
+ @BindView(R.id.active_call_paused_content) RelativeLayout mCallPaused;
// @BindView(R.id.active_call_rv) RecyclerView mRecyclerView;
@InjectPresenter CallActivityPresenter mPresenter;
- public interface BluetoothConnectivityListener {
- void onBluetoothDeviceConnected();
-
- void onBluetoothDeviceDisconnected();
- }
-
private ActiveCallPagerAdapter mPagerAdapter;
private int mSelectedPage = -1;
@@ -71,13 +73,13 @@ public class CallActivity extends BaseActivity implements CallActivityView {
ContextUtils.createRootEglBase();
ContextUtils.createSSEglBase();
- if (isBluetoothHeadsetConnected()) {
- mPresenter.bluetoothConnected();
- }
-
initUI();
+ }
- registerBluetoothReceiver();
+ @Override
+ protected void onStart() {
+ mCallPaused.setVisibility(mPresenter.isCallPaused() ? View.VISIBLE : View.GONE);
+ super.onStart();
}
private void initUI() {
@@ -88,6 +90,12 @@ public class CallActivity extends BaseActivity implements CallActivityView {
mIndicator.setSaveEnabled(false);
mIndicator.setViewPager(mViewPager, mPagerAdapter.getFragmentPositionByType(ActiveCallPagerAdapter.CallPages.CallPageActiveCallFragment));
mIndicator.notifyDataSetChanged();
+ mCallPaused.setOnTouchListener(new View.OnTouchListener() {
+ @Override
+ public boolean onTouch(View view, MotionEvent motionEvent) {
+ return true;
+ }
+ });
}
private void initUIRv() {
@@ -183,7 +191,6 @@ public class CallActivity extends BaseActivity implements CallActivityView {
@Override
protected void onDestroy() {
- unregisterReceiver(mBluetoothReceiver);
mPagerAdapter.reset();
mViewPager.removeAllViews();
releaseWakeLockActivity();
@@ -253,7 +260,7 @@ public class CallActivity extends BaseActivity implements CallActivityView {
if (mPagerAdapter != null) {
mPagerAdapter.initFlags(activeConferenceCall.mData.hasRemoteScreenShareTrack,
((activeConferenceCall.mData.hasRemoteVideoTrack() ||
- activeConferenceCall.mData.isOwnStreamActive) &&
+ activeConferenceCall.mState.isOwnStreamActive) &&
activeConferenceCall.isConference()));
}
}
@@ -288,57 +295,6 @@ public class CallActivity extends BaseActivity implements CallActivityView {
finish();
}
- public boolean isBluetoothHeadsetConnected() {
- BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
- return mBluetoothAdapter != null &&
- mBluetoothAdapter.isEnabled() &&
- mBluetoothAdapter.getProfileConnectionState(BluetoothHeadset.HEADSET) == BluetoothHeadset.STATE_CONNECTED;
- }
-
-
- //The BroadcastReceiver that listens for bluetooth broadcasts
- private final BroadcastReceiver mBluetoothReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
-
- if (BluetoothDevice.ACTION_FOUND.equals(action)) {
- //Device found
- } else if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
- //Device is now connected
- bluetoothConnected();
- } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
- //Done searching
- } else if (BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED.equals(action)) {
- //Device is about to disconnect
- } else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
- //Device has disconnected
- bluetoothDisconnected();
- }
- }
- };
-
- private void registerBluetoothReceiver() {
- IntentFilter filter = new IntentFilter();
- filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
- filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED);
- filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
- registerReceiver(mBluetoothReceiver, filter);
- }
-
- private void bluetoothConnected() {
- mPresenter.bluetoothConnected();
- for (int i = 0; i < mPagerAdapter.getCount(); i++) {
- if (mPagerAdapter.getItem(i) instanceof BluetoothConnectivityListener) {
- ((BluetoothConnectivityListener) mPagerAdapter.getItem(i)).onBluetoothDeviceConnected();
- }
- }
- }
-
- private void bluetoothDisconnected() {
- mPresenter.bluetoothDisconnected();
- }
-
@Override
public void onRemoteScreenShareTrackAdded(ActiveConferenceCall activeConferenceCall, String trackId) {
final boolean hasRemoteScreenShareTrack = (activeConferenceCall != null && activeConferenceCall.mData.hasRemoteScreenShareTrack);
@@ -410,14 +366,14 @@ public class CallActivity extends BaseActivity implements CallActivityView {
boolean updated = false;
synchronized (mPagerAdapter) {
- if (show && (activeConferenceCall.mData.hasRemoteVideoTrack() || activeConferenceCall.mData.isOwnStreamActive)) {
+ if (show && (activeConferenceCall.mData.hasRemoteVideoTrack() || activeConferenceCall.mState.isOwnStreamActive)) {
mViewPager.removeOnPageChangeListener(mOnPageChangeListener);
mViewPager.setAdapter(null);
mPagerAdapter.showConferenceVideoScreen();
mViewPager.addOnPageChangeListener(mOnPageChangeListener);
mViewPager.setAdapter(mPagerAdapter);
updated = true;
- } else if (!activeConferenceCall.mData.hasRemoteVideoTrack() && !activeConferenceCall.mData.isOwnStreamActive){
+ } else if (!activeConferenceCall.mData.hasRemoteVideoTrack() && !activeConferenceCall.mState.isOwnStreamActive){
mViewPager.removeOnPageChangeListener(mOnPageChangeListener);
mViewPager.setAdapter(null);
mPagerAdapter.hideConferenceVideoScreen();
@@ -441,4 +397,19 @@ public class CallActivity extends BaseActivity implements CallActivityView {
}
}
+ @Override public void onCallPauseStateChanged(boolean paused) {
+ mHandler.post(() -> {
+ mCallPaused.setVisibility(paused ? View.VISIBLE : View.GONE);
+ });
+ }
+
+ @OnClick(R.id.active_call_paused_button_sircle)
+ void onResumeCall() {
+ mPresenter.resumeCall();
+ }
+
+ public boolean isBluetoothHeadsetConnected() {
+ return HeadphoneMonitoringService.isBluetoothHeadsetConnected();
+ }
+
}
diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/base/BaseActivity.java b/app/src/main/java/com/nynja/mobile/communicator/ui/base/BaseActivity.java
index 7c1509748aadc80876ab8bf7807ff4259e1777d8..d5d20f1e2f8eca4ad7405f516b43e0991cfb4d84 100644
--- a/app/src/main/java/com/nynja/mobile/communicator/ui/base/BaseActivity.java
+++ b/app/src/main/java/com/nynja/mobile/communicator/ui/base/BaseActivity.java
@@ -116,7 +116,7 @@ public abstract class BaseActivity extends MvpAppCompatActivity implements BaseA
mLayoutListenerWrapper = new OnGlobalLayoutListenerWrapper(this);
wakeLockActivityIfNeeds();
- requestPermissions();
+ //requestPermissions();
}
protected void wakeLockActivityIfNeeds() {
diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/conference/CallTapToSpeakFragment.java b/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/conference/CallTapToSpeakFragment.java
index e15e1d129e995375e3c36b6dbdb1330dac3bd511..77be42c95bfd118fbdca655f9f8c11ae115f9580 100644
--- a/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/conference/CallTapToSpeakFragment.java
+++ b/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/conference/CallTapToSpeakFragment.java
@@ -20,8 +20,8 @@ import android.widget.Toast;
import com.arellomobile.mvp.presenter.InjectPresenter;
import com.nynja.mobile.communicator.R;
-import com.nynja.mobile.communicator.data.conference.ActiveCallBase;
import com.nynja.mobile.communicator.data.sdk.calls.ActiveConferenceCall;
+import com.nynja.mobile.communicator.data.sdk.calls.CallStateData;
import com.nynja.mobile.communicator.mvp.presenters.CallTapToSpeakPresenter;
import com.nynja.mobile.communicator.mvp.view.CallTapToSpeakView;
import com.nynja.mobile.communicator.ui.activities.calls.CallActivity;
@@ -40,7 +40,7 @@ import static org.webrtc.ContextUtils.getApplicationContext;
*/
public class CallTapToSpeakFragment extends BaseFragment
- implements CallTapToSpeakView, CallActivity.BluetoothConnectivityListener {
+ implements CallTapToSpeakView {
@BindView(R.id.active_call_hold_to_speak_speaker) CheckableImageView speaker;
@BindView(R.id.active_call_hold_to_speak_header_leave_text) TextView leave;
@@ -177,7 +177,7 @@ public class CallTapToSpeakFragment extends BaseFragment
@Override
public void onSpeakerStateChanged(boolean isSpeakerOn) {
if (isAdded() && isActive) {
- getActivity().runOnUiThread(() -> updateSpeakerState(isSpeakerOn, ActiveCallBase.AudioRouteType.EARPIECE));
+ getActivity().runOnUiThread(() -> updateSpeakerState(isSpeakerOn, CallStateData.AudioRouteType.EARPIECE));
}
}
@@ -201,15 +201,15 @@ public class CallTapToSpeakFragment extends BaseFragment
DialogFactory.showActionSheetDialog(getContext(), itemPosition -> {
switch (itemPosition) {
case 0:
- mConferencePresenter.setAudioRoute(ActiveCallBase.AudioRouteType.SPEAKER);
+ mConferencePresenter.setAudioRoute(CallStateData.AudioRouteType.SPEAKER);
break;
case 1:
- mConferencePresenter.setAudioRoute(ActiveCallBase.AudioRouteType.EARPIECE);
+ mConferencePresenter.setAudioRoute(CallStateData.AudioRouteType.EARPIECE);
break;
case 2:
- mConferencePresenter.setAudioRoute(ActiveCallBase.AudioRouteType.BLUETOOTH);
+ mConferencePresenter.setAudioRoute(CallStateData.AudioRouteType.BLUETOOTH);
break;
}
},
@@ -220,7 +220,7 @@ public class CallTapToSpeakFragment extends BaseFragment
}
@Override
- public void onAudioRouteChange(ActiveCallBase.AudioRouteType audioRouteType) {
+ public void onAudioRouteChange(CallStateData.AudioRouteType audioRouteType) {
if (speaker == null) {
return;
}
@@ -249,19 +249,25 @@ public class CallTapToSpeakFragment extends BaseFragment
}
@Override
- public void onBluetoothDeviceConnected() {
+ public void onBluetoothConnectivityChanged(boolean connected) {
+ if (connected) {
+ onBluetoothDeviceConnected();
+ } else {
+ onBluetoothDeviceDisconnected();
+ }
+ }
+
+ private void onBluetoothDeviceConnected() {
if (getActivity() == null || !isAdded() || speaker == null) {
return;
}
speaker.post(() -> {
- speaker.setImageResource(R.drawable.ic_bluetooth_icon);
speaker.setAutoToggle(false);
});
}
- @Override
- public void onBluetoothDeviceDisconnected() {
+ private void onBluetoothDeviceDisconnected() {
//mConferencePresenter.bluetoothDisconnected();
}
@@ -279,7 +285,7 @@ public class CallTapToSpeakFragment extends BaseFragment
if (isActive) {
updateUI();
//save the mute state
- mRestoreMuteTo = String.valueOf(mConferencePresenter.getActiveConference().isMuted);
+ mRestoreMuteTo = String.valueOf(mConferencePresenter.getActiveConference().mState.isMuted);
mConferencePresenter.setMuteState(true);
} else {
// restore the mute
@@ -321,8 +327,8 @@ public class CallTapToSpeakFragment extends BaseFragment
private void updateUI() {
ActiveConferenceCall activeConferenceCall = mConferencePresenter.getActiveConference();
if (activeConferenceCall != null) {
- updateSpeakerState(activeConferenceCall.isSpeakerOn, activeConferenceCall.mAudioRouteType);
- updateMicrophonState(activeConferenceCall.isMuted);
+ updateSpeakerState(activeConferenceCall.mState.isSpeakerOn, activeConferenceCall.mState.mAudioRouteType);
+ updateMicrophonState(activeConferenceCall.mState.isMuted);
}
}
@@ -385,7 +391,7 @@ public class CallTapToSpeakFragment extends BaseFragment
tapToSpeak.setSelected(!isMuted);
}
- private void updateSpeakerState(boolean isSpeakerOn, ActiveCallBase.AudioRouteType audioRouteType) {
+ private void updateSpeakerState(boolean isSpeakerOn, CallStateData.AudioRouteType audioRouteType) {
if (speaker == null) {
return;
}
diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/conference/ConferenceCallFragment.java b/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/conference/ConferenceCallFragment.java
index 36b0d2de6ab2a46f2ba56df6888f2cf338a6570c..85587cfb0d6277c0ed497b2d047d9bd98949d9f7 100644
--- a/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/conference/ConferenceCallFragment.java
+++ b/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/conference/ConferenceCallFragment.java
@@ -35,10 +35,12 @@ import android.widget.Toast;
import com.arellomobile.mvp.presenter.InjectPresenter;
import com.nynja.mobile.communicator.BuildConfig;
import com.nynja.mobile.communicator.R;
-import com.nynja.mobile.communicator.data.conference.ActiveCallBase;
+import com.nynja.mobile.communicator.data.models.nynjamodels.ContactModel;
import com.nynja.mobile.communicator.data.models.nynjamodels.ContactModel;
import com.nynja.mobile.communicator.data.models.nynjamodels.RoomModel;
import com.nynja.mobile.communicator.data.sdk.calls.ActiveConferenceCall;
+import com.nynja.mobile.communicator.data.sdk.calls.BluetoothConnectivityListener;
+import com.nynja.mobile.communicator.data.sdk.calls.CallStateData;
import com.nynja.mobile.communicator.data.sdk.calls.ConferenceListItem;
import com.nynja.mobile.communicator.interfaces.OnConferenceItemClickListener;
import com.nynja.mobile.communicator.mvp.presenters.ConferenceCallPresenter;
@@ -75,7 +77,7 @@ import timber.log.Timber;
*/
public class ConferenceCallFragment extends BaseFragment implements CallView,
- OnConferenceItemClickListener, CallActivity.BluetoothConnectivityListener {
+ OnConferenceItemClickListener {
private static final int FRONT_CAMERA = 1;
private static final String PREFERENCE_NAME = "conference_calls";
@@ -242,7 +244,7 @@ public class ConferenceCallFragment extends BaseFragment implements CallView,
}
if (mConferencePresenter.getActiveConference() != null) {
- updateSpeakerState(mConferencePresenter.getActiveConference().isSpeakerOn);
+ updateSpeakerState(mConferencePresenter.getActiveConference().mState.isSpeakerOn);
}
}
@@ -342,7 +344,7 @@ public class ConferenceCallFragment extends BaseFragment implements CallView,
void mute() {
if (!audioMute.isEnabled()) return;
if (muteMicHint.getVisibility() == View.VISIBLE) {
- updateMicrophonState(mConferencePresenter.getActiveConference().isMuted);
+ updateMicrophonState(mConferencePresenter.getActiveConference().mState.isMuted);
return;
}
showMuteMicHintIfNeed();
@@ -355,13 +357,11 @@ public class ConferenceCallFragment extends BaseFragment implements CallView,
if (isBluetoothHeadsetConnected()) {
showAudioRoutActionSheet();
} else {
- if (muteMicHint.getVisibility() == View.VISIBLE) {
- updateSpeakerState(mConferencePresenter.getActiveConference().isSpeakerOn);
- return;
- }
- if (getActivity() != null) {
- callActivity.setIsSpeakerForced(true);
- callActivity.setSpeakerState(!audioSpeaker.isChecked(), true);
+ if (audioSpeaker.isChecked()) {
+ mConferencePresenter.setAudioRoute(CallStateData.AudioRouteType.EARPIECE);
+ } else {
+ mConferencePresenter.setAudioRoute(CallStateData.AudioRouteType.SPEAKER);
+
}
}
}
@@ -404,15 +404,15 @@ public class ConferenceCallFragment extends BaseFragment implements CallView,
DialogFactory.showActionSheetDialog(getContext(), itemPosition -> {
switch (itemPosition) {
case 0:
- mConferencePresenter.setAudioRoute(ActiveCallBase.AudioRouteType.SPEAKER);
+ mConferencePresenter.setAudioRoute(CallStateData.AudioRouteType.SPEAKER);
break;
case 1:
- mConferencePresenter.setAudioRoute(ActiveCallBase.AudioRouteType.EARPIECE);
+ mConferencePresenter.setAudioRoute(CallStateData.AudioRouteType.EARPIECE);
break;
case 2:
- mConferencePresenter.setAudioRoute(ActiveCallBase.AudioRouteType.BLUETOOTH);
+ mConferencePresenter.setAudioRoute(CallStateData.AudioRouteType.BLUETOOTH);
break;
}
},
@@ -566,7 +566,7 @@ public class ConferenceCallFragment extends BaseFragment implements CallView,
if (activeConferenceCall.isWaiting()) {
waitingConference(activeConferenceCall);
} else if ((activeConferenceCall.isVideoEnabled
- || activeConferenceCall.mData.isOwnStreamActive)
+ || activeConferenceCall.mState.isOwnStreamActive)
&& !activeConferenceCall.isConference()){
videoConference(activeConferenceCall);
//if (!activeConferenceCall.isSpeakerOn)
@@ -940,9 +940,9 @@ public class ConferenceCallFragment extends BaseFragment implements CallView,
isActive = active;
if (activeConferenceCall == null) return;
if (active) {
- updateMicrophonState(activeConferenceCall.isMuted);
+ updateMicrophonState(activeConferenceCall.mState.isMuted);
if (activeConferenceCall.isVideoEnabled) {
- if (activeConferenceCall.mData.isOwnStreamActive) {
+ if (activeConferenceCall.mState.isOwnStreamActive) {
setLocalVideoRenderer(mConferencePresenter.getActiveConference());
mConferencePresenter.resumeCallVideoCapturer();
}
@@ -953,7 +953,7 @@ public class ConferenceCallFragment extends BaseFragment implements CallView,
muteMicHint.setVisibility(View.GONE);
mHandler.removeCallbacks(mShowMuteMicHintExpired);
if (activeConferenceCall.isVideoEnabled) {
- if (activeConferenceCall.mData.isOwnStreamActive) {
+ if (activeConferenceCall.mState.isOwnStreamActive) {
//mConferencePresenter.pauseCallVideoCapturer();
removeLocalVideoRenderer(mConferencePresenter.getActiveConference());
}
@@ -1179,7 +1179,7 @@ public class ConferenceCallFragment extends BaseFragment implements CallView,
private void requestPermissionIfNeeds(ActiveConferenceCall activeConferenceCall) {
if (activeConferenceCall == null) return;
- boolean enableVideo = (activeConferenceCall.mData.isOwnStreamActive
+ boolean enableVideo = (activeConferenceCall.mState.isOwnStreamActive
&& activeConferenceCall.mInitialStartCapturer);
ArrayList permissions = getPermissionsForCall(enableVideo);
@@ -1475,11 +1475,11 @@ public class ConferenceCallFragment extends BaseFragment implements CallView,
}
private void initConference(ActiveConferenceCall activeConferenceCall) {
- audioSpeaker.setChecked(activeConferenceCall.isSpeakerOn);
- audioMute.setChecked(activeConferenceCall.isMuted);
+ audioSpeaker.setChecked(activeConferenceCall.mState.isSpeakerOn);
+ audioMute.setChecked(activeConferenceCall.mState.isMuted);
videoOnOf.setChecked(mConferencePresenter.isCameraRunning()); //activeConferenceCall.isCameraRunning());
shareOnOf.setChecked(mConferencePresenter.isScreenSharing());
- setMuteText(activeConferenceCall.isMuted);
+ setMuteText(activeConferenceCall.mState.isMuted);
videoRemotePhoto.setVisibility(View.GONE);
videoRemote.setVisibility(View.GONE);
videoLocal.setVisibility(View.GONE);
@@ -1536,7 +1536,6 @@ public class ConferenceCallFragment extends BaseFragment implements CallView,
}
}
-
private boolean isBluetoothHeadsetConnected() {
if (getActivity() != null) {
return ((CallActivity) getActivity()).isBluetoothHeadsetConnected();
@@ -1550,25 +1549,19 @@ public class ConferenceCallFragment extends BaseFragment implements CallView,
return;
}
- if (isBluetoothHeadsetConnected()) {
- if (mConferencePresenter.getActiveConference() != null) {
- onAudioRouteChange(mConferencePresenter.getActiveConference().mAudioRouteType);
- } else {
- audioSpeaker.setImageResource(R.drawable.ic_bluetooth_icon);
- audioSpeakerLabel.setText(getString(R.string.bluetooth));
- }
+ if (mConferencePresenter.getActiveConference() != null) {
+ onAudioRouteChanged(mConferencePresenter.getActiveConference().mState.mAudioRouteType);
} else {
- audioSpeaker.setImageResource(R.drawable.speaker_selector);
+ audioSpeaker.setImageResource(R.drawable.ic_bluetooth_icon);
audioSpeaker.setChecked(isSpeakerOn);
- audioSpeakerLabel.setText(getString(R.string.speakerphone));
+ audioSpeakerLabel.setText(getString(R.string.bluetooth));
}
audioSpeaker.setAutoToggle(!isBluetoothHeadsetConnected());
}
- @Override
- public void onAudioRouteChange(ActiveCallBase.AudioRouteType audioRouteType) {
- if (audioSpeaker == null) {
+ private void onAudioRouteChanged(CallStateData.AudioRouteType audioRouteType) {
+ if (audioSpeaker == null || audioSpeakerLabel == null) {
return;
}
@@ -1599,17 +1592,14 @@ public class ConferenceCallFragment extends BaseFragment implements CallView,
}
@Override
- public void onBluetoothDeviceConnected() {
- if (getActivity() == null || !isAdded() || audioSpeaker == null) {
+ public void onAudioRouteChange(CallStateData.AudioRouteType audioRouteType) {
+ if (audioSpeaker == null || audioSpeakerLabel == null) {
return;
}
- audioSpeaker.post(() -> {
- audioSpeaker.setImageResource(R.drawable.ic_bluetooth_icon);
- audioSpeaker.setAutoToggle(false);
+ new Handler(Looper.getMainLooper()).post(() -> {
+ onAudioRouteChanged( audioRouteType);
});
-
- audioSpeakerLabel.setText(getString(R.string.bluetooth));
}
@Override
@@ -1659,6 +1649,15 @@ public class ConferenceCallFragment extends BaseFragment implements CallView,
getString(R.string.call_conference_alert_title), null);
}
+ @Override
+ public void onBluetoothConnectivityChanged(boolean connected) {
+ if (connected) {
+ onBluetoothDeviceConnected();
+ } else {
+ onBluetoothDeviceDisconnected();
+ }
+ }
+
@Override
public void continueWithScreenshare() {
new Handler(Looper.getMainLooper()).postDelayed(() -> {
@@ -1667,8 +1666,17 @@ public class ConferenceCallFragment extends BaseFragment implements CallView,
}, Consts.DELAY_300);
}
- @Override
- public void onBluetoothDeviceDisconnected() {
+ private void onBluetoothDeviceConnected() {
+ if (getActivity() == null || !isAdded() || audioSpeaker == null) {
+ return;
+ }
+
+ audioSpeaker.post(() -> {
+ audioSpeaker.setAutoToggle(false);
+ });
+ }
+
+ private void onBluetoothDeviceDisconnected() {
//mConferencePresenter.bluetoothDisconnected();
}
@@ -1680,7 +1688,7 @@ public class ConferenceCallFragment extends BaseFragment implements CallView,
// check for 'GotIt' pressed before...
if (isMuteMicHintGotIt()) return;
if (mConferencePresenter.getActiveConference() != null
- && !mConferencePresenter.getActiveConference().isMuted) {
+ && !mConferencePresenter.getActiveConference().mState.isMuted) {
muteMicHint.setVisibility(View.VISIBLE);
mHandler.postDelayed(mShowMuteMicHintExpired, MUTE_MIC_HINT_SHOWING_TIME);
}
diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/conference/ConferenceVideoFragment.java b/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/conference/ConferenceVideoFragment.java
index af28f6a56fc9f9f077a8fd803c0d2e2d2ccf51d0..de7048d25d84f1f689b210951c4c673ccbc14af8 100644
--- a/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/conference/ConferenceVideoFragment.java
+++ b/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/conference/ConferenceVideoFragment.java
@@ -348,9 +348,9 @@ public class ConferenceVideoFragment extends BaseFragment implements ConferenceV
isActive = active;
if (activeConferenceCall == null) return;
if (active) {
- updateMicrophonState(activeConferenceCall.isMuted);
+ updateMicrophonState(activeConferenceCall.mState.isMuted);
if (activeConferenceCall.isVideoEnabled) {
- if (activeConferenceCall.mData.isOwnStreamActive) {
+ if (activeConferenceCall.mState.isOwnStreamActive) {
setLocalVideoRenderer(mConferencePresenter.getActiveConference());
mConferencePresenter.resumeCallVideoCapturer();
}
@@ -360,7 +360,7 @@ public class ConferenceVideoFragment extends BaseFragment implements ConferenceV
scrollToMyFeedPosition();
} else {
if (activeConferenceCall.isVideoEnabled) {
- if (activeConferenceCall.mData.isOwnStreamActive) {
+ if (activeConferenceCall.mState.isOwnStreamActive) {
mConferencePresenter.pauseCallVideoCapturer();
removeLocalVideoRenderer(mConferencePresenter.getActiveConference(), true);
}
diff --git a/app/src/main/res/layout/layout_call_paused.xml b/app/src/main/res/layout/layout_call_paused.xml
new file mode 100644
index 0000000000000000000000000000000000000000..38b61cb349b43e3186e9bb9a7a0b0598d4f32ed0
--- /dev/null
+++ b/app/src/main/res/layout/layout_call_paused.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/paged_activity_call.xml b/app/src/main/res/layout/paged_activity_call.xml
index 566173356ef67c8c09bc5d43fc2131377ff8295b..a4f952c255b45a15b13c9eb614c4453811aaf4aa 100644
--- a/app/src/main/res/layout/paged_activity_call.xml
+++ b/app/src/main/res/layout/paged_activity_call.xml
@@ -3,6 +3,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:background="@drawable/background"
xmlns:app="http://schemas.android.com/apk/res-auto">
+
+
+
diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml
index 4b8c7a2ef62afcd0871ab972d4c5234d6ba40b44..0957587f23889b49158924dbff34e256244dee83 100644
--- a/app/src/main/res/values-en/strings.xml
+++ b/app/src/main/res/values-en/strings.xml
@@ -1340,5 +1340,6 @@
To share your screen, you need to stop your camera first. Tap \"Continue\" below and we will stop your camera for you and start screen sharing.
To start your camera, you need to stop screen sharing first.
Continue
+ Resume
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index a93d6de9c0065509c19642db2785d60894cecef2..44e9cd40c5071bc0057b2aad2bd222d87cb8b9ec 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -1339,5 +1339,6 @@
To share your screen, you need to stop your camera first. Tap \"Continue\" below and we will stop your camera for you and start screen sharing.
To start your camera, you need to stop screen sharing first.
Continue
+ Resume
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index 3fb29a0c692d48716fa723198251cb3c45944326..25a60f51e4f8b5b17f0941fa1767d99f24435985 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -1339,5 +1339,6 @@
To share your screen, you need to stop your camera first. Tap \"Continue\" below and we will stop your camera for you and start screen sharing.
To start your camera, you need to stop screen sharing first.
Continue
+ Resume
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 4716478128cd8713aa676fa53c4df514a509cfac..564ec7275f9d211c29c5e68d062e6d1f4b9cca8b 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -1339,5 +1339,6 @@
To share your screen, you need to stop your camera first. Tap \"Continue\" below and we will stop your camera for you and start screen sharing.
To start your camera, you need to stop screen sharing first.
Continue
+ Resume
diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml
index 4716478128cd8713aa676fa53c4df514a509cfac..564ec7275f9d211c29c5e68d062e6d1f4b9cca8b 100644
--- a/app/src/main/res/values-zh/strings.xml
+++ b/app/src/main/res/values-zh/strings.xml
@@ -1339,5 +1339,6 @@
To share your screen, you need to stop your camera first. Tap \"Continue\" below and we will stop your camera for you and start screen sharing.
To start your camera, you need to stop screen sharing first.
Continue
+ Resume
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index d18544ed30fecdf3ed420eb97e5ff3aae882f39b..ff73bb59902ded22a6ede7f2d9d050eba11cdebf 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1341,5 +1341,6 @@
To share your screen, you need to stop your camera first. Tap \"Continue\" below and we will stop your camera for you and start screen sharing.
To start your camera, you need to stop screen sharing first.
Continue
+ Resume