(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
Merged-In: Icdb0750d63f242eb79351781a4b75ca745c30083
This commit is contained in:
Parvathy Shanmugam 2021-10-28 16:41:12 +00:00
parent d93ed0045d
commit add3b8d76e
2 changed files with 143 additions and 58 deletions

View File

@ -107,6 +107,25 @@ public final class TelephonyUtils {
}
}
/**
* 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

View File

@ -27,10 +27,12 @@ import android.util.Log;
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 @@ public class ImsCallSession {
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 @@ public class ImsCallSession {
}
/** @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 @@ public class ImsCallSession {
* 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 @@ public class ImsCallSession {
@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 @@ public class ImsCallSession {
@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 @@ public class ImsCallSession {
@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 @@ public class ImsCallSession {
@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 @@ public class ImsCallSession {
@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 class ImsCallSession {
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 class ImsCallSession {
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 @@ public class ImsCallSession {
@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 @@ public class ImsCallSession {
@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 @@ public class ImsCallSession {
@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 @@ public class ImsCallSession {
@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 class ImsCallSession {
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 class ImsCallSession {
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 @@ public class ImsCallSession {
@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 class ImsCallSession {
*/
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 @@ public class ImsCallSession {
@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 @@ public class ImsCallSession {
@Override
public void callSessionRttModifyResponseReceived(int status) {
if (mListener != null) {
mListener.callSessionRttModifyResponseReceived(status);
TelephonyUtils.runWithCleanCallingIdentity(()->
mListener.callSessionRttModifyResponseReceived(status),
mListenerExecutor);
}
}
@ -1537,7 +1594,8 @@ public class ImsCallSession {
@Override
public void callSessionRttMessageReceived(String rttMessage) {
if (mListener != null) {
mListener.callSessionRttMessageReceived(rttMessage);
TelephonyUtils.runWithCleanCallingIdentity(()->
mListener.callSessionRttMessageReceived(rttMessage), mListenerExecutor);
}
}
@ -1547,21 +1605,26 @@ public class ImsCallSession {
@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 @@ public class ImsCallSession {
@Override
public void callSessionDtmfReceived(char dtmf) {
if (mListener != null) {
mListener.callSessionDtmfReceived(dtmf);
TelephonyUtils.runWithCleanCallingIdentity(()-> mListener.callSessionDtmfReceived(
dtmf), mListenerExecutor);
}
}
@ -1582,7 +1646,8 @@ public class ImsCallSession {
@Override
public void callQualityChanged(CallQuality callQuality) {
if (mListener != null) {
mListener.callQualityChanged(callQuality);
TelephonyUtils.runWithCleanCallingIdentity(()-> mListener.callQualityChanged(
callQuality), mListenerExecutor);
}
}
@ -1594,8 +1659,9 @@ public class ImsCallSession {
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);
}
}
}