1
1
package com .quickblox .sample .videochat .java .activities ;
2
2
3
+ import static com .quickblox .sample .videochat .java .services .CallService .ONE_OPPONENT ;
4
+ import static com .quickblox .videochat .webrtc .BaseSession .QBRTCSessionState .QB_RTC_SESSION_NEW ;
5
+ import static com .quickblox .videochat .webrtc .BaseSession .QBRTCSessionState .QB_RTC_SESSION_PENDING ;
6
+
3
7
import android .app .Activity ;
4
8
import android .app .KeyguardManager ;
5
9
import android .content .ComponentName ;
6
10
import android .content .Context ;
7
11
import android .content .Intent ;
8
12
import android .content .ServiceConnection ;
13
+ import android .media .projection .MediaProjectionManager ;
9
14
import android .net .Uri ;
10
15
import android .os .Build ;
11
16
import android .os .Bundle ;
44
49
import com .quickblox .sample .videochat .java .utils .UsersUtils ;
45
50
import com .quickblox .sample .videochat .java .utils .WebRtcSessionManager ;
46
51
import com .quickblox .users .model .QBUser ;
47
- import com .quickblox .videochat .webrtc .AppRTCAudioManager ;
48
52
import com .quickblox .videochat .webrtc .BaseSession ;
49
53
import com .quickblox .videochat .webrtc .QBRTCScreenCapturer ;
50
54
import com .quickblox .videochat .webrtc .QBRTCSession ;
51
55
import com .quickblox .videochat .webrtc .QBRTCTypes ;
56
+ import com .quickblox .videochat .webrtc .audio .QBAudioManager ;
52
57
import com .quickblox .videochat .webrtc .callbacks .QBRTCClientSessionCallbacks ;
53
58
import com .quickblox .videochat .webrtc .callbacks .QBRTCClientVideoTracksCallbacks ;
54
59
import com .quickblox .videochat .webrtc .callbacks .QBRTCSessionEventsCallback ;
64
69
import java .util .List ;
65
70
import java .util .Map ;
66
71
67
- import static com .quickblox .sample .videochat .java .services .CallService .ONE_OPPONENT ;
68
- import static com .quickblox .videochat .webrtc .BaseSession .QBRTCSessionState .QB_RTC_SESSION_PENDING ;
69
-
70
72
/**
71
73
* QuickBlox team
72
74
*/
@@ -77,6 +79,7 @@ public class CallActivity extends BaseActivity implements IncomeCallFragmentCall
77
79
78
80
public static final String INCOME_CALL_FRAGMENT = "income_call_fragment" ;
79
81
public static final int REQUEST_PERMISSION_SETTING = 545 ;
82
+ public static final int REQUEST_SHARING_MEDIA_PROJECTION = 1060 ;
80
83
81
84
private final ArrayList <CurrentCallStateCallback > currentCallStateCallbackList = new ArrayList <>();
82
85
private final UsersDbManager dbManager = UsersDbManager .getInstance ();
@@ -97,7 +100,6 @@ public static void start(Context context, boolean isIncomingCall) {
97
100
intent .putExtra (Consts .EXTRA_IS_INCOMING_CALL , isIncomingCall );
98
101
SharedPrefsHelper .getInstance ().save (Consts .EXTRA_IS_INCOMING_CALL , isIncomingCall );
99
102
context .startActivity (intent );
100
- CallService .start (context );
101
103
}
102
104
103
105
@ Override
@@ -107,6 +109,38 @@ protected void onCreate(Bundle savedInstanceState) {
107
109
setContentView (R .layout .activity_main );
108
110
checker = new PermissionsChecker (this );
109
111
connectionView = (LinearLayout ) View .inflate (CallActivity .this , R .layout .connection_popup , null );
112
+
113
+ boolean isVideoCall = isVideoSession ();
114
+ if (Build .VERSION .SDK_INT > Build .VERSION_CODES .TIRAMISU && isVideoCall && isNewSession ()) {
115
+ requestSharingPermissions (this );
116
+ return ;
117
+ }
118
+
119
+ CallService .start (this );
120
+ }
121
+
122
+ private boolean isNewSession () {
123
+ QBRTCSession currentSession = WebRtcSessionManager .getInstance (getApplicationContext ()).getCurrentSession ();
124
+ if (currentSession == null ) {
125
+ return false ;
126
+ }
127
+
128
+ BaseSession .QBRTCSessionState sessionState = currentSession .getState ();
129
+ if (sessionState == null ) {
130
+ return false ;
131
+ }
132
+
133
+ return currentSession .getState ().equals (QB_RTC_SESSION_NEW ) || currentSession .getState ().equals (QB_RTC_SESSION_PENDING );
134
+ }
135
+
136
+ private boolean isVideoSession () {
137
+ QBRTCSession currentSession = WebRtcSessionManager .getInstance (getApplicationContext ()).getCurrentSession ();
138
+ return currentSession != null && currentSession .getConferenceType ().equals (QBRTCTypes .QBConferenceType .QB_CONFERENCE_TYPE_VIDEO );
139
+ }
140
+
141
+ public void requestSharingPermissions (Activity context ) {
142
+ MediaProjectionManager mMediaProjectionManager = (MediaProjectionManager ) context .getSystemService (MEDIA_PROJECTION_SERVICE );
143
+ context .startActivityForResult (mMediaProjectionManager .createScreenCaptureIntent (), REQUEST_SHARING_MEDIA_PROJECTION );
110
144
}
111
145
112
146
@ Override
@@ -134,6 +168,7 @@ public void finish() {
134
168
@ Override
135
169
public void onBackPressed () {
136
170
// to prevent returning from Call Fragment
171
+ super .onBackPressed ();
137
172
}
138
173
139
174
private void allowOnLockScreen () {
@@ -211,8 +246,17 @@ protected void onActivityResult(int requestCode, int resultCode, final Intent da
211
246
startScreenSharing (data );
212
247
Log .i (TAG , "Starting Screen Capture" );
213
248
}
249
+
250
+ if (requestCode == REQUEST_SHARING_MEDIA_PROJECTION ) {
251
+ if (resultCode == Activity .RESULT_OK ) {
252
+ CallService .start (this );
253
+ } else {
254
+ finish ();
255
+ }
256
+ }
214
257
}
215
258
259
+
216
260
private void startScreenSharing (final Intent data ) {
217
261
Fragment fragmentByTag = getSupportFragmentManager ().findFragmentByTag (ScreenShareFragment .class .getSimpleName ());
218
262
if (!(fragmentByTag instanceof ScreenShareFragment )) {
@@ -341,7 +385,9 @@ private void startIncomeCallTimer(long time) {
341
385
342
386
private void stopIncomeCallTimer () {
343
387
Log .d (TAG , "stopIncomeCallTimer" );
344
- showIncomingCallWindowTaskHandler .removeCallbacks (showIncomingCallWindowTask );
388
+ if (showIncomingCallWindowTask != null ) {
389
+ showIncomingCallWindowTaskHandler .removeCallbacks (showIncomingCallWindowTask );
390
+ }
345
391
}
346
392
347
393
private void addIncomeCallFragment () {
@@ -448,6 +494,11 @@ public void onReceiveHangUpFromUser(final QBRTCSession session, final Integer us
448
494
}
449
495
}
450
496
497
+ @ Override
498
+ public void onChangeReconnectionState (QBRTCSession qbrtcSession , Integer userId , QBRTCTypes .QBRTCReconnectionState qbrtcReconnectionState ) {
499
+ // empty
500
+ }
501
+
451
502
@ Override
452
503
public void onCallAcceptByUser (QBRTCSession session , Integer userId , Map <String , String > userInfo ) {
453
504
if (callService .isCurrentSession (session )) {
@@ -646,6 +697,11 @@ public QBRTCVideoTrack getVideoTrack(Integer userId) {
646
697
return callService .getVideoTrack (userId );
647
698
}
648
699
700
+ @ Override
701
+ public QBRTCTypes .QBRTCReconnectionState getState (Integer userId ) {
702
+ return callService .getState (userId );
703
+ }
704
+
649
705
@ Override
650
706
public void onStopPreview () {
651
707
callService .stopScreenSharing ();
@@ -707,7 +763,7 @@ public void run() {
707
763
}
708
764
709
765
public interface OnChangeAudioDevice {
710
- void audioDeviceChanged (AppRTCAudioManager .AudioDevice newAudioDevice );
766
+ void audioDeviceChanged (QBAudioManager .AudioDevice newAudioDevice );
711
767
}
712
768
713
769
public interface CurrentCallStateCallback {
0 commit comments