diff --git a/app/src/main/java/com/ckkj/water/base/BaseFragment.java b/app/src/main/java/com/ckkj/water/base/BaseFragment.java index 36a1f33..4e0ec31 100644 --- a/app/src/main/java/com/ckkj/water/base/BaseFragment.java +++ b/app/src/main/java/com/ckkj/water/base/BaseFragment.java @@ -100,6 +100,10 @@ public abstract class BaseFragment e return EasyPermissions.hasPermissions(mContext, permission); } + public boolean hasRecordPermission(String[] permission) { + return EasyPermissions.hasPermissions(mContext, permission); + } + /** * 获取权限 * @@ -145,6 +149,50 @@ public abstract class BaseFragment e }); } + /** + * 一次获取多个权限 + * + * @param permis + * @param title + * @param content + * @param requestCode String... permis + */ + public void getMorePermissionRequst(String[] permis, String title, String content, int requestCode) { + if (EasyPermissions.hasPermissions(mContext, permis)) { + // 已有权限,不需要处理 + return; + } + // 还没权限,弹自定义确认弹窗 + showDialogtextInterBackKey( + null, + false, + false, + title, + content, + getString(R.string.button_deny), + getString(R.string.button_allow), + new BaseFragment.OnDialogClick() { + @Override + public void onCancelClick() { + } + + @Override + public void onConfirmClick() { + showPermissionDialog(mContext.getResources().getDrawable(R.mipmap.img_permission_file), + true, title, content); + boolean shouldShowRationale = false; + for (String p : permis) { + if (ActivityCompat.shouldShowRequestPermissionRationale(mContext, p)) { + shouldShowRationale = true; + break; + } + } + // 使用 EasyPermissions 请求权限(系统决定是否弹系统框) + EasyPermissions.requestPermissions(mContext, content, requestCode, permis); + } + },false); + } + /** * 判断Fragment是否真正对用户可见 */ diff --git a/app/src/main/java/com/ckkj/water/device/AddDeviceActivity.java b/app/src/main/java/com/ckkj/water/device/AddDeviceActivity.java index d53c8a9..d11452d 100644 --- a/app/src/main/java/com/ckkj/water/device/AddDeviceActivity.java +++ b/app/src/main/java/com/ckkj/water/device/AddDeviceActivity.java @@ -1,10 +1,8 @@ package com.ckkj.water.device; import static android.view.View.GONE; -import static android.view.View.VISIBLE; import android.Manifest; -import android.content.Context; import android.content.Intent; import android.graphics.drawable.AnimationDrawable; import android.os.Bundle; @@ -35,7 +33,6 @@ import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; -import no.nordicsemi.android.ble.BleManager; import pub.devrel.easypermissions.EasyPermissions; /** @@ -190,7 +187,7 @@ public class AddDeviceActivity extends BaseActivity implements DeviceContract.DeviceView { + + private WaterDeviceEntity mDeviceEntity; + @Override public DevicePresenter createPresenter() { return new DevicePresenter(new DeviceImpl()); @@ -27,7 +30,14 @@ public class DeviceInfoActivity extends BaseActivity() { + .subscribe(new Observer>() { @Override public void onSubscribe(@NonNull Disposable d) { } @Override - public void onNext(@NonNull BaseBean bean) { + public void onNext(@NonNull BaseBean bean) { if (bean.getCode() == 200) { - callBack.success(bean,0); + callBack.success(bean.getData(),0); } else { callBack.fail(bean.getMessage()); } diff --git a/app/src/main/java/com/ckkj/water/device/mvp/DevicePresenter.java b/app/src/main/java/com/ckkj/water/device/mvp/DevicePresenter.java index b3b6e42..b2a0fad 100644 --- a/app/src/main/java/com/ckkj/water/device/mvp/DevicePresenter.java +++ b/app/src/main/java/com/ckkj/water/device/mvp/DevicePresenter.java @@ -36,9 +36,9 @@ public class DevicePresenter extends BasePresenter { // json.put("deviceEm","213123123123"); // json.put("deviceSn","sdfsd32423gdfgdf3"); // json.put("fwVer","fwVer-56565644"); - impl.addDevice(json, new IndexContract.CallBack() { + impl.addDevice(json, new IndexContract.CallBack() { @Override - public void success(BaseBean bean,int total) { + public void success(WaterDeviceEntity bean,int total) { if(DevicePresenter.this.getView() != null){ DevicePresenter.this.getView().addDeviceSuccess(bean); } diff --git a/app/src/main/java/com/ckkj/water/index/IndexFragment.java b/app/src/main/java/com/ckkj/water/index/IndexFragment.java index 778ad7e..20fb83f 100644 --- a/app/src/main/java/com/ckkj/water/index/IndexFragment.java +++ b/app/src/main/java/com/ckkj/water/index/IndexFragment.java @@ -1,7 +1,12 @@ package com.ckkj.water.index; import android.Manifest; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothManager; +import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.text.TextUtils; @@ -9,15 +14,19 @@ import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; import com.ckkj.water.AppConfig; import com.ckkj.water.R; import com.ckkj.water.base.BaseFragment; import com.ckkj.water.custom.view.CustomRefreshHeader; import com.ckkj.water.databinding.IndexFragmentLayoutBinding; +import com.ckkj.water.ConstantUtil; import com.ckkj.water.device.AddDeviceActivity; import com.ckkj.water.device.AddDeviceActivity_copy; import com.ckkj.water.device.DeviceControlActivity; +import com.ckkj.water.device.DeviceReNameActivity; +import com.ckkj.water.device.SelectWifiActivity; import com.ckkj.water.history.entity.WateringRecord; import com.ckkj.water.index.adapter.DeviceAdapter; import com.ckkj.water.index.entity.WaterDeviceEntity; @@ -49,6 +58,15 @@ public class IndexFragment extends BaseFragment devList = new ArrayList<>(); private int mCurrentPage = 1; + // 扫码待配网设备 + private WaterDeviceEntity pendingDeviceEntity = null; + + // 蓝牙相关 + private static final int REQUEST_EVENT_CODE_BLUETOOTH_PERMISSION = 10002; + private static final int REQUEST_ENABLE_BT = 10003; + private BluetoothAdapter bluetoothAdapter; + private boolean bluetoothReady = false; + @Override protected void initArgs(Bundle bundle) { } @@ -242,14 +260,119 @@ public class IndexFragment extends BaseFragment= Build.VERSION_CODES.S) { + String[] permissions = { + Manifest.permission.BLUETOOTH_SCAN, + Manifest.permission.BLUETOOTH_CONNECT, + Manifest.permission.ACCESS_FINE_LOCATION + }; + if (!hasRecordPermission(permissions)) { + getMorePermissionRequst(permissions, + "蓝牙权限申请", + "智能浇水需要您的授权,获取蓝牙权限添加设备", + REQUEST_EVENT_CODE_BLUETOOTH_PERMISSION); + return false; + } + } else { + // Android 12 以下需要位置权限 + if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) + != PackageManager.PERMISSION_GRANTED) { + requestPermissions(new String[]{ + Manifest.permission.ACCESS_FINE_LOCATION + }, REQUEST_EVENT_CODE_BLUETOOTH_PERMISSION); + return false; + } + } + return true; + } + + /** + * 初始化蓝牙适配器并检查蓝牙是否开启 + * @return true 表示蓝牙已开启,false 表示未开启或不支持 + */ + private boolean initBluetooth() { + BluetoothManager bluetoothManager = (BluetoothManager) mContext.getSystemService(Context.BLUETOOTH_SERVICE); + if (bluetoothManager != null) { + bluetoothAdapter = bluetoothManager.getAdapter(); + } + + if (bluetoothAdapter == null) { + ToastUtil.showShort(mContext, "设备不支持蓝牙"); + return false; + } + + if (!bluetoothAdapter.isEnabled()) { + // 蓝牙未开启,请求开启 + Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); + startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); + return false; + } + + bluetoothReady = true; + return true; + } + + /** + * 跳转设备配网页面 + */ + private void goToDeviceProvisioning() { + if (pendingDeviceEntity == null) { + ToastUtil.showShort(mContext, "设备信息异常"); + return; + } + Bundle bundle = new Bundle(); + bundle.putInt(ConstantUtil.ACTIVITY_NAVIGATE_FLAG, 100); // 100 = 来自扫码添加 + bundle.putSerializable("ble_device_entity", pendingDeviceEntity); + goTo(mContext, SelectWifiActivity.class, bundle); + pendingDeviceEntity = null; + } + @Override public void onDestroyView() { @@ -270,13 +393,69 @@ public class IndexFragment extends BaseFragment perms) { + hidePermissionDialog(); + if (requestCode == REQUEST_EVENT_CODE_10001) { + scanQrcode(); + } else if (requestCode == REQUEST_EVENT_CODE_BLUETOOTH_PERMISSION) { + // 蓝牙权限获取成功,检查蓝牙状态 + if (initBluetooth()) { + goToDeviceProvisioning(); + } + } + } + + @Override + public void onPermissionsDenied(int requestCode, @NonNull List perms) { + hidePermissionDialog(); + if (requestCode == REQUEST_EVENT_CODE_BLUETOOTH_PERMISSION) { + ToastUtil.showShort(mContext, "需要蓝牙权限才能添加设备"); + } + } + @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); hidePermissionDialog(); + if (requestCode == REQUEST_EVENT_CODE_10001) { + // 相机权限回调 scanQrcode(); + } else if (requestCode == REQUEST_EVENT_CODE_BLUETOOTH_PERMISSION) { + // 蓝牙权限回调 + boolean allGranted = true; + for (int result : grantResults) { + if (result != PackageManager.PERMISSION_GRANTED) { + allGranted = false; + break; + } + } + if (allGranted) { + // 权限获取成功,检查蓝牙状态 + if (initBluetooth()) { + goToDeviceProvisioning(); + } + } else { + ToastUtil.showShort(mContext, "需要蓝牙权限才能添加设备"); + } + } + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == REQUEST_ENABLE_BT) { + if (resultCode == -1) { // RESULT_OK + ToastUtil.showShort(mContext, "蓝牙已开启"); + bluetoothReady = true; + if (pendingDeviceEntity != null) { + goToDeviceProvisioning(); + } + } else { + ToastUtil.showShort(mContext, "请开启蓝牙以添加设备"); + } } } diff --git a/app/src/main/java/com/ckkj/water/index/adapter/DeviceAdapter.java b/app/src/main/java/com/ckkj/water/index/adapter/DeviceAdapter.java index 1061e7d..ce1219f 100644 --- a/app/src/main/java/com/ckkj/water/index/adapter/DeviceAdapter.java +++ b/app/src/main/java/com/ckkj/water/index/adapter/DeviceAdapter.java @@ -29,15 +29,26 @@ public class DeviceAdapter extends BaseQuickAdapter deviceList; private int bindDeviceStatus; private String bindDeviceStatusName; + private WaterDeviceEntity bindDevice; - @NoArgsConstructor @Data + @NoArgsConstructor public static class DeviceListBean implements Serializable{ private String id; private String deviceNo; @@ -67,5 +68,14 @@ public class WaterDeviceEntity implements Serializable { private String fwVer; private String macAddress; private Object expirationTime; + private int createDept; + private int createBy; + private String createTime; + private int updateBy; + private String updateTime; + private Object bindTokenHash; + private Object deviceImgX; + private String powerLevelUpdatatimeX; + private Object expirationTimeX; } } diff --git a/app/src/main/java/com/ckkj/water/index/mvp/IndexPresenter.java b/app/src/main/java/com/ckkj/water/index/mvp/IndexPresenter.java index c64ebb3..eb37c08 100644 --- a/app/src/main/java/com/ckkj/water/index/mvp/IndexPresenter.java +++ b/app/src/main/java/com/ckkj/water/index/mvp/IndexPresenter.java @@ -51,10 +51,10 @@ public class IndexPresenter extends BasePresenter{ mImpl.queryDeviceBindStatus(json, new IndexContract.CallBack() { @Override public void success(WaterDeviceEntity bean, int total) { - entity.setBindDeviceStatus(bean.getBindDeviceStatus()); - entity.setBindDeviceStatusName(bean.getBindDeviceStatusName()); + bean.setMacAddress(entity.getMacAddress()); + bean.setDeviceName(entity.getDeviceName()); if(IndexPresenter.this.getView() != null){ - IndexPresenter.this.getView().queryDeviceBindStatusSuccess(entity); + IndexPresenter.this.getView().queryDeviceBindStatusSuccess(bean); } } diff --git a/app/src/main/java/com/ckkj/water/network/Request.java b/app/src/main/java/com/ckkj/water/network/Request.java index af8315b..baa253f 100644 --- a/app/src/main/java/com/ckkj/water/network/Request.java +++ b/app/src/main/java/com/ckkj/water/network/Request.java @@ -65,7 +65,7 @@ public interface Request { //添加设备 @POST("app/v1/addDevice") - Observable addDevice(@HeaderMap Map headMap, @Body RequestBody requestBody); + Observable> addDevice(@HeaderMap Map headMap, @Body RequestBody requestBody); //获取设备详细信息 @GET("app/v1/device/{deviceNo}") Observable> getDeviceDetailInfo(@HeaderMap Map headMap, @Path("deviceNo") String id); diff --git a/app/src/main/res/layout/device_control_layout.xml b/app/src/main/res/layout/device_control_layout.xml index e4641f2..d71017a 100644 --- a/app/src/main/res/layout/device_control_layout.xml +++ b/app/src/main/res/layout/device_control_layout.xml @@ -58,6 +58,7 @@ android:gravity="center" android:background="@drawable/shape_device_ctrl_green_cor12"> diff --git a/app/src/main/res/layout/device_info_layout.xml b/app/src/main/res/layout/device_info_layout.xml index bc81c34..416fe4b 100644 --- a/app/src/main/res/layout/device_info_layout.xml +++ b/app/src/main/res/layout/device_info_layout.xml @@ -25,6 +25,7 @@ android:textColor="@color/textPrimaryColor" android:text="@string/device_info_code"/> Idle Select watering duration Start Watering + Off line + Enter schedule name diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1441917..8146dcc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -89,6 +89,7 @@ 固件版本 工作中 待机中 + 离线 请选择浇水时长 开始浇水