优化配网进度实时更新
This commit is contained in:
@@ -167,10 +167,6 @@
|
|||||||
android:name="com.ckkj.water.permission.PermissionActivity"
|
android:name="com.ckkj.water.permission.PermissionActivity"
|
||||||
android:screenOrientation="portrait"
|
android:screenOrientation="portrait"
|
||||||
android:windowSoftInputMode="adjustResize"/>
|
android:windowSoftInputMode="adjustResize"/>
|
||||||
<activity
|
|
||||||
android:name="com.ckkj.water.device.AddDeviceActivity_cpoy2"
|
|
||||||
android:screenOrientation="portrait"
|
|
||||||
android:windowSoftInputMode="adjustResize"/>
|
|
||||||
<activity
|
<activity
|
||||||
android:name="com.ckkj.water.device.AddDeviceActivity"
|
android:name="com.ckkj.water.device.AddDeviceActivity"
|
||||||
android:screenOrientation="portrait"
|
android:screenOrientation="portrait"
|
||||||
|
|||||||
@@ -1,218 +0,0 @@
|
|||||||
package com.ckkj.water.device;
|
|
||||||
|
|
||||||
import static android.view.View.GONE;
|
|
||||||
|
|
||||||
import android.Manifest;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.graphics.drawable.AnimationDrawable;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.os.Handler;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
|
|
||||||
import com.ckkj.water.ConstantUtil;
|
|
||||||
import com.ckkj.water.R;
|
|
||||||
import com.ckkj.water.base.BaseActivity;
|
|
||||||
import com.ckkj.water.databinding.AddDeviceLayoutBinding;
|
|
||||||
import com.ckkj.water.device.mvp.DeviceContract;
|
|
||||||
import com.ckkj.water.device.mvp.DeviceImpl;
|
|
||||||
import com.ckkj.water.device.mvp.DevicePresenter;
|
|
||||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
|
||||||
import com.ckkj.water.network.BaseBean;
|
|
||||||
import com.ckkj.water.utils.manager.ActivityManager;
|
|
||||||
import com.ckkj.water.utils.manager.ThemeManager;
|
|
||||||
import com.ckkj.water.utils.show.ToastUtil;
|
|
||||||
import com.gyf.immersionbar.ImmersionBar;
|
|
||||||
import com.maning.mlkitscanner.scan.MNScanManager;
|
|
||||||
import com.maning.mlkitscanner.scan.callback.act.MNScanCallback;
|
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import pub.devrel.easypermissions.EasyPermissions;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 添加设备页面
|
|
||||||
*/
|
|
||||||
public class AddDeviceActivity_cpoy2 extends BaseActivity<AddDeviceLayoutBinding, DevicePresenter>
|
|
||||||
implements DeviceContract.DeviceView, EasyPermissions.PermissionCallbacks {
|
|
||||||
@Override
|
|
||||||
public DevicePresenter createPresenter() {
|
|
||||||
return new DevicePresenter(new DeviceImpl());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void initData(Bundle savedInstanceState) {
|
|
||||||
super.initData(savedInstanceState);
|
|
||||||
ActivityManager.addActivity(this,getClass().getSimpleName() + "_" + ConstantUtil.ADD_DEVICE_FLAG);
|
|
||||||
ImmersionBar.with(this)
|
|
||||||
.statusBarColor(R.color.mainBackgroundColor) // 设置状态栏颜色
|
|
||||||
.statusBarDarkFont(ThemeManager.isAppThemeLight(mContext)) // 设置状态栏字体为黑色
|
|
||||||
.titleBar(viewBinding.rlTitle)
|
|
||||||
.init();
|
|
||||||
viewBinding.includedTitle.tvTitle.setText(R.string.add_device_title);
|
|
||||||
// 启动帧动画
|
|
||||||
ImageView ivScanAnimation = viewBinding.ivScanAnimation;
|
|
||||||
if (ivScanAnimation.getDrawable() instanceof AnimationDrawable) {
|
|
||||||
AnimationDrawable animationDrawable = (AnimationDrawable) ivScanAnimation.getDrawable();
|
|
||||||
animationDrawable.start();
|
|
||||||
}
|
|
||||||
new Handler().postDelayed(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
// 停止帧动画
|
|
||||||
ImageView ivScanAnimation = viewBinding.ivScanAnimation;
|
|
||||||
if (ivScanAnimation.getDrawable() instanceof AnimationDrawable) {
|
|
||||||
AnimationDrawable animationDrawable = (AnimationDrawable) ivScanAnimation.getDrawable();
|
|
||||||
if (animationDrawable.isRunning()) {
|
|
||||||
animationDrawable.stop();
|
|
||||||
viewBinding.ivScanAnimation.setVisibility(GONE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},3000);
|
|
||||||
initListener();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void initListener() {
|
|
||||||
setClick(viewBinding.includedTitle.imgBack);
|
|
||||||
setClick(viewBinding.tvScanAdd);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setClick(View view) {
|
|
||||||
view.setOnClickListener(this::onClick);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onClick(View v){
|
|
||||||
switch (v.getId()){
|
|
||||||
case R.id.img_back:
|
|
||||||
finish();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case R.id.img_device_item:
|
|
||||||
Bundle bundle = new Bundle();
|
|
||||||
bundle.putInt(ConstantUtil.ACTIVITY_NAVIGATE_FLAG,100);
|
|
||||||
goTo(mContext, SelectWifiActivity.class,bundle);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case R.id.tv_scan_add:
|
|
||||||
//检测有无相机权限
|
|
||||||
String readPermission = Manifest.permission.CAMERA;
|
|
||||||
if(!hasRecordPermission(readPermission)){
|
|
||||||
getPermissionRequst(readPermission,"权限申请",
|
|
||||||
"智能浇水需要您的授权访问相机,并使用扫一扫",REQUEST_EVENT_CODE_10001);
|
|
||||||
}else{
|
|
||||||
scanQrcode();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void scanQrcode() {
|
|
||||||
//默认扫描
|
|
||||||
MNScanManager.startScan(mContext, new MNScanCallback() {
|
|
||||||
@Override
|
|
||||||
public void onActivityResult(int resultCode, Intent data) {
|
|
||||||
switch (resultCode) {
|
|
||||||
case MNScanManager.RESULT_SUCCESS:
|
|
||||||
ArrayList<String> results = data.getStringArrayListExtra(MNScanManager.INTENT_KEY_RESULT_SUCCESS);
|
|
||||||
if(results != null){
|
|
||||||
ToastUtil.showShort(mContext,results.get(0).toString());
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case MNScanManager.RESULT_FAIL:
|
|
||||||
String resultError = data.getStringExtra(MNScanManager.INTENT_KEY_RESULT_ERROR);
|
|
||||||
break;
|
|
||||||
case MNScanManager.RESULT_CANCLE:
|
|
||||||
ToastUtil.showShort(mContext,"取消扫码");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onPause() {
|
|
||||||
super.onPause();
|
|
||||||
// 停止帧动画
|
|
||||||
ImageView ivScanAnimation = viewBinding.ivScanAnimation;
|
|
||||||
if (ivScanAnimation.getDrawable() instanceof AnimationDrawable) {
|
|
||||||
AnimationDrawable animationDrawable = (AnimationDrawable) ivScanAnimation.getDrawable();
|
|
||||||
if (animationDrawable.isRunning()) {
|
|
||||||
animationDrawable.stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getLayoutResId(Bundle savedInstanceState) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void showError(String message) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void logOut(BaseBean bean) {
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onRequestPermissionsResult(int requestCode, @NonNull @NotNull String[] permissions, @NonNull @NotNull int[] grantResults) {
|
|
||||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
|
||||||
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPermissionsGranted(int requestCode, @NonNull List<String> perms) {
|
|
||||||
hidePermissionDialog();
|
|
||||||
if (requestCode == REQUEST_EVENT_CODE_10001) {
|
|
||||||
scanQrcode();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void addDeviceSuccess(WaterDeviceEntity bean) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void getDeviceDetailInfo(WaterDeviceEntity bean) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void editDeviceInfoSuccess(BaseBean bean) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void deleteDeviceSuccess(BaseBean bean) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void turnOnOffDeviceSuccess(BaseBean bean, String status) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void queryDeviceBindStatusSuccess(WaterDeviceEntity bean) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -3,6 +3,7 @@ package com.ckkj.water.device;
|
|||||||
import static android.view.View.GONE;
|
import static android.view.View.GONE;
|
||||||
import static android.view.View.VISIBLE;
|
import static android.view.View.VISIBLE;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
import android.graphics.drawable.AnimationDrawable;
|
import android.graphics.drawable.AnimationDrawable;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
@@ -150,7 +151,8 @@ public class DeviceConnectActivity extends BaseActivity<DeviceConnectLayoutBindi
|
|||||||
}
|
}
|
||||||
Log.i("TEST", "DeviceConnectActivity===== errorCode == " + errorCode + " message == " + message);
|
Log.i("TEST", "DeviceConnectActivity===== errorCode == " + errorCode + " message == " + message);
|
||||||
ToastUtil.showShort(mContext, message);
|
ToastUtil.showShort(mContext, message);
|
||||||
hideDialogLoading();
|
//配网失败,返回到设备添加页面
|
||||||
|
returnToAddDeviceAfterFailed();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -178,6 +180,28 @@ public class DeviceConnectActivity extends BaseActivity<DeviceConnectLayoutBindi
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void returnToAddDeviceAfterFailed() {
|
||||||
|
hideDialogLoading();
|
||||||
|
handler.removeCallbacksAndMessages(null);
|
||||||
|
if (animationDrawable != null && animationDrawable.isRunning()) {
|
||||||
|
animationDrawable.stop();
|
||||||
|
animationDrawable = null;
|
||||||
|
}
|
||||||
|
provisioningStarted = false;
|
||||||
|
isBleConnecting = false;
|
||||||
|
isBleConnected = false;
|
||||||
|
|
||||||
|
if (espProvisionManager != null) {
|
||||||
|
espProvisionManager.setCallback(null);
|
||||||
|
espProvisionManager.disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
Intent intent = new Intent(this, AddDeviceActivity.class);
|
||||||
|
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
startActivity(intent);
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
|
||||||
private void connectBleDevice() {
|
private void connectBleDevice() {
|
||||||
if (mBleDeviceEntity == null || espProvisionManager == null) {
|
if (mBleDeviceEntity == null || espProvisionManager == null) {
|
||||||
ToastUtil.showShort(mContext, "\u8bbe\u5907\u8fde\u63a5\u672a\u521d\u59cb\u5316");
|
ToastUtil.showShort(mContext, "\u8bbe\u5907\u8fde\u63a5\u672a\u521d\u59cb\u5316");
|
||||||
|
|||||||
@@ -39,13 +39,17 @@ public class EspProvisionManager {
|
|||||||
private static final long CONNECT_COOLDOWN = 1200L;
|
private static final long CONNECT_COOLDOWN = 1200L;
|
||||||
private static final long QUICK_DISCONNECT_WINDOW = 3000L;
|
private static final long QUICK_DISCONNECT_WINDOW = 3000L;
|
||||||
private static final long RETRY_DELAY = 1200L;
|
private static final long RETRY_DELAY = 1200L;
|
||||||
|
private static final long PROGRESS_UPDATE_INTERVAL = 500L;
|
||||||
private static final int MAX_CONNECT_RETRY = 2;
|
private static final int MAX_CONNECT_RETRY = 2;
|
||||||
|
private static final int MAX_AUTO_PROGRESS = 99;
|
||||||
|
|
||||||
private ESPDevice espDevice;
|
private ESPDevice espDevice;
|
||||||
private ProvisionCallback callback;
|
private ProvisionCallback callback;
|
||||||
private boolean connecting;
|
private boolean connecting;
|
||||||
private boolean connected;
|
private boolean connected;
|
||||||
private boolean provisioning;
|
private boolean provisioning;
|
||||||
|
private int provisionProgress;
|
||||||
|
private int provisionTargetProgress;
|
||||||
private boolean eventBusRegistered;
|
private boolean eventBusRegistered;
|
||||||
private boolean ignoreNextDisconnectEvent;
|
private boolean ignoreNextDisconnectEvent;
|
||||||
private boolean expectDisconnected; // 标记是否预期断开(配网成功后)
|
private boolean expectDisconnected; // 标记是否预期断开(配网成功后)
|
||||||
@@ -95,6 +99,21 @@ public class EspProvisionManager {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private final Runnable provisionProgressTask = new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (!provisioning) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (provisionProgress < provisionTargetProgress) {
|
||||||
|
notifyProvisioning(provisionProgress + 1);
|
||||||
|
}
|
||||||
|
if (provisionProgress < MAX_AUTO_PROGRESS) {
|
||||||
|
mainHandler.postDelayed(provisionProgressTask, PROGRESS_UPDATE_INTERVAL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
private EspProvisionManager(Context context) {
|
private EspProvisionManager(Context context) {
|
||||||
this.context = context.getApplicationContext();
|
this.context = context.getApplicationContext();
|
||||||
this.mainHandler = new Handler(Looper.getMainLooper());
|
this.mainHandler = new Handler(Looper.getMainLooper());
|
||||||
@@ -137,6 +156,10 @@ public class EspProvisionManager {
|
|||||||
return provisioning;
|
return provisioning;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getProvisionProgress() {
|
||||||
|
return provisionProgress;
|
||||||
|
}
|
||||||
|
|
||||||
public void connect(String deviceAddress, String deviceName) {
|
public void connect(String deviceAddress, String deviceName) {
|
||||||
connect(deviceAddress, deviceName, AppConfig.BLUETOOTH_DEVICE_UUID);
|
connect(deviceAddress, deviceName, AppConfig.BLUETOOTH_DEVICE_UUID);
|
||||||
}
|
}
|
||||||
@@ -277,9 +300,12 @@ public class EspProvisionManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
provisioning = true;
|
provisioning = true;
|
||||||
|
provisionProgress = 0;
|
||||||
|
provisionTargetProgress = 29;
|
||||||
mainHandler.removeCallbacks(provisionTimeoutTask);
|
mainHandler.removeCallbacks(provisionTimeoutTask);
|
||||||
mainHandler.postDelayed(provisionTimeoutTask, ProvisionConfig.PROVISION_TIMEOUT);
|
mainHandler.postDelayed(provisionTimeoutTask, ProvisionConfig.PROVISION_TIMEOUT);
|
||||||
notifyProvisioning(0);
|
notifyProvisioning(0);
|
||||||
|
startProvisionProgressTask();
|
||||||
|
|
||||||
espDevice.provision(ssid, password == null ? "" : password, new ProvisionListener() {
|
espDevice.provision(ssid, password == null ? "" : password, new ProvisionListener() {
|
||||||
@Override
|
@Override
|
||||||
@@ -289,7 +315,7 @@ public class EspProvisionManager {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void wifiConfigSent() {
|
public void wifiConfigSent() {
|
||||||
notifyProvisioning(30);
|
advanceProvisionProgress(30, 59);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -300,7 +326,7 @@ public class EspProvisionManager {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void wifiConfigApplied() {
|
public void wifiConfigApplied() {
|
||||||
notifyProvisioning(60);
|
advanceProvisionProgress(60, MAX_AUTO_PROGRESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -456,9 +482,12 @@ public class EspProvisionManager {
|
|||||||
private void resetState(boolean clearDevice) {
|
private void resetState(boolean clearDevice) {
|
||||||
mainHandler.removeCallbacks(connectionTimeoutTask);
|
mainHandler.removeCallbacks(connectionTimeoutTask);
|
||||||
mainHandler.removeCallbacks(provisionTimeoutTask);
|
mainHandler.removeCallbacks(provisionTimeoutTask);
|
||||||
|
stopProvisionProgressTask();
|
||||||
connecting = false;
|
connecting = false;
|
||||||
connected = false;
|
connected = false;
|
||||||
provisioning = false;
|
provisioning = false;
|
||||||
|
provisionProgress = 0;
|
||||||
|
provisionTargetProgress = 0;
|
||||||
ignoreNextDisconnectEvent = false;
|
ignoreNextDisconnectEvent = false;
|
||||||
expectDisconnected = false;
|
expectDisconnected = false;
|
||||||
if (clearDevice) {
|
if (clearDevice) {
|
||||||
@@ -478,6 +507,7 @@ public class EspProvisionManager {
|
|||||||
|
|
||||||
private void finishProvisionSuccess() {
|
private void finishProvisionSuccess() {
|
||||||
mainHandler.removeCallbacks(provisionTimeoutTask);
|
mainHandler.removeCallbacks(provisionTimeoutTask);
|
||||||
|
stopProvisionProgressTask();
|
||||||
provisioning = false;
|
provisioning = false;
|
||||||
expectDisconnected = true; // 标记为预期断开
|
expectDisconnected = true; // 标记为预期断开
|
||||||
notifyProvisioning(100);
|
notifyProvisioning(100);
|
||||||
@@ -486,10 +516,27 @@ public class EspProvisionManager {
|
|||||||
|
|
||||||
private void finishProvisionFailed(int errorCode, String message) {
|
private void finishProvisionFailed(int errorCode, String message) {
|
||||||
mainHandler.removeCallbacks(provisionTimeoutTask);
|
mainHandler.removeCallbacks(provisionTimeoutTask);
|
||||||
|
stopProvisionProgressTask();
|
||||||
provisioning = false;
|
provisioning = false;
|
||||||
notifyFailed(errorCode, message);
|
notifyFailed(errorCode, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void advanceProvisionProgress(int minProgress, int targetProgress) {
|
||||||
|
int nextProgress = Math.max(provisionProgress, minProgress);
|
||||||
|
provisionTargetProgress = Math.max(nextProgress, Math.min(targetProgress, MAX_AUTO_PROGRESS));
|
||||||
|
notifyProvisioning(nextProgress);
|
||||||
|
startProvisionProgressTask();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void startProvisionProgressTask() {
|
||||||
|
mainHandler.removeCallbacks(provisionProgressTask);
|
||||||
|
mainHandler.postDelayed(provisionProgressTask, PROGRESS_UPDATE_INTERVAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void stopProvisionProgressTask() {
|
||||||
|
mainHandler.removeCallbacks(provisionProgressTask);
|
||||||
|
}
|
||||||
|
|
||||||
private String getProvisionFailureMessage(ESPConstants.ProvisionFailureReason failureReason) {
|
private String getProvisionFailureMessage(ESPConstants.ProvisionFailureReason failureReason) {
|
||||||
if (failureReason == ESPConstants.ProvisionFailureReason.AUTH_FAILED) {
|
if (failureReason == ESPConstants.ProvisionFailureReason.AUTH_FAILED) {
|
||||||
return "WiFi 密码错误";
|
return "WiFi 密码错误";
|
||||||
@@ -540,11 +587,13 @@ public class EspProvisionManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void notifyProvisioning(final int progress) {
|
private void notifyProvisioning(final int progress) {
|
||||||
|
provisionProgress = Math.max(0, Math.min(progress, 100));
|
||||||
runOnMainThread(new Runnable() {
|
runOnMainThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
provisionProgress = Math.max(0, Math.min(progress, 100));
|
||||||
if (callback != null) {
|
if (callback != null) {
|
||||||
callback.onProvisioning(progress);
|
callback.onProvisioning(provisionProgress);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user