Loading src/com/android/server/telecom/Call.java +29 −2 Original line number Diff line number Diff line Loading @@ -23,11 +23,13 @@ import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.RemoteException; import android.os.Trace; import android.provider.ContactsContract.Contacts; import android.telecom.DisconnectCause; import android.telecom.Connection; import android.telecom.GatewayInfo; import android.telecom.InCallService.VideoCall; import android.telecom.ParcelableConnection; import android.telecom.PhoneAccount; import android.telecom.PhoneAccountHandle; Loading Loading @@ -306,6 +308,7 @@ public class Call implements CreateConnectionResponse { private boolean mCannedSmsResponsesLoadingStarted = false; private IVideoProvider mVideoProvider; private VideoProviderProxy mVideoProviderProxy; private boolean mIsVoipAudioMode; private StatusHints mStatusHints; Loading Loading @@ -1506,17 +1509,41 @@ public class Call implements CreateConnectionResponse { * Sets a video call provider for the call. */ public void setVideoProvider(IVideoProvider videoProvider) { Log.v(this, "setVideoProvider"); if (videoProvider != null ) { try { mVideoProviderProxy = new VideoProviderProxy(mLock, videoProvider, this); } catch (RemoteException ignored) { // Ignore RemoteException. } } else { mVideoProviderProxy = null; } mVideoProvider = videoProvider; for (Listener l : mListeners) { l.onVideoCallProviderChanged(Call.this); } } /** * @return Return the {@link Connection.VideoProvider} binder. * @return The {@link Connection.VideoProvider} binder. */ public IVideoProvider getVideoProvider() { return mVideoProvider; if (mVideoProviderProxy == null) { return null; } return mVideoProviderProxy.getInterface(); } /** * @return The {@link VideoProviderProxy} for this call. */ public VideoProviderProxy getVideoProviderProxy() { return mVideoProviderProxy; } /** Loading src/com/android/server/telecom/CallsManager.java +41 −1 Original line number Diff line number Diff line Loading @@ -59,7 +59,7 @@ import java.util.concurrent.ConcurrentHashMap; * beyond the com.android.server.telecom package boundary. */ @VisibleForTesting public class CallsManager extends Call.ListenerBase { public class CallsManager extends Call.ListenerBase implements VideoProviderProxy.Listener { // TODO: Consider renaming this CallsManagerPlugin. interface CallsManagerListener { Loading @@ -79,6 +79,7 @@ public class CallsManager extends Call.ListenerBase { void onIsVoipAudioModeChanged(Call call); void onVideoStateChanged(Call call); void onCanAddCallChanged(boolean canAddCall); void onSessionModifyRequestReceived(Call call, VideoProfile videoProfile); } private static final String TAG = "CallsManager"; Loading Loading @@ -372,6 +373,45 @@ public class CallsManager extends Call.ListenerBase { return true; } /** * Handles changes to the {@link Connection.VideoProvider} for a call. Adds the * {@link CallsManager} as a listener for the {@link VideoProviderProxy} which is created * in {@link Call#setVideoProvider(IVideoProvider)}. This allows the {@link CallsManager} to * respond to callbacks from the {@link VideoProviderProxy}. * * @param call The call. */ @Override public void onVideoCallProviderChanged(Call call) { VideoProviderProxy videoProviderProxy = call.getVideoProviderProxy(); if (videoProviderProxy == null) { return; } videoProviderProxy.addListener(this); } /** * Handles session modification requests received via the {@link TelecomVideoCallCallback} for * a call. Notifies listeners of the {@link CallsManager.CallsManagerListener} of the session * modification request. * * @param call The call. * @param videoProfile The {@link VideoProfile}. */ @Override public void onSessionModifyRequestReceived(Call call, VideoProfile videoProfile) { int videoState = videoProfile != null ? videoProfile.getVideoState() : VideoProfile.STATE_AUDIO_ONLY; Log.v(TAG, "onSessionModifyRequestReceived : videoProfile = " + VideoProfile .videoStateToString(videoState)); for (CallsManagerListener listener : mListeners) { listener.onSessionModifyRequestReceived(call, videoProfile); } } Collection<Call> getCalls() { return Collections.unmodifiableCollection(mCalls); } Loading src/com/android/server/telecom/CallsManagerListenerBase.java +6 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.server.telecom; import android.telecom.AudioState; import android.telecom.CallAudioState; import android.telecom.VideoProfile; /** * Provides a default implementation for listeners of CallsManager. Loading Loading @@ -78,4 +79,9 @@ public class CallsManagerListenerBase implements CallsManager.CallsManagerListen @Override public void onCanAddCallChanged(boolean canAddCall) { } @Override public void onSessionModifyRequestReceived(Call call, VideoProfile videoProfile) { } } src/com/android/server/telecom/InCallToneMonitor.java +34 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ package com.android.server.telecom; import android.media.ToneGenerator; import android.telecom.Connection; import android.telecom.VideoProfile; import java.util.Collection; Loading Loading @@ -77,4 +79,36 @@ public final class InCallToneMonitor extends CallsManagerListenerBase { } } } /** * Handles requests received via the {@link VideoProviderProxy} requesting a change in the video * state of the call by the peer. If the request involves the peer turning their camera on, * the call waiting tone is played to inform the user of the incoming request. * * @param call The call. * @param videoProfile The requested video profile. */ @Override public void onSessionModifyRequestReceived(Call call, VideoProfile videoProfile) { if (videoProfile == null) { return; } if (mCallsManager.getForegroundCall() != call) { // We only play tones for foreground calls. return; } int previousVideoState = call.getVideoState(); int newVideoState = videoProfile.getVideoState(); Log.v(this, "onSessionModifyRequestReceived : videoProfile = " + VideoProfile .videoStateToString(newVideoState)); boolean isUpgradeRequest = !VideoProfile.isReceptionEnabled(previousVideoState) && VideoProfile.isReceptionEnabled(newVideoState); if (isUpgradeRequest) { mPlayerFactory.createPlayer(InCallTonePlayer.TONE_VIDEO_UPGRADE).startTone(); } } } src/com/android/server/telecom/InCallTonePlayer.java +7 −0 Original line number Diff line number Diff line Loading @@ -60,6 +60,7 @@ public final class InCallTonePlayer extends Thread { public static final int TONE_RING_BACK = 11; public static final int TONE_UNOBTAINABLE_NUMBER = 12; public static final int TONE_VOICE_PRIVACY = 13; public static final int TONE_VIDEO_UPGRADE = 14; private static final int RELATIVE_VOLUME_EMERGENCY = 100; private static final int RELATIVE_VOLUME_HIPRI = 80; Loading Loading @@ -183,6 +184,12 @@ public final class InCallTonePlayer extends Thread { case TONE_VOICE_PRIVACY: // TODO: fill in. throw new IllegalStateException("Voice privacy tone NYI."); case TONE_VIDEO_UPGRADE: // Similar to the call waiting tone, but does not repeat. toneType = ToneGenerator.TONE_SUP_CALL_WAITING; toneVolume = RELATIVE_VOLUME_HIPRI; toneLengthMillis = 4000; break; default: throw new IllegalStateException("Bad toneId: " + mToneId); } Loading Loading
src/com/android/server/telecom/Call.java +29 −2 Original line number Diff line number Diff line Loading @@ -23,11 +23,13 @@ import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.RemoteException; import android.os.Trace; import android.provider.ContactsContract.Contacts; import android.telecom.DisconnectCause; import android.telecom.Connection; import android.telecom.GatewayInfo; import android.telecom.InCallService.VideoCall; import android.telecom.ParcelableConnection; import android.telecom.PhoneAccount; import android.telecom.PhoneAccountHandle; Loading Loading @@ -306,6 +308,7 @@ public class Call implements CreateConnectionResponse { private boolean mCannedSmsResponsesLoadingStarted = false; private IVideoProvider mVideoProvider; private VideoProviderProxy mVideoProviderProxy; private boolean mIsVoipAudioMode; private StatusHints mStatusHints; Loading Loading @@ -1506,17 +1509,41 @@ public class Call implements CreateConnectionResponse { * Sets a video call provider for the call. */ public void setVideoProvider(IVideoProvider videoProvider) { Log.v(this, "setVideoProvider"); if (videoProvider != null ) { try { mVideoProviderProxy = new VideoProviderProxy(mLock, videoProvider, this); } catch (RemoteException ignored) { // Ignore RemoteException. } } else { mVideoProviderProxy = null; } mVideoProvider = videoProvider; for (Listener l : mListeners) { l.onVideoCallProviderChanged(Call.this); } } /** * @return Return the {@link Connection.VideoProvider} binder. * @return The {@link Connection.VideoProvider} binder. */ public IVideoProvider getVideoProvider() { return mVideoProvider; if (mVideoProviderProxy == null) { return null; } return mVideoProviderProxy.getInterface(); } /** * @return The {@link VideoProviderProxy} for this call. */ public VideoProviderProxy getVideoProviderProxy() { return mVideoProviderProxy; } /** Loading
src/com/android/server/telecom/CallsManager.java +41 −1 Original line number Diff line number Diff line Loading @@ -59,7 +59,7 @@ import java.util.concurrent.ConcurrentHashMap; * beyond the com.android.server.telecom package boundary. */ @VisibleForTesting public class CallsManager extends Call.ListenerBase { public class CallsManager extends Call.ListenerBase implements VideoProviderProxy.Listener { // TODO: Consider renaming this CallsManagerPlugin. interface CallsManagerListener { Loading @@ -79,6 +79,7 @@ public class CallsManager extends Call.ListenerBase { void onIsVoipAudioModeChanged(Call call); void onVideoStateChanged(Call call); void onCanAddCallChanged(boolean canAddCall); void onSessionModifyRequestReceived(Call call, VideoProfile videoProfile); } private static final String TAG = "CallsManager"; Loading Loading @@ -372,6 +373,45 @@ public class CallsManager extends Call.ListenerBase { return true; } /** * Handles changes to the {@link Connection.VideoProvider} for a call. Adds the * {@link CallsManager} as a listener for the {@link VideoProviderProxy} which is created * in {@link Call#setVideoProvider(IVideoProvider)}. This allows the {@link CallsManager} to * respond to callbacks from the {@link VideoProviderProxy}. * * @param call The call. */ @Override public void onVideoCallProviderChanged(Call call) { VideoProviderProxy videoProviderProxy = call.getVideoProviderProxy(); if (videoProviderProxy == null) { return; } videoProviderProxy.addListener(this); } /** * Handles session modification requests received via the {@link TelecomVideoCallCallback} for * a call. Notifies listeners of the {@link CallsManager.CallsManagerListener} of the session * modification request. * * @param call The call. * @param videoProfile The {@link VideoProfile}. */ @Override public void onSessionModifyRequestReceived(Call call, VideoProfile videoProfile) { int videoState = videoProfile != null ? videoProfile.getVideoState() : VideoProfile.STATE_AUDIO_ONLY; Log.v(TAG, "onSessionModifyRequestReceived : videoProfile = " + VideoProfile .videoStateToString(videoState)); for (CallsManagerListener listener : mListeners) { listener.onSessionModifyRequestReceived(call, videoProfile); } } Collection<Call> getCalls() { return Collections.unmodifiableCollection(mCalls); } Loading
src/com/android/server/telecom/CallsManagerListenerBase.java +6 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.server.telecom; import android.telecom.AudioState; import android.telecom.CallAudioState; import android.telecom.VideoProfile; /** * Provides a default implementation for listeners of CallsManager. Loading Loading @@ -78,4 +79,9 @@ public class CallsManagerListenerBase implements CallsManager.CallsManagerListen @Override public void onCanAddCallChanged(boolean canAddCall) { } @Override public void onSessionModifyRequestReceived(Call call, VideoProfile videoProfile) { } }
src/com/android/server/telecom/InCallToneMonitor.java +34 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ package com.android.server.telecom; import android.media.ToneGenerator; import android.telecom.Connection; import android.telecom.VideoProfile; import java.util.Collection; Loading Loading @@ -77,4 +79,36 @@ public final class InCallToneMonitor extends CallsManagerListenerBase { } } } /** * Handles requests received via the {@link VideoProviderProxy} requesting a change in the video * state of the call by the peer. If the request involves the peer turning their camera on, * the call waiting tone is played to inform the user of the incoming request. * * @param call The call. * @param videoProfile The requested video profile. */ @Override public void onSessionModifyRequestReceived(Call call, VideoProfile videoProfile) { if (videoProfile == null) { return; } if (mCallsManager.getForegroundCall() != call) { // We only play tones for foreground calls. return; } int previousVideoState = call.getVideoState(); int newVideoState = videoProfile.getVideoState(); Log.v(this, "onSessionModifyRequestReceived : videoProfile = " + VideoProfile .videoStateToString(newVideoState)); boolean isUpgradeRequest = !VideoProfile.isReceptionEnabled(previousVideoState) && VideoProfile.isReceptionEnabled(newVideoState); if (isUpgradeRequest) { mPlayerFactory.createPlayer(InCallTonePlayer.TONE_VIDEO_UPGRADE).startTone(); } } }
src/com/android/server/telecom/InCallTonePlayer.java +7 −0 Original line number Diff line number Diff line Loading @@ -60,6 +60,7 @@ public final class InCallTonePlayer extends Thread { public static final int TONE_RING_BACK = 11; public static final int TONE_UNOBTAINABLE_NUMBER = 12; public static final int TONE_VOICE_PRIVACY = 13; public static final int TONE_VIDEO_UPGRADE = 14; private static final int RELATIVE_VOLUME_EMERGENCY = 100; private static final int RELATIVE_VOLUME_HIPRI = 80; Loading Loading @@ -183,6 +184,12 @@ public final class InCallTonePlayer extends Thread { case TONE_VOICE_PRIVACY: // TODO: fill in. throw new IllegalStateException("Voice privacy tone NYI."); case TONE_VIDEO_UPGRADE: // Similar to the call waiting tone, but does not repeat. toneType = ToneGenerator.TONE_SUP_CALL_WAITING; toneVolume = RELATIVE_VOLUME_HIPRI; toneLengthMillis = 4000; break; default: throw new IllegalStateException("Bad toneId: " + mToneId); } Loading