summaryrefslogtreecommitdiffstats
path: root/voip/java/com
diff options
context:
space:
mode:
authorHung-ying Tyan <tyanh@google.com>2010-10-05 09:35:38 +0800
committerHung-ying Tyan <tyanh@google.com>2010-10-05 10:13:25 +0800
commit323d3671ac813df8dd173f3f4d6cb681ee29f740 (patch)
tree98d5188f9f6fb17b2fc4a5ac211f99821ec942ed /voip/java/com
parent368733b204805cfa716897b09153350a70dca3f3 (diff)
downloadframeworks_base-323d3671ac813df8dd173f3f4d6cb681ee29f740.zip
frameworks_base-323d3671ac813df8dd173f3f4d6cb681ee29f740.tar.gz
frameworks_base-323d3671ac813df8dd173f3f4d6cb681ee29f740.tar.bz2
SipService: supply PendingIntent when open a profile.
The SipService used to take an action string and broadcasts an intent with that action string when an incoming call is received. The design is not safe (as the intent may be sniffed) and inflexible (can only received by BroadcastReceiver). Now we use PendingIntent to fix all these. Companion CL: https://android-git.corp.google.com/g/#change,71800 Change-Id: Id12e5c1cf9321edafb171494932cd936eae10b6e
Diffstat (limited to 'voip/java/com')
-rw-r--r--voip/java/com/android/server/sip/SipService.java73
1 files changed, 29 insertions, 44 deletions
diff --git a/voip/java/com/android/server/sip/SipService.java b/voip/java/com/android/server/sip/SipService.java
index 405dff8..a7c61e5 100644
--- a/voip/java/com/android/server/sip/SipService.java
+++ b/voip/java/com/android/server/sip/SipService.java
@@ -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();
}
}
}