關于Call對象
一共4個
./packages/apps/InCallUI/src/com/android/incallui/Call.java
./packages/services/Telecomm/src/com/android/server/telecom/Call.java
./frameworks/base/telecomm/java/android/telecom/Call.java
./frameworks/opt/telephony/src/java/com/android/internal/telephony/Call.java
Call相關
- frameworks/opt/telephony/src/java/com/android/internal/telephony/Call.java沒有使用,看樣子google打算放棄使用,轉用packages/services這個了。
- Call狀態最終都是通過CallsManager來廣播出去的,CallsManager承上啟下。通過不同Call的轉換,最終在ui上體現出來。InCallService是UI和telecom的接口。InCallController綁定InCallService。
- 從下往上,Call的傳到是:
com.android.server.telecom.call --> android.telecom.call --> com.android.incallui.call - com.android.server.telecom.call對象是撥打電話的時候(CallsManger.startOutgoingCall),或者收到來電intent的時候創建的(CallsManger.processIncomingCallIntent)。inCallController中的toParcelableCall函數會new ParcelableCall對象,參數是com.androidservice.telecom.call對象。toParcelableCall有兩個地方可以調到,一個是onConnected的時候,就是inCallController綁定到incallService后,如果這個時候call不為空,就會走;還有一個地方是CallsManager回調onCallAdded的時候,也會調用。android.telecom.call就是通過這個ParcelableCall對象的相關信息來創建的。即完成了com.android.server.telecom.call到android.telecom.call的映射。
- incallservice會在綁定的時候,把自己注冊到phone的listener中。當incallservice的客戶端(InCallController)調用addcall的時候,會傳過來一個parcelableCall的對象,incallservice會調用phone.internalAddCall來處理,在internalAddCall中根據這個parcelableCall對象生成telecomCall對象,然后phone通過fireCallAdded把這個call對象通過回調傳到incallservice中,incallservice調用onCallAdded,這個實現在incallui里面,即完成了android.telecom.call到 com.android.incallui.call的映射。
- android.telecom.call作為構造參數創建com.android.incallui.call,同時incallui.call注冊telecommCall的回調函數,這樣有變化的時候,telecommCall會通知incallui.call來更新UI.
關于Connection對象
一共2個
./frameworks/base/telecomm/java/android/telecom/Connection.java
./frameworks/opt/telephony/src/java/com/android/internal/telephony/Connection.java
Connection相關
- 總的來說,是先創建Call,然后創建Connection,最后Connection和Call關聯起來.TeleService這個包(packages/services/Telephony),負責Connection,Telecom這個包(packages/services/Telecomm)負責Call.
- CallsManager中placeOutgoingCall或者processIncomingCallIntent中會調用call.startCreateConnection
startCreateConnection會調用CreateConnectionProcessor.process().attemptNextPhoneAccount,然后attemptNextPhoneAccount調用ConnectionServiceWrapper(會連接ConnectionService)的createConnection,最終通過binder調用ConnectionService里面的createConnection.創建是com.android.services.telephony.TelephonyConnection的子類對象,有可能是GsmConnection/CdmaConnection.創建完connection后,如果是MO call,那么調用placeOutgoingConnection(MT調用onCreateIncomingConnection這里以MO為例),在placeOutgoingConnection其中,通過phone.dial返回一個com.android.internal.telephony.Connection對象,再通過com.android.services.telephony.TelephonyConnection的setOriginalConnection函數,把com.android.internal.telephony.Connection與其關聯起來。最后ConnectionService通過binder回調handleCreateConnectionComplete,傳入一個ParcelableConnection的對象,最終調到com.android.server.telecom.Call,把TelephonyConnection相關信息和Call相關聯。 - 同上面Call相關中通過InCallService(InCallServiceImpl是實現)來傳遞對象,Connection相關是通過ConnectionService(TelephonyConnectionService是實現)來傳遞。
總結:
CallsManager很重要,主要流程都從它那過。分析問題可以從CallsManager入手。