????????????
????· sdk?????????????????????????????????????????????????Ч
????· ???????????£?????sdk?????????翨??1?????????????????2?????δ????????????£?sdk????????儼??1????????????????????2?????????2??????????????У???????????
????· ??????????????й????????????????????????????λ???sdk????????????????????????????sim???????????????????У???????Ч
????????sim????β????????????????????????????
<receiver android:name="com.oneplus.security.network.simcard.SimcardStateChangeReceiver"
android:exported="true"
android:enabled="true" >
<intent-filter>
<action android:name="android.intent.action.SIM_STATE_CHANGED"/>
</intent-filter>
</receiver>
@Override
public void onReceive (Context context?? Intent intent) {
String action = intent.getAction();
if (TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(action)) {
String state = intent.getStringExtra(SimStateListener.SIM_STATE_KEY);
if (SimStateListener.SS_ABSENT.equals(state)) {
SimcardStateManager.setShouldAlertSimcardHasPopedOut(context?? true??
SimcardDataModelInterface.SIM_CARD_ONE_INDEX);
SimcardStateManager.setShouldAlertSimcardHasPopedOut(context?? true??
SimcardDataModelInterface.SIM_CARD_TWO_INDEX);
}
}
}
????· ????????????sim?????????仯??????sim??absent???????????????????????????????(alert_data_change_flag)?true???????????????????????????????????????????????????????????????????????棬?????????????????????????????λalert_data_change_flag?false
????· ?????????????
????????????????????????????????????Щ??????ο??????????????
????????SS_ABSENT????????????????????????????sim??????????SS_ABSENT?????SS_READY????????????????????????????????????κβ?ο????????????????
????· ?????????????????????????????????????????ο??????????????ο??????????????????????????????????????????????
???????????????????????
??????????sim????id???
?????????????£???????sim????subId?????????????????????β???????μ?sim????????????????????????subId?????????????????????????????????????????????????????subId????????sim???????????????
??????sim????subId?key???洢???????????subId?????value??Ч???????????????????????????
????????????????????????????????????subId??????key???洢???ο?CarrierConfigFragment.java
@Override
public boolean onPreferenceChange (Preference preference?? Object newValue) {
if (preference == mProvinceSelection) {
String newProvince = String.valueOf(newValue);
if (null != mOperatorPrefModel) {
mOperatorPrefModel.setProvince(newProvince);
SimcardInfoSaver.saveSimcardProvinceBySubId(getActivity()?? mSubId?? newProvince);
}
return true;
} else if (preference == mBrandSelection) {
String newBrand = String.valueOf(newValue);
if (null != mOperatorPrefModel) {
mOperatorPrefModel.setBrand(newBrand);
SimcardInfoSaver.saveSimcardBrandBySubId(getActivity()?? mSubId?? newBrand);
}
return true;
}
return false;
}
???????????sim????????????????????????????????
???????????????????????????????subId???province??brand???????????Ч???飬??Ч???????????Ч???????棬???′????????????????????????????
private boolean alertSimcardOneIfNecessary () {
return getShouldAlertSimcardChange(SimcardDataModelInterface.SIM_CARD_ONE_INDEX?? new SimcardProvinceAndBrandSetter() {
@Override
public void setProvinceAndBrand (String province?? String brand) {
if (null != mOperatorDataModelSimOne) {
mOperatorDataModelSimOne.setProvince(SimcardDataModelInterface
.SIM_CARD_ONE_INDEX?? province);
mOperatorDataModelSimOne.setOperatorBrand(SimcardDataModelInterface
.SIM_CARD_ONE_INDEX?? brand);
}
}
});
}
private boolean alertSimcardTwoIfNecessary() {
return getShouldAlertSimcardChange(SimcardDataModelInterface.SIM_CARD_TWO_INDEX?? new SimcardProvinceAndBrandSetter() {
@Override
public void setProvinceAndBrand (String province?? String brand) {
if (null != mOperatorDataModelSimTwo) {
mOperatorDataModelSimTwo.setProvince(SimcardDataModelInterface
.SIM_CARD_TWO_INDEX?? province);
mOperatorDataModelSimTwo.setOperatorBrand(SimcardDataModelInterface
.SIM_CARD_TWO_INDEX?? brand);
}
}
});
}
private boolean getShouldAlertSimcardChange (int slotId?? final SimcardProvinceAndBrandSetter
setter) {
if (null == mSimcardDataModel) {
return false;
}
final Context c = getActivity();
if (mCurrentDataSlotId == SimcardDataModelInterface.INVALID_SIM_SLOT_ID) {
return false;
}
if (!SimcardStateManager.getShouldAlertSimcardHasPopedOut(getActivity()?? slotId)) {
return false;
}
boolean shouldAlertSimcardChangeDialog = false;
if (mSimcardDataModel.isSlotSimInserted(slotId)
&& mSimcardDataModel.isSlotOperatorSupportedBySdk(slotId)) {
int subId = SimcardDataModel.staticGetSubIdBySlotId(slotId);
String province = SimcardInfoSaver.getSimcardProvinceBySubId(getActivity()?? subId);
String brand = SimcardInfoSaver.getSimcardBrandBySubId(getActivity()?? subId);
if (SimcardInfoSaver.SIMCARD_BRAND_INVALID_VALUE.equals(brand)
|| SimcardInfoSaver.SIMCARD_PROVINCE_INVALID_VALUE.equals(province)) {
LogUtils.LogD(TAG?? "alert slot1 error " + brand + " " + province);
if (SimcardStateManager.getShouldAlertSimcardHasPopedOut(getActivity()?? slotId)) {
showReconfigSimcardAlert(c?? slotId);
shouldAlertSimcardChangeDialog = true;
} else {
shouldAlertSimcardChangeDialog = false;
}
} else {
LogUtils.LogD(TAG?? "detect simcard change and reset sdk information on slot 1.");
setter.setProvinceAndBrand(province?? brand);
}
}
return shouldAlertSimcardChangeDialog;
}
private interface SimcardProvinceAndBrandSetter {
void setProvinceAndBrand(String province?? String brand);
}
private void showReconfigSimcardAlert (final Context c?? final int slotId) {
AlertDialog.Builder builder = new AlertDialog.Builder(c);
builder.setCancelable(true);
StringBuilder sb = new StringBuilder();
sb.append(getSimCardDescriptions(slotId));
sb.append(" ");
sb.append(c.getText(R.string.detect_simcard_change_please_confirm_config));
builder.setMessage(sb.toString());
builder.setPositiveButton(android.R.string.ok?? new DialogInterface.OnClickListener() {
@Override
public void onClick (DialogInterface dialog?? int which) {
startSpecificTrafficConfigSettingsActivity(slotId);
}
});
builder.create().show();
}
????????????????????λ??????????????????????????????????????????????У?????????
@Override
public void pageInAnim () {
super.pageInAnim();
mDataTopView.animtionCircle(true);
if (null != mOperatorDataModel) {
mOperatorDataModel.requesetPkgMonthlyUsageAndTotalInByte(mCurrentDataSlotId);
}
alertSimcardOneIfNecessary();
alertSimcardTwoIfNecessary();
}
mSimDataUsageQueryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick (View v) {
...
if (SimcardDataModelInterface.SIM_CARD_ONE_INDEX == mCurrentDataSlotId) {
if (alertSimcardOneIfNecessary()) {
return;
}
} else if (SimcardDataModelInterface.SIM_CARD_TWO_INDEX == mCurrentDataSlotId) {
if (alertSimcardTwoIfNecessary()) {
return;
}
} else {
// CurrentDataSlotId is invalid?? should do nothing but return. actually?? in
// this circumstances?? data calibrate button is invisible.
return;
}
...
}
};
??????????鼰????
????· ??sdk?????????????????????????????????????????????????????? ????С???
????· ????????? ??δ???ù???sim?? ???????????????????У????
????· ????????????????? ????????????????????????????? ???????????2????????
????· ??????????????????? a.????????????????????y??? b.??????????????????????y???
????· ??????ù???sim???????????????????????????????????????λ??????????????sim????????????????????????? ??????????????????????????????????У????????
????· ?????????£??????????????ù??????????????λ???????????????????????????y??棬?????????????????????????????
????· ???????£????????δ???ù???????????????????
????· ???????????á????δ??????????sdk?????????????λ???????????????????????????????δ???ù????????2????????????
????· ?????ù?????????δ???ù???????й?4?в???????????????????????
????· δ???ù????????δ???й?4?в???????????????????????????棬???У???????????????
??????Ч??
??????????ù???sim???????????????????????????????????????????