Loading src/com/android/server/telecom/Call.java +68 −6 Original line number Diff line number Diff line Loading @@ -74,6 +74,11 @@ public class Call implements CreateConnectionResponse { public static final int CALL_DIRECTION_INCOMING = 2; public static final int CALL_DIRECTION_UNKNOWN = 3; /** Identifies extras changes which originated from a connection service. */ public static final int SOURCE_CONNECTION_SERVICE = 1; /** Identifies extras changes which originated from an incall service. */ public static final int SOURCE_INCALL_SERVICE = 2; /** * Listener for events on the call. */ Loading @@ -95,7 +100,8 @@ public class Call implements CreateConnectionResponse { void onCallerInfoChanged(Call call); void onIsVoipAudioModeChanged(Call call); void onStatusHintsChanged(Call call); void onExtrasChanged(Call call); void onExtrasChanged(Call c, int source, Bundle extras); void onExtrasRemoved(Call c, int source, List<String> keys); void onHandleChanged(Call call); void onCallerDisplayNameChanged(Call call); void onVideoStateChanged(Call call); Loading Loading @@ -144,7 +150,9 @@ public class Call implements CreateConnectionResponse { @Override public void onStatusHintsChanged(Call call) {} @Override public void onExtrasChanged(Call call) {} public void onExtrasChanged(Call c, int source, Bundle extras) {} @Override public void onExtrasRemoved(Call c, int source, List<String> keys) {} @Override public void onHandleChanged(Call call) {} @Override Loading Loading @@ -1069,7 +1077,7 @@ public class Call implements CreateConnectionResponse { setRingbackRequested(connection.isRingbackRequested()); setIsVoipAudioMode(connection.getIsVoipAudioMode()); setStatusHints(connection.getStatusHints()); setExtras(connection.getExtras()); putExtras(SOURCE_CONNECTION_SERVICE, connection.getExtras()); mConferenceableCalls.clear(); for (String id : connection.getConferenceableConnectionIds()) { Loading Loading @@ -1327,10 +1335,64 @@ public class Call implements CreateConnectionResponse { return mExtras; } void setExtras(Bundle extras) { mExtras = extras; /** * Adds extras to the extras bundle associated with this {@link Call}. * * Note: this method needs to know the source of the extras change (see * {@link #SOURCE_CONNECTION_SERVICE}, {@link #SOURCE_INCALL_SERVICE}). Extras changes which * originate from a connection service will only be notified to incall services. Likewise, * changes originating from the incall services will only notify the connection service of the * change. * * @param source The source of the extras addition. * @param extras The extras. */ void putExtras(int source, Bundle extras) { if (extras == null) { return; } if (mExtras == null) { mExtras = new Bundle(); } mExtras.putAll(extras); for (Listener l : mListeners) { l.onExtrasChanged(this); l.onExtrasChanged(this, source, extras); } // If the change originated from an InCallService, notify the connection service. if (source == SOURCE_INCALL_SERVICE) { mConnectionService.onExtrasChanged(this, mExtras); } } /** * Removes extras from the extras bundle associated with this {@link Call}. * * Note: this method needs to know the source of the extras change (see * {@link #SOURCE_CONNECTION_SERVICE}, {@link #SOURCE_INCALL_SERVICE}). Extras changes which * originate from a connection service will only be notified to incall services. Likewise, * changes originating from the incall services will only notify the connection service of the * change. * * @param source The source of the extras removal. * @param keys The extra keys to remove. */ void removeExtras(int source, List<String> keys) { if (mExtras == null) { return; } for (String key : keys) { mExtras.remove(key); } for (Listener l : mListeners) { l.onExtrasRemoved(this, source, keys); } // If the change originated from an InCallService, notify the connection service. if (source == SOURCE_INCALL_SERVICE) { mConnectionService.onExtrasChanged(this, mExtras); } } Loading src/com/android/server/telecom/CallsManager.java +9 −2 Original line number Diff line number Diff line Loading @@ -1144,7 +1144,14 @@ public class CallsManager extends Call.ListenerBase } @Override public void onExtrasChanged(Call call) { public void onExtrasChanged(Call c, int source, Bundle extras) { if (source != Call.SOURCE_CONNECTION_SERVICE) { return; } handleCallTechnologyChange(c); } private void handleCallTechnologyChange(Call call) { if (call.getExtras() != null && call.getExtras().containsKey(TelecomManager.EXTRA_CALL_TECHNOLOGY_TYPE)) { Loading Loading @@ -1461,7 +1468,7 @@ public class CallsManager extends Call.ListenerBase call.setVideoState(parcelableConference.getVideoState()); call.setVideoProvider(parcelableConference.getVideoProvider()); call.setStatusHints(parcelableConference.getStatusHints()); call.setExtras(parcelableConference.getExtras()); call.putExtras(Call.SOURCE_CONNECTION_SERVICE, parcelableConference.getExtras()); // TODO: Move this to be a part of addCall() call.addListener(this); Loading src/com/android/server/telecom/ConnectionServiceWrapper.java +32 −4 Original line number Diff line number Diff line Loading @@ -487,16 +487,33 @@ public class ConnectionServiceWrapper extends ServiceBinder { } @Override public void setExtras(String callId, Bundle extras) { Log.startSession("CSW.sE"); public void putExtras(String callId, Bundle extras) { Log.startSession("CSW.pE"); long token = Binder.clearCallingIdentity(); try { synchronized (mLock) { Bundle.setDefusable(extras, true); logIncoming("setExtras %s %s", callId, extras); Call call = mCallIdMapper.getCall(callId); if (call != null) { call.setExtras(extras); call.putExtras(Call.SOURCE_CONNECTION_SERVICE, extras); } } } finally { Binder.restoreCallingIdentity(token); Log.endSession(); } } @Override public void removeExtras(String callId, List<String> keys) { Log.startSession("CSW.rE"); long token = Binder.clearCallingIdentity(); try { synchronized (mLock) { logIncoming("removeExtra %s %s", callId, keys); Call call = mCallIdMapper.getCall(callId); if (call != null) { call.removeExtras(Call.SOURCE_CONNECTION_SERVICE, keys); } } } finally { Loading Loading @@ -962,6 +979,17 @@ public class ConnectionServiceWrapper extends ServiceBinder { } } void onExtrasChanged(Call call, Bundle extras) { final String callId = mCallIdMapper.getCallId(call); if (callId != null && isServiceValid("onExtrasChanged")) { try { logOutgoing("onExtrasChanged %s %s", callId, extras); mServiceInterface.onExtrasChanged(callId, extras); } catch (RemoteException ignored) { } } } /** {@inheritDoc} */ @Override protected void setServiceInterface(IBinder binder) { Loading src/com/android/server/telecom/InCallAdapter.java +46 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,8 @@ import android.telecom.PhoneAccountHandle; import com.android.internal.telecom.IInCallAdapter; import java.util.List; /** * Receives call commands and updates from in-call app and passes them through to CallsManager. * {@link InCallController} creates an instance of this class and passes it to the in-call app after Loading Loading @@ -414,6 +416,50 @@ class InCallAdapter extends IInCallAdapter.Stub { } } @Override public void putExtras(String callId, Bundle extras) { try { Log.startSession("ICA.pE", mOwnerComponentName); long token = Binder.clearCallingIdentity(); try { synchronized (mLock) { Call call = mCallIdMapper.getCall(callId); if (call != null) { call.putExtras(Call.SOURCE_INCALL_SERVICE, extras); } else { Log.w(this, "putExtras, unknown call id: %s", callId); } } } finally { Binder.restoreCallingIdentity(token); } } finally { Log.endSession(); } } @Override public void removeExtras(String callId, List<String> keys) { try { Log.startSession("ICA.rE", mOwnerComponentName); long token = Binder.clearCallingIdentity(); try { synchronized (mLock) { Call call = mCallIdMapper.getCall(callId); if (call != null) { call.removeExtras(Call.SOURCE_INCALL_SERVICE, keys); } else { Log.w(this, "removeExtra, unknown call id: %s", callId); } } } finally { Binder.restoreCallingIdentity(token); } } finally { Log.endSession(); } } @Override public void turnOnProximitySensor() { try { Loading src/com/android/server/telecom/InCallController.java +38 −1 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ import android.os.RemoteException; import android.os.Trace; import android.os.UserHandle; import android.telecom.CallAudioState; import android.telecom.ConnectionService; import android.telecom.DefaultDialerManager; import android.telecom.InCallService; import android.telecom.ParcelableCall; Loading Loading @@ -104,8 +105,44 @@ public final class InCallController extends CallsManagerListenerBase { updateCall(call); } /** * Listens for changes to extras reported by a Telecom {@link Call}. * * Extras changes can originate from a {@link ConnectionService} or an {@link InCallService} * so we will only trigger an update of the call information if the source of the extras * change was a {@link ConnectionService}. * * @param call The call. * @param source The source of the extras change ({@link Call#SOURCE_CONNECTION_SERVICE} or * {@link Call#SOURCE_INCALL_SERVICE}). * @param extras The extras. */ @Override public void onExtrasChanged(Call call) { public void onExtrasChanged(Call call, int source, Bundle extras) { // Do not inform InCallServices of changes which originated there. if (source == Call.SOURCE_INCALL_SERVICE) { return; } updateCall(call); } /** * Listens for changes to extras reported by a Telecom {@link Call}. * * Extras changes can originate from a {@link ConnectionService} or an {@link InCallService} * so we will only trigger an update of the call information if the source of the extras * change was a {@link ConnectionService}. * @param call The call. * @param source The source of the extras change ({@link Call#SOURCE_CONNECTION_SERVICE} or * {@link Call#SOURCE_INCALL_SERVICE}). * @param keys The extra key removed */ @Override public void onExtrasRemoved(Call call, int source, List<String> keys) { // Do not inform InCallServices of changes which originated there. if (source == Call.SOURCE_INCALL_SERVICE) { return; } updateCall(call); } Loading Loading
src/com/android/server/telecom/Call.java +68 −6 Original line number Diff line number Diff line Loading @@ -74,6 +74,11 @@ public class Call implements CreateConnectionResponse { public static final int CALL_DIRECTION_INCOMING = 2; public static final int CALL_DIRECTION_UNKNOWN = 3; /** Identifies extras changes which originated from a connection service. */ public static final int SOURCE_CONNECTION_SERVICE = 1; /** Identifies extras changes which originated from an incall service. */ public static final int SOURCE_INCALL_SERVICE = 2; /** * Listener for events on the call. */ Loading @@ -95,7 +100,8 @@ public class Call implements CreateConnectionResponse { void onCallerInfoChanged(Call call); void onIsVoipAudioModeChanged(Call call); void onStatusHintsChanged(Call call); void onExtrasChanged(Call call); void onExtrasChanged(Call c, int source, Bundle extras); void onExtrasRemoved(Call c, int source, List<String> keys); void onHandleChanged(Call call); void onCallerDisplayNameChanged(Call call); void onVideoStateChanged(Call call); Loading Loading @@ -144,7 +150,9 @@ public class Call implements CreateConnectionResponse { @Override public void onStatusHintsChanged(Call call) {} @Override public void onExtrasChanged(Call call) {} public void onExtrasChanged(Call c, int source, Bundle extras) {} @Override public void onExtrasRemoved(Call c, int source, List<String> keys) {} @Override public void onHandleChanged(Call call) {} @Override Loading Loading @@ -1069,7 +1077,7 @@ public class Call implements CreateConnectionResponse { setRingbackRequested(connection.isRingbackRequested()); setIsVoipAudioMode(connection.getIsVoipAudioMode()); setStatusHints(connection.getStatusHints()); setExtras(connection.getExtras()); putExtras(SOURCE_CONNECTION_SERVICE, connection.getExtras()); mConferenceableCalls.clear(); for (String id : connection.getConferenceableConnectionIds()) { Loading Loading @@ -1327,10 +1335,64 @@ public class Call implements CreateConnectionResponse { return mExtras; } void setExtras(Bundle extras) { mExtras = extras; /** * Adds extras to the extras bundle associated with this {@link Call}. * * Note: this method needs to know the source of the extras change (see * {@link #SOURCE_CONNECTION_SERVICE}, {@link #SOURCE_INCALL_SERVICE}). Extras changes which * originate from a connection service will only be notified to incall services. Likewise, * changes originating from the incall services will only notify the connection service of the * change. * * @param source The source of the extras addition. * @param extras The extras. */ void putExtras(int source, Bundle extras) { if (extras == null) { return; } if (mExtras == null) { mExtras = new Bundle(); } mExtras.putAll(extras); for (Listener l : mListeners) { l.onExtrasChanged(this); l.onExtrasChanged(this, source, extras); } // If the change originated from an InCallService, notify the connection service. if (source == SOURCE_INCALL_SERVICE) { mConnectionService.onExtrasChanged(this, mExtras); } } /** * Removes extras from the extras bundle associated with this {@link Call}. * * Note: this method needs to know the source of the extras change (see * {@link #SOURCE_CONNECTION_SERVICE}, {@link #SOURCE_INCALL_SERVICE}). Extras changes which * originate from a connection service will only be notified to incall services. Likewise, * changes originating from the incall services will only notify the connection service of the * change. * * @param source The source of the extras removal. * @param keys The extra keys to remove. */ void removeExtras(int source, List<String> keys) { if (mExtras == null) { return; } for (String key : keys) { mExtras.remove(key); } for (Listener l : mListeners) { l.onExtrasRemoved(this, source, keys); } // If the change originated from an InCallService, notify the connection service. if (source == SOURCE_INCALL_SERVICE) { mConnectionService.onExtrasChanged(this, mExtras); } } Loading
src/com/android/server/telecom/CallsManager.java +9 −2 Original line number Diff line number Diff line Loading @@ -1144,7 +1144,14 @@ public class CallsManager extends Call.ListenerBase } @Override public void onExtrasChanged(Call call) { public void onExtrasChanged(Call c, int source, Bundle extras) { if (source != Call.SOURCE_CONNECTION_SERVICE) { return; } handleCallTechnologyChange(c); } private void handleCallTechnologyChange(Call call) { if (call.getExtras() != null && call.getExtras().containsKey(TelecomManager.EXTRA_CALL_TECHNOLOGY_TYPE)) { Loading Loading @@ -1461,7 +1468,7 @@ public class CallsManager extends Call.ListenerBase call.setVideoState(parcelableConference.getVideoState()); call.setVideoProvider(parcelableConference.getVideoProvider()); call.setStatusHints(parcelableConference.getStatusHints()); call.setExtras(parcelableConference.getExtras()); call.putExtras(Call.SOURCE_CONNECTION_SERVICE, parcelableConference.getExtras()); // TODO: Move this to be a part of addCall() call.addListener(this); Loading
src/com/android/server/telecom/ConnectionServiceWrapper.java +32 −4 Original line number Diff line number Diff line Loading @@ -487,16 +487,33 @@ public class ConnectionServiceWrapper extends ServiceBinder { } @Override public void setExtras(String callId, Bundle extras) { Log.startSession("CSW.sE"); public void putExtras(String callId, Bundle extras) { Log.startSession("CSW.pE"); long token = Binder.clearCallingIdentity(); try { synchronized (mLock) { Bundle.setDefusable(extras, true); logIncoming("setExtras %s %s", callId, extras); Call call = mCallIdMapper.getCall(callId); if (call != null) { call.setExtras(extras); call.putExtras(Call.SOURCE_CONNECTION_SERVICE, extras); } } } finally { Binder.restoreCallingIdentity(token); Log.endSession(); } } @Override public void removeExtras(String callId, List<String> keys) { Log.startSession("CSW.rE"); long token = Binder.clearCallingIdentity(); try { synchronized (mLock) { logIncoming("removeExtra %s %s", callId, keys); Call call = mCallIdMapper.getCall(callId); if (call != null) { call.removeExtras(Call.SOURCE_CONNECTION_SERVICE, keys); } } } finally { Loading Loading @@ -962,6 +979,17 @@ public class ConnectionServiceWrapper extends ServiceBinder { } } void onExtrasChanged(Call call, Bundle extras) { final String callId = mCallIdMapper.getCallId(call); if (callId != null && isServiceValid("onExtrasChanged")) { try { logOutgoing("onExtrasChanged %s %s", callId, extras); mServiceInterface.onExtrasChanged(callId, extras); } catch (RemoteException ignored) { } } } /** {@inheritDoc} */ @Override protected void setServiceInterface(IBinder binder) { Loading
src/com/android/server/telecom/InCallAdapter.java +46 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,8 @@ import android.telecom.PhoneAccountHandle; import com.android.internal.telecom.IInCallAdapter; import java.util.List; /** * Receives call commands and updates from in-call app and passes them through to CallsManager. * {@link InCallController} creates an instance of this class and passes it to the in-call app after Loading Loading @@ -414,6 +416,50 @@ class InCallAdapter extends IInCallAdapter.Stub { } } @Override public void putExtras(String callId, Bundle extras) { try { Log.startSession("ICA.pE", mOwnerComponentName); long token = Binder.clearCallingIdentity(); try { synchronized (mLock) { Call call = mCallIdMapper.getCall(callId); if (call != null) { call.putExtras(Call.SOURCE_INCALL_SERVICE, extras); } else { Log.w(this, "putExtras, unknown call id: %s", callId); } } } finally { Binder.restoreCallingIdentity(token); } } finally { Log.endSession(); } } @Override public void removeExtras(String callId, List<String> keys) { try { Log.startSession("ICA.rE", mOwnerComponentName); long token = Binder.clearCallingIdentity(); try { synchronized (mLock) { Call call = mCallIdMapper.getCall(callId); if (call != null) { call.removeExtras(Call.SOURCE_INCALL_SERVICE, keys); } else { Log.w(this, "removeExtra, unknown call id: %s", callId); } } } finally { Binder.restoreCallingIdentity(token); } } finally { Log.endSession(); } } @Override public void turnOnProximitySensor() { try { Loading
src/com/android/server/telecom/InCallController.java +38 −1 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ import android.os.RemoteException; import android.os.Trace; import android.os.UserHandle; import android.telecom.CallAudioState; import android.telecom.ConnectionService; import android.telecom.DefaultDialerManager; import android.telecom.InCallService; import android.telecom.ParcelableCall; Loading Loading @@ -104,8 +105,44 @@ public final class InCallController extends CallsManagerListenerBase { updateCall(call); } /** * Listens for changes to extras reported by a Telecom {@link Call}. * * Extras changes can originate from a {@link ConnectionService} or an {@link InCallService} * so we will only trigger an update of the call information if the source of the extras * change was a {@link ConnectionService}. * * @param call The call. * @param source The source of the extras change ({@link Call#SOURCE_CONNECTION_SERVICE} or * {@link Call#SOURCE_INCALL_SERVICE}). * @param extras The extras. */ @Override public void onExtrasChanged(Call call) { public void onExtrasChanged(Call call, int source, Bundle extras) { // Do not inform InCallServices of changes which originated there. if (source == Call.SOURCE_INCALL_SERVICE) { return; } updateCall(call); } /** * Listens for changes to extras reported by a Telecom {@link Call}. * * Extras changes can originate from a {@link ConnectionService} or an {@link InCallService} * so we will only trigger an update of the call information if the source of the extras * change was a {@link ConnectionService}. * @param call The call. * @param source The source of the extras change ({@link Call#SOURCE_CONNECTION_SERVICE} or * {@link Call#SOURCE_INCALL_SERVICE}). * @param keys The extra key removed */ @Override public void onExtrasRemoved(Call call, int source, List<String> keys) { // Do not inform InCallServices of changes which originated there. if (source == Call.SOURCE_INCALL_SERVICE) { return; } updateCall(call); } Loading