package com.rockchip.smart.rockhome.fragment; import android.Manifest; import android.content.pm.PackageManager; import android.graphics.Color; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.ActivityCompat; import android.support.v4.app.Fragment; import android.text.method.HideReturnsTransformationMethod; import android.text.method.PasswordTransformationMethod; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.rockchip.smart.rockhome.R; import com.rockchip.smart.rockhome.WifiListDialogFragment; import com.rockchip.smart.rockhome.WifiListFragment; import com.rockchip.smart.rockhome.WifiInfo; import com.rockchip.smart.rockhome.softap.Constants; import com.rockchip.smart.rockhome.softap.SoftapDeviceAdapter; import com.rockchip.smart.rockhome.softap.WifiManager; import com.rockchip.smart.rockhome.softap.http.ProvisioningClient; import com.rockchip.smart.rockhome.view.LoadingView; import org.json.JSONException; import java.io.IOException; import java.util.List; /** * Created by GJK on 2018/11/9. */ public class WifiFragment extends Fragment implements View.OnClickListener { private static final String TAG = WifiFragment.class.getSimpleName(); private static ContentFragment mContentFragment; private static final int PERMISSION_REQUEST_CODE = 0; private static final String[] NEEDED_PERMISSIONS = new String[]{ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.ACCESS_WIFI_STATE, Manifest.permission.CHANGE_NETWORK_STATE, Manifest.permission.CHANGE_WIFI_MULTICAST_STATE, Manifest.permission.CHANGE_WIFI_STATE, }; private boolean mHasPermission; // UI private LinearLayout mLlGuide; private LinearLayout mLlDeviceList; private LinearLayout mLlNoDevice; private LinearLayout mLlWifi; private TextView mTvLlWifiSoftApName; private TextView mTvLlWifiSsid; private EditText mEtLlWifiPwd; private TextView mBtLlWifiConfirm; private Button mBtSoftApScan; private ListView mLvDeviceList; private ImageView mIvPwdLock; private ImageView mIvExpand; private SoftapDeviceAdapter mSoftapDeviceAdapter; private LoadingView mLoadingView; private WifiManager mWifiManager; private ProvisioningClient mClient; private WifiListDialogFragment mWifiListDialogFragment; private boolean mShowPwd; private STATE mState = STATE.Layout_Guide; private enum STATE { Layout_Guide, Layout_NoDevice, Layout_DeviceList, Layout_Wifi; } public static WifiFragment newInstance(ContentFragment contentFragment) { mContentFragment = contentFragment; WifiFragment fragment = new WifiFragment(); return fragment; } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mWifiManager = WifiManager.getInstance(getActivity()); mSoftapDeviceAdapter = new SoftapDeviceAdapter(getActivity(), new SoftapDeviceAdapter.SoftapDeviceAdapterCallback() { @Override public void onItemClick(WifiInfo info) { mWifiManager.connect(info, "", new WifiManager.WifiConnectListener() { @Override public void onConnectStart(WifiInfo info) { Log.d(TAG, "正在连接到'" + info.getSsid() + "'"); mLoadingView.show("正在连接到'" + info.getSsid() + "'"); } @Override public void onConnectFailed(WifiInfo info, int error) { mLoadingView.dismiss(); Log.d(TAG, "onConnectFailed '" + info.getSsid() + "'" + ", error:" + error); if (error == -1) { showMessage(getActivity().getResources().getString(R.string.need_remove_network_first)); } else { showMessage(getActivity().getResources().getString(R.string.connect_wifi_fail)); } } @Override public void onConnectSuccess(WifiInfo info, int ip) { Log.d(TAG, "onConnectSuccess '" + info.getSsid() + "'"); mLoadingView.dismiss(); showState(STATE.Layout_Wifi); showMessage(getActivity().getResources().getString(R.string.connect_wifi_success)); } }); } }); mLoadingView = new LoadingView(getActivity()); mClient = ProvisioningClient.getProvisioningClient(getActivity()); mWifiListDialogFragment = WifiListDialogFragment.createDialog(new WifiListFragment.WifiCallback() { @Override public void onWifiPicked(WifiInfo info) { Log.d(TAG, "onWifiPicked " + info.getSsid()); mWifiListDialogFragment.dismiss(); mTvLlWifiSsid.setText(info.getSsid()); } @Override public void onWifiPickCancelled() { Log.d(TAG, "onWifiPickCancelled"); } }); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_activity_rockhome_wifi, container, false); mBtSoftApScan = (Button) rootView.findViewById(R.id.search_devices); mBtSoftApScan.setOnClickListener(this); mLlGuide = (LinearLayout) rootView.findViewById(R.id.fragment_activity_rockhome_wifi_ll_guide); mLlDeviceList = (LinearLayout) rootView.findViewById(R.id.fragment_activity_rockhome_wifi_ll_deviceList); mLvDeviceList = (ListView) rootView.findViewById(R.id.fragment_activity_rockhome_wifi_lv_deviceList); mLvDeviceList.setAdapter(mSoftapDeviceAdapter); mLlNoDevice = (LinearLayout) rootView.findViewById(R.id.fragment_activity_rockhome_wifi_ll_nodevice); mLlWifi = (LinearLayout) rootView.findViewById(R.id.fragment_activity_rockhome_wifi_ll_wifi); mTvLlWifiSoftApName = (TextView) rootView.findViewById(R.id.fragment_activity_rockhome_wifi_tv_ap); mTvLlWifiSsid = (TextView) rootView.findViewById(R.id.fragment_activity_rockhome_wifi_tv_input_ssid); mTvLlWifiSsid.setOnClickListener(this); mEtLlWifiPwd = (EditText) rootView.findViewById(R.id.fragment_activity_rockhome_wifi_et_pwd); mIvExpand = (ImageView) rootView.findViewById(R.id.fragment_activity_rockhome_wifi_iv_expand); mIvExpand.setOnClickListener(this); mIvPwdLock = (ImageView) rootView.findViewById(R.id.fragment_activity_rockhome_wifi_iv_pwd_lock); mIvPwdLock.setOnClickListener(this); mBtLlWifiConfirm = (TextView) rootView.findViewById(R.id.fragment_activity_rockhome_wifi_tv_confirm); mBtLlWifiConfirm.setOnClickListener(this); mHasPermission = checkPermission(); if (!mHasPermission) { requestPermission(); } return rootView; } @Override public void onDestroy() { super.onDestroy(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.search_devices: mWifiManager.search(Constants.SOFTAP_REGEX, new WifiManager.SearchWifiListener() { @Override public void onScanStart() { Log.d(TAG, "onScanStart..."); mLoadingView.show("正在扫描附近设备"); } @Override public void onScanFailed(WifiManager.ErrorType errorType) { Log.d(TAG, "onScanFailed..." + errorType); mLoadingView.dismiss(); switch (errorType) { case NO_WIFI_FOUND: break; case SEARCH_WIFI_TIMEOUT: break; } } @Override public void onScanSuccess(List results) { Log.d(TAG, "onScanSuccess..." + results.size()); for (WifiInfo info : results) { Log.d(TAG, info.toString()); } mLoadingView.dismiss(); if (results.isEmpty()) { showState(STATE.Layout_NoDevice); } else { mSoftapDeviceAdapter.setDevices(results); mLvDeviceList.removeHeaderView(mHeader); initHeader(); mLvDeviceList.addHeaderView(mHeader); showState(STATE.Layout_DeviceList); } } }); break; case R.id.fragment_activity_rockhome_wifi_iv_expand: new Thread(new Runnable() { @Override public void run() { try { mLoadingView.show(getActivity().getResources().getString(R.string.dialog_getting_wifilist)); List list = mClient.getWifiListInfo(); int times = 0; while (list.isEmpty() && times < 3) { times++; list = mClient.getWifiListInfo(); } mWifiListDialogFragment.setWifiList(list); getActivity().runOnUiThread(new Runnable() { @Override public void run() { mWifiListDialogFragment.show(getActivity().getFragmentManager(), "WifiList"); } }); } catch (JSONException | IOException e) { Log.d(TAG, Log.getStackTraceString(e)); } finally { mLoadingView.dismiss(); } } }).start(); break; case R.id.fragment_activity_rockhome_wifi_tv_confirm: final String ssid = mTvLlWifiSsid.getText().toString().trim(); final String pwd = mEtLlWifiPwd.getText().toString().trim(); if (ssid == null || ssid.isEmpty() || ssid.equals(getString(R.string.no_wifi))) { showMessage(getString(R.string.select_wifi)); return; } else if (!mContentFragment.verifyWifiPwd(pwd)) { showMessage(getString(R.string.pwd_invalid)); return; } new Thread(new Runnable() { @Override public void run() { try { mLoadingView.show(getActivity().getResources().getString(R.string.dialog_wifi_configuring)); boolean result = mClient.postWifiSetupInfo(ssid, pwd); Thread.sleep(3000); if (result) { for (int i=0; i<20; i++) { result = mClient.checkWifiState(); if (result) { showMessage(getActivity().getResources().getString(R.string.connect_wifi_success)); mClient.postConnectResult(true); showState(STATE.Layout_Guide); mWifiManager.unregisterNetworkCallback(); break; } else { Thread.sleep(3000); } } if (!result) { showMessage(getActivity().getResources().getString(R.string.connect_wifi_fail)); mClient.postConnectResult(false); } } else { showMessage(getActivity().getResources().getString(R.string.send_msg_error)); } } catch (Exception e) { Log.d(TAG, Log.getStackTraceString(e)); } finally { mLoadingView.dismiss(); } } }).start(); break; case R.id.fragment_activity_rockhome_wifi_iv_pwd_lock: mShowPwd = !mShowPwd; if (mShowPwd) { mIvPwdLock.setImageResource(R.drawable.password_input_02); mEtLlWifiPwd.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); } else { mIvPwdLock.setImageResource(R.drawable.password_input_01); mEtLlWifiPwd.setTransformationMethod(PasswordTransformationMethod.getInstance()); } break; } } private View mHeader; private View initHeader() { TextView tv = new TextView(getContext()); tv.setText(getActivity().getResources().getString(R.string.devices_searched)); tv.setTextColor(Color.BLACK); return (mHeader = tv); } private void showState(final STATE state) { mState = state; getActivity().runOnUiThread(new Runnable() { @Override public void run() { switch (state) { case Layout_Guide: mBtSoftApScan.setVisibility(View.VISIBLE); mLlGuide.setVisibility(View.VISIBLE); mLlNoDevice.setVisibility(View.GONE); mLlDeviceList.setVisibility(View.GONE); mLlWifi.setVisibility(View.GONE); break; case Layout_NoDevice: mBtSoftApScan.setVisibility(View.VISIBLE); mLlGuide.setVisibility(View.GONE); mLlNoDevice.setVisibility(View.VISIBLE); mLlDeviceList.setVisibility(View.GONE); mLlWifi.setVisibility(View.GONE); break; case Layout_DeviceList: mBtSoftApScan.setVisibility(View.VISIBLE); mLlGuide.setVisibility(View.GONE); mLlNoDevice.setVisibility(View.GONE); mLlDeviceList.setVisibility(View.VISIBLE); mLlWifi.setVisibility(View.GONE); break; case Layout_Wifi: mBtSoftApScan.setVisibility(View.GONE); mLlGuide.setVisibility(View.GONE); mLlNoDevice.setVisibility(View.GONE); mLlDeviceList.setVisibility(View.GONE); mLlWifi.setVisibility(View.VISIBLE); Log.d(TAG, "setText wifiSSid:" + mWifiManager.getConnectWifiSsid()); mTvLlWifiSoftApName.setText(mWifiManager.getConnectWifiSsid()); break; } } }); } private void showMessage(final String msg) { getActivity().runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT).show(); } }); } private boolean checkPermission() { for (String permission : NEEDED_PERMISSIONS) { if (ActivityCompat.checkSelfPermission(getActivity(), permission) != PackageManager.PERMISSION_GRANTED) { return false; } } return true; } private void requestPermission() { ActivityCompat.requestPermissions(getActivity(), NEEDED_PERMISSIONS, PERMISSION_REQUEST_CODE); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); } }