(IMS Threading refactoring) Telephony IMS classes to schedule IMS callback on the main thread

Modified to schedule callbacks on main thread or callback executor rather than on binder thread
Introducing utility api runWithCleanCallingIdentity to run the action in executor

Test: atest FrameworksTelephonyTests:ImsCallTest
Bug: 197989471
Change-Id: Icdb0750d63f242eb79351781a4b75ca745c30083
diff --git a/telephony/common/com/android/internal/telephony/util/TelephonyUtils.java b/telephony/common/com/android/internal/telephony/util/TelephonyUtils.java
index 3c799e0..8c78f74 100644
--- a/telephony/common/com/android/internal/telephony/util/TelephonyUtils.java
+++ b/telephony/common/com/android/internal/telephony/util/TelephonyUtils.java
@@ -101,6 +101,25 @@
         }
     }
 
+    /**
+     * Convenience method for running the provided action in the provided
+     * executor enclosed in
+     * {@link Binder#clearCallingIdentity}/{@link Binder#restoreCallingIdentity}
+     *
+     * Any exception thrown by the given action will need to be handled by caller.
+     *
+     */
+    public static void runWithCleanCallingIdentity(
+            @NonNull Runnable action, @NonNull Executor executor) {
+        if (action != null) {
+            if (executor != null) {
+                executor.execute(() -> runWithCleanCallingIdentity(action));
+            } else {
+                runWithCleanCallingIdentity(action);
+            }
+        }
+    }
+
 
     /**
      * Convenience method for running the provided action enclosed in
diff --git a/telephony/java/android/telephony/ims/ImsCallSession.java b/telephony/java/android/telephony/ims/ImsCallSession.java
index dfe5e6c9..6569de6 100755
--- a/telephony/java/android/telephony/ims/ImsCallSession.java
+++ b/telephony/java/android/telephony/ims/ImsCallSession.java
@@ -27,10 +27,12 @@
 
 import com.android.ims.internal.IImsCallSession;
 import com.android.ims.internal.IImsVideoCallProvider;
+import com.android.internal.telephony.util.TelephonyUtils;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
+import java.util.concurrent.Executor;
 
 /**
  * Provides the call initiation/termination, and media exchange between two IMS endpoints.
@@ -522,6 +524,7 @@
     private final IImsCallSession miSession;
     private boolean mClosed = false;
     private Listener mListener;
+    private Executor mListenerExecutor = Runnable::run;
 
     /** @hide */
     public ImsCallSession(IImsCallSession iSession) {
@@ -538,9 +541,9 @@
     }
 
     /** @hide */
