Compare commits
42 Commits
c90d26afc1
...
7e63101fc9
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7e63101fc9 | ||
|
|
0f9c8c7329 | ||
|
|
20a08e9b61 | ||
|
|
07edcb4664 | ||
|
|
5089e760e5 | ||
|
|
2507657285 | ||
|
|
bd75b8baeb | ||
|
|
03e67932b1 | ||
|
|
b7ab2e69a4 | ||
|
|
694b74cda7 | ||
|
|
7aed064ddb | ||
|
|
89df3119f8 | ||
|
|
ed9cdaf126 | ||
|
|
436b65c5e6 | ||
|
|
5a42515f77 | ||
|
|
a8b9aabf20 | ||
|
|
e1d13665ab | ||
|
|
1000c43321 | ||
|
|
9318646aa4 | ||
|
|
644a68d865 | ||
|
|
693acda192 | ||
|
|
967ddca167 | ||
|
|
9d41f8c1eb | ||
|
|
21f70b68eb | ||
|
|
79e66a20ef | ||
|
|
401d1892bb | ||
|
|
47769d1003 | ||
|
|
f7bee61a56 | ||
|
|
20aaf98235 | ||
|
|
30e88c8067 | ||
|
|
0ca0a395cd | ||
|
|
f2b8062398 | ||
|
|
9ab6d134ab | ||
|
|
65dfc1b5f1 | ||
|
|
5ca81f565a | ||
|
|
1ed3a68a5e | ||
|
|
e14bdaf046 | ||
|
|
6c6d211701 | ||
|
|
e6e3f755d0 | ||
|
|
819965faec | ||
|
|
f86fedd6f1 | ||
|
|
1b7c8f0c2d |
2
.idea/deploymentTargetSelector.xml
generated
2
.idea/deploymentTargetSelector.xml
generated
@@ -4,7 +4,7 @@
|
||||
<selectionStates>
|
||||
<SelectionState runConfigName="app">
|
||||
<option name="selectionMode" value="DROPDOWN" />
|
||||
<DropdownSelection timestamp="2026-05-19T02:00:28.842946500Z">
|
||||
<DropdownSelection timestamp="2026-06-03T03:26:05.515101Z">
|
||||
<Target type="DEFAULT_BOOT">
|
||||
<handle>
|
||||
<DeviceId pluginId="PhysicalDevice" identifier="serial=D122222104A9" />
|
||||
|
||||
@@ -4,7 +4,7 @@ apply plugin: 'com.hihonor.mcs.asplugin'
|
||||
apply plugin: 'io.freefair.lombok' // ✅ 加上这个
|
||||
|
||||
android {
|
||||
compileSdkVersion 33
|
||||
compileSdkVersion 34
|
||||
lintOptions {
|
||||
checkReleaseBuilds false // 关闭 release 打包时 lint 检查
|
||||
abortOnError false // 即使有错误也不终止编译
|
||||
@@ -121,6 +121,7 @@ dependencies {
|
||||
implementation project(path: ':imagepickerl')
|
||||
//消息传递
|
||||
implementation 'de.greenrobot:eventbus:3.0.0-beta1'
|
||||
implementation 'org.greenrobot:eventbus:3.3.1'
|
||||
implementation 'com.trello.rxlifecycle2:rxlifecycle:2.2.1'
|
||||
implementation 'com.trello.rxlifecycle2:rxlifecycle-android:2.2.1'
|
||||
implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.1'
|
||||
@@ -159,8 +160,8 @@ dependencies {
|
||||
//鲁班图片压缩
|
||||
implementation 'top.zibin:Luban:1.1.8'
|
||||
//带有侧滑功能的recyclerview
|
||||
// implementation 'com.yanzhenjie.recyclerview:x:1.3.2'
|
||||
implementation 'com.github.luqiming666:SwipeRecyclerView:1.4.8'
|
||||
implementation 'com.yanzhenjie.recyclerview:x:1.3.2'
|
||||
// implementation 'com.github.luqiming666:SwipeRecyclerView:1.4.8'
|
||||
//Activity与Fragmen实现沉浸式状态栏
|
||||
implementation 'com.github.tangguna:immersion:1.0.1'
|
||||
//viewpager2
|
||||
@@ -226,6 +227,11 @@ dependencies {
|
||||
implementation "androidx.camera:camera-camera2:1.0.2"
|
||||
implementation "androidx.camera:camera-lifecycle:1.0.2"
|
||||
implementation "androidx.camera:camera-view:1.0.0-alpha25"
|
||||
//蓝牙扫描
|
||||
implementation 'no.nordicsemi.android.support.v18:scanner:1.6.0'
|
||||
//蓝牙通讯
|
||||
implementation 'no.nordicsemi.android:ble:2.11.0'
|
||||
//espressif官方sdk,用于esp固件的扫描,配网等。
|
||||
implementation 'com.github.espressif:esp-idf-provisioning-android:lib-2.2.3'
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -35,6 +35,14 @@
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
|
||||
<!-- 蓝牙权限 -->
|
||||
<uses-permission android:name="android.permission.BLUETOOTH" />
|
||||
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
|
||||
<!-- 支持ble的设备 -->
|
||||
<uses-feature
|
||||
android:name="android.hardware.bluetooth_le"
|
||||
android:required="true" />
|
||||
|
||||
<!--后台获取位置信息,若需后台定位则必选-->
|
||||
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
|
||||
<!--用于申请调用A-GPS模块,卫星定位加速-->
|
||||
@@ -56,9 +64,9 @@
|
||||
<application
|
||||
android:name="com.ckkj.water.MyApplication"
|
||||
android:allowBackup="true"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:icon="@mipmap/app_logo"
|
||||
android:label="@string/app_name"
|
||||
android:roundIcon="@mipmap/ic_launcher"
|
||||
android:roundIcon="@mipmap/app_logo"
|
||||
android:requestLegacyExternalStorage="true"
|
||||
android:theme="@style/custom_app_theme"
|
||||
android:supportsRtl="true"
|
||||
@@ -111,10 +119,6 @@
|
||||
android:launchMode="singleTask"
|
||||
android:screenOrientation="portrait"
|
||||
android:windowSoftInputMode="adjustResize"/>
|
||||
<activity
|
||||
android:name="com.ckkj.water.chat.ChatHistoryActivity"
|
||||
android:screenOrientation="portrait"
|
||||
android:windowSoftInputMode="adjustResize"/>
|
||||
<activity
|
||||
android:name="com.ckkj.water.login.LoginActivity"
|
||||
android:theme="@style/AppTheme.FullScreen"
|
||||
@@ -164,6 +168,10 @@
|
||||
android:name="com.ckkj.water.device.AddDeviceActivity"
|
||||
android:screenOrientation="portrait"
|
||||
android:windowSoftInputMode="adjustResize"/>
|
||||
<activity
|
||||
android:name="com.ckkj.water.device.AddDeviceActivity_copy"
|
||||
android:screenOrientation="portrait"
|
||||
android:windowSoftInputMode="adjustResize"/>
|
||||
<activity
|
||||
android:name="com.ckkj.water.device.SelectWifiActivity"
|
||||
android:screenOrientation="portrait"
|
||||
|
||||
@@ -120,4 +120,7 @@ public class AppConfig {
|
||||
public static String APP_CLIENT_ID = "428a8310cd442757ae699df5d894f051";
|
||||
public static String APP_USER_TYPE = "app_user";
|
||||
|
||||
//蓝牙设备的uuid
|
||||
public static String BLUETOOTH_DEVICE_UUID = "1775244d-6b43-439b-877c-060f2d9bed07";
|
||||
|
||||
}
|
||||
|
||||
@@ -154,6 +154,7 @@ public class MyApplication extends Application {
|
||||
.setUseDeviceSize(true)
|
||||
// 是否支持 fragment
|
||||
.setCustomFragment(true);
|
||||
android.util.Log.e("TEST", "hello");
|
||||
}
|
||||
|
||||
private boolean shouldInit() {
|
||||
|
||||
@@ -20,6 +20,7 @@ import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.provider.MediaStore;
|
||||
import android.text.InputFilter;
|
||||
import android.text.InputType;
|
||||
import android.text.Spanned;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
@@ -100,6 +101,11 @@ public abstract class BaseActivity<T extends ViewBinding, P extends IPresenter>
|
||||
public static final int REQUEST_EVENT_CODE_10001 = 10001;
|
||||
public static final int REQUEST_EVENT_CODE_10002 = 10002;
|
||||
public static final int REQUEST_EVENT_CODE_10003 = 10003;
|
||||
public static final int INPUT_TYPE_NORMAL = 0; // 默认
|
||||
public static final int INPUT_TYPE_NUMBER = 1; // 数字
|
||||
public static final int INPUT_TYPE_LETTER = 2; // 英文字母
|
||||
public static final int INPUT_TYPE_CHINESE = 3; // 中文
|
||||
public static final int INPUT_TYPE_NUMBER_LETTER = 4;//数字+字母
|
||||
public InputFilter mInputFilter;
|
||||
private static final AtomicBoolean isDialogShown = new AtomicBoolean(false); // 使用 AtomicBoolean 保证线程安全
|
||||
private ObjectAnimator rotateAnimator;
|
||||
@@ -484,15 +490,29 @@ public abstract class BaseActivity<T extends ViewBinding, P extends IPresenter>
|
||||
* @param confirmText 确定 文案
|
||||
* @param click
|
||||
*/
|
||||
public void showEditDialog(String title, String hint,String content, boolean touchOutsideCancel, String cancelText, String confirmText,
|
||||
public void showEditDialog(String title,
|
||||
String hint,
|
||||
String content,
|
||||
boolean touchOutsideCancel,
|
||||
String cancelText,
|
||||
String confirmText,
|
||||
int inputType,
|
||||
final OnDialogClick click) {
|
||||
View view = getLayoutInflater().inflate(R.layout.public_dialog_input_text, null);
|
||||
EditText editText = view.findViewById(R.id.et_input);
|
||||
// EditText自动获取焦点
|
||||
editText.requestFocus();
|
||||
//设置输入类型
|
||||
setEditInputType(editText,inputType);
|
||||
|
||||
if(TextUtils.isEmpty(content)){
|
||||
editText.setHint(hint);
|
||||
}else{
|
||||
editText.setText(content);
|
||||
}
|
||||
if (!TextUtils.isEmpty(content)) {
|
||||
editText.setSelection(editText.getText().length());
|
||||
}
|
||||
setTextView(R.id.tv_title, title, view);
|
||||
if (!TextUtils.isEmpty(confirmText) && !TextUtils.isEmpty(cancelText)) {
|
||||
((TextView) view.findViewById(R.id.btnLeft)).setText(cancelText);
|
||||
@@ -1128,4 +1148,72 @@ public abstract class BaseActivity<T extends ViewBinding, P extends IPresenter>
|
||||
// 方法2:通过Application检查(如果有记录当前Activity)
|
||||
return MyApplication.getCurrentActivity() == this;
|
||||
}
|
||||
|
||||
private void setEditInputType(EditText editText,int type){
|
||||
|
||||
switch (type){
|
||||
|
||||
case INPUT_TYPE_NUMBER:
|
||||
//纯数字键盘
|
||||
editText.setInputType(
|
||||
InputType.TYPE_CLASS_NUMBER
|
||||
);
|
||||
break;
|
||||
|
||||
case INPUT_TYPE_LETTER:
|
||||
|
||||
//只能输入字母
|
||||
editText.setFilters(
|
||||
new InputFilter[]{
|
||||
(source,start,end,dest,dstart,dend)->{
|
||||
|
||||
if(source.toString()
|
||||
.matches("[a-zA-Z]+")){
|
||||
return source;
|
||||
}
|
||||
return "";
|
||||
}
|
||||
});
|
||||
break;
|
||||
|
||||
case INPUT_TYPE_CHINESE:
|
||||
|
||||
//只能输入中文
|
||||
editText.setFilters(
|
||||
new InputFilter[]{
|
||||
(source,start,end,dest,dstart,dend)->{
|
||||
|
||||
if(source.toString()
|
||||
.matches("[\\u4e00-\\u9fa5]+")){
|
||||
return source;
|
||||
}
|
||||
return "";
|
||||
}
|
||||
});
|
||||
break;
|
||||
|
||||
case INPUT_TYPE_NUMBER_LETTER:
|
||||
|
||||
//数字+字母
|
||||
editText.setFilters(
|
||||
new InputFilter[]{
|
||||
(source,start,end,dest,dstart,dend)->{
|
||||
|
||||
if(source.toString()
|
||||
.matches("[a-zA-Z0-9]+")){
|
||||
return source;
|
||||
}
|
||||
return "";
|
||||
}
|
||||
});
|
||||
break;
|
||||
|
||||
default:
|
||||
editText.setInputType(
|
||||
InputType.TYPE_CLASS_TEXT
|
||||
);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,8 @@ import android.content.Intent;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.text.InputFilter;
|
||||
import android.text.InputType;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.Gravity;
|
||||
@@ -20,6 +22,7 @@ import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.EditText;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
@@ -30,6 +33,7 @@ import androidx.core.app.ActivityCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.viewbinding.ViewBinding;
|
||||
|
||||
import com.ckkj.water.utils.show.ToastUtil;
|
||||
import com.esafirm.imagepicker.features.ImagePicker;
|
||||
import com.ckkj.water.AppConfig;
|
||||
import com.ckkj.water.ConstantUtil;
|
||||
@@ -70,6 +74,12 @@ public abstract class BaseFragment<T extends ViewBinding,P extends IPresenter> e
|
||||
protected static final int REQUEST_EVENT_CODE_10002 = 10002;
|
||||
protected static final int REQUEST_EVENT_CODE_10003 = 10003;
|
||||
|
||||
public static final int INPUT_TYPE_NORMAL = 0; // 默认
|
||||
public static final int INPUT_TYPE_NUMBER = 1; // 数字
|
||||
public static final int INPUT_TYPE_LETTER = 2; // 英文字母
|
||||
public static final int INPUT_TYPE_CHINESE = 3; // 中文
|
||||
public static final int INPUT_TYPE_NUMBER_LETTER = 4;//数字+字母
|
||||
|
||||
private static final AtomicBoolean isDialogShown = new AtomicBoolean(false); // 使用 AtomicBoolean 保证线程安全
|
||||
|
||||
|
||||
@@ -860,6 +870,193 @@ public abstract class BaseFragment<T extends ViewBinding,P extends IPresenter> e
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* +
|
||||
*
|
||||
* @param title 标题
|
||||
* @param hint 提示内容2
|
||||
* @param content 内容
|
||||
* @param touchOutsideCancel 弹窗类型
|
||||
* @param cancelText 取消 文案
|
||||
* @param confirmText 确定 文案
|
||||
* @param click
|
||||
*/
|
||||
public void showEditDialog(String title,
|
||||
String hint,
|
||||
String content,
|
||||
boolean touchOutsideCancel,
|
||||
String cancelText,
|
||||
String confirmText,
|
||||
int inputType,
|
||||
final BaseActivity.OnDialogClick click) {
|
||||
|
||||
View view = getLayoutInflater().inflate(
|
||||
R.layout.public_dialog_input_text,
|
||||
null
|
||||
);
|
||||
|
||||
EditText editText = view.findViewById(R.id.et_input);
|
||||
|
||||
//设置输入类型
|
||||
setEditInputType(editText,inputType);
|
||||
|
||||
if(TextUtils.isEmpty(content)){
|
||||
editText.setHint(hint);
|
||||
}else{
|
||||
editText.setText(content);
|
||||
editText.setSelection(content.length());
|
||||
}
|
||||
|
||||
setTextView(R.id.tv_title,title,view);
|
||||
|
||||
if (!TextUtils.isEmpty(confirmText)
|
||||
&& !TextUtils.isEmpty(cancelText)) {
|
||||
|
||||
((TextView)view.findViewById(R.id.btnLeft))
|
||||
.setText(cancelText);
|
||||
|
||||
((TextView)view.findViewById(R.id.btnRight))
|
||||
.setText(confirmText);
|
||||
}
|
||||
|
||||
view.findViewById(R.id.btnLeft)
|
||||
.setOnClickListener(v -> {
|
||||
|
||||
if(dialog!=null&&dialog.isShowing())
|
||||
dialog.dismiss();
|
||||
|
||||
if(click!=null)
|
||||
click.onCancelClick();
|
||||
|
||||
});
|
||||
|
||||
view.findViewById(R.id.btnRight)
|
||||
.setOnClickListener(v -> {
|
||||
|
||||
String value=editText.getText()
|
||||
.toString()
|
||||
.trim();
|
||||
|
||||
if(TextUtils.isEmpty(value)){
|
||||
ToastUtil.showShort(mContext,hint);
|
||||
return;
|
||||
}
|
||||
|
||||
if(dialog!=null&&dialog.isShowing())
|
||||
dialog.dismiss();
|
||||
|
||||
if(click!=null)
|
||||
click.onConfirmClisk(value);
|
||||
|
||||
});
|
||||
|
||||
AlertDialog.Builder builder;
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
|
||||
builder = new AlertDialog.Builder(
|
||||
mContext,
|
||||
AlertDialog.THEME_HOLO_LIGHT
|
||||
);
|
||||
} else {
|
||||
builder = new AlertDialog.Builder(mContext);
|
||||
}
|
||||
|
||||
builder.setInverseBackgroundForced(true);
|
||||
builder.setView(view);
|
||||
|
||||
dialog = builder.show();
|
||||
|
||||
dialog.setCanceledOnTouchOutside(
|
||||
touchOutsideCancel
|
||||
);
|
||||
|
||||
try {
|
||||
((View)dialog.getWindow()
|
||||
.getDecorView()
|
||||
.findViewById(R.id.contentDialog)
|
||||
.getParent()
|
||||
.getParent())
|
||||
.setBackgroundColor(
|
||||
getResources().getColor(
|
||||
R.color.transparent
|
||||
)
|
||||
);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void setEditInputType(EditText editText,int type){
|
||||
|
||||
switch (type){
|
||||
|
||||
case INPUT_TYPE_NUMBER:
|
||||
//纯数字键盘
|
||||
editText.setInputType(
|
||||
InputType.TYPE_CLASS_NUMBER
|
||||
);
|
||||
break;
|
||||
|
||||
case INPUT_TYPE_LETTER:
|
||||
|
||||
//只能输入字母
|
||||
editText.setFilters(
|
||||
new InputFilter[]{
|
||||
(source,start,end,dest,dstart,dend)->{
|
||||
|
||||
if(source.toString()
|
||||
.matches("[a-zA-Z]+")){
|
||||
return source;
|
||||
}
|
||||
return "";
|
||||
}
|
||||
});
|
||||
break;
|
||||
|
||||
case INPUT_TYPE_CHINESE:
|
||||
|
||||
//只能输入中文
|
||||
editText.setFilters(
|
||||
new InputFilter[]{
|
||||
(source,start,end,dest,dstart,dend)->{
|
||||
|
||||
if(source.toString()
|
||||
.matches("[\\u4e00-\\u9fa5]+")){
|
||||
return source;
|
||||
}
|
||||
return "";
|
||||
}
|
||||
});
|
||||
break;
|
||||
|
||||
case INPUT_TYPE_NUMBER_LETTER:
|
||||
|
||||
//数字+字母
|
||||
editText.setFilters(
|
||||
new InputFilter[]{
|
||||
(source,start,end,dest,dstart,dend)->{
|
||||
|
||||
if(source.toString()
|
||||
.matches("[a-zA-Z0-9]+")){
|
||||
return source;
|
||||
}
|
||||
return "";
|
||||
}
|
||||
});
|
||||
break;
|
||||
|
||||
default:
|
||||
editText.setInputType(
|
||||
InputType.TYPE_CLASS_TEXT
|
||||
);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 权限请求结果回调
|
||||
*/
|
||||
|
||||
@@ -16,12 +16,26 @@ import lombok.NoArgsConstructor;
|
||||
@Data
|
||||
public class MineUserInfoBean implements Serializable {
|
||||
|
||||
|
||||
/**
|
||||
* user : {"userId":"2056543507514097665","tenantId":"000000","deptId":null,"userName":null,"nickName":"给个回话","userType":"app_user","email":"","phonenumber":"133****6054","sex":"0","avatar":null,"password":"$2a$10$KsCb1Z1znyQgL7W.GoljuuVPctzZ7tS7obu8W2WkK5ydsejQOjRi2","status":"0","loginIp":"192.168.1.7","loginDate":"2026-05-21 08:44:20","remark":null,"createTime":"2026-05-19 09:12:36","deptName":null,"roles":[],"roleIds":null,"postIds":null,"roleId":null,"oldPassword":null}
|
||||
* permissions : []
|
||||
* roles : []
|
||||
*/
|
||||
|
||||
private UserBean user;
|
||||
private List<?> permissions;
|
||||
private List<?> roles;
|
||||
|
||||
@NoArgsConstructor
|
||||
@Data
|
||||
public static class UserBean implements Serializable{
|
||||
/**
|
||||
* userId : 2056543507514097665
|
||||
* tenantId : 000000
|
||||
* deptId : null
|
||||
* userName : null
|
||||
* nickName : 用户1779153155517
|
||||
* nickName : 给个回话
|
||||
* userType : app_user
|
||||
* email :
|
||||
* phonenumber : 133****6054
|
||||
@@ -30,7 +44,7 @@ public class MineUserInfoBean implements Serializable {
|
||||
* password : $2a$10$KsCb1Z1znyQgL7W.GoljuuVPctzZ7tS7obu8W2WkK5ydsejQOjRi2
|
||||
* status : 0
|
||||
* loginIp : 192.168.1.7
|
||||
* loginDate : 2026-05-19 11:06:22
|
||||
* loginDate : 2026-05-21 08:44:20
|
||||
* remark : null
|
||||
* createTime : 2026-05-19 09:12:36
|
||||
* deptName : null
|
||||
@@ -63,4 +77,5 @@ public class MineUserInfoBean implements Serializable {
|
||||
private Object roleId;
|
||||
private Object oldPassword;
|
||||
private List<?> roles;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,25 +68,35 @@ public class CustomTypeFilterPopupView extends PartShadowPopupView implements Vi
|
||||
switch (v.getId()){
|
||||
case R.id.tv_manual:
|
||||
if(mSelManual){
|
||||
// 已选中,取消选中
|
||||
mSelManual = false;
|
||||
tvManual.setTextColor(mContext.getColor(R.color.color_zhu));
|
||||
tvManual.setSelected(mSelManual);
|
||||
tvManual.setSelected(false);
|
||||
}else{
|
||||
// 选中手动,同时取消自动
|
||||
mSelManual = true;
|
||||
mSelAuto = false;
|
||||
tvManual.setTextColor(mContext.getColor(R.color.white));
|
||||
tvManual.setSelected(mSelManual);
|
||||
tvManual.setSelected(true);
|
||||
tvAuto.setTextColor(mContext.getColor(R.color.color_zhu));
|
||||
tvAuto.setSelected(false);
|
||||
}
|
||||
break;
|
||||
|
||||
case R.id.tv_auto:
|
||||
if(mSelAuto){
|
||||
// 已选中,取消选中
|
||||
mSelAuto = false;
|
||||
tvAuto.setTextColor(mContext.getColor(R.color.color_zhu));
|
||||
tvAuto.setSelected(mSelAuto);
|
||||
tvAuto.setSelected(false);
|
||||
}else{
|
||||
// 选中自动,同时取消手动
|
||||
mSelAuto = true;
|
||||
mSelManual = false;
|
||||
tvAuto.setTextColor(mContext.getColor(R.color.white));
|
||||
tvAuto.setSelected(mSelAuto);
|
||||
tvAuto.setSelected(true);
|
||||
tvManual.setTextColor(mContext.getColor(R.color.color_zhu));
|
||||
tvManual.setSelected(false);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -95,8 +105,8 @@ public class CustomTypeFilterPopupView extends PartShadowPopupView implements Vi
|
||||
mSelAuto = false;
|
||||
tvManual.setTextColor(mContext.getColor(R.color.color_zhu));
|
||||
tvAuto.setTextColor(mContext.getColor(R.color.color_zhu));
|
||||
tvManual.setSelected(mSelManual);
|
||||
tvAuto.setSelected(mSelAuto);
|
||||
tvManual.setSelected(false);
|
||||
tvAuto.setSelected(false);
|
||||
break;
|
||||
|
||||
case R.id.tv_finish:
|
||||
|
||||
@@ -4,6 +4,7 @@ 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;
|
||||
@@ -20,7 +21,7 @@ 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.IndexDeviceEntity;
|
||||
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;
|
||||
@@ -34,6 +35,7 @@ import org.jetbrains.annotations.NotNull;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import no.nordicsemi.android.ble.BleManager;
|
||||
import pub.devrel.easypermissions.EasyPermissions;
|
||||
|
||||
/**
|
||||
@@ -73,7 +75,6 @@ public class AddDeviceActivity extends BaseActivity<AddDeviceLayoutBinding, Devi
|
||||
if (animationDrawable.isRunning()) {
|
||||
animationDrawable.stop();
|
||||
viewBinding.ivScanAnimation.setVisibility(GONE);
|
||||
viewBinding.imgDeviceItem.setVisibility(VISIBLE);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -85,7 +86,6 @@ public class AddDeviceActivity extends BaseActivity<AddDeviceLayoutBinding, Devi
|
||||
private void initListener() {
|
||||
setClick(viewBinding.includedTitle.imgBack);
|
||||
setClick(viewBinding.tvScanAdd);
|
||||
setClick(viewBinding.imgDeviceItem);
|
||||
}
|
||||
|
||||
private void setClick(View view) {
|
||||
@@ -195,7 +195,7 @@ public class AddDeviceActivity extends BaseActivity<AddDeviceLayoutBinding, Devi
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getDeviceDetailInfo(IndexDeviceEntity bean) {
|
||||
public void getDeviceDetailInfo(WaterDeviceEntity bean) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,461 @@
|
||||
package com.ckkj.water.device;
|
||||
|
||||
import static android.view.View.GONE;
|
||||
import static android.view.View.VISIBLE;
|
||||
|
||||
import android.Manifest;
|
||||
import android.bluetooth.BluetoothAdapter;
|
||||
import android.bluetooth.BluetoothDevice;
|
||||
import android.bluetooth.BluetoothManager;
|
||||
import android.bluetooth.le.BluetoothLeScanner;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.graphics.drawable.AnimationDrawable;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.ParcelUuid;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.core.content.ContextCompat;
|
||||
|
||||
import com.chad.library.adapter.base.BaseQuickAdapter;
|
||||
import com.ckkj.water.BuildConfig;
|
||||
import com.ckkj.water.ConstantUtil;
|
||||
import com.ckkj.water.R;
|
||||
import com.ckkj.water.base.BaseActivity;
|
||||
import com.ckkj.water.custom.GridSpacingItemDecoration;
|
||||
import com.ckkj.water.databinding.AddDeviceLayoutBinding;
|
||||
import com.ckkj.water.device.adapter.BleScanDeviceAdapter;
|
||||
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.manager.WaterDeviceManager;
|
||||
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.Arrays;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
import no.nordicsemi.android.ble.observer.ConnectionObserver;
|
||||
import no.nordicsemi.android.support.v18.scanner.BluetoothLeScannerCompat;
|
||||
import no.nordicsemi.android.support.v18.scanner.ScanCallback;
|
||||
import no.nordicsemi.android.support.v18.scanner.ScanFilter;
|
||||
import no.nordicsemi.android.support.v18.scanner.ScanRecord;
|
||||
import no.nordicsemi.android.support.v18.scanner.ScanResult;
|
||||
import no.nordicsemi.android.support.v18.scanner.ScanSettings;
|
||||
import pub.devrel.easypermissions.EasyPermissions;
|
||||
|
||||
/**
|
||||
* 添加设备页面
|
||||
*/
|
||||
public class AddDeviceActivity_copy extends BaseActivity<AddDeviceLayoutBinding, DevicePresenter>
|
||||
implements DeviceContract.DeviceView, EasyPermissions.PermissionCallbacks {
|
||||
|
||||
// 蓝牙相关
|
||||
private BluetoothAdapter bluetoothAdapter;
|
||||
private static final int REQUEST_ENABLE_BT = 1001;
|
||||
private static final int REQUEST_BLUETOOTH_PERMISSION = 1002;
|
||||
private List<BluetoothDevice> discoveredDevices = new ArrayList<>();
|
||||
private AlertDialog deviceListDialog;
|
||||
private String mUuid = "1775244d-6b43-439b-877c-060f2d9bed07";
|
||||
private ScanCallback mScanCallback;
|
||||
private boolean bluetoothReady = false;
|
||||
private BleScanDeviceAdapter bleAdapter;
|
||||
private List<WaterDeviceEntity> mDeviceList = new ArrayList<>();
|
||||
private Set<String> discoveredMacSet = new HashSet<>();
|
||||
private WaterDeviceManager waterDeviceManager;
|
||||
|
||||
@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);
|
||||
viewBinding.rvDevices.addItemDecoration(new GridSpacingItemDecoration(4, 10, true));
|
||||
bleAdapter = new BleScanDeviceAdapter(mContext,R.layout.scan_ble_device_item,mDeviceList);
|
||||
viewBinding.rvDevices.setAdapter(bleAdapter);
|
||||
|
||||
if(checkBluetoothPermissions()){
|
||||
// 初始化蓝牙适配器
|
||||
initBluetooth();
|
||||
if (bluetoothReady) {
|
||||
startBleScan();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 启动帧动画
|
||||
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();
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化监听g
|
||||
*/
|
||||
private void initListener() {
|
||||
setClick(viewBinding.includedTitle.imgBack);
|
||||
setClick(viewBinding.tvScanAdd);
|
||||
setClick(viewBinding.btnBleScan);
|
||||
|
||||
if(bleAdapter != null){
|
||||
bleAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
|
||||
@Override
|
||||
public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
|
||||
WaterDeviceEntity device = mDeviceList.get(position);
|
||||
String deviceName = TextUtils.isEmpty(device.getDeviceName()) ?
|
||||
"未知设备" : device.getDeviceName();
|
||||
// 停止扫描
|
||||
stopBleScan();
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putInt(ConstantUtil.ACTIVITY_NAVIGATE_FLAG,100);
|
||||
bundle.putSerializable("ble_device_entity",mDeviceList.get(position));
|
||||
goTo(mContext, SelectWifiActivity.class,bundle);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 开始 BLE 扫描
|
||||
*/
|
||||
private void startBleScan() {
|
||||
BluetoothLeScannerCompat scanner = BluetoothLeScannerCompat.getScanner();
|
||||
UUID SERVICE_UUID = UUID.fromString(mUuid);//1775244d-6b43-439b-877c-060f2d9bed07
|
||||
ParcelUuid parcelUuid = new ParcelUuid(SERVICE_UUID);
|
||||
ScanSettings settings = new ScanSettings.Builder()
|
||||
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
|
||||
.setReportDelay(0)
|
||||
.build();
|
||||
List<ScanFilter> filters = new ArrayList<>();
|
||||
filters.add(new ScanFilter.Builder().setServiceUuid(parcelUuid).build());
|
||||
Log.e("TEST", "开始扫描");
|
||||
mScanCallback = new ScanCallback() {
|
||||
@Override
|
||||
public void onScanResult(int callbackType, @NonNull ScanResult result) {
|
||||
super.onScanResult(callbackType, result);
|
||||
//Mac地址
|
||||
String deviceAddress = result.getDevice().getAddress();
|
||||
// 去重:已存在的设备不再添加
|
||||
if (discoveredMacSet.contains(deviceAddress)) {
|
||||
return;
|
||||
}
|
||||
discoveredMacSet.add(deviceAddress);
|
||||
|
||||
WaterDeviceEntity bean = new WaterDeviceEntity();
|
||||
//设备名字
|
||||
String deviceName = result.getScanRecord() != null ?
|
||||
result.getScanRecord().getDeviceName() : "无名称";
|
||||
|
||||
bean.setDeviceName(deviceName);
|
||||
bean.setMacAddress(deviceAddress);
|
||||
mDeviceList.add(bean);
|
||||
bleAdapter.notifyItemInserted(mDeviceList.size() - 1);
|
||||
if(bleAdapter.getItemCount() != 0){
|
||||
viewBinding.rvDevices.setVisibility(VISIBLE);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBatchScanResults(@NonNull List<ScanResult> results) {
|
||||
super.onBatchScanResults(results);
|
||||
Log.e("TEST", "批量结果: " + results.size() + " 个设备");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onScanFailed(int errorCode) {
|
||||
super.onScanFailed(errorCode);
|
||||
Log.e("TEST", "扫描失败: " + errorCode);
|
||||
ToastUtil.showShort(mContext, "扫描失败,错误码: " + errorCode);
|
||||
}
|
||||
};
|
||||
scanner.startScan(filters, settings, mScanCallback);
|
||||
}
|
||||
|
||||
/**
|
||||
* 停止 BLE 扫描
|
||||
*/
|
||||
private void stopBleScan() {
|
||||
if (mScanCallback != null) {
|
||||
BluetoothLeScannerCompat scanner = BluetoothLeScannerCompat.getScanner();
|
||||
scanner.stopScan(mScanCallback);
|
||||
Log.e("TEST", "停止扫描");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 初始化蓝牙适配器
|
||||
*/
|
||||
private void initBluetooth() {
|
||||
BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
|
||||
if (bluetoothManager != null) {
|
||||
bluetoothAdapter = bluetoothManager.getAdapter();
|
||||
}
|
||||
|
||||
if (bluetoothAdapter == null) {
|
||||
ToastUtil.showShort(mContext, "设备不支持蓝牙");
|
||||
return;
|
||||
}
|
||||
|
||||
// 检查蓝牙是否开启
|
||||
if (!bluetoothAdapter.isEnabled()) {
|
||||
Log.e("TEST", "initBluetooth: 蓝牙未开启,请求开启");
|
||||
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
|
||||
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
|
||||
} else {
|
||||
bluetoothReady = true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查蓝牙权限
|
||||
*/
|
||||
private boolean checkBluetoothPermissions() {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||
|
||||
String[] readPermission = new String[]{
|
||||
Manifest.permission.BLUETOOTH_SCAN,
|
||||
Manifest.permission.BLUETOOTH_CONNECT,
|
||||
Manifest.permission.ACCESS_FINE_LOCATION
|
||||
};
|
||||
if (!hasRecordPermission(readPermission)) {
|
||||
// 没有权限,只在ACTION_DOWN时去申请
|
||||
getMorePermissionRequst(readPermission,"蓝牙扫描权限申请",
|
||||
"智能浇水需要您的授权,获取蓝牙权限添加设备",REQUEST_EVENT_CODE_10003);
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
// Android 12 以下需要位置权限才能扫描蓝牙
|
||||
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
|
||||
!= PackageManager.PERMISSION_GRANTED) {
|
||||
|
||||
requestPermissions(new String[]{
|
||||
Manifest.permission.ACCESS_FINE_LOCATION
|
||||
}, REQUEST_BLUETOOTH_PERMISSION);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
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.tv_scan_add:
|
||||
//检测有无相机权限
|
||||
String readPermission = Manifest.permission.CAMERA;
|
||||
if(!hasRecordPermission(readPermission)){
|
||||
getPermissionRequst(readPermission,"权限申请",
|
||||
"智能浇水需要您的授权访问相机,并使用扫一扫",REQUEST_EVENT_CODE_10001);
|
||||
}else{
|
||||
scanQrcode();
|
||||
}
|
||||
break;
|
||||
|
||||
case R.id.btn_ble_scan:
|
||||
// 扫描蓝牙设备
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
if (requestCode == REQUEST_ENABLE_BT) {
|
||||
if (resultCode == RESULT_OK) {
|
||||
ToastUtil.showShort(mContext, "蓝牙已开启");
|
||||
Log.e("BluetoothScan", "onActivityResult: 蓝牙已开启,开始扫描");
|
||||
bluetoothReady = true;
|
||||
startBleScan();
|
||||
} else {
|
||||
ToastUtil.showShort(mContext, "请开启蓝牙以扫描设备");
|
||||
Log.e("BluetoothScan", "onActivityResult: 用户拒绝开启蓝牙");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@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);
|
||||
hidePermissionDialog();
|
||||
if (requestCode == REQUEST_BLUETOOTH_PERMISSION) {
|
||||
boolean allGranted = true;
|
||||
for (int result : grantResults) {
|
||||
if (result != PackageManager.PERMISSION_GRANTED) {
|
||||
allGranted = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (allGranted) {
|
||||
// 初始化蓝牙适配器
|
||||
initBluetooth();
|
||||
} else {
|
||||
ToastUtil.showShort(mContext, "需要蓝牙权限才能扫描设备");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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 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(BaseBean 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) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
// 停止扫描
|
||||
stopBleScan();
|
||||
// 断开蓝牙连接
|
||||
if (waterDeviceManager != null) {
|
||||
waterDeviceManager.disconnect().enqueue();
|
||||
waterDeviceManager.close();
|
||||
waterDeviceManager = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -15,10 +15,9 @@ import com.ckkj.water.databinding.DeviceConnectLayoutBinding;
|
||||
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.IndexDeviceEntity;
|
||||
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.show.ToastUtil;
|
||||
import com.gyf.immersionbar.ImmersionBar;
|
||||
|
||||
/**
|
||||
@@ -105,7 +104,7 @@ public class DeviceConnectActivity extends BaseActivity<DeviceConnectLayoutBindi
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getDeviceDetailInfo(IndexDeviceEntity bean) {
|
||||
public void getDeviceDetailInfo(WaterDeviceEntity bean) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.ckkj.water.device;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
@@ -10,20 +11,21 @@ import com.chad.library.adapter.base.BaseQuickAdapter;
|
||||
import com.ckkj.water.EventMessage;
|
||||
import com.ckkj.water.R;
|
||||
import com.ckkj.water.base.BaseActivity;
|
||||
import com.ckkj.water.base.BaseFragment;
|
||||
import com.ckkj.water.custom.GridSpacingItemDecoration;
|
||||
import com.ckkj.water.custom.view.CustomAttachPopup;
|
||||
import com.ckkj.water.custom.view.CustomBubbleAttachPopup;
|
||||
import com.ckkj.water.databinding.DeviceControlLayoutBinding;
|
||||
import com.ckkj.water.device.adapter.DeviceTimeSelectAdapter;
|
||||
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.IndexDeviceEntity;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
|
||||
import com.ckkj.water.utils.manager.PowerIconManage;
|
||||
import com.ckkj.water.utils.show.ToastUtil;
|
||||
import com.gyf.immersionbar.ImmersionBar;
|
||||
import com.lxj.xpopup.XPopup;
|
||||
import com.lxj.xpopup.core.BasePopupView;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -38,8 +40,11 @@ public class DeviceControlActivity extends BaseActivity<DeviceControlLayoutBindi
|
||||
implements DeviceContract.DeviceView {
|
||||
|
||||
private List<String> mTimeList = new ArrayList<>();
|
||||
private IndexDeviceEntity mDeviceEntity;
|
||||
private WaterDeviceEntity mDeviceEntity;
|
||||
private WaterDeviceEntity mRemoteDeviceEntity;
|
||||
private DeviceTimeSelectAdapter mAdapter;
|
||||
//用户自定义的浇水时长
|
||||
private int mCustomDuration = 0;
|
||||
@Override
|
||||
public DevicePresenter createPresenter() {
|
||||
return new DevicePresenter(new DeviceImpl());
|
||||
@@ -50,11 +55,20 @@ public class DeviceControlActivity extends BaseActivity<DeviceControlLayoutBindi
|
||||
super.initData(savedInstanceState);
|
||||
Bundle bundle = getIntent().getExtras();
|
||||
if(bundle != null){
|
||||
mDeviceEntity = (IndexDeviceEntity) bundle.getSerializable("device_info");
|
||||
mDeviceEntity = (WaterDeviceEntity) bundle.getSerializable("device_info");
|
||||
if(mDeviceEntity != null){
|
||||
showLoadingDialog();
|
||||
mPresenter.getDeviceDetailInfo(mDeviceEntity.getId());
|
||||
viewBinding.includedTitle.tvTitle.setText(mDeviceEntity.getDeviceName());
|
||||
if(mDeviceEntity.getWorkStatus().equals("1")){
|
||||
viewBinding.tvDeviceStatus.setText(getString(R.string.device_status_working));
|
||||
viewBinding.tvDeviceStatus.setTextColor(mContext.getResources().getColor(R.color.color_zhu));
|
||||
viewBinding.tvConfirm.setText(getString(R.string.device_control_stop));
|
||||
}else{
|
||||
viewBinding.tvDeviceStatus.setText(getString(R.string.device_status_not_working));
|
||||
viewBinding.tvDeviceStatus.setTextColor(mContext.getResources().getColor(R.color.color_999999));
|
||||
viewBinding.tvConfirm.setText(getString(R.string.device_control_start));
|
||||
}
|
||||
}
|
||||
}
|
||||
mTimeList.add("1min");
|
||||
@@ -83,8 +97,15 @@ public class DeviceControlActivity extends BaseActivity<DeviceControlLayoutBindi
|
||||
@Override
|
||||
public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
|
||||
mAdapter.setOnSelPosition(position);
|
||||
mCustomDuration = 0;
|
||||
viewBinding.tvWorkDuartion.setHint(getString(R.string.device_custom_work_time));
|
||||
viewBinding.tvWorkDuartion.setText("");
|
||||
}
|
||||
});
|
||||
//用户自定义时间
|
||||
if(mCustomDuration == 0){
|
||||
viewBinding.tvWorkDuartion.setHint(getString(R.string.device_custom_work_time));
|
||||
}
|
||||
|
||||
initListener();
|
||||
}
|
||||
@@ -96,6 +117,7 @@ public class DeviceControlActivity extends BaseActivity<DeviceControlLayoutBindi
|
||||
setClick(viewBinding.linearWifi);
|
||||
setClick(viewBinding.linearBat);
|
||||
setClick(viewBinding.tvConfirm);
|
||||
setClick(viewBinding.tvWorkDuartion);
|
||||
}
|
||||
|
||||
private void setClick(View view) {
|
||||
@@ -128,23 +150,118 @@ public class DeviceControlActivity extends BaseActivity<DeviceControlLayoutBindi
|
||||
.isDestroyOnDismiss(true) //对于只使用一次的弹窗,推荐设置这个
|
||||
.atView(viewBinding.linearBat)
|
||||
.hasShadowBg(false) // 去掉半透明背景
|
||||
.asCustom(new CustomBubbleAttachPopup(mContext,"设备电量:40% 更新时间: 05- 11 18:00"))
|
||||
.asCustom(new CustomBubbleAttachPopup(mContext,"设备电量:"+
|
||||
mDeviceEntity.getPowerLevel() + "%" +
|
||||
" 更新时间: 05- 11 18:00"))
|
||||
.show();
|
||||
break;
|
||||
|
||||
case R.id.tv_work_duartion:
|
||||
inputDuration(mCustomDuration);
|
||||
break;
|
||||
|
||||
case R.id.tv_confirm:
|
||||
showCenterTipDialog(R.mipmap.icon_dialog_success,"开始浇水");
|
||||
if(mCustomDuration == 0 && mAdapter.getmSelPostion() == -1){
|
||||
ToastUtil.showShort(mContext,"请选择浇水时长");
|
||||
return;
|
||||
}
|
||||
showCenterTipDialog(R.mipmap.icon_dialog_success,"开始浇水");//
|
||||
String status = mDeviceEntity.getStatus();
|
||||
if(status.equals("1")){
|
||||
status = "0";
|
||||
}else{
|
||||
status = "1";
|
||||
}
|
||||
mPresenter.switchDeviceWork(mDeviceEntity.getId(),status,
|
||||
mCustomDuration == 0 ? convertToMinutes(mTimeList.get(mAdapter.getmSelPostion()))
|
||||
: mCustomDuration);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 输入浇水时间
|
||||
* @param currentDuration
|
||||
*/
|
||||
private void inputDuration(int currentDuration) {
|
||||
showEditDialog(getString(R.string.device_work_times_title),
|
||||
getString(R.string.input_water_plan_time),
|
||||
currentDuration == 0 ? "" : currentDuration + "",
|
||||
true,
|
||||
getString(R.string.cancel_text),
|
||||
getString(R.string.confirm_text),
|
||||
INPUT_TYPE_NUMBER,
|
||||
new BaseActivity.OnDialogClick() {
|
||||
@Override
|
||||
public void onCancelClick() {}
|
||||
|
||||
@Override
|
||||
public void onConfirmClisk() {}
|
||||
|
||||
@Override
|
||||
public void onConfirmClisk(String content) {
|
||||
if (Integer.parseInt(content) <= 0) {
|
||||
ToastUtil.showShort(mContext, getString(R.string.input_water_plan_time_error));
|
||||
return;
|
||||
}
|
||||
viewBinding.tvWorkDuartion.setText(content);
|
||||
mCustomDuration = Integer.parseInt(content);
|
||||
if(mAdapter != null){
|
||||
mAdapter.setOnSelPosition(-1);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onView1Click() {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 将时间字符串转换为分钟数
|
||||
*
|
||||
* 1min -> 1
|
||||
* 10min -> 10
|
||||
* 1h -> 60
|
||||
* 2h -> 120
|
||||
*
|
||||
* @param timeValue 时间字符串
|
||||
* @return 分钟数
|
||||
*/
|
||||
public static int convertToMinutes(String timeValue) {
|
||||
if (TextUtils.isEmpty(timeValue)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
try {
|
||||
if (timeValue.endsWith("min")) {
|
||||
return Integer.parseInt(
|
||||
timeValue.substring(0, timeValue.length() - 3)
|
||||
);
|
||||
}
|
||||
|
||||
if (timeValue.endsWith("h")) {
|
||||
return Integer.parseInt(
|
||||
timeValue.substring(0, timeValue.length() - 1)
|
||||
) * 60;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
if(resultCode == RESULT_OK){
|
||||
switch (requestCode){
|
||||
case REQUEST_EVENT_CODE_10002:
|
||||
mDeviceEntity = (IndexDeviceEntity) data.getSerializableExtra("device_entity");
|
||||
mDeviceEntity = (WaterDeviceEntity) data.getSerializableExtra("device_entity");
|
||||
viewBinding.includedTitle.tvTitle.setText(mDeviceEntity.getDeviceName());
|
||||
break;
|
||||
}
|
||||
@@ -165,9 +282,11 @@ public class DeviceControlActivity extends BaseActivity<DeviceControlLayoutBindi
|
||||
* @param bean
|
||||
*/
|
||||
@Override
|
||||
public void getDeviceDetailInfo(IndexDeviceEntity bean) {
|
||||
public void getDeviceDetailInfo(WaterDeviceEntity bean) {
|
||||
hideDialogLoading();
|
||||
|
||||
viewBinding.imgBatStatus.setImageResource(PowerIconManage.getInstance().
|
||||
getPowerVerIcon(Integer.parseInt(bean.getPowerLevel())));
|
||||
mRemoteDeviceEntity = bean;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -9,7 +9,7 @@ import com.ckkj.water.databinding.DeviceInfoLayoutBinding;
|
||||
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.IndexDeviceEntity;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
import com.gyf.immersionbar.ImmersionBar;
|
||||
|
||||
@@ -73,7 +73,7 @@ public class DeviceInfoActivity extends BaseActivity<DeviceInfoLayoutBinding, De
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getDeviceDetailInfo(IndexDeviceEntity bean) {
|
||||
public void getDeviceDetailInfo(WaterDeviceEntity bean) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ import com.ckkj.water.databinding.SetDeviceNameLayoutBinding;
|
||||
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.IndexDeviceEntity;
|
||||
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.show.ToastUtil;
|
||||
@@ -87,7 +87,7 @@ public class DeviceReNameActivity extends BaseActivity<SetDeviceNameLayoutBindin
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getDeviceDetailInfo(IndexDeviceEntity bean) {
|
||||
public void getDeviceDetailInfo(WaterDeviceEntity bean) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -16,14 +16,12 @@ import com.ckkj.water.databinding.DeviceSettingsLayoutBinding;
|
||||
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.IndexDeviceEntity;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
import com.ckkj.water.utils.show.ToastUtil;
|
||||
import com.gyf.immersionbar.ImmersionBar;
|
||||
|
||||
import de.greenrobot.event.EventBus;
|
||||
import de.greenrobot.event.Subscribe;
|
||||
import de.greenrobot.event.ThreadMode;
|
||||
|
||||
/**
|
||||
* 设备控制页面
|
||||
@@ -31,7 +29,7 @@ import de.greenrobot.event.ThreadMode;
|
||||
public class DeviceSettingsActivity extends BaseActivity<DeviceSettingsLayoutBinding, DevicePresenter>
|
||||
implements DeviceContract.DeviceView {
|
||||
|
||||
private IndexDeviceEntity mDeviceEntity;
|
||||
private WaterDeviceEntity mDeviceEntity;
|
||||
@Override
|
||||
public DevicePresenter createPresenter() {
|
||||
return new DevicePresenter(new DeviceImpl());
|
||||
@@ -42,7 +40,7 @@ public class DeviceSettingsActivity extends BaseActivity<DeviceSettingsLayoutBin
|
||||
super.initData(savedInstanceState);
|
||||
Bundle bundle = getIntent().getExtras();
|
||||
if(bundle != null){
|
||||
mDeviceEntity = (IndexDeviceEntity) bundle.getSerializable("device_entity");
|
||||
mDeviceEntity = (WaterDeviceEntity) bundle.getSerializable("device_entity");
|
||||
viewBinding.tvDeviceName.setText(mDeviceEntity.getDeviceName());
|
||||
viewBinding.tvWifiName.setText(mDeviceEntity.getWifiName());
|
||||
|
||||
@@ -83,7 +81,9 @@ public class DeviceSettingsActivity extends BaseActivity<DeviceSettingsLayoutBin
|
||||
mDeviceEntity.getDeviceName(),
|
||||
true,
|
||||
getString(R.string.cancel_text),
|
||||
getString(R.string.confirm_text), new OnDialogClick() {
|
||||
getString(R.string.confirm_text),
|
||||
BaseActivity.INPUT_TYPE_NORMAL,
|
||||
new OnDialogClick() {
|
||||
@Override
|
||||
public void onCancelClick() {
|
||||
}
|
||||
@@ -209,7 +209,7 @@ public class DeviceSettingsActivity extends BaseActivity<DeviceSettingsLayoutBin
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getDeviceDetailInfo(IndexDeviceEntity bean) {
|
||||
public void getDeviceDetailInfo(WaterDeviceEntity bean) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -8,13 +8,12 @@ import android.content.IntentFilter;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.net.wifi.ScanResult;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.core.app.ActivityCompat;
|
||||
import androidx.recyclerview.widget.DividerItemDecoration;
|
||||
|
||||
import com.ckkj.water.ConstantUtil;
|
||||
import com.ckkj.water.R;
|
||||
@@ -23,13 +22,14 @@ import com.ckkj.water.databinding.DeviceResetWifiBinding;
|
||||
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.IndexDeviceEntity;
|
||||
import com.ckkj.water.espBle.EspProvisionManager;
|
||||
import com.ckkj.water.espBle.ProvisionCallback;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
import com.ckkj.water.permission.PermissionActivity;
|
||||
import com.ckkj.water.utils.manager.ActivityManager;
|
||||
import com.ckkj.water.utils.manager.ThemeManager;
|
||||
import com.ckkj.water.utils.show.ToastUtil;
|
||||
import com.ckkj.water.utils.text.TextUtil;
|
||||
import com.gyf.immersionbar.ImmersionBar;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -37,6 +37,9 @@ import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* 配置wifi
|
||||
*/
|
||||
public class SelectWifiActivity extends BaseActivity<DeviceResetWifiBinding, DevicePresenter>
|
||||
implements DeviceContract.DeviceView {
|
||||
|
||||
@@ -48,6 +51,11 @@ public class SelectWifiActivity extends BaseActivity<DeviceResetWifiBinding, Dev
|
||||
|
||||
private String mWifiName = "";
|
||||
|
||||
private WaterDeviceEntity mBleDeviceEntity;
|
||||
private EspProvisionManager espProvisionManager;
|
||||
private boolean isBleConnecting = false;
|
||||
private boolean isBleConnected = false;
|
||||
|
||||
@Override
|
||||
public DevicePresenter createPresenter() {
|
||||
return new DevicePresenter(new DeviceImpl());
|
||||
@@ -73,12 +81,22 @@ public class SelectWifiActivity extends BaseActivity<DeviceResetWifiBinding, Dev
|
||||
unregisterReceiver(wifiScanReceiver);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
if (WITCH_FROM_CODE == 100 && espProvisionManager != null) {
|
||||
espProvisionManager.disconnect();
|
||||
espProvisionManager.setCallback(null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initData(Bundle savedInstanceState) {
|
||||
super.initData(savedInstanceState);
|
||||
Bundle bundle = getIntent().getExtras();
|
||||
if(bundle != null){
|
||||
WITCH_FROM_CODE = bundle.getInt(ConstantUtil.ACTIVITY_NAVIGATE_FLAG);
|
||||
mBleDeviceEntity = (WaterDeviceEntity) bundle.getSerializable("ble_device_entity");
|
||||
}
|
||||
|
||||
ImmersionBar.with(this)
|
||||
@@ -93,6 +111,10 @@ public class SelectWifiActivity extends BaseActivity<DeviceResetWifiBinding, Dev
|
||||
|
||||
initListener();
|
||||
initWifiList();
|
||||
if (WITCH_FROM_CODE == 100) {
|
||||
initEspProvision();
|
||||
connectBleDevice();
|
||||
}
|
||||
}
|
||||
|
||||
private void initWifiList() {
|
||||
@@ -145,7 +167,7 @@ public class SelectWifiActivity extends BaseActivity<DeviceResetWifiBinding, Dev
|
||||
return;
|
||||
}
|
||||
if(WITCH_FROM_CODE == 100){
|
||||
goTo(mContext,DeviceConnectActivity.class,null);
|
||||
provisionWifi();
|
||||
}else{
|
||||
Intent intent = new Intent();
|
||||
intent.putExtra("wifi_name",mWifiName);
|
||||
@@ -157,6 +179,98 @@ public class SelectWifiActivity extends BaseActivity<DeviceResetWifiBinding, Dev
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 配置网络
|
||||
*/
|
||||
private void provisionWifi() {
|
||||
if (espProvisionManager == null) {
|
||||
ToastUtil.showShort(mContext, "设备连接未初始化");
|
||||
return;
|
||||
}
|
||||
if (!isBleConnected) {
|
||||
if (!isBleConnecting) {
|
||||
connectBleDevice();
|
||||
}
|
||||
ToastUtil.showShort(mContext, "设备连接中,请稍后再试");
|
||||
return;
|
||||
}
|
||||
espProvisionManager.provisionWifi(mWifiName, viewBinding.etInputPsd.getText().toString());
|
||||
// goTo(mContext,DeviceConnectActivity.class,null);
|
||||
}
|
||||
|
||||
private void initEspProvision() {
|
||||
espProvisionManager = EspProvisionManager.init(mContext).setCallback(new ProvisionCallback() {
|
||||
@Override
|
||||
public void onConnecting() {
|
||||
isBleConnecting = true;
|
||||
isBleConnected = false;
|
||||
Log.i("TEST","onConnecting");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConnected() {
|
||||
isBleConnecting = false;
|
||||
isBleConnected = true;
|
||||
Log.i("TEST","onConnected设备连接成功");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onProvisioning(int progress) {
|
||||
Log.i("TEST","WIFI连接进度 == " + progress);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(String deviceName, String deviceType) {
|
||||
Log.i("TEST","deviceName:" + deviceName + "连接成功");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailed(int errorCode, String message) {
|
||||
isBleConnecting = false;
|
||||
if (errorCode != 0) {
|
||||
isBleConnected = espProvisionManager != null && espProvisionManager.isConnected();
|
||||
}
|
||||
Log.i("TEST","errorCode == " + errorCode + " message == " + message);
|
||||
ToastUtil.showShort(mContext, message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisconnected() {
|
||||
isBleConnecting = false;
|
||||
isBleConnected = false;
|
||||
Log.i("TEST","onDisconnected");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onWifiListReceived(String[] wifiList) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onWifiListFailed(String message) {
|
||||
Log.i("TEST","onWifiListFailed-Msg==" + message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onProvisioningRejected() {
|
||||
Log.i("TEST","onProvisioningRejected");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 连接设备
|
||||
*/
|
||||
private void connectBleDevice() {
|
||||
if (WITCH_FROM_CODE != 100 || mBleDeviceEntity == null || espProvisionManager == null) {
|
||||
return;
|
||||
}
|
||||
if (isBleConnected || isBleConnecting) {
|
||||
return;
|
||||
}
|
||||
espProvisionManager.connect(mBleDeviceEntity.getMacAddress(), mBleDeviceEntity.getDeviceName());
|
||||
}
|
||||
|
||||
private void scanWifi() {
|
||||
showLoadingDialog();
|
||||
viewBinding.tvNext.setVisibility(View.GONE);
|
||||
@@ -198,7 +312,7 @@ public class SelectWifiActivity extends BaseActivity<DeviceResetWifiBinding, Dev
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getDeviceDetailInfo(IndexDeviceEntity bean) {
|
||||
public void getDeviceDetailInfo(WaterDeviceEntity bean) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
package com.ckkj.water.device.adapter;
|
||||
|
||||
import android.content.Context;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.chad.library.adapter.base.BaseQuickAdapter;
|
||||
import com.chad.library.adapter.base.BaseViewHolder;
|
||||
import com.ckkj.water.R;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author fengxiaoyang
|
||||
* @date 2026/6/3
|
||||
* @description 扫描到的设备适配器
|
||||
*/
|
||||
public class BleScanDeviceAdapter extends BaseQuickAdapter<WaterDeviceEntity, BaseViewHolder> {
|
||||
private Context mContext;
|
||||
public BleScanDeviceAdapter(Context context,int layoutResId, @Nullable List<WaterDeviceEntity> data) {
|
||||
super(layoutResId, data);
|
||||
mContext = context;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void convert(BaseViewHolder helper, WaterDeviceEntity item) {
|
||||
helper.setText(R.id.tv_device_name, TextUtils.isEmpty(item.getDeviceName())? "未知设备" : item.getDeviceName());
|
||||
}
|
||||
}
|
||||
@@ -17,7 +17,16 @@ public class DeviceTimeSelectAdapter extends BaseQuickAdapter<String, BaseViewHo
|
||||
private List<String> mDatas = new ArrayList<>();
|
||||
|
||||
private int mSelPostion = -1;
|
||||
public DeviceTimeSelectAdapter(Context context,int layoutResId, @Nullable List<String> data) {
|
||||
|
||||
public int getmSelPostion() {
|
||||
return mSelPostion;
|
||||
}
|
||||
|
||||
public void setmSelPostion(int mSelPostion) {
|
||||
this.mSelPostion = mSelPostion;
|
||||
}
|
||||
|
||||
public DeviceTimeSelectAdapter(Context context, int layoutResId, @Nullable List<String> data) {
|
||||
super(layoutResId, data);
|
||||
this.mContext = context;
|
||||
this.mDatas = data;
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.ckkj.water.device.manage;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import no.nordicsemi.android.ble.BleManager;
|
||||
|
||||
/**
|
||||
* @author fengxiaoyang
|
||||
* @date 2026/5/30
|
||||
* @description TODO: 描述该类的作用
|
||||
*/
|
||||
public class DeviceBleManager extends BleManager {
|
||||
public DeviceBleManager(@NonNull Context context) {
|
||||
super(context);
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.ckkj.water.device.mvp;
|
||||
|
||||
import com.ckkj.water.base.IView;
|
||||
import com.ckkj.water.index.entity.IndexDeviceEntity;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
import com.ckkj.water.index.mvp.IndexContract;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
|
||||
@@ -25,7 +25,7 @@ public class DeviceContract {
|
||||
void editDeviceInfo(JSONObject json, IndexContract.CallBack callBack);
|
||||
|
||||
//删除设备信息
|
||||
void deleteDevice(String id,JSONObject json, IndexContract.CallBack callBack);
|
||||
void deleteDevice(String id, IndexContract.CallBack callBack);
|
||||
|
||||
//手动开启关闭设备
|
||||
void turnOnOffDevice(JSONObject json, IndexContract.CallBack callBack);
|
||||
@@ -34,7 +34,7 @@ public class DeviceContract {
|
||||
public interface DeviceView extends IView {
|
||||
//添加设备成功g
|
||||
void addDeviceSuccess(BaseBean bean);
|
||||
void getDeviceDetailInfo(IndexDeviceEntity bean);
|
||||
void getDeviceDetailInfo(WaterDeviceEntity bean);
|
||||
void editDeviceInfoSuccess(BaseBean bean);
|
||||
void deleteDeviceSuccess(BaseBean bean);
|
||||
void turnOnOffDeviceSuccess(BaseBean bean);
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package com.ckkj.water.device.mvp;
|
||||
|
||||
import com.ckkj.water.base.entity.MineUserInfoBean;
|
||||
import com.ckkj.water.index.entity.IndexDeviceEntity;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
import com.ckkj.water.index.mvp.IndexContract;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
import com.ckkj.water.network.NetWorkManager;
|
||||
@@ -25,13 +24,13 @@ public class DeviceImpl implements DeviceContract.DataModel{
|
||||
.subscribeOn(Schedulers.io())
|
||||
.unsubscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Observer<BaseBean<IndexDeviceEntity>>() {
|
||||
.subscribe(new Observer<BaseBean<WaterDeviceEntity>>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseBean<IndexDeviceEntity> bean) {
|
||||
public void onNext(@NonNull BaseBean<WaterDeviceEntity> bean) {
|
||||
if (bean.getCode() == 200) {
|
||||
callBack.success(bean.getData(),0);
|
||||
}
|
||||
@@ -130,11 +129,10 @@ public class DeviceImpl implements DeviceContract.DataModel{
|
||||
|
||||
/**
|
||||
* 删除设备
|
||||
* @param json
|
||||
* @param callBack
|
||||
*/
|
||||
@Override
|
||||
public void deleteDevice(String devID,JSONObject json, IndexContract.CallBack callBack) {
|
||||
public void deleteDevice(String devID, IndexContract.CallBack callBack) {
|
||||
try {
|
||||
NetWorkManager.getRequest().unBindDevice(NetWorkManager.getToken(), devID)
|
||||
.subscribeOn(Schedulers.io())
|
||||
@@ -168,8 +166,43 @@ public class DeviceImpl implements DeviceContract.DataModel{
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 手动开启关闭设备
|
||||
* @param json
|
||||
* @param callBack
|
||||
*/
|
||||
@Override
|
||||
public void turnOnOffDevice(JSONObject json, IndexContract.CallBack callBack) {
|
||||
try {
|
||||
NetWorkManager.getRequest().switchDevice(NetWorkManager.getToken(), NetWorkManager.toRequestBody(json))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.unsubscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Observer<BaseBean>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseBean bean) {
|
||||
if (bean.getCode() == 200) {
|
||||
callBack.success(bean,0);
|
||||
} else {
|
||||
callBack.fail(bean.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(@NonNull Throwable e) {
|
||||
callBack.fail(e.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
}
|
||||
});
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
package com.ckkj.water.device.mvp;
|
||||
|
||||
import com.ckkj.water.base.BasePresenter;
|
||||
import com.ckkj.water.index.entity.IndexDeviceEntity;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
import com.ckkj.water.index.mvp.IndexContract;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
@@ -61,9 +60,9 @@ public class DevicePresenter extends BasePresenter<DeviceContract.DeviceView> {
|
||||
public void getDeviceDetailInfo(String deviceID) {
|
||||
Map<String,String> map = new HashMap<>();
|
||||
map.put("id",deviceID);
|
||||
impl.getDeviceInfomation(map, new IndexContract.CallBack<IndexDeviceEntity>() {
|
||||
impl.getDeviceInfomation(map, new IndexContract.CallBack<WaterDeviceEntity>() {
|
||||
@Override
|
||||
public void success(IndexDeviceEntity bean,int total) {
|
||||
public void success(WaterDeviceEntity bean, int total) {
|
||||
if(DevicePresenter.this.getView() != null){
|
||||
DevicePresenter.this.getView().getDeviceDetailInfo(bean);
|
||||
}
|
||||
@@ -82,7 +81,7 @@ public class DevicePresenter extends BasePresenter<DeviceContract.DeviceView> {
|
||||
* 修改设备信息
|
||||
* @param mDeviceEntity
|
||||
*/
|
||||
public void updateDeviceInfo(IndexDeviceEntity mDeviceEntity) {
|
||||
public void updateDeviceInfo(WaterDeviceEntity mDeviceEntity) {
|
||||
try {
|
||||
JSONObject json = new JSONObject();
|
||||
json.put("id",mDeviceEntity.getId());
|
||||
@@ -113,14 +112,8 @@ public class DevicePresenter extends BasePresenter<DeviceContract.DeviceView> {
|
||||
* 解绑设备
|
||||
* @param deviceEntity
|
||||
*/
|
||||
public void unBindDevice(IndexDeviceEntity deviceEntity) {
|
||||
try {
|
||||
// 构造JSON数组格式的请求体 ["2052921001527869441"]
|
||||
JSONArray jsonArray = new JSONArray();
|
||||
jsonArray.put(deviceEntity.getId());
|
||||
JSONObject json = new JSONObject();
|
||||
json.put("ids", jsonArray);
|
||||
impl.deleteDevice(deviceEntity.getId(),json, new IndexContract.CallBack<BaseBean>() {
|
||||
public void unBindDevice(WaterDeviceEntity deviceEntity) {
|
||||
impl.deleteDevice(deviceEntity.getId(), new IndexContract.CallBack<BaseBean>() {
|
||||
@Override
|
||||
public void success(BaseBean bean, int total) {
|
||||
if (DevicePresenter.this.getView() != null) {
|
||||
@@ -135,6 +128,36 @@ public class DevicePresenter extends BasePresenter<DeviceContract.DeviceView> {
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 开启/关闭浇水
|
||||
* @param id
|
||||
* @param status
|
||||
* @param duration
|
||||
*/
|
||||
public void switchDeviceWork(String id, String status, int duration) {
|
||||
try {
|
||||
JSONObject json = new JSONObject();
|
||||
json.put("id",id);
|
||||
json.put("workStatus",status);
|
||||
// json.put("startTime","09:50");
|
||||
json.put("durationMin",duration + "");
|
||||
impl.turnOnOffDevice(json, new IndexContract.CallBack<BaseBean>() {
|
||||
@Override
|
||||
public void success(BaseBean bean,int total) {
|
||||
if(DevicePresenter.this.getView() != null){
|
||||
DevicePresenter.this.getView().turnOnOffDeviceSuccess(bean);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fail(String msg) {
|
||||
if(DevicePresenter.this.getView() != null){
|
||||
DevicePresenter.this.getView().showError( msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (JSONException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
517
app/src/main/java/com/ckkj/water/espBle/EspProvisionManager.java
Normal file
517
app/src/main/java/com/ckkj/water/espBle/EspProvisionManager.java
Normal file
@@ -0,0 +1,517 @@
|
||||
package com.ckkj.water.espBle;
|
||||
|
||||
import android.bluetooth.BluetoothAdapter;
|
||||
import android.bluetooth.BluetoothDevice;
|
||||
import android.content.Context;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import com.ckkj.water.AppConfig;
|
||||
import com.espressif.provisioning.DeviceConnectionEvent;
|
||||
import com.espressif.provisioning.ESPConstants;
|
||||
import com.espressif.provisioning.ESPDevice;
|
||||
import com.espressif.provisioning.WiFiAccessPoint;
|
||||
import com.espressif.provisioning.listeners.ProvisionListener;
|
||||
import com.espressif.provisioning.listeners.WiFiScanListener;
|
||||
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
import org.greenrobot.eventbus.Subscribe;
|
||||
import org.greenrobot.eventbus.ThreadMode;
|
||||
|
||||
|
||||
/**
|
||||
* @author fengxiaoyang
|
||||
* @date 2026/6/4
|
||||
* @description 鎿嶄綔钃濈墮绠$悊绫?
|
||||
*/
|
||||
public class EspProvisionManager {
|
||||
private static volatile EspProvisionManager instance;
|
||||
|
||||
private final Context context;
|
||||
private final Handler mainHandler;
|
||||
private final com.espressif.provisioning.ESPProvisionManager provisionManager;
|
||||
|
||||
private ESPDevice espDevice;
|
||||
private ProvisionCallback callback;
|
||||
private boolean connecting;
|
||||
private boolean connected;
|
||||
private boolean provisioning;
|
||||
private boolean eventBusRegistered;
|
||||
private boolean ignoreNextDisconnectEvent;
|
||||
private String currentDeviceName;
|
||||
private String currentDeviceType = ProvisionConfig.TRANSPORT_BLE;
|
||||
|
||||
private final Runnable connectionTimeoutTask = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (connecting && !connected) {
|
||||
connecting = false;
|
||||
notifyFailed(ProvisionConfig.ERROR_CONNECT_TIMEOUT, "蓝牙连接超时");
|
||||
disconnectDeviceOnly();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private final Runnable provisionTimeoutTask = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (provisioning) {
|
||||
finishProvisionFailed(ProvisionConfig.ERROR_PROVISION_TIMEOUT, "配网超时");
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private EspProvisionManager(Context context) {
|
||||
this.context = context.getApplicationContext();
|
||||
this.mainHandler = new Handler(Looper.getMainLooper());
|
||||
this.provisionManager = com.espressif.provisioning.ESPProvisionManager.getInstance(this.context);
|
||||
ensureEventBusRegistered();
|
||||
}
|
||||
|
||||
public static EspProvisionManager init(Context context) {
|
||||
if (instance == null) {
|
||||
synchronized (EspProvisionManager.class) {
|
||||
if (instance == null) {
|
||||
instance = new EspProvisionManager(context);
|
||||
}
|
||||
}
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
public static EspProvisionManager get() {
|
||||
if (instance == null) {
|
||||
throw new RuntimeException("Please call init()");
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
public EspProvisionManager setCallback(ProvisionCallback callback) {
|
||||
this.callback = callback;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ESPDevice getEspDevice() {
|
||||
return espDevice;
|
||||
}
|
||||
|
||||
public boolean isConnected() {
|
||||
return connected;
|
||||
}
|
||||
|
||||
public boolean isProvisioning() {
|
||||
return provisioning;
|
||||
}
|
||||
|
||||
public void connect(String deviceAddress, String deviceName) {
|
||||
connect(deviceAddress, deviceName, AppConfig.BLUETOOTH_DEVICE_UUID);
|
||||
}
|
||||
|
||||
public void connect(String deviceAddress, String deviceName, String serviceUuid) {
|
||||
connect(deviceAddress, deviceName, serviceUuid, "", ProvisionConfig.DEFAULT_SECURITY);
|
||||
}
|
||||
|
||||
public void connect(String deviceAddress, String deviceName, String serviceUuid,
|
||||
String proofOfPossession, int securityType) {
|
||||
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
|
||||
if (bluetoothAdapter == null || TextUtils.isEmpty(deviceAddress)) {
|
||||
notifyFailed(ProvisionConfig.ERROR_INVALID_DEVICE, "蓝牙设备无效");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
BluetoothDevice bluetoothDevice = bluetoothAdapter.getRemoteDevice(deviceAddress);
|
||||
connect(bluetoothDevice, deviceName, serviceUuid, proofOfPossession, securityType);
|
||||
} catch (IllegalArgumentException e) {
|
||||
notifyFailed(ProvisionConfig.ERROR_INVALID_DEVICE, "蓝牙设备地址无效");
|
||||
}
|
||||
}
|
||||
|
||||
public void connect(BluetoothDevice bluetoothDevice, String serviceUuid) {
|
||||
connect(bluetoothDevice, null, serviceUuid, "", ProvisionConfig.DEFAULT_SECURITY);
|
||||
}
|
||||
|
||||
public void connect(BluetoothDevice bluetoothDevice, String deviceName, String serviceUuid,
|
||||
String proofOfPossession, int securityType) {
|
||||
connect(bluetoothDevice, deviceName, serviceUuid, proofOfPossession, "", securityType);
|
||||
}
|
||||
|
||||
public void connect(BluetoothDevice bluetoothDevice, String deviceName, String serviceUuid,
|
||||
String proofOfPossession, String userName, int securityType) {
|
||||
if (bluetoothDevice == null) {
|
||||
notifyFailed(ProvisionConfig.ERROR_INVALID_DEVICE, "蓝牙设备无效");
|
||||
return;
|
||||
}
|
||||
|
||||
String primaryServiceUuid = TextUtils.isEmpty(serviceUuid) ? ProvisionConfig.SERVICE_UUID : serviceUuid;
|
||||
String displayName = !TextUtils.isEmpty(deviceName) ? deviceName : bluetoothDevice.getName();
|
||||
currentDeviceName = displayName;
|
||||
currentDeviceType = ProvisionConfig.TRANSPORT_BLE;
|
||||
|
||||
ignoreNextDisconnectEvent = espDevice != null;
|
||||
disconnectDeviceOnly();
|
||||
ensureEventBusRegistered();
|
||||
|
||||
espDevice = provisionManager.createESPDevice(
|
||||
ESPConstants.TransportType.TRANSPORT_BLE,
|
||||
parseSecurityType(securityType)
|
||||
);
|
||||
espDevice.setBluetoothDevice(bluetoothDevice);
|
||||
espDevice.setPrimaryServiceUuid(primaryServiceUuid);
|
||||
espDevice.setDeviceName(displayName);
|
||||
espDevice.setProofOfPossession(proofOfPossession == null ? "" : proofOfPossession);
|
||||
espDevice.setUserName(userName == null ? "" : userName);
|
||||
|
||||
connecting = true;
|
||||
connected = false;
|
||||
provisioning = false;
|
||||
mainHandler.removeCallbacks(connectionTimeoutTask);
|
||||
mainHandler.postDelayed(connectionTimeoutTask, ProvisionConfig.CONNECTION_TIMEOUT);
|
||||
notifyConnecting();
|
||||
espDevice.connectBLEDevice(bluetoothDevice, primaryServiceUuid);
|
||||
}
|
||||
|
||||
public void scanDeviceWifiList() {
|
||||
if (!checkConnected()) {
|
||||
notifyWifiListFailed("设备未连接");
|
||||
return;
|
||||
}
|
||||
|
||||
espDevice.scanNetworks(new WiFiScanListener() {
|
||||
@Override
|
||||
public void onWifiListReceived(ArrayList<WiFiAccessPoint> wifiList) {
|
||||
Set<String> wifiNames = new LinkedHashSet<>();
|
||||
if (wifiList != null) {
|
||||
for (WiFiAccessPoint accessPoint : wifiList) {
|
||||
if (accessPoint != null && !TextUtils.isEmpty(accessPoint.getWifiName())) {
|
||||
wifiNames.add(accessPoint.getWifiName());
|
||||
}
|
||||
}
|
||||
}
|
||||
notifyWifiListReceived(wifiNames.toArray(new String[0]));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onWiFiScanFailed(Exception e) {
|
||||
notifyWifiListFailed(getErrorMessage(e, "获取设备 WiFi 列表失败"));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void provision(String ssid, String password) {
|
||||
provisionWifi(ssid, password);
|
||||
}
|
||||
|
||||
public void provisionWifi(String ssid, String password) {
|
||||
if (!checkConnected()) {
|
||||
notifyFailed(ProvisionConfig.ERROR_NOT_CONNECTED, "设备未连接");
|
||||
return;
|
||||
}
|
||||
|
||||
if (TextUtils.isEmpty(ssid)) {
|
||||
notifyFailed(ProvisionConfig.ERROR_WIFI_CONFIG_FAILED, "WiFi 名称不能为空");
|
||||
return;
|
||||
}
|
||||
|
||||
provisioning = true;
|
||||
mainHandler.removeCallbacks(provisionTimeoutTask);
|
||||
mainHandler.postDelayed(provisionTimeoutTask, ProvisionConfig.PROVISION_TIMEOUT);
|
||||
notifyProvisioning(0);
|
||||
|
||||
espDevice.provision(ssid, password == null ? "" : password, new ProvisionListener() {
|
||||
@Override
|
||||
public void createSessionFailed(Exception e) {
|
||||
finishProvisionFailed(ProvisionConfig.ERROR_SESSION_FAILED, getErrorMessage(e, "创建配网会话失败"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void wifiConfigSent() {
|
||||
notifyProvisioning(30);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void wifiConfigFailed(Exception e) {
|
||||
notifyProvisioningRejected();
|
||||
finishProvisionFailed(ProvisionConfig.ERROR_WIFI_CONFIG_FAILED, getErrorMessage(e, "发送 WiFi 信息失败"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void wifiConfigApplied() {
|
||||
notifyProvisioning(60);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void wifiConfigApplyFailed(Exception e) {
|
||||
finishProvisionFailed(ProvisionConfig.ERROR_WIFI_APPLY_FAILED, getErrorMessage(e, "应用 WiFi 信息失败"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void provisioningFailedFromDevice(ESPConstants.ProvisionFailureReason failureReason) {
|
||||
finishProvisionFailed(ProvisionConfig.ERROR_PROVISION_FAILED, getProvisionFailureMessage(failureReason));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deviceProvisioningSuccess() {
|
||||
finishProvisionSuccess();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onProvisioningFailed(Exception e) {
|
||||
finishProvisionFailed(ProvisionConfig.ERROR_PROVISION_FAILED, getErrorMessage(e, "配网失败"));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void disconnect() {
|
||||
boolean shouldNotify = connected || connecting || provisioning;
|
||||
disconnectDeviceOnly();
|
||||
resetState();
|
||||
if (shouldNotify) {
|
||||
notifyDisconnected();
|
||||
}
|
||||
}
|
||||
|
||||
public void release() {
|
||||
disconnect();
|
||||
callback = null;
|
||||
mainHandler.removeCallbacksAndMessages(null);
|
||||
if (eventBusRegistered) {
|
||||
EventBus.getDefault().unregister(this);
|
||||
eventBusRegistered = false;
|
||||
}
|
||||
if (instance == this) {
|
||||
instance = null;
|
||||
}
|
||||
}
|
||||
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
public void onDeviceConnectionEvent(DeviceConnectionEvent event) {
|
||||
if (event == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
switch (event.getEventType()) {
|
||||
case ESPConstants.EVENT_DEVICE_CONNECTED:
|
||||
mainHandler.removeCallbacks(connectionTimeoutTask);
|
||||
connecting = false;
|
||||
connected = true;
|
||||
notifyConnected();
|
||||
break;
|
||||
|
||||
case ESPConstants.EVENT_DEVICE_CONNECTION_FAILED:
|
||||
mainHandler.removeCallbacks(connectionTimeoutTask);
|
||||
mainHandler.removeCallbacks(provisionTimeoutTask);
|
||||
boolean wasConnecting = connecting;
|
||||
connecting = false;
|
||||
connected = false;
|
||||
provisioning = false;
|
||||
if (wasConnecting) {
|
||||
notifyFailed(ProvisionConfig.ERROR_CONNECT_FAILED, "蓝牙连接失败");
|
||||
} else {
|
||||
notifyFailed(ProvisionConfig.ERROR_PROVISION_FAILED, "设备通信失败");
|
||||
}
|
||||
break;
|
||||
|
||||
case ESPConstants.EVENT_DEVICE_DISCONNECTED:
|
||||
if (ignoreNextDisconnectEvent) {
|
||||
ignoreNextDisconnectEvent = false;
|
||||
return;
|
||||
}
|
||||
mainHandler.removeCallbacks(connectionTimeoutTask);
|
||||
mainHandler.removeCallbacks(provisionTimeoutTask);
|
||||
boolean shouldNotify = connected || connecting || provisioning;
|
||||
resetState();
|
||||
if (shouldNotify) {
|
||||
notifyDisconnected();
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean checkConnected() {
|
||||
return espDevice != null && connected;
|
||||
}
|
||||
|
||||
private void ensureEventBusRegistered() {
|
||||
if (!eventBusRegistered) {
|
||||
EventBus.getDefault().register(this);
|
||||
eventBusRegistered = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void disconnectDeviceOnly() {
|
||||
if (espDevice != null) {
|
||||
try {
|
||||
espDevice.disconnectDevice();
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void resetState() {
|
||||
mainHandler.removeCallbacks(connectionTimeoutTask);
|
||||
mainHandler.removeCallbacks(provisionTimeoutTask);
|
||||
connecting = false;
|
||||
connected = false;
|
||||
provisioning = false;
|
||||
ignoreNextDisconnectEvent = false;
|
||||
}
|
||||
|
||||
private ESPConstants.SecurityType parseSecurityType(int securityType) {
|
||||
if (securityType == ProvisionConfig.SECURITY_0) {
|
||||
return ESPConstants.SecurityType.SECURITY_0;
|
||||
} else if (securityType == ProvisionConfig.SECURITY_1) {
|
||||
return ESPConstants.SecurityType.SECURITY_1;
|
||||
} else {
|
||||
return ESPConstants.SecurityType.SECURITY_2;
|
||||
}
|
||||
}
|
||||
|
||||
private void finishProvisionSuccess() {
|
||||
mainHandler.removeCallbacks(provisionTimeoutTask);
|
||||
provisioning = false;
|
||||
notifyProvisioning(100);
|
||||
notifySuccess();
|
||||
}
|
||||
|
||||
private void finishProvisionFailed(int errorCode, String message) {
|
||||
mainHandler.removeCallbacks(provisionTimeoutTask);
|
||||
provisioning = false;
|
||||
notifyFailed(errorCode, message);
|
||||
}
|
||||
|
||||
private String getProvisionFailureMessage(ESPConstants.ProvisionFailureReason failureReason) {
|
||||
if (failureReason == ESPConstants.ProvisionFailureReason.AUTH_FAILED) {
|
||||
return "WiFi 密码错误";
|
||||
} else if (failureReason == ESPConstants.ProvisionFailureReason.NETWORK_NOT_FOUND) {
|
||||
return "未找到指定 WiFi";
|
||||
} else if (failureReason == ESPConstants.ProvisionFailureReason.DEVICE_DISCONNECTED) {
|
||||
return "设备已断开连接";
|
||||
} else {
|
||||
return "设备配网失败";
|
||||
}
|
||||
}
|
||||
|
||||
private String getErrorMessage(Exception e, String defaultMessage) {
|
||||
if (e != null && !TextUtils.isEmpty(e.getMessage())) {
|
||||
return e.getMessage();
|
||||
}
|
||||
return defaultMessage;
|
||||
}
|
||||
|
||||
private void runOnMainThread(Runnable runnable) {
|
||||
if (Looper.myLooper() == Looper.getMainLooper()) {
|
||||
runnable.run();
|
||||
} else {
|
||||
mainHandler.post(runnable);
|
||||
}
|
||||
}
|
||||
|
||||
private void notifyConnecting() {
|
||||
runOnMainThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (callback != null) {
|
||||
callback.onConnecting();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void notifyConnected() {
|
||||
runOnMainThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (callback != null) {
|
||||
callback.onConnected();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void notifyProvisioning(final int progress) {
|
||||
runOnMainThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (callback != null) {
|
||||
callback.onProvisioning(progress);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void notifySuccess() {
|
||||
runOnMainThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (callback != null) {
|
||||
callback.onSuccess(currentDeviceName, currentDeviceType);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void notifyFailed(final int errorCode, final String message) {
|
||||
runOnMainThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (callback != null) {
|
||||
callback.onFailed(errorCode, message);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void notifyDisconnected() {
|
||||
runOnMainThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (callback != null) {
|
||||
callback.onDisconnected();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void notifyWifiListReceived(final String[] wifiList) {
|
||||
runOnMainThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (callback != null) {
|
||||
callback.onWifiListReceived(wifiList);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void notifyWifiListFailed(final String message) {
|
||||
runOnMainThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (callback != null) {
|
||||
callback.onWifiListFailed(message);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void notifyProvisioningRejected() {
|
||||
runOnMainThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (callback != null) {
|
||||
callback.onProvisioningRejected();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
package com.ckkj.water.espBle;
|
||||
|
||||
/**
|
||||
* @author fengxiaoyang
|
||||
* @date 2026/6/4
|
||||
* @description 蓝牙设备配网回调接口
|
||||
*/
|
||||
public interface ProvisionCallback {
|
||||
|
||||
/**
|
||||
* 正在连接设备
|
||||
*/
|
||||
void onConnecting();
|
||||
|
||||
/**
|
||||
* 设备连接成功
|
||||
*/
|
||||
void onConnected();
|
||||
|
||||
/**
|
||||
* 正在配网中
|
||||
* @param progress 配网进度 (0-100)
|
||||
*/
|
||||
void onProvisioning(int progress);
|
||||
|
||||
/**
|
||||
* 配网成功
|
||||
* @param deviceName 设备名称
|
||||
* @param deviceType 设备类型
|
||||
*/
|
||||
void onSuccess(String deviceName, String deviceType);
|
||||
|
||||
/**
|
||||
* 配网失败
|
||||
* @param errorCode 错误码
|
||||
* @param message 错误信息
|
||||
*/
|
||||
void onFailed(int errorCode, String message);
|
||||
|
||||
/**
|
||||
* 设备断开连接
|
||||
*/
|
||||
void onDisconnected();
|
||||
|
||||
/**
|
||||
* WiFi列表获取成功
|
||||
* @param wifiList WiFi列表
|
||||
*/
|
||||
void onWifiListReceived(String[] wifiList);
|
||||
|
||||
/**
|
||||
* 获取WiFi列表失败
|
||||
* @param message 错误信息
|
||||
*/
|
||||
void onWifiListFailed(String message);
|
||||
|
||||
/**
|
||||
* 配网被拒绝(设备端拒绝配网请求)
|
||||
*/
|
||||
void onProvisioningRejected();
|
||||
}
|
||||
125
app/src/main/java/com/ckkj/water/espBle/ProvisionConfig.java
Normal file
125
app/src/main/java/com/ckkj/water/espBle/ProvisionConfig.java
Normal file
@@ -0,0 +1,125 @@
|
||||
package com.ckkj.water.espBle;
|
||||
|
||||
import android.os.Build;
|
||||
|
||||
import com.espressif.provisioning.ESPConstants;
|
||||
|
||||
/**
|
||||
* @author fengxiaoyang
|
||||
* @date 2026/6/4
|
||||
* @description 蓝牙配网配置管理类
|
||||
*/
|
||||
public class ProvisionConfig {
|
||||
|
||||
/**
|
||||
* ESP BLE Service UUID
|
||||
*/
|
||||
public static final String SERVICE_UUID =
|
||||
"0000ffff-0000-1000-8000-00805f9b34fb";
|
||||
|
||||
/**
|
||||
* ESP BLE Characteristic UUID for writes
|
||||
*/
|
||||
public static final String CHARACTERISTIC_UUID =
|
||||
"0000ff01-0000-1000-8000-00805f9b34fb";
|
||||
|
||||
/**
|
||||
* ESP BLE Characteristic UUID for notifications
|
||||
*/
|
||||
public static final String NOTIFY_UUID =
|
||||
"0000ff02-0000-1000-8000-00805f9b34fb";
|
||||
|
||||
/**
|
||||
* 设备传输的协议类型
|
||||
*/
|
||||
public static final String TRANSPORT_BLE = "ble";
|
||||
|
||||
/**
|
||||
* 设备前缀 (用于过滤设备)
|
||||
*/
|
||||
public static final String DEVICE_PREFIX = "PROV_";
|
||||
|
||||
/**
|
||||
* 安全类型 - SECURITY_0 (无安全)
|
||||
*/
|
||||
public static final int SECURITY_0 = ESPConstants.SecurityType.SECURITY_0.ordinal();
|
||||
|
||||
/**
|
||||
* 安全类型 - SECURITY_1 (推荐)
|
||||
*/
|
||||
public static final int SECURITY_1 = ESPConstants.SecurityType.SECURITY_1.ordinal();
|
||||
|
||||
/**
|
||||
* 默认安全类型
|
||||
*/
|
||||
public static final int DEFAULT_SECURITY = SECURITY_1;
|
||||
|
||||
/**
|
||||
* 连接超时时间 (毫秒)
|
||||
*/
|
||||
public static final int CONNECTION_TIMEOUT = 30000;
|
||||
|
||||
/**
|
||||
* 配网超时时间 (毫秒)
|
||||
*/
|
||||
public static final int PROVISION_TIMEOUT = 120000;
|
||||
|
||||
public static final int ERROR_NOT_INITIALIZED = 1000;
|
||||
|
||||
public static final int ERROR_INVALID_DEVICE = 1001;
|
||||
|
||||
public static final int ERROR_CONNECT_TIMEOUT = 1002;
|
||||
|
||||
public static final int ERROR_CONNECT_FAILED = 1003;
|
||||
|
||||
public static final int ERROR_NOT_CONNECTED = 1004;
|
||||
|
||||
public static final int ERROR_SESSION_FAILED = 1005;
|
||||
|
||||
public static final int ERROR_WIFI_CONFIG_FAILED = 1006;
|
||||
|
||||
public static final int ERROR_WIFI_APPLY_FAILED = 1007;
|
||||
|
||||
public static final int ERROR_PROVISION_FAILED = 1008;
|
||||
|
||||
public static final int ERROR_PROVISION_TIMEOUT = 1009;
|
||||
|
||||
public static final int ERROR_WIFI_SCAN_FAILED = 1010;
|
||||
|
||||
/**
|
||||
* 配网版本 (可根据实际固件调整)
|
||||
*/
|
||||
public static final String VERSION = "v1.1";
|
||||
|
||||
/**
|
||||
* 生成蓝牙扫描过滤器
|
||||
* @return 服务UUID数组
|
||||
*/
|
||||
public static String[] getScanServiceUuids() {
|
||||
return new String[]{SERVICE_UUID};
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成设备前缀过滤器 (用于过滤非ESP设备)
|
||||
* @return 设备前缀
|
||||
*/
|
||||
public static String getDevicePrefix() {
|
||||
return DEVICE_PREFIX;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前Android版本号
|
||||
* @return Android版本号
|
||||
*/
|
||||
public static int getAndroidVersion() {
|
||||
return Build.VERSION.SDK_INT;
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否为Android 10及以上版本
|
||||
* @return true 表示支持
|
||||
*/
|
||||
public static boolean isAndroid10OrAbove() {
|
||||
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q;
|
||||
}
|
||||
}
|
||||
@@ -135,6 +135,11 @@ public class GuideActivity extends BaseActivity<GuideActivityLayoutBinding, Logi
|
||||
public void loginBySmsCodeSuccess(LoginEntity entity) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateUserPasswordSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
class MyAdapter extends PagerAdapter {
|
||||
@Override
|
||||
public int getCount() {
|
||||
|
||||
@@ -10,6 +10,8 @@ import androidx.fragment.app.Fragment;
|
||||
import com.ckkj.water.R;
|
||||
import com.ckkj.water.base.BaseFragment;
|
||||
import com.ckkj.water.databinding.HistoryFragmentLayoutBinding;
|
||||
import com.ckkj.water.history.entity.WaterStatisticsEntity;
|
||||
import com.ckkj.water.history.entity.WateringRecord;
|
||||
import com.ckkj.water.history.mvp.HistoryContract;
|
||||
import com.ckkj.water.history.mvp.HistoryPresenter;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
@@ -97,4 +99,19 @@ public class HistoryFragment extends BaseFragment<HistoryFragmentLayoutBinding,
|
||||
public void logOut(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getHistoryListSuccess(List<WateringRecord> msg, int total) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteHistorySuccess(BaseBean msg, int position) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getHistoryStatisticsSuccess(WaterStatisticsEntity entity) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,25 +4,56 @@ import android.os.Bundle;
|
||||
|
||||
import com.ckkj.water.base.BaseFragment;
|
||||
import com.ckkj.water.databinding.WaterCountFragmentLayoutBinding;
|
||||
import com.ckkj.water.history.entity.WaterStatisticsEntity;
|
||||
import com.ckkj.water.history.entity.WateringRecord;
|
||||
import com.ckkj.water.history.mvp.HistoryContract;
|
||||
import com.ckkj.water.history.mvp.HistoryImpl;
|
||||
import com.ckkj.water.history.mvp.HistoryPresenter;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
|
||||
import com.ckkj.water.plan.mvp.WaterPlanContract;
|
||||
import com.ckkj.water.plan.mvp.WaterPlanImpl;
|
||||
import com.ckkj.water.plan.mvp.WaterPlanPresenter;
|
||||
import com.ckkj.water.utils.show.ToastUtil;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author fengxiaoyang
|
||||
* @date 2026/5/16
|
||||
* @description TODO: 描述该类的作用
|
||||
* @description TODO: 统计界面
|
||||
*/
|
||||
public class StatisticFragment extends BaseFragment<WaterCountFragmentLayoutBinding, WaterPlanPresenter>
|
||||
implements WaterPlanContract.WaterPlanView {
|
||||
public class StatisticFragment extends BaseFragment<WaterCountFragmentLayoutBinding, HistoryPresenter>
|
||||
implements HistoryContract.HistoryView {
|
||||
|
||||
@Override
|
||||
protected void onResumeInitData() {
|
||||
super.onResumeInitData();
|
||||
showLoadingDialog();
|
||||
mPresenter.getWaterStatistic();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initData(Bundle state) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public WaterPlanPresenter createPresenter() {
|
||||
return null;
|
||||
public void getHistoryStatisticsSuccess(WaterStatisticsEntity entity) {
|
||||
hideDialogLoading();
|
||||
viewBinding.tvTotalValue.setText(entity.getCount()+"");
|
||||
viewBinding.tvThisWeekValue.setText(entity.getWeekCount()+"");
|
||||
viewBinding.tvThisMonthValue.setText(entity.getMonCount()+"");
|
||||
viewBinding.tvPlanValue.setText(entity.getSchedule()+"");
|
||||
viewBinding.tvManuallyValue.setText(entity.getManualNum()+"");
|
||||
viewBinding.tvTotalDurationValue.setText(entity.getAllTime()+"");
|
||||
// viewBinding.tvTotalValue.setText(entity.getCount()+"");
|
||||
}
|
||||
|
||||
@Override
|
||||
public HistoryPresenter createPresenter() {
|
||||
return new HistoryPresenter(new HistoryImpl());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -32,11 +63,24 @@ public class StatisticFragment extends BaseFragment<WaterCountFragmentLayoutBind
|
||||
|
||||
@Override
|
||||
public void showError(String message) {
|
||||
|
||||
hideDialogLoading();
|
||||
ToastUtil.showShort(mContext,message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void logOut(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getHistoryListSuccess(List<WateringRecord> msg, int total) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteHistorySuccess(BaseBean msg, int position) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -8,10 +8,13 @@ import com.ckkj.water.R;
|
||||
import com.ckkj.water.base.BaseFragment;
|
||||
import com.ckkj.water.custom.CustomTimeFilterPopupView;
|
||||
import com.ckkj.water.custom.CustomTypeFilterPopupView;
|
||||
import com.ckkj.water.custom.view.CustomRefreshHeader;
|
||||
import com.ckkj.water.databinding.TabHistoryFragmentLayoutBinding;
|
||||
import com.ckkj.water.history.adapter.WateringHistoryAdapter;
|
||||
import com.ckkj.water.history.entity.WaterStatisticsEntity;
|
||||
import com.ckkj.water.history.entity.WateringRecord;
|
||||
import com.ckkj.water.history.mvp.HistoryContract;
|
||||
import com.ckkj.water.history.mvp.HistoryImpl;
|
||||
import com.ckkj.water.history.mvp.HistoryPresenter;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
|
||||
@@ -21,6 +24,8 @@ import com.google.gson.reflect.TypeToken;
|
||||
import com.lxj.xpopup.XPopup;
|
||||
import com.lxj.xpopup.core.BasePopupView;
|
||||
import com.lxj.xpopup.interfaces.SimpleCallback;
|
||||
import com.scwang.smart.refresh.footer.ClassicsFooter;
|
||||
import com.scwang.smart.refresh.layout.api.RefreshHeader;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.ArrayList;
|
||||
@@ -34,16 +39,43 @@ import java.util.List;
|
||||
public class TabHistoryFragment extends BaseFragment<TabHistoryFragmentLayoutBinding, HistoryPresenter>
|
||||
implements HistoryContract.HistoryView {
|
||||
|
||||
List<WateringRecord> recordList = new ArrayList<>();
|
||||
private List<WateringRecord> recordList = new ArrayList<>();
|
||||
private WateringHistoryAdapter mAdapter;
|
||||
private int mCurrentPage = 1;
|
||||
private String mFilterStartTime = "";
|
||||
private String mFilterEndTime = "";
|
||||
private int mFilterType = -1; //0-排程 1-手动
|
||||
|
||||
@Override
|
||||
protected void onResumeInitData() {
|
||||
super.onResumeInitData();
|
||||
showLoadingDialog();
|
||||
getWaterHistoryList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initData(Bundle state) {
|
||||
String jsonContent = getString(R.string.watering_device_list_json);
|
||||
Type type = new TypeToken<List<WateringRecord>>() {}.getType();
|
||||
recordList = new Gson().fromJson(jsonContent, type);
|
||||
mAdapter = new WateringHistoryAdapter(mContext,R.layout.tab_history_item_layout,recordList);
|
||||
viewBinding.rvHisttory.setAdapter(mAdapter);
|
||||
initListener();
|
||||
|
||||
RefreshHeader header = new CustomRefreshHeader(mContext);
|
||||
viewBinding.refresh.setRefreshHeader(header);
|
||||
viewBinding.refresh.setRefreshFooter(new ClassicsFooter(mContext));
|
||||
viewBinding.refresh.setOnRefreshListener(layout -> {
|
||||
mCurrentPage = 1;
|
||||
viewBinding.refresh.setNoMoreData(false);
|
||||
getWaterHistoryList();
|
||||
|
||||
});
|
||||
viewBinding.refresh.setOnLoadMoreListener(layout -> {
|
||||
mCurrentPage++;
|
||||
getWaterHistoryList();
|
||||
});
|
||||
}
|
||||
|
||||
private void getWaterHistoryList(){
|
||||
mPresenter.getWaterHistoryList(mCurrentPage,mFilterStartTime,mFilterEndTime,mFilterType);
|
||||
}
|
||||
|
||||
private void initListener() {
|
||||
@@ -63,7 +95,8 @@ public class TabHistoryFragment extends BaseFragment<TabHistoryFragmentLayoutBin
|
||||
|
||||
@Override
|
||||
public void onConfirmClick() {
|
||||
mAdapter.remove(position);
|
||||
showLoadingDialog();
|
||||
mPresenter.deleteWaterHistory(recordList.get(position).getId(),position);
|
||||
}
|
||||
});
|
||||
break;
|
||||
@@ -100,7 +133,9 @@ public class TabHistoryFragment extends BaseFragment<TabHistoryFragmentLayoutBin
|
||||
.asCustom(new CustomTimeFilterPopupView(getContext(), new CustomTimeFilterPopupView.OnClickListener() {
|
||||
@Override
|
||||
public void callBack(String startTime, String endTime) {
|
||||
ToastUtil.showShort(mContext,startTime + "---" + endTime);
|
||||
mFilterStartTime = startTime;
|
||||
mFilterEndTime = endTime;
|
||||
getWaterHistoryList();
|
||||
}
|
||||
}));
|
||||
popupView.show();
|
||||
@@ -128,7 +163,13 @@ public class TabHistoryFragment extends BaseFragment<TabHistoryFragmentLayoutBin
|
||||
.asCustom(new CustomTypeFilterPopupView(getContext(), new CustomTypeFilterPopupView.OnClickListener() {
|
||||
@Override
|
||||
public void callBack(boolean mSelManual, boolean mSelAuto) {
|
||||
|
||||
if(mSelManual){
|
||||
mFilterType = 1;
|
||||
}
|
||||
if(mSelAuto){
|
||||
mFilterType = 0;
|
||||
}
|
||||
getWaterHistoryList();
|
||||
}
|
||||
}));
|
||||
typePopupView.show();
|
||||
@@ -137,9 +178,66 @@ public class TabHistoryFragment extends BaseFragment<TabHistoryFragmentLayoutBin
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取浇水记录成功
|
||||
* @param list
|
||||
* @param total
|
||||
*/
|
||||
@Override
|
||||
public void getHistoryListSuccess(List<WateringRecord> list, int total) {
|
||||
hideDialogLoading();
|
||||
List<WateringRecord> pageList = list == null ? new ArrayList<>() : list;
|
||||
if (mCurrentPage == 1) {
|
||||
viewBinding.refresh.finishRefresh(300);
|
||||
recordList.clear(); // 只在刷新时清除
|
||||
recordList = pageList;
|
||||
} else {
|
||||
viewBinding.refresh.finishLoadMore(300);
|
||||
recordList.addAll(pageList);
|
||||
}
|
||||
mAdapter.setNewData(recordList);
|
||||
|
||||
// 4. 判断是否还有更多数据
|
||||
if (mAdapter.getItemCount() >= total || pageList.size() == 0) {
|
||||
// 使用 post 延迟调用,避免内部状态冲突导致的循环调用
|
||||
viewBinding.refresh.postDelayed(() -> viewBinding.refresh.setNoMoreData(true), 300);
|
||||
viewBinding.relNoMore.setVisibility(View.VISIBLE); // 自定义底部提示"暂无更多数据"
|
||||
} else {
|
||||
viewBinding.refresh.setNoMoreData(false);
|
||||
viewBinding.relNoMore.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
// 5. 控制空布局和内容显示
|
||||
if (mAdapter.getItemCount() != 0) {
|
||||
viewBinding.refresh.setVisibility(View.VISIBLE);
|
||||
viewBinding.relNoresult.setVisibility(View.GONE);
|
||||
} else {
|
||||
viewBinding.refresh.setVisibility(View.GONE);
|
||||
viewBinding.relNoresult.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除历史记录成功
|
||||
* @param bean
|
||||
* @param position
|
||||
*/
|
||||
@Override
|
||||
public void deleteHistorySuccess(BaseBean bean, int position) {
|
||||
hideDialogLoading();
|
||||
recordList.remove(position);
|
||||
mAdapter.notifyItemRemoved(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getHistoryStatisticsSuccess(WaterStatisticsEntity entity) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public HistoryPresenter createPresenter() {
|
||||
return null;
|
||||
return new HistoryPresenter(new HistoryImpl());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -149,11 +247,14 @@ public class TabHistoryFragment extends BaseFragment<TabHistoryFragmentLayoutBin
|
||||
|
||||
@Override
|
||||
public void showError(String message) {
|
||||
|
||||
hideDialogLoading();
|
||||
ToastUtil.showShort(mContext,message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void logOut(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import com.chad.library.adapter.base.BaseQuickAdapter;
|
||||
import com.chad.library.adapter.base.BaseViewHolder;
|
||||
import com.ckkj.water.R;
|
||||
import com.ckkj.water.history.entity.WateringRecord;
|
||||
import com.ckkj.water.utils.time.ZYTimeUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -26,11 +27,12 @@ public class WateringHistoryAdapter extends BaseQuickAdapter<WateringRecord, Bas
|
||||
@Override
|
||||
protected void convert(BaseViewHolder helper, WateringRecord item) {
|
||||
helper.setText(R.id.tv_device_name,item.getDeviceName());
|
||||
helper.setText(R.id.tv_device_serial,item.getDeviceCode());
|
||||
helper.setText(R.id.tv_device_serial,item.getDeviceNo());
|
||||
helper.setText(R.id.tv_plan_time,mContext.getString(R.string.history_watering_adapter_time)
|
||||
+ ":" + item.getStartTime() + "-" + item.getEndTime());
|
||||
+ ":" + ZYTimeUtils.timeWithoutMillis(item.getStartTime())
|
||||
+ "-" + ZYTimeUtils.timeWithoutMillis(item.getEndTime()));
|
||||
helper.setText(R.id.tv_plan_duration,mContext.getString(R.string.device_work_times_title)
|
||||
+ ":" + item.getDuration());
|
||||
+ ":" + item.getDurationMin() + "min");
|
||||
helper.setText(R.id.tv_plan_type,mContext.getString(R.string.tab_filter_type)
|
||||
+ ":" + item.getTriggerType());
|
||||
helper.addOnClickListener(R.id.img_delete);
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
package com.ckkj.water.history.entity;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* @author fengxiaoyang
|
||||
* @date 2026/6/2
|
||||
* @description 历史记录数据统计
|
||||
*/
|
||||
@NoArgsConstructor
|
||||
@Data
|
||||
public class WaterStatisticsEntity implements Serializable {
|
||||
|
||||
/**
|
||||
* schedule : 0
|
||||
* manualNum : 2
|
||||
* averageTime : 2
|
||||
* count : 2
|
||||
* weekCount : 1
|
||||
* monCount : 1
|
||||
* allTime : 5
|
||||
*/
|
||||
|
||||
private int schedule;//排程次数
|
||||
private int manualNum;//手动浇水次数
|
||||
private int averageTime;//平均浇水时长
|
||||
private int count;//总次数
|
||||
private int weekCount;//本周浇水次数
|
||||
private int monCount;//本月浇水次数
|
||||
private int allTime;//总浇水时长
|
||||
}
|
||||
@@ -8,10 +8,10 @@ import lombok.NoArgsConstructor;
|
||||
/**
|
||||
* @author fengxiaoyang
|
||||
* @date 2026/5/15
|
||||
* @description TODO: 描述该类的作用
|
||||
* @description 浇水历史记录
|
||||
*/
|
||||
@NoArgsConstructor
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
public class WateringRecord implements Serializable {
|
||||
|
||||
/**
|
||||
@@ -29,4 +29,25 @@ public class WateringRecord implements Serializable {
|
||||
private String endTime;
|
||||
private String duration;
|
||||
private String triggerType;
|
||||
|
||||
|
||||
/**
|
||||
* id : 2060156839441596420
|
||||
* userId : 2056543507514097665
|
||||
* deviceId : 2056641699765178369
|
||||
* scheduleId : 1
|
||||
* durationMin : 2
|
||||
* zones : null
|
||||
* createTime : 2026-06-09 09:30:41
|
||||
*/
|
||||
|
||||
private String id;
|
||||
private String userId;
|
||||
private String deviceNo;
|
||||
private String deviceId;
|
||||
private int scheduleId;
|
||||
private String durationMin;
|
||||
private Object zones;
|
||||
private String createTime;
|
||||
|
||||
}
|
||||
|
||||
@@ -1,16 +1,34 @@
|
||||
package com.ckkj.water.history.mvp;
|
||||
|
||||
import com.ckkj.water.base.IView;
|
||||
import com.ckkj.water.history.entity.WaterStatisticsEntity;
|
||||
import com.ckkj.water.history.entity.WateringRecord;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class HistoryContract {
|
||||
public interface CallBack<T> {
|
||||
void success(T msg);
|
||||
void success(T msg, int total);
|
||||
void fail(String msg);
|
||||
}
|
||||
public interface DataModel{
|
||||
//历史列表
|
||||
void getHistoryList(Map<String, String> map, CallBack callBack);
|
||||
//删除某一历史记录
|
||||
void deleteHistory(String logID, CallBack callBack);
|
||||
//浇水的数据统计
|
||||
void getWateringStatistics(Map<String, String> map, CallBack callBack);
|
||||
|
||||
}
|
||||
|
||||
public interface HistoryView extends IView {
|
||||
//历史记录成功
|
||||
void getHistoryListSuccess(List<WateringRecord> msg, int total);
|
||||
//删除历史记录成功
|
||||
void deleteHistorySuccess(BaseBean msg, int position);
|
||||
//数据统计成功
|
||||
void getHistoryStatisticsSuccess(WaterStatisticsEntity entity);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,128 @@
|
||||
package com.ckkj.water.history.mvp;
|
||||
|
||||
import com.ckkj.water.base.entity.MineUserInfoBean;
|
||||
import com.ckkj.water.history.entity.WaterStatisticsEntity;
|
||||
import com.ckkj.water.history.entity.WateringRecord;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
import com.ckkj.water.network.NetWorkManager;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import io.reactivex.Observer;
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.annotations.NonNull;
|
||||
import io.reactivex.disposables.Disposable;
|
||||
import io.reactivex.schedulers.Schedulers;
|
||||
|
||||
public class HistoryImpl implements HistoryContract.DataModel{
|
||||
|
||||
/**
|
||||
* 查询浇水历史
|
||||
* @param map
|
||||
* @param callBack
|
||||
*/
|
||||
@Override
|
||||
public void getHistoryList(Map<String, String> map, HistoryContract.CallBack callBack) {
|
||||
NetWorkManager.getRequest().waterLogList(NetWorkManager.getToken(), map)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.unsubscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Observer<BaseBean<List<WateringRecord>>>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseBean<List<WateringRecord>> bean) {
|
||||
if (bean.getCode() == 200) {
|
||||
callBack.success(bean.getRows(),bean.getTotal());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(@NonNull Throwable e) {
|
||||
callBack.fail(e.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除某一历史记录
|
||||
* @param logID
|
||||
* @param callBack
|
||||
*/
|
||||
@Override
|
||||
public void deleteHistory(String logID, HistoryContract.CallBack callBack) {
|
||||
try {
|
||||
NetWorkManager.getRequest().deleteWaterLog(NetWorkManager.getToken(), logID)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.unsubscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Observer<BaseBean>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseBean bean) {
|
||||
if (bean.getCode() == 200) {
|
||||
callBack.success(bean,0);
|
||||
} else {
|
||||
callBack.fail(bean.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(@NonNull Throwable e) {
|
||||
callBack.fail(e.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
}
|
||||
});
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 浇水的数据统计
|
||||
* @param map
|
||||
* @param callBack
|
||||
*/
|
||||
@Override
|
||||
public void getWateringStatistics(Map<String, String> map, HistoryContract.CallBack callBack) {
|
||||
NetWorkManager.getRequest().getDataStatistics(NetWorkManager.getToken())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.unsubscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Observer<BaseBean<WaterStatisticsEntity>>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseBean<WaterStatisticsEntity> bean) {
|
||||
if (bean.getCode() == 200) {
|
||||
callBack.success(bean.getData(),0);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(@NonNull Throwable e) {
|
||||
callBack.fail(e.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,15 @@
|
||||
package com.ckkj.water.history.mvp;
|
||||
|
||||
import android.text.TextUtils;
|
||||
|
||||
import com.ckkj.water.base.BasePresenter;
|
||||
import com.ckkj.water.history.entity.WaterStatisticsEntity;
|
||||
import com.ckkj.water.history.entity.WateringRecord;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class HistoryPresenter extends BasePresenter<HistoryContract.HistoryView> {
|
||||
private HistoryImpl impl;
|
||||
@@ -8,4 +17,88 @@ public class HistoryPresenter extends BasePresenter<HistoryContract.HistoryView>
|
||||
public HistoryPresenter(HistoryImpl impl) {
|
||||
this.impl = impl;
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询历史列表
|
||||
* @param mCurrentPage
|
||||
* @param mFilterStartTime
|
||||
* @param mFilterEndTime
|
||||
* @param mFilterType
|
||||
*/
|
||||
public void getWaterHistoryList(int mCurrentPage, String mFilterStartTime, String mFilterEndTime, int mFilterType) {
|
||||
Map<String,String> map = new HashMap<>();
|
||||
map.put("pageNum",mCurrentPage+"");
|
||||
if(!TextUtils.isEmpty(mFilterStartTime)){
|
||||
// map.put("beginTime",mFilterStartTime);
|
||||
map.put("param[beginTime]", mFilterStartTime);
|
||||
}
|
||||
|
||||
if(!TextUtils.isEmpty(mFilterStartTime)){
|
||||
// map.put("endTime",mFilterEndTime);
|
||||
map.put("param[endTime]", mFilterEndTime);
|
||||
|
||||
}
|
||||
if(mFilterType != -1){
|
||||
map.put("triggerType",mFilterType+"");
|
||||
}
|
||||
impl.getHistoryList(map, new HistoryContract.CallBack<List<WateringRecord>>() {
|
||||
@Override
|
||||
public void success(List<WateringRecord> list,int total) {
|
||||
if(HistoryPresenter.this.getView() != null){
|
||||
HistoryPresenter.this.getView().getHistoryListSuccess(list,total);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fail(String msg) {
|
||||
if(HistoryPresenter.this.getView() != null){
|
||||
HistoryPresenter.this.getView().showMessage(msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除历史记录
|
||||
* @param id
|
||||
* @param position
|
||||
*/
|
||||
public void deleteWaterHistory(String id, int position) {
|
||||
impl.deleteHistory(id, new HistoryContract.CallBack<BaseBean>() {
|
||||
@Override
|
||||
public void success(BaseBean bean, int total) {
|
||||
if(HistoryPresenter.this.getView() != null){
|
||||
HistoryPresenter.this.getView().deleteHistorySuccess(bean,position);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fail(String msg) {
|
||||
if(HistoryPresenter.this.getView() != null){
|
||||
HistoryPresenter.this.getView().showMessage(msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取浇水统计
|
||||
*/
|
||||
public void getWaterStatistic() {
|
||||
impl.getWateringStatistics(null, new HistoryContract.CallBack<WaterStatisticsEntity>() {
|
||||
@Override
|
||||
public void success(WaterStatisticsEntity entity, int total) {
|
||||
if(HistoryPresenter.this.getView() != null){
|
||||
HistoryPresenter.this.getView().getHistoryStatisticsSuccess(entity);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fail(String msg) {
|
||||
if(HistoryPresenter.this.getView() != null){
|
||||
HistoryPresenter.this.getView().showMessage(msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package com.ckkj.water.index;
|
||||
import android.Manifest;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
@@ -14,14 +15,17 @@ import com.ckkj.water.base.BaseFragment;
|
||||
import com.ckkj.water.custom.view.CustomRefreshHeader;
|
||||
import com.ckkj.water.databinding.IndexFragmentLayoutBinding;
|
||||
import com.ckkj.water.device.AddDeviceActivity;
|
||||
import com.ckkj.water.device.AddDeviceActivity_copy;
|
||||
import com.ckkj.water.device.DeviceControlActivity;
|
||||
import com.ckkj.water.history.entity.WateringRecord;
|
||||
import com.ckkj.water.index.adapter.DeviceAdapter;
|
||||
import com.ckkj.water.index.entity.IndexDeviceEntity;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
import com.ckkj.water.index.mvp.IndexContract;
|
||||
import com.ckkj.water.index.mvp.IndexImpl;
|
||||
import com.ckkj.water.index.mvp.IndexPresenter;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
import com.ckkj.water.permission.PermissionActivity;
|
||||
import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
|
||||
import com.ckkj.water.utils.show.ToastUtil;
|
||||
import com.maning.mlkitscanner.scan.MNScanManager;
|
||||
import com.maning.mlkitscanner.scan.callback.act.MNScanCallback;
|
||||
@@ -37,7 +41,7 @@ public class IndexFragment extends BaseFragment<IndexFragmentLayoutBinding, Inde
|
||||
implements IndexContract.IndexView , EasyPermissions.PermissionCallbacks{
|
||||
|
||||
private DeviceAdapter deviceAdapter;
|
||||
private List<IndexDeviceEntity> devList = new ArrayList<>();
|
||||
private List<WaterDeviceEntity> devList = new ArrayList<>();
|
||||
private int mCurrentPage = 1;
|
||||
|
||||
@Override
|
||||
@@ -110,7 +114,7 @@ public class IndexFragment extends BaseFragment<IndexFragmentLayoutBinding, Inde
|
||||
if(!hasPermission){
|
||||
goTo(mContext, PermissionActivity.class,null);
|
||||
}else{
|
||||
goTo(mContext, AddDeviceActivity.class,null);
|
||||
goTo(mContext, AddDeviceActivity_copy.class,null);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -153,24 +157,26 @@ public class IndexFragment extends BaseFragment<IndexFragmentLayoutBinding, Inde
|
||||
* 获取设备列表成功
|
||||
*/
|
||||
@Override
|
||||
public void getDeviceListSuccess(List<IndexDeviceEntity> list,int total) {
|
||||
public void getDeviceListSuccess(List<WaterDeviceEntity> list, int total) {
|
||||
hideDialogLoading();
|
||||
viewBinding.refresh.finishRefresh(300);
|
||||
viewBinding.refresh.finishLoadMore(300);
|
||||
List<WaterDeviceEntity> pageList = list == null ? new ArrayList<>() : list;
|
||||
if (mCurrentPage == 1) {
|
||||
viewBinding.refresh.finishRefresh(300);
|
||||
devList.clear(); // 只在刷新时清除
|
||||
devList = list;
|
||||
devList = pageList;
|
||||
} else {
|
||||
devList.addAll(list);
|
||||
viewBinding.refresh.finishLoadMore(300);
|
||||
devList.addAll(pageList);
|
||||
}
|
||||
deviceAdapter.setNewData(devList);
|
||||
|
||||
// 4. 判断是否还有更多数据
|
||||
if (total == deviceAdapter.getItemCount() || list == null || list.size() == 0) {
|
||||
// ✅ 告诉 SmartRefreshLayout 没有更多数据了
|
||||
viewBinding.refresh.setNoMoreData(true);
|
||||
viewBinding.relNoMore.setVisibility(View.VISIBLE); // 自定义底部提示“暂无更多数据”
|
||||
if (deviceAdapter.getItemCount() >= total || pageList.size() == 0) {
|
||||
// 使用 post 延迟调用,避免内部状态冲突导致的循环调用
|
||||
viewBinding.refresh.postDelayed(() -> viewBinding.refresh.setNoMoreData(true), 300);
|
||||
viewBinding.relNoMore.setVisibility(View.VISIBLE); // 自定义底部提示"暂无更多数据"
|
||||
} else {
|
||||
viewBinding.refresh.setNoMoreData(false); // 重置状态
|
||||
viewBinding.refresh.setNoMoreData(false);
|
||||
viewBinding.relNoMore.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,36 +1,45 @@
|
||||
package com.ckkj.water.index.adapter;
|
||||
|
||||
import android.content.Context;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
import android.widget.ImageView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.chad.library.adapter.base.BaseQuickAdapter;
|
||||
import com.chad.library.adapter.base.BaseViewHolder;
|
||||
import com.ckkj.water.R;
|
||||
import com.ckkj.water.index.entity.IndexDeviceEntity;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
import com.ckkj.water.utils.manager.PowerIconManage;
|
||||
import com.esafirm.imagepicker.model.Image;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class DeviceAdapter extends BaseQuickAdapter<IndexDeviceEntity, BaseViewHolder> {
|
||||
public class DeviceAdapter extends BaseQuickAdapter<WaterDeviceEntity, BaseViewHolder> {
|
||||
|
||||
public DeviceAdapter(Context context, int layoutResId, @Nullable List<IndexDeviceEntity> data) {
|
||||
public DeviceAdapter(Context context, int layoutResId, @Nullable List<WaterDeviceEntity> data) {
|
||||
super(layoutResId, data);
|
||||
this.mContext = context;
|
||||
this.mData = data;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void convert(BaseViewHolder holder, IndexDeviceEntity item) {
|
||||
protected void convert(BaseViewHolder holder, WaterDeviceEntity item) {
|
||||
ImageView imgPower = holder.getView(R.id.img_battery);
|
||||
View viewStatus = holder.getView(R.id.view_status_dot);
|
||||
holder.setText(R.id.tv_device_name,item.getDeviceName());
|
||||
holder.setText(R.id.tv_device_serial,item.getDeviceSn());
|
||||
holder.setText(R.id.tv_device_status,"工作中");
|
||||
holder.setText(R.id.tv_battery_level,"80");
|
||||
holder.setText(R.id.tv_device_status,item.getWorkStatus().equals("0") ?
|
||||
mContext.getString(R.string.device_status_not_working) :
|
||||
mContext.getString(R.string.device_status_working));
|
||||
holder.setTextColor(R.id.tv_device_status,item.getWorkStatus().equals("0") ?
|
||||
mContext.getResources().getColor(R.color.color_999999) :
|
||||
mContext.getResources().getColor(R.color.color_24B326));
|
||||
viewStatus.setBackground(item.getWorkStatus().equals("0") ?
|
||||
mContext.getResources().getDrawable(R.drawable.shape_status_dot_999999)
|
||||
: mContext.getResources().getDrawable(R.drawable.shape_status_dot_green));
|
||||
holder.setText(R.id.tv_battery_level,item.getPowerLevel());
|
||||
imgPower.setImageResource(PowerIconManage.getInstance().getPowerIcon(Integer.parseInt(item.getPowerLevel())));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
package com.ckkj.water.index.entity;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
@NoArgsConstructor
|
||||
@Data
|
||||
public class IndexDeviceEntity implements Serializable {
|
||||
@NoArgsConstructor
|
||||
public class WaterDeviceEntity implements Serializable {
|
||||
|
||||
/**
|
||||
* id : 2056638783822123010
|
||||
@@ -33,7 +34,8 @@ public class IndexDeviceEntity implements Serializable {
|
||||
private String deviceName;
|
||||
private Object deviceImg;
|
||||
private String status;
|
||||
private Object powerLevel;
|
||||
private String workStatus;
|
||||
private String powerLevel;
|
||||
private Object powerLevelUpdatatime;
|
||||
private String wifiName;
|
||||
private String wifiPassword;
|
||||
@@ -42,4 +44,26 @@ public class IndexDeviceEntity implements Serializable {
|
||||
private String fwVer;
|
||||
private String macAddress;
|
||||
private Object expirationTime;
|
||||
private List<DeviceListBean> deviceList;
|
||||
|
||||
@NoArgsConstructor
|
||||
@Data
|
||||
public static class DeviceListBean implements Serializable{
|
||||
private String id;
|
||||
private String deviceNo;
|
||||
private String userId;
|
||||
private String deviceName;
|
||||
private Object deviceImg;
|
||||
private String status;
|
||||
private String workStatus;
|
||||
private String powerLevel;
|
||||
private Object powerLevelUpdatatime;
|
||||
private String wifiName;
|
||||
private String wifiPassword;
|
||||
private String deviceEm;
|
||||
private String deviceSn;
|
||||
private String fwVer;
|
||||
private String macAddress;
|
||||
private Object expirationTime;
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,7 @@
|
||||
package com.ckkj.water.index.mvp;
|
||||
|
||||
import com.ckkj.water.base.IView;
|
||||
import com.ckkj.water.index.entity.IndexDeviceEntity;
|
||||
import com.ckkj.water.login.entity.LoginEntity;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
|
||||
import org.json.JSONObject;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@@ -29,6 +25,6 @@ public class IndexContract {
|
||||
}
|
||||
|
||||
public interface IndexView extends IView{
|
||||
void getDeviceListSuccess(List<IndexDeviceEntity> list,int total);
|
||||
void getDeviceListSuccess(List<WaterDeviceEntity> list, int total);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
package com.ckkj.water.index.mvp;
|
||||
|
||||
import com.ckkj.water.index.entity.IndexDeviceEntity;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
import com.ckkj.water.network.NetWorkManager;
|
||||
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -28,13 +26,13 @@ public class IndexImpl implements IndexContract.DataModel{
|
||||
.subscribeOn(Schedulers.io())
|
||||
.unsubscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Observer<BaseBean<List<IndexDeviceEntity>>>() {
|
||||
.subscribe(new Observer<BaseBean<List<WaterDeviceEntity>>>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseBean<List<IndexDeviceEntity>> bean) {
|
||||
public void onNext(@NonNull BaseBean<List<WaterDeviceEntity>> bean) {
|
||||
if (bean.getCode() == 200) {
|
||||
callBack.success(bean.getRows(),bean.getTotal());
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.ckkj.water.index.mvp;
|
||||
|
||||
import com.ckkj.water.base.BasePresenter;
|
||||
import com.ckkj.water.index.entity.IndexDeviceEntity;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
@@ -18,10 +18,10 @@ public class IndexPresenter extends BasePresenter<IndexContract.IndexView>{
|
||||
* 查询设备列表
|
||||
*/
|
||||
public void getDevicesList(int mCurrentPage) {
|
||||
mImpl.getDeviceList(new HashMap<>(), new IndexContract.CallBack<List<IndexDeviceEntity>>() {
|
||||
mImpl.getDeviceList(new HashMap<>(), new IndexContract.CallBack<List<WaterDeviceEntity>>() {
|
||||
|
||||
@Override
|
||||
public void success(List<IndexDeviceEntity> list, int total) {
|
||||
public void success(List<WaterDeviceEntity> list, int total) {
|
||||
if(IndexPresenter.this.getView() != null){
|
||||
IndexPresenter.this.getView().getDeviceListSuccess(list,total);
|
||||
}
|
||||
|
||||
@@ -71,11 +71,44 @@ public class ForgetPasswordActivity extends BaseActivity<RegisterLayoutBinding,
|
||||
ToastUtil.showShort(mContext, getString(R.string.login_error_phone_invalid));
|
||||
return;
|
||||
}
|
||||
cdTimer.start();
|
||||
mPresenter.getPhoneCode(viewBinding.etAccount.getText().toString(),"");
|
||||
// cdTimer.start();
|
||||
break;
|
||||
|
||||
case R.id.tv_commit:
|
||||
goTo(mContext, RegisterSuccessActivity.class,null);
|
||||
if (TextUtils.isEmpty(viewBinding.etAccount.getText().toString())) {
|
||||
ToastUtil.showShort(mContext, getString(R.string.login_error_phone_empty));
|
||||
return;
|
||||
}
|
||||
if (!PhoneNumberUtils.checkPhoneNum(viewBinding.etAccount.getText().toString().trim()) &&
|
||||
!PhoneNumberUtils.checkEmail(viewBinding.etAccount.getText().toString().trim())) {
|
||||
ToastUtil.showShort(mContext, getString(R.string.login_error_phone_invalid));
|
||||
return;
|
||||
}
|
||||
if (TextUtils.isEmpty(viewBinding.etVerfiCode.getText().toString())) {
|
||||
ToastUtil.showShort(mContext, getString(R.string.login_error_code_empty));
|
||||
return;
|
||||
}
|
||||
|
||||
if (TextUtils.isEmpty(viewBinding.etInputPsd.getText().toString())) {
|
||||
ToastUtil.showShort(mContext, getString(R.string.login_error_psd_empty));
|
||||
return;
|
||||
}
|
||||
|
||||
if (TextUtils.isEmpty(viewBinding.etInputPsdAgin.getText().toString())) {
|
||||
ToastUtil.showShort(mContext, getString(R.string.login_error_psd_agin_empty));
|
||||
return;
|
||||
}
|
||||
|
||||
if(!(viewBinding.etInputPsd.getText().toString()).equals(
|
||||
viewBinding.etInputPsdAgin.getText().toString())){
|
||||
ToastUtil.showShort(mContext, getString(R.string.hint_input_psd_not_match));
|
||||
return;
|
||||
}
|
||||
showLoadingDialog();
|
||||
mPresenter.updatePsdByVerifyCode(viewBinding.etAccount.getText().toString(),
|
||||
viewBinding.etVerfiCode.getText().toString(),
|
||||
viewBinding.etInputPsd.getText().toString());
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -101,6 +134,16 @@ public class ForgetPasswordActivity extends BaseActivity<RegisterLayoutBinding,
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 修改密码成功
|
||||
* @param bean
|
||||
*/
|
||||
@Override
|
||||
public void updateUserPasswordSuccess(BaseBean bean) {
|
||||
hideDialogLoading();
|
||||
ToastUtil.showShort(mContext,getString(R.string.hint_update_psd_success));
|
||||
finish();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerSuccess(BaseBean bean) {
|
||||
@@ -117,6 +160,7 @@ public class ForgetPasswordActivity extends BaseActivity<RegisterLayoutBinding,
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void showError(String message) {
|
||||
ToastUtil.showShort(mContext,message);
|
||||
|
||||
@@ -221,6 +221,11 @@ public class LoginActivity extends BaseActivity<LoginLayoutBinding, LoginPresent
|
||||
R.layout.select_language_item
|
||||
).show();
|
||||
break;
|
||||
|
||||
case R.id.tv_reset_psd ://重置密码
|
||||
goTo(mContext, ForgetPasswordActivity.class,null);
|
||||
break;
|
||||
|
||||
// case R.id.checkbox_read:
|
||||
// if (mYinsiConfirm) {
|
||||
// mYinsiConfirm = false;
|
||||
@@ -326,6 +331,11 @@ public class LoginActivity extends BaseActivity<LoginLayoutBinding, LoginPresent
|
||||
}, 200);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateUserPasswordSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getLayoutResId(Bundle savedInstanceState) {
|
||||
return 0;
|
||||
|
||||
@@ -85,11 +85,7 @@ public class RegisterActivity extends BaseActivity<RegisterLayoutBinding, LoginP
|
||||
return;
|
||||
}
|
||||
if (TextUtils.isEmpty(viewBinding.etVerfiCode.getText().toString())) {
|
||||
ToastUtil.showShort(mContext, getString(R.string.login_error_phone_empty));
|
||||
return;
|
||||
}
|
||||
if (TextUtils.isEmpty(viewBinding.etVerfiCode.getText().toString())) {
|
||||
ToastUtil.showShort(mContext, getString(R.string.login_error_phone_empty));
|
||||
ToastUtil.showShort(mContext, getString(R.string.login_error_code_empty));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -155,6 +151,15 @@ public class RegisterActivity extends BaseActivity<RegisterLayoutBinding, LoginP
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改密码成功
|
||||
* @param bean
|
||||
*/
|
||||
@Override
|
||||
public void updateUserPasswordSuccess(BaseBean bean) {
|
||||
hideDialogLoading();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showError(String message) {
|
||||
hideDialogLoading();
|
||||
|
||||
@@ -94,6 +94,11 @@ public class RegisterSuccessActivity extends BaseActivity<RegisterSuccessLayoutB
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateUserPasswordSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showError(String message) {
|
||||
|
||||
|
||||
@@ -27,6 +27,10 @@ public class LoginContract {
|
||||
void getPhoneCode(Map<String,Object> map, CallBack callBack);
|
||||
//手机验证码登录
|
||||
void loginBySmsCode(JSONObject json, CallBack callBack);
|
||||
//通过账户+验证码 修改密码
|
||||
void updatePsdByVerifyCode(JSONObject json, CallBack callBack);
|
||||
//退出登录
|
||||
void logout(JSONObject json, CallBack callBack);
|
||||
}
|
||||
|
||||
public interface LoginView extends IView{
|
||||
@@ -35,5 +39,7 @@ public class LoginContract {
|
||||
void getPhoneCodeSuccess(BaseBean bean);
|
||||
//验证码登录成功
|
||||
void loginBySmsCodeSuccess(LoginEntity entity);
|
||||
//通过验证码修改密码成功
|
||||
void updateUserPasswordSuccess(BaseBean bean);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -105,6 +105,11 @@ public class LoginImpl implements LoginContract.DataModel {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 使用验证码登录
|
||||
* @param json
|
||||
* @param callBack
|
||||
*/
|
||||
@Override
|
||||
public void loginBySmsCode(JSONObject json, LoginContract.CallBack callBack) {
|
||||
try {
|
||||
@@ -141,4 +146,84 @@ public class LoginImpl implements LoginContract.DataModel {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过验证码修改密码
|
||||
* @param json
|
||||
* @param callBack
|
||||
*/
|
||||
@Override
|
||||
public void updatePsdByVerifyCode(JSONObject json, LoginContract.CallBack callBack) {
|
||||
try {
|
||||
NetWorkManager.getRequest().updatePasswordByVerifyCode(NetWorkManager.getToken(),NetWorkManager.toRequestBody(json))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.unsubscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Observer<BaseBean>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseBean bean) {
|
||||
if (bean.getCode() == 200) {
|
||||
callBack.success(bean);
|
||||
} else {
|
||||
callBack.fail(bean.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(@NonNull Throwable e) {
|
||||
callBack.fail(e.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
}
|
||||
});
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 退出登录
|
||||
* @param json
|
||||
* @param callBack
|
||||
*/
|
||||
@Override
|
||||
public void logout(JSONObject json, LoginContract.CallBack callBack) {
|
||||
try {
|
||||
NetWorkManager.getRequest().logout(NetWorkManager.toRequestBody(json))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.unsubscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Observer<BaseBean>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseBean bean) {
|
||||
if (bean.getCode() == 200) {
|
||||
callBack.success(bean.getData());
|
||||
} else {
|
||||
callBack.fail(bean.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(@NonNull Throwable e) {
|
||||
callBack.fail(e.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
}
|
||||
});
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,8 @@ package com.ckkj.water.login.mvp;
|
||||
import com.ckkj.water.AppConfig;
|
||||
import com.ckkj.water.base.BasePresenter;
|
||||
import com.ckkj.water.login.entity.LoginEntity;
|
||||
import com.ckkj.water.mine.mvp.MineContract;
|
||||
import com.ckkj.water.mine.mvp.MinePresenter;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
|
||||
import org.json.JSONException;
|
||||
@@ -146,4 +148,35 @@ public class LoginPresenter extends BasePresenter<LoginContract.LoginView> {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 通过验证码修改密码
|
||||
* @param account
|
||||
* @param code
|
||||
* @param psd
|
||||
*/
|
||||
public void updatePsdByVerifyCode(String account, String code, String psd) {
|
||||
try {
|
||||
JSONObject json = new JSONObject();
|
||||
json.put("userName", account);
|
||||
json.put("code", code);
|
||||
json.put("password", psd);
|
||||
mImpl.updatePsdByVerifyCode(json, new LoginContract.CallBack<BaseBean>() {
|
||||
@Override
|
||||
public void success(BaseBean bean) {
|
||||
if(LoginPresenter.this.getView() != null){
|
||||
LoginPresenter.this.getView().updateUserPasswordSuccess(bean);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fail(String msg) {
|
||||
if(LoginPresenter.this.getView() != null){
|
||||
LoginPresenter.this.getView().showError(msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (JSONException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -102,4 +102,19 @@ public class AppThemActivity extends BaseActivity<AppThemeChangeLayoutBinding, M
|
||||
public void getUserInfoSuccess(MineUserInfoBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateUserInfoSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateUserPasswordSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void logOutSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -136,4 +136,19 @@ public class ChangePhoneActivity extends BaseActivity<ChangePhoneActivityBinding
|
||||
public void getUserInfoSuccess(MineUserInfoBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateUserInfoSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateUserPasswordSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void logOutSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@ package com.ckkj.water.mine;
|
||||
import static android.view.View.INVISIBLE;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
|
||||
import com.ckkj.water.AppConfig;
|
||||
@@ -12,6 +13,7 @@ import com.ckkj.water.base.BaseFragment;
|
||||
import com.ckkj.water.base.entity.MineUserInfoBean;
|
||||
import com.ckkj.water.databinding.MineFragmentBinding;
|
||||
import com.ckkj.water.databinding.MineFragmentLayoutBinding;
|
||||
import com.ckkj.water.login.LoginActivity;
|
||||
import com.ckkj.water.main.entity.CheckVersionEntity;
|
||||
import com.ckkj.water.mine.entity.MemberComboEntity;
|
||||
import com.ckkj.water.mine.mvp.MineContract;
|
||||
@@ -19,6 +21,7 @@ import com.ckkj.water.mine.mvp.MineImpl;
|
||||
import com.ckkj.water.mine.mvp.MinePresenter;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
import com.ckkj.water.utils.dataUtil.SharePreUtil;
|
||||
import com.ckkj.water.utils.manager.ActivityManager;
|
||||
import com.ckkj.water.utils.manager.ThemeManager;
|
||||
import com.ckkj.water.utils.manager.WaterUserInfoManager;
|
||||
import com.ckkj.water.utils.show.ToastUtil;
|
||||
@@ -29,6 +32,8 @@ import com.lxj.xpopup.interfaces.OnSelectListener;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import de.greenrobot.event.EventBus;
|
||||
|
||||
/**
|
||||
* @author fengxiaoyang
|
||||
* @date 2026/5/16
|
||||
@@ -36,6 +41,7 @@ import java.util.List;
|
||||
*/
|
||||
public class MineCenterFragment extends BaseFragment<MineFragmentLayoutBinding, MinePresenter>
|
||||
implements MineContract.MineView {
|
||||
private MineUserInfoBean mUserBean;
|
||||
@Override
|
||||
public void initData(Bundle state) {
|
||||
ImmersionBar.with(mContext)
|
||||
@@ -57,10 +63,11 @@ public class MineCenterFragment extends BaseFragment<MineFragmentLayoutBinding,
|
||||
}
|
||||
|
||||
private void initListener() {
|
||||
setClick(viewBinding.imgAvatar);
|
||||
setClick(viewBinding.linearInfo);
|
||||
setClick(viewBinding.linearLanguage);
|
||||
setClick(viewBinding.linearPsdManage);
|
||||
setClick(viewBinding.linearTheme);
|
||||
setClick(viewBinding.btnDelete);
|
||||
}
|
||||
|
||||
private void setClick(View view) {
|
||||
@@ -69,8 +76,10 @@ public class MineCenterFragment extends BaseFragment<MineFragmentLayoutBinding,
|
||||
|
||||
public void onClick(View v){
|
||||
switch (v.getId()){
|
||||
case R.id.img_avatar:
|
||||
goTo(mContext, MineInfomationActivity.class,null);
|
||||
case R.id.linear_info:
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putSerializable(ConstantUtil.USER_INFO_JSON_CONTENT,mUserBean);
|
||||
goTo(mContext, MineInfomationActivity.class,bundle);
|
||||
break;
|
||||
|
||||
case R.id.linear_theme:
|
||||
@@ -101,6 +110,26 @@ public class MineCenterFragment extends BaseFragment<MineFragmentLayoutBinding,
|
||||
case R.id.linear_psd_manage:
|
||||
goTo(mContext, PsdManageActivity.class,null);
|
||||
break;
|
||||
|
||||
case R.id.btn_delete:
|
||||
showDialogtext(null,
|
||||
false,
|
||||
false,
|
||||
getString(R.string.tip_text),
|
||||
getString(R.string.logout_tips),
|
||||
getString(R.string.cancel_text),
|
||||
getString(R.string.confirm_text),
|
||||
new OnDialogClick() {
|
||||
@Override
|
||||
public void onCancelClick() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfirmClick() {
|
||||
mPresenter.logout();
|
||||
}
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -114,9 +143,38 @@ public class MineCenterFragment extends BaseFragment<MineFragmentLayoutBinding,
|
||||
String userInfoJson = gson.toJson(bean);
|
||||
SharePreUtil.putString(ConstantUtil.SHARE_PRE_NAME,mContext,ConstantUtil.USER_INFO_JSON_CONTENT,userInfoJson);
|
||||
WaterUserInfoManager.getInstance().setUserInfo(bean);
|
||||
mUserBean = bean;
|
||||
viewBinding.tvUserName.setText(bean.getUser().getNickName());
|
||||
if(TextUtils.isEmpty(bean.getUser().getPhonenumber())){
|
||||
viewBinding.tvUserAccount.setText(bean.getUser().getEmail());
|
||||
}else{
|
||||
viewBinding.tvUserAccount.setText(bean.getUser().getPhonenumber());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 退出登录
|
||||
* @param bean
|
||||
*/
|
||||
@Override
|
||||
public void logOutSuccess(BaseBean bean) {
|
||||
WaterUserInfoManager.getInstance().clearUser(mContext);
|
||||
ActivityManager.removeAllActivity();
|
||||
goTo(mContext, LoginActivity.class,null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateUserInfoSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateUserPasswordSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public MinePresenter createPresenter() {
|
||||
return new MinePresenter(new MineImpl());
|
||||
|
||||
@@ -266,4 +266,19 @@ public class MineFragment extends BaseFragment<MineFragmentBinding, MinePresente
|
||||
public void getUserInfoSuccess(MineUserInfoBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateUserInfoSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateUserPasswordSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void logOutSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,12 +3,14 @@ package com.ckkj.water.mine;
|
||||
import android.Manifest;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.ckkj.water.ConstantUtil;
|
||||
import com.ckkj.water.R;
|
||||
import com.ckkj.water.base.BaseActivity;
|
||||
import com.ckkj.water.base.entity.MineUserInfoBean;
|
||||
@@ -40,6 +42,7 @@ import pub.devrel.easypermissions.EasyPermissions;
|
||||
*/
|
||||
public class MineInfomationActivity extends BaseActivity<MineInformationLayoutBinding, MinePresenter>
|
||||
implements MineContract.MineView, EasyPermissions.PermissionCallbacks{
|
||||
private MineUserInfoBean mUserBean;
|
||||
@Override
|
||||
public MinePresenter createPresenter() {
|
||||
return new MinePresenter(new MineImpl());
|
||||
@@ -48,7 +51,16 @@ public class MineInfomationActivity extends BaseActivity<MineInformationLayoutBi
|
||||
@Override
|
||||
public void initData(Bundle savedInstanceState) {
|
||||
super.initData(savedInstanceState);
|
||||
|
||||
Bundle bundle = getIntent().getExtras();
|
||||
if(bundle != null){
|
||||
mUserBean = (MineUserInfoBean) bundle.getSerializable(ConstantUtil.USER_INFO_JSON_CONTENT);
|
||||
viewBinding.tvNicknameValue.setText(mUserBean.getUser().getNickName());
|
||||
if(TextUtils.isEmpty(mUserBean.getUser().getEmail())){
|
||||
viewBinding.tvBindPhoneValue.setText(mUserBean.getUser().getPhonenumber());
|
||||
}else{
|
||||
viewBinding.tvBindPhoneValue.setText(mUserBean.getUser().getEmail());
|
||||
}
|
||||
}
|
||||
ImmersionBar.with(this)
|
||||
.statusBarColor(R.color.white) // 设置状态栏颜色
|
||||
.statusBarDarkFont(true) // 设置状态栏字体为黑色
|
||||
@@ -62,6 +74,7 @@ public class MineInfomationActivity extends BaseActivity<MineInformationLayoutBi
|
||||
setClick(viewBinding.includedTitle.imgBack);
|
||||
setClick(viewBinding.imgAvatar);
|
||||
setClick(viewBinding.imgCamera);
|
||||
setClick(viewBinding.rlNickname);
|
||||
}
|
||||
|
||||
private void setClick(View view) {
|
||||
@@ -99,6 +112,38 @@ public class MineInfomationActivity extends BaseActivity<MineInformationLayoutBi
|
||||
}
|
||||
}).show();
|
||||
break;
|
||||
|
||||
case R.id.rl_nickname:
|
||||
showEditDialog("修改昵称",
|
||||
"请输入昵称",
|
||||
mUserBean.getUser().getNickName(),
|
||||
true,
|
||||
"取消",
|
||||
"确定",
|
||||
INPUT_TYPE_NORMAL,
|
||||
new OnDialogClick() {
|
||||
@Override
|
||||
public void onCancelClick() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfirmClisk() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfirmClisk(String content) {
|
||||
showLoadingDialog();
|
||||
mPresenter.updateUserInfo(content);
|
||||
mUserBean.getUser().setNickName(content);
|
||||
viewBinding.tvNicknameValue.setText(content);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onView1Click() {
|
||||
|
||||
}
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -125,6 +170,25 @@ public class MineInfomationActivity extends BaseActivity<MineInformationLayoutBi
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取个人信息成功
|
||||
* @param bean
|
||||
*/
|
||||
@Override
|
||||
public void updateUserInfoSuccess(BaseBean bean) {
|
||||
hideDialogLoading();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateUserPasswordSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void logOutSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
private void getCompressFile(File file) {
|
||||
LubanCompressUtil.getInstance().getCompressFile(mContext, file, new LubanCompressUtil.CompressCallback() {
|
||||
@@ -176,7 +240,8 @@ public class MineInfomationActivity extends BaseActivity<MineInformationLayoutBi
|
||||
|
||||
@Override
|
||||
public void showError(String message) {
|
||||
|
||||
hideDialogLoading();
|
||||
ToastUtil.showShort(mContext,message);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -210,4 +275,6 @@ public class MineInfomationActivity extends BaseActivity<MineInformationLayoutBi
|
||||
public void getUserInfoSuccess(MineUserInfoBean bean) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -85,4 +85,19 @@ public class PsdManageActivity extends BaseActivity<PasswordManLayoutBinding, Mi
|
||||
public void getUserInfoSuccess(MineUserInfoBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateUserInfoSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateUserPasswordSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void logOutSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,11 +72,29 @@ public class ResetPsdActivity extends BaseActivity<ResetPsdLayoutBinding, MinePr
|
||||
ToastUtil.showShort(mContext,getString(R.string.hint_input_psd_not_match));
|
||||
return;
|
||||
}
|
||||
ToastUtil.showShort(mContext,"接口触发");
|
||||
showLoadingDialog();
|
||||
mPresenter.updateUserPsdByOld(viewBinding.etCurrentPsd.getText().toString(),
|
||||
viewBinding.etInputConfirmPsd.getText().toString());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 密码重置成功
|
||||
* @param bean
|
||||
*/
|
||||
@Override
|
||||
public void updateUserPasswordSuccess(BaseBean bean) {
|
||||
hideDialogLoading();
|
||||
ToastUtil.showShort(mContext,"密码重置成功");
|
||||
finish();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void logOutSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public MinePresenter createPresenter() {
|
||||
return new MinePresenter(new MineImpl());
|
||||
@@ -89,7 +107,8 @@ public class ResetPsdActivity extends BaseActivity<ResetPsdLayoutBinding, MinePr
|
||||
|
||||
@Override
|
||||
public void showError(String message) {
|
||||
|
||||
hideDialogLoading();
|
||||
ToastUtil.showShort(mContext,message);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -101,4 +120,11 @@ public class ResetPsdActivity extends BaseActivity<ResetPsdLayoutBinding, MinePr
|
||||
public void getUserInfoSuccess(MineUserInfoBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateUserInfoSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -206,4 +206,19 @@ public class SettingsActivity extends BaseActivity<ActivitySettingsLayoutBinding
|
||||
public void getUserInfoSuccess(MineUserInfoBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateUserInfoSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateUserPasswordSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void logOutSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -116,4 +116,19 @@ public class UserLogOffAccountActivity extends BaseActivity<UserLogOffActivityBi
|
||||
public void getUserInfoSuccess(MineUserInfoBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateUserInfoSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateUserPasswordSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void logOutSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -29,13 +29,24 @@ public class MineContract {
|
||||
public interface DataModel{
|
||||
//获取个人信息
|
||||
void getUserInfo(Map<String,Object> map, CallBack callBack);
|
||||
//更新个人信息
|
||||
void updateUserInfo(JSONObject json, CallBack callBack);
|
||||
//通过旧密码,修改新密码
|
||||
void updateUserPwdByOld(JSONObject json, CallBack callBack);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public interface MineView extends IView {
|
||||
//获取个人信息
|
||||
void getUserInfoSuccess(MineUserInfoBean bean);
|
||||
//更新个人信息成功
|
||||
void updateUserInfoSuccess(BaseBean bean);
|
||||
//密码重设完成
|
||||
void updateUserPasswordSuccess(BaseBean bean);
|
||||
//退出登录
|
||||
void logOutSuccess(BaseBean bean);
|
||||
}
|
||||
|
||||
public interface RecommendModel{
|
||||
|
||||
@@ -4,6 +4,7 @@ import com.ckkj.water.base.entity.MineUserInfoBean;
|
||||
import com.ckkj.water.login.mvp.LoginContract;
|
||||
import com.ckkj.water.mine.entity.MemberComboEntity;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
import com.ckkj.water.network.LoginStateManager;
|
||||
import com.ckkj.water.network.NetWorkManager;
|
||||
|
||||
import org.json.JSONObject;
|
||||
@@ -59,4 +60,84 @@ public class MineImpl implements MineContract.DataModel {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新用户信息
|
||||
* @param json
|
||||
* @param callBack
|
||||
*/
|
||||
@Override
|
||||
public void updateUserInfo(JSONObject json, MineContract.CallBack callBack) {
|
||||
try {
|
||||
NetWorkManager.getRequest().updateUserInfo(NetWorkManager.getToken(),NetWorkManager.toRequestBody(json))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.unsubscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Observer<BaseBean>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseBean bean) {
|
||||
if (bean.getCode() == 200) {
|
||||
callBack.success(bean);
|
||||
} else {
|
||||
callBack.fail(bean.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(@NonNull Throwable e) {
|
||||
callBack.fail(e.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
}
|
||||
});
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过旧密码更新密码
|
||||
* @param json
|
||||
* @param callBack
|
||||
*/
|
||||
@Override
|
||||
public void updateUserPwdByOld(JSONObject json, MineContract.CallBack callBack) {
|
||||
try {
|
||||
NetWorkManager.getRequest().updatePasswordByOld(NetWorkManager.getToken(),NetWorkManager.toRequestBody(json))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.unsubscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Observer<BaseBean>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseBean bean) {
|
||||
if (bean.getCode() == 200) {
|
||||
callBack.success(bean);
|
||||
} else {
|
||||
callBack.fail(bean.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(@NonNull Throwable e) {
|
||||
callBack.fail(e.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
}
|
||||
});
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,15 +1,22 @@
|
||||
package com.ckkj.water.mine.mvp;
|
||||
|
||||
import android.text.Editable;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import com.ckkj.water.ConstantUtil;
|
||||
import com.ckkj.water.base.BasePresenter;
|
||||
import com.ckkj.water.base.entity.MineUserInfoBean;
|
||||
import com.ckkj.water.base.entity.UserInfoEntity;
|
||||
import com.ckkj.water.login.mvp.LoginContract;
|
||||
import com.ckkj.water.login.mvp.LoginImpl;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
import com.ckkj.water.utils.dataUtil.SharePreUtil;
|
||||
import com.ckkj.water.utils.manager.WaterUserInfoManager;
|
||||
import com.google.gson.Gson;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -49,4 +56,83 @@ public class MinePresenter extends BasePresenter<MineContract.MineView> {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改用户信息
|
||||
* @param content
|
||||
*/
|
||||
public void updateUserInfo(String content) {
|
||||
try {
|
||||
JSONObject json = new JSONObject();
|
||||
json.put("nickName", content);
|
||||
impl.updateUserInfo(json, new MineContract.CallBack<BaseBean>() {
|
||||
@Override
|
||||
public void success(BaseBean bean) {
|
||||
if(MinePresenter.this.getView() != null){
|
||||
MinePresenter.this.getView().updateUserInfoSuccess(bean);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fail(String msg) {
|
||||
if(MinePresenter.this.getView() != null){
|
||||
MinePresenter.this.getView().showError(msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (JSONException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过旧密码更新密码
|
||||
* @param oldPsd
|
||||
* @param newPsd
|
||||
*/
|
||||
public void updateUserPsdByOld(String oldPsd, String newPsd) {
|
||||
try {
|
||||
JSONObject json = new JSONObject();
|
||||
json.put("oldPassword", oldPsd);
|
||||
json.put("password", newPsd);
|
||||
impl.updateUserPwdByOld(json, new MineContract.CallBack<BaseBean>() {
|
||||
@Override
|
||||
public void success(BaseBean bean) {
|
||||
if(MinePresenter.this.getView() != null){
|
||||
MinePresenter.this.getView().updateUserPasswordSuccess(bean);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fail(String msg) {
|
||||
if(MinePresenter.this.getView() != null){
|
||||
MinePresenter.this.getView().showError(msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (JSONException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 退出登录
|
||||
*/
|
||||
public void logout() {
|
||||
JSONObject json = new JSONObject();
|
||||
new LoginImpl().logout(json, new LoginContract.CallBack<BaseBean>() {
|
||||
@Override
|
||||
public void success(BaseBean bean) {
|
||||
if(MinePresenter.this.getView() != null){
|
||||
MinePresenter.this.getView().logOutSuccess(bean);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fail(String msg) {
|
||||
if(MinePresenter.this.getView() != null){
|
||||
MinePresenter.this.getView().showError(msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,9 +3,12 @@ package com.ckkj.water.network;
|
||||
|
||||
|
||||
import com.ckkj.water.base.entity.MineUserInfoBean;
|
||||
import com.ckkj.water.index.entity.IndexDeviceEntity;
|
||||
import com.ckkj.water.history.entity.WaterStatisticsEntity;
|
||||
import com.ckkj.water.history.entity.WateringRecord;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
import com.ckkj.water.login.entity.LoginEntity;
|
||||
import com.ckkj.water.main.entity.CheckVersionEntity;
|
||||
import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
|
||||
import com.ckkj.water.plate.entity.BaziResultBean;
|
||||
import com.ckkj.water.plate.entity.BaziSaveSuccessEntity;
|
||||
import com.ckkj.water.plate.entity.PaipanHistoryEntity;
|
||||
@@ -18,7 +21,6 @@ import okhttp3.RequestBody;
|
||||
import retrofit2.http.Body;
|
||||
import retrofit2.http.DELETE;
|
||||
import retrofit2.http.GET;
|
||||
import retrofit2.http.HTTP;
|
||||
import retrofit2.http.HeaderMap;
|
||||
import retrofit2.http.POST;
|
||||
import retrofit2.http.PUT;
|
||||
@@ -37,32 +39,99 @@ public interface Request {
|
||||
//注册
|
||||
@POST("auth/register")
|
||||
Observable<BaseBean> register(@Body RequestBody requestBody);
|
||||
|
||||
//退出登录
|
||||
@POST("auth/logout")
|
||||
Observable<BaseBean> logout(@Body RequestBody requestBody);
|
||||
|
||||
//登录
|
||||
@POST("auth/login")
|
||||
Observable<BaseBean<LoginEntity>> loginBySmsCode(@HeaderMap Map<String, String> headMap, @Body RequestBody requestBody);
|
||||
//获取个人信息
|
||||
@GET("app/v1/getUserInfo")
|
||||
Observable<BaseBean<MineUserInfoBean>> getMineUserInfo(@HeaderMap Map<String, String> headMap, @QueryMap Map<String, Object> map);
|
||||
//修改个人信息
|
||||
@PUT("app/v1/updataUser")
|
||||
Observable<BaseBean> updateUserInfo(@HeaderMap Map<String, String> headMap, @Body RequestBody requestBody);
|
||||
|
||||
//首页设备列表
|
||||
@GET("app/v1/deviceList")
|
||||
Observable<BaseBean<List<IndexDeviceEntity>>> getIndexDeviceList(@HeaderMap Map<String, String> headMap);
|
||||
Observable<BaseBean<List<WaterDeviceEntity>>> getIndexDeviceList(@HeaderMap Map<String, String> headMap);
|
||||
//添加设备
|
||||
@POST("app/v1/addDevice")
|
||||
Observable<BaseBean> addDevice(@HeaderMap Map<String, String> headMap, @Body RequestBody requestBody);
|
||||
//获取设备详细信息
|
||||
@GET("app/v1/device/{id}")
|
||||
Observable<BaseBean<IndexDeviceEntity>> getDeviceDetailInfo(@HeaderMap Map<String, String> headMap, @Path("id") String id);
|
||||
Observable<BaseBean<WaterDeviceEntity>> getDeviceDetailInfo(@HeaderMap Map<String, String> headMap, @Path("id") String id);
|
||||
|
||||
//开启/关闭设备
|
||||
@PUT("app/v1/switchDevice")
|
||||
Observable<BaseBean<WaterPlanWeekEntity>> switchDevice(@HeaderMap Map<String, String> headMap, @Body RequestBody requestBody);
|
||||
|
||||
//修改更新设备信息
|
||||
@PUT("app/v1/updateDeviceInfo")
|
||||
Observable<BaseBean> updateDeviceInfo(@HeaderMap Map<String, String> headMap, @Body RequestBody requestBody);
|
||||
|
||||
//解绑信息
|
||||
// 示例:ids array[string]
|
||||
//["2052921001527869441"]
|
||||
//通过旧密码修改密码
|
||||
@PUT("app/v1/updataPassword")
|
||||
Observable<BaseBean> updatePasswordByOld(@HeaderMap Map<String, String> headMap, @Body RequestBody requestBody);
|
||||
|
||||
//通过手机、邮箱验证码修改密码
|
||||
@POST("app/v1/retrievePassword")
|
||||
Observable<BaseBean> updatePasswordByVerifyCode(@HeaderMap Map<String, String> headMap, @Body RequestBody requestBody);
|
||||
|
||||
//查询排程列表
|
||||
@GET("app/v1/schedulelist")
|
||||
Observable<BaseBean<List<WaterPlanWeekEntity>>> scheduleList(@HeaderMap Map<String, String> headMap,@QueryMap Map<String, String> map);
|
||||
|
||||
|
||||
//添加排程信息
|
||||
@POST("app/v1/addschedule")
|
||||
Observable<BaseBean<WaterPlanWeekEntity>> addSchedule(@HeaderMap Map<String, String> headMap, @Body RequestBody requestBody);
|
||||
|
||||
//编辑排程,更新
|
||||
@PUT("app/v1/updataschedule")
|
||||
Observable<BaseBean<WaterPlanWeekEntity>> updateSchedule(@HeaderMap Map<String, String> headMap, @Body RequestBody requestBody);
|
||||
|
||||
//查询排程可绑定设备列表
|
||||
@GET("app/v1/scheduleDeviceList/{id}")
|
||||
Observable<BaseBean<WaterDeviceEntity>> getPlanBindDeviceList(@HeaderMap Map<String, String> headMap, @Path("id") String id);
|
||||
|
||||
//查询排程详情
|
||||
@GET("app/v1/schedule/{id}")
|
||||
Observable<BaseBean<WaterPlanWeekEntity>> getPlanDetailInfo(@HeaderMap Map<String, String> headMap, @Path("id") String id);
|
||||
|
||||
//排程绑定设备
|
||||
@POST("app/v1/addScheduleDevice")
|
||||
Observable<BaseBean> planBindDevice(@HeaderMap Map<String, String> headMap, @Body RequestBody requestBody);
|
||||
|
||||
//更新排程状态
|
||||
@PUT("app/v1/editScheduleStatus")
|
||||
Observable<BaseBean<WaterPlanWeekEntity>> updateScheduleStatus(@HeaderMap Map<String, String> headMap, @Body RequestBody requestBody);
|
||||
|
||||
//删除排程
|
||||
@DELETE("app/v1/deleteschedule/{ids}")
|
||||
Observable<BaseBean> deletePlanById(@HeaderMap Map<String,String> headMap, @Path("ids") String id);
|
||||
|
||||
|
||||
//删除设备
|
||||
@DELETE("app/v1/deleteDevice/{ids}")
|
||||
Observable<BaseBean> unBindDevice(@HeaderMap Map<String,String> headMap, @Path("ids") String id);
|
||||
|
||||
//排程解绑设备
|
||||
@DELETE("app/v1/deleteScheduleDevice")
|
||||
Observable<BaseBean> planUnBindDevice(@HeaderMap Map<String,String> headMap,@QueryMap Map<String, String> map);
|
||||
|
||||
|
||||
//浇水历史记录
|
||||
@GET("app/v1/waterLogList")
|
||||
Observable<BaseBean<List<WateringRecord>>> waterLogList(@HeaderMap Map<String, String> headMap, @QueryMap Map<String, String> map);
|
||||
//删除某一条历史记录
|
||||
@DELETE("app/v1/waterLog/{id}")
|
||||
Observable<BaseBean> deleteWaterLog(@HeaderMap Map<String,String> headMap, @Path("id") String id);
|
||||
//浇水历史数据统计
|
||||
@GET("app/v1/dataStatistics")
|
||||
Observable<BaseBean<WaterStatisticsEntity>> getDataStatistics(@HeaderMap Map<String, String> headMap);
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,40 +1,50 @@
|
||||
package com.ckkj.water.plan;
|
||||
|
||||
import static android.view.View.GONE;
|
||||
import static android.view.View.VISIBLE;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
||||
import com.ckkj.water.R;
|
||||
import com.ckkj.water.base.BaseActivity;
|
||||
import com.ckkj.water.base.BaseFragment;
|
||||
import com.ckkj.water.databinding.AddWaterPlanLayoutBinding;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
|
||||
import com.ckkj.water.plan.mvp.WaterPlanContract;
|
||||
import com.ckkj.water.plan.mvp.WaterPlanImpl;
|
||||
import com.ckkj.water.plan.mvp.WaterPlanPresenter;
|
||||
import com.ckkj.water.plate.adapter.ViewPagerAdapter;
|
||||
import com.ckkj.water.utils.show.ToastUtil;
|
||||
import com.gyf.immersionbar.ImmersionBar;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 添加浇水排程
|
||||
* 添加/编辑浇水排程
|
||||
*/
|
||||
public class AddWaterPlanActivity extends BaseActivity<AddWaterPlanLayoutBinding, WaterPlanPresenter>
|
||||
implements WaterPlanContract.WaterPlanView {
|
||||
|
||||
private List<Fragment> mFragmentList = new ArrayList<>();
|
||||
private List<WaterPlanWeekEntity.DeviceEntity> mSelectedDevices = new ArrayList<>();
|
||||
|
||||
public List<WaterPlanWeekEntity.DeviceEntity> getSelectedDevices() {
|
||||
return mSelectedDevices;
|
||||
}
|
||||
|
||||
public void setSelectedDevices(List<WaterPlanWeekEntity.DeviceEntity> selectedDevices) {
|
||||
this.mSelectedDevices = selectedDevices;
|
||||
}
|
||||
private boolean mIsEditMode = false;
|
||||
private WaterPlanWeekEntity mEditEntity;
|
||||
private WaterPlanWeekEntity mNewAddEntity;
|
||||
// private List<WaterPlanWeekEntity.DeviceEntity> mSelectedDevices = new ArrayList<>();
|
||||
//
|
||||
// public List<WaterPlanWeekEntity.DeviceEntity> getSelectedDevices() {
|
||||
// return mSelectedDevices;
|
||||
// }
|
||||
//
|
||||
// public void setSelectedDevices(List<WaterPlanWeekEntity.DeviceEntity> selectedDevices) {
|
||||
// this.mSelectedDevices = selectedDevices;
|
||||
// }
|
||||
|
||||
@Override
|
||||
public WaterPlanPresenter createPresenter() {
|
||||
@@ -51,8 +61,24 @@ public class AddWaterPlanActivity extends BaseActivity<AddWaterPlanLayoutBinding
|
||||
.statusBarDarkFont(true) // 设置状态栏字体为黑色
|
||||
.titleBar(viewBinding.rlTitle)
|
||||
.init();
|
||||
|
||||
Bundle bundle = getIntent().getExtras();
|
||||
if (bundle != null) {
|
||||
mIsEditMode = bundle.getBoolean("is_edit", false);
|
||||
mEditEntity = (WaterPlanWeekEntity) bundle.getSerializable("plan_entity");
|
||||
}
|
||||
|
||||
// 根据模式设置标题
|
||||
if (mIsEditMode) {
|
||||
viewBinding.includedTitle.tvTitle.setText(R.string.edit_water_plan_title);
|
||||
viewBinding.tvBound.setVisibility(VISIBLE);
|
||||
} else {
|
||||
viewBinding.includedTitle.tvTitle.setText(R.string.add_water_plan_title);
|
||||
mFragmentList.add(new WaterConfigFragment());
|
||||
viewBinding.tvBound.setVisibility(GONE);
|
||||
}
|
||||
|
||||
mFragmentList.add(new WaterConfigFragment_copy());
|
||||
mFragmentList.add(new PlanBoundDeviceFragment());
|
||||
mFragmentList.add(new BindDeviceFragment());
|
||||
ViewPagerAdapter adapter = new ViewPagerAdapter(mContext, mFragmentList);
|
||||
viewBinding.viewpage.setAdapter(adapter);
|
||||
@@ -63,11 +89,23 @@ public class AddWaterPlanActivity extends BaseActivity<AddWaterPlanLayoutBinding
|
||||
viewBinding.tvConfig.setSelected(true);
|
||||
viewBinding.tvBind.setSelected(false);
|
||||
initListener();
|
||||
|
||||
// 编辑模式下,延迟传递数据给 WaterConfigFragment,等 viewBinding 初始化完成后调用
|
||||
if (mIsEditMode && mEditEntity != null) {
|
||||
viewBinding.viewpage.post(() -> {
|
||||
WaterConfigFragment_copy configFragment = (WaterConfigFragment_copy) mFragmentList.get(0);
|
||||
configFragment.setEditEntity(mEditEntity);
|
||||
|
||||
PlanBoundDeviceFragment boundDeviceFragment = (PlanBoundDeviceFragment) mFragmentList.get(1);
|
||||
boundDeviceFragment.setEditEntity(mEditEntity);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void initListener() {
|
||||
setClick(viewBinding.includedTitle.imgBack);
|
||||
setClick(viewBinding.tvConfig);
|
||||
setClick(viewBinding.tvBound);
|
||||
setClick(viewBinding.tvBind);
|
||||
}
|
||||
|
||||
@@ -84,19 +122,114 @@ public class AddWaterPlanActivity extends BaseActivity<AddWaterPlanLayoutBinding
|
||||
case R.id.tv_config:
|
||||
viewBinding.tvConfig.setSelected(true);
|
||||
viewBinding.tvBind.setSelected(false);
|
||||
viewBinding.tvBound.setSelected(false);
|
||||
viewBinding.viewpage.setCurrentItem(0);
|
||||
break;
|
||||
|
||||
case R.id.tv_bind:
|
||||
case R.id.tv_bound:
|
||||
viewBinding.tvConfig.setSelected(false);
|
||||
viewBinding.tvBind.setSelected(true);
|
||||
viewBinding.tvBound.setSelected(true);
|
||||
viewBinding.tvBind.setSelected(false);
|
||||
viewBinding.viewpage.setCurrentItem(1);
|
||||
|
||||
// 传递编辑实体给 PlanBoundDeviceFragment
|
||||
PlanBoundDeviceFragment boundDeviceFragment = (PlanBoundDeviceFragment) mFragmentList.get(1);
|
||||
boundDeviceFragment.setEditEntity(mEditEntity);
|
||||
break;
|
||||
|
||||
case R.id.tv_bind:
|
||||
WaterConfigFragment_copy configFragment = (WaterConfigFragment_copy) mFragmentList.get(0);
|
||||
|
||||
// 检查是否有未保存的数据变更
|
||||
if (configFragment.hasDataChanged()) {
|
||||
showDialogtext(null, false, false, true,
|
||||
"提示", "数据已发生变更,是否保存?",
|
||||
getString(R.string.cancel_text), "保存", new BaseFragment.OnDialogClick() {
|
||||
@Override
|
||||
public void onCancelClick() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfirmClick() {
|
||||
// 更新配置
|
||||
configFragment.updateConfig();
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
if (!configFragment.isConfigSubmitted()) {
|
||||
// 校验新增排程的配置
|
||||
if (!mIsEditMode) {
|
||||
if (TextUtils.isEmpty(configFragment.getPlanName())) {
|
||||
ToastUtil.showShort(mContext, getString(R.string.plan_name_text_empty_hint));
|
||||
return;
|
||||
}
|
||||
if (!configFragment.hasTimeConfig()) {
|
||||
ToastUtil.showShort(mContext, "请至少配置一天的时间");
|
||||
return;
|
||||
}
|
||||
}
|
||||
showDialogtext(null, false, false, true,
|
||||
"提示", "关联设备需要保存排程配置,是否继续?",
|
||||
getString(R.string.cancel_text), "继续", new BaseFragment.OnDialogClick() {
|
||||
@Override
|
||||
public void onCancelClick() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfirmClick() {
|
||||
configFragment.commitConfig();
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
proceedToBindDevice();
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void selectTabBind(WaterPlanWeekEntity entity) {
|
||||
if (entity == null) {
|
||||
entity = mIsEditMode ? mEditEntity : mNewAddEntity;
|
||||
}
|
||||
if (entity == null) {
|
||||
ToastUtil.showShort(mContext, "请先保存排程");
|
||||
return;
|
||||
}
|
||||
viewBinding.tvConfig.setSelected(false);
|
||||
viewBinding.tvBound.setSelected(false);
|
||||
viewBinding.tvBind.setSelected(true);
|
||||
viewBinding.viewpage.setCurrentItem(2);
|
||||
|
||||
// 传递排程数据给 BindDeviceFragment
|
||||
BindDeviceFragment bindDeviceFragment = (BindDeviceFragment) mFragmentList.get(2);
|
||||
bindDeviceFragment.setPlanEntity(entity);
|
||||
}
|
||||
|
||||
/**
|
||||
* 切换到绑定设备页面
|
||||
*/
|
||||
private void proceedToBindDevice() {
|
||||
WaterConfigFragment_copy configFragment = (WaterConfigFragment_copy) mFragmentList.get(0);
|
||||
WaterPlanWeekEntity entity = mIsEditMode ? mEditEntity : mNewAddEntity;
|
||||
if (entity == null) {
|
||||
entity = configFragment.getRemoteEntity();
|
||||
}
|
||||
selectTabBind(entity);
|
||||
}
|
||||
|
||||
public void onConfigSaved(WaterPlanWeekEntity entity) {
|
||||
mNewAddEntity = entity;
|
||||
selectTabBind(entity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getLayoutResId(Bundle savedInstanceState) {
|
||||
return 0;
|
||||
@@ -111,4 +244,50 @@ public class AddWaterPlanActivity extends BaseActivity<AddWaterPlanLayoutBinding
|
||||
public void logOut(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getWaterConfigListSuccess(List<WaterPlanWeekEntity> list,int total) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveConfigSuccess(WaterPlanWeekEntity entity) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateConfigSuccess(WaterPlanWeekEntity entity) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updatePlanStatusSuccess(BaseBean bean, String status) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getPlanDetailInfo(WaterPlanWeekEntity entity) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getPlanBindDeviceList(WaterDeviceEntity bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void planBindDeviceSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deletePlanSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void planUnbindDeviceSuccess(BaseBean bean, int position) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,26 +1,25 @@
|
||||
package com.ckkj.water.plan;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.databinding.BindingAdapter;
|
||||
|
||||
import com.chad.library.adapter.base.BaseQuickAdapter;
|
||||
import com.ckkj.water.R;
|
||||
import com.ckkj.water.base.BaseFragment;
|
||||
import com.ckkj.water.databinding.PlanBindDeviceLayoutBinding;
|
||||
import com.ckkj.water.main.activity.MainActivity;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
//import com.ckkj.water.plan.adapter.BindDeviceAdapter;
|
||||
import com.ckkj.water.plan.adapter.BindDeviceAdapter;
|
||||
import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
|
||||
import com.ckkj.water.plan.mvp.WaterPlanContract;
|
||||
import com.ckkj.water.plan.mvp.WaterPlanImpl;
|
||||
import com.ckkj.water.plan.mvp.WaterPlanPresenter;
|
||||
import com.google.gson.Gson;
|
||||
import com.ckkj.water.utils.show.ToastUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* 排程关联设备
|
||||
@@ -29,36 +28,144 @@ public class BindDeviceFragment extends BaseFragment<PlanBindDeviceLayoutBinding
|
||||
implements WaterPlanContract.WaterPlanView {
|
||||
|
||||
private List<WaterPlanWeekEntity> weekList = new ArrayList<>();
|
||||
|
||||
private List<WaterDeviceEntity.DeviceListBean> mDeviceList = new ArrayList<>();
|
||||
private WaterPlanWeekEntity mPlanEntity;
|
||||
private BindDeviceAdapter mAdapter;
|
||||
|
||||
@Override
|
||||
public void initData(Bundle state) {
|
||||
String jsonContent = getString(R.string.plan_water_entity_json);
|
||||
WaterPlanWeekEntity entity = new Gson().fromJson(jsonContent, WaterPlanWeekEntity.class);
|
||||
weekList.add(entity);
|
||||
mAdapter = new BindDeviceAdapter(mContext,R.layout.plan_bind_device_item,weekList.get(0).getDeviceList());
|
||||
initListener();
|
||||
mAdapter = new BindDeviceAdapter(mContext,R.layout.plan_bind_device_item,mDeviceList);
|
||||
viewBinding.rvDevices.setAdapter(mAdapter);
|
||||
mAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
|
||||
@Override
|
||||
public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
|
||||
mAdapter.toggleSelection(position);
|
||||
syncSelectedDevices();
|
||||
if(mDeviceList.get(position).getStatus().equals("0")){
|
||||
mDeviceList.get(position).setStatus("1");
|
||||
}else{
|
||||
mDeviceList.get(position).setStatus("0");
|
||||
}
|
||||
}
|
||||
});
|
||||
if (mPlanEntity != null) {
|
||||
mPresenter.getPlanBindDevices(mPlanEntity);
|
||||
}
|
||||
}
|
||||
|
||||
private void syncSelectedDevices() {
|
||||
Set<Integer> selectedPositions = mAdapter.getSelectedPositions();
|
||||
List<WaterPlanWeekEntity.DeviceEntity> selected = new ArrayList<>();
|
||||
for (int pos : selectedPositions) {
|
||||
if (pos >= 0 && pos < weekList.get(0).getDeviceList().size()) {
|
||||
selected.add(weekList.get(0).getDeviceList().get(pos));
|
||||
private void initListener() {
|
||||
setClick(viewBinding.tvCommit);
|
||||
}
|
||||
private void setClick(View view) {
|
||||
view.setOnClickListener(this::onClick);
|
||||
}
|
||||
|
||||
public void onClick(View v){
|
||||
switch (v.getId()){
|
||||
case R.id.tv_commit:
|
||||
if (mPlanEntity == null) {
|
||||
ToastUtil.showShort(mContext, "请先保存排程");
|
||||
return;
|
||||
}
|
||||
boolean isSelected = false;
|
||||
List<String> selected = new ArrayList<>();
|
||||
for(WaterDeviceEntity.DeviceListBean bean : mDeviceList){
|
||||
if(bean.getStatus().equals("1")){
|
||||
isSelected = true;
|
||||
selected.add(bean.getId());
|
||||
}
|
||||
}
|
||||
if(!isSelected){
|
||||
ToastUtil.showShort(mContext, getString(R.string.select_the_device_to_link));
|
||||
return;
|
||||
}
|
||||
String selDevice = "";
|
||||
for(String id : selected){
|
||||
selDevice += id + ",";
|
||||
}
|
||||
selDevice = selDevice.substring(0,selDevice.length()-1);
|
||||
//提交绑定
|
||||
mPresenter.planBindWithDevices(mPlanEntity,selDevice);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResumeInitData() {
|
||||
super.onResumeInitData();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置排程实体,用于关联设备接口请求
|
||||
* @param entity 排程实体
|
||||
*/
|
||||
public void setPlanEntity(WaterPlanWeekEntity entity) {
|
||||
this.mPlanEntity = entity;
|
||||
if (mPlanEntity != null) {
|
||||
if(mPresenter != null){
|
||||
mPresenter.getPlanBindDevices(mPlanEntity);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询到了可绑定的设备
|
||||
* @param bean
|
||||
*/
|
||||
@Override
|
||||
public void getPlanBindDeviceList(WaterDeviceEntity bean) {
|
||||
hideDialogLoading();
|
||||
if(mAdapter != null){
|
||||
mDeviceList = bean.getDeviceList();
|
||||
mAdapter.setNewData(mDeviceList);
|
||||
if (mAdapter.getItemCount() != 0) {
|
||||
viewBinding.relNoresult.setVisibility(View.GONE);
|
||||
viewBinding.linearContent.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
viewBinding.relNoresult.setVisibility(View.VISIBLE);
|
||||
viewBinding.linearContent.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void planBindDeviceSuccess(BaseBean bean) {
|
||||
hideDialogLoading();
|
||||
ToastUtil.showShort(mContext, "绑定成功");
|
||||
new Handler().postDelayed(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (getActivity() instanceof AddWaterPlanActivity) {
|
||||
((AddWaterPlanActivity) getActivity()).setSelectedDevices(selected);
|
||||
((AddWaterPlanActivity) getActivity()).finish();
|
||||
}
|
||||
}
|
||||
},800);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deletePlanSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void planUnbindDeviceSuccess(BaseBean bean, int position) {
|
||||
|
||||
}
|
||||
|
||||
// private void syncSelectedDevices() {
|
||||
// Set<Integer> selectedPositions = mAdapter.getSelectedPositions();
|
||||
// List<WaterPlanWeekEntity.DeviceEntity> selected = new ArrayList<>();
|
||||
// for (int pos : selectedPositions) {
|
||||
// if (pos >= 0 && pos < weekList.get(0).getDeviceList().size()) {
|
||||
// selected.add(weekList.get(0).getDeviceList().get(pos));
|
||||
// }
|
||||
// }
|
||||
// if (getActivity() instanceof AddWaterPlanActivity) {
|
||||
// ((AddWaterPlanActivity) getActivity()).setSelectedDevices(selected);
|
||||
// }
|
||||
// }
|
||||
|
||||
@Override
|
||||
public WaterPlanPresenter createPresenter() {
|
||||
@@ -79,4 +186,31 @@ public class BindDeviceFragment extends BaseFragment<PlanBindDeviceLayoutBinding
|
||||
public void logOut(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getWaterConfigListSuccess(List<WaterPlanWeekEntity> list,int total) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveConfigSuccess(WaterPlanWeekEntity entity) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateConfigSuccess(WaterPlanWeekEntity entity) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updatePlanStatusSuccess(BaseBean bean, String status) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getPlanDetailInfo(WaterPlanWeekEntity entity) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,193 @@
|
||||
package com.ckkj.water.plan;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
|
||||
import com.chad.library.adapter.base.BaseQuickAdapter;
|
||||
import com.ckkj.water.R;
|
||||
import com.ckkj.water.base.BaseFragment;
|
||||
import com.ckkj.water.databinding.PlanBoundDeviceLayoutBinding;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
import com.ckkj.water.plan.adapter.PlanBoundDeviceAdapter;
|
||||
import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
|
||||
import com.ckkj.water.plan.mvp.WaterPlanContract;
|
||||
import com.ckkj.water.plan.mvp.WaterPlanImpl;
|
||||
import com.ckkj.water.plan.mvp.WaterPlanPresenter;
|
||||
import com.ckkj.water.utils.show.ToastUtil;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author fengxiaoyang
|
||||
* @date 2026/5/29
|
||||
* @description 已绑定的设备列表
|
||||
*/
|
||||
public class PlanBoundDeviceFragment extends BaseFragment<PlanBoundDeviceLayoutBinding, WaterPlanPresenter>
|
||||
implements WaterPlanContract.WaterPlanView{
|
||||
|
||||
private WaterPlanWeekEntity mEditEntity;
|
||||
private PlanBoundDeviceAdapter mAdapter;
|
||||
|
||||
@Override
|
||||
public void initData(Bundle state) {
|
||||
// 初始化适配器,如果有数据则设置
|
||||
if (mEditEntity != null && mEditEntity.getDeviceIds() != null) {
|
||||
mAdapter = new PlanBoundDeviceAdapter(mContext, R.layout.plan_bound_device_item, mEditEntity.getDeviceIds());
|
||||
viewBinding.rvDevices.setAdapter(mAdapter);
|
||||
|
||||
// 根据数据状态显示/隐藏视图
|
||||
if (mEditEntity.getDeviceIds().isEmpty()) {
|
||||
viewBinding.linearContent.setVisibility(View.GONE);
|
||||
viewBinding.relNoresult.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
viewBinding.linearContent.setVisibility(View.VISIBLE);
|
||||
viewBinding.relNoresult.setVisibility(View.GONE);
|
||||
}
|
||||
} else {
|
||||
// 无数据时显示空状态
|
||||
viewBinding.linearContent.setVisibility(View.GONE);
|
||||
viewBinding.relNoresult.setVisibility(View.VISIBLE);
|
||||
}
|
||||
if(mAdapter != null){
|
||||
mAdapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
|
||||
@Override
|
||||
public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
|
||||
switch (view.getId()){
|
||||
case R.id.img_delete:
|
||||
showDialogtext(null, false, false, "提示",
|
||||
"确定解绑该设备?", "取消", "解绑",
|
||||
new OnDialogClick() {
|
||||
@Override
|
||||
public void onCancelClick() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfirmClick() {
|
||||
showLoadingDialog();
|
||||
mPresenter.planUnbindDevice(mEditEntity.getId(),
|
||||
mEditEntity.getDeviceIds().get(position).getId(),
|
||||
position);
|
||||
}
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void setEditEntity(WaterPlanWeekEntity entity) {
|
||||
this.mEditEntity = entity;
|
||||
// 使用 getView().post() 确保视图已初始化完成
|
||||
if (getView() != null) {
|
||||
getView().post(() -> {
|
||||
if (viewBinding != null) {
|
||||
updateUI();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void updateUI() {
|
||||
if (viewBinding == null) {
|
||||
return;
|
||||
}
|
||||
if (mEditEntity == null || mEditEntity.getDeviceIds() == null) {
|
||||
viewBinding.linearContent.setVisibility(View.GONE);
|
||||
viewBinding.relNoresult.setVisibility(View.VISIBLE);
|
||||
return;
|
||||
}
|
||||
|
||||
if (mEditEntity.getDeviceIds().isEmpty()) {
|
||||
viewBinding.linearContent.setVisibility(View.GONE);
|
||||
viewBinding.relNoresult.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
viewBinding.linearContent.setVisibility(View.VISIBLE);
|
||||
viewBinding.relNoresult.setVisibility(View.GONE);
|
||||
if (mAdapter != null) {
|
||||
mAdapter.setNewData(mEditEntity.getDeviceIds());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public WaterPlanWeekEntity getEditEntity() {
|
||||
return mEditEntity;
|
||||
}
|
||||
|
||||
@Override
|
||||
public WaterPlanPresenter createPresenter() {
|
||||
return new WaterPlanPresenter(new WaterPlanImpl());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getWaterConfigListSuccess(List<WaterPlanWeekEntity> list, int total) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveConfigSuccess(WaterPlanWeekEntity entity) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateConfigSuccess(WaterPlanWeekEntity entity) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updatePlanStatusSuccess(BaseBean bean, String status) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getPlanDetailInfo(WaterPlanWeekEntity entity) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getPlanBindDeviceList(WaterDeviceEntity bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void planBindDeviceSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deletePlanSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void planUnbindDeviceSuccess(BaseBean bean, int position) {
|
||||
hideDialogLoading();
|
||||
ToastUtil.showShort(mContext, "解绑成功");
|
||||
mAdapter.notifyItemRemoved(position);
|
||||
mEditEntity.getDeviceIds().remove(position);
|
||||
if (mAdapter.getItemCount() != 0) {
|
||||
viewBinding.relNoresult.setVisibility(View.GONE);
|
||||
viewBinding.linearContent.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
viewBinding.relNoresult.setVisibility(View.VISIBLE);
|
||||
viewBinding.linearContent.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNetChange(int netModel) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showError(String message) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void logOut(BaseBean bean) {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,33 +1,63 @@
|
||||
package com.ckkj.water.plan;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.text.TextUtils;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
|
||||
import com.ckkj.water.R;
|
||||
import com.ckkj.water.base.BaseActivity;
|
||||
import com.ckkj.water.base.BaseFragment;
|
||||
import com.ckkj.water.databinding.WaterPlanDetailLayoutBinding;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
//import com.ckkj.water.plan.adapter.PlanDetailDeviceAdapter;
|
||||
//import com.ckkj.water.plan.adapter.PlanDetailTimeAdapter;
|
||||
import com.ckkj.water.plan.adapter.PlanDetailDeviceAdapter;
|
||||
import com.ckkj.water.plan.adapter.PlanDetailTimeAdapter;
|
||||
import com.ckkj.water.plan.adapter.PlanWeekDaysAdapter;
|
||||
import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
|
||||
import com.ckkj.water.plan.mvp.WaterPlanContract;
|
||||
import com.ckkj.water.plan.mvp.WaterPlanImpl;
|
||||
import com.ckkj.water.plan.mvp.WaterPlanPresenter;
|
||||
import com.ckkj.water.utils.show.ToastUtil;
|
||||
import com.ckkj.water.utils.time.ZYTimeUtils;
|
||||
import com.google.gson.Gson;
|
||||
import com.gyf.immersionbar.ImmersionBar;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 排程详情页面
|
||||
*/
|
||||
public class PlanDetailActivity extends BaseActivity<WaterPlanDetailLayoutBinding, WaterPlanPresenter>
|
||||
implements WaterPlanContract.WaterPlanView {
|
||||
//列表页面传的的,用于获取详情
|
||||
private WaterPlanWeekEntity mPlanEntity;
|
||||
//查询到的排程详情
|
||||
private WaterPlanWeekEntity mDetailEntity;
|
||||
private PlanWeekDaysAdapter mAdapter;
|
||||
private PlanDetailDeviceAdapter deviceAdapter;
|
||||
private List<WaterPlanWeekEntity.DetailsBean> mList = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
showLoadingDialog();
|
||||
mPresenter.getPlanDetailInfo(mPlanEntity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initData(Bundle savedInstanceState) {
|
||||
super.initData(savedInstanceState);
|
||||
Bundle bundle = getIntent().getExtras();
|
||||
if(bundle != null){
|
||||
mPlanEntity = (WaterPlanWeekEntity) bundle.getSerializable("plan_entity");
|
||||
}
|
||||
String jsonContent = getString(R.string.plan_water_entity_json);
|
||||
WaterPlanWeekEntity entity = new Gson().fromJson(jsonContent, WaterPlanWeekEntity.class);
|
||||
|
||||
ImmersionBar.with(this)
|
||||
.statusBarColor(R.color.color_F9F9F9) // 设置状态栏颜色
|
||||
.statusBarDarkFont(true) // 设置状态栏字体为黑色
|
||||
@@ -35,14 +65,34 @@ public class PlanDetailActivity extends BaseActivity<WaterPlanDetailLayoutBindin
|
||||
.init();
|
||||
viewBinding.includedTitle.tvTitle.setText(R.string.plan_detail_title);
|
||||
initListener();
|
||||
PlanDetailTimeAdapter timeAdapter = new PlanDetailTimeAdapter(R.layout.plan_detail_time_item,entity.getWashCycleList());
|
||||
viewBinding.rvPlanTime.setAdapter(timeAdapter);
|
||||
PlanDetailDeviceAdapter deviceAdapter = new PlanDetailDeviceAdapter(R.layout.plan_detail_bind_device_item,entity.getDeviceList());
|
||||
mAdapter = new PlanWeekDaysAdapter(R.layout.single_recycleview_item,mList);
|
||||
viewBinding.rvPlanTime.setAdapter(mAdapter);
|
||||
List<WaterDeviceEntity> deviceList = new ArrayList<>();
|
||||
deviceAdapter = new PlanDetailDeviceAdapter(R.layout.plan_detail_bind_device_item,deviceList);
|
||||
viewBinding.rvBindDevices.setAdapter(deviceAdapter);
|
||||
}
|
||||
|
||||
private void initListener() {
|
||||
setClick(viewBinding.includedTitle.imgBack);
|
||||
setClick(viewBinding.btnEdit);
|
||||
setClick(viewBinding.btnDelete);
|
||||
setClick(viewBinding.switchButton);
|
||||
// viewBinding.switchButton.setOnTouchListener(new View.OnTouchListener() {
|
||||
// @Override
|
||||
// public boolean onTouch(View v, MotionEvent event) {
|
||||
// if (event.getAction() == MotionEvent.ACTION_DOWN) {
|
||||
// if (viewBinding.switchButton.isChecked()) {
|
||||
// // 当前是开启状态,下一步将是关闭 -> 屏蔽动画(时长设为0)
|
||||
// 0
|
||||
// } else {
|
||||
// // 当前是关闭状态,下一步将是开启 -> 开启动画(恢复默认的 250ms 或你想要的时长)
|
||||
// viewBinding.switchButton.setAnimationDuration(250);
|
||||
// }
|
||||
// }
|
||||
// // 返回 false 以便将触摸事件继续传递给 SwitchButton 内部的点击/滑动逻辑
|
||||
// return false;
|
||||
// }
|
||||
// });
|
||||
}
|
||||
|
||||
private void setClick(View view) {
|
||||
@@ -55,9 +105,162 @@ public class PlanDetailActivity extends BaseActivity<WaterPlanDetailLayoutBindin
|
||||
finish();
|
||||
break;
|
||||
|
||||
case R.id.btn_edit://编辑
|
||||
if(mDetailEntity != null){
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putSerializable("plan_entity", mDetailEntity);
|
||||
bundle.putBoolean("is_edit", true);
|
||||
goTo(mContext, AddWaterPlanActivity.class,bundle);
|
||||
}
|
||||
break;
|
||||
|
||||
case R.id.btn_delete://删除
|
||||
showDialogtext(null, false, false, true,
|
||||
getString(R.string.tip_text), getString(R.string.delete_plan_tip),
|
||||
getString(R.string.cancel_text), getString(R.string.confirm_text), new BaseFragment.OnDialogClick() {
|
||||
@Override
|
||||
public void onCancelClick() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfirmClick() {
|
||||
mPresenter.deletePlan(mDetailEntity);
|
||||
}
|
||||
});
|
||||
break;
|
||||
case R.id.switch_button://切换状态
|
||||
// 先恢复 Switch 到原始状态,避免点击时立即改变
|
||||
viewBinding.switchButton.setChecked(mDetailEntity.getStatus().equals("1"));
|
||||
if(mDetailEntity.getStatus().equals("1")){
|
||||
showDialogtext(null, false, false, true,
|
||||
getString(R.string.tip_text), getString(R.string.close_plan_dialog_tip),
|
||||
getString(R.string.cancel_text), getString(R.string.confirm_text), new BaseFragment.OnDialogClick() {
|
||||
@Override
|
||||
public void onCancelClick() {
|
||||
// 取消操作,恢复 Switch 状态
|
||||
viewBinding.switchButton.setChecked(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfirmClick() {
|
||||
// 确认关闭任务,调用接口后再更新 Switch
|
||||
showLoadingDialog();
|
||||
mPresenter.updatePlanStatus(mDetailEntity, "0");
|
||||
}
|
||||
});
|
||||
}else{
|
||||
// 开启任务,调用接口后再更新 Switch
|
||||
mPresenter.updatePlanStatus(mDetailEntity, "1");
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 获取配成详情成功
|
||||
* @param entity
|
||||
*/
|
||||
@Override
|
||||
public void getPlanDetailInfo(WaterPlanWeekEntity entity) {
|
||||
hideDialogLoading();
|
||||
mDetailEntity = entity;
|
||||
viewBinding.tvPlanName.setText(entity.getName());
|
||||
if(entity.getStatus().equals("1")){
|
||||
viewBinding.switchButton.setChecked(true);
|
||||
}else{
|
||||
viewBinding.switchButton.setChecked(false);
|
||||
}
|
||||
//针对周一 --- 周日的日期,只显示勾选的日期
|
||||
List<WaterPlanWeekEntity.DetailsBean> list = new ArrayList<>();
|
||||
for(WaterPlanWeekEntity.DetailsBean bean : entity.getDetails()){
|
||||
if(bean.getStatus().equals("1")){
|
||||
// 检查该日期是否有有效的时间配置
|
||||
boolean hasValidTime = false;
|
||||
if(bean.getTimeData() != null){
|
||||
for(WaterPlanWeekEntity.TimeDataBean timeBean : bean.getTimeData()){
|
||||
if(!TextUtils.isEmpty(timeBean.getStartTime())
|
||||
&& timeBean.getDurationMin() != 0){
|
||||
hasValidTime = true;
|
||||
bean.setWeekName(ZYTimeUtils.getWeekName(bean.getWeekday() - 1));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(hasValidTime){
|
||||
list.add(bean);
|
||||
}
|
||||
}
|
||||
}
|
||||
//日期显示
|
||||
if(mAdapter != null){
|
||||
mAdapter.setNewData(list);
|
||||
}
|
||||
//设备显示
|
||||
if(deviceAdapter != null){
|
||||
deviceAdapter.setNewData(entity.getDeviceIds());
|
||||
if(deviceAdapter.getItemCount() == 0){
|
||||
viewBinding.rvBindDevices.setVisibility(View.GONE);
|
||||
viewBinding.tvNoDevice.setVisibility(View.VISIBLE);
|
||||
}else{
|
||||
viewBinding.rvBindDevices.setVisibility(View.VISIBLE);
|
||||
viewBinding.tvNoDevice.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除排程成功
|
||||
* @param bean
|
||||
*/
|
||||
@Override
|
||||
public void deletePlanSuccess(BaseBean bean) {
|
||||
hideDialogLoading();
|
||||
ToastUtil.showShort(mContext,getString(R.string.delete_plan_success));
|
||||
new Handler().postDelayed(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
finish();
|
||||
}
|
||||
},500);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void planUnbindDeviceSuccess(BaseBean bean, int position) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新排程状态成功
|
||||
*
|
||||
* @param bean
|
||||
* @param status
|
||||
*/
|
||||
@Override
|
||||
public void updatePlanStatusSuccess(BaseBean bean, String status) {
|
||||
hideDialogLoading();
|
||||
mDetailEntity.setStatus(status);
|
||||
if(status.equals("1")){
|
||||
showCenterTipDialog(R.mipmap.icon_dialog_success,"任务已开启");
|
||||
viewBinding.switchButton.setChecked(true);
|
||||
}else{
|
||||
viewBinding.switchButton.setChecked(false);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getPlanBindDeviceList(WaterDeviceEntity bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void planBindDeviceSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public WaterPlanPresenter createPresenter() {
|
||||
@@ -71,11 +274,29 @@ public class PlanDetailActivity extends BaseActivity<WaterPlanDetailLayoutBindin
|
||||
|
||||
@Override
|
||||
public void showError(String message) {
|
||||
|
||||
hideDialogLoading();
|
||||
ToastUtil.showShort(mContext,message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void logOut(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getWaterConfigListSuccess(List<WaterPlanWeekEntity> list,int total) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveConfigSuccess(WaterPlanWeekEntity entity) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateConfigSuccess(WaterPlanWeekEntity entity) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -11,104 +11,227 @@ import com.bigkoo.pickerview.listener.OnTimeSelectListener;
|
||||
import com.bigkoo.pickerview.view.TimePickerView;
|
||||
import com.chad.library.adapter.base.BaseQuickAdapter;
|
||||
import com.ckkj.water.R;
|
||||
import com.ckkj.water.base.BaseActivity;
|
||||
import com.ckkj.water.base.BaseFragment;
|
||||
import com.ckkj.water.databinding.WaterConfigFragmentLayoutBinding;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
import com.ckkj.water.plan.adapter.WaterPlanWeekAdapter;
|
||||
import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
|
||||
import com.ckkj.water.plan.mvp.WaterPlanContract;
|
||||
import com.ckkj.water.plan.mvp.WaterPlanImpl;
|
||||
import com.ckkj.water.plan.mvp.WaterPlanPresenter;
|
||||
import com.ckkj.water.utils.show.ToastUtil;
|
||||
import com.ckkj.water.utils.time.ZYTimeUtils;
|
||||
import com.google.gson.Gson;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 配置信息页面
|
||||
*/
|
||||
public class WaterConfigFragment extends BaseFragment<WaterConfigFragmentLayoutBinding, WaterPlanPresenter>
|
||||
implements WaterPlanContract.WaterPlanView {
|
||||
private List<WaterPlanWeekEntity> weekList = new ArrayList<>();
|
||||
private List<WaterPlanWeekEntity.DetailsBean> mConfigList = new ArrayList<>();
|
||||
//用户本地操作排程时的数据
|
||||
private WaterPlanWeekEntity mConfigEntity;
|
||||
//排程接口新增成功之后,接口返回的该排程在远端的数据信息
|
||||
private WaterPlanWeekEntity mRemoteConfigEntity;
|
||||
private WaterPlanWeekAdapter mWeekAdapter;
|
||||
private String mPlanName = "";
|
||||
public static boolean isConfigSave;
|
||||
//当下是否编辑模式
|
||||
private boolean mIsEditMode = false;
|
||||
|
||||
|
||||
@Override
|
||||
public void initData(Bundle state) {
|
||||
String jsonContent = getString(R.string.plan_water_entity_json);
|
||||
WaterPlanWeekEntity entity = new Gson().fromJson(jsonContent, WaterPlanWeekEntity.class);
|
||||
weekList.add(entity);
|
||||
mWeekAdapter = new WaterPlanWeekAdapter(mContext, R.layout.plan_period_item,weekList.get(0).getWashCycleList());
|
||||
viewBinding.rvWeek.setAdapter(mWeekAdapter);
|
||||
mConfigEntity = new WaterPlanWeekEntity();
|
||||
List<WaterPlanWeekEntity.DetailsBean> list = new ArrayList<>();
|
||||
for(int i = 0; i < 7; i++){
|
||||
WaterPlanWeekEntity.DetailsBean bean = new WaterPlanWeekEntity.DetailsBean();
|
||||
bean.setWeekday(i + 1);
|
||||
bean.setStatus("0");
|
||||
bean.setWeekName(ZYTimeUtils.getWeekName(i));
|
||||
list.add(bean);
|
||||
}
|
||||
mConfigEntity.setDetails(list);
|
||||
mWeekAdapter = new WaterPlanWeekAdapter(mContext,R.layout.plan_week_config_item, mConfigEntity.getDetails());
|
||||
viewBinding.rvWeekConfig.setAdapter(mWeekAdapter);
|
||||
initListener();
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置编辑模式的排程数据
|
||||
* @param entity 从详情页传来的排程数据
|
||||
*/
|
||||
public void setEditEntity(WaterPlanWeekEntity entity) {
|
||||
if (entity == null) {
|
||||
return;
|
||||
}
|
||||
mIsEditMode = true;
|
||||
// 深拷贝数据到 mConfigEntity,用于本地编辑
|
||||
mConfigEntity = cloneEntity(entity);
|
||||
// 保存远程原始数据,用于后续变化检测
|
||||
mRemoteConfigEntity = entity;
|
||||
isConfigSave = true;
|
||||
|
||||
// 初始化 UI
|
||||
viewBinding.etPlanName.setText(entity.getName());
|
||||
mPlanName = entity.getName();
|
||||
|
||||
// 更新周配置列表的显示,使用 mConfigEntity.getDetails() 保证数据一致
|
||||
if (mConfigEntity.getDetails() != null) {
|
||||
mWeekAdapter.setNewData(mConfigEntity.getDetails());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 深拷贝 WaterPlanWeekEntity
|
||||
*/
|
||||
private WaterPlanWeekEntity cloneEntity(WaterPlanWeekEntity source) {
|
||||
if (source == null) {
|
||||
return null;
|
||||
}
|
||||
WaterPlanWeekEntity target = new WaterPlanWeekEntity();
|
||||
target.setId(source.getId());
|
||||
target.setName(source.getName());
|
||||
target.setStatus(source.getStatus());
|
||||
|
||||
if (source.getDetails() != null) {
|
||||
List<WaterPlanWeekEntity.DetailsBean> detailsList = new ArrayList<>();
|
||||
for (WaterPlanWeekEntity.DetailsBean bean : source.getDetails()) {
|
||||
WaterPlanWeekEntity.DetailsBean newBean = new WaterPlanWeekEntity.DetailsBean();
|
||||
newBean.setId(bean.getId());
|
||||
newBean.setWeekday(bean.getWeekday());
|
||||
newBean.setWeekName(ZYTimeUtils.getWeekName(bean.getWeekday() - 1));
|
||||
newBean.setStatus(bean.getStatus());
|
||||
newBean.setStartTime(ZYTimeUtils.formatHHmm(bean.getStartTime()));
|
||||
newBean.setDurationMin(bean.getDurationMin());
|
||||
detailsList.add(newBean);
|
||||
}
|
||||
target.setDetails(detailsList);
|
||||
}
|
||||
|
||||
return target;
|
||||
}
|
||||
|
||||
private void initListener() {
|
||||
setClick(viewBinding.tvCommit);
|
||||
setClick(viewBinding.tvSelectTime);
|
||||
viewBinding.etPlanTime.addTextChangedListener(new TextWatcher() {
|
||||
mWeekAdapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
|
||||
@Override
|
||||
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
|
||||
public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
|
||||
switch (view.getId()){
|
||||
case R.id.linear_week://选中
|
||||
case R.id.checkbox:
|
||||
if(mConfigEntity.getDetails().get(position).getStatus().equals("1")){
|
||||
mConfigEntity.getDetails().get(position).setStatus("0");
|
||||
}else{
|
||||
mConfigEntity.getDetails().get(position).setStatus("1");
|
||||
}
|
||||
mWeekAdapter.notifyItemChanged(position);
|
||||
break;
|
||||
|
||||
case R.id.tv_select_time:
|
||||
selectStartTime(position);
|
||||
break;
|
||||
|
||||
case R.id.tv_plan_duration:
|
||||
inputDuration(position);
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
viewBinding.etPlanName.addTextChangedListener(new TextWatcher() {
|
||||
@Override
|
||||
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
|
||||
|
||||
@Override
|
||||
public void onTextChanged(CharSequence s, int start, int before, int count) {
|
||||
}
|
||||
public void onTextChanged(CharSequence s, int start, int before, int count) {}
|
||||
|
||||
@Override
|
||||
public void afterTextChanged(Editable s) {
|
||||
if(weekList != null){
|
||||
String time = s.toString();
|
||||
if(TextUtils.isEmpty(time)){
|
||||
weekList.get(0).getWashCycleList().get(mWeekAdapter.getmPos()).setDuration("");
|
||||
}else{
|
||||
weekList.get(0).getWashCycleList().get(mWeekAdapter.getmPos()).setDuration(time);
|
||||
}
|
||||
if(!TextUtils.isEmpty(s.toString())){
|
||||
mPlanName = s.toString();
|
||||
mConfigEntity.setName(s.toString());
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
mWeekAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
|
||||
@Override
|
||||
public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
|
||||
mWeekAdapter.setSelPos(position);
|
||||
String planStartTime = weekList.get(0).getWashCycleList().get(position).getTime();
|
||||
String planTime = weekList.get(0).getWashCycleList().get(position).getDuration();
|
||||
|
||||
if(TextUtils.isEmpty(planStartTime)){
|
||||
viewBinding.tvSelectTime.setHint(getString(R.string.select_water_time));
|
||||
viewBinding.tvSelectTime.setText("");
|
||||
}else{
|
||||
viewBinding.tvSelectTime.setText(planStartTime);
|
||||
}
|
||||
|
||||
if(TextUtils.isEmpty(planTime)){
|
||||
viewBinding.etPlanTime.setHint(getString(R.string.input_water_plan_time));
|
||||
viewBinding.etPlanTime.setText("");
|
||||
}else{
|
||||
viewBinding.etPlanTime.setText(planTime);
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void setClick(View view) {
|
||||
view.setOnClickListener(this::onClick);
|
||||
}
|
||||
|
||||
public void onClick(View v){
|
||||
switch (v.getId()){
|
||||
case R.id.tv_select_time:
|
||||
case R.id.tv_commit:
|
||||
commitConfig();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void commitConfig(){
|
||||
if (!checkConfigFinish()) {
|
||||
return;
|
||||
}
|
||||
// mRemoteConfigEntity 为空,说明是新增场景
|
||||
if (mRemoteConfigEntity == null) {
|
||||
mPresenter.saveConfig(mConfigEntity);
|
||||
return;
|
||||
}
|
||||
// mRemoteConfigEntity 不为空,说明是更新场景
|
||||
if (isConfigChanged()) {
|
||||
// TODO: 触发更新接口,调用 mPresenter.updateConfig(mConfigEntity)
|
||||
mPresenter.updateConfig(mConfigEntity);
|
||||
} else {
|
||||
ToastUtil.showShort(mContext, "配置没有变化,无需保存");
|
||||
}
|
||||
}
|
||||
|
||||
private void inputDuration(int position) {
|
||||
showEditDialog(getString(R.string.device_work_times_title),
|
||||
getString(R.string.input_water_plan_time),
|
||||
mConfigEntity.getDetails().get(position).getDurationMin() == 0 ?
|
||||
"" : mConfigEntity.getDetails().get(position).getDurationMin() + "",
|
||||
true,
|
||||
getString(R.string.cancel_text),
|
||||
getString(R.string.confirm_text),
|
||||
BaseFragment.INPUT_TYPE_NUMBER,
|
||||
new BaseActivity.OnDialogClick() {
|
||||
@Override
|
||||
public void onCancelClick() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfirmClisk() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfirmClisk(String content) {
|
||||
if(Integer.parseInt(content) <= 0){
|
||||
ToastUtil.showShort(mContext, getString(R.string.input_water_plan_time_error));
|
||||
return;
|
||||
}
|
||||
mConfigEntity.getDetails().get(position).setDurationMin(Integer.parseInt(content));
|
||||
mWeekAdapter.notifyItemChanged(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onView1Click() {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void selectStartTime(int position) {
|
||||
boolean times[] = {false, false, false, true, true, false};
|
||||
//时间选择器
|
||||
TimePickerView pvTime = new TimePickerBuilder(mContext, new OnTimeSelectListener() {
|
||||
@Override
|
||||
public void onTimeSelect(Date date, View v) {
|
||||
viewBinding.tvSelectTime.setText(ZYTimeUtils.getStrTimeData_H_M(date));
|
||||
if(weekList != null){
|
||||
String startTime = ZYTimeUtils.getStrTimeData_H_M(date).trim();
|
||||
weekList.get(0).getWashCycleList().get(mWeekAdapter.getmPos()).setTime(startTime);
|
||||
}
|
||||
//用于提交接口
|
||||
mConfigEntity.getDetails().get(position).setStartTime(ZYTimeUtils.getStrTimeData_H_M(date));
|
||||
mWeekAdapter.notifyItemChanged(position);
|
||||
}
|
||||
}).setType(times)
|
||||
.setCancelColor(mContext.getColor(R.color.color_999999))
|
||||
@@ -116,25 +239,155 @@ public class WaterConfigFragment extends BaseFragment<WaterConfigFragmentLayoutB
|
||||
.setTextColorCenter(mContext.getColor(R.color.color_zhu))
|
||||
.build();
|
||||
pvTime.show();
|
||||
break;
|
||||
}
|
||||
|
||||
case R.id.tv_commit:
|
||||
List<WaterPlanWeekEntity.DeviceEntity> list = getSelectedDevices();
|
||||
private void setClick(View view) {
|
||||
view.setOnClickListener(this::onClick);
|
||||
}
|
||||
|
||||
/**
|
||||
* 比较本地配置和远程配置是否有变化
|
||||
* @return true 表示有变化,false 表示无变化
|
||||
*/
|
||||
public boolean isConfigChanged() {
|
||||
if (mRemoteConfigEntity == null || mRemoteConfigEntity.getDetails() == null) {
|
||||
return true;
|
||||
}
|
||||
// 比对排程名称
|
||||
if (!equalsString(mConfigEntity.getName(), mRemoteConfigEntity.getName())) {
|
||||
return true;
|
||||
}
|
||||
List<WaterPlanWeekEntity.DetailsBean> localDetails = mConfigEntity.getDetails();
|
||||
List<WaterPlanWeekEntity.DetailsBean> remoteDetails = mRemoteConfigEntity.getDetails();
|
||||
for (int i = 0; i < localDetails.size(); i++) {
|
||||
WaterPlanWeekEntity.DetailsBean local = localDetails.get(i);
|
||||
WaterPlanWeekEntity.DetailsBean remote = remoteDetails.get(i);
|
||||
// 勾选状态下对比状态、时间、时长
|
||||
if ("1".equals(local.getStatus())) {
|
||||
if (!equalsString(local.getStatus(), remote.getStatus())
|
||||
|| !equalsString(local.getStartTime(), ZYTimeUtils.formatHHmm(remote.getStartTime()))
|
||||
|| local.getDurationMin() != remote.getDurationMin()) {
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
// 未勾选状态下只对比勾选状态,不关心时间/时长
|
||||
if (!equalsString(local.getStatus(), remote.getStatus())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean equalsString(String s1, String s2) {
|
||||
if (s1 == null && s2 == null) return true;
|
||||
if (s1 == null || s2 == null) return false;
|
||||
return s1.equals(s2);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查配置信息是否完成
|
||||
* @return
|
||||
*/
|
||||
public boolean checkConfigFinish() {
|
||||
if(TextUtils.isEmpty(viewBinding.etPlanName.getText().toString())){
|
||||
ToastUtil.showShort(mContext,getString(R.string.plan_name_text_empty_hint));
|
||||
return false;
|
||||
}
|
||||
List<WaterPlanWeekEntity.DetailsBean> list = mConfigEntity.getDetails();
|
||||
//是否勾选了排程日期
|
||||
boolean isSelectOne = false;
|
||||
if(list != null){
|
||||
|
||||
for(WaterPlanWeekEntity.DetailsBean bean : list){
|
||||
if(bean.getStatus().equals("1")){
|
||||
isSelectOne = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!isSelectOne){
|
||||
ToastUtil.showShort(mContext,getString(R.string.plan_week_empty_hint));
|
||||
return false;
|
||||
}
|
||||
//是否配置了排程日期的时间
|
||||
boolean isPlanConfig = false;
|
||||
for(WaterPlanWeekEntity.DetailsBean bean : list){
|
||||
if(bean.getStatus().equals("1")){
|
||||
if((TextUtils.isEmpty(bean.getStartTime()) ||
|
||||
bean.getDurationMin() == 0)){
|
||||
ToastUtil.showShort(mContext,"请完成" + bean.getWeekName() + "的时间配置");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private List<WaterPlanWeekEntity.DeviceEntity> getSelectedDevices() {
|
||||
@Override
|
||||
public void getWaterConfigListSuccess(List<WaterPlanWeekEntity> list,int total) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveConfigSuccess(WaterPlanWeekEntity entity) {
|
||||
ToastUtil.showShort(mContext, "排程新增成功");
|
||||
isConfigSave = true;
|
||||
// 把接口返回的 ID 设置到 mConfigEntity,便于后续更新操作
|
||||
mConfigEntity.setId(entity.getId());
|
||||
// 把 details 中每个 bean 的 id 也设置到 mConfigEntity,便于后续更新操作
|
||||
if (entity.getDetails() != null && mConfigEntity.getDetails() != null) {
|
||||
for (int i = 0; i < entity.getDetails().size() && i < mConfigEntity.getDetails().size(); i++) {
|
||||
mConfigEntity.getDetails().get(i).setId(entity.getDetails().get(i).getId());
|
||||
}
|
||||
}
|
||||
//接口请求之后返回的数据,方便后面做对比
|
||||
mRemoteConfigEntity = entity;
|
||||
if (getActivity() instanceof AddWaterPlanActivity) {
|
||||
return ((AddWaterPlanActivity) getActivity()).getSelectedDevices();
|
||||
((AddWaterPlanActivity) getActivity()).onConfigSaved(entity);
|
||||
}
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新排程成功
|
||||
* @param entity
|
||||
*/
|
||||
@Override
|
||||
public void updateConfigSuccess(WaterPlanWeekEntity entity) {
|
||||
ToastUtil.showShort(mContext, "排程更新成功");
|
||||
mRemoteConfigEntity = entity;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updatePlanStatusSuccess(BaseBean bean, String status) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getPlanDetailInfo(WaterPlanWeekEntity entity) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getPlanBindDeviceList(WaterDeviceEntity bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void planBindDeviceSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deletePlanSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void planUnbindDeviceSuccess(BaseBean bean, int position) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public WaterPlanPresenter createPresenter() {
|
||||
return new WaterPlanPresenter(new WaterPlanImpl());
|
||||
@@ -154,4 +407,6 @@ public class WaterConfigFragment extends BaseFragment<WaterConfigFragmentLayoutB
|
||||
public void logOut(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,715 @@
|
||||
package com.ckkj.water.plan;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.text.Editable;
|
||||
import android.text.TextUtils;
|
||||
import android.text.TextWatcher;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.bigkoo.pickerview.builder.TimePickerBuilder;
|
||||
import com.bigkoo.pickerview.listener.OnTimeSelectListener;
|
||||
import com.bigkoo.pickerview.view.TimePickerView;
|
||||
import com.chad.library.adapter.base.BaseQuickAdapter;
|
||||
import com.ckkj.water.R;
|
||||
import com.ckkj.water.base.BaseActivity;
|
||||
import com.ckkj.water.base.BaseFragment;
|
||||
import com.ckkj.water.databinding.WaterConfigFragmentLayoutBinding;
|
||||
import com.ckkj.water.databinding.WaterConfigFragmentLayoutCopyBinding;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
import com.ckkj.water.plan.adapter.WaterPlanTimeDataAdapter;
|
||||
import com.ckkj.water.plan.adapter.WaterPlanWeekAdapter;
|
||||
import com.ckkj.water.plan.adapter.WaterPlanWeekAdapter_copy;
|
||||
import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
|
||||
import com.ckkj.water.plan.mvp.WaterPlanContract;
|
||||
import com.ckkj.water.plan.mvp.WaterPlanImpl;
|
||||
import com.ckkj.water.plan.mvp.WaterPlanPresenter;
|
||||
import com.ckkj.water.utils.show.ToastUtil;
|
||||
import com.ckkj.water.utils.time.ZYTimeUtils;
|
||||
import com.google.gson.Gson;
|
||||
import com.yanzhenjie.recyclerview.OnItemMenuClickListener;
|
||||
import com.yanzhenjie.recyclerview.SwipeMenu;
|
||||
import com.yanzhenjie.recyclerview.SwipeMenuBridge;
|
||||
import com.yanzhenjie.recyclerview.SwipeMenuCreator;
|
||||
import com.yanzhenjie.recyclerview.SwipeMenuItem;
|
||||
import com.yanzhenjie.recyclerview.SwipeRecyclerView;
|
||||
import com.yanzhenjie.recyclerview.widget.DefaultItemDecoration;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
public class WaterConfigFragment_copy extends BaseFragment<WaterConfigFragmentLayoutCopyBinding, WaterPlanPresenter>
|
||||
implements WaterPlanContract.WaterPlanView {
|
||||
//本地新增排程时的实体
|
||||
private WaterPlanWeekEntity mLocalEntity;
|
||||
//新增之后返回的实体
|
||||
private WaterPlanWeekEntity mRemoteEntity;
|
||||
private List<WaterPlanWeekEntity.DetailsBean> weekList = new ArrayList<>();
|
||||
private List<WaterPlanWeekEntity.TimeDataBean> timeList = new ArrayList<>();
|
||||
private WaterPlanWeekAdapter_copy mWeekAdapter;
|
||||
private WaterPlanTimeDataAdapter mTimeAdapter;
|
||||
private RecyclerView.ItemDecoration itemDecoration;
|
||||
private boolean isConfigSubmitted = false;
|
||||
//当下是否编辑模式
|
||||
private boolean mIsEditMode = false;
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void initData(Bundle state) {
|
||||
// 设置菜单创建器。
|
||||
viewBinding.rvTimes.setSwipeMenuCreator(mSwipeMenuCreator);
|
||||
viewBinding.rvTimes.setOnItemMenuClickListener(mItemMenuClickListener);
|
||||
itemDecoration = new DefaultItemDecoration
|
||||
(mContext.getColor(R.color.transparent),20,40);
|
||||
viewBinding.rvTimes.addItemDecoration(itemDecoration);
|
||||
List<WaterPlanWeekEntity.DetailsBean> list = new ArrayList<>();
|
||||
for(int i = 0; i < 7; i++){
|
||||
WaterPlanWeekEntity.DetailsBean bean = new WaterPlanWeekEntity.DetailsBean();
|
||||
WaterPlanWeekEntity.TimeDataBean timeData = new WaterPlanWeekEntity.TimeDataBean();
|
||||
List<WaterPlanWeekEntity.TimeDataBean> timeDataList = new ArrayList<>();
|
||||
timeDataList.add(timeData);
|
||||
bean.setTimeData(timeDataList);
|
||||
bean.setWeekday(i + 1);
|
||||
bean.setStatus("1");
|
||||
bean.setWeekName(ZYTimeUtils.getWeekName(i));
|
||||
bean.setTriggerType("0");
|
||||
list.add(bean);
|
||||
}
|
||||
weekList = list;
|
||||
//这里先处理新增,后面再处理编辑
|
||||
mLocalEntity = new WaterPlanWeekEntity();
|
||||
mLocalEntity.setStatus("1");
|
||||
mLocalEntity.setDetails(weekList);
|
||||
//顶部周一、周二。。。。。
|
||||
mWeekAdapter = new WaterPlanWeekAdapter_copy(mContext, R.layout.plan_period_item,list);
|
||||
viewBinding.rvWeek.setAdapter(mWeekAdapter);
|
||||
//周期对应的 时间配置
|
||||
List<WaterPlanWeekEntity.TimeDataBean> timeList = weekList.get(0).getTimeData();
|
||||
mTimeAdapter = new WaterPlanTimeDataAdapter(mContext,R.layout.include_plan_time_item_layout,timeList);
|
||||
viewBinding.rvTimes.setAdapter(mTimeAdapter);
|
||||
initListener();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void initListener() {
|
||||
setClick(viewBinding.tvCommit);
|
||||
setClick(viewBinding.imgAdd);
|
||||
setClick(viewBinding.switchButton);
|
||||
//头部 周一~周日
|
||||
mWeekAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
|
||||
@Override
|
||||
public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
|
||||
mWeekAdapter.setSelPos(position);
|
||||
List<WaterPlanWeekEntity.TimeDataBean> timeList = weekList.get(position).getTimeData();
|
||||
mTimeAdapter.setNewData(timeList);
|
||||
viewBinding.switchButton.setChecked(weekList.get(position).getStatus().equals("1"));
|
||||
}
|
||||
});
|
||||
//周期对应的 时间配置
|
||||
mTimeAdapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
|
||||
@Override
|
||||
public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
|
||||
switch (view.getId()){
|
||||
case R.id.tv_select_time:
|
||||
selectStartTime(position);
|
||||
break;
|
||||
|
||||
case R.id.tv_plan_duration:
|
||||
inputDuration(position);
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
//输入框监听
|
||||
viewBinding.editPlanName.addTextChangedListener(new TextWatcher() {
|
||||
@Override
|
||||
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
|
||||
|
||||
@Override
|
||||
public void onTextChanged(CharSequence s, int start, int before, int count) {}
|
||||
|
||||
@Override
|
||||
public void afterTextChanged(Editable s) {
|
||||
String planName = "";
|
||||
if(!TextUtils.isEmpty(s.toString())){
|
||||
planName = s.toString();
|
||||
}
|
||||
mLocalEntity.setName(planName);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
private void setClick(View view) {
|
||||
view.setOnClickListener(this::onClick);
|
||||
}
|
||||
|
||||
public void onClick(View v){
|
||||
int selPos = mWeekAdapter.getmPos();
|
||||
switch (v.getId()){
|
||||
|
||||
case R.id.img_add:
|
||||
isConfigSubmitted = false;
|
||||
WaterPlanWeekEntity.TimeDataBean timeDataAdd = new WaterPlanWeekEntity.TimeDataBean();
|
||||
weekList.get(selPos).getTimeData().add(timeDataAdd);
|
||||
mTimeAdapter.notifyItemInserted(weekList.get(selPos).getTimeData().size() - 1);
|
||||
break;
|
||||
|
||||
case R.id.switch_button:
|
||||
if(weekList.get(selPos).getStatus().equals("0")){
|
||||
weekList.get(selPos).setStatus("1");
|
||||
viewBinding.switchButton.setChecked(true);
|
||||
}else{
|
||||
weekList.get(selPos).setStatus("0");
|
||||
viewBinding.switchButton.setChecked(false);
|
||||
}
|
||||
break;
|
||||
|
||||
case R.id.tv_commit:
|
||||
// 如果已经保存过(mRemoteEntity 不为空),则走更新逻辑;否则走新增逻辑
|
||||
if (mRemoteEntity != null) {
|
||||
updateConfig();
|
||||
} else {
|
||||
validateAndSave();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isConfigSubmitted() {
|
||||
return isConfigSubmitted;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前排程名称
|
||||
* @return 排程名称
|
||||
*/
|
||||
public String getPlanName() {
|
||||
if (mLocalEntity != null) {
|
||||
return mLocalEntity.getName();
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否至少配置了一天的时间
|
||||
* @return true表示有时间配置,false表示没有配置任何时间
|
||||
*/
|
||||
public boolean hasTimeConfig() {
|
||||
for (WaterPlanWeekEntity.DetailsBean dayBean : weekList) {
|
||||
List<WaterPlanWeekEntity.TimeDataBean> timeDataList = dayBean.getTimeData();
|
||||
if (timeDataList != null && !timeDataList.isEmpty()) {
|
||||
for (WaterPlanWeekEntity.TimeDataBean timeData : timeDataList) {
|
||||
if (!TextUtils.isEmpty(timeData.getStartTime()) && timeData.getDurationMin() > 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验并保存配置(供外部调用)
|
||||
* @return true表示校验通过并已提交保存,false表示校验失败
|
||||
*/
|
||||
public boolean commitConfig() {
|
||||
return validateAndSave();
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新配置(用于数据变更后调用)
|
||||
* @return true表示校验通过并已提交更新,false表示校验失败
|
||||
*/
|
||||
public boolean updateConfig() {
|
||||
if (!validateConfig()) {
|
||||
return false;
|
||||
}
|
||||
// 调用更新接口
|
||||
if(mLocalEntity != null){
|
||||
mPresenter.updateConfig(mLocalEntity);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 设置编辑模式的排程数据
|
||||
* @param entity 从详情页传来的排程数据
|
||||
*/
|
||||
public void setEditEntity(WaterPlanWeekEntity entity) {
|
||||
if (entity == null) {
|
||||
return;
|
||||
}
|
||||
mIsEditMode = true;
|
||||
// 深拷贝数据到 mConfigEntity,用于本地编辑
|
||||
mLocalEntity = cloneEntity(entity);
|
||||
// 保存远程原始数据,用于后续变化检测
|
||||
mRemoteEntity = entity;
|
||||
isConfigSubmitted = true;
|
||||
|
||||
// 初始化 UI
|
||||
viewBinding.editPlanName.setText(entity.getName());
|
||||
// 更新周配置列表的显示,使用 mConfigEntity.getDetails() 保证数据一致
|
||||
if (mLocalEntity.getDetails() != null) {
|
||||
weekList = mLocalEntity.getDetails();
|
||||
mWeekAdapter.setNewData(mLocalEntity.getDetails());
|
||||
mTimeAdapter.setNewData(weekList.get(mWeekAdapter.getmPos()).getTimeData());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 深拷贝 WaterPlanWeekEntity
|
||||
*/
|
||||
private WaterPlanWeekEntity cloneEntity(WaterPlanWeekEntity source) {
|
||||
if (source == null) {
|
||||
return null;
|
||||
}
|
||||
WaterPlanWeekEntity target = new WaterPlanWeekEntity();
|
||||
target.setId(source.getId());
|
||||
target.setName(source.getName());
|
||||
target.setStatus(source.getStatus());
|
||||
|
||||
if (source.getDetails() != null) {
|
||||
List<WaterPlanWeekEntity.DetailsBean> detailsList = new ArrayList<>();
|
||||
for (WaterPlanWeekEntity.DetailsBean bean : source.getDetails()) {
|
||||
WaterPlanWeekEntity.DetailsBean newBean = new WaterPlanWeekEntity.DetailsBean();
|
||||
List<WaterPlanWeekEntity.TimeDataBean> timeDataList = new ArrayList<>();
|
||||
for(WaterPlanWeekEntity.TimeDataBean timeDataBean : bean.getTimeData()){
|
||||
WaterPlanWeekEntity.TimeDataBean newTimeDataBean = new WaterPlanWeekEntity.TimeDataBean();
|
||||
newTimeDataBean.setStartTime(ZYTimeUtils.formatHHmm(timeDataBean.getStartTime()));
|
||||
newTimeDataBean.setDurationMin(timeDataBean.getDurationMin());
|
||||
timeDataList.add(newTimeDataBean);
|
||||
}
|
||||
newBean.setTimeData(timeDataList);
|
||||
newBean.setId(bean.getId());
|
||||
newBean.setWeekday(bean.getWeekday());
|
||||
newBean.setWeekName(ZYTimeUtils.getWeekName(bean.getWeekday() - 1));
|
||||
newBean.setStatus(bean.getStatus());
|
||||
detailsList.add(newBean);
|
||||
}
|
||||
target.setDetails(detailsList);
|
||||
}
|
||||
|
||||
return target;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 校验配置
|
||||
* @return true表示校验通过,false表示校验失败
|
||||
*/
|
||||
private boolean validateConfig() {
|
||||
if(TextUtils.isEmpty(viewBinding.editPlanName.getText().toString())){
|
||||
ToastUtil.showShort(mContext,getString(R.string.plan_name_text_empty_hint));
|
||||
return false;
|
||||
}
|
||||
// 检查七天的所有时间配置是否全部为空
|
||||
boolean allTimeEmpty = true;
|
||||
for (WaterPlanWeekEntity.DetailsBean dayBean : weekList) {
|
||||
List<WaterPlanWeekEntity.TimeDataBean> timeDataList = dayBean.getTimeData();
|
||||
if (timeDataList != null && !timeDataList.isEmpty()) {
|
||||
for (WaterPlanWeekEntity.TimeDataBean timeData : timeDataList) {
|
||||
if (!TextUtils.isEmpty(timeData.getStartTime()) && timeData.getDurationMin() > 0) {
|
||||
allTimeEmpty = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!allTimeEmpty) break;
|
||||
}
|
||||
if (allTimeEmpty) {
|
||||
ToastUtil.showShort(mContext, "请至少配置一天的时间");
|
||||
return false;
|
||||
}
|
||||
// 校验每一天内的时间是否有冲突
|
||||
String conflictMsg = checkTimeConflict();
|
||||
if (conflictMsg != null) {
|
||||
ToastUtil.showShort(mContext, conflictMsg);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验配置并保存(新增)
|
||||
* @return true表示校验通过并已提交保存,false表示校验失败
|
||||
*/
|
||||
private boolean validateAndSave() {
|
||||
if (!validateConfig()) {
|
||||
return false;
|
||||
}
|
||||
if(mLocalEntity != null){
|
||||
mPresenter.saveConfig(mLocalEntity);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取远程实体(用于AddWaterPlanActivity比对)
|
||||
* @return mRemoteEntity
|
||||
*/
|
||||
public WaterPlanWeekEntity getRemoteEntity() {
|
||||
return mRemoteEntity;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取本地实体(用于AddWaterPlanActivity比对)
|
||||
* @return mLocalEntity
|
||||
*/
|
||||
public WaterPlanWeekEntity getLocalEntity() {
|
||||
return mLocalEntity;
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查本地数据是否与远程数据有变更
|
||||
* @return true表示有变更,false表示无变更
|
||||
*/
|
||||
public boolean hasDataChanged() {
|
||||
if (mRemoteEntity == null || mLocalEntity == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 比对排程名称
|
||||
String localName = mLocalEntity.getName();
|
||||
String remoteName = mRemoteEntity.getName();
|
||||
if (!TextUtils.isEmpty(localName) && !localName.equals(remoteName)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// 比对排程状态
|
||||
String localStatus = mLocalEntity.getStatus();
|
||||
String remoteStatus = mRemoteEntity.getStatus();
|
||||
if (!TextUtils.isEmpty(localStatus) && !localStatus.equals(remoteStatus)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// 比对 details 列表
|
||||
List<WaterPlanWeekEntity.DetailsBean> localDetails = mLocalEntity.getDetails();
|
||||
List<WaterPlanWeekEntity.DetailsBean> remoteDetails = mRemoteEntity.getDetails();
|
||||
|
||||
if (localDetails == null && remoteDetails == null) {
|
||||
return false;
|
||||
}
|
||||
if (localDetails == null || remoteDetails == null) {
|
||||
return true;
|
||||
}
|
||||
if (localDetails.size() != remoteDetails.size()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// 逐个比对每个 DetailsBean
|
||||
for (int i = 0; i < localDetails.size(); i++) {
|
||||
WaterPlanWeekEntity.DetailsBean localDetail = localDetails.get(i);
|
||||
WaterPlanWeekEntity.DetailsBean remoteDetail = remoteDetails.get(i);
|
||||
|
||||
// 比对 status
|
||||
String localDetailStatus = localDetail.getStatus();
|
||||
String remoteDetailStatus = remoteDetail.getStatus();
|
||||
if (!TextUtils.isEmpty(localDetailStatus) && !localDetailStatus.equals(remoteDetailStatus)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// 比对 triggerType
|
||||
String localTriggerType = localDetail.getTriggerType();
|
||||
String remoteTriggerType = remoteDetail.getTriggerType();
|
||||
if (!TextUtils.isEmpty(localTriggerType) && !localTriggerType.equals(remoteTriggerType)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// 比对 timeData 列表
|
||||
List<WaterPlanWeekEntity.TimeDataBean> localTimeData = localDetail.getTimeData();
|
||||
List<WaterPlanWeekEntity.TimeDataBean> remoteTimeData = remoteDetail.getTimeData();
|
||||
|
||||
if (localTimeData == null && remoteTimeData == null) {
|
||||
continue;
|
||||
}
|
||||
if (localTimeData == null || remoteTimeData == null) {
|
||||
return true;
|
||||
}
|
||||
if (localTimeData.size() != remoteTimeData.size()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// 逐个比对 TimeDataBean
|
||||
for (int j = 0; j < localTimeData.size(); j++) {
|
||||
WaterPlanWeekEntity.TimeDataBean localTime = localTimeData.get(j);
|
||||
WaterPlanWeekEntity.TimeDataBean remoteTime = remoteTimeData.get(j);
|
||||
|
||||
// 比对 startTime
|
||||
String localStartTime = localTime.getStartTime();
|
||||
String remoteStartTime = remoteTime.getStartTime();
|
||||
if (!TextUtils.isEmpty(localStartTime) && !localStartTime.equals(remoteStartTime)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// 比对 durationMin
|
||||
if (localTime.getDurationMin() != remoteTime.getDurationMin()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验每一天内的时间配置是否有冲突
|
||||
* @return null表示无冲突,返回具体提示信息表示有冲突
|
||||
*/
|
||||
private String checkTimeConflict() {
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm", Locale.getDefault());
|
||||
|
||||
for (int dayIndex = 0; dayIndex < weekList.size(); dayIndex++) {
|
||||
WaterPlanWeekEntity.DetailsBean dayBean = weekList.get(dayIndex);
|
||||
List<WaterPlanWeekEntity.TimeDataBean> timeDataList = dayBean.getTimeData();
|
||||
|
||||
if (timeDataList == null || timeDataList.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 收集该天所有有效的时间段(开始时间 + 结束时间)
|
||||
List<long[]> periods = new ArrayList<>();
|
||||
for (WaterPlanWeekEntity.TimeDataBean timeData : timeDataList) {
|
||||
if (TextUtils.isEmpty(timeData.getStartTime()) || timeData.getDurationMin() <= 0) {
|
||||
continue;
|
||||
}
|
||||
try {
|
||||
Date startDate = sdf.parse(timeData.getStartTime());
|
||||
long startMinutes = startDate.getHours() * 60 + startDate.getMinutes();
|
||||
long endMinutes = startMinutes + timeData.getDurationMin();
|
||||
periods.add(new long[]{startMinutes, endMinutes});
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
// 检查是否有冲突
|
||||
for (int i = 0; i < periods.size(); i++) {
|
||||
for (int j = i + 1; j < periods.size(); j++) {
|
||||
long[] p1 = periods.get(i);
|
||||
long[] p2 = periods.get(j);
|
||||
// 冲突条件:一个段的开始时间在另一个段的结束时间之前(即有重叠)
|
||||
// 不冲突:p1.end <= p2.start 或 p2.end <= p1.start
|
||||
if (!(p1[1] <= p2[0] || p2[1] <= p1[0])) {
|
||||
String dayName = dayBean.getWeekName();
|
||||
return dayName + "的时间配置存在冲突,请调整";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 选择开始时间
|
||||
* @param position
|
||||
*/
|
||||
private void selectStartTime(int position) {
|
||||
boolean times[] = {false, false, false, true, true, false};
|
||||
//时间选择器
|
||||
TimePickerView pvTime = new TimePickerBuilder(mContext, new OnTimeSelectListener() {
|
||||
@Override
|
||||
public void onTimeSelect(Date date, View v) {
|
||||
//用于提交接口
|
||||
weekList.get(mWeekAdapter.getmPos()).getTimeData().get(position).
|
||||
setStartTime(ZYTimeUtils.getStrTimeData_H_M(date));
|
||||
mTimeAdapter.notifyItemChanged(position);
|
||||
}
|
||||
}).setType(times)
|
||||
.setCancelColor(mContext.getColor(R.color.color_999999))
|
||||
.setSubmitColor(mContext.getColor(R.color.color_zhu))
|
||||
.setTextColorCenter(mContext.getColor(R.color.color_zhu))
|
||||
.build();
|
||||
pvTime.show();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 输入浇水时间
|
||||
* @param position
|
||||
*/
|
||||
private void inputDuration(int position) {
|
||||
WaterPlanWeekEntity.TimeDataBean timeData = weekList.get(mWeekAdapter.getmPos()).getTimeData().get(position);
|
||||
showEditDialog(getString(R.string.device_work_times_title),
|
||||
getString(R.string.input_water_plan_time),
|
||||
timeData.getDurationMin() == 0 ? "" : timeData.getDurationMin() + "",
|
||||
true,
|
||||
getString(R.string.cancel_text),
|
||||
getString(R.string.confirm_text),
|
||||
BaseFragment.INPUT_TYPE_NUMBER,
|
||||
new BaseActivity.OnDialogClick() {
|
||||
@Override
|
||||
public void onCancelClick() {}
|
||||
|
||||
@Override
|
||||
public void onConfirmClisk() {}
|
||||
|
||||
@Override
|
||||
public void onConfirmClisk(String content) {
|
||||
if (Integer.parseInt(content) <= 0) {
|
||||
ToastUtil.showShort(mContext, getString(R.string.input_water_plan_time_error));
|
||||
return;
|
||||
}
|
||||
timeData.setDurationMin(Integer.parseInt(content));
|
||||
mTimeAdapter.notifyItemChanged(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onView1Click() {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 侧滑相关
|
||||
*/
|
||||
// 创建菜单:
|
||||
SwipeMenuCreator mSwipeMenuCreator = new SwipeMenuCreator() {
|
||||
@Override
|
||||
public void onCreateMenu(SwipeMenu leftMenu, SwipeMenu rightMenu, int position) {
|
||||
SwipeMenuItem deleteItem = new SwipeMenuItem(mContext);
|
||||
deleteItem.setBackground(mContext.getResources().getDrawable(R.drawable.shape_item_delete_bg));
|
||||
deleteItem.setText("删除");
|
||||
deleteItem.setTextColor(mContext.getResources().getColor(R.color.white));
|
||||
deleteItem.setHeight(ViewGroup.LayoutParams.MATCH_PARENT);
|
||||
deleteItem.setWidth((int) mContext.getResources().getDimension(R.dimen.dp_90));
|
||||
// 各种文字和图标属性设置。
|
||||
rightMenu.addMenuItem(deleteItem); // 在Item右侧添加一个菜单。
|
||||
}
|
||||
};
|
||||
|
||||
// 菜单点击监听。
|
||||
OnItemMenuClickListener mItemMenuClickListener = new OnItemMenuClickListener() {
|
||||
@Override
|
||||
public void onItemClick(SwipeMenuBridge menuBridge, int position) {
|
||||
// 先关闭菜单
|
||||
menuBridge.closeMenu();
|
||||
// 左/右菜单
|
||||
int direction = menuBridge.getDirection();
|
||||
// 点击的是第几个菜单
|
||||
int menuPosition = menuBridge.getPosition();
|
||||
// 只处理右侧菜单
|
||||
if (direction == SwipeRecyclerView.RIGHT_DIRECTION) {
|
||||
if (menuPosition == 0) {
|
||||
weekList.get(mWeekAdapter.getmPos()).getTimeData().remove(position);
|
||||
if(mTimeAdapter != null){
|
||||
mTimeAdapter.notifyItemRemoved(position);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 新增
|
||||
* @param entity
|
||||
*/
|
||||
@Override
|
||||
public void saveConfigSuccess(WaterPlanWeekEntity entity) {
|
||||
ToastUtil.showShort(mContext, "排程新增成功");
|
||||
isConfigSubmitted = true;
|
||||
// 把接口返回的 ID 设置到 mConfigEntity,便于后续更新操作
|
||||
mLocalEntity.setId(entity.getId());
|
||||
// 把 details 中每个 bean 的 id 也设置到 mConfigEntity,便于后续更新操作
|
||||
if (entity.getDetails() != null && mLocalEntity.getDetails() != null) {
|
||||
for (int i = 0; i < entity.getDetails().size() && i < mLocalEntity.getDetails().size(); i++) {
|
||||
mLocalEntity.getDetails().get(i).setId(entity.getDetails().get(i).getId());
|
||||
mLocalEntity.getDetails().get(i).setStatus(entity.getDetails().get(i).getStatus());
|
||||
}
|
||||
}
|
||||
//接口请求之后返回的数据,方便后面做对比
|
||||
mRemoteEntity = entity;
|
||||
if (getActivity() instanceof AddWaterPlanActivity) {
|
||||
((AddWaterPlanActivity) getActivity()).onConfigSaved(entity);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 更新
|
||||
* @param entity
|
||||
*/
|
||||
@Override
|
||||
public void updateConfigSuccess(WaterPlanWeekEntity entity) {
|
||||
ToastUtil.showShort(mContext, "排程更新成功");
|
||||
mRemoteEntity = entity;
|
||||
}
|
||||
|
||||
|
||||
// private List<WaterPlanWeekEntity.DeviceEntity> getSelectedDevices() {
|
||||
// if (getActivity() instanceof AddWaterPlanActivity) {
|
||||
// return ((AddWaterPlanActivity) getActivity()).getSelectedDevices();
|
||||
// }
|
||||
// return new ArrayList<>();
|
||||
// }
|
||||
|
||||
@Override
|
||||
public WaterPlanPresenter createPresenter() {
|
||||
return new WaterPlanPresenter(new WaterPlanImpl());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNetChange(int netModel) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showError(String message) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void logOut(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getWaterConfigListSuccess(List<WaterPlanWeekEntity> list, int total) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updatePlanStatusSuccess(BaseBean bean, String status) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getPlanDetailInfo(WaterPlanWeekEntity entity) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getPlanBindDeviceList(WaterDeviceEntity bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void planBindDeviceSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deletePlanSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void planUnbindDeviceSuccess(BaseBean bean, int position) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -8,31 +8,37 @@ import android.view.View;
|
||||
import com.chad.library.adapter.base.BaseQuickAdapter;
|
||||
import com.ckkj.water.R;
|
||||
import com.ckkj.water.base.BaseFragment;
|
||||
import com.ckkj.water.custom.view.CustomRefreshHeader;
|
||||
import com.ckkj.water.databinding.WaterPlanFragmentBinding;
|
||||
import com.ckkj.water.main.activity.MainActivity;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
//import com.ckkj.water.plan.adapter.WaterPlanListAdapter;
|
||||
import com.ckkj.water.plan.adapter.WaterPlanListAdapter;
|
||||
import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
|
||||
import com.ckkj.water.plan.mvp.WaterPlanContract;
|
||||
import com.ckkj.water.plan.mvp.WaterPlanImpl;
|
||||
import com.ckkj.water.plan.mvp.WaterPlanPresenter;
|
||||
import com.ckkj.water.utils.manager.ThemeManager;
|
||||
import com.ckkj.water.utils.show.ToastUtil;
|
||||
import com.google.gson.Gson;
|
||||
import com.gyf.immersionbar.ImmersionBar;
|
||||
import com.scwang.smart.refresh.footer.ClassicsFooter;
|
||||
import com.scwang.smart.refresh.layout.api.RefreshHeader;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class WaterPlanFragment extends BaseFragment<WaterPlanFragmentBinding, WaterPlanPresenter>
|
||||
implements WaterPlanContract.WaterPlanView {
|
||||
private List<WaterPlanWeekEntity.DeviceEntity> mDevList = new ArrayList<>();
|
||||
private List<WaterPlanWeekEntity> mPlanList = new ArrayList<>();
|
||||
private WaterPlanListAdapter mAdapter;
|
||||
private int mCurrentPage = 1;
|
||||
@Override
|
||||
public void initData(Bundle state) {
|
||||
|
||||
String jsonContent = getString(R.string.plan_water_entity_json);
|
||||
WaterPlanWeekEntity entity = new Gson().fromJson(jsonContent, WaterPlanWeekEntity.class);
|
||||
mDevList = entity.getDeviceList();
|
||||
// mDevList = entity.getDeviceList();
|
||||
|
||||
ImmersionBar.with(mContext)
|
||||
.statusBarColor(R.color.mainBackgroundColor)
|
||||
@@ -42,17 +48,37 @@ public class WaterPlanFragment extends BaseFragment<WaterPlanFragmentBinding, Wa
|
||||
viewBinding.includedTitle.imgBack.setVisibility(INVISIBLE);
|
||||
viewBinding.includedTitle.tvTitle.setText(getString(R.string.plan_title));
|
||||
initListener();
|
||||
|
||||
mAdapter = new WaterPlanListAdapter(mContext,R.layout.water_plan_list_item,mDevList);
|
||||
mAdapter = new WaterPlanListAdapter(mContext,R.layout.water_plan_list_item,mPlanList);
|
||||
viewBinding.rvPlans.setAdapter(mAdapter);
|
||||
mAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
|
||||
@Override
|
||||
public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
|
||||
goTo(mContext, PlanDetailActivity.class,null);
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putSerializable("plan_entity",mPlanList.get(position));
|
||||
goTo(mContext, PlanDetailActivity.class,bundle);
|
||||
}
|
||||
});
|
||||
|
||||
RefreshHeader header = new CustomRefreshHeader(mContext);
|
||||
viewBinding.refresh.setRefreshHeader(header);
|
||||
viewBinding.refresh.setRefreshFooter(new ClassicsFooter(mContext));
|
||||
viewBinding.refresh.setOnRefreshListener(layout -> {
|
||||
mCurrentPage = 1;
|
||||
viewBinding.refresh.setNoMoreData(false);
|
||||
mPresenter.getWaterPlanList(mCurrentPage);
|
||||
});
|
||||
viewBinding.refresh.setOnLoadMoreListener(layout -> {
|
||||
mCurrentPage++;
|
||||
mPresenter.getWaterPlanList(mCurrentPage);
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResumeInitData() {
|
||||
super.onResumeInitData();
|
||||
showLoadingDialog();
|
||||
mPresenter.getWaterPlanList(mCurrentPage);
|
||||
}
|
||||
|
||||
private void initListener() {
|
||||
setClick(viewBinding.tvAdd);
|
||||
@@ -70,6 +96,42 @@ public class WaterPlanFragment extends BaseFragment<WaterPlanFragmentBinding, Wa
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getWaterConfigListSuccess(List<WaterPlanWeekEntity> list,int total) {
|
||||
|
||||
hideDialogLoading();
|
||||
List<WaterPlanWeekEntity> pageList = list == null ? new ArrayList<>() : list;
|
||||
if (mCurrentPage == 1) {
|
||||
viewBinding.refresh.finishRefresh(300);
|
||||
mPlanList.clear(); // 只在刷新时清除
|
||||
mPlanList = pageList;
|
||||
} else {
|
||||
viewBinding.refresh.finishLoadMore(300);
|
||||
mPlanList.addAll(pageList);
|
||||
}
|
||||
mAdapter.setNewData(mPlanList);
|
||||
|
||||
// 4. 判断是否还有更多数据
|
||||
if (mAdapter.getItemCount() >= total || pageList.size() == 0) {
|
||||
// 使用 post 延迟调用,避免内部状态冲突导致的循环调用
|
||||
viewBinding.refresh.postDelayed(() -> viewBinding.refresh.setNoMoreData(true), 300);
|
||||
viewBinding.relNoMore.setVisibility(View.VISIBLE); // 自定义底部提示"暂无更多数据"
|
||||
} else {
|
||||
viewBinding.refresh.setNoMoreData(false);
|
||||
viewBinding.relNoMore.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
// 5. 控制空布局和内容显示
|
||||
if (mAdapter.getItemCount() != 0) {
|
||||
viewBinding.refresh.setVisibility(View.VISIBLE);
|
||||
viewBinding.relNoresult.setVisibility(View.GONE);
|
||||
} else {
|
||||
viewBinding.refresh.setVisibility(View.GONE);
|
||||
viewBinding.relNoresult.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public WaterPlanPresenter createPresenter() {
|
||||
return new WaterPlanPresenter(new WaterPlanImpl());
|
||||
@@ -82,11 +144,54 @@ public class WaterPlanFragment extends BaseFragment<WaterPlanFragmentBinding, Wa
|
||||
|
||||
@Override
|
||||
public void showError(String message) {
|
||||
|
||||
hideDialogLoading();
|
||||
ToastUtil.showShort(mContext,message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void logOut(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void saveConfigSuccess(WaterPlanWeekEntity entity) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateConfigSuccess(WaterPlanWeekEntity entity) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updatePlanStatusSuccess(BaseBean bean, String status) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getPlanDetailInfo(WaterPlanWeekEntity entity) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getPlanBindDeviceList(WaterDeviceEntity bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void planBindDeviceSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deletePlanSuccess(BaseBean bean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void planUnbindDeviceSuccess(BaseBean bean, int position) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,26 +8,27 @@ import androidx.annotation.Nullable;
|
||||
import com.chad.library.adapter.base.BaseQuickAdapter;
|
||||
import com.chad.library.adapter.base.BaseViewHolder;
|
||||
import com.ckkj.water.R;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class BindDeviceAdapter extends BaseQuickAdapter<WaterPlanWeekEntity.DeviceEntity, BaseViewHolder> {
|
||||
public class BindDeviceAdapter extends BaseQuickAdapter<WaterDeviceEntity.DeviceListBean, BaseViewHolder> {
|
||||
private Context mContext;
|
||||
private Set<Integer> mSelectedPositions = new HashSet<>();
|
||||
|
||||
public BindDeviceAdapter(Context context, int layoutResId, @Nullable List<WaterPlanWeekEntity.DeviceEntity> data) {
|
||||
public BindDeviceAdapter(Context context, int layoutResId, @Nullable List<WaterDeviceEntity.DeviceListBean> data) {
|
||||
super(layoutResId, data);
|
||||
this.mContext = context;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void convert(BaseViewHolder helper, WaterPlanWeekEntity.DeviceEntity item) {
|
||||
protected void convert(BaseViewHolder helper, WaterDeviceEntity.DeviceListBean item) {
|
||||
CheckBox checkBox = helper.getView(R.id.radio);
|
||||
helper.setText(R.id.tv_device_name, item.getDeviceName());
|
||||
helper.setText(R.id.tv_device_serial, item.getDeviceCode());
|
||||
helper.setText(R.id.tv_device_serial, item.getDeviceSn());
|
||||
checkBox.setChecked(mSelectedPositions.contains(helper.getLayoutPosition()));
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
package com.ckkj.water.plan.adapter;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.chad.library.adapter.base.BaseQuickAdapter;
|
||||
import com.chad.library.adapter.base.BaseViewHolder;
|
||||
import com.ckkj.water.R;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author fengxiaoyang
|
||||
* @date 2026/5/29
|
||||
* @description TODO: 描述该类的作用
|
||||
*/
|
||||
public class PlanBoundDeviceAdapter extends BaseQuickAdapter<WaterDeviceEntity, BaseViewHolder> {
|
||||
private Context mContext;
|
||||
public PlanBoundDeviceAdapter(Context context,int layoutResId, @Nullable List<WaterDeviceEntity> data) {
|
||||
super(layoutResId, data);
|
||||
mContext = context;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void convert(BaseViewHolder helper, WaterDeviceEntity item) {
|
||||
helper.setText(R.id.tv_device_name, item.getDeviceName());
|
||||
helper.setText(R.id.tv_device_serial, item.getDeviceSn());
|
||||
helper.addOnClickListener(R.id.img_delete);
|
||||
}
|
||||
}
|
||||
@@ -5,19 +5,20 @@ import androidx.annotation.Nullable;
|
||||
import com.chad.library.adapter.base.BaseQuickAdapter;
|
||||
import com.chad.library.adapter.base.BaseViewHolder;
|
||||
import com.ckkj.water.R;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class PlanDetailDeviceAdapter extends BaseQuickAdapter<WaterPlanWeekEntity.DeviceEntity, BaseViewHolder> {
|
||||
public class PlanDetailDeviceAdapter extends BaseQuickAdapter<WaterDeviceEntity, BaseViewHolder> {
|
||||
|
||||
public PlanDetailDeviceAdapter(int layoutResId, @Nullable List<WaterPlanWeekEntity.DeviceEntity> data) {
|
||||
public PlanDetailDeviceAdapter(int layoutResId, @Nullable List<WaterDeviceEntity> data) {
|
||||
super(layoutResId, data);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void convert(BaseViewHolder helper, WaterPlanWeekEntity.DeviceEntity item) {
|
||||
protected void convert(BaseViewHolder helper, WaterDeviceEntity item) {
|
||||
helper.setText(R.id.tv_device_name,item.getDeviceName());
|
||||
helper.setText(R.id.tv_device_serial,item.getDeviceCode());
|
||||
helper.setText(R.id.tv_device_serial,item.getDeviceSn());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,24 +1,29 @@
|
||||
package com.ckkj.water.plan.adapter;
|
||||
|
||||
import static android.view.View.INVISIBLE;
|
||||
import static android.view.View.VISIBLE;
|
||||
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.chad.library.adapter.base.BaseQuickAdapter;
|
||||
import com.chad.library.adapter.base.BaseViewHolder;
|
||||
import com.ckkj.water.R;
|
||||
import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
|
||||
import com.ckkj.water.utils.time.ZYTimeUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class PlanDetailTimeAdapter extends BaseQuickAdapter<WaterPlanWeekEntity.WashCycleEntity, BaseViewHolder> {
|
||||
public class PlanDetailTimeAdapter extends BaseQuickAdapter<WaterPlanWeekEntity.TimeDataBean, BaseViewHolder> {
|
||||
|
||||
public PlanDetailTimeAdapter(int layoutResId, @Nullable List<WaterPlanWeekEntity.WashCycleEntity> data) {
|
||||
public PlanDetailTimeAdapter(int layoutResId, @Nullable List<WaterPlanWeekEntity.TimeDataBean> data) {
|
||||
super(layoutResId, data);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void convert(BaseViewHolder helper, WaterPlanWeekEntity.WashCycleEntity item) {
|
||||
helper.setText(R.id.tv_week,item.getWeek());
|
||||
helper.setText(R.id.tv_start_time,item.getTime());
|
||||
helper.setText(R.id.tv_duration,item.getDuration());
|
||||
protected void convert(BaseViewHolder helper, WaterPlanWeekEntity.TimeDataBean item) {
|
||||
helper.setText(R.id.tv_start_time,ZYTimeUtils.formatHHmm(item.getStartTime()));
|
||||
helper.setText(R.id.tv_duration,item.getDurationMin() + "min");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
package com.ckkj.water.plan.adapter;
|
||||
|
||||
import android.graphics.Rect;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.chad.library.adapter.base.BaseQuickAdapter;
|
||||
import com.chad.library.adapter.base.BaseViewHolder;
|
||||
import com.ckkj.water.R;
|
||||
import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class PlanWeekDaysAdapter extends BaseQuickAdapter<WaterPlanWeekEntity.DetailsBean, BaseViewHolder> {
|
||||
|
||||
public PlanWeekDaysAdapter(int layoutResId, @Nullable List<WaterPlanWeekEntity.DetailsBean> data) {
|
||||
super(layoutResId, data);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void convert(BaseViewHolder helper, WaterPlanWeekEntity.DetailsBean item) {
|
||||
helper.setText(R.id.tv_week_name, item.getWeekName());
|
||||
RecyclerView rvWeekDatas = helper.getView(R.id.rv_plan_detail_times);
|
||||
PlanDetailTimeAdapter adapter = new PlanDetailTimeAdapter(R.layout.plan_detail_time_item, item.getTimeData());
|
||||
rvWeekDatas.setAdapter(adapter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
|
||||
super.onAttachedToRecyclerView(recyclerView);
|
||||
// 添加透明色分割线,高度10px
|
||||
recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
|
||||
@Override
|
||||
public void getItemOffsets(Rect outRect, View view,
|
||||
RecyclerView parent, RecyclerView.State state) {
|
||||
int position = parent.getChildAdapterPosition(view);
|
||||
if (position > 0) {
|
||||
outRect.top = (int) (10 * view.getContext().getResources().getDisplayMetrics().density);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDraw(android.graphics.Canvas c, RecyclerView parent, RecyclerView.State state) {
|
||||
// 不绘制任何内容,保持透明
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -14,18 +14,18 @@ import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class WaterPlanListAdapter extends BaseQuickAdapter<WaterPlanWeekEntity.DeviceEntity, BaseViewHolder> {
|
||||
public class WaterPlanListAdapter extends BaseQuickAdapter<WaterPlanWeekEntity, BaseViewHolder> {
|
||||
private Context mContext;
|
||||
|
||||
public WaterPlanListAdapter(Context context, int layoutResId, @Nullable List<WaterPlanWeekEntity.DeviceEntity> data) {
|
||||
public WaterPlanListAdapter(Context context, int layoutResId, @Nullable List<WaterPlanWeekEntity> data) {
|
||||
super(layoutResId, data);
|
||||
this.mContext = context;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void convert(BaseViewHolder helper, WaterPlanWeekEntity.DeviceEntity item) {
|
||||
helper.setText(R.id.tv_device_name, item.getDeviceName());
|
||||
helper.setText(R.id.tv_device_serial, item.getDeviceCode());
|
||||
protected void convert(BaseViewHolder helper, WaterPlanWeekEntity item) {
|
||||
helper.setText(R.id.tv_device_name, item.getName());
|
||||
helper.setText(R.id.tv_device_serial, item.getId());
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
package com.ckkj.water.plan.adapter;
|
||||
|
||||
import android.content.Context;
|
||||
import android.text.TextUtils;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.chad.library.adapter.base.BaseQuickAdapter;
|
||||
import com.chad.library.adapter.base.BaseViewHolder;
|
||||
import com.ckkj.water.R;
|
||||
import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author fengxiaoyang
|
||||
* @date 2026/5/28
|
||||
* @description TODO: 描述该类的作用
|
||||
*/
|
||||
public class WaterPlanTimeDataAdapter extends BaseQuickAdapter<WaterPlanWeekEntity.TimeDataBean, BaseViewHolder> {
|
||||
private Context mContext;
|
||||
public WaterPlanTimeDataAdapter(Context context,int layoutResId, @Nullable List<WaterPlanWeekEntity.TimeDataBean> data) {
|
||||
super(layoutResId, data);
|
||||
mContext = context;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void convert(BaseViewHolder helper, WaterPlanWeekEntity.TimeDataBean item) {
|
||||
TextView tvStartTime = helper.getView(R.id.tv_select_time);
|
||||
TextView tvPlanDuration = helper.getView(R.id.tv_plan_duration);
|
||||
|
||||
if(!TextUtils.isEmpty(item.getStartTime())){
|
||||
helper.setText(R.id.tv_select_time, item.getStartTime());
|
||||
}else{
|
||||
helper.setText(R.id.tv_select_time,"");
|
||||
tvStartTime.setHint(mContext.getString(R.string.select_water_time));
|
||||
}
|
||||
if(item.getDurationMin() != 0){
|
||||
helper.setText(R.id.tv_plan_duration,item.getDurationMin() + "");
|
||||
}else{
|
||||
helper.setText(R.id.tv_plan_duration,"");
|
||||
tvPlanDuration.setHint(mContext.getString(R.string.input_water_plan_time));
|
||||
}
|
||||
helper.addOnClickListener(R.id.tv_select_time);
|
||||
helper.addOnClickListener(R.id.tv_plan_duration);
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,9 @@ import static android.view.View.VISIBLE;
|
||||
import android.content.Context;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
@@ -15,40 +17,71 @@ import com.chad.library.adapter.base.BaseQuickAdapter;
|
||||
import com.chad.library.adapter.base.BaseViewHolder;
|
||||
import com.ckkj.water.R;
|
||||
import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
|
||||
import com.ckkj.water.utils.time.ZYTimeUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class WaterPlanWeekAdapter extends BaseQuickAdapter<WaterPlanWeekEntity.WashCycleEntity, BaseViewHolder> {
|
||||
private List<WaterPlanWeekEntity.WashCycleEntity> mList = new ArrayList<>();
|
||||
public class WaterPlanWeekAdapter extends BaseQuickAdapter<WaterPlanWeekEntity.DetailsBean, BaseViewHolder> {
|
||||
private List<WaterPlanWeekEntity.DetailsBean> mList = new ArrayList<>();
|
||||
private Context mContext;
|
||||
|
||||
private int mPos = 0;
|
||||
public WaterPlanWeekAdapter(Context context,int layoutResId, @Nullable List<WaterPlanWeekEntity.WashCycleEntity> data) {
|
||||
public WaterPlanWeekAdapter(Context context,int layoutResId, @Nullable List<WaterPlanWeekEntity.DetailsBean> data) {
|
||||
super(layoutResId, data);
|
||||
this.mContext = context;
|
||||
this.mList = data;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void convert(BaseViewHolder helper, WaterPlanWeekEntity.WashCycleEntity item) {
|
||||
helper.setText(R.id.tv_week,item.getWeek());
|
||||
LinearLayout linearItem = helper.getView(R.id.linear_item);
|
||||
View viewStatus = helper.getView(R.id.view_status);
|
||||
if(helper.getLayoutPosition() == mPos){
|
||||
linearItem.setBackground(mContext.getResources().getDrawable(R.drawable.shape_water_period_sel_bg));
|
||||
viewStatus.setVisibility(VISIBLE);
|
||||
viewStatus.setBackground(mContext.getResources().getDrawable(R.drawable.shape_green_circle));
|
||||
protected void convert(BaseViewHolder helper, WaterPlanWeekEntity.DetailsBean item) {
|
||||
TextView tvStartTime = helper.getView(R.id.tv_select_time);
|
||||
CheckBox checkBox = helper.getView(R.id.checkbox);
|
||||
TextView tvPlanDuration = helper.getView(R.id.tv_plan_duration);
|
||||
|
||||
|
||||
helper.setText(R.id.tv_week_name,item.getWeekName());
|
||||
|
||||
if(!TextUtils.isEmpty(item.getStartTime())){
|
||||
helper.setText(R.id.tv_select_time, item.getStartTime());
|
||||
}else{
|
||||
linearItem.setBackground(null);
|
||||
if(!TextUtils.isEmpty(item.getTime()) && !TextUtils.isEmpty(item.getDuration())){
|
||||
viewStatus.setVisibility(VISIBLE);
|
||||
viewStatus.setBackground(mContext.getResources().getDrawable(R.drawable.shape_yellow_circle));
|
||||
helper.setText(R.id.tv_select_time,"");
|
||||
tvStartTime.setHint(mContext.getString(R.string.select_water_time));
|
||||
}
|
||||
if(item.getDurationMin() != 0){
|
||||
helper.setText(R.id.tv_plan_duration,item.getDurationMin() + "");
|
||||
}else{
|
||||
viewStatus.setVisibility(INVISIBLE);
|
||||
viewStatus.setBackground(null);
|
||||
helper.setText(R.id.tv_plan_duration,"");
|
||||
tvPlanDuration.setHint(mContext.getString(R.string.input_water_plan_time));
|
||||
}
|
||||
|
||||
if(item.getStatus().equals("1")){
|
||||
checkBox.setChecked(true);
|
||||
}else{
|
||||
checkBox.setChecked(false);
|
||||
}
|
||||
|
||||
helper.addOnClickListener(R.id.linear_week);
|
||||
helper.addOnClickListener(R.id.checkbox);
|
||||
helper.addOnClickListener(R.id.tv_select_time);
|
||||
helper.addOnClickListener(R.id.tv_plan_duration);
|
||||
|
||||
// LinearLayout linearItem = helper.getView(R.id.linear_item);
|
||||
// View viewStatus = helper.getView(R.id.view_status);
|
||||
// if(helper.getLayoutPosition() == mPos){
|
||||
// linearItem.setBackground(mContext.getResources().getDrawable(R.drawable.shape_water_period_sel_bg));
|
||||
// viewStatus.setVisibility(VISIBLE);
|
||||
// viewStatus.setBackground(mContext.getResources().getDrawable(R.drawable.shape_green_circle));
|
||||
// }else{
|
||||
// linearItem.setBackground(null);
|
||||
// if(!TextUtils.isEmpty(item.getTime()) && !TextUtils.isEmpty(item.getDuration())){
|
||||
// viewStatus.setVisibility(VISIBLE);
|
||||
// viewStatus.setBackground(mContext.getResources().getDrawable(R.drawable.shape_yellow_circle));
|
||||
// }else{
|
||||
// viewStatus.setVisibility(INVISIBLE);
|
||||
// viewStatus.setBackground(null);
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
public void setSelPos(int position) {
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
package com.ckkj.water.plan.adapter;
|
||||
|
||||
import static android.view.View.INVISIBLE;
|
||||
import static android.view.View.VISIBLE;
|
||||
|
||||
import android.content.Context;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.chad.library.adapter.base.BaseQuickAdapter;
|
||||
import com.chad.library.adapter.base.BaseViewHolder;
|
||||
import com.ckkj.water.R;
|
||||
import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class WaterPlanWeekAdapter_copy extends BaseQuickAdapter<WaterPlanWeekEntity.DetailsBean, BaseViewHolder> {
|
||||
private List<WaterPlanWeekEntity.DetailsBean> mList = new ArrayList<>();
|
||||
private Context mContext;
|
||||
|
||||
private int mPos = 0;
|
||||
public WaterPlanWeekAdapter_copy(Context context, int layoutResId, @Nullable List<WaterPlanWeekEntity.DetailsBean> data) {
|
||||
super(layoutResId, data);
|
||||
this.mContext = context;
|
||||
this.mList = data;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void convert(BaseViewHolder helper, WaterPlanWeekEntity.DetailsBean item) {
|
||||
TextView tvStartTime = helper.getView(R.id.tv_select_time);
|
||||
CheckBox checkBox = helper.getView(R.id.checkbox);
|
||||
TextView tvPlanDuration = helper.getView(R.id.tv_plan_duration);
|
||||
|
||||
|
||||
helper.setText(R.id.tv_week_name,item.getWeekName());
|
||||
|
||||
LinearLayout linearItem = helper.getView(R.id.linear_item);
|
||||
View viewStatus = helper.getView(R.id.view_status);
|
||||
if(helper.getLayoutPosition() == mPos){
|
||||
linearItem.setBackground(mContext.getResources().getDrawable(R.drawable.shape_water_period_sel_bg));
|
||||
viewStatus.setVisibility(VISIBLE);
|
||||
viewStatus.setBackground(mContext.getResources().getDrawable(R.drawable.shape_green_circle));
|
||||
}else{
|
||||
linearItem.setBackground(null);
|
||||
viewStatus.setVisibility(INVISIBLE);
|
||||
}
|
||||
|
||||
|
||||
// if(!TextUtils.isEmpty(item.getStartTime())){
|
||||
// helper.setText(R.id.tv_select_time, item.getStartTime());
|
||||
// }else{
|
||||
// helper.setText(R.id.tv_select_time,"");
|
||||
// tvStartTime.setHint(mContext.getString(R.string.select_water_time));
|
||||
// }
|
||||
// if(item.getDurationMin() != 0){
|
||||
// helper.setText(R.id.tv_plan_duration,item.getDurationMin() + "");
|
||||
// }else{
|
||||
// helper.setText(R.id.tv_plan_duration,"");
|
||||
// tvPlanDuration.setHint(mContext.getString(R.string.input_water_plan_time));
|
||||
// }
|
||||
//
|
||||
// if(item.getStatus().equals("1")){
|
||||
// checkBox.setChecked(true);
|
||||
// }else{
|
||||
// checkBox.setChecked(false);
|
||||
// }
|
||||
//
|
||||
// helper.addOnClickListener(R.id.linear_week);
|
||||
// helper.addOnClickListener(R.id.checkbox);
|
||||
// helper.addOnClickListener(R.id.tv_select_time);
|
||||
// helper.addOnClickListener(R.id.tv_plan_duration);
|
||||
|
||||
|
||||
// if(!TextUtils.isEmpty(item.getTime()) && !TextUtils.isEmpty(item.getDuration())){
|
||||
// viewStatus.setVisibility(VISIBLE);
|
||||
// viewStatus.setBackground(mContext.getResources().getDrawable(R.drawable.shape_yellow_circle));
|
||||
// }else{
|
||||
// viewStatus.setVisibility(INVISIBLE);
|
||||
// viewStatus.setBackground(null);
|
||||
// }
|
||||
}
|
||||
|
||||
public void setSelPos(int position) {
|
||||
this.mPos = position;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
public int getmPos() {
|
||||
return mPos;
|
||||
}
|
||||
}
|
||||
@@ -1,152 +1,77 @@
|
||||
package com.ckkj.water.plan.entity;
|
||||
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
@NoArgsConstructor
|
||||
@Data
|
||||
public class WaterPlanWeekEntity implements Serializable {
|
||||
|
||||
/**
|
||||
* 排程名称
|
||||
*/
|
||||
private String scheduleName;
|
||||
|
||||
/**
|
||||
* 状态
|
||||
* id : 2057637613963182082
|
||||
* userId : 2056543507514097665
|
||||
* name : 排程四
|
||||
* deviceIds : null
|
||||
* status : 1
|
||||
* details : [{"createDept":null,"createBy":"2056543507514097665","createTime":"2026-05-22 09:40:10","updateBy":"2056543507514097665","updateTime":"2026-05-22 09:40:10","id":"2057637613963182083","scheduleId":"2057637613963182082","weekday":1,"startTime":"2026-04-11 10:12:12","durationMin":20,"zones":null,"triggerType":"0","status":"1"},{"createDept":null,"createBy":"2056543507514097665","createTime":"2026-05-22 09:40:10","updateBy":"2056543507514097665","updateTime":"2026-05-22 09:40:10","id":"2057637613963182084","scheduleId":"2057637613963182082","weekday":2,"startTime":"2026-04-11 10:12:12","durationMin":20,"zones":null,"triggerType":"0","status":"1"},{"createDept":null,"createBy":"2056543507514097665","createTime":"2026-05-22 09:40:10","updateBy":"2056543507514097665","updateTime":"2026-05-22 09:40:10","id":"2057637613963182085","scheduleId":"2057637613963182082","weekday":3,"startTime":"2026-04-11 10:12:12","durationMin":20,"zones":null,"triggerType":"0","status":"1"}]
|
||||
*/
|
||||
private boolean enable;
|
||||
|
||||
private String id;
|
||||
private String userId;
|
||||
private String name;
|
||||
private List<WaterDeviceEntity> deviceIds;
|
||||
private String status = "1";
|
||||
private List<DetailsBean> details;
|
||||
|
||||
|
||||
|
||||
@NoArgsConstructor
|
||||
@Data
|
||||
public static class DetailsBean implements Serializable{
|
||||
/**
|
||||
* 洗水周期列表
|
||||
* createDept : null
|
||||
* createBy : 2056543507514097665
|
||||
* createTime : 2026-05-22 09:40:10
|
||||
* updateBy : 2056543507514097665
|
||||
* updateTime : 2026-05-22 09:40:10
|
||||
* id : 2057637613963182083
|
||||
* scheduleId : 2057637613963182082
|
||||
* weekday : 1
|
||||
* startTime : 2026-04-11 10:12:12
|
||||
* durationMin : 20
|
||||
* zones : null
|
||||
* triggerType : 0
|
||||
* status : 1
|
||||
*/
|
||||
private List<WashCycleEntity> washCycleList;
|
||||
|
||||
/**
|
||||
* 关联设备列表
|
||||
*/
|
||||
private List<DeviceEntity> deviceList;
|
||||
|
||||
public String getScheduleName() {
|
||||
return scheduleName;
|
||||
private Object createDept;
|
||||
private String createBy;
|
||||
private String createTime;
|
||||
private String updateBy;
|
||||
private String updateTime;
|
||||
private String id;
|
||||
private String scheduleId;
|
||||
private int weekday = 1;
|
||||
private String weekName;
|
||||
private String startTime = "";
|
||||
private int durationMin = 0;
|
||||
private Object zones;
|
||||
private String triggerType = "0";
|
||||
private String status = "1";
|
||||
private List<TimeDataBean> timeData;
|
||||
}
|
||||
|
||||
public void setScheduleName(String scheduleName) {
|
||||
this.scheduleName = scheduleName;
|
||||
}
|
||||
|
||||
public boolean isEnable() {
|
||||
return enable;
|
||||
}
|
||||
|
||||
public void setEnable(boolean enable) {
|
||||
this.enable = enable;
|
||||
}
|
||||
|
||||
public List<WashCycleEntity> getWashCycleList() {
|
||||
return washCycleList;
|
||||
}
|
||||
|
||||
public void setWashCycleList(List<WashCycleEntity> washCycleList) {
|
||||
this.washCycleList = washCycleList;
|
||||
}
|
||||
|
||||
public List<DeviceEntity> getDeviceList() {
|
||||
return deviceList;
|
||||
}
|
||||
|
||||
public void setDeviceList(List<DeviceEntity> deviceList) {
|
||||
this.deviceList = deviceList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 洗水周期
|
||||
*/
|
||||
public static class WashCycleEntity {
|
||||
|
||||
/**
|
||||
* 星期
|
||||
* 如:周一
|
||||
*/
|
||||
private String week;
|
||||
|
||||
/**
|
||||
* 时间
|
||||
* 如:10:30
|
||||
*/
|
||||
private String time;
|
||||
|
||||
/**
|
||||
* 时长
|
||||
* 如:10min
|
||||
*/
|
||||
private String duration;
|
||||
|
||||
public String getWeek() {
|
||||
return week;
|
||||
}
|
||||
|
||||
public void setWeek(String week) {
|
||||
this.week = week;
|
||||
}
|
||||
|
||||
public String getTime() {
|
||||
return time;
|
||||
}
|
||||
|
||||
public void setTime(String time) {
|
||||
this.time = time;
|
||||
}
|
||||
|
||||
public String getDuration() {
|
||||
return duration;
|
||||
}
|
||||
|
||||
public void setDuration(String duration) {
|
||||
this.duration = duration;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 设备实体
|
||||
*/
|
||||
public static class DeviceEntity {
|
||||
|
||||
/**
|
||||
* 设备名称
|
||||
*/
|
||||
private String deviceName;
|
||||
|
||||
/**
|
||||
* 设备编号
|
||||
*/
|
||||
private String deviceCode;
|
||||
|
||||
/**
|
||||
* 是否已关联
|
||||
*/
|
||||
private boolean bind;
|
||||
|
||||
public String getDeviceName() {
|
||||
return deviceName;
|
||||
}
|
||||
|
||||
public void setDeviceName(String deviceName) {
|
||||
this.deviceName = deviceName;
|
||||
}
|
||||
|
||||
public String getDeviceCode() {
|
||||
return deviceCode;
|
||||
}
|
||||
|
||||
public void setDeviceCode(String deviceCode) {
|
||||
this.deviceCode = deviceCode;
|
||||
}
|
||||
|
||||
public boolean isBind() {
|
||||
return bind;
|
||||
}
|
||||
|
||||
public void setBind(boolean bind) {
|
||||
this.bind = bind;
|
||||
}
|
||||
@NoArgsConstructor
|
||||
@Data
|
||||
public static class TimeDataBean implements Serializable{
|
||||
private String startTime = "";
|
||||
private int durationMin = 0;
|
||||
private String weekName;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,15 +1,59 @@
|
||||
package com.ckkj.water.plan.mvp;
|
||||
|
||||
import com.ckkj.water.base.IView;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
|
||||
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class WaterPlanContract {
|
||||
public interface CallBack<T> {
|
||||
void success(T msg);
|
||||
void success(T msg,int total);
|
||||
void fail(String msg);
|
||||
}
|
||||
public interface DataModel{
|
||||
//查询排程列表
|
||||
void getWaterConfigList(Map<String, String> map,CallBack callBack);
|
||||
//新增排程
|
||||
void saveConfig(JSONObject json,CallBack callBack);
|
||||
//更新排程
|
||||
void updateConfig(JSONObject json,CallBack callBack);
|
||||
//更新排程状态
|
||||
void updatePlanStatus(JSONObject json, CallBack callBack);
|
||||
//查询排程可绑定的设备列表
|
||||
void getPlanBindDeviceList(Map<String, String> map,CallBack callBack);
|
||||
//查询排程详情
|
||||
void getPlanDetailInfo(Map<String, String> map,CallBack callBack);
|
||||
//排程绑定设备
|
||||
void planBindDevice(JSONObject json,CallBack callBack);
|
||||
//删除排程
|
||||
void deletePlan(String id,CallBack callBack);
|
||||
//排程解绑设备
|
||||
void planUnbindDevice(Map<String, String> map,CallBack callBack);
|
||||
}
|
||||
|
||||
public interface WaterPlanView extends IView {
|
||||
//查询排程列表成功
|
||||
void getWaterConfigListSuccess(List<WaterPlanWeekEntity> list,int total);
|
||||
//排程保存成功g
|
||||
void saveConfigSuccess(WaterPlanWeekEntity entity);
|
||||
//排程更新成功
|
||||
void updateConfigSuccess(WaterPlanWeekEntity entity);
|
||||
//更新排程状态成功
|
||||
void updatePlanStatusSuccess(BaseBean bean, String status);
|
||||
//获取排程详情
|
||||
void getPlanDetailInfo(WaterPlanWeekEntity entity);
|
||||
//查询到可绑定设备列表
|
||||
void getPlanBindDeviceList(WaterDeviceEntity bean);
|
||||
//排程绑定设备成功
|
||||
void planBindDeviceSuccess(BaseBean bean);
|
||||
//删除排程成功
|
||||
void deletePlanSuccess(BaseBean bean);
|
||||
//排程解绑设备成功
|
||||
void planUnbindDeviceSuccess(BaseBean bean,int position);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,340 @@
|
||||
package com.ckkj.water.plan.mvp;
|
||||
|
||||
import com.ckkj.water.device.mvp.DeviceContract;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
import com.ckkj.water.network.NetWorkManager;
|
||||
import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
|
||||
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import io.reactivex.Observer;
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.annotations.NonNull;
|
||||
import io.reactivex.disposables.Disposable;
|
||||
import io.reactivex.schedulers.Schedulers;
|
||||
|
||||
public class WaterPlanImpl implements WaterPlanContract.DataModel{
|
||||
|
||||
/**
|
||||
* 查询排程列表
|
||||
* @param map
|
||||
* @param callBack
|
||||
*/
|
||||
@Override
|
||||
public void getWaterConfigList(Map<String, String> map, WaterPlanContract.CallBack callBack) {
|
||||
NetWorkManager.getRequest().scheduleList(NetWorkManager.getToken(),map)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.unsubscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Observer<BaseBean<List<WaterPlanWeekEntity>>>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseBean<List<WaterPlanWeekEntity>> bean) {
|
||||
if (bean.getCode() == 200) {
|
||||
callBack.success(bean.getRows(),bean.getTotal());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(@NonNull Throwable e) {
|
||||
callBack.fail(e.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增排程
|
||||
* @param json
|
||||
* @param callBack
|
||||
*/
|
||||
@Override
|
||||
public void saveConfig(JSONObject json, WaterPlanContract.CallBack callBack) {
|
||||
try {
|
||||
NetWorkManager.getRequest().addSchedule(NetWorkManager.getToken(),NetWorkManager.toRequestBody(json))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.unsubscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Observer<BaseBean<WaterPlanWeekEntity>>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseBean<WaterPlanWeekEntity> bean) {
|
||||
if (bean.getCode() == 200) {
|
||||
callBack.success(bean.getData(),0);
|
||||
} else {
|
||||
callBack.fail(bean.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(@NonNull Throwable e) {
|
||||
callBack.fail(e.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
}
|
||||
});
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新排程信息
|
||||
* @param json
|
||||
* @param callBack
|
||||
*/
|
||||
@Override
|
||||
public void updateConfig(JSONObject json, WaterPlanContract.CallBack callBack) {
|
||||
try {
|
||||
NetWorkManager.getRequest().updateSchedule(NetWorkManager.getToken(),NetWorkManager.toRequestBody(json))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.unsubscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Observer<BaseBean<WaterPlanWeekEntity>>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseBean<WaterPlanWeekEntity> bean) {
|
||||
if (bean.getCode() == 200) {
|
||||
callBack.success(bean.getData(),0);
|
||||
} else {
|
||||
callBack.fail(bean.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(@NonNull Throwable e) {
|
||||
callBack.fail(e.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
}
|
||||
});
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新排程状态
|
||||
* @param callBack
|
||||
*/
|
||||
@Override
|
||||
public void updatePlanStatus(JSONObject json, WaterPlanContract.CallBack callBack) {
|
||||
NetWorkManager.getRequest().updateScheduleStatus(NetWorkManager.getToken(),NetWorkManager.toRequestBody(json))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.unsubscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Observer<BaseBean<WaterPlanWeekEntity>>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseBean<WaterPlanWeekEntity> bean) {
|
||||
if (bean.getCode() == 200) {
|
||||
callBack.success(bean.getData(), 0);
|
||||
} else {
|
||||
callBack.fail(bean.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(@NonNull Throwable e) {
|
||||
callBack.fail(e.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询可绑定排程的设备列表
|
||||
* @param map
|
||||
* @param callBack
|
||||
*/
|
||||
@Override
|
||||
public void getPlanBindDeviceList(Map<String, String> map, WaterPlanContract.CallBack callBack) {
|
||||
String deviceID = map.get("id");
|
||||
NetWorkManager.getRequest().getPlanBindDeviceList(NetWorkManager.getToken(), deviceID)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.unsubscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Observer<BaseBean<WaterDeviceEntity>>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseBean<WaterDeviceEntity> bean) {
|
||||
if (bean.getCode() == 200) {
|
||||
callBack.success(bean.getData(),0);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(@NonNull Throwable e) {
|
||||
callBack.fail(e.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getPlanDetailInfo(Map<String, String> map, WaterPlanContract.CallBack callBack) {
|
||||
String deviceID = map.get("id");
|
||||
NetWorkManager.getRequest().getPlanDetailInfo(NetWorkManager.getToken(), deviceID)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.unsubscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Observer<BaseBean<WaterPlanWeekEntity>>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseBean<WaterPlanWeekEntity> bean) {
|
||||
if (bean.getCode() == 200) {
|
||||
callBack.success(bean.getData(),0);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(@NonNull Throwable e) {
|
||||
callBack.fail(e.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void planBindDevice(JSONObject json, WaterPlanContract.CallBack callBack) {
|
||||
try {
|
||||
NetWorkManager.getRequest().planBindDevice(NetWorkManager.getToken(),NetWorkManager.toRequestBody(json))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.unsubscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Observer<BaseBean>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseBean bean) {
|
||||
if (bean.getCode() == 200) {
|
||||
callBack.success(bean.getData(),0);
|
||||
} else {
|
||||
callBack.fail(bean.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(@NonNull Throwable e) {
|
||||
callBack.fail(e.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
}
|
||||
});
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除排程
|
||||
* @param id
|
||||
* @param callBack
|
||||
*/
|
||||
@Override
|
||||
public void deletePlan(String id, WaterPlanContract.CallBack callBack) {
|
||||
try {
|
||||
NetWorkManager.getRequest().deletePlanById(NetWorkManager.getToken(), id)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.unsubscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Observer<BaseBean>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseBean bean) {
|
||||
if (bean.getCode() == 200) {
|
||||
callBack.success(bean,0);
|
||||
} else {
|
||||
callBack.fail(bean.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(@NonNull Throwable e) {
|
||||
callBack.fail(e.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
}
|
||||
});
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void planUnbindDevice(Map<String, String> map, WaterPlanContract.CallBack callBack) {
|
||||
NetWorkManager.getRequest().planUnBindDevice(NetWorkManager.getToken(), map)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.unsubscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Observer<BaseBean>() {
|
||||
@Override
|
||||
public void onSubscribe(@NonNull Disposable d) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(@NonNull BaseBean bean) {
|
||||
if (bean.getCode() == 200) {
|
||||
callBack.success(bean,0);
|
||||
} else {
|
||||
callBack.fail(bean.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(@NonNull Throwable e) {
|
||||
callBack.fail(e.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,17 @@
|
||||
package com.ckkj.water.plan.mvp;
|
||||
|
||||
import com.ckkj.water.base.BasePresenter;
|
||||
import com.ckkj.water.device.mvp.DeviceContract;
|
||||
import com.ckkj.water.device.mvp.DeviceImpl;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
import com.ckkj.water.plan.entity.WaterPlanWeekEntity;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class WaterPlanPresenter extends BasePresenter<WaterPlanContract.WaterPlanView> {
|
||||
private WaterPlanImpl impl;
|
||||
@@ -10,4 +19,290 @@ public class WaterPlanPresenter extends BasePresenter<WaterPlanContract.WaterPla
|
||||
public WaterPlanPresenter(WaterPlanImpl impl) {
|
||||
this.impl = impl;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取排程信息
|
||||
*/
|
||||
public void getWaterPlanList(int mCurrentPage) {
|
||||
Map<String,String> map = new HashMap<>();
|
||||
map.put("pageNum", mCurrentPage + "");
|
||||
map.put("pageSize", "10");
|
||||
impl.getWaterConfigList(map, new WaterPlanContract.CallBack<List<WaterPlanWeekEntity>>() {
|
||||
|
||||
@Override
|
||||
public void success(List<WaterPlanWeekEntity> List, int total) {
|
||||
if(WaterPlanPresenter.this.getView() != null){
|
||||
WaterPlanPresenter.this.getView().getWaterConfigListSuccess(List, total);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fail(String msg) {
|
||||
if(WaterPlanPresenter.this.getView() != null){
|
||||
WaterPlanPresenter.this.getView().showError(msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存排程信息
|
||||
* @param entity
|
||||
*/
|
||||
public void saveConfig(WaterPlanWeekEntity entity) {
|
||||
try {
|
||||
JSONObject json = new JSONObject();
|
||||
json.put("name", entity.getName());
|
||||
json.put("status", entity.getStatus());
|
||||
JSONArray array = new JSONArray();
|
||||
for(WaterPlanWeekEntity.DetailsBean detailsBean : entity.getDetails()){
|
||||
JSONObject jsonDetails = new JSONObject();
|
||||
jsonDetails.put("weekday", detailsBean.getWeekday());
|
||||
jsonDetails.put("triggerType", detailsBean.getTriggerType());
|
||||
jsonDetails.put("status", detailsBean.getStatus());
|
||||
JSONArray timeArray = new JSONArray();
|
||||
for(WaterPlanWeekEntity.TimeDataBean timeDataBean : detailsBean.getTimeData()){
|
||||
JSONObject jsonTime = new JSONObject();
|
||||
jsonTime.put("startTime", timeDataBean.getStartTime());
|
||||
jsonTime.put("durationMin", timeDataBean.getDurationMin());
|
||||
timeArray.put(jsonTime);
|
||||
}
|
||||
jsonDetails.put("timeData", timeArray);
|
||||
array.put(jsonDetails);
|
||||
}
|
||||
json.put("details", array);
|
||||
impl.saveConfig(json, new WaterPlanContract.CallBack<WaterPlanWeekEntity>() {
|
||||
|
||||
@Override
|
||||
public void success(WaterPlanWeekEntity bean, int total) {
|
||||
if(WaterPlanPresenter.this.getView() != null){
|
||||
WaterPlanPresenter.this.getView().saveConfigSuccess(bean);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fail(String msg) {
|
||||
if(WaterPlanPresenter.this.getView() != null){
|
||||
WaterPlanPresenter.this.getView().showError(msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
} catch (JSONException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新排程信息
|
||||
* @param entity
|
||||
*/
|
||||
public void updateConfig(WaterPlanWeekEntity entity) {
|
||||
try {
|
||||
JSONObject json = new JSONObject();
|
||||
json.put("id", entity.getId());
|
||||
json.put("name", entity.getName());
|
||||
json.put("status", entity.getStatus());
|
||||
JSONArray array = new JSONArray();
|
||||
for(WaterPlanWeekEntity.DetailsBean detailsBean : entity.getDetails()){
|
||||
JSONObject jsonDetails = new JSONObject();
|
||||
jsonDetails.put("weekday", detailsBean.getWeekday());
|
||||
jsonDetails.put("triggerType", detailsBean.getTriggerType());
|
||||
jsonDetails.put("status", detailsBean.getStatus());
|
||||
jsonDetails.put("id", detailsBean.getId());
|
||||
JSONArray timeArray = new JSONArray();
|
||||
for(WaterPlanWeekEntity.TimeDataBean timeDataBean : detailsBean.getTimeData()){
|
||||
JSONObject jsonTime = new JSONObject();
|
||||
jsonTime.put("startTime", timeDataBean.getStartTime());
|
||||
jsonTime.put("durationMin", timeDataBean.getDurationMin());
|
||||
timeArray.put(jsonTime);
|
||||
}
|
||||
jsonDetails.put("timeData", timeArray);
|
||||
array.put(jsonDetails);
|
||||
}
|
||||
json.put("details", array);
|
||||
impl.updateConfig(json, new WaterPlanContract.CallBack<WaterPlanWeekEntity>() {
|
||||
|
||||
@Override
|
||||
public void success(WaterPlanWeekEntity bean, int total) {
|
||||
if(WaterPlanPresenter.this.getView() != null){
|
||||
WaterPlanPresenter.this.getView().updateConfigSuccess(bean);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fail(String msg) {
|
||||
if(WaterPlanPresenter.this.getView() != null){
|
||||
WaterPlanPresenter.this.getView().showError(msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
} catch (JSONException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询排程可绑定的设备列表
|
||||
* @param entity
|
||||
*/
|
||||
public void getPlanBindDevices(WaterPlanWeekEntity entity) {
|
||||
Map<String,String> map = new HashMap<>();
|
||||
map.put("id",entity.getId());
|
||||
impl.getPlanBindDeviceList(map, new WaterPlanContract.CallBack<WaterDeviceEntity>() {
|
||||
@Override
|
||||
public void success(WaterDeviceEntity bean, int total) {
|
||||
if(WaterPlanPresenter.this.getView() != null){
|
||||
WaterPlanPresenter.this.getView().getPlanBindDeviceList(bean);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fail(String msg) {
|
||||
if(WaterPlanPresenter.this.getView() != null){
|
||||
WaterPlanPresenter.this.getView().showError( msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询排程详情
|
||||
* @param mPlanEntity
|
||||
*/
|
||||
public void getPlanDetailInfo(WaterPlanWeekEntity mPlanEntity) {
|
||||
Map<String,String> map = new HashMap<>();
|
||||
map.put("id",mPlanEntity.getId());
|
||||
impl.getPlanDetailInfo(map, new WaterPlanContract.CallBack<WaterPlanWeekEntity>() {
|
||||
@Override
|
||||
public void success(WaterPlanWeekEntity bean, int total) {
|
||||
if(WaterPlanPresenter.this.getView() != null){
|
||||
WaterPlanPresenter.this.getView().getPlanDetailInfo(bean);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fail(String msg) {
|
||||
if(WaterPlanPresenter.this.getView() != null){
|
||||
WaterPlanPresenter.this.getView().showError( msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 排程绑定设备
|
||||
* @param entity
|
||||
* @param deviceIds
|
||||
*/
|
||||
public void planBindWithDevices(WaterPlanWeekEntity entity, String deviceIds) {
|
||||
try {
|
||||
JSONObject json = new JSONObject();
|
||||
json.put("scheduleId", entity.getId());
|
||||
// 将逗号分隔的字符串转换为 JSONArray (数字类型)
|
||||
JSONArray deviceIdArray = new JSONArray();
|
||||
String[] idArray = deviceIds.split(",");
|
||||
for (String id : idArray) {
|
||||
deviceIdArray.put(id);
|
||||
}
|
||||
json.put("deviceIds", deviceIdArray);
|
||||
impl.planBindDevice(json, new WaterPlanContract.CallBack<BaseBean>() {
|
||||
@Override
|
||||
public void success(BaseBean bean, int total) {
|
||||
if(WaterPlanPresenter.this.getView() != null){
|
||||
WaterPlanPresenter.this.getView().planBindDeviceSuccess(bean);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fail(String msg) {
|
||||
if(WaterPlanPresenter.this.getView() != null){
|
||||
WaterPlanPresenter.this.getView().showError( msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (JSONException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新排程状态
|
||||
* @param entity 排程实体
|
||||
* @param status 状态 0-关闭 1-开启
|
||||
*/
|
||||
public void updatePlanStatus(WaterPlanWeekEntity entity, String status) {
|
||||
try {
|
||||
JSONObject json = new JSONObject();
|
||||
json.put("id", entity.getId());
|
||||
json.put("status", status);
|
||||
impl.updatePlanStatus(json, new WaterPlanContract.CallBack<BaseBean>() {
|
||||
@Override
|
||||
public void success(BaseBean bean, int total) {
|
||||
if (WaterPlanPresenter.this.getView() != null) {
|
||||
WaterPlanPresenter.this.getView().updatePlanStatusSuccess(bean,status);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fail(String msg) {
|
||||
if (WaterPlanPresenter.this.getView() != null) {
|
||||
WaterPlanPresenter.this.getView().showError(msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (JSONException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除排程
|
||||
* @param mDetailEntity
|
||||
*/
|
||||
public void deletePlan(WaterPlanWeekEntity mDetailEntity) {
|
||||
impl.deletePlan(mDetailEntity.getId(), new WaterPlanContract.CallBack<BaseBean>() {
|
||||
@Override
|
||||
public void success(BaseBean bean, int total) {
|
||||
if(WaterPlanPresenter.this.getView() != null){
|
||||
WaterPlanPresenter.this.getView().deletePlanSuccess(bean);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fail(String msg) {
|
||||
if(WaterPlanPresenter.this.getView() != null){
|
||||
WaterPlanPresenter.this.getView().showError( msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 排程解绑设备
|
||||
* @param planID
|
||||
* @param deviceID
|
||||
*/
|
||||
public void planUnbindDevice(String planID, String deviceID,int position) {
|
||||
Map<String,String> map = new HashMap<>();
|
||||
map.put("scheduleId",planID);
|
||||
map.put("deviceId",deviceID);
|
||||
impl.planUnbindDevice(map, new WaterPlanContract.CallBack<BaseBean>() {
|
||||
@Override
|
||||
public void success(BaseBean bean, int total) {
|
||||
if(WaterPlanPresenter.this.getView() != null){
|
||||
WaterPlanPresenter.this.getView().planUnbindDeviceSuccess(bean,position);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fail(String msg) {
|
||||
if(WaterPlanPresenter.this.getView() != null){
|
||||
WaterPlanPresenter.this.getView().showError( msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
package com.ckkj.water.utils.manager;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import com.ckkj.water.R;
|
||||
|
||||
/**
|
||||
* @author fengxiaoyang
|
||||
* @date 2026/6/2
|
||||
* @description 电池图标管理,根据电量值返回对应的图标资源
|
||||
*/
|
||||
public class PowerIconManage {
|
||||
private static PowerIconManage instance;
|
||||
private int[] horIconRes = {R.mipmap.hor_0, R.mipmap.hor_10, R.mipmap.hor_20, R.mipmap.hor_30,
|
||||
R.mipmap.hor_40, R.mipmap.hor_50, R.mipmap.hor_60, R.mipmap.hor_70,
|
||||
R.mipmap.hor_80, R.mipmap.hor_90, R.mipmap.hor_100};
|
||||
|
||||
private int [] verIconRes = {R.mipmap.ver_0, R.mipmap.ver_10, R.mipmap.ver_20, R.mipmap.ver_30,
|
||||
R.mipmap.ver_40, R.mipmap.ver_50, R.mipmap.ver_60, R.mipmap.ver_70,
|
||||
R.mipmap.ver_80, R.mipmap.ver_90, R.mipmap.ver_100};
|
||||
|
||||
public static PowerIconManage getInstance() {
|
||||
if (instance == null) {
|
||||
synchronized (PowerIconManage.class) {
|
||||
if (instance == null) {
|
||||
instance = new PowerIconManage();
|
||||
}
|
||||
}
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据电量值获取对应的电池图标
|
||||
* @param power 电量值 (0-100)
|
||||
* @return 电池图标资源ID
|
||||
*/
|
||||
public int getPowerIcon(int power) {
|
||||
if (power <= 0) {
|
||||
return horIconRes[0];
|
||||
}
|
||||
if (power >= 100) {
|
||||
return horIconRes[10];
|
||||
}
|
||||
// 计算对应的数组索引,电量1~10对应索引1,11~20对应索引2...
|
||||
int index = (power + 9) / 10;
|
||||
return horIconRes[index];
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据电量值获取对应的电池图标
|
||||
* @param power 电量值 (0-100)
|
||||
* @return 电池图标资源ID
|
||||
*/
|
||||
public int getPowerVerIcon(int power) {
|
||||
if (power <= 0) {
|
||||
return verIconRes[0];
|
||||
}
|
||||
if (power >= 100) {
|
||||
return verIconRes[10];
|
||||
}
|
||||
// 计算对应的数组索引,电量1~10对应索引1,11~20对应索引2...
|
||||
int index = (power + 9) / 10;
|
||||
return verIconRes[index];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,168 @@
|
||||
package com.ckkj.water.utils.manager;
|
||||
|
||||
import android.bluetooth.BluetoothGatt;
|
||||
import android.bluetooth.BluetoothGattCharacteristic;
|
||||
import android.bluetooth.BluetoothGattService;
|
||||
import android.content.Context;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.ckkj.water.AppConfig;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.UUID;
|
||||
|
||||
import no.nordicsemi.android.ble.BleManager;
|
||||
|
||||
/**
|
||||
* @author fengxiaoyang
|
||||
* @date 2026/6/3
|
||||
* @description 蓝牙设备管理
|
||||
*/
|
||||
public class WaterDeviceManager extends BleManager {
|
||||
private BluetoothGattCharacteristic writeCharacteristic;
|
||||
private BluetoothGattCharacteristic notifyCharacteristic;
|
||||
private OnDataReceivedListener dataListener;
|
||||
|
||||
public interface OnDataReceivedListener {
|
||||
void onDataReceived(byte[] data);
|
||||
}
|
||||
|
||||
public WaterDeviceManager(@NonNull Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
public void setOnDataReceivedListener(OnDataReceivedListener listener) {
|
||||
this.dataListener = listener;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
protected BleManagerGattCallback getGattCallback() {
|
||||
return new DeviceGattCallback();
|
||||
}
|
||||
|
||||
private class DeviceGattCallback extends BleManagerGattCallback {
|
||||
|
||||
@Override
|
||||
protected void initialize() {
|
||||
|
||||
setNotificationCallback(notifyCharacteristic)
|
||||
.with((device, data) -> {
|
||||
byte[] bytes = data.getValue();
|
||||
Log.e("TEST", "收到数据: " + Arrays.toString(bytes));
|
||||
|
||||
if (dataListener != null) {
|
||||
dataListener.onDataReceived(bytes);
|
||||
}
|
||||
});
|
||||
|
||||
enableNotifications(notifyCharacteristic)
|
||||
.enqueue();
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public boolean isRequiredServiceSupported(@NonNull BluetoothGatt gatt) {
|
||||
//
|
||||
// BluetoothGattService service =
|
||||
// gatt.getService(UUID.fromString(
|
||||
// AppConfig.BLUETOOTH_DEVICE_UUID));
|
||||
//
|
||||
// if (service == null) {
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// writeCharacteristic =
|
||||
// service.getCharacteristic(UUID.fromString(
|
||||
// AppConfig.BLUETOOTH_DEVICE_UUID));
|
||||
//
|
||||
// notifyCharacteristic =
|
||||
// service.getCharacteristic(UUID.fromString(
|
||||
// AppConfig.BLUETOOTH_DEVICE_UUID));
|
||||
//
|
||||
// return writeCharacteristic != null
|
||||
// && notifyCharacteristic != null;
|
||||
// }
|
||||
@Override
|
||||
public boolean isRequiredServiceSupported(
|
||||
@NonNull BluetoothGatt gatt) {
|
||||
|
||||
for (BluetoothGattService service :
|
||||
gatt.getServices()) {
|
||||
|
||||
Log.e("TEST",
|
||||
"Service=" + service.getUuid());
|
||||
|
||||
for (BluetoothGattCharacteristic c :
|
||||
service.getCharacteristics()) {
|
||||
|
||||
int properties = c.getProperties();
|
||||
|
||||
Log.e("TEST",
|
||||
"Characteristic="
|
||||
+ c.getUuid()
|
||||
+ " props="
|
||||
+ properties);
|
||||
|
||||
if ((properties &
|
||||
BluetoothGattCharacteristic.PROPERTY_WRITE)
|
||||
!= 0) {
|
||||
|
||||
writeCharacteristic = c;
|
||||
}
|
||||
|
||||
if ((properties &
|
||||
BluetoothGattCharacteristic.PROPERTY_NOTIFY)
|
||||
!= 0) {
|
||||
|
||||
notifyCharacteristic = c;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Log.e("TEST",
|
||||
"write="
|
||||
+ (writeCharacteristic != null
|
||||
? writeCharacteristic.getUuid()
|
||||
: "null"));
|
||||
|
||||
Log.e("TEST",
|
||||
"notify="
|
||||
+ (notifyCharacteristic != null
|
||||
? notifyCharacteristic.getUuid()
|
||||
: "null"));
|
||||
|
||||
return writeCharacteristic != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onServicesInvalidated() {
|
||||
writeCharacteristic = null;
|
||||
notifyCharacteristic = null;
|
||||
}
|
||||
}
|
||||
|
||||
public void send(byte[] data) {
|
||||
|
||||
if (writeCharacteristic == null) {
|
||||
Log.e("TEST", "send: Write characteristic is null");
|
||||
return;
|
||||
}
|
||||
|
||||
writeCharacteristic(writeCharacteristic, data)
|
||||
.enqueue();
|
||||
}
|
||||
|
||||
public boolean isBlConnected() {
|
||||
// 通过反射或状态检查来判断是否已连接
|
||||
// BleManager 没有直接的 isConnected 方法,需要检查内部状态
|
||||
try {
|
||||
// 检查 writeCharacteristic 是否可用(连接后会初始化)
|
||||
return writeCharacteristic != null;
|
||||
} catch (Exception e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -229,10 +229,98 @@ public class ZYTimeUtils {
|
||||
public static String getStrTimeData(Date date) {
|
||||
String timeString = null;
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
|
||||
timeString = sdf.format(new Date());//单位秒
|
||||
timeString = sdf.format(date);//单位秒
|
||||
return timeString;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* yyyy-MM-dd HH:mm 转换为 HH:mm显示
|
||||
* @param date
|
||||
* @return
|
||||
*/
|
||||
public static String yyyyMMdd2HH_mm(String date) {
|
||||
if (TextUtils.isEmpty(date)) {
|
||||
return "";
|
||||
}
|
||||
try {
|
||||
SimpleDateFormat sourceFormat =
|
||||
new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.getDefault());
|
||||
|
||||
SimpleDateFormat targetFormat =
|
||||
new SimpleDateFormat("HH:mm", Locale.getDefault());
|
||||
|
||||
Date parseDate = sourceFormat.parse(date);
|
||||
|
||||
return parseDate == null ? "" : targetFormat.format(parseDate);
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
/**
|
||||
* yyyy-MM-dd HH:mm:ss 转换成 yyyy-MM-dd HH:mm
|
||||
* @param time
|
||||
* @return
|
||||
*/
|
||||
public static String timeWithoutMillis(String time) {
|
||||
|
||||
if (TextUtils.isEmpty(time)) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
SimpleDateFormat sourceFormat =
|
||||
new SimpleDateFormat(
|
||||
"yyyy-MM-dd HH:mm:ss",
|
||||
Locale.getDefault());
|
||||
|
||||
SimpleDateFormat targetFormat =
|
||||
new SimpleDateFormat(
|
||||
"yyyy-MM-dd HH:mm",
|
||||
Locale.getDefault());
|
||||
|
||||
Date date = sourceFormat.parse(time);
|
||||
|
||||
return date == null ? "" : targetFormat.format(date);
|
||||
|
||||
} catch (Exception e) {
|
||||
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
/**
|
||||
* HH:mm:ss 转 HH:mm
|
||||
* 例如:
|
||||
* 08:00:00 -> 08:00
|
||||
* 18:35:29 -> 18:35
|
||||
*/
|
||||
public static String formatHHmm(String time) {
|
||||
if (TextUtils.isEmpty(time)) {
|
||||
return "";
|
||||
}
|
||||
|
||||
try {
|
||||
SimpleDateFormat sourceFormat =
|
||||
new SimpleDateFormat("HH:mm:ss", Locale.getDefault());
|
||||
|
||||
SimpleDateFormat targetFormat =
|
||||
new SimpleDateFormat("HH:mm", Locale.getDefault());
|
||||
|
||||
Date date = sourceFormat.parse(time);
|
||||
|
||||
return targetFormat.format(date);
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return time;
|
||||
}
|
||||
}
|
||||
|
||||
public static String getStrTimeData_H_M(Date date) {
|
||||
String timeString = null;
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
|
||||
@@ -974,4 +1062,18 @@ public class ZYTimeUtils {
|
||||
}
|
||||
}
|
||||
|
||||
private static final String[] WEEK_NAMES = {"周一", "周二", "周三", "周四", "周五", "周六", "周日"};
|
||||
|
||||
/**
|
||||
* 根据星期索引获取星期名称
|
||||
* @param weekday 星期索引,0=周一,1=周二,...,6=周日
|
||||
* @return 对应的星期名称
|
||||
*/
|
||||
public static String getWeekName(int weekday) {
|
||||
if (weekday >= 0 && weekday < 7) {
|
||||
return WEEK_NAMES[weekday];
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
6
app/src/main/res/drawable/shape_add_water_tab_bg.xml
Normal file
6
app/src/main/res/drawable/shape_add_water_tab_bg.xml
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<solid android:color="@color/white"/>
|
||||
<stroke android:color="@color/color_zhu" android:width="@dimen/dp_1"/>
|
||||
<corners android:radius="@dimen/dp_4"/>
|
||||
</shape>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<corners android:radius="@dimen/dp_12"/>
|
||||
<solid android:color="@color/white"/>
|
||||
<solid android:color="@color/color_gray2"/>
|
||||
</shape>
|
||||
14
app/src/main/res/drawable/shape_item_delete_bg.xml
Normal file
14
app/src/main/res/drawable/shape_item_delete_bg.xml
Normal file
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<inset xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:insetRight="12dp">
|
||||
|
||||
<shape android:shape="rectangle">
|
||||
|
||||
<solid android:color="@color/color_e34d59"/>
|
||||
|
||||
<corners
|
||||
android:radius="8dp"/>
|
||||
|
||||
</shape>
|
||||
|
||||
</inset>
|
||||
5
app/src/main/res/drawable/shape_status_dot_999999.xml
Normal file
5
app/src/main/res/drawable/shape_status_dot_999999.xml
Normal file
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="oval">
|
||||
<solid android:color="@color/color_999999" />
|
||||
</shape>
|
||||
@@ -6,11 +6,5 @@
|
||||
<corners android:topLeftRadius="@dimen/dp_4" android:bottomLeftRadius="@dimen/dp_4" />
|
||||
</shape>
|
||||
</item>
|
||||
<item>
|
||||
<shape android:shape="rectangle">
|
||||
<solid android:color="@color/white" />
|
||||
<stroke android:color="@color/color_zhu" android:width="@dimen/dp_1"/>
|
||||
<corners android:topLeftRadius="@dimen/dp_4" android:bottomLeftRadius="@dimen/dp_4" />
|
||||
</shape>
|
||||
</item>
|
||||
|
||||
</selector>
|
||||
@@ -6,11 +6,4 @@
|
||||
<corners android:topRightRadius="@dimen/dp_4" android:bottomRightRadius="@dimen/dp_4" />
|
||||
</shape>
|
||||
</item>
|
||||
<item>
|
||||
<shape android:shape="rectangle">
|
||||
<solid android:color="@color/white" />
|
||||
<stroke android:color="@color/color_zhu" android:width="@dimen/dp_1"/>
|
||||
<corners android:bottomRightRadius="@dimen/dp_4" android:topRightRadius="@dimen/dp_4" />
|
||||
</shape>
|
||||
</item>
|
||||
</selector>
|
||||
14
app/src/main/res/drawable/tab_selector_bg_center.xml
Normal file
14
app/src/main/res/drawable/tab_selector_bg_center.xml
Normal file
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:state_selected="true">
|
||||
<shape android:shape="rectangle">
|
||||
<solid android:color="@color/color_zhu" />
|
||||
</shape>
|
||||
</item>
|
||||
<item>
|
||||
<shape android:shape="rectangle">
|
||||
<solid android:color="@color/white" />
|
||||
<stroke android:color="@color/color_zhu" android:width="@dimen/dp_1"/>
|
||||
</shape>
|
||||
</item>
|
||||
</selector>
|
||||
@@ -1,5 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
@@ -43,14 +45,19 @@
|
||||
android:layout_width="@dimen/dp_200"
|
||||
android:layout_height="@dimen/dp_200"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:src="@drawable/anim_add_device_scan"/>
|
||||
android:src="@drawable/anim_add_device_scan"
|
||||
android:visibility="visible"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/img_device_item"
|
||||
android:layout_width="@dimen/dp_150"
|
||||
android:layout_height="@dimen/dp_150"
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/rv_devices"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:src="@mipmap/ic_launcher"
|
||||
android:paddingHorizontal="@dimen/dp_5"
|
||||
android:layout_marginTop="@dimen/dp_5"
|
||||
tools:listitem="@layout/scan_ble_device_item"
|
||||
app:spanCount="4"
|
||||
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
|
||||
android:visibility="gone"/>
|
||||
|
||||
<TextView
|
||||
@@ -76,4 +83,17 @@
|
||||
android:layout_marginHorizontal="@dimen/dp_20"
|
||||
android:layout_marginTop="@dimen/dp_40"
|
||||
android:gravity="center"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/btn_ble_scan"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="14sp"
|
||||
android:textColor="@color/white"
|
||||
android:text="蓝牙扫描"
|
||||
android:background="@drawable/shape_green_button_bg"
|
||||
android:paddingVertical="@dimen/dp_10"
|
||||
android:layout_marginHorizontal="@dimen/dp_20"
|
||||
android:layout_marginTop="@dimen/dp_40"
|
||||
android:gravity="center"/>
|
||||
</LinearLayout>
|
||||
@@ -16,7 +16,8 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/dp_40"
|
||||
android:orientation="horizontal"
|
||||
android:layout_marginHorizontal="@dimen/dp_20">
|
||||
android:layout_marginHorizontal="@dimen/dp_20"
|
||||
android:background="@drawable/shape_add_water_tab_bg">
|
||||
<TextView
|
||||
android:id="@+id/tv_config"
|
||||
android:layout_width="0dp"
|
||||
@@ -27,6 +28,16 @@
|
||||
android:textSize="14sp"
|
||||
android:textColor="@drawable/tab_selector_text"
|
||||
android:text="@string/water_device_config"/>
|
||||
<TextView
|
||||
android:id="@+id/tv_bound"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center"
|
||||
android:background="@drawable/tab_selector_bg_center"
|
||||
android:textSize="14sp"
|
||||
android:textColor="@drawable/tab_selector_text"
|
||||
android:text="@string/water_bound_device"/>
|
||||
<TextView
|
||||
android:id="@+id/tv_bind"
|
||||
android:layout_width="0dp"
|
||||
|
||||
@@ -187,8 +187,8 @@
|
||||
android:orientation="horizontal"
|
||||
android:background="@drawable/shape_f9f9f9_corner_5"
|
||||
android:layout_marginHorizontal="@dimen/dp_20">
|
||||
<EditText
|
||||
android:id="@+id/et_wort_time"
|
||||
<TextView
|
||||
android:id="@+id/tv_work_duartion"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingLeft="@dimen/dp_5"
|
||||
|
||||
100
app/src/main/res/layout/include_plan_time_item_layout.xml
Normal file
100
app/src/main/res/layout/include_plan_time_item_layout.xml
Normal file
@@ -0,0 +1,100 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
<LinearLayout
|
||||
android:id="@+id/linear_item"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="@dimen/dp_20"
|
||||
android:paddingHorizontal="@dimen/dp_20"
|
||||
android:orientation="vertical"
|
||||
android:background="@drawable/shape_water_plan_time_bg">
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:gravity="center_vertical">
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="14sp"
|
||||
android:textColor="@color/red"
|
||||
android:text="*"/>
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="@dimen/dp_4"
|
||||
android:textSize="14sp"
|
||||
android:textColor="@color/color_222222"
|
||||
android:text="@string/plan_start_time"
|
||||
android:layout_marginVertical="@dimen/dp_13"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_select_time"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="9"
|
||||
android:gravity="center_vertical"
|
||||
android:textSize="14sp"
|
||||
android:textColor="@color/color_222222"
|
||||
android:layout_marginLeft="@dimen/dp_10"
|
||||
android:hint="@string/select_water_time"/>
|
||||
|
||||
<ImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="@dimen/dp_24"
|
||||
android:layout_weight="0.5"
|
||||
android:src="@mipmap/icon_point_right_wt"/>
|
||||
</LinearLayout>
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dp"
|
||||
android:background="@color/color_d9d9d9"/>
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:gravity="center_vertical">
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="14sp"
|
||||
android:textColor="@color/red"
|
||||
android:text="*"/>
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="@dimen/dp_4"
|
||||
android:textSize="14sp"
|
||||
android:textColor="@color/color_222222"
|
||||
android:text="@string/plan_time"
|
||||
android:layout_marginVertical="@dimen/dp_13"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_plan_duration"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="9"
|
||||
android:gravity="center_vertical"
|
||||
android:textSize="14sp"
|
||||
android:textColor="@color/color_222222"
|
||||
android:layout_marginLeft="@dimen/dp_10"
|
||||
android:hint="@string/input_water_plan_time"/>
|
||||
<TextView
|
||||
android:id="@+id/tv_time_unit"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="2"
|
||||
android:gravity="center_vertical|right"
|
||||
android:textSize="14sp"
|
||||
android:textColor="@color/color_222222"
|
||||
android:layout_marginLeft="@dimen/dp_10"
|
||||
android:hint="min"/>
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
@@ -93,11 +93,9 @@
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/rv_devices"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_height="wrap_content"
|
||||
android:clipToPadding="false"
|
||||
android:paddingHorizontal="@dimen/dp_15"
|
||||
android:paddingBottom="@dimen/dp_20"
|
||||
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||
tools:listitem="@layout/index_device_list_item" />
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
layout="@layout/include_activity_back_whitebg_layout" />
|
||||
</RelativeLayout>
|
||||
<LinearLayout
|
||||
android:id="@+id/linear_info"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
|
||||
@@ -6,14 +6,20 @@
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
android:paddingBottom="@dimen/dp_20">
|
||||
<LinearLayout
|
||||
android:id="@+id/linear_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/rv_devices"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
tools:listitem="@layout/plan_bind_device_item"
|
||||
tools:itemCount="3"
|
||||
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"/>
|
||||
|
||||
<TextView
|
||||
@@ -29,4 +35,16 @@
|
||||
android:layout_marginTop="@dimen/dp_40"
|
||||
android:gravity="center"/>
|
||||
</LinearLayout>
|
||||
<RelativeLayout
|
||||
android:id="@+id/rel_noresult"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginTop="@dimen/dp_100"
|
||||
android:visibility="gone">
|
||||
<include
|
||||
android:id="@+id/included_noresult"
|
||||
layout="@layout/include_no_result_layout"/>
|
||||
</RelativeLayout>
|
||||
|
||||
</LinearLayout>
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
80
app/src/main/res/layout/plan_bound_device_item.xml
Normal file
80
app/src/main/res/layout/plan_bound_device_item.xml
Normal file
@@ -0,0 +1,80 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
<androidx.cardview.widget.CardView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="@dimen/dp_10"
|
||||
android:layout_marginVertical="@dimen/dp_5"
|
||||
app:cardCornerRadius="10dp"
|
||||
app:cardElevation="4dp">
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:gravity="center_vertical"
|
||||
android:paddingVertical="@dimen/dp_12">
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:orientation="vertical"
|
||||
android:paddingLeft="@dimen/dp_10">
|
||||
|
||||
<!-- 设备名称 -->
|
||||
<TextView
|
||||
android:id="@+id/tv_device_name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="智能浇水设备A1"
|
||||
android:textColor="@color/color_333333"
|
||||
android:textSize="17sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<!-- 设备序列号 -->
|
||||
<TextView
|
||||
android:id="@+id/tv_device_serial"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/dp_4"
|
||||
android:text="YA226641000107"
|
||||
android:textColor="@color/color_666666"
|
||||
android:textSize="12sp" />
|
||||
|
||||
<!-- 电量信息 -->
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/dp_8"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<View
|
||||
android:layout_width="@dimen/dp_4"
|
||||
android:layout_height="@dimen/dp_4"
|
||||
android:background="@drawable/shape_green_circle"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_battery_level"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/dp_4"
|
||||
android:text="已绑定"
|
||||
android:textColor="@color/color_666666"
|
||||
android:textSize="12sp" />
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
<ImageView
|
||||
android:id="@+id/img_delete"
|
||||
android:layout_width="@dimen/dp_24"
|
||||
android:layout_height="@dimen/dp_24"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_marginRight="@dimen/dp_20"
|
||||
android:src="@mipmap/icon_delete"/>
|
||||
</LinearLayout>
|
||||
</androidx.cardview.widget.CardView>
|
||||
</LinearLayout>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user