通过拨号盘设置-》blocked number-》add a number
Blocked calls and text from:找到在Add_blocked_number_dialog.xml中,add_blocked_number.根据此资源找到BlockedNumbersActivity中的showAddBlockNumberDialog,的addBlockedNumber函数,进入BlocekNumberTaskFragment.blockIfNotAlreadyBlocked(),进入BlockNumberTask。
BlockNumberTask.doInbackgroung()函数,会通过contendResolver.Insert将block的号码加入BlockedNumberContract.BlockedNumbers.Content_URI (字段值为com.android.blockednumber)的provider提供者中。
在pakages/providers/blockedNumberProvider/下的AndroidManifest.xml中,节点Provider 的authorities属性为ccom.android.blockednumber。则此模块为对应的provider。其BlokedNmuberProvider.java文件中insert函数。这里向真正的数据库写入。
在短信模块,和通话模块中都对应的通过BlockChecker.java的isBlocked函数,通过contentReslover访问provider实现对短信和电话的屏蔽。
一个是INboundSmsHandler.java的processMessagePart()。
经过分析通话log,屏蔽的电话号码的log如下:
04-02 13:40:35.082 1497 2384 I Telecom : Event: RecordEntry TC@2: BLOCK_CHECK_INITIATED, null: (...->CS.crCo->H.CS.crCo->H.CS.crCo.pICR)->CSW.hCCC->ABCF.dIB@E-E-CJY
04-02 13:40:35.096 1497 1497 I Telecom : Event: RecordEntry TC@2: BLOCK_CHECK_FINISHED, [Reject]: (...->CS.crCo->H.CS.crCo->H.CS.crCo.pICR)->CSW.hCCC->ABCF.oPE@E-E-CJY
04-02 13:40:35.099 1497 1497 I Telecom : Event: RecordEntry TC@2: SET_RINGING, blocking call: (...->CS.crCo->H.CS.crCo->H.CS.crCo.pICR)->CSW.hCCC->CILH.sL->CILH.oQC->ICF.oCFC@E-E-CJY
04-02 13:40:35.100 1497 1497 I Telecom : CallsManager: onCallFilteringCompleted: blocked call, rejecting.: (...->CS.crCo->H.CS.crCo->H.CS.crCo.pICR)->CSW.hCCC->CILH.sL->CILH.oQC->ICF.oCFC@E-E-CJY
在callsManager.java的onSuccessfulIncomingCall()函数中,通过AsyncBlockerFilter加入Filters,INcomingCallFilter.performFiltering()触发AsyncBlockerFilter.startFilterLokkup.
触发AsyncBlockCheckFilter.doInBackground()此函数在通过Log.addEvent添加BLOCK_CHECK_INITIATED打印。具体的操作就是通过BlockCheckAdapter.isBlocked->BlockerChecker.isBlocked()->BlockedNumberContract.SystemContract.shouldSystemBlockedNumber()->BlockNumberContract.shouldSystemBlockedNumber->ContentReslover.Call(content://com.android.blockednumber,METHOD_SHOULD_SYSTEM_BLOCK_NUMBER)
对应的走到BlockedNumberProvider.call()->BlockedNumberProvider.shouldSystemBlockedNumber->BlockedNumberProvider.isBlocked()到这里就进入真正的数据库查询了。
AsyncBlockCheckFilter执行完doInBackground()调用onPostExecute().
INcomingCallFilter的第二个入参CallFilterResultCallBack为listenner,传入的就是callManager本身,callManager确实也实现了onCallFilterComplete函数。
AsyncBlockCheckFilter.onPostExecute调用了其onCallFilterComplete().此函数判断reslut.rejecting为true,则调用incomingcall.reject,拒绝通话。