Loading telecomm/java/android/telecom/Call.java +2 −1 Original line number Diff line number Diff line Loading @@ -933,7 +933,8 @@ public final class Call { Collections.unmodifiableList(parcelableCall.getCannedSmsResponses()); } boolean videoCallChanged = !Objects.equals(mVideoCall, parcelableCall.getVideoCall()); boolean videoCallChanged = parcelableCall.isVideoCallProviderChanged() && !Objects.equals(mVideoCall, parcelableCall.getVideoCall()); if (videoCallChanged) { mVideoCall = parcelableCall.getVideoCall(); } Loading telecomm/java/android/telecom/Connection.java +73 −28 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import android.view.Surface; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; Loading Loading @@ -402,7 +403,7 @@ public abstract class Connection implements Conferenceable { */ public static final int SESSION_MODIFY_REQUEST_REJECTED_BY_REMOTE = 5; private static final int MSG_SET_VIDEO_CALLBACK = 1; private static final int MSG_ADD_VIDEO_CALLBACK = 1; private static final int MSG_SET_CAMERA = 2; private static final int MSG_SET_PREVIEW_SURFACE = 3; private static final int MSG_SET_DISPLAY_SURFACE = 4; Loading @@ -413,11 +414,16 @@ public abstract class Connection implements Conferenceable { private static final int MSG_REQUEST_CAMERA_CAPABILITIES = 9; private static final int MSG_REQUEST_CONNECTION_DATA_USAGE = 10; private static final int MSG_SET_PAUSE_IMAGE = 11; private static final int MSG_REMOVE_VIDEO_CALLBACK = 12; private final VideoProvider.VideoProviderHandler mMessageHandler = new VideoProvider.VideoProviderHandler(); private final VideoProvider.VideoProviderBinder mBinder; private IVideoCallback mVideoCallback; /** * Stores a list of the video callbacks, keyed by IBinder. */ private HashMap<IBinder, IVideoCallback> mVideoCallbacks = new HashMap<>(); /** * Default handler used to consolidate binder method calls onto a single thread. Loading @@ -426,9 +432,29 @@ public abstract class Connection implements Conferenceable { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_SET_VIDEO_CALLBACK: mVideoCallback = IVideoCallback.Stub.asInterface((IBinder) msg.obj); case MSG_ADD_VIDEO_CALLBACK: { IBinder binder = (IBinder) msg.obj; IVideoCallback callback = IVideoCallback.Stub .asInterface((IBinder) msg.obj); if (mVideoCallbacks.containsKey(binder)) { Log.i(this, "addVideoProvider - skipped; already present."); break; } mVideoCallbacks.put(binder, callback); Log.i(this, "addVideoProvider "+ mVideoCallbacks.size()); break; } case MSG_REMOVE_VIDEO_CALLBACK: { IBinder binder = (IBinder) msg.obj; IVideoCallback callback = IVideoCallback.Stub .asInterface((IBinder) msg.obj); if (!mVideoCallbacks.containsKey(binder)) { Log.i(this, "removeVideoProvider - skipped; not present."); break; } mVideoCallbacks.remove(binder); break; } case MSG_SET_CAMERA: onSetCamera((String) msg.obj); break; Loading Loading @@ -469,9 +495,14 @@ public abstract class Connection implements Conferenceable { * IVideoProvider stub implementation. */ private final class VideoProviderBinder extends IVideoProvider.Stub { public void setVideoCallback(IBinder videoCallbackBinder) { public void addVideoCallback(IBinder videoCallbackBinder) { mMessageHandler.obtainMessage( MSG_SET_VIDEO_CALLBACK, videoCallbackBinder).sendToTarget(); MSG_ADD_VIDEO_CALLBACK, videoCallbackBinder).sendToTarget(); } public void removeVideoCallback(IBinder videoCallbackBinder) { mMessageHandler.obtainMessage( MSG_REMOVE_VIDEO_CALLBACK, videoCallbackBinder).sendToTarget(); } public void setCamera(String cameraId) { Loading Loading @@ -609,21 +640,23 @@ public abstract class Connection implements Conferenceable { public abstract void onSetPauseImage(String uri); /** * Invokes callback method defined in In-Call UI. * Invokes callback method defined in listening {@link InCallService} implementations. * * @param videoProfile The requested video connection profile. */ public void receiveSessionModifyRequest(VideoProfile videoProfile) { if (mVideoCallback != null) { if (mVideoCallbacks != null) { try { mVideoCallback.receiveSessionModifyRequest(videoProfile); for (IVideoCallback callback : mVideoCallbacks.values()) { callback.receiveSessionModifyRequest(videoProfile); } } catch (RemoteException ignored) { } } } /** * Invokes callback method defined in In-Call UI. * Invokes callback method defined in listening {@link InCallService} implementations. * * @param status Status of the session modify request. Valid values are * {@link VideoProvider#SESSION_MODIFY_REQUEST_SUCCESS}, Loading @@ -634,17 +667,19 @@ public abstract class Connection implements Conferenceable { */ public void receiveSessionModifyResponse(int status, VideoProfile requestedProfile, VideoProfile responseProfile) { if (mVideoCallback != null) { if (mVideoCallbacks != null) { try { mVideoCallback.receiveSessionModifyResponse( status, requestedProfile, responseProfile); for (IVideoCallback callback : mVideoCallbacks.values()) { callback.receiveSessionModifyResponse(status, requestedProfile, responseProfile); } } catch (RemoteException ignored) { } } } /** * Invokes callback method defined in In-Call UI. * Invokes callback method defined in listening {@link InCallService} implementations. * * Valid values are: {@link VideoProvider#SESSION_EVENT_RX_PAUSE}, * {@link VideoProvider#SESSION_EVENT_RX_RESUME}, Loading @@ -654,66 +689,76 @@ public abstract class Connection implements Conferenceable { * @param event The event. */ public void handleCallSessionEvent(int event) { if (mVideoCallback != null) { if (mVideoCallbacks != null) { try { mVideoCallback.handleCallSessionEvent(event); for (IVideoCallback callback : mVideoCallbacks.values()) { callback.handleCallSessionEvent(event); } } catch (RemoteException ignored) { } } } /** * Invokes callback method defined in In-Call UI. * Invokes callback method defined in listening {@link InCallService} implementations. * * @param width The updated peer video width. * @param height The updated peer video height. */ public void changePeerDimensions(int width, int height) { if (mVideoCallback != null) { if (mVideoCallbacks != null) { try { mVideoCallback.changePeerDimensions(width, height); for (IVideoCallback callback : mVideoCallbacks.values()) { callback.changePeerDimensions(width, height); } } catch (RemoteException ignored) { } } } /** * Invokes callback method defined in In-Call UI. * Invokes callback method defined in listening {@link InCallService} implementations. * * @param dataUsage The updated data usage. */ public void changeCallDataUsage(long dataUsage) { if (mVideoCallback != null) { if (mVideoCallbacks != null) { try { mVideoCallback.changeCallDataUsage(dataUsage); for (IVideoCallback callback : mVideoCallbacks.values()) { callback.changeCallDataUsage(dataUsage); } } catch (RemoteException ignored) { } } } /** * Invokes callback method defined in In-Call UI. * Invokes callback method defined in listening {@link InCallService} implementations. * * @param cameraCapabilities The changed camera capabilities. */ public void changeCameraCapabilities(CameraCapabilities cameraCapabilities) { if (mVideoCallback != null) { if (mVideoCallbacks != null) { try { mVideoCallback.changeCameraCapabilities(cameraCapabilities); for (IVideoCallback callback : mVideoCallbacks.values()) { callback.changeCameraCapabilities(cameraCapabilities); } } catch (RemoteException ignored) { } } } /** * Invokes callback method defined in In-Call UI. * Invokes callback method defined in listening {@link InCallService} implementations. * * @param videoQuality The updated video quality. */ public void changeVideoQuality(int videoQuality) { if (mVideoCallback != null) { if (mVideoCallbacks != null) { try { mVideoCallback.changeVideoQuality(videoQuality); for (IVideoCallback callback : mVideoCallbacks.values()) { callback.changeVideoQuality(videoQuality); } } catch (RemoteException ignored) { } } Loading telecomm/java/android/telecom/InCallService.java +5 −0 Original line number Diff line number Diff line Loading @@ -369,6 +369,11 @@ public abstract class InCallService extends Service { */ public abstract void registerCallback(VideoCall.Callback callback); /** * Clears the video call listener set via {@link #setVideoCallListener(Listener)}. */ public abstract void removeVideoCallListener(); /** * Sets the camera to be used for video recording in a video call. * Loading telecomm/java/android/telecom/ParcelableCall.java +18 −0 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ public final class ParcelableCall implements Parcelable { private final int mCallerDisplayNamePresentation; private final GatewayInfo mGatewayInfo; private final PhoneAccountHandle mAccountHandle; private final boolean mIsVideoCallProviderChanged; private final IVideoProvider mVideoCallProvider; private InCallService.VideoCall mVideoCall; private final String mParentCallId; Loading @@ -69,6 +70,7 @@ public final class ParcelableCall implements Parcelable { int callerDisplayNamePresentation, GatewayInfo gatewayInfo, PhoneAccountHandle accountHandle, boolean isVideoCallProviderChanged, IVideoProvider videoCallProvider, String parentCallId, List<String> childCallIds, Loading @@ -89,6 +91,7 @@ public final class ParcelableCall implements Parcelable { mCallerDisplayNamePresentation = callerDisplayNamePresentation; mGatewayInfo = gatewayInfo; mAccountHandle = accountHandle; mIsVideoCallProviderChanged = isVideoCallProviderChanged; mVideoCallProvider = videoCallProvider; mParentCallId = parentCallId; mChildCallIds = childCallIds; Loading Loading @@ -232,6 +235,18 @@ public final class ParcelableCall implements Parcelable { return mExtras; } /** * Indicates to the receiver of the {@link ParcelableCall} whether a change has occurred in the * {@link android.telecom.InCallService.VideoCall} associated with this call. Since * {@link #getVideoCall()} creates a new {@link VideoCallImpl}, it is useful to know whether * the provider has changed (which can influence whether it is accessed). * * @return {@code true} if the video call changed, {@code false} otherwise. */ public boolean isVideoCallProviderChanged() { return mIsVideoCallProviderChanged; } /** Responsible for creating ParcelableCall objects for deserialized Parcels. */ public static final Parcelable.Creator<ParcelableCall> CREATOR = new Parcelable.Creator<ParcelableCall> () { Loading @@ -252,6 +267,7 @@ public final class ParcelableCall implements Parcelable { int callerDisplayNamePresentation = source.readInt(); GatewayInfo gatewayInfo = source.readParcelable(classLoader); PhoneAccountHandle accountHandle = source.readParcelable(classLoader); boolean isVideoCallProviderChanged = source.readByte() == 1; IVideoProvider videoCallProvider = IVideoProvider.Stub.asInterface(source.readStrongBinder()); String parentCallId = source.readString(); Loading @@ -276,6 +292,7 @@ public final class ParcelableCall implements Parcelable { callerDisplayNamePresentation, gatewayInfo, accountHandle, isVideoCallProviderChanged, videoCallProvider, parentCallId, childCallIds, Loading Loading @@ -313,6 +330,7 @@ public final class ParcelableCall implements Parcelable { destination.writeInt(mCallerDisplayNamePresentation); destination.writeParcelable(mGatewayInfo, 0); destination.writeParcelable(mAccountHandle, 0); destination.writeByte((byte) (mIsVideoCallProviderChanged ? 1 : 0)); destination.writeStrongBinder( mVideoCallProvider != null ? mVideoCallProvider.asBinder() : null); destination.writeString(mParentCallId); Loading telecomm/java/android/telecom/Phone.java +9 −0 Original line number Diff line number Diff line Loading @@ -122,6 +122,11 @@ public final class Phone { final void internalRemoveCall(Call call) { mCallByTelecomCallId.remove(call.internalGetCallId()); mCalls.remove(call); InCallService.VideoCall videoCall = call.getVideoCall(); if (videoCall != null) { videoCall.removeVideoCallListener(); } fireCallRemoved(call); } Loading Loading @@ -167,6 +172,10 @@ public final class Phone { */ final void destroy() { for (Call call : mCalls) { InCallService.VideoCall videoCall = call.getVideoCall(); if (videoCall != null) { videoCall.removeVideoCallListener(); } if (call.getState() != Call.STATE_DISCONNECTED) { call.internalSetDisconnected(); } Loading Loading
telecomm/java/android/telecom/Call.java +2 −1 Original line number Diff line number Diff line Loading @@ -933,7 +933,8 @@ public final class Call { Collections.unmodifiableList(parcelableCall.getCannedSmsResponses()); } boolean videoCallChanged = !Objects.equals(mVideoCall, parcelableCall.getVideoCall()); boolean videoCallChanged = parcelableCall.isVideoCallProviderChanged() && !Objects.equals(mVideoCall, parcelableCall.getVideoCall()); if (videoCallChanged) { mVideoCall = parcelableCall.getVideoCall(); } Loading
telecomm/java/android/telecom/Connection.java +73 −28 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import android.view.Surface; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; Loading Loading @@ -402,7 +403,7 @@ public abstract class Connection implements Conferenceable { */ public static final int SESSION_MODIFY_REQUEST_REJECTED_BY_REMOTE = 5; private static final int MSG_SET_VIDEO_CALLBACK = 1; private static final int MSG_ADD_VIDEO_CALLBACK = 1; private static final int MSG_SET_CAMERA = 2; private static final int MSG_SET_PREVIEW_SURFACE = 3; private static final int MSG_SET_DISPLAY_SURFACE = 4; Loading @@ -413,11 +414,16 @@ public abstract class Connection implements Conferenceable { private static final int MSG_REQUEST_CAMERA_CAPABILITIES = 9; private static final int MSG_REQUEST_CONNECTION_DATA_USAGE = 10; private static final int MSG_SET_PAUSE_IMAGE = 11; private static final int MSG_REMOVE_VIDEO_CALLBACK = 12; private final VideoProvider.VideoProviderHandler mMessageHandler = new VideoProvider.VideoProviderHandler(); private final VideoProvider.VideoProviderBinder mBinder; private IVideoCallback mVideoCallback; /** * Stores a list of the video callbacks, keyed by IBinder. */ private HashMap<IBinder, IVideoCallback> mVideoCallbacks = new HashMap<>(); /** * Default handler used to consolidate binder method calls onto a single thread. Loading @@ -426,9 +432,29 @@ public abstract class Connection implements Conferenceable { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_SET_VIDEO_CALLBACK: mVideoCallback = IVideoCallback.Stub.asInterface((IBinder) msg.obj); case MSG_ADD_VIDEO_CALLBACK: { IBinder binder = (IBinder) msg.obj; IVideoCallback callback = IVideoCallback.Stub .asInterface((IBinder) msg.obj); if (mVideoCallbacks.containsKey(binder)) { Log.i(this, "addVideoProvider - skipped; already present."); break; } mVideoCallbacks.put(binder, callback); Log.i(this, "addVideoProvider "+ mVideoCallbacks.size()); break; } case MSG_REMOVE_VIDEO_CALLBACK: { IBinder binder = (IBinder) msg.obj; IVideoCallback callback = IVideoCallback.Stub .asInterface((IBinder) msg.obj); if (!mVideoCallbacks.containsKey(binder)) { Log.i(this, "removeVideoProvider - skipped; not present."); break; } mVideoCallbacks.remove(binder); break; } case MSG_SET_CAMERA: onSetCamera((String) msg.obj); break; Loading Loading @@ -469,9 +495,14 @@ public abstract class Connection implements Conferenceable { * IVideoProvider stub implementation. */ private final class VideoProviderBinder extends IVideoProvider.Stub { public void setVideoCallback(IBinder videoCallbackBinder) { public void addVideoCallback(IBinder videoCallbackBinder) { mMessageHandler.obtainMessage( MSG_SET_VIDEO_CALLBACK, videoCallbackBinder).sendToTarget(); MSG_ADD_VIDEO_CALLBACK, videoCallbackBinder).sendToTarget(); } public void removeVideoCallback(IBinder videoCallbackBinder) { mMessageHandler.obtainMessage( MSG_REMOVE_VIDEO_CALLBACK, videoCallbackBinder).sendToTarget(); } public void setCamera(String cameraId) { Loading Loading @@ -609,21 +640,23 @@ public abstract class Connection implements Conferenceable { public abstract void onSetPauseImage(String uri); /** * Invokes callback method defined in In-Call UI. * Invokes callback method defined in listening {@link InCallService} implementations. * * @param videoProfile The requested video connection profile. */ public void receiveSessionModifyRequest(VideoProfile videoProfile) { if (mVideoCallback != null) { if (mVideoCallbacks != null) { try { mVideoCallback.receiveSessionModifyRequest(videoProfile); for (IVideoCallback callback : mVideoCallbacks.values()) { callback.receiveSessionModifyRequest(videoProfile); } } catch (RemoteException ignored) { } } } /** * Invokes callback method defined in In-Call UI. * Invokes callback method defined in listening {@link InCallService} implementations. * * @param status Status of the session modify request. Valid values are * {@link VideoProvider#SESSION_MODIFY_REQUEST_SUCCESS}, Loading @@ -634,17 +667,19 @@ public abstract class Connection implements Conferenceable { */ public void receiveSessionModifyResponse(int status, VideoProfile requestedProfile, VideoProfile responseProfile) { if (mVideoCallback != null) { if (mVideoCallbacks != null) { try { mVideoCallback.receiveSessionModifyResponse( status, requestedProfile, responseProfile); for (IVideoCallback callback : mVideoCallbacks.values()) { callback.receiveSessionModifyResponse(status, requestedProfile, responseProfile); } } catch (RemoteException ignored) { } } } /** * Invokes callback method defined in In-Call UI. * Invokes callback method defined in listening {@link InCallService} implementations. * * Valid values are: {@link VideoProvider#SESSION_EVENT_RX_PAUSE}, * {@link VideoProvider#SESSION_EVENT_RX_RESUME}, Loading @@ -654,66 +689,76 @@ public abstract class Connection implements Conferenceable { * @param event The event. */ public void handleCallSessionEvent(int event) { if (mVideoCallback != null) { if (mVideoCallbacks != null) { try { mVideoCallback.handleCallSessionEvent(event); for (IVideoCallback callback : mVideoCallbacks.values()) { callback.handleCallSessionEvent(event); } } catch (RemoteException ignored) { } } } /** * Invokes callback method defined in In-Call UI. * Invokes callback method defined in listening {@link InCallService} implementations. * * @param width The updated peer video width. * @param height The updated peer video height. */ public void changePeerDimensions(int width, int height) { if (mVideoCallback != null) { if (mVideoCallbacks != null) { try { mVideoCallback.changePeerDimensions(width, height); for (IVideoCallback callback : mVideoCallbacks.values()) { callback.changePeerDimensions(width, height); } } catch (RemoteException ignored) { } } } /** * Invokes callback method defined in In-Call UI. * Invokes callback method defined in listening {@link InCallService} implementations. * * @param dataUsage The updated data usage. */ public void changeCallDataUsage(long dataUsage) { if (mVideoCallback != null) { if (mVideoCallbacks != null) { try { mVideoCallback.changeCallDataUsage(dataUsage); for (IVideoCallback callback : mVideoCallbacks.values()) { callback.changeCallDataUsage(dataUsage); } } catch (RemoteException ignored) { } } } /** * Invokes callback method defined in In-Call UI. * Invokes callback method defined in listening {@link InCallService} implementations. * * @param cameraCapabilities The changed camera capabilities. */ public void changeCameraCapabilities(CameraCapabilities cameraCapabilities) { if (mVideoCallback != null) { if (mVideoCallbacks != null) { try { mVideoCallback.changeCameraCapabilities(cameraCapabilities); for (IVideoCallback callback : mVideoCallbacks.values()) { callback.changeCameraCapabilities(cameraCapabilities); } } catch (RemoteException ignored) { } } } /** * Invokes callback method defined in In-Call UI. * Invokes callback method defined in listening {@link InCallService} implementations. * * @param videoQuality The updated video quality. */ public void changeVideoQuality(int videoQuality) { if (mVideoCallback != null) { if (mVideoCallbacks != null) { try { mVideoCallback.changeVideoQuality(videoQuality); for (IVideoCallback callback : mVideoCallbacks.values()) { callback.changeVideoQuality(videoQuality); } } catch (RemoteException ignored) { } } Loading
telecomm/java/android/telecom/InCallService.java +5 −0 Original line number Diff line number Diff line Loading @@ -369,6 +369,11 @@ public abstract class InCallService extends Service { */ public abstract void registerCallback(VideoCall.Callback callback); /** * Clears the video call listener set via {@link #setVideoCallListener(Listener)}. */ public abstract void removeVideoCallListener(); /** * Sets the camera to be used for video recording in a video call. * Loading
telecomm/java/android/telecom/ParcelableCall.java +18 −0 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ public final class ParcelableCall implements Parcelable { private final int mCallerDisplayNamePresentation; private final GatewayInfo mGatewayInfo; private final PhoneAccountHandle mAccountHandle; private final boolean mIsVideoCallProviderChanged; private final IVideoProvider mVideoCallProvider; private InCallService.VideoCall mVideoCall; private final String mParentCallId; Loading @@ -69,6 +70,7 @@ public final class ParcelableCall implements Parcelable { int callerDisplayNamePresentation, GatewayInfo gatewayInfo, PhoneAccountHandle accountHandle, boolean isVideoCallProviderChanged, IVideoProvider videoCallProvider, String parentCallId, List<String> childCallIds, Loading @@ -89,6 +91,7 @@ public final class ParcelableCall implements Parcelable { mCallerDisplayNamePresentation = callerDisplayNamePresentation; mGatewayInfo = gatewayInfo; mAccountHandle = accountHandle; mIsVideoCallProviderChanged = isVideoCallProviderChanged; mVideoCallProvider = videoCallProvider; mParentCallId = parentCallId; mChildCallIds = childCallIds; Loading Loading @@ -232,6 +235,18 @@ public final class ParcelableCall implements Parcelable { return mExtras; } /** * Indicates to the receiver of the {@link ParcelableCall} whether a change has occurred in the * {@link android.telecom.InCallService.VideoCall} associated with this call. Since * {@link #getVideoCall()} creates a new {@link VideoCallImpl}, it is useful to know whether * the provider has changed (which can influence whether it is accessed). * * @return {@code true} if the video call changed, {@code false} otherwise. */ public boolean isVideoCallProviderChanged() { return mIsVideoCallProviderChanged; } /** Responsible for creating ParcelableCall objects for deserialized Parcels. */ public static final Parcelable.Creator<ParcelableCall> CREATOR = new Parcelable.Creator<ParcelableCall> () { Loading @@ -252,6 +267,7 @@ public final class ParcelableCall implements Parcelable { int callerDisplayNamePresentation = source.readInt(); GatewayInfo gatewayInfo = source.readParcelable(classLoader); PhoneAccountHandle accountHandle = source.readParcelable(classLoader); boolean isVideoCallProviderChanged = source.readByte() == 1; IVideoProvider videoCallProvider = IVideoProvider.Stub.asInterface(source.readStrongBinder()); String parentCallId = source.readString(); Loading @@ -276,6 +292,7 @@ public final class ParcelableCall implements Parcelable { callerDisplayNamePresentation, gatewayInfo, accountHandle, isVideoCallProviderChanged, videoCallProvider, parentCallId, childCallIds, Loading Loading @@ -313,6 +330,7 @@ public final class ParcelableCall implements Parcelable { destination.writeInt(mCallerDisplayNamePresentation); destination.writeParcelable(mGatewayInfo, 0); destination.writeParcelable(mAccountHandle, 0); destination.writeByte((byte) (mIsVideoCallProviderChanged ? 1 : 0)); destination.writeStrongBinder( mVideoCallProvider != null ? mVideoCallProvider.asBinder() : null); destination.writeString(mParentCallId); Loading
telecomm/java/android/telecom/Phone.java +9 −0 Original line number Diff line number Diff line Loading @@ -122,6 +122,11 @@ public final class Phone { final void internalRemoveCall(Call call) { mCallByTelecomCallId.remove(call.internalGetCallId()); mCalls.remove(call); InCallService.VideoCall videoCall = call.getVideoCall(); if (videoCall != null) { videoCall.removeVideoCallListener(); } fireCallRemoved(call); } Loading Loading @@ -167,6 +172,10 @@ public final class Phone { */ final void destroy() { for (Call call : mCalls) { InCallService.VideoCall videoCall = call.getVideoCall(); if (videoCall != null) { videoCall.removeVideoCallListener(); } if (call.getState() != Call.STATE_DISCONNECTED) { call.internalSetDisconnected(); } Loading