AccessPoint accessPoint = new AccessPoint(getActivity(), result);
accessPoints.add(accessPoint);
apMap.put(accessPoint.ssid, accessPoint);
/// M: add ap to category @{ if (mExt.isCatogoryExist()) { if
(mExt.isTustAP(accessPoint.ssid,accessPoint.security)) {
mTrustAPCategory.addPreference(accessPoint); } else {
mNewAPCategory.addPreference(accessPoint); } } } } }
/// M: refresh category
mExt.refreshCategory(getPreferenceScreen()); ArrayList origAccessPoints = new ArrayList(accessPoints.size()); origAccessPoints.addAll(accessPoints); try {
Collections.sort(accessPoints); } catch (ClassCastException e) { Xlog.d(TAG,\exception;origAccessPoints=\ + origAccessPoints);
return origAccessPoints;
} catch (UnsupportedOperationException e) { Xlog.d(TAG,\exception;origAccessPoints=\ + origAccessPoints);
return origAccessPoints; }
return accessPoints;
} 3. 配置 AP 参数
当用户在 WifiSettings 界面上选择了一个 AP 后,会显示配置 AP 参数的一个对话框 @Override
public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
if (preference instanceof AccessPoint) {
mSelectedAccessPoint = (AccessPoint) preference; /** Bypass dialog for unsecured, unsaved networks */
if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE && mSelectedAccessPoint.networkId == INVALID_NETWORK_ID) { /// M: support open ap wps test @{
if (mSelectedAccessPoint.isOpenApWPSSupported()) { showDialog(mSelectedAccessPoint, false); } else {
mSelectedAccessPoint.generateOpenNetworkConfig();
mWifiManager.connect(mSelectedAccessPoint.getConfig(), mConnectListener);
mManuallyConnect = true; } } else {
showDialog(mSelectedAccessPoint, false); } } else {
return super.onPreferenceTreeClick(screen, preference); }
return true;
}
如果WIFI没有加密,直接调用mSelectedAccessPoint.generateOpenNetworkConfig()生成一个不加密的WifiConfiguration;如果是加密的WIFI,就调用showConfigUi()方法来显示输入密码框
private void showDialog(AccessPoint accessPoint, boolean edit) { if (mDialog != null) {
removeDialog(WIFI_DIALOG_ID); mDialog = null;
mAccessPointSavedState = null; }
// Save the access point and edit mode mDlgAccessPoint = accessPoint; mDlgEdit = edit;
showDialog(WIFI_DIALOG_ID); }
@Override
public Dialog onCreateDialog(int dialogId) { switch (dialogId) {
case WIFI_DIALOG_ID:
AccessPoint ap = mDlgAccessPoint; // For manual launch if (ap == null) { // For re-launch from saved state if (mAccessPointSavedState != null) {
ap = new AccessPoint(getActivity(), mAccessPointSavedState);
// For repeated orientation changes mDlgAccessPoint = ap; } }
// If it's still null, fine, it's for Add Network mSelectedAccessPoint = ap;
/// M: record priority of selected ap @{ if (mSelectedAccessPoint != null && mSelectedAccessPoint.getConfig() != null) {
//store the former priority value before user modification
mExt.recordPriority(mSelectedAccessPoint.getConfig().priority); } else {
mExt.recordPriority(-1); }
mDialog = new WifiDialog(getActivity(), this, ap, mDlgEdit); return mDialog; }
return super.onCreateDialog(dialogId);
}
这段代码保存accessPoint后就调用showDialog(WIFI_DIALOG_ID)了,在onCreateDialog()初始化方法中判断mDlgAccessPoint是否为null,如果为null就调用AccessPoint的第三个构造方法从保存的状态中生成一个AccessPoint,最后new WifiDialog(getActivity(), this, ap, mDlgEdit)生成一个WifiDialog,这个WifiDialog继承自AlertDialog,也就是它,最终将对话框展现在我们面前,WifiDialog构造函数的第二个参数为DialogInterface.OnClickListener的监听器,设置为this表示类本身对按钮点击事件进行响应
4. 连接AP
public void onClick(DialogInterface dialogInterface, int button) {
if (button == WifiDialog.BUTTON_FORGET && mSelectedAccessPoint != null) { forget();
} else if (button == WifiDialog.BUTTON_SUBMIT) { submit(mDialog.getController()); }
代码判断弹出的对话框是WIFI热点抛弃还是WIFI连接,并做出相应的处理 void submit(WifiConfigController configController) {
final WifiConfiguration config = configController.getConfig(); try {
if (config != null && FeatureOption.MTK_EAP_SIM_AKA && config.IMSI != null) {
if (config.toString().contains(\SIM\) || config.toString().contains(\)) {
// cannot use eap-sim/aka under airplane mode
if (Settings.System.getInt(this.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) == 1) { Toast.makeText(getActivity(),
R.string.eap_sim_aka_airplanemode, Toast.LENGTH_LONG).show(); return; }
// cannot use eap-sim/aka without a sim/usimcard if (config.IMSI.equals(\)) { Toast.makeText(getActivity(),
R.string.eap_sim_aka_no_sim_error, Toast.LENGTH_LONG).show(); return; }
// cannot use eap-sim/aka if user doesn't select a sim slot if ((FeatureOption.MTK_GEMINI_SUPPORT) && (config.IMSI.equals(\))) {
Toast.makeText(getActivity(),
R.string.eap_sim_aka_no_sim_slot_selected,Toast.LENGTH_LONG).show(); return; } }
}
} catch (Exception e) {
Xlog.d(TAG,\ + e.toString()); }
手动设置就调用被点击AccessPoint 项的getConfig()方法读取WifiConfiguration信息,如果不为null调用connectNetwork(mSelectedAccessPoint.networkId)连接网络。