-    public ImsCallSession(IImsCallSession iSession, Listener listener) {
+    public ImsCallSession(IImsCallSession iSession, Listener listener, Executor executor) {
         this(iSession);
-        setListener(listener);
+        setListener(listener, executor);
     }
 
     /**
@@ -738,10 +741,14 @@
      * override the previous listener.
      *
      * @param listener to listen to the session events of this object
+     * @param executor an Executor that will execute callbacks
      * @hide
      */
-    public void setListener(Listener listener) {
+    public void setListener(Listener listener, Executor executor) {
         mListener = listener;
+        if (executor != null) {
+            mListenerExecutor = executor;
+        }
     }
 
     /**
@@ -1206,42 +1213,48 @@
         @Override
         public void callSessionInitiating(ImsCallProfile profile) {
             if (mListener != null) {
-                mListener.callSessionInitiating(ImsCallSession.this, profile);
+                TelephonyUtils.runWithCleanCallingIdentity(()-> mListener.callSessionInitiating(
+                        ImsCallSession.this, profile), mListenerExecutor);
             }
         }
 
         @Override
         public void callSessionProgressing(ImsStreamMediaProfile profile) {
             if (mListener != null) {
-                mListener.callSessionProgressing(ImsCallSession.this, profile);
+                TelephonyUtils.runWithCleanCallingIdentity(()-> mListener.callSessionProgressing(
+                        ImsCallSession.this, profile), mListenerExecutor);
             }
         }
 
         @Override
         public void callSessionInitiated(ImsCallProfile profile) {
             if (mListener != null) {
-                mListener.callSessionStarted(ImsCallSession.this, profile);
+                TelephonyUtils.runWithCleanCallingIdentity(()-> mListener.callSessionStarted(
+                        ImsCallSession.this, profile), mListenerExecutor);
             }
         }
 
         @Override
         public void callSessionInitiatingFailed(ImsReasonInfo reasonInfo) {
             if (mListener != null) {
-                mListener.callSessionStartFailed(ImsCallSession.this, reasonInfo);
+                TelephonyUtils.runWithCleanCallingIdentity(()-> mListener.callSessionStartFailed(
+                        ImsCallSession.this, reasonInfo), mListenerExecutor);
             }
         }
 
         @Override
         public void callSessionInitiatedFailed(ImsReasonInfo reasonInfo) {
             if (mListener != null) {
-                mListener.callSessionStartFailed(ImsCallSession.this, reasonInfo);
+                TelephonyUtils.runWithCleanCallingIdentity(()-> mListener.callSessionStartFailed(
+                        ImsCallSession.this, reasonInfo), mListenerExecutor);
             }
         }
 
         @Override
         public void callSessionTerminated(ImsReasonInfo reasonInfo) {
             if (mListener != null) {
-                mListener.callSessionTerminated(ImsCallSession.this, reasonInfo);
+                TelephonyUtils.runWithCleanCallingIdentity(()-> mListener.callSessionTerminated(
+                        ImsCallSession.this, reasonInfo), mListenerExecutor);
             }
         }
 
@@ -1251,42 +1264,49 @@
         @Override
         public void callSessionHeld(ImsCallProfile profile) {
             if (mListener != null) {
-                mListener.callSessionHeld(ImsCallSession.this, profile);
+                TelephonyUtils.runWithCleanCallingIdentity(()-> mListener.callSessionHeld(
+                        ImsCallSession.this, profile), mListenerExecutor);
             }
         }
 
         @Override
         public void callSessionHoldFailed(ImsReasonInfo reasonInfo) {
             if (mListener != null) {
-                mListener.callSessionHoldFailed(ImsCallSession.this, reasonInfo);
+                TelephonyUtils.runWithCleanCallingIdentity(()-> mListener.callSessionHoldFailed(
+                        ImsCallSession.this, reasonInfo), mListenerExecutor);
             }
         }
 
         @Override
         public void callSessionHoldReceived(ImsCallProfile profile) {
             if (mListener != null) {
-                mListener.callSessionHoldReceived(ImsCallSession.this, profile);
+                TelephonyUtils.runWithCleanCallingIdentity(()-> mListener.callSessionHoldReceived(
+                        ImsCallSession.this, profile), mListenerExecutor);
             }
         }
 
         @Override
         public void callSessionResumed(ImsCallProfile profile) {
             if (mListener != null) {
-                mListener.callSessionResumed(ImsCallSession.this, profile);
+                TelephonyUtils.runWithCleanCallingIdentity(()-> mListener.callSessionResumed(
+                        ImsCallSession.this, profile), mListenerExecutor);
             }
         }
 
         @Override
         public void callSessionResumeFailed(ImsReasonInfo reasonInfo) {
             if (mListener != null) {
-                mListener.callSessionResumeFailed(ImsCallSession.this, reasonInfo);
+                TelephonyUtils.runWithCleanCallingIdentity(()-> mListener.callSessionResumeFailed(
+                        ImsCallSession.this, reasonInfo), mListenerExecutor);
             }
         }
 
         @Override
         public void callSessionResumeReceived(ImsCallProfile profile) {
             if (mListener != null) {
-                mListener.callSessionResumeReceived(ImsCallSession.this, profile);
+                TelephonyUtils.runWithCleanCallingIdentity(()->
+                        mListener.callSessionResumeReceived(ImsCallSession.this, profile),
+                        mListenerExecutor);
             }
         }
 
@@ -1311,13 +1331,15 @@
         @Override
         public void callSessionMergeComplete(IImsCallSession newSession) {
             if (mListener != null) {
-                if (newSession != null) {
-                    // New session created after conference
-                    mListener.callSessionMergeComplete(new ImsCallSession(newSession));
-               } else {
-                   // Session already exists. Hence no need to pass
-                   mListener.callSessionMergeComplete(null);
-               }
+                TelephonyUtils.runWithCleanCallingIdentity(()-> {
+                    if (newSession != null) {
+                        // New session created after conference
+                        mListener.callSessionMergeComplete(new ImsCallSession(newSession));
+                    } else {
+                        // Session already exists. Hence no need to pass
+                        mListener.callSessionMergeComplete(null);
+                    }
+                }, mListenerExecutor);
             }
         }
 
@@ -1329,7 +1351,9 @@
         @Override
         public void callSessionMergeFailed(ImsReasonInfo reasonInfo) {
             if (mListener != null) {
-                mListener.callSessionMergeFailed(ImsCallSession.this, reasonInfo);
+                TelephonyUtils.runWithCleanCallingIdentity(()->
+                        mListener.callSessionMergeFailed(ImsCallSession.this, reasonInfo),
+                        mListenerExecutor);
             }
         }
 
@@ -1339,21 +1363,27 @@
         @Override
         public void callSessionUpdated(ImsCallProfile profile) {
             if (mListener != null) {
-                mListener.callSessionUpdated(ImsCallSession.this, profile);
+                TelephonyUtils.runWithCleanCallingIdentity(()->
+                        mListener.callSessionUpdated(ImsCallSession.this, profile),
+                        mListenerExecutor);
             }
         }
 
         @Override
         public void callSessionUpdateFailed(ImsReasonInfo reasonInfo) {
             if (mListener != null) {
-                mListener.callSessionUpdateFailed(ImsCallSession.this, reasonInfo);
+                TelephonyUtils.runWithCleanCallingIdentity(()->
+                        mListener.callSessionUpdateFailed(ImsCallSession.this, reasonInfo),
+                        mListenerExecutor);
             }
         }
 
         @Override
         public void callSessionUpdateReceived(ImsCallProfile profile) {
             if (mListener != null) {
-                mListener.callSessionUpdateReceived(ImsCallSession.this, profile);
+                TelephonyUtils.runWithCleanCallingIdentity(()->
+                        mListener.callSessionUpdateReceived(ImsCallSession.this, profile),
+                        mListenerExecutor);
             }
         }
 
@@ -1364,15 +1394,18 @@
         public void callSessionConferenceExtended(IImsCallSession newSession,
                 ImsCallProfile profile) {
             if (mListener != null) {
-                mListener.callSessionConferenceExtended(ImsCallSession.this,
-                        new ImsCallSession(newSession), profile);
+                TelephonyUtils.runWithCleanCallingIdentity(()->
+                        mListener.callSessionConferenceExtended(ImsCallSession.this,
+                        new ImsCallSession(newSession), profile), mListenerExecutor);
             }
         }
 
         @Override
         public void callSessionConferenceExtendFailed(ImsReasonInfo reasonInfo) {
             if (mListener != null) {
-                mListener.callSessionConferenceExtendFailed(ImsCallSession.this, reasonInfo);
+                TelephonyUtils.runWithCleanCallingIdentity(()->
+                        mListener.callSessionConferenceExtendFailed(
+                        ImsCallSession.this, reasonInfo), mListenerExecutor);
             }
         }
 
@@ -1380,8 +1413,9 @@
         public void callSessionConferenceExtendReceived(IImsCallSession newSession,
                 ImsCallProfile profile) {
             if (mListener != null) {
-                mListener.callSessionConferenceExtendReceived(ImsCallSession.this,
-                        new ImsCallSession(newSession), profile);
+                TelephonyUtils.runWithCleanCallingIdentity(()->
+                        mListener.callSessionConferenceExtendReceived(ImsCallSession.this,
+                        new ImsCallSession(newSession), profile), mListenerExecutor);
             }
         }
 
@@ -1392,30 +1426,36 @@
         @Override
         public void callSessionInviteParticipantsRequestDelivered() {
             if (mListener != null) {
-                mListener.callSessionInviteParticipantsRequestDelivered(ImsCallSession.this);
+                TelephonyUtils.runWithCleanCallingIdentity(()->
+                        mListener.callSessionInviteParticipantsRequestDelivered(
+                        ImsCallSession.this), mListenerExecutor);
             }
         }
 
         @Override
         public void callSessionInviteParticipantsRequestFailed(ImsReasonInfo reasonInfo) {
             if (mListener != null) {
-                mListener.callSessionInviteParticipantsRequestFailed(ImsCallSession.this,
-                        reasonInfo);
+                TelephonyUtils.runWithCleanCallingIdentity(()->
+                        mListener.callSessionInviteParticipantsRequestFailed(ImsCallSession.this,
+                        reasonInfo), mListenerExecutor);
             }
         }
 
         @Override
         public void callSessionRemoveParticipantsRequestDelivered() {
             if (mListener != null) {
-                mListener.callSessionRemoveParticipantsRequestDelivered(ImsCallSession.this);
+                TelephonyUtils.runWithCleanCallingIdentity(()->
+                        mListener.callSessionRemoveParticipantsRequestDelivered(
+                        ImsCallSession.this), mListenerExecutor);
             }
         }
 
         @Override
         public void callSessionRemoveParticipantsRequestFailed(ImsReasonInfo reasonInfo) {
             if (mListener != null) {
-                mListener.callSessionRemoveParticipantsRequestFailed(ImsCallSession.this,
-                        reasonInfo);
+                TelephonyUtils.runWithCleanCallingIdentity(()->
+                        mListener.callSessionRemoveParticipantsRequestFailed(ImsCallSession.this,
+                        reasonInfo), mListenerExecutor);
             }
         }
 
@@ -1425,7 +1465,9 @@
         @Override
         public void callSessionConferenceStateUpdated(ImsConferenceState state) {
             if (mListener != null) {
-                mListener.callSessionConferenceStateUpdated(ImsCallSession.this, state);
+                TelephonyUtils.runWithCleanCallingIdentity(()->
+                        mListener.callSessionConferenceStateUpdated(ImsCallSession.this, state),
+                        mListenerExecutor);
             }
         }
 
@@ -1435,7 +1477,9 @@
         @Override
         public void callSessionUssdMessageReceived(int mode, String ussdMessage) {
             if (mListener != null) {
-                mListener.callSessionUssdMessageReceived(ImsCallSession.this, mode, ussdMessage);
+                TelephonyUtils.runWithCleanCallingIdentity(()->
+                        mListener.callSessionUssdMessageReceived(ImsCallSession.this, mode,
+                        ussdMessage), mListenerExecutor);
             }
         }
 
@@ -1453,8 +1497,9 @@
         @Override
         public void callSessionMayHandover(int srcNetworkType, int targetNetworkType) {
             if (mListener != null) {
-                mListener.callSessionMayHandover(ImsCallSession.this, srcNetworkType,
-                        targetNetworkType);
+                TelephonyUtils.runWithCleanCallingIdentity(()->
+                        mListener.callSessionMayHandover(ImsCallSession.this, srcNetworkType,
+                        targetNetworkType), mListenerExecutor);
             }
         }
 
@@ -1465,8 +1510,9 @@
         public void callSessionHandover(int srcNetworkType, int targetNetworkType,
                 ImsReasonInfo reasonInfo) {
             if (mListener != null) {
-                mListener.callSessionHandover(ImsCallSession.this, srcNetworkType,
-                        targetNetworkType, reasonInfo);
+                TelephonyUtils.runWithCleanCallingIdentity(()->
+                        mListener.callSessionHandover(ImsCallSession.this, srcNetworkType,
+                        targetNetworkType, reasonInfo), mListenerExecutor);
             }
         }
 
@@ -1477,8 +1523,9 @@
         public void callSessionHandoverFailed(int srcNetworkType, int targetNetworkType,
                 ImsReasonInfo reasonInfo) {
             if (mListener != null) {
-                mListener.callSessionHandoverFailed(ImsCallSession.this, srcNetworkType,
-                        targetNetworkType, reasonInfo);
+                TelephonyUtils.runWithCleanCallingIdentity(()->
+                        mListener.callSessionHandoverFailed(ImsCallSession.this, srcNetworkType,
+                        targetNetworkType, reasonInfo), mListenerExecutor);
             }
         }
 
@@ -1488,7 +1535,9 @@
         @Override
         public void callSessionTtyModeReceived(int mode) {
             if (mListener != null) {
-                mListener.callSessionTtyModeReceived(ImsCallSession.this, mode);
+                TelephonyUtils.runWithCleanCallingIdentity(()->
+                        mListener.callSessionTtyModeReceived(ImsCallSession.this, mode),
+                        mListenerExecutor);
             }
         }
 
@@ -1500,14 +1549,18 @@
          */
         public void callSessionMultipartyStateChanged(boolean isMultiParty) {
             if (mListener != null) {
-                mListener.callSessionMultipartyStateChanged(ImsCallSession.this, isMultiParty);
+                TelephonyUtils.runWithCleanCallingIdentity(()->
+                        mListener.callSessionMultipartyStateChanged(ImsCallSession.this,
+                        isMultiParty), mListenerExecutor);
             }
         }
 
         @Override
         public void callSessionSuppServiceReceived(ImsSuppServiceNotification suppServiceInfo ) {
             if (mListener != null) {
-                mListener.callSessionSuppServiceReceived(ImsCallSession.this, suppServiceInfo);
+                TelephonyUtils.runWithCleanCallingIdentity(()->
+                        mListener.callSessionSuppServiceReceived(ImsCallSession.this,
+                        suppServiceInfo), mListenerExecutor);
             }
         }
 
@@ -1517,7 +1570,9 @@
         @Override
         public void callSessionRttModifyRequestReceived(ImsCallProfile callProfile) {
             if (mListener != null) {
-                mListener.callSessionRttModifyRequestReceived(ImsCallSession.this, callProfile);
+                TelephonyUtils.runWithCleanCallingIdentity(()->
+                        mListener.callSessionRttModifyRequestReceived(ImsCallSession.this,
+                        callProfile), mListenerExecutor);
             }
         }
 
@@ -1527,7 +1582,9 @@
         @Override
         public void callSessionRttModifyResponseReceived(int status) {
             if (mListener != null) {
-                mListener.callSessionRttModifyResponseReceived(status);
+                TelephonyUtils.runWithCleanCallingIdentity(()->
+                        mListener.callSessionRttModifyResponseReceived(status),
+                        mListenerExecutor);
             }
         }
 
@@ -1537,7 +1594,8 @@
         @Override
         public void callSessionRttMessageReceived(String rttMessage) {
             if (mListener != null) {
-                mListener.callSessionRttMessageReceived(rttMessage);
+                TelephonyUtils.runWithCleanCallingIdentity(()->
+                        mListener.callSessionRttMessageReceived(rttMessage), mListenerExecutor);
             }
         }
 
@@ -1547,21 +1605,26 @@
         @Override
         public void callSessionRttAudioIndicatorChanged(ImsStreamMediaProfile profile) {
             if (mListener != null) {
-                mListener.callSessionRttAudioIndicatorChanged(profile);
+                TelephonyUtils.runWithCleanCallingIdentity(()->
+                        mListener.callSessionRttAudioIndicatorChanged(profile),
+                        mListenerExecutor);
             }
         }
 
         @Override
         public void callSessionTransferred() {
             if (mListener != null) {
-                mListener.callSessionTransferred(ImsCallSession.this);
+                TelephonyUtils.runWithCleanCallingIdentity(()->
+                        mListener.callSessionTransferred(ImsCallSession.this), mListenerExecutor);
             }
         }
 
         @Override
         public void callSessionTransferFailed(@Nullable ImsReasonInfo reasonInfo) {
             if (mListener != null) {
-                mListener.callSessionTransferFailed(ImsCallSession.this, reasonInfo);
+                TelephonyUtils.runWithCleanCallingIdentity(()->
+                        mListener.callSessionTransferFailed(ImsCallSession.this, reasonInfo),
+                        mListenerExecutor);
             }
         }
 
@@ -1572,7 +1635,8 @@
         @Override
         public void callSessionDtmfReceived(char dtmf) {
             if (mListener != null) {
-                mListener.callSessionDtmfReceived(dtmf);
+                TelephonyUtils.runWithCleanCallingIdentity(()-> mListener.callSessionDtmfReceived(
+                        dtmf), mListenerExecutor);
             }
         }
 
@@ -1582,7 +1646,8 @@
         @Override
         public void callQualityChanged(CallQuality callQuality) {
             if (mListener != null) {
-                mListener.callQualityChanged(callQuality);
+                TelephonyUtils.runWithCleanCallingIdentity(()-> mListener.callQualityChanged(
+                        callQuality), mListenerExecutor);
             }
         }
 
@@ -1594,8 +1659,9 @@
         public void callSessionRtpHeaderExtensionsReceived(
                 @NonNull List<RtpHeaderExtension> extensions) {
             if (mListener != null) {
-                mListener.callSessionRtpHeaderExtensionsReceived(
-                        new ArraySet<RtpHeaderExtension>(extensions));
+                TelephonyUtils.runWithCleanCallingIdentity(()->
+                        mListener.callSessionRtpHeaderExtensionsReceived(
+                        new ArraySet<RtpHeaderExtension>(extensions)), mListenerExecutor);
             }
         }
     }