1、IccLockSettings:
在UI界面,会触发onResume()函数。在onResume里面注册了ACTION_SIM_STATE_CHANGED这个事件,当收到这种广播的时候就会进行响应。
- 在这个函数里面会获取卡的状态,mDialogState第一次进入默认都是OFF_MODE,所以最后会执行resetDialogState()。
OFF_MODE状态代表关闭状态,也是无操作状态;
ICC_LOCK_MODE:进行pin码设定与解锁的状态;
ICC_OLD_MODE:更改pin码,输入旧pin码的状态;
ICC_NEW_MODE:更改pin码,输入新pin码的状态;
ICC_REENTER_MODE:更改pin码,再次输入pin码的状态。
图4.1获取卡状态,执行resetDialogState()
- resetDialogState()函数:
当我们点击要修改PIN时,mDialogState就会设置为ICC_OLD_MODE,接着就会执行setDialogValues()函数。
图4.2执行setDialogValues()
- setDialogValues()方法,重置Dialog状态。Dialog的状态包括,Dialog的title,以及message。
图4.3重置Dialog状态,最后执行setDialogMessage()
- DialogPreference.java 的setDialogMessage方法:该方法就是重置一下Dialog的相关信息。
图4.4 setDialogMessage方法
总结:也就是说,当我们什么都不做时,默认的mDialogState==ICC_OLD_MODE状态。
2、pin码设定与解锁回调处理逻辑:
在第1步中的a.中onReceiver()会接收到TelephonyIntents发来的广播,接着就会发送MSG_SIM_STATE_CHABGED消息给自己,进行下一步处理。
图4.5MSG_SIM_STATE_CHABGED消息处理
图4.6 handleMessage处理消息
在updatePreferences()函数中获取当前PIN码的状态:
图4.7获取当前PIN码的状态
- MSG_ENABLE_ICC_PIN_COMPLETE:开启/关闭 sim锁定。如果sucess为true,则说明成功的进行了锁定sim卡或者解锁sim卡。更新mPinToggle的check状态。如果为false,说明操作失败,给出toast提示。
success 为true的条件为:ar.exception == null。
图4.8 MSG_ENABLE_ICC_PIN_COMPLETE消息处理
- MSG_CHANGE_IC_PIN_COMPLETE:更改pin码的message。同样的,success为true的条件和上一步雷同。无论成功还是失败,给出提示,并且最后都会执行resetDialogState();
图4.9 MSG_CHANGE_IC_PIN_COMPLETE消息处理
- pin状态更迭onPinEnter()函数:
当我们点击修改或者提交按钮的时候,会触发点击事件 onPinEnter()。它会根据不同的case,然后调用不同的函数,在调的函数中会进行pin状态变化的设置。
当我们进行把手机pin开启或关闭,会触发onPreferenceTreeClick(),它会把mDialogstate的状态设置为ICC_LOCK_MODE,之后我们才可执行修改pin的操作,这个时候mDialogState==ICC_OLD_MODE。
图4.10
初始的mDialogState==ICC_OLD_MODE,
进入handleMessage进行消息处理,case ICC_OLD_MODE:mDialogState被赋值为 ICC_NEW_MODE,这个是输入旧密码;
然后就会进入handleMessage处理,case:ICC_NEW_MODE,mDialogState被赋值为 ICC_REENTER_MODE,这个是输入新密码;
然后再去handleMessage处理,case:ICC_REENTER_MODE,这个是确认新密码;
这个流程就像是我们修改密码的时候会让你输入 原始密码---》新密码---》确认新密码的流程。
如果正确,就去else中执行tryChangePin()执行修改pin操作。否则会再次执行循环,直至达到最大次数。
;
图4.11 pin状态更迭
图4.12 tryChangeIccLockState函数改变pin状态
总结:为了防止主线程卡死,都用异步的消息传递方法,也就是请求接口时,需要构建一个Message对象,里面包含MSG_ID和消息处理handler,一旦底层处理完,会根据MSG_ID将处理完结果回送给该消息对应的消息队列handler来处理。
图4.8 tryChangePin函数改变pin的状态
第4章 SIM卡锁定
1、IccLockSettings:
在UI界面,会触发onResume()函数。在onResume里面注册了ACTION_SIM_STATE_CHANGED这个事件,当收到这种广播的时候就会进行响应。
- 在这个函数里面会获取卡的状态,mDialogState第一次进入默认都是OFF_MODE,所以最后会执行resetDialogState()。
OFF_MODE状态代表关闭状态,也是无操作状态;
ICC_LOCK_MODE:进行pin码设定与解锁的状态;
ICC_OLD_MODE:更改pin码,输入旧pin码的状态;
ICC_NEW_MODE:更改pin码,输入新pin码的状态;
ICC_REENTER_MODE:更改pin码,再次输入pin码的状态。
图4.1获取卡状态,执行resetDialogState()
- resetDialogState()函数:
当我们点击要修改PIN时,mDialogState就会设置为ICC_OLD_MODE,接着就会执行setDialogValues()函数。
图4.2执行setDialogValues()
- setDialogValues()方法,重置Dialog状态。Dialog的状态包括,Dialog的title,以及message。
图4.3重置Dialog状态,最后执行setDialogMessage()
- DialogPreference.java 的setDialogMessage方法:该方法就是重置一下Dialog的相关信息。
图4.4 setDialogMessage方法
总结:也就是说,当我们什么都不做时,默认的mDialogState==ICC_OLD_MODE状态。
2、pin码设定与解锁回调处理逻辑:
在第1步中的a.中onReceiver()会接收到TelephonyIntents发来的广播,接着就会发送MSG_SIM_STATE_CHABGED消息给自己,进行下一步处理。
图4.5MSG_SIM_STATE_CHABGED消息处理
图4.6 handleMessage处理消息
在updatePreferences()函数中获取当前PIN码的状态:
图4.7获取当前PIN码的状态
- MSG_ENABLE_ICC_PIN_COMPLETE:开启/关闭 sim锁定。如果sucess为true,则说明成功的进行了锁定sim卡或者解锁sim卡。更新mPinToggle的check状态。如果为false,说明操作失败,给出toast提示。
success 为true的条件为:ar.exception == null。
图4.8 MSG_ENABLE_ICC_PIN_COMPLETE消息处理
- MSG_CHANGE_IC_PIN_COMPLETE:更改pin码的message。同样的,success为true的条件和上一步雷同。无论成功还是失败,给出提示,并且最后都会执行resetDialogState();
图4.9 MSG_CHANGE_IC_PIN_COMPLETE消息处理
- pin状态更迭onPinEnter()函数:
当我们点击修改或者提交按钮的时候,会触发点击事件 onPinEnter()。它会根据不同的case,然后调用不同的函数,在调的函数中会进行pin状态变化的设置。
当我们进行把手机pin开启或关闭,会触发onPreferenceTreeClick(),它会把mDialogstate的状态设置为ICC_LOCK_MODE,之后我们才可执行修改pin的操作,这个时候mDialogState==ICC_OLD_MODE。
图4.10
初始的mDialogState==ICC_OLD_MODE,
进入handleMessage进行消息处理,case ICC_OLD_MODE:mDialogState被赋值为 ICC_NEW_MODE,这个是输入旧密码;
然后就会进入handleMessage处理,case:ICC_NEW_MODE,mDialogState被赋值为 ICC_REENTER_MODE,这个是输入新密码;
然后再去handleMessage处理,case:ICC_REENTER_MODE,这个是确认新密码;
这个流程就像是我们修改密码的时候会让你输入 原始密码---》新密码---》确认新密码的流程。
如果正确,就去else中执行tryChangePin()执行修改pin操作。否则会再次执行循环,直至达到最大次数。
;
图4.11 pin状态更迭
图4.12 tryChangeIccLockState函数改变pin状态
总结:为了防止主线程卡死,都用异步的消息传递方法,也就是请求接口时,需要构建一个Message对象,里面包含MSG_ID和消息处理handler,一旦底层处理完,会根据MSG_ID将处理完结果回送给该消息对应的消息队列handler来处理。
图4.8 tryChangePin函数改变pin的状态
图4.13 showPinDialog()会回调setDialogValues()
tryChangeIccLockState改变pin状态为MSG_ENABLE_ICC_PIN_COMPLETE:开启PIN;
tryChangePin函数改变pin的状态为:MSG_CHANGE_ICC_PIN_COMPLETE:修改PIN;
showPinDialog()会回调setDialogValues()。
总结:其实无论是case那个状态最后都会执行showPinDialog()函数,然后会重新执行setDialogValues()。
5、 PIN码条件,4-8个字符。
图4.14 PIN码长度条件
图4.15 PIN码长度条
图4.13 showPinDialog()会回调setDialogValues()
tryChangeIccLockState改变pin状态为MSG_ENABLE_ICC_PIN_COMPLETE:开启PIN;
tryChangePin函数改变pin的状态为:MSG_CHANGE_ICC_PIN_COMPLETE:修改PIN;
showPinDialog()会回调setDialogValues()。
总结:其实无论是case那个状态最后都会执行showPinDialog()函数,然后会重新执行setDialogValues()。
5、 PIN码条件,4-8个字符。
图4.14 PIN码长度条件
图4.15 PIN码长度条