@@ -29,6 +29,7 @@ import {
2929 TRACK_UPDATED ,
3030 TRACK_WILL_CREATE
3131} from './actionTypes' ;
32+ import { toggleScreensharing } from './actions' ;
3233import {
3334 createLocalTracksF ,
3435 getCameraFacingMode ,
@@ -385,8 +386,22 @@ export function trackAdded(track: any) {
385386 const mediaType = track . getVideoType ( ) === VIDEO_TYPE . DESKTOP
386387 ? MEDIA_TYPE . SCREENSHARE
387388 : track . getType ( ) ;
389+
388390 let isReceivingData , noDataFromSourceNotificationInfo , participantId ;
389391
392+ // Make screen share toggle off listen to MediaStreamTrack "ended" event
393+ // when it's terminated via Android status bar chip.
394+ if ( navigator . product === 'ReactNative' ) {
395+ const mediaStreamTrack = track ?. getTrack ?.( ) ;
396+
397+ if ( mediaType === MEDIA_TYPE . SCREENSHARE ) {
398+ const onEnded = ( ) => dispatch ( toggleScreensharing ( false ) ) ;
399+
400+ mediaStreamTrack . addEventListener ( 'ended' , onEnded ) ;
401+ track . _onEnded = onEnded ;
402+ }
403+ }
404+
390405 if ( local ) {
391406 // Reset the no data from src notification state when we change the track, as it's context is set
392407 // on a per device basis.
@@ -568,6 +583,16 @@ export function trackRemoved(track: any): {
568583 track . removeAllListeners ( JitsiTrackEvents . TRACK_VIDEOTYPE_CHANGED ) ;
569584 track . removeAllListeners ( JitsiTrackEvents . NO_DATA_FROM_SOURCE ) ;
570585
586+ // Remove MediaStreamTrack "ended" event.
587+ if ( navigator . product === 'ReactNative' ) {
588+ const mediaStreamTrack = track ?. getTrack ?.( ) ;
589+
590+ if ( track . _onEnded ) {
591+ mediaStreamTrack . removeEventListener ( 'ended' , track . _onEnded ) ;
592+ delete track . _onEnded ;
593+ }
594+ }
595+
571596 return {
572597 type : TRACK_REMOVED ,
573598 track : {
0 commit comments