您的位置:首页 > 其它

androoid framework学习之 - 开启数据开关

2017-01-08 20:40 501 查看
转载自http://blog.csdn.net/aaa111/article/details/50059269谢谢博主在Settings->DataUsageSummary中的某个SIMtab下开启数据开关android/packages/apps/Settings/src/com/android/settings/DataUsageSummary.javasetMobileDataEnabled(true);
privateView.OnClickListenermDataEnabledListener=newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
if(mBinding)return;
finalbooleandataEnabled=!mDataEnabled.isChecked();
finalStringcurrentTab=mCurrentTab;
if(TAB_MOBILE.equals(currentTab)||currentTab.startsWith(TAB_SIM)){
if(dataEnabled){
setMobileDataEnabled(true);
if(mPolicyEditor.getPolicyWarningBytes(mTemplate)==WARNING_DISABLED){
mPolicyEditor.setPolicyWarningBytes(mTemplate,2*GB_IN_BYTES);
}
}else{
//disablingdata;showconfirmationdialogwhicheventually
//callssetMobileDataEnabled()onceuserconfirms.
ConfirmDataDisableFragment.show(DataUsageSummary.this);
}
}
updatePolicy(false);
}
};
[/code]下面这部根据phoneId获得了当前获得了SubIdmTelephonyManager.setDataEnabled(subId[0],enabled);
privatevoidsetMobileDataEnabled(booleanenabled){
if(LOGD)Log.d(TAG,"setMobileDataEnabled()");
//HowaboutexposingsubbasedAPIlikeTelephonyManager.setDataEnabled(intsubId);
if(mCurrentTab.startsWith(TAB_SIM)){
intphoneId=multiSimGetCurrentSub();
//asperphone,settheindividualflag
android.provider.Settings.Global.putInt(getActivity().getContentResolver(),
android.provider.Settings.Global.MOBILE_DATA+phoneId,enabled?1:0);
int[]subId=SubscriptionManager.getSubId(phoneId);
mTelephonyManager.setDataEnabled(subId[0],enabled);
}else{
mTelephonyManager.setDataEnabled(enabled);
mMobileDataEnabled=enabled;
}
updatePolicy(false);
}
[/code]frameworks/base数据开关都会调用到TelephonyManager.setDataEnabled(),不管是从流量使用情况还是从下拉的“快速设置”(QuickSetting)里打开(这里会在后面补充说明)android/frameworks/base/telephony/java/android/telephony/TelephonyManager.javagetITelephony().setDataEnabled(subId,enable);
/**@hide*/
@SystemApi
publicvoidsetDataEnabled(intsubId,booleanenable){
try{
AppOpsManagerappOps=(AppOpsManager)mContext.getSystemService(Context.APP_OPS_SERVICE);
if(enable){
if(appOps.noteOp(AppOpsManager.OP_DATA_CONNECT_CHANGE)!=AppOpsManager.MODE_ALLOWED){
Log.w(TAG,"Permissiondeniedbyuser.");
return;
}
}
Log.d(TAG,"setDataEnabled:enabled="+enable);
getITelephony().setDataEnabled(subId,enable);
}catch(RemoteExceptione){
Log.e(TAG,"ErrorcallingsetDataEnabled",e);
}
}
[/code]android/packages/services/Telephony/src/com/android/phone/PhoneInterfaceManager.java到这里才是设置phone的数据开启phone.setDataEnabled(enable);
/**
*Setmobiledataenabled
*Usedbytheuserthroughsettingsetctoturnon/offmobiledata
*
*@paramenable{@codetrue}turnturndataon,else{@codefalse}
*/
@Override
publicvoidsetDataEnabled(intsubId,booleanenable){
enforceModifyPermission();
intphoneId=mSubscriptionController.getPhoneId(subId);
log("getDataEnabled:subId="+subId+"phoneId="+phoneId);
Phonephone=PhoneFactory.getPhone(phoneId);
if(phone!=null){
log("setDataEnabled:subId="+subId+"enable="+enable);
phone.setDataEnabled(enable);
}else{
loge("setDataEnabled:nophoneforsubId="+subId);
}
}
[/code]android/frameworks/opt/telephony/src/java/com/android/internal/telephony/gsm/GSMPhone.javamDcTracker.setDataEnabled(enable);
@Override
publicvoidsetDataEnabled(booleanenable){
mDcTracker.setDataEnabled(enable);
}
[/code]android/rameworks/opt/telephony/src/java/com/android/internal/telephony/dataconnection/DcTrackerBase.java发送打开数据开关的消息CMD_SET_USER_DATA_ENABLEMessagemsg=obtainMessage(DctConstants.CMD_SET_USER_DATA_ENABLE);
/**
*Modify{@linkandroid.provider.Settings.Global#MOBILE_DATA}value.
*/
publicvoidsetDataEnabled(booleanenable){
Messagemsg=obtainMessage(DctConstants.CMD_SET_USER_DATA_ENABLE);
msg.arg1=enable?1:0;
sendMessage(msg);
}
[/code]处理消息onSetUserDataEnabled(enabled);
@Override
publicvoidhandleMessage(Messagemsg){
switch(msg.what){
caseAsyncChannel.CMD_CHANNEL_DISCONNECTED:{
log("DISCONNECTED_CONNECTED:msg="+msg);
DcAsyncChanneldcac=(DcAsyncChannel)msg.obj;
mDataConnectionAcHashMap.remove(dcac.getDataConnectionIdSync());
dcac.disconnected();
break;
}
...
caseDctConstants.CMD_SET_USER_DATA_ENABLE:{
finalbooleanenabled=(msg.arg1==DctConstants.ENABLED)?true:false;
if(DBG)log("CMD_SET_USER_DATA_ENABLEenabled="+enabled);
onSetUserDataEnabled(enabled);
break;
}
...
[/code]onTrySetupData(Phone.REASON_DATA_ENABLED);
protectedvoidonSetUserDataEnabled(booleanenabled){
synchronized(mDataEnabledLock){
if(mUserDataEnabled!=enabled){
mUserDataEnabled=enabled;
Settings.Global.putInt(mPhone.getContext().getContentResolver(),
Settings.Global.MOBILE_DATA+mPhone.getPhoneId(),enabled?1:0);
if(getDataOnRoamingEnabled()==false&&
mPhone.getServiceState().getRoaming()==true){
if(enabled){
notifyOffApnsOfAvailability(Phone.REASON_ROAMING_ON);
}else{
notifyOffApnsOfAvailability(Phone.REASON_DATA_DISABLED);
}
}
if(enabled){
onTrySetupData(Phone.REASON_DATA_ENABLED);
}else{
onCleanUpAllConnections(Phone.REASON_DATA_SPECIFIC_DISABLED);
}
}
}
}
[/code]android/frameworks/opt/telephony/src/java/com/android/internal/telephony/dataconnection/DcTracker.javasetupDataOnConnectableApns(reason);
@Override
//TODO:Weshouldntneedthis.
protectedbooleanonTrySetupData(Stringreason){
if(DBG)log("onTrySetupData:reason="+reason);
setupDataOnConnectableApns(reason);
returntrue;
}
[/code]trySetupData(apnContext);
privatevoidsetupDataOnConnectableApns(Stringreason){
if(DBG)log("setupDataOnConnectableApns:"+reason);
for(ApnContextapnContext:mPrioritySortedApnContexts){
if(DBG)log("setupDataOnConnectableApns:apnContext"+apnContext);
if(apnContext.getState()==DctConstants.State.FAILED){
apnContext.setState(DctConstants.State.IDLE);
}
if(apnContext.isConnectable()){
log("setupDataOnConnectableApns:isConnectable()calltrySetupData");
apnContext.setReason(reason);
trySetupData(apnContext);
}
}
}
[/code]下面这个方法比较长,有很多条件的检查booleanretValue=setupData(apnContext,radioTech);
privatebooleantrySetupData(ApnContextapnContext){
...
if(apnContext.isConnectable()&&(isEmergencyApn||
(isDataAllowed(apnContext)&&
getAnyDataEnabled(checkUserDataEnabled)&&!isEmergency()))){
if(apnContext.getState()==DctConstants.State.FAILED){
if(DBG)log("trySetupData:makeaFAILEDApnContextIDLEsoitsreusable");
apnContext.setState(DctConstants.State.IDLE);
}
intradioTech=mPhone.getServiceState().getRilDataRadioTechnology();
if(apnContext.getState()==DctConstants.State.IDLE){
ArrayList<ApnSetting>waitingApns=buildWaitingApns(apnContext.getApnType(),
radioTech);
if(waitingApns.isEmpty()){
notifyNoData(DcFailCause.MISSING_UNKNOWN_APN,apnContext);
notifyOffApnsOfAvailability(apnContext.getReason());
if(DBG)log("trySetupData:XNoAPNfoundretValue=false");
returnfalse;
}else{
apnContext.setWaitingApns(waitingApns);
if(DBG){
log("trySetupData:CreatefrommAllApnSettings:"
+apnListToString(mAllApnSettings));
}
}
}
if(DBG){
log("trySetupData:callsetupData,waitingApns:"
+apnListToString(apnContext.getWaitingApns()));
}
booleanretValue=setupData(apnContext,radioTech);//7
notifyOffApnsOfAvailability(apnContext.getReason());
if(DBG)log("trySetupData:XretValue="+retValue);
returnretValue;
}else{
if(!apnContext.getApnType().equals(PhoneConstants.APN_TYPE_DEFAULT)
&&apnContext.isConnectable()){
mPhone.notifyDataConnectionFailed(apnContext.getReason(),apnContext.getApnType());
}
notifyOffApnsOfAvailability(apnContext.getReason());
if(DBG)log("trySetupData:XapnContextnot'ready'retValue=false");
returnfalse;
}
}
[/code]
dcac.bringUp(apnContext,getInitialMaxRetry(),profileId,radioTech,mAutoAttachOnCreation,
msg);
privatebooleansetupData(ApnContextapnContext,intradioTech){
if(DBG)log("setupData:apnContext="+apnContext);
ApnSettingapnSetting;
DcAsyncChanneldcac=null;
apnSetting=apnContext.getNextWaitingApn();
if(apnSetting==null){
if(DBG)log("setupData:returnfornoapnfound!");
returnfalse;
}
intprofileId=apnSetting.profileId;
if(profileId==0){
profileId=getApnProfileID(apnContext.getApnType());
}
//OnCDMA,ifwe'reexplicitlyaskingforDUN,weneedhave
//adun-profiledconnectionsowecan'tshareanexistingone
//OnGSM/LTEwecanshareexistingapnconnectionsprovidedtheysupport
//thistype.
if(apnContext.getApnType()!=PhoneConstants.APN_TYPE_DUN||
teardownForDun()==false){
dcac=checkForCompatibleConnectedApnContext(apnContext);
if(dcac!=null){
//GetthedcacApnSettingfortheconnectionwewanttoshare.
ApnSettingdcacApnSetting=dcac.getApnSettingSync();
if(dcacApnSetting!=null){
//Settingisgood,souseit.
apnSetting=dcacApnSetting;
}
}
}
if(dcac==null){
if(isOnlySingleDcAllowed(radioTech)){
if(isHigherPriorityApnContextActive(apnContext)){
if(DBG){
log("setupData:HigherpriorityApnContextactive.Ignoringcall");
}
returnfalse;
}
//Onlylowerprioritycallsleft.DisconnectthemallinthissinglePDPcase
//sothatwecanbringuptherequestedhigherprioritycall(oncewereceive
//repsonsefordeactivaterequestforthecallsweareabouttodisconnect
if(cleanUpAllConnections(true,Phone.REASON_SINGLE_PDN_ARBITRATION)){
//Ifanycallactuallyrequestedtobedisconnected,meanswecan't
//bringupthisconnectionyetasweneedtowaitforthosedatacalls
//tobedisconnected.
if(DBG)log("setupData:Somecallsaredisconnectingfirst.Waitandretry");
returnfalse;
}
//Noothercallsareactive,soproceed
if(DBG)log("setupData:Singlepdp.Continuesettingupdatacall.");
}
dcac=findFreeDataConnection();
if(dcac==null){
dcac=createDataConnection();
}
if(dcac==null){
if(DBG)log("setupData:NofreeDataConnectionandcouldn'tcreateone,WEIRD");
returnfalse;
}
}
if(DBG)log("setupData:dcac="+dcac+"apnSetting="+apnSetting);
apnContext.setDataConnectionAc(dcac);
apnContext.setApnSetting(apnSetting);
apnContext.setState(DctConstants.State.CONNECTING);
mPhone.notifyDataConnection(apnContext.getReason(),apnContext.getApnType());
Messagemsg=obtainMessage();
msg.what=DctConstants.EVENT_DATA_SETUP_COMPLETE;
msg.obj=apnContext;
dcac.bringUp(apnContext,getInitialMaxRetry(),profileId,radioTech,mAutoAttachOnCreation,
msg);//8
if(DBG)log("setupData:initing!");
returntrue;
}
[/code]android/frameworks/opt/telephony/src/java/com/android/internal/telephony/dataconnection/DcAsyncChannel.javasendMessage
/**
*BringupaconnectiontotheapnandreturnanAsyncResultinonCompletedMsg.
*UsedforcellularnetworksthatuseAcesssPointNames(APN)such
*asGSMnetworks.
*
*@paramapnContextistheAccessPointNametobringupaconnectionto
*@paraminitialMaxRetrythenumberofretiresforinitialbringup.
*@paramprofileIdfortheconneciton
*@paramonCompletedMsgissentwithitsmsg.objasanAsyncResultobject.
*WithAsyncResult.userObjsettotheoriginalmsg.obj,
*AsyncResult.result=FailCauseandAsyncResult.exception=Exception().
*/
publicvoidbringUp(ApnContextapnContext,intinitialMaxRetry,intprofileId,
intrilRadioTechnology,booleanretryWhenSSChange,MessageonCompletedMsg){
if(DBG){
log("bringUp:apnContext="+apnContext+"initialMaxRetry="+initialMaxRetry
+"onCompletedMsg="+onCompletedMsg);
}
sendMessage(DataConnection.EVENT_CONNECT,//9
newConnectionParams(apnContext,initialMaxRetry,profileId,
rilRadioTechnology,retryWhenSSChange,onCompletedMsg));
}
[/code]android/frameworks/opt/telephony/src/java/com/android/internal/telephony/dataconnection/DataConnection.java这其实是个状态即机StateMachine,这个类或者或机制,本身也比较复杂,以后看明白了以后会单独在写一篇文章现在是进入其中一个状态DcInactiveState。DcInactiveStateprocessmesssageonConnect(mConnectionParams);
/**
*ThestatemachineisinactiveandexpectsaEVENT_CONNECT.
*/
privateclassDcInactiveStateextendsState{
...
@Override
publicbooleanprocessMessage(Messagemsg){
...
caseEVENT_CONNECT:
if(DBG)log("DcInactiveState:mag.what=EVENT_CONNECT");
ConnectionParamscp=(ConnectionParams)msg.obj;
if(initConnection(cp)){
onConnect(mConnectionParams);//10
transitionTo(mActivatingState);
}else{
if(DBG){
log("DcInactiveState:msg.what=EVENT_CONNECTinitConnectionfailed");
}
notifyConnectCompleted(cp,DcFailCause.UNACCEPTABLE_NETWORK_PARAMETER,
false);
}
retVal=HANDLED;
break;
[/code]mPhone.mCi.setupDataCall
/**
*Beginsettingupadataconnection,callssetupDataCall
*andtheConnectionParamswillbereturnedwiththe
*EVENT_SETUP_DATA_CONNECTION_DONEAsyncResul.userObj.
*
*@paramcpistheconnectionparameters
*/
privatevoidonConnect(ConnectionParamscp){
if(DBG)log("onConnect:carrier='"+mApnSetting.carrier
+"'APN='"+mApnSetting.apn
+"'proxy='"+mApnSetting.proxy+"'port='"+mApnSetting.port+"'");
//Checkifweshouldfakeanerror.
if(mDcTesterFailBringUpAll.getDcFailBringUp().mCounter>0){
...
}
mCreateTime=-1;
mLastFailTime=-1;
mLastFailCause=DcFailCause.NONE;
//Thedataprofile'sprofileIDmustbesetwhenitiscreated.
intdataProfileId;
if(mApnSetting.getApnProfileType()==ApnProfileType.PROFILE_TYPE_OMH){
dataProfileId=mApnSetting.getProfileId()+RILConstants.DATA_PROFILE_OEM_BASE;
log("OMHprofile,dataProfileid="+dataProfileId);
}else{
dataProfileId=cp.mProfileId;
}
//msg.objwillbereturnedinAsyncResult.userObj;
Messagemsg=obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE,cp);
msg.obj=cp;
ead3intauthType=mApnSetting.authType;
if(authType==-1){
authType=TextUtils.isEmpty(mApnSetting.user)?RILConstants.SETUP_DATA_AUTH_NONE
:RILConstants.SETUP_DATA_AUTH_PAP_CHAP;
}
Stringprotocol;
if(mPhone.getServiceState().getRoaming()){
protocol=mApnSetting.roamingProtocol;
}else{
protocol=mApnSetting.protocol;
}
mPhone.mCi.setupDataCall(//11
Integer.toString(cp.mRilRat+2),
Integer.toString(dataProfileId),
mApnSetting.apn,mApnSetting.user,mApnSetting.password,
Integer.toString(authType),
protocol,msg);
}
[/code]android/frameworks/opt/telephony/src/java/com/android/internal/telephony/RIL.java
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: