package com.mm.android.deviceaddmodule.presenter; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.net.wifi.SupplicantState; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiInfo; import android.os.Handler; import android.os.Message; import android.text.TextUtils; import com.mm.android.deviceaddmodule.R; import com.mm.android.deviceaddmodule.contract.TipSoftApConnectWifiConstract; import com.mm.android.deviceaddmodule.helper.DeviceAddHelper; import com.mm.android.deviceaddmodule.mobilecommon.AppConsume.ProviderManager; import com.mm.android.deviceaddmodule.mobilecommon.common.LCConfiguration; import com.mm.android.deviceaddmodule.mobilecommon.entity.deviceadd.DeviceAddInfo; import com.mm.android.deviceaddmodule.mobilecommon.entity.deviceadd.DeviceIntroductionInfo; import com.mm.android.deviceaddmodule.mobilecommon.eventbus.event.NetWorkChangeCheckEvent; import com.mm.android.deviceaddmodule.mobilecommon.utils.LogUtil; import com.mm.android.deviceaddmodule.mobilecommon.utils.WifiUtil; import com.mm.android.deviceaddmodule.model.DeviceAddModel; import org.greenrobot.eventbus.EventBus; import java.lang.ref.WeakReference; public class TipSoftApConnectWifiPresenter implements TipSoftApConnectWifiConstract.Presenter { private int TIME_OUT_TIME = 15 * 1000; //连接设备热点超时时间 private static final int CONNECT_FAILED = 0; //连接热点失败 WifiUtil mDHWifiUtil; String mDeviceSn; boolean mConnectResult; boolean mBinding; //开始绑定了,防止绑定多次 WeakReference mView; DeviceIntroductionInfo mTips; Runnable mTimeOutRunnable = new Runnable() { @Override public void run() { mHandler.obtainMessage(CONNECT_FAILED).sendToTarget(); } }; private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { if (mView.get() != null && mView.get().isViewActive()) { connectHotFailed(); } } }; Runnable mReconectWifiAgainRunnable = new Runnable() { @Override public void run() { connectWifiAction(false); } }; public TipSoftApConnectWifiPresenter(TipSoftApConnectWifiConstract.View view) { mView = new WeakReference<>(view); mDHWifiUtil = new WifiUtil(mView.get().getContextInfo().getApplicationContext()); mTips = DeviceAddModel.newInstance().getDeviceInfoCache().getDevIntroductionInfo(); mDeviceSn = DeviceAddModel.newInstance().getDeviceInfoCache().getDeviceSn(); mView.get().updateWifiName(getWifiName()); } @Override public void copyWifiPwd() { ClipboardManager clipboardManager = (ClipboardManager) mView.get().getContextInfo().getSystemService(Context.CLIPBOARD_SERVICE); if (clipboardManager != null) { String wifiPwd = ""; DeviceAddInfo deviceAddInfo = DeviceAddModel.newInstance().getDeviceInfoCache(); // 支持sc码的软ap wifiw为加密的,需要密码进行连接,密码为SC码 if(DeviceAddHelper.isSupportAddBySc(deviceAddInfo)) { wifiPwd = deviceAddInfo.getSc(); } clipboardManager.setPrimaryClip(ClipData.newPlainText(null, wifiPwd)); mView.get().showToastInfo(R.string.common_copy_success); } } @Override public void dispatchHotConnected() { if(mDHWifiUtil.getCurrentWifiInfo() == null) return; LogUtil.debugLog("bz", "isConnectedDevHot(): " + isConnectedDevHot() + " mConnectResult: " + mConnectResult); if (isConnectedDevHot() && !mBinding) { mBinding = true; //通知服务已连上热点 EventBus.getDefault().post(new NetWorkChangeCheckEvent()); DeviceAddHelper.bindNetwork(new DeviceAddHelper.BindNetworkListener() { @Override public void onBindWifiListener() { mHandler.removeCallbacks(mTimeOutRunnable); mHandler.removeCallbacks(mReconectWifiAgainRunnable); mView.get().cancelProgressDialog(); mView.get().goSecurityCheckPage(); } }); } } private void connectHotFailed() { mView.get().cancelProgressDialog(); mView.get().showToastInfo(R.string.common_connect_failed); mConnectResult = false; DeviceAddInfo deviceAddInfo = DeviceAddModel.newInstance().getDeviceInfoCache(); // 支持sc码的软ap boolean isSupportAddBySc = false; if(DeviceAddHelper.isSupportAddBySc(deviceAddInfo)) { isSupportAddBySc = true; } String wifiPwd = ""; if(DeviceAddHelper.isSupportAddBySc(deviceAddInfo)) { if(deviceAddInfo.isManualInput() || TextUtils.isEmpty(deviceAddInfo.getSc())) { wifiPwd = mView.get().getContextInfo().getString(R.string.add_device_wait_to_connect_wifi_sc); } else { wifiPwd = deviceAddInfo.getSc(); } } mView.get().updateConnectFailedTipText(getHotSSID(), wifiPwd, isSupportAddBySc, deviceAddInfo.isManualInput() || TextUtils.isEmpty(deviceAddInfo.getSc())); } public void connectWifiAction(boolean isFirst) { mView.get().showProgressDialog(); mConnectResult = false; mBinding = false; mDHWifiUtil.openWifi(); if (isConnectedDevHot()) {//若已连上设备热点,不需要去连接了 dispatchHotConnected(); return; } String ssid = getHotSSID(); DeviceAddInfo deviceAddInfo = DeviceAddModel.newInstance().getDeviceInfoCache(); //缓存设备热点ssid,用于中间热点断开重新连时,作为是否连上热点的判断依据,需要重新调用bindNetwork deviceAddInfo.setSsid(ssid); //缓存当前连接的wifi ssid,便于退出软ap时恢复网络 WifiInfo wifiInfo = mDHWifiUtil.getCurrentWifiInfo(); if (wifiInfo != null) { WifiConfiguration currentConfig = mDHWifiUtil.IsExsits(wifiInfo.getSSID()); if (currentConfig != null) { deviceAddInfo.setPreviousSsid(currentConfig.SSID); } } // 支持sc码的软ap wifiw为加密的,需要密码进行连接,密码为SC码 if(DeviceAddHelper.isSupportAddBySc(deviceAddInfo)) { final String wifiPwd = deviceAddInfo.getSc(); mDHWifiUtil.openWifi(); mDHWifiUtil.disconnectCurrentWifi(getHotSSID()); mDHWifiUtil.startScan(); mHandler.postDelayed(new Runnable() { @Override public void run() { WifiUtil.WifiCipherType type = mDHWifiUtil.getCipherType(getHotSSID()); mConnectResult = mDHWifiUtil.connectWifiEx(getHotSSID(), wifiPwd, type); } }, 3000); } else { isFirst = false; mConnectResult = mDHWifiUtil.connectWifi(getHotSSID(), ""); } LogUtil.debugLog("bz", "mConnectResult : " + mConnectResult); if(isFirst){ mHandler.postDelayed(mReconectWifiAgainRunnable, TIME_OUT_TIME); } else { mHandler.postDelayed(mTimeOutRunnable, TIME_OUT_TIME); } } private String getWifiName() { String wifiName = ""; //默认空字符串,防止空指针 if (mTips != null && mTips.getStrInfos() != null) { wifiName = mTips.getStrInfos().get(DeviceAddHelper.OMSKey.SOFT_AP_MODE_WIFI_NAME); } String wifiVersion = ""; if (mTips != null && mTips.getStrInfos() != null) { wifiVersion = mTips.getStrInfos().get(DeviceAddHelper.OMSKey.SOFT_AP_MODE_WIFI_VERSION); } // wifiVersion为空,使用软Ap通用设备热点名称"DAP-XXXX" if(TextUtils.isEmpty(wifiVersion)){ if(wifiName.contains("Doorbell")){//适配海外门铃 return wifiName; } return DeviceAddHelper.AP_WIFI_NAME_DAP; } return TextUtils.isEmpty(wifiName) ? "" : wifiName; } @Override public String getHotSSID() { int appType = ProviderManager.getAppProvider().getAppType(); String wifiName = getWifiName(); //OMS后台配置的wifi名称例如“K5-xxxx” String wifiNamePre = wifiName.substring(0, wifiName.lastIndexOf("-") + 1); //取前缀例如“K5-” String wifiVersion = ""; if (mTips != null && mTips.getStrInfos() != null) { wifiVersion = mTips.getStrInfos().get(DeviceAddHelper.OMSKey.SOFT_AP_MODE_WIFI_VERSION); } String ssid = wifiNamePre + mDeviceSn; if(!TextUtils.isEmpty(wifiVersion) && wifiVersion.equalsIgnoreCase(DeviceAddHelper.AP_WIFI_VERSION_V1)){ if (appType == LCConfiguration.APP_LECHANGE_OVERSEA){ ssid = wifiNamePre + mDeviceSn; } else if (appType == LCConfiguration.APP_LECHANGE){ ssid = wifiNamePre + mDeviceSn.substring(mDeviceSn.length() - 4); //国内,序列号后四位 } } return ssid; } //是否已连上设备热点 public boolean isConnectedDevHot() { WifiInfo wifiInfo = mDHWifiUtil.getCurrentWifiInfo(); LogUtil.debugLog("bz", " " + (wifiInfo == null ? "wifiInfo == null" : wifiInfo.getSupplicantState())); if (wifiInfo == null || (SupplicantState.ASSOCIATED != wifiInfo.getSupplicantState() && SupplicantState.COMPLETED != wifiInfo.getSupplicantState())) { return false; } else { String ssid = getHotSSID(); ssid = "\"" + ssid + "\""; LogUtil.debugLog("bz", ssid + " " + wifiInfo.getSSID() + " " + wifiInfo.getSSID().equals(ssid)); int appType = ProviderManager.getAppProvider().getAppType(); if (appType == LCConfiguration.APP_LECHANGE_OVERSEA){ return wifiInfo.getSSID().contains(mDeviceSn); } else if (appType == LCConfiguration.APP_LECHANGE){ return wifiInfo.getSSID().equals(ssid); }else { return true; } } } }