Loading voip/java/android/net/sip/ISipService.aidl +2 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.net.sip; import android.app.PendingIntent; import android.net.sip.ISipSession; import android.net.sip.ISipSessionListener; import android.net.sip.SipProfile; Loading @@ -26,7 +27,7 @@ import android.net.sip.SipProfile; interface ISipService { void open(in SipProfile localProfile); void open3(in SipProfile localProfile, String incomingCallBroadcastAction, in PendingIntent incomingCallPendingIntent, in ISipSessionListener listener); void close(in String localProfileUri); boolean isOpened(String localProfileUri); Loading voip/java/android/net/sip/SipManager.java +43 −19 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.net.sip; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; Loading @@ -34,7 +35,7 @@ import java.text.ParseException; * <li>open a {@link SipProfile} to get ready for making outbound calls or have * the background SIP service listen to incoming calls and broadcast them * with registered command string. See * {@link #open(SipProfile, String, SipRegistrationListener)}, * {@link #open(SipProfile, PendingIntent, SipRegistrationListener)}, * {@link #open(SipProfile)}, {@link #close}, {@link #isOpened} and * {@link #isRegistered}. It also facilitates handling of the incoming call * broadcast intent. See Loading @@ -50,6 +51,19 @@ import java.text.ParseException; * @hide */ public class SipManager { /** * The result code to be sent back with the incoming call * {@link PendingIntent}. * @see #open(SipProfile, PendingIntent, SipRegistrationListener) */ public static final int INCOMING_CALL_RESULT_CODE = 101; /** Part of the incoming call intent. */ public static final String EXTRA_CALL_ID = "android:sipCallID"; /** Part of the incoming call intent. */ public static final String EXTRA_OFFER_SD = "android:sipOfferSD"; /** * Action string for the incoming call intent for the Phone app. * Internal use only. Loading Loading @@ -78,12 +92,6 @@ public class SipManager { */ public static final String EXTRA_LOCAL_URI = "android:localSipUri"; /** Part of the incoming call intent. */ public static final String EXTRA_CALL_ID = "android:sipCallID"; /** Part of the incoming call intent. */ public static final String EXTRA_OFFER_SD = "android:sipOfferSD"; private static final String TAG = "SipManager"; private ISipService mSipService; Loading Loading @@ -142,7 +150,8 @@ public class SipManager { /** * Opens the profile for making calls. The caller may make subsequent calls * through {@link #makeAudioCall}. If one also wants to receive calls on the * profile, use {@link #open(SipProfile, String, SipRegistrationListener)} * profile, use * {@link #open(SipProfile, PendingIntent, SipRegistrationListener)} * instead. * * @param localProfile the SIP profile to make calls from Loading @@ -165,17 +174,29 @@ public class SipManager { * in order to receive calls from the provider. * * @param localProfile the SIP profile to receive incoming calls for * @param incomingCallBroadcastAction the action to be broadcast when an * incoming call is received * @param incomingCallPendingIntent When an incoming call is received, the * SIP service will call * {@link PendingIntent#send(Context, int, Intent)} to send back the * intent to the caller with {@link #INCOMING_CALL_RESULT_CODE} as the * result code and the intent to fill in the call ID and session * description information. It cannot be null. * @param listener to listen to registration events; can be null * @see #getCallId * @see #getOfferSessionDescription * @see #takeAudioCall * @throws NullPointerException if {@code incomingCallPendingIntent} is null * @throws SipException if the profile contains incorrect settings or * calling the SIP service results in an error */ public void open(SipProfile localProfile, String incomingCallBroadcastAction, PendingIntent incomingCallPendingIntent, SipRegistrationListener listener) throws SipException { if (incomingCallPendingIntent == null) { throw new NullPointerException( "incomingCallPendingIntent cannot be null"); } try { mSipService.open3(localProfile, incomingCallBroadcastAction, mSipService.open3(localProfile, incomingCallPendingIntent, createRelay(listener, localProfile.getUriString())); } catch (RemoteException e) { throw new SipException("open()", e); Loading @@ -184,7 +205,8 @@ public class SipManager { /** * Sets the listener to listen to registration events. No effect if the * profile has not been opened to receive calls (see {@link #open}). * profile has not been opened to receive calls (see * {@link #open(SipProfile, PendingIntent, SipRegistrationListener)}). * * @param localProfileUri the URI of the profile * @param listener to listen to registration events; can be null Loading Loading @@ -282,9 +304,9 @@ public class SipManager { } /** * Creates a {@link SipAudioCall} to make a call. To use this method, one * must call {@link #open(SipProfile)} first. The attempt will be timed out * if the call is not established within {@code timeout} seconds and * Creates a {@link SipAudioCall} to make an audio call. The attempt will be * timed out if the call is not established within {@code timeout} seconds * and * {@code SipAudioCall.Listener.onError(SipAudioCall, SipErrorCode.TIME_OUT, String)} * will be called. * Loading Loading @@ -416,9 +438,11 @@ public class SipManager { /** * Manually registers the profile to the corresponding SIP provider for * receiving calls. {@link #open(SipProfile, String, SipRegistrationListener)} * is still needed to be called at least once in order for the SIP service * to broadcast an intent when an incoming call is received. * receiving calls. * {@link #open(SipProfile, PendingIntent, SipRegistrationListener)} is * still needed to be called at least once in order for the SIP service to * notify the caller with the {@code PendingIntent} when an incoming call is * received. * * @param localProfile the SIP profile to register with * @param expiryTime registration expiration time (in seconds) Loading voip/java/com/android/server/sip/SipService.java +29 −44 Original line number Diff line number Diff line Loading @@ -134,14 +134,6 @@ public final class SipService extends ISipService.Stub { public void open(SipProfile localProfile) { localProfile.setCallingUid(Binder.getCallingUid()); if (localProfile.getAutoRegistration() && isCallerRadio()) { openToReceiveCalls(localProfile); } else { openToMakeCalls(localProfile); } } private void openToMakeCalls(SipProfile localProfile) { try { createGroup(localProfile); } catch (SipException e) { Loading @@ -150,28 +142,20 @@ public final class SipService extends ISipService.Stub { } } private void openToReceiveCalls(SipProfile localProfile) { open3(localProfile, SipManager.ACTION_SIP_INCOMING_CALL, null); } public synchronized void open3(SipProfile localProfile, String incomingCallBroadcastAction, ISipSessionListener listener) { PendingIntent incomingCallPendingIntent, ISipSessionListener listener) { localProfile.setCallingUid(Binder.getCallingUid()); if (TextUtils.isEmpty(incomingCallBroadcastAction)) { Log.w(TAG, "empty broadcast action for incoming call"); return; } if (incomingCallBroadcastAction.equals( SipManager.ACTION_SIP_INCOMING_CALL) && !isCallerRadio()) { Log.w(TAG, "failed to open the profile; " + "the action string is reserved"); if (incomingCallPendingIntent == null) { Log.w(TAG, "incomingCallPendingIntent cannot be null; " + "the profile is not opened"); return; } if (DEBUG) Log.d(TAG, "open3: " + localProfile.getUriString() + ": " + incomingCallBroadcastAction + ": " + listener); + incomingCallPendingIntent + ": " + listener); try { SipSessionGroupExt group = createGroup(localProfile, incomingCallBroadcastAction, listener); incomingCallPendingIntent, listener); if (localProfile.getAutoRegistration()) { group.openToReceiveCalls(); if (isWifiOn()) grabWifiLock(); Loading Loading @@ -287,20 +271,19 @@ public final class SipService extends ISipService.Stub { } private SipSessionGroupExt createGroup(SipProfile localProfile, String incomingCallBroadcastAction, ISipSessionListener listener) throws SipException { PendingIntent incomingCallPendingIntent, ISipSessionListener listener) throws SipException { String key = localProfile.getUriString(); SipSessionGroupExt group = mSipGroups.get(key); if (group != null) { if (!isCallerCreator(group)) { throw new SipException("only creator can access the profile"); } group.setIncomingCallBroadcastAction( incomingCallBroadcastAction); group.setIncomingCallPendingIntent(incomingCallPendingIntent); group.setListener(listener); } else { group = new SipSessionGroupExt(localProfile, incomingCallBroadcastAction, listener); incomingCallPendingIntent, listener); mSipGroups.put(key, group); notifyProfileAdded(localProfile); } Loading Loading @@ -405,19 +388,19 @@ public final class SipService extends ISipService.Stub { private class SipSessionGroupExt extends SipSessionAdapter { private SipSessionGroup mSipGroup; private String mIncomingCallBroadcastAction; private PendingIntent mIncomingCallPendingIntent; private boolean mOpened; private AutoRegistrationProcess mAutoRegistration = new AutoRegistrationProcess(); public SipSessionGroupExt(SipProfile localProfile, String incomingCallBroadcastAction, PendingIntent incomingCallPendingIntent, ISipSessionListener listener) throws SipException { String password = localProfile.getPassword(); SipProfile p = duplicate(localProfile); mSipGroup = createSipSessionGroup(mLocalIp, p, password); mIncomingCallBroadcastAction = incomingCallBroadcastAction; mIncomingCallPendingIntent = incomingCallPendingIntent; mAutoRegistration.setListener(listener); } Loading Loading @@ -458,8 +441,8 @@ public final class SipService extends ISipService.Stub { mAutoRegistration.setListener(listener); } public void setIncomingCallBroadcastAction(String action) { mIncomingCallBroadcastAction = action; public void setIncomingCallPendingIntent(PendingIntent pIntent) { mIncomingCallPendingIntent = pIntent; } public void openToReceiveCalls() throws SipException { Loading @@ -469,7 +452,7 @@ public final class SipService extends ISipService.Stub { mAutoRegistration.start(mSipGroup); } if (DEBUG) Log.d(TAG, " openToReceiveCalls: " + getUri() + ": " + mIncomingCallBroadcastAction); + mIncomingCallPendingIntent); } public void onConnectivityChanged(boolean connected) Loading @@ -481,7 +464,7 @@ public final class SipService extends ISipService.Stub { } else { // close mSipGroup but remember mOpened if (DEBUG) Log.d(TAG, " close auto reg temporarily: " + getUri() + ": " + mIncomingCallBroadcastAction); + getUri() + ": " + mIncomingCallPendingIntent); mSipGroup.close(); mAutoRegistration.stop(); } Loading @@ -508,7 +491,7 @@ public final class SipService extends ISipService.Stub { mSipGroup.close(); mAutoRegistration.stop(); if (DEBUG) Log.d(TAG, " close: " + getUri() + ": " + mIncomingCallBroadcastAction); + mIncomingCallPendingIntent); } public ISipSession createSession(ISipSessionListener listener) { Loading @@ -516,8 +499,10 @@ public final class SipService extends ISipService.Stub { } @Override public void onRinging(ISipSession session, SipProfile caller, public void onRinging(ISipSession s, SipProfile caller, String sessionDescription) { SipSessionGroup.SipSessionImpl session = (SipSessionGroup.SipSessionImpl) s; synchronized (SipService.this) { try { if (!isRegistered()) { Loading @@ -528,15 +513,15 @@ public final class SipService extends ISipService.Stub { // send out incoming call broadcast addPendingSession(session); Intent intent = SipManager.createIncomingCallBroadcast( session.getCallId(), sessionDescription) .setAction(mIncomingCallBroadcastAction); session.getCallId(), sessionDescription); if (DEBUG) Log.d(TAG, " ringing~~ " + getUri() + ": " + caller.getUri() + ": " + session.getCallId() + " " + mIncomingCallBroadcastAction); mContext.sendBroadcast(intent); } catch (RemoteException e) { // should never happen with a local call Log.e(TAG, "processCall()", e); + " " + mIncomingCallPendingIntent); mIncomingCallPendingIntent.send(mContext, SipManager.INCOMING_CALL_RESULT_CODE, intent); } catch (PendingIntent.CanceledException e) { Log.w(TAG, "pendingIntent is canceled, drop incoming call"); session.endCall(); } } } Loading Loading
voip/java/android/net/sip/ISipService.aidl +2 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.net.sip; import android.app.PendingIntent; import android.net.sip.ISipSession; import android.net.sip.ISipSessionListener; import android.net.sip.SipProfile; Loading @@ -26,7 +27,7 @@ import android.net.sip.SipProfile; interface ISipService { void open(in SipProfile localProfile); void open3(in SipProfile localProfile, String incomingCallBroadcastAction, in PendingIntent incomingCallPendingIntent, in ISipSessionListener listener); void close(in String localProfileUri); boolean isOpened(String localProfileUri); Loading
voip/java/android/net/sip/SipManager.java +43 −19 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.net.sip; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; Loading @@ -34,7 +35,7 @@ import java.text.ParseException; * <li>open a {@link SipProfile} to get ready for making outbound calls or have * the background SIP service listen to incoming calls and broadcast them * with registered command string. See * {@link #open(SipProfile, String, SipRegistrationListener)}, * {@link #open(SipProfile, PendingIntent, SipRegistrationListener)}, * {@link #open(SipProfile)}, {@link #close}, {@link #isOpened} and * {@link #isRegistered}. It also facilitates handling of the incoming call * broadcast intent. See Loading @@ -50,6 +51,19 @@ import java.text.ParseException; * @hide */ public class SipManager { /** * The result code to be sent back with the incoming call * {@link PendingIntent}. * @see #open(SipProfile, PendingIntent, SipRegistrationListener) */ public static final int INCOMING_CALL_RESULT_CODE = 101; /** Part of the incoming call intent. */ public static final String EXTRA_CALL_ID = "android:sipCallID"; /** Part of the incoming call intent. */ public static final String EXTRA_OFFER_SD = "android:sipOfferSD"; /** * Action string for the incoming call intent for the Phone app. * Internal use only. Loading Loading @@ -78,12 +92,6 @@ public class SipManager { */ public static final String EXTRA_LOCAL_URI = "android:localSipUri"; /** Part of the incoming call intent. */ public static final String EXTRA_CALL_ID = "android:sipCallID"; /** Part of the incoming call intent. */ public static final String EXTRA_OFFER_SD = "android:sipOfferSD"; private static final String TAG = "SipManager"; private ISipService mSipService; Loading Loading @@ -142,7 +150,8 @@ public class SipManager { /** * Opens the profile for making calls. The caller may make subsequent calls * through {@link #makeAudioCall}. If one also wants to receive calls on the * profile, use {@link #open(SipProfile, String, SipRegistrationListener)} * profile, use * {@link #open(SipProfile, PendingIntent, SipRegistrationListener)} * instead. * * @param localProfile the SIP profile to make calls from Loading @@ -165,17 +174,29 @@ public class SipManager { * in order to receive calls from the provider. * * @param localProfile the SIP profile to receive incoming calls for * @param incomingCallBroadcastAction the action to be broadcast when an * incoming call is received * @param incomingCallPendingIntent When an incoming call is received, the * SIP service will call * {@link PendingIntent#send(Context, int, Intent)} to send back the * intent to the caller with {@link #INCOMING_CALL_RESULT_CODE} as the * result code and the intent to fill in the call ID and session * description information. It cannot be null. * @param listener to listen to registration events; can be null * @see #getCallId * @see #getOfferSessionDescription * @see #takeAudioCall * @throws NullPointerException if {@code incomingCallPendingIntent} is null * @throws SipException if the profile contains incorrect settings or * calling the SIP service results in an error */ public void open(SipProfile localProfile, String incomingCallBroadcastAction, PendingIntent incomingCallPendingIntent, SipRegistrationListener listener) throws SipException { if (incomingCallPendingIntent == null) { throw new NullPointerException( "incomingCallPendingIntent cannot be null"); } try { mSipService.open3(localProfile, incomingCallBroadcastAction, mSipService.open3(localProfile, incomingCallPendingIntent, createRelay(listener, localProfile.getUriString())); } catch (RemoteException e) { throw new SipException("open()", e); Loading @@ -184,7 +205,8 @@ public class SipManager { /** * Sets the listener to listen to registration events. No effect if the * profile has not been opened to receive calls (see {@link #open}). * profile has not been opened to receive calls (see * {@link #open(SipProfile, PendingIntent, SipRegistrationListener)}). * * @param localProfileUri the URI of the profile * @param listener to listen to registration events; can be null Loading Loading @@ -282,9 +304,9 @@ public class SipManager { } /** * Creates a {@link SipAudioCall} to make a call. To use this method, one * must call {@link #open(SipProfile)} first. The attempt will be timed out * if the call is not established within {@code timeout} seconds and * Creates a {@link SipAudioCall} to make an audio call. The attempt will be * timed out if the call is not established within {@code timeout} seconds * and * {@code SipAudioCall.Listener.onError(SipAudioCall, SipErrorCode.TIME_OUT, String)} * will be called. * Loading Loading @@ -416,9 +438,11 @@ public class SipManager { /** * Manually registers the profile to the corresponding SIP provider for * receiving calls. {@link #open(SipProfile, String, SipRegistrationListener)} * is still needed to be called at least once in order for the SIP service * to broadcast an intent when an incoming call is received. * receiving calls. * {@link #open(SipProfile, PendingIntent, SipRegistrationListener)} is * still needed to be called at least once in order for the SIP service to * notify the caller with the {@code PendingIntent} when an incoming call is * received. * * @param localProfile the SIP profile to register with * @param expiryTime registration expiration time (in seconds) Loading
voip/java/com/android/server/sip/SipService.java +29 −44 Original line number Diff line number Diff line Loading @@ -134,14 +134,6 @@ public final class SipService extends ISipService.Stub { public void open(SipProfile localProfile) { localProfile.setCallingUid(Binder.getCallingUid()); if (localProfile.getAutoRegistration() && isCallerRadio()) { openToReceiveCalls(localProfile); } else { openToMakeCalls(localProfile); } } private void openToMakeCalls(SipProfile localProfile) { try { createGroup(localProfile); } catch (SipException e) { Loading @@ -150,28 +142,20 @@ public final class SipService extends ISipService.Stub { } } private void openToReceiveCalls(SipProfile localProfile) { open3(localProfile, SipManager.ACTION_SIP_INCOMING_CALL, null); } public synchronized void open3(SipProfile localProfile, String incomingCallBroadcastAction, ISipSessionListener listener) { PendingIntent incomingCallPendingIntent, ISipSessionListener listener) { localProfile.setCallingUid(Binder.getCallingUid()); if (TextUtils.isEmpty(incomingCallBroadcastAction)) { Log.w(TAG, "empty broadcast action for incoming call"); return; } if (incomingCallBroadcastAction.equals( SipManager.ACTION_SIP_INCOMING_CALL) && !isCallerRadio()) { Log.w(TAG, "failed to open the profile; " + "the action string is reserved"); if (incomingCallPendingIntent == null) { Log.w(TAG, "incomingCallPendingIntent cannot be null; " + "the profile is not opened"); return; } if (DEBUG) Log.d(TAG, "open3: " + localProfile.getUriString() + ": " + incomingCallBroadcastAction + ": " + listener); + incomingCallPendingIntent + ": " + listener); try { SipSessionGroupExt group = createGroup(localProfile, incomingCallBroadcastAction, listener); incomingCallPendingIntent, listener); if (localProfile.getAutoRegistration()) { group.openToReceiveCalls(); if (isWifiOn()) grabWifiLock(); Loading Loading @@ -287,20 +271,19 @@ public final class SipService extends ISipService.Stub { } private SipSessionGroupExt createGroup(SipProfile localProfile, String incomingCallBroadcastAction, ISipSessionListener listener) throws SipException { PendingIntent incomingCallPendingIntent, ISipSessionListener listener) throws SipException { String key = localProfile.getUriString(); SipSessionGroupExt group = mSipGroups.get(key); if (group != null) { if (!isCallerCreator(group)) { throw new SipException("only creator can access the profile"); } group.setIncomingCallBroadcastAction( incomingCallBroadcastAction); group.setIncomingCallPendingIntent(incomingCallPendingIntent); group.setListener(listener); } else { group = new SipSessionGroupExt(localProfile, incomingCallBroadcastAction, listener); incomingCallPendingIntent, listener); mSipGroups.put(key, group); notifyProfileAdded(localProfile); } Loading Loading @@ -405,19 +388,19 @@ public final class SipService extends ISipService.Stub { private class SipSessionGroupExt extends SipSessionAdapter { private SipSessionGroup mSipGroup; private String mIncomingCallBroadcastAction; private PendingIntent mIncomingCallPendingIntent; private boolean mOpened; private AutoRegistrationProcess mAutoRegistration = new AutoRegistrationProcess(); public SipSessionGroupExt(SipProfile localProfile, String incomingCallBroadcastAction, PendingIntent incomingCallPendingIntent, ISipSessionListener listener) throws SipException { String password = localProfile.getPassword(); SipProfile p = duplicate(localProfile); mSipGroup = createSipSessionGroup(mLocalIp, p, password); mIncomingCallBroadcastAction = incomingCallBroadcastAction; mIncomingCallPendingIntent = incomingCallPendingIntent; mAutoRegistration.setListener(listener); } Loading Loading @@ -458,8 +441,8 @@ public final class SipService extends ISipService.Stub { mAutoRegistration.setListener(listener); } public void setIncomingCallBroadcastAction(String action) { mIncomingCallBroadcastAction = action; public void setIncomingCallPendingIntent(PendingIntent pIntent) { mIncomingCallPendingIntent = pIntent; } public void openToReceiveCalls() throws SipException { Loading @@ -469,7 +452,7 @@ public final class SipService extends ISipService.Stub { mAutoRegistration.start(mSipGroup); } if (DEBUG) Log.d(TAG, " openToReceiveCalls: " + getUri() + ": " + mIncomingCallBroadcastAction); + mIncomingCallPendingIntent); } public void onConnectivityChanged(boolean connected) Loading @@ -481,7 +464,7 @@ public final class SipService extends ISipService.Stub { } else { // close mSipGroup but remember mOpened if (DEBUG) Log.d(TAG, " close auto reg temporarily: " + getUri() + ": " + mIncomingCallBroadcastAction); + getUri() + ": " + mIncomingCallPendingIntent); mSipGroup.close(); mAutoRegistration.stop(); } Loading @@ -508,7 +491,7 @@ public final class SipService extends ISipService.Stub { mSipGroup.close(); mAutoRegistration.stop(); if (DEBUG) Log.d(TAG, " close: " + getUri() + ": " + mIncomingCallBroadcastAction); + mIncomingCallPendingIntent); } public ISipSession createSession(ISipSessionListener listener) { Loading @@ -516,8 +499,10 @@ public final class SipService extends ISipService.Stub { } @Override public void onRinging(ISipSession session, SipProfile caller, public void onRinging(ISipSession s, SipProfile caller, String sessionDescription) { SipSessionGroup.SipSessionImpl session = (SipSessionGroup.SipSessionImpl) s; synchronized (SipService.this) { try { if (!isRegistered()) { Loading @@ -528,15 +513,15 @@ public final class SipService extends ISipService.Stub { // send out incoming call broadcast addPendingSession(session); Intent intent = SipManager.createIncomingCallBroadcast( session.getCallId(), sessionDescription) .setAction(mIncomingCallBroadcastAction); session.getCallId(), sessionDescription); if (DEBUG) Log.d(TAG, " ringing~~ " + getUri() + ": " + caller.getUri() + ": " + session.getCallId() + " " + mIncomingCallBroadcastAction); mContext.sendBroadcast(intent); } catch (RemoteException e) { // should never happen with a local call Log.e(TAG, "processCall()", e); + " " + mIncomingCallPendingIntent); mIncomingCallPendingIntent.send(mContext, SipManager.INCOMING_CALL_RESULT_CODE, intent); } catch (PendingIntent.CanceledException e) { Log.w(TAG, "pendingIntent is canceled, drop incoming call"); session.endCall(); } } } Loading