Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3cb2d3be authored by Hung-ying Tyan's avatar Hung-ying Tyan Committed by Android Git Automerger
Browse files

am 1862af57: Merge "SipService: supply PendingIntent when open a profile." into gingerbread

Merge commit '1862af57' into gingerbread-plus-aosp

* commit '1862af57':
  SipService: supply PendingIntent when open a profile.
parents cb9f1e4d 1862af57
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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);
+43 −19
Original line number Diff line number Diff line
@@ -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;
@@ -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
@@ -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.
@@ -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;
@@ -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
@@ -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);
@@ -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
@@ -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.
     *
@@ -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)
+29 −44
Original line number Diff line number Diff line
@@ -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) {
@@ -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();
@@ -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);
        }
@@ -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);
        }

@@ -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 {
@@ -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)
@@ -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();
            }
@@ -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) {
@@ -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()) {
@@ -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();
                }
            }
        }