Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 380f9be2 authored by Parvathy Shanmugam's avatar Parvathy Shanmugam
Browse files

Fix for crash while merging 2 audio calls for initiating conference call

Null pointer exception occured while calling callsessionupdated on listener object.
Listener turned null at the time of executor method is on run. Null check is present before setting the call to executor.
Modified the null checks to be inside of the executor.

Test: Conference call in oriole userdebug
Bug: 210701681
Change-Id: Iffeedb669b4abb9b4f32f015aaea4ba3b99c00f5
parent f4d2b4d4
Loading
Loading
Loading
Loading
+218 −189
Original line number Diff line number Diff line
@@ -1212,50 +1212,56 @@ public class ImsCallSession {
         */
        @Override
        public void callSessionInitiating(ImsCallProfile profile) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()-> mListener.callSessionInitiating(
                        ImsCallSession.this, profile), mListenerExecutor);
                    mListener.callSessionInitiating(ImsCallSession.this, profile);
                }
            }, mListenerExecutor);
        }

        @Override
        public void callSessionProgressing(ImsStreamMediaProfile profile) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()-> mListener.callSessionProgressing(
                        ImsCallSession.this, profile), mListenerExecutor);
                    mListener.callSessionProgressing(ImsCallSession.this, profile);
                }
            }, mListenerExecutor);
        }

        @Override
        public void callSessionInitiated(ImsCallProfile profile) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()-> mListener.callSessionStarted(
                        ImsCallSession.this, profile), mListenerExecutor);
                    mListener.callSessionStarted(ImsCallSession.this, profile);
                }
            }, mListenerExecutor);
        }

        @Override
        public void callSessionInitiatingFailed(ImsReasonInfo reasonInfo) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()-> mListener.callSessionStartFailed(
                        ImsCallSession.this, reasonInfo), mListenerExecutor);
                    mListener.callSessionStartFailed(ImsCallSession.this, reasonInfo);
                }
            }, mListenerExecutor);
        }

        @Override
        public void callSessionInitiatedFailed(ImsReasonInfo reasonInfo) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()-> mListener.callSessionStartFailed(
                        ImsCallSession.this, reasonInfo), mListenerExecutor);
                    mListener.callSessionStartFailed(ImsCallSession.this, reasonInfo);
                }
            }, mListenerExecutor);
        }

        @Override
        public void callSessionTerminated(ImsReasonInfo reasonInfo) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()-> mListener.callSessionTerminated(
                        ImsCallSession.this, reasonInfo), mListenerExecutor);
                    mListener.callSessionTerminated(ImsCallSession.this, reasonInfo);
                }
            }, mListenerExecutor);
        }

        /**
@@ -1263,51 +1269,56 @@ public class ImsCallSession {
         */
        @Override
        public void callSessionHeld(ImsCallProfile profile) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()-> mListener.callSessionHeld(
                        ImsCallSession.this, profile), mListenerExecutor);
                    mListener.callSessionHeld(ImsCallSession.this, profile);
                }
            }, mListenerExecutor);
        }

        @Override
        public void callSessionHoldFailed(ImsReasonInfo reasonInfo) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()-> mListener.callSessionHoldFailed(
                        ImsCallSession.this, reasonInfo), mListenerExecutor);
                    mListener.callSessionHoldFailed(ImsCallSession.this, reasonInfo);
                }
            }, mListenerExecutor);
        }

        @Override
        public void callSessionHoldReceived(ImsCallProfile profile) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()-> mListener.callSessionHoldReceived(
                        ImsCallSession.this, profile), mListenerExecutor);
                    mListener.callSessionHoldReceived(ImsCallSession.this, profile);
                }
            }, mListenerExecutor);
        }

        @Override
        public void callSessionResumed(ImsCallProfile profile) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()-> mListener.callSessionResumed(
                        ImsCallSession.this, profile), mListenerExecutor);
                    mListener.callSessionResumed(ImsCallSession.this, profile);
                }
            }, mListenerExecutor);
        }

        @Override
        public void callSessionResumeFailed(ImsReasonInfo reasonInfo) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()-> mListener.callSessionResumeFailed(
                        ImsCallSession.this, reasonInfo), mListenerExecutor);
                    mListener.callSessionResumeFailed(ImsCallSession.this, reasonInfo);
                }
            }, mListenerExecutor);
        }

        @Override
        public void callSessionResumeReceived(ImsCallProfile profile) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()->
                        mListener.callSessionResumeReceived(ImsCallSession.this, profile),
                        mListenerExecutor);
                    mListener.callSessionResumeReceived(ImsCallSession.this, profile);
                }
            }, mListenerExecutor);
        }

        /**
@@ -1330,8 +1341,8 @@ public class ImsCallSession {
         */
        @Override
        public void callSessionMergeComplete(IImsCallSession newSession) {
            if (mListener != null) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                    if (newSession != null) {
                        // New session created after conference
                        mListener.callSessionMergeComplete(new ImsCallSession(newSession));
@@ -1339,8 +1350,8 @@ public class ImsCallSession {
                        // Session already exists. Hence no need to pass
                        mListener.callSessionMergeComplete(null);
                    }
                }, mListenerExecutor);
                }
            }, mListenerExecutor);
        }

        /**
@@ -1350,11 +1361,11 @@ public class ImsCallSession {
         */
        @Override
        public void callSessionMergeFailed(ImsReasonInfo reasonInfo) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()->
                        mListener.callSessionMergeFailed(ImsCallSession.this, reasonInfo),
                        mListenerExecutor);
                    mListener.callSessionMergeFailed(ImsCallSession.this, reasonInfo);
                }
            }, mListenerExecutor);
        }

        /**
@@ -1362,29 +1373,29 @@ public class ImsCallSession {
         */
        @Override
        public void callSessionUpdated(ImsCallProfile profile) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()->
                        mListener.callSessionUpdated(ImsCallSession.this, profile),
                        mListenerExecutor);
                    mListener.callSessionUpdated(ImsCallSession.this, profile);
                }
            }, mListenerExecutor);
        }

        @Override
        public void callSessionUpdateFailed(ImsReasonInfo reasonInfo) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()->
                        mListener.callSessionUpdateFailed(ImsCallSession.this, reasonInfo),
                        mListenerExecutor);
                    mListener.callSessionUpdateFailed(ImsCallSession.this, reasonInfo);
                }
            }, mListenerExecutor);
        }

        @Override
        public void callSessionUpdateReceived(ImsCallProfile profile) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()->
                        mListener.callSessionUpdateReceived(ImsCallSession.this, profile),
                        mListenerExecutor);
                    mListener.callSessionUpdateReceived(ImsCallSession.this, profile);
                }
            }, mListenerExecutor);
        }

        /**
@@ -1393,30 +1404,33 @@ public class ImsCallSession {
        @Override
        public void callSessionConferenceExtended(IImsCallSession newSession,
                ImsCallProfile profile) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()->
                    mListener.callSessionConferenceExtended(ImsCallSession.this,
                        new ImsCallSession(newSession), profile), mListenerExecutor);
                            new ImsCallSession(newSession), profile);
                }
            }, mListenerExecutor);
        }

        @Override
        public void callSessionConferenceExtendFailed(ImsReasonInfo reasonInfo) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()->
                    mListener.callSessionConferenceExtendFailed(
                        ImsCallSession.this, reasonInfo), mListenerExecutor);
                            ImsCallSession.this, reasonInfo);
                }
            }, mListenerExecutor);
        }

        @Override
        public void callSessionConferenceExtendReceived(IImsCallSession newSession,
                ImsCallProfile profile) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()->
                    mListener.callSessionConferenceExtendReceived(ImsCallSession.this,
                        new ImsCallSession(newSession), profile), mListenerExecutor);
                            new ImsCallSession(newSession), profile);
                }
            }, mListenerExecutor);
        }

        /**
@@ -1425,38 +1439,41 @@ public class ImsCallSession {
         */
        @Override
        public void callSessionInviteParticipantsRequestDelivered() {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()->
                    mListener.callSessionInviteParticipantsRequestDelivered(
                        ImsCallSession.this), mListenerExecutor);
                            ImsCallSession.this);
                }
            }, mListenerExecutor);
        }

        @Override
        public void callSessionInviteParticipantsRequestFailed(ImsReasonInfo reasonInfo) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()->
                    mListener.callSessionInviteParticipantsRequestFailed(ImsCallSession.this,
                        reasonInfo), mListenerExecutor);
                            reasonInfo);
                }
            }, mListenerExecutor);
        }

        @Override
        public void callSessionRemoveParticipantsRequestDelivered() {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()->
                        mListener.callSessionRemoveParticipantsRequestDelivered(
                        ImsCallSession.this), mListenerExecutor);
                    mListener.callSessionRemoveParticipantsRequestDelivered(ImsCallSession.this);
                }
            }, mListenerExecutor);
        }

        @Override
        public void callSessionRemoveParticipantsRequestFailed(ImsReasonInfo reasonInfo) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()->
                    mListener.callSessionRemoveParticipantsRequestFailed(ImsCallSession.this,
                        reasonInfo), mListenerExecutor);
                            reasonInfo);
                }
            }, mListenerExecutor);
        }

        /**
@@ -1464,11 +1481,11 @@ public class ImsCallSession {
         */
        @Override
        public void callSessionConferenceStateUpdated(ImsConferenceState state) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()->
                        mListener.callSessionConferenceStateUpdated(ImsCallSession.this, state),
                        mListenerExecutor);
                    mListener.callSessionConferenceStateUpdated(ImsCallSession.this, state);
                }
            }, mListenerExecutor);
        }

        /**
@@ -1476,11 +1493,12 @@ public class ImsCallSession {
         */
        @Override
        public void callSessionUssdMessageReceived(int mode, String ussdMessage) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()->
                    mListener.callSessionUssdMessageReceived(ImsCallSession.this, mode,
                        ussdMessage), mListenerExecutor);
                            ussdMessage);
                }
            }, mListenerExecutor);
        }

        /**
@@ -1496,11 +1514,12 @@ public class ImsCallSession {
         */
        @Override
        public void callSessionMayHandover(int srcNetworkType, int targetNetworkType) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()->
                    mListener.callSessionMayHandover(ImsCallSession.this, srcNetworkType,
                        targetNetworkType), mListenerExecutor);
                            targetNetworkType);
                }
            }, mListenerExecutor);
        }

        /**
@@ -1509,11 +1528,12 @@ public class ImsCallSession {
        @Override
        public void callSessionHandover(int srcNetworkType, int targetNetworkType,
                ImsReasonInfo reasonInfo) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()->
                    mListener.callSessionHandover(ImsCallSession.this, srcNetworkType,
                        targetNetworkType, reasonInfo), mListenerExecutor);
                            targetNetworkType, reasonInfo);
                }
            }, mListenerExecutor);
        }

        /**
@@ -1522,11 +1542,12 @@ public class ImsCallSession {
        @Override
        public void callSessionHandoverFailed(int srcNetworkType, int targetNetworkType,
                ImsReasonInfo reasonInfo) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()->
                    mListener.callSessionHandoverFailed(ImsCallSession.this, srcNetworkType,
                        targetNetworkType, reasonInfo), mListenerExecutor);
                            targetNetworkType, reasonInfo);
                }
            }, mListenerExecutor);
        }

        /**
@@ -1534,11 +1555,11 @@ public class ImsCallSession {
         */
        @Override
        public void callSessionTtyModeReceived(int mode) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()->
                        mListener.callSessionTtyModeReceived(ImsCallSession.this, mode),
                        mListenerExecutor);
                    mListener.callSessionTtyModeReceived(ImsCallSession.this, mode);
                }
            }, mListenerExecutor);
        }

        /**
@@ -1548,20 +1569,22 @@ public class ImsCallSession {
         *      otherwise.
         */
        public void callSessionMultipartyStateChanged(boolean isMultiParty) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()->
                    mListener.callSessionMultipartyStateChanged(ImsCallSession.this,
                        isMultiParty), mListenerExecutor);
                            isMultiParty);
                }
            }, mListenerExecutor);
        }

        @Override
        public void callSessionSuppServiceReceived(ImsSuppServiceNotification suppServiceInfo ) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()->
                    mListener.callSessionSuppServiceReceived(ImsCallSession.this,
                        suppServiceInfo), mListenerExecutor);
                            suppServiceInfo);
                }
            }, mListenerExecutor);
        }

        /**
@@ -1569,11 +1592,12 @@ public class ImsCallSession {
         */
        @Override
        public void callSessionRttModifyRequestReceived(ImsCallProfile callProfile) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()->
                    mListener.callSessionRttModifyRequestReceived(ImsCallSession.this,
                        callProfile), mListenerExecutor);
                            callProfile);
                }
            }, mListenerExecutor);
        }

        /**
@@ -1581,11 +1605,11 @@ public class ImsCallSession {
         */
        @Override
        public void callSessionRttModifyResponseReceived(int status) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()->
                        mListener.callSessionRttModifyResponseReceived(status),
                        mListenerExecutor);
                    mListener.callSessionRttModifyResponseReceived(status);
                }
            }, mListenerExecutor);
        }

        /**
@@ -1593,10 +1617,11 @@ public class ImsCallSession {
         */
        @Override
        public void callSessionRttMessageReceived(String rttMessage) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()->
                        mListener.callSessionRttMessageReceived(rttMessage), mListenerExecutor);
                    mListener.callSessionRttMessageReceived(rttMessage);
                }
            }, mListenerExecutor);
        }

        /**
@@ -1604,28 +1629,29 @@ public class ImsCallSession {
         */
        @Override
        public void callSessionRttAudioIndicatorChanged(ImsStreamMediaProfile profile) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()->
                        mListener.callSessionRttAudioIndicatorChanged(profile),
                        mListenerExecutor);
                    mListener.callSessionRttAudioIndicatorChanged(profile);
                }
            }, mListenerExecutor);
        }

        @Override
        public void callSessionTransferred() {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()->
                        mListener.callSessionTransferred(ImsCallSession.this), mListenerExecutor);
                    mListener.callSessionTransferred(ImsCallSession.this);
                }
            }, mListenerExecutor);
        }

        @Override
        public void callSessionTransferFailed(@Nullable ImsReasonInfo reasonInfo) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()->
                        mListener.callSessionTransferFailed(ImsCallSession.this, reasonInfo),
                        mListenerExecutor);
                    mListener.callSessionTransferFailed(ImsCallSession.this, reasonInfo);
                }
            }, mListenerExecutor);
        }

        /**
@@ -1634,10 +1660,11 @@ public class ImsCallSession {
         */
        @Override
        public void callSessionDtmfReceived(char dtmf) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()-> mListener.callSessionDtmfReceived(
                        dtmf), mListenerExecutor);
                    mListener.callSessionDtmfReceived(dtmf);
                }
            }, mListenerExecutor);
        }

        /**
@@ -1645,10 +1672,11 @@ public class ImsCallSession {
         */
        @Override
        public void callQualityChanged(CallQuality callQuality) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()-> mListener.callQualityChanged(
                        callQuality), mListenerExecutor);
                    mListener.callQualityChanged(callQuality);
                }
            }, mListenerExecutor);
        }

        /**
@@ -1658,11 +1686,12 @@ public class ImsCallSession {
        @Override
        public void callSessionRtpHeaderExtensionsReceived(
                @NonNull List<RtpHeaderExtension> extensions) {
            TelephonyUtils.runWithCleanCallingIdentity(()-> {
                if (mListener != null) {
                TelephonyUtils.runWithCleanCallingIdentity(()->
                    mListener.callSessionRtpHeaderExtensionsReceived(
                        new ArraySet<RtpHeaderExtension>(extensions)), mListenerExecutor);
                            new ArraySet<RtpHeaderExtension>(extensions));
                }
            }, mListenerExecutor);
        }
    }