11package com .quickblox .sample .videochat .java .activities ;
22
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+
37import android .app .Activity ;
48import android .app .KeyguardManager ;
59import android .content .ComponentName ;
610import android .content .Context ;
711import android .content .Intent ;
812import android .content .ServiceConnection ;
13+ import android .media .projection .MediaProjectionManager ;
914import android .net .Uri ;
1015import android .os .Build ;
1116import android .os .Bundle ;
4449import com .quickblox .sample .videochat .java .utils .UsersUtils ;
4550import com .quickblox .sample .videochat .java .utils .WebRtcSessionManager ;
4651import com .quickblox .users .model .QBUser ;
47- import com .quickblox .videochat .webrtc .AppRTCAudioManager ;
4852import com .quickblox .videochat .webrtc .BaseSession ;
4953import com .quickblox .videochat .webrtc .QBRTCScreenCapturer ;
5054import com .quickblox .videochat .webrtc .QBRTCSession ;
5155import com .quickblox .videochat .webrtc .QBRTCTypes ;
56+ import com .quickblox .videochat .webrtc .audio .QBAudioManager ;
5257import com .quickblox .videochat .webrtc .callbacks .QBRTCClientSessionCallbacks ;
5358import com .quickblox .videochat .webrtc .callbacks .QBRTCClientVideoTracksCallbacks ;
5459import com .quickblox .videochat .webrtc .callbacks .QBRTCSessionEventsCallback ;
6469import java .util .List ;
6570import java .util .Map ;
6671
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-
7072/**
7173 * QuickBlox team
7274 */
@@ -77,6 +79,7 @@ public class CallActivity extends BaseActivity implements IncomeCallFragmentCall
7779
7880 public static final String INCOME_CALL_FRAGMENT = "income_call_fragment" ;
7981 public static final int REQUEST_PERMISSION_SETTING = 545 ;
82+ public static final int REQUEST_SHARING_MEDIA_PROJECTION = 1060 ;
8083
8184 private final ArrayList <CurrentCallStateCallback > currentCallStateCallbackList = new ArrayList <>();
8285 private final UsersDbManager dbManager = UsersDbManager .getInstance ();
@@ -97,7 +100,6 @@ public static void start(Context context, boolean isIncomingCall) {
97100 intent .putExtra (Consts .EXTRA_IS_INCOMING_CALL , isIncomingCall );
98101 SharedPrefsHelper .getInstance ().save (Consts .EXTRA_IS_INCOMING_CALL , isIncomingCall );
99102 context .startActivity (intent );
100- CallService .start (context );
101103 }
102104
103105 @ Override
@@ -107,6 +109,38 @@ protected void onCreate(Bundle savedInstanceState) {
107109 setContentView (R .layout .activity_main );
108110 checker = new PermissionsChecker (this );
109111 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 );
110144 }
111145
112146 @ Override
@@ -134,6 +168,7 @@ public void finish() {
134168 @ Override
135169 public void onBackPressed () {
136170 // to prevent returning from Call Fragment
171+ super .onBackPressed ();
137172 }
138173
139174 private void allowOnLockScreen () {
@@ -211,8 +246,17 @@ protected void onActivityResult(int requestCode, int resultCode, final Intent da
211246 startScreenSharing (data );
212247 Log .i (TAG , "Starting Screen Capture" );
213248 }
249+
250+ if (requestCode == REQUEST_SHARING_MEDIA_PROJECTION ) {
251+ if (resultCode == Activity .RESULT_OK ) {
252+ CallService .start (this );
253+ } else {
254+ finish ();
255+ }
256+ }
214257 }
215258
259+
216260 private void startScreenSharing (final Intent data ) {
217261 Fragment fragmentByTag = getSupportFragmentManager ().findFragmentByTag (ScreenShareFragment .class .getSimpleName ());
218262 if (!(fragmentByTag instanceof ScreenShareFragment )) {
@@ -341,7 +385,9 @@ private void startIncomeCallTimer(long time) {
341385
342386 private void stopIncomeCallTimer () {
343387 Log .d (TAG , "stopIncomeCallTimer" );
344- showIncomingCallWindowTaskHandler .removeCallbacks (showIncomingCallWindowTask );
388+ if (showIncomingCallWindowTask != null ) {
389+ showIncomingCallWindowTaskHandler .removeCallbacks (showIncomingCallWindowTask );
390+ }
345391 }
346392
347393 private void addIncomeCallFragment () {
@@ -448,6 +494,11 @@ public void onReceiveHangUpFromUser(final QBRTCSession session, final Integer us
448494 }
449495 }
450496
497+ @ Override
498+ public void onChangeReconnectionState (QBRTCSession qbrtcSession , Integer userId , QBRTCTypes .QBRTCReconnectionState qbrtcReconnectionState ) {
499+ // empty
500+ }
501+
451502 @ Override
452503 public void onCallAcceptByUser (QBRTCSession session , Integer userId , Map <String , String > userInfo ) {
453504 if (callService .isCurrentSession (session )) {
@@ -646,6 +697,11 @@ public QBRTCVideoTrack getVideoTrack(Integer userId) {
646697 return callService .getVideoTrack (userId );
647698 }
648699
700+ @ Override
701+ public QBRTCTypes .QBRTCReconnectionState getState (Integer userId ) {
702+ return callService .getState (userId );
703+ }
704+
649705 @ Override
650706 public void onStopPreview () {
651707 callService .stopScreenSharing ();
@@ -707,7 +763,7 @@ public void run() {
707763 }
708764
709765 public interface OnChangeAudioDevice {
710- void audioDeviceChanged (AppRTCAudioManager .AudioDevice newAudioDevice );
766+ void audioDeviceChanged (QBAudioManager .AudioDevice newAudioDevice );
711767 }
712768
713769 public interface CurrentCallStateCallback {
0 commit comments