Blanket copy of PhoneApp to services/Telephony.
First phase of splitting out InCallUI from PhoneApp.
Change-Id: I237341c4ff00e96c677caa4580b251ef3432931b
diff --git a/src/com/android/phone/SipBroadcastReceiver.java b/src/com/android/phone/SipBroadcastReceiver.java
new file mode 100644
index 0000000..8fdc7f7
--- /dev/null
+++ b/src/com/android/phone/SipBroadcastReceiver.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone;
+
+import com.android.internal.telephony.CallManager;
+import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.PhoneConstants;
+import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.sip.SipPhone;
+import com.android.phone.sip.SipProfileDb;
+import com.android.phone.sip.SipSharedPreferences;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.net.sip.SipAudioCall;
+import android.net.sip.SipException;
+import android.net.sip.SipManager;
+import android.net.sip.SipProfile;
+import android.telephony.Rlog;
+import java.util.List;
+
+/**
+ * Broadcast receiver that handles SIP-related intents.
+ */
+public class SipBroadcastReceiver extends BroadcastReceiver {
+ private static final String TAG = SipBroadcastReceiver.class.getSimpleName();
+ private static final boolean DBG = true;
+ private SipSharedPreferences mSipSharedPreferences;
+
+ @Override
+ public void onReceive(Context context, final Intent intent) {
+ String action = intent.getAction();
+
+ if (!PhoneUtils.isVoipSupported()) {
+ if (DBG) log("SIP VOIP not supported: " + action);
+ return;
+ }
+ mSipSharedPreferences = new SipSharedPreferences(context);
+
+ if (action.equals(SipManager.ACTION_SIP_INCOMING_CALL)) {
+ takeCall(intent);
+ } else if (action.equals(SipManager.ACTION_SIP_ADD_PHONE)) {
+ String localSipUri = intent.getStringExtra(SipManager.EXTRA_LOCAL_URI);
+ SipPhone phone = PhoneFactory.makeSipPhone(localSipUri);
+ if (phone != null) {
+ CallManager.getInstance().registerPhone(phone);
+ }
+ if (DBG) log("onReceive: add phone" + localSipUri + " #phones="
+ + CallManager.getInstance().getAllPhones().size());
+ } else if (action.equals(SipManager.ACTION_SIP_REMOVE_PHONE)) {
+ String localSipUri = intent.getStringExtra(SipManager.EXTRA_LOCAL_URI);
+ removeSipPhone(localSipUri);
+ if (DBG) log("onReceive: remove phone: " + localSipUri + " #phones="
+ + CallManager.getInstance().getAllPhones().size());
+ } else if (action.equals(SipManager.ACTION_SIP_SERVICE_UP)) {
+ if (DBG) log("onReceive: start auto registration");
+ registerAllProfiles();
+ } else {
+ if (DBG) log("onReceive: action not processed: " + action);
+ return;
+ }
+ }
+
+ private void removeSipPhone(String sipUri) {
+ for (Phone phone : CallManager.getInstance().getAllPhones()) {
+ if (phone.getPhoneType() == PhoneConstants.PHONE_TYPE_SIP) {
+ if (((SipPhone) phone).getSipUri().equals(sipUri)) {
+ CallManager.getInstance().unregisterPhone(phone);
+ return;
+ }
+ }
+ }
+ if (DBG) log("RemoveSipPhone: failed:cannot find phone with uri " + sipUri);
+ }
+
+ private void takeCall(Intent intent) {
+ Context phoneContext = PhoneGlobals.getInstance();
+ try {
+ SipAudioCall sipAudioCall = SipManager.newInstance(phoneContext)
+ .takeAudioCall(intent, null);
+ for (Phone phone : CallManager.getInstance().getAllPhones()) {
+ if (phone.getPhoneType() == PhoneConstants.PHONE_TYPE_SIP) {
+ if (((SipPhone) phone).canTake(sipAudioCall)) {
+ if (DBG) log("takeCall: SIP call: " + intent);
+ return;
+ }
+ }
+ }
+ if (DBG) log("takeCall: not taken, drop SIP call: " + intent);
+ } catch (SipException e) {
+ loge("takeCall: error incoming SIP call", e);
+ }
+ }
+
+ private void registerAllProfiles() {
+ final Context context = PhoneGlobals.getInstance();
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ SipManager sipManager = SipManager.newInstance(context);
+ SipProfileDb profileDb = new SipProfileDb(context);
+ List<SipProfile> sipProfileList =
+ profileDb.retrieveSipProfileList();
+ for (SipProfile profile : sipProfileList) {
+ try {
+ if (!profile.getAutoRegistration() &&
+ !profile.getUriString().equals(
+ mSipSharedPreferences.getPrimaryAccount())) {
+ continue;
+ }
+ sipManager.open(profile,
+ SipUtil.createIncomingCallPendingIntent(),
+ null);
+ if (DBG) log("registerAllProfiles: profile=" + profile);
+ } catch (SipException e) {
+ loge("registerAllProfiles: failed" + profile.getProfileName(), e);
+ }
+ }
+ }}
+ ).start();
+ }
+
+ private void log(String s) {
+ Rlog.d(TAG, s);
+ }
+
+ private void loge(String s, Throwable t) {
+ Rlog.e(TAG, s, t);
+ }
+}