Merge "Add Trace.endSection back"
diff --git a/InCallUI/src/com/android/incallui/AudioModeProvider.java b/InCallUI/src/com/android/incallui/AudioModeProvider.java
index d4d2117..dab35d6 100644
--- a/InCallUI/src/com/android/incallui/AudioModeProvider.java
+++ b/InCallUI/src/com/android/incallui/AudioModeProvider.java
@@ -16,17 +16,16 @@
 
 package com.android.incallui;
 
-import com.google.common.collect.Lists;
-
 import android.telecom.AudioState;
-import android.telecom.Phone;
+
+import com.google.common.collect.Lists;
 
 import java.util.List;
 
 /**
  * Proxy class for getting and setting the audio mode.
  */
-public class AudioModeProvider implements InCallPhoneListener {
+public class AudioModeProvider {
 
     static final int AUDIO_MODE_INVALID = 0;
 
@@ -36,30 +35,14 @@
     private int mSupportedModes = AudioState.ROUTE_EARPIECE | AudioState.ROUTE_BLUETOOTH |
         AudioState.ROUTE_WIRED_HEADSET | AudioState.ROUTE_SPEAKER;
     private final List<AudioModeListener> mListeners = Lists.newArrayList();
-    private Phone mPhone;
-
-    private Phone.Listener mPhoneListener = new Phone.Listener() {
-        @Override
-        public void onAudioStateChanged(Phone phone, AudioState audioState) {
-            onAudioModeChange(audioState.getRoute(), audioState.isMuted());
-            onSupportedAudioModeChange(audioState.getSupportedRouteMask());
-        }
-    };
 
     public static AudioModeProvider getInstance() {
         return sAudioModeProvider;
     }
 
-    @Override
-    public void setPhone(Phone phone) {
-        mPhone = phone;
-        mPhone.addListener(mPhoneListener);
-    }
-
-    @Override
-    public void clearPhone() {
-        mPhone.removeListener(mPhoneListener);
-        mPhone = null;
+    public void onAudioStateChanged(AudioState audioState) {
+        onAudioModeChange(audioState.getRoute(), audioState.isMuted());
+        onSupportedAudioModeChange(audioState.getSupportedRouteMask());
     }
 
     public void onAudioModeChange(int newMode, boolean muted) {
diff --git a/InCallUI/src/com/android/incallui/CallList.java b/InCallUI/src/com/android/incallui/CallList.java
index 9868aef..d3d5b23 100644
--- a/InCallUI/src/com/android/incallui/CallList.java
+++ b/InCallUI/src/com/android/incallui/CallList.java
@@ -16,15 +16,15 @@
 
 package com.android.incallui;
 
-import com.android.contacts.common.testing.NeededForTesting;
-import com.google.common.collect.Maps;
-import com.google.common.base.Preconditions;
-
 import android.os.Handler;
 import android.os.Message;
 import android.os.Trace;
 import android.telecom.DisconnectCause;
-import android.telecom.Phone;
+import android.telecom.PhoneAccount;
+
+import com.android.contacts.common.testing.NeededForTesting;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Maps;
 
 import java.util.Collections;
 import java.util.HashMap;
@@ -38,7 +38,7 @@
  * as they are received from the telephony stack. Primary listener of changes to this class is
  * InCallPresenter.
  */
-public class CallList implements InCallPhoneListener {
+public class CallList {
 
     private static final int DISCONNECTED_CALL_SHORT_TIMEOUT_MS = 200;
     private static final int DISCONNECTED_CALL_MEDIUM_TIMEOUT_MS = 2000;
@@ -61,8 +61,6 @@
     private final HashMap<String, List<CallUpdateListener>> mCallUpdateListenerMap = Maps
             .newHashMap();
 
-    private Phone mPhone;
-
     /**
      * Static singleton accessor method.
      */
@@ -70,32 +68,6 @@
         return sInstance;
     }
 
-    private Phone.Listener mPhoneListener = new Phone.Listener() {
-        @Override
-        public void onCallAdded(Phone phone, android.telecom.Call telecommCall) {
-            Trace.beginSection("onCallAdded");
-            Call call = new Call(telecommCall);
-            Log.d(this, "onCallAdded: callState=" + call.getState());
-            if (call.getState() == Call.State.INCOMING ||
-                    call.getState() == Call.State.CALL_WAITING) {
-                onIncoming(call, call.getCannedSmsResponses());
-            } else {
-                onUpdate(call);
-            }
-            Trace.endSection();
-        }
-        @Override
-        public void onCallRemoved(Phone phone, android.telecom.Call telecommCall) {
-            if (mCallByTelecommCall.containsKey(telecommCall)) {
-                Call call = mCallByTelecommCall.get(telecommCall);
-                if (updateCallInMap(call)) {
-                    Log.w(this, "Removing call not previously disconnected " + call.getId());
-                }
-                updateCallTextMap(call, null);
-            }
-        }
-    };
-
     /**
      * USED ONLY FOR TESTING
      * Testing-only constructor.  Instance should only be acquired through getInstance().
@@ -104,16 +76,27 @@
     CallList() {
     }
 
-    @Override
-    public void setPhone(Phone phone) {
-        mPhone = phone;
-        mPhone.addListener(mPhoneListener);
+    public void onCallAdded(android.telecom.Call telecommCall) {
+        Trace.beginSection("onCallAdded");
+        Call call = new Call(telecommCall);
+        Log.d(this, "onCallAdded: callState=" + call.getState());
+        if (call.getState() == Call.State.INCOMING ||
+                call.getState() == Call.State.CALL_WAITING) {
+            onIncoming(call, call.getCannedSmsResponses());
+        } else {
+            onUpdate(call);
+        }
+        Trace.endSection();
     }
 
-    @Override
-    public void clearPhone() {
-        mPhone.removeListener(mPhoneListener);
-        mPhone = null;
+    public void onCallRemoved(android.telecom.Call telecommCall) {
+        if (mCallByTelecommCall.containsKey(telecommCall)) {
+            Call call = mCallByTelecommCall.get(telecommCall);
+            if (updateCallInMap(call)) {
+                Log.w(this, "Removing call not previously disconnected " + call.getId());
+            }
+            updateCallTextMap(call, null);
+        }
     }
 
     /**
diff --git a/InCallUI/src/com/android/incallui/InCallPresenter.java b/InCallUI/src/com/android/incallui/InCallPresenter.java
index d5aa0e5..9c0fca3 100644
--- a/InCallUI/src/com/android/incallui/InCallPresenter.java
+++ b/InCallUI/src/com/android/incallui/InCallPresenter.java
@@ -26,7 +26,6 @@
 import android.os.Bundle;
 import android.telecom.DisconnectCause;
 import android.telecom.PhoneAccount;
-import android.telecom.Phone;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
 import android.telecom.VideoProfile;
@@ -37,12 +36,11 @@
 import android.view.Window;
 import android.view.WindowManager;
 
-import com.google.common.base.Preconditions;
-
 import com.android.contacts.common.interactions.TouchPointManager;
 import com.android.contacts.common.testing.NeededForTesting;
 import com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette;
 import com.android.incalluibind.ObjectFactory;
+import com.google.common.base.Preconditions;
 
 import java.util.Collections;
 import java.util.List;
@@ -60,7 +58,7 @@
  * that want to listen in on the in-call state changes.
  * TODO: This class has become more of a state machine at this point.  Consider renaming.
  */
-public class InCallPresenter implements CallList.Listener, InCallPhoneListener,
+public class InCallPresenter implements CallList.Listener,
         CircularRevealFragment.OnCircularRevealCompleteListener {
 
     private static final String EXTRA_FIRST_TIME_SHOWN =
@@ -112,31 +110,6 @@
      */
     private PhoneAccountHandle mPendingPhoneAccountHandle;
 
-    private final Phone.Listener mPhoneListener = new Phone.Listener() {
-        @Override
-        public void onBringToForeground(Phone phone, boolean showDialpad) {
-            Log.i(this, "Bringing UI to foreground.");
-            bringToForeground(showDialpad);
-        }
-        @Override
-        public void onCallAdded(Phone phone, android.telecom.Call call) {
-            // Since a call has been added we are no longer waiting for Telecom to send us a
-            // call.
-            setBoundAndWaitingForOutgoingCall(false, null);
-            call.addListener(mCallListener);
-        }
-        @Override
-        public void onCallRemoved(Phone phone, android.telecom.Call call) {
-            call.removeListener(mCallListener);
-        }
-        @Override
-        public void onCanAddCallChanged(Phone phone, boolean canAddCall) {
-            for (CanAddCallListener listener : mCanAddCallListeners) {
-                listener.onCanAddCallChanged(canAddCall);
-            }
-        }
-    };
-
     private final android.telecom.Call.Listener mCallListener =
             new android.telecom.Call.Listener() {
         @Override
@@ -186,8 +159,6 @@
      */
     private boolean mIsChangingConfigurations = false;
 
-    private Phone mPhone;
-
     /** Display colors for the UI. Consists of a primary color and secondary (darker) color */
     private MaterialPalette mThemeColors;
 
@@ -205,18 +176,6 @@
         sInCallPresenter = inCallPresenter;
     }
 
-    @Override
-    public void setPhone(Phone phone) {
-        mPhone = phone;
-        mPhone.addListener(mPhoneListener);
-    }
-
-    @Override
-    public void clearPhone() {
-        mPhone.removeListener(mPhoneListener);
-        mPhone = null;
-    }
-
     public InCallState getInCallState() {
         return mInCallState;
     }
@@ -405,6 +364,36 @@
 
     private boolean mAwaitingCallListUpdate = false;
 
+    public void onBringToForeground(boolean showDialpad) {
+        Log.i(this, "Bringing UI to foreground.");
+        bringToForeground(showDialpad);
+    }
+
+    /**
+     * TODO: Consider listening to CallList callbacks to do this instead of receiving a direct
+     * method invocation from InCallService.
+     */
+    public void onCallAdded(android.telecom.Call call) {
+        // Since a call has been added we are no longer waiting for Telecom to send us a
+        // call.
+        setBoundAndWaitingForOutgoingCall(false, null);
+        call.addListener(mCallListener);
+    }
+
+    /**
+     * TODO: Consider listening to CallList callbacks to do this instead of receiving a direct
+     * method invocation from InCallService.
+     */
+    public void onCallRemoved(android.telecom.Call call) {
+        call.removeListener(mCallListener);
+    }
+
+    public void onCanAddCallChanged(boolean canAddCall) {
+        for (CanAddCallListener listener : mCanAddCallListeners) {
+            listener.onCanAddCallChanged(canAddCall);
+        }
+    }
+
     /**
      * Called when there is a change to the call list.
      * Sets the In-Call state for the entire in-call app based on the information it gets from
diff --git a/InCallUI/src/com/android/incallui/InCallServiceImpl.java b/InCallUI/src/com/android/incallui/InCallServiceImpl.java
index adb0697..bbd1db0 100644
--- a/InCallUI/src/com/android/incallui/InCallServiceImpl.java
+++ b/InCallUI/src/com/android/incallui/InCallServiceImpl.java
@@ -19,8 +19,9 @@
 import android.content.Context;
 import android.content.Intent;
 import android.os.IBinder;
+import android.telecom.AudioState;
+import android.telecom.Call;
 import android.telecom.InCallService;
-import android.telecom.Phone;
 
 /**
  * Used to receive updates about calls from the Telecomm component.  This service is bound to
@@ -31,25 +32,30 @@
 public class InCallServiceImpl extends InCallService {
 
     @Override
-    public void onPhoneCreated(Phone phone) {
-        Log.v(this, "onPhoneCreated");
-        CallList.getInstance().setPhone(phone);
-        AudioModeProvider.getInstance().setPhone(phone);
-        TelecomAdapter.getInstance().setPhone(phone);
-        InCallPresenter.getInstance().setPhone(phone);
-        TelecomAdapter.getInstance().setContext(InCallServiceImpl.this);
+    public void onAudioStateChanged(AudioState audioState) {
+        AudioModeProvider.getInstance().onAudioStateChanged(audioState);
     }
 
     @Override
-    public void onPhoneDestroyed(Phone phone) {
-        Log.v(this, "onPhoneDestroyed");
-        // Tear down the InCall system
-        CallList.getInstance().clearPhone();
-        AudioModeProvider.getInstance().clearPhone();
-        TelecomAdapter.getInstance().clearPhone();
-        TelecomAdapter.getInstance().setContext(null);
-        CallList.getInstance().clearOnDisconnect();
-        InCallPresenter.getInstance().tearDown();
+    public void onBringToForeground(boolean showDialpad) {
+        InCallPresenter.getInstance().onBringToForeground(showDialpad);
+    }
+
+    @Override
+    public void onCallAdded(Call call) {
+        CallList.getInstance().onCallAdded(call);
+        InCallPresenter.getInstance().onCallAdded(call);
+    }
+
+    @Override
+    public void onCallRemoved(Call call) {
+        CallList.getInstance().onCallRemoved(call);
+        InCallPresenter.getInstance().onCallRemoved(call);
+    }
+
+    @Override
+    public void onCanAddCallChanged(boolean canAddCall) {
+        InCallPresenter.getInstance().onCanAddCallChanged(canAddCall);
     }
 
     @Override
@@ -66,12 +72,27 @@
                 );
         InCallPresenter.getInstance().onServiceBind();
         InCallPresenter.getInstance().maybeStartRevealAnimation(intent);
+        TelecomAdapter.getInstance().setInCallService(this);
+
         return super.onBind(intent);
     }
 
     @Override
     public boolean onUnbind(Intent intent) {
+        super.onUnbind(intent);
+
         InCallPresenter.getInstance().onServiceUnbind();
-        return super.onUnbind(intent);
+        tearDown();
+
+        return false;
     }
+
+    private void tearDown() {
+        Log.v(this, "tearDown");
+        // Tear down the InCall system
+        TelecomAdapter.getInstance().clearInCallService();
+        CallList.getInstance().clearOnDisconnect();
+        InCallPresenter.getInstance().tearDown();
+    }
+
 }
diff --git a/InCallUI/src/com/android/incallui/InCallPhoneListener.java b/InCallUI/src/com/android/incallui/InCallServiceListener.java
similarity index 75%
rename from InCallUI/src/com/android/incallui/InCallPhoneListener.java
rename to InCallUI/src/com/android/incallui/InCallServiceListener.java
index 2fd6afe..295385d 100644
--- a/InCallUI/src/com/android/incallui/InCallPhoneListener.java
+++ b/InCallUI/src/com/android/incallui/InCallServiceListener.java
@@ -16,25 +16,26 @@
 
 package com.android.incallui;
 
-import android.telecom.Phone;
+import android.telecom.InCallService;
 
 /**
  * Interface implemented by In-Call components that maintain a reference to the Telecomm API
- * {@code Phone} object. Clarifies the expectations associated with the relevant method calls.
+ * {@code InCallService} object. Clarifies the expectations associated with the relevant method
+ * calls.
  */
-public interface InCallPhoneListener {
+public interface InCallServiceListener {
 
     /**
-     * Called once at {@code InCallService} startup time with a valid {@code Phone}. At
+     * Called once at {@code InCallService} startup time with a valid instance. At
      * that time, there will be no existing {@code Call}s.
      *
-     * @param phone The {@code Phone} object.
+     * @param inCallService The {@code InCallService} object.
      */
-    void setPhone(Phone phone);
+    void setInCallService(InCallService inCallService);
 
     /**
      * Called once at {@code InCallService} shutdown time. At that time, any {@code Call}s
      * will have transitioned through the disconnected state and will no longer exist.
      */
-    void clearPhone();
+    void clearInCallService();
 }
diff --git a/InCallUI/src/com/android/incallui/TelecomAdapter.java b/InCallUI/src/com/android/incallui/TelecomAdapter.java
index 10c2307..37efdee 100644
--- a/InCallUI/src/com/android/incallui/TelecomAdapter.java
+++ b/InCallUI/src/com/android/incallui/TelecomAdapter.java
@@ -17,22 +17,20 @@
 package com.android.incallui;
 
 import android.content.ActivityNotFoundException;
-import android.content.Context;
 import android.content.Intent;
 import android.os.Looper;
-import android.telecom.Phone;
+import android.telecom.InCallService;
 import android.telecom.PhoneAccountHandle;
 
 import com.google.common.base.Preconditions;
 
 import java.util.List;
 
-final class TelecomAdapter implements InCallPhoneListener {
+final class TelecomAdapter implements InCallServiceListener {
     private static final String ADD_CALL_MODE_KEY = "add_call_mode";
 
     private static TelecomAdapter sInstance;
-    private Context mContext;
-    private Phone mPhone;
+    private InCallService mInCallService;
 
     static TelecomAdapter getInstance() {
         Preconditions.checkState(Looper.getMainLooper().getThread() == Thread.currentThread());
@@ -45,102 +43,94 @@
     private TelecomAdapter() {
     }
 
-    void setContext(Context context) {
-        mContext = context;
+    @Override
+    public void setInCallService(InCallService inCallService) {
+        mInCallService = inCallService;
     }
 
     @Override
-    public void setPhone(Phone phone) {
-        mPhone = phone;
-    }
-
-    @Override
-    public void clearPhone() {
-        mPhone = null;
+    public void clearInCallService() {
+        mInCallService = null;
     }
 
     private android.telecom.Call getTelecommCallById(String callId) {
-        final Call call = CallList.getInstance().getCallById(callId);
+        Call call = CallList.getInstance().getCallById(callId);
         return call == null ? null : call.getTelecommCall();
     }
 
     void answerCall(String callId, int videoState) {
-        if (mPhone != null) {
-            final android.telecom.Call call = getTelecommCallById(callId);
-            if (call != null) {
-                call.answer(videoState);
-            } else {
-                Log.e(this, "error answerCall, call not in call list: " + callId);
-            }
+        android.telecom.Call call = getTelecommCallById(callId);
+        if (call != null) {
+            call.answer(videoState);
         } else {
-            Log.e(this, "error answerCall, mPhone is null");
+            Log.e(this, "error answerCall, call not in call list: " + callId);
         }
     }
 
     void rejectCall(String callId, boolean rejectWithMessage, String message) {
-        if (mPhone != null) {
-            final android.telecom.Call call = getTelecommCallById(callId);
-            if (call != null) {
-                call.reject(rejectWithMessage, message);
-            } else {
-                Log.e(this, "error rejectCall, call not in call list: " + callId);
-            }
+        android.telecom.Call call = getTelecommCallById(callId);
+        if (call != null) {
+            call.reject(rejectWithMessage, message);
         } else {
-            Log.e(this, "error rejectCall, mPhone is null");
+            Log.e(this, "error rejectCall, call not in call list: " + callId);
         }
     }
 
     void disconnectCall(String callId) {
-        if (mPhone != null) {
-            getTelecommCallById(callId).disconnect();
+        android.telecom.Call call = getTelecommCallById(callId);
+        if (call != null) {
+            call.disconnect();
         } else {
-            Log.e(this, "error disconnectCall, mPhone is null");
+            Log.e(this, "error disconnectCall, call not in call list " + callId);
         }
     }
 
     void holdCall(String callId) {
-        if (mPhone != null) {
-            getTelecommCallById(callId).hold();
+        android.telecom.Call call = getTelecommCallById(callId);
+        if (call != null) {
+            call.hold();
         } else {
-            Log.e(this, "error holdCall, mPhone is null");
+            Log.e(this, "error holdCall, call not in call list " + callId);
         }
     }
 
     void unholdCall(String callId) {
-        if (mPhone != null) {
-            getTelecommCallById(callId).unhold();
+        android.telecom.Call call = getTelecommCallById(callId);
+        if (call != null) {
+            call.unhold();
         } else {
-            Log.e(this, "error unholdCall, mPhone is null");
+            Log.e(this, "error unholdCall, call not in call list " + callId);
         }
     }
 
     void mute(boolean shouldMute) {
-        if (mPhone != null) {
-            mPhone.setMuted(shouldMute);
+        if (mInCallService != null) {
+            mInCallService.setMuted(shouldMute);
         } else {
-            Log.e(this, "error mute, mPhone is null");
+            Log.e(this, "error mute, mInCallService is null");
         }
     }
 
     void setAudioRoute(int route) {
-        if (mPhone != null) {
-            mPhone.setAudioRoute(route);
+        if (mInCallService != null) {
+            mInCallService.setAudioRoute(route);
         } else {
-            Log.e(this, "error setAudioRoute, mPhone is null");
+            Log.e(this, "error setAudioRoute, mInCallService is null");
         }
     }
 
     void separateCall(String callId) {
-        if (mPhone != null) {
-            getTelecommCallById(callId).splitFromConference();
+        android.telecom.Call call = getTelecommCallById(callId);
+        if (call != null) {
+            call.splitFromConference();
         } else {
-            Log.e(this, "error separateCall, mPhone is null.");
+            Log.e(this, "error separateCall, call not in call list " + callId);
         }
     }
 
     void merge(String callId) {
-        if (mPhone != null) {
-            android.telecom.Call call = getTelecommCallById(callId);
+        android.telecom.Call call = getTelecommCallById(callId);
+        if (call != null) {
             List<android.telecom.Call> conferenceable = call.getConferenceableCalls();
             if (!conferenceable.isEmpty()) {
                 call.conference(conferenceable.get(0));
@@ -151,24 +141,24 @@
                 }
             }
         } else {
-            Log.e(this, "error merge, mPhone is null.");
+            Log.e(this, "error merge, call not in call list " + callId);
         }
     }
 
     void swap(String callId) {
-        if (mPhone != null) {
-            android.telecom.Call call = getTelecommCallById(callId);
+        android.telecom.Call call = getTelecommCallById(callId);
+        if (call != null) {
             if (call.getDetails().can(
                     android.telecom.Call.Details.CAPABILITY_SWAP_CONFERENCE)) {
                 call.swapConference();
             }
         } else {
-            Log.e(this, "Error swap, mPhone is null.");
+            Log.e(this, "error swap, call not in call list " + callId);
         }
     }
 
     void addCall() {
-        if (mContext != null) {
+        if (mInCallService != null) {
             Intent intent = new Intent(Intent.ACTION_DIAL);
             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 
@@ -178,7 +168,7 @@
             intent.putExtra(ADD_CALL_MODE_KEY, true);
             try {
                 Log.d(this, "Sending the add Call intent");
-                mContext.startActivity(intent);
+                mInCallService.startActivity(intent);
             } catch (ActivityNotFoundException e) {
                 // This is rather rare but possible.
                 // Note: this method is used even when the phone is encrypted. At that moment
@@ -189,43 +179,48 @@
     }
 
     void playDtmfTone(String callId, char digit) {
-        if (mPhone != null) {
-            getTelecommCallById(callId).playDtmfTone(digit);
+        android.telecom.Call call = getTelecommCallById(callId);
+        if (call != null) {
+            call.playDtmfTone(digit);
         } else {
-            Log.e(this, "error playDtmfTone, mPhone is null");
+            Log.e(this, "error playDtmfTone, call not in call list " + callId);
         }
     }
 
     void stopDtmfTone(String callId) {
-        if (mPhone != null) {
-            getTelecommCallById(callId).stopDtmfTone();
+        android.telecom.Call call = getTelecommCallById(callId);
+        if (call != null) {
+            call.stopDtmfTone();
         } else {
-            Log.e(this, "error stopDtmfTone, mPhone is null");
+            Log.e(this, "error stopDtmfTone, call not in call list " + callId);
         }
     }
 
     void postDialContinue(String callId, boolean proceed) {
-        if (mPhone != null) {
-            getTelecommCallById(callId).postDialContinue(proceed);
+        android.telecom.Call call = getTelecommCallById(callId);
+        if (call != null) {
+            call.postDialContinue(proceed);
         } else {
-            Log.e(this, "error postDialContinue, mPhone is null");
+            Log.e(this, "error postDialContinue, call not in call list " + callId);
         }
     }
 
     void phoneAccountSelected(String callId, PhoneAccountHandle accountHandle, boolean setDefault) {
-        if (mPhone != null) {
-            getTelecommCallById(callId).phoneAccountSelected(accountHandle, setDefault);
-        }  else {
-            Log.e(this, "error phoneAccountSelected, mAdapter is null");
-        }
-
         if (accountHandle == null) {
             Log.e(this, "error phoneAccountSelected, accountHandle is null");
+            // TODO: Do we really want to send null accountHandle?
+        }
+
+        android.telecom.Call call = getTelecommCallById(callId);
+        if (call != null) {
+            call.phoneAccountSelected(accountHandle, setDefault);
+        } else {
+            Log.e(this, "error phoneAccountSelected, call not in call list " + callId);
         }
     }
 
     boolean canAddCall() {
         // Default to true if we are not connected to telecom.
-        return mPhone == null ? true : mPhone.canAddCall();
+        return mInCallService == null ? true : mInCallService.canAddCall();
     }
 }