Loading telephony/java/com/android/internal/telephony/CallManager.java +81 −34 Original line number Diff line number Diff line Loading @@ -82,7 +82,7 @@ public final class CallManager { // Singleton instance private static final CallManager INSTANCE = new CallManager(); // list of registered phones // list of registered phones, which are PhoneBase objs private final ArrayList<Phone> mPhones; // list of supported ringing calls Loading @@ -97,7 +97,7 @@ public final class CallManager { // empty connection list private final ArrayList<Connection> emptyConnections = new ArrayList<Connection>(); // default phone as the first phone registered // default phone as the first phone registered, which is PhoneBase obj private Phone mDefaultPhone; // state registrants Loading Loading @@ -180,6 +180,46 @@ public final class CallManager { return INSTANCE; } /** * Get the corresponding PhoneBase obj * * @param phone a Phone object * @return the corresponding PhoneBase obj in Phone if Phone * is a PhoneProxy obj * or the Phone itself if Phone is not a PhoneProxy obj */ private static Phone getPhoneBase(Phone phone) { if (phone instanceof PhoneProxy) { return phone.getForegroundCall().getPhone(); } return phone; } /** * Check if two phones refer to the same PhoneBase obj * * Note: PhoneBase, not PhoneProxy, is to be used inside of CallManager * * Both PhoneBase and PhoneProxy implement Phone interface, so * they have same phone APIs, such as dial(). The real implementation, for * example in GSM, is in GSMPhone as extend from PhoneBase, so that * foregroundCall.getPhone() returns GSMPhone obj. On the other hand, * PhoneFactory.getDefaultPhone() returns PhoneProxy obj, which has a class * member of GSMPhone. * * So for phone returned by PhoneFacotry, which is used by PhoneApp, * phone.getForegroundCall().getPhone() != phone * but * isSamePhone(phone, phone.getForegroundCall().getPhone()) == true * * @param p1 is the first Phone obj * @param p2 is the second Phone obj * @return true if p1 and p2 refer to the same phone */ public static boolean isSamePhone(Phone p1, Phone p2) { return (getPhoneBase(p1) == getPhoneBase(p2)); } /** * Returns all the registered phone objects. * @return all the registered phone objects. Loading Loading @@ -246,24 +286,49 @@ public final class CallManager { /** * Register phone to CallManager * @param phone * @param phone to be registered * @return true if register successfully */ public boolean registerPhone(Phone phone) { if (phone != null && !mPhones.contains(phone)) { Phone basePhone = getPhoneBase(phone); if (basePhone != null && !mPhones.contains(basePhone)) { if (mPhones.isEmpty()) { mDefaultPhone = phone; mDefaultPhone = basePhone; } mPhones.add(phone); mRingingCalls.add(phone.getRingingCall()); mBackgroundCalls.add(phone.getBackgroundCall()); mForegroundCalls.add(phone.getForegroundCall()); registerForPhoneStates(phone); mPhones.add(basePhone); mRingingCalls.add(basePhone.getRingingCall()); mBackgroundCalls.add(basePhone.getBackgroundCall()); mForegroundCalls.add(basePhone.getForegroundCall()); registerForPhoneStates(basePhone); return true; } return false; } /** * unregister phone from CallManager * @param phone to be unregistered */ public void unregisterPhone(Phone phone) { Phone basePhone = getPhoneBase(phone); if (basePhone != null && mPhones.contains(basePhone)) { mPhones.remove(basePhone); mRingingCalls.remove(basePhone.getRingingCall()); mBackgroundCalls.remove(basePhone.getBackgroundCall()); mForegroundCalls.remove(basePhone.getForegroundCall()); unregisterForPhoneStates(basePhone); if (basePhone == mDefaultPhone) { if (mPhones.isEmpty()) { mDefaultPhone = null; } else { mDefaultPhone = mPhones.get(0); } } } } /** * return the default phone or null if no phone available */ Loading Loading @@ -304,26 +369,7 @@ public final class CallManager { return null; } /** * unregister phone from CallManager * @param phone */ public void unregisterPhone(Phone phone) { if (phone != null && mPhones.contains(phone)) { mPhones.remove(phone); mRingingCalls.remove(phone.getRingingCall()); mBackgroundCalls.remove(phone.getBackgroundCall()); mForegroundCalls.remove(phone.getForegroundCall()); unregisterForPhoneStates(phone); if (phone == mDefaultPhone) { if (mPhones.isEmpty()) { mDefaultPhone = null; } else { mDefaultPhone = mPhones.get(0); } } } } public void setAudioMode() { Context context = getContext(); Loading Loading @@ -592,8 +638,9 @@ public final class CallManager { * handled asynchronously. */ public Connection dial(Phone phone, String dialString) throws CallStateException { Phone basePhone = getPhoneBase(phone); if (VDBG) { Log.d(LOG_TAG, "CallManager.dial( phone=" + phone + ", dialString="+ dialString + ")"); Log.d(LOG_TAG, "CallManager.dial( phone=" + basePhone + ", dialString="+ dialString + ")"); Log.d(LOG_TAG, this.toString()); } if ( hasActiveFgCall() ) { Loading @@ -601,10 +648,10 @@ public final class CallManager { boolean hasBgCall = !(activePhone.getBackgroundCall().isIdle()); if (DBG) { Log.d(LOG_TAG, "hasBgCall: "+ hasBgCall + " sameChannel:" + (activePhone == phone)); Log.d(LOG_TAG, "hasBgCall: "+ hasBgCall + " sameChannel:" + (activePhone == basePhone)); } if (activePhone != phone) { if (activePhone != basePhone) { if (hasBgCall) { Log.d(LOG_TAG, "Hangup"); getActiveFgCall().hangup(); Loading @@ -614,7 +661,7 @@ public final class CallManager { } } } return phone.dial(dialString); return basePhone.dial(dialString); } /** Loading Loading
telephony/java/com/android/internal/telephony/CallManager.java +81 −34 Original line number Diff line number Diff line Loading @@ -82,7 +82,7 @@ public final class CallManager { // Singleton instance private static final CallManager INSTANCE = new CallManager(); // list of registered phones // list of registered phones, which are PhoneBase objs private final ArrayList<Phone> mPhones; // list of supported ringing calls Loading @@ -97,7 +97,7 @@ public final class CallManager { // empty connection list private final ArrayList<Connection> emptyConnections = new ArrayList<Connection>(); // default phone as the first phone registered // default phone as the first phone registered, which is PhoneBase obj private Phone mDefaultPhone; // state registrants Loading Loading @@ -180,6 +180,46 @@ public final class CallManager { return INSTANCE; } /** * Get the corresponding PhoneBase obj * * @param phone a Phone object * @return the corresponding PhoneBase obj in Phone if Phone * is a PhoneProxy obj * or the Phone itself if Phone is not a PhoneProxy obj */ private static Phone getPhoneBase(Phone phone) { if (phone instanceof PhoneProxy) { return phone.getForegroundCall().getPhone(); } return phone; } /** * Check if two phones refer to the same PhoneBase obj * * Note: PhoneBase, not PhoneProxy, is to be used inside of CallManager * * Both PhoneBase and PhoneProxy implement Phone interface, so * they have same phone APIs, such as dial(). The real implementation, for * example in GSM, is in GSMPhone as extend from PhoneBase, so that * foregroundCall.getPhone() returns GSMPhone obj. On the other hand, * PhoneFactory.getDefaultPhone() returns PhoneProxy obj, which has a class * member of GSMPhone. * * So for phone returned by PhoneFacotry, which is used by PhoneApp, * phone.getForegroundCall().getPhone() != phone * but * isSamePhone(phone, phone.getForegroundCall().getPhone()) == true * * @param p1 is the first Phone obj * @param p2 is the second Phone obj * @return true if p1 and p2 refer to the same phone */ public static boolean isSamePhone(Phone p1, Phone p2) { return (getPhoneBase(p1) == getPhoneBase(p2)); } /** * Returns all the registered phone objects. * @return all the registered phone objects. Loading Loading @@ -246,24 +286,49 @@ public final class CallManager { /** * Register phone to CallManager * @param phone * @param phone to be registered * @return true if register successfully */ public boolean registerPhone(Phone phone) { if (phone != null && !mPhones.contains(phone)) { Phone basePhone = getPhoneBase(phone); if (basePhone != null && !mPhones.contains(basePhone)) { if (mPhones.isEmpty()) { mDefaultPhone = phone; mDefaultPhone = basePhone; } mPhones.add(phone); mRingingCalls.add(phone.getRingingCall()); mBackgroundCalls.add(phone.getBackgroundCall()); mForegroundCalls.add(phone.getForegroundCall()); registerForPhoneStates(phone); mPhones.add(basePhone); mRingingCalls.add(basePhone.getRingingCall()); mBackgroundCalls.add(basePhone.getBackgroundCall()); mForegroundCalls.add(basePhone.getForegroundCall()); registerForPhoneStates(basePhone); return true; } return false; } /** * unregister phone from CallManager * @param phone to be unregistered */ public void unregisterPhone(Phone phone) { Phone basePhone = getPhoneBase(phone); if (basePhone != null && mPhones.contains(basePhone)) { mPhones.remove(basePhone); mRingingCalls.remove(basePhone.getRingingCall()); mBackgroundCalls.remove(basePhone.getBackgroundCall()); mForegroundCalls.remove(basePhone.getForegroundCall()); unregisterForPhoneStates(basePhone); if (basePhone == mDefaultPhone) { if (mPhones.isEmpty()) { mDefaultPhone = null; } else { mDefaultPhone = mPhones.get(0); } } } } /** * return the default phone or null if no phone available */ Loading Loading @@ -304,26 +369,7 @@ public final class CallManager { return null; } /** * unregister phone from CallManager * @param phone */ public void unregisterPhone(Phone phone) { if (phone != null && mPhones.contains(phone)) { mPhones.remove(phone); mRingingCalls.remove(phone.getRingingCall()); mBackgroundCalls.remove(phone.getBackgroundCall()); mForegroundCalls.remove(phone.getForegroundCall()); unregisterForPhoneStates(phone); if (phone == mDefaultPhone) { if (mPhones.isEmpty()) { mDefaultPhone = null; } else { mDefaultPhone = mPhones.get(0); } } } } public void setAudioMode() { Context context = getContext(); Loading Loading @@ -592,8 +638,9 @@ public final class CallManager { * handled asynchronously. */ public Connection dial(Phone phone, String dialString) throws CallStateException { Phone basePhone = getPhoneBase(phone); if (VDBG) { Log.d(LOG_TAG, "CallManager.dial( phone=" + phone + ", dialString="+ dialString + ")"); Log.d(LOG_TAG, "CallManager.dial( phone=" + basePhone + ", dialString="+ dialString + ")"); Log.d(LOG_TAG, this.toString()); } if ( hasActiveFgCall() ) { Loading @@ -601,10 +648,10 @@ public final class CallManager { boolean hasBgCall = !(activePhone.getBackgroundCall().isIdle()); if (DBG) { Log.d(LOG_TAG, "hasBgCall: "+ hasBgCall + " sameChannel:" + (activePhone == phone)); Log.d(LOG_TAG, "hasBgCall: "+ hasBgCall + " sameChannel:" + (activePhone == basePhone)); } if (activePhone != phone) { if (activePhone != basePhone) { if (hasBgCall) { Log.d(LOG_TAG, "Hangup"); getActiveFgCall().hangup(); Loading @@ -614,7 +661,7 @@ public final class CallManager { } } } return phone.dial(dialString); return basePhone.dial(dialString); } /** Loading