电池电量icon优化

This commit is contained in:
fengjignqi
2026-06-02 13:58:54 +08:00
parent b7ab2e69a4
commit 03e67932b1
49 changed files with 293 additions and 19 deletions

View File

@@ -56,9 +56,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 +111,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"

View File

@@ -22,6 +22,7 @@ import com.ckkj.water.device.mvp.DevicePresenter;
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;
@@ -40,6 +41,7 @@ public class DeviceControlActivity extends BaseActivity<DeviceControlLayoutBindi
private List<String> mTimeList = new ArrayList<>();
private WaterDeviceEntity mDeviceEntity;
private WaterDeviceEntity mRemoteDeviceEntity;
private DeviceTimeSelectAdapter mAdapter;
//用户自定义的浇水时长
private int mCustomDuration = 0;
@@ -58,6 +60,15 @@ public class DeviceControlActivity extends BaseActivity<DeviceControlLayoutBindi
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");
@@ -139,7 +150,9 @@ 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;
@@ -271,7 +284,9 @@ public class DeviceControlActivity extends BaseActivity<DeviceControlLayoutBindi
@Override
public void getDeviceDetailInfo(WaterDeviceEntity bean) {
hideDialogLoading();
viewBinding.imgBatStatus.setImageResource(PowerIconManage.getInstance().
getPowerVerIcon(Integer.parseInt(bean.getPowerLevel())));
mRemoteDeviceEntity = bean;
}
@Override

View File

@@ -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;
@@ -15,6 +16,7 @@ import com.ckkj.water.custom.view.CustomRefreshHeader;
import com.ckkj.water.databinding.IndexFragmentLayoutBinding;
import com.ckkj.water.device.AddDeviceActivity;
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.WaterDeviceEntity;
import com.ckkj.water.index.mvp.IndexContract;
@@ -155,7 +157,6 @@ public class IndexFragment extends BaseFragment<IndexFragmentLayoutBinding, Inde
*/
@Override
public void getDeviceListSuccess(List<WaterDeviceEntity> list, int total) {
hideDialogLoading();
List<WaterDeviceEntity> pageList = list == null ? new ArrayList<>() : list;
if (mCurrentPage == 1) {

View File

@@ -1,6 +1,8 @@
package com.ckkj.water.index.adapter;
import android.content.Context;
import android.view.View;
import android.widget.ImageView;
import androidx.annotation.Nullable;
@@ -8,6 +10,8 @@ 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.utils.manager.PowerIconManage;
import com.esafirm.imagepicker.model.Image;
import java.util.List;
@@ -21,10 +25,21 @@ public class DeviceAdapter extends BaseQuickAdapter<WaterDeviceEntity, BaseViewH
@Override
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())));
}

View File

@@ -34,7 +34,8 @@ public class WaterDeviceEntity 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;
@@ -55,7 +56,7 @@ public class WaterDeviceEntity implements Serializable {
private Object deviceImg;
private String status;
private String workStatus;
private Object powerLevel;
private String powerLevel;
private Object powerLevelUpdatatime;
private String wifiName;
private String wifiPassword;

View File

@@ -29,6 +29,8 @@ public class LoginContract {
void loginBySmsCode(JSONObject json, CallBack callBack);
//通过账户+验证码 修改密码
void updatePsdByVerifyCode(JSONObject json, CallBack callBack);
//退出登录
void logout(JSONObject json, CallBack callBack);
}
public interface LoginView extends IView{

View File

@@ -105,6 +105,11 @@ public class LoginImpl implements LoginContract.DataModel {
}
}
/**
* 使用验证码登录
* @param json
* @param callBack
*/
@Override
public void loginBySmsCode(JSONObject json, LoginContract.CallBack callBack) {
try {
@@ -181,4 +186,44 @@ public class LoginImpl implements LoginContract.DataModel {
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();
}
}
}

View File

@@ -112,4 +112,9 @@ public class AppThemActivity extends BaseActivity<AppThemeChangeLayoutBinding, M
public void updateUserPasswordSuccess(BaseBean bean) {
}
@Override
public void logOutSuccess(BaseBean bean) {
}
}

View File

@@ -146,4 +146,9 @@ public class ChangePhoneActivity extends BaseActivity<ChangePhoneActivityBinding
public void updateUserPasswordSuccess(BaseBean bean) {
}
@Override
public void logOutSuccess(BaseBean bean) {
}
}

View File

@@ -13,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;
@@ -20,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;
@@ -30,6 +32,8 @@ import com.lxj.xpopup.interfaces.OnSelectListener;
import java.util.List;
import de.greenrobot.event.EventBus;
/**
* @author fengxiaoyang
* @date 2026/5/16
@@ -63,6 +67,7 @@ public class MineCenterFragment extends BaseFragment<MineFragmentLayoutBinding,
setClick(viewBinding.linearLanguage);
setClick(viewBinding.linearPsdManage);
setClick(viewBinding.linearTheme);
setClick(viewBinding.btnDelete);
}
private void setClick(View view) {
@@ -105,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;
}
}
@@ -125,7 +150,17 @@ public class MineCenterFragment extends BaseFragment<MineFragmentLayoutBinding,
}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
@@ -138,6 +173,8 @@ public class MineCenterFragment extends BaseFragment<MineFragmentLayoutBinding,
}
@Override
public MinePresenter createPresenter() {
return new MinePresenter(new MineImpl());

View File

@@ -276,4 +276,9 @@ public class MineFragment extends BaseFragment<MineFragmentBinding, MinePresente
public void updateUserPasswordSuccess(BaseBean bean) {
}
@Override
public void logOutSuccess(BaseBean bean) {
}
}

View File

@@ -184,6 +184,11 @@ public class MineInfomationActivity extends BaseActivity<MineInformationLayoutBi
}
@Override
public void logOutSuccess(BaseBean bean) {
}
private void getCompressFile(File file) {
LubanCompressUtil.getInstance().getCompressFile(mContext, file, new LubanCompressUtil.CompressCallback() {

View File

@@ -95,4 +95,9 @@ public class PsdManageActivity extends BaseActivity<PasswordManLayoutBinding, Mi
public void updateUserPasswordSuccess(BaseBean bean) {
}
@Override
public void logOutSuccess(BaseBean bean) {
}
}

View File

@@ -90,6 +90,11 @@ public class ResetPsdActivity extends BaseActivity<ResetPsdLayoutBinding, MinePr
finish();
}
@Override
public void logOutSuccess(BaseBean bean) {
}
@Override
public MinePresenter createPresenter() {
return new MinePresenter(new MineImpl());

View File

@@ -216,4 +216,9 @@ public class SettingsActivity extends BaseActivity<ActivitySettingsLayoutBinding
public void updateUserPasswordSuccess(BaseBean bean) {
}
@Override
public void logOutSuccess(BaseBean bean) {
}
}

View File

@@ -126,4 +126,9 @@ public class UserLogOffAccountActivity extends BaseActivity<UserLogOffActivityBi
public void updateUserPasswordSuccess(BaseBean bean) {
}
@Override
public void logOutSuccess(BaseBean bean) {
}
}

View File

@@ -45,6 +45,8 @@ public class MineContract {
void updateUserInfoSuccess(BaseBean bean);
//密码重设完成
void updateUserPasswordSuccess(BaseBean bean);
//退出登录
void logOutSuccess(BaseBean bean);
}
public interface RecommendModel{

View File

@@ -7,6 +7,8 @@ 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;
@@ -111,4 +113,26 @@ public class MinePresenter extends BasePresenter<MineContract.MineView> {
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);
}
}
});
}
}

View File

@@ -38,6 +38,11 @@ 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);

View File

@@ -200,6 +200,13 @@ public class PlanDetailActivity extends BaseActivity<WaterPlanDetailLayoutBindin
//设备显示
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);
}
}
}

View File

@@ -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对应索引111~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对应索引111~20对应索引2...
int index = (power + 9) / 10;
return verIconRes[index];
}
}

View File

@@ -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>

View 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>

View File

@@ -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" />

View File

@@ -110,7 +110,17 @@
android:layout_height="wrap_content"
tools:listitem="@layout/plan_detail_bind_device_item"
tools:itemCount="2"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"/>
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
android:visibility="visible"/>
<TextView
android:id="@+id/tv_no_device"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="@string/no_bound_devices_tips"
android:textColor="@color/color_999999"
android:textSize="16sp"
android:visibility="gone"/>
</LinearLayout>
</LinearLayout>
@@ -118,7 +128,8 @@
<View
android:layout_width="match_parent"
android:layout_height="@dimen/dp_1"
android:background="@color/color_f5f5f5" />
android:background="@color/color_f5f5f5"
android:layout_marginTop="@dimen/dp_20"/>
<RelativeLayout
android:layout_width="match_parent"

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 570 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 577 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 580 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 598 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 587 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 580 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 583 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 581 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 577 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 580 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 585 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 569 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 578 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 594 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 586 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 601 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 594 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 595 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 595 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 590 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 593 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 598 B

View File

@@ -83,6 +83,8 @@
<string name="device_info_type">设备型号</string>
<string name="device_info_serial_number">序列号</string>
<string name="device_info_firmware_version">固件版本</string>
<string name="device_status_working">工作中</string>
<string name="device_status_not_working">待机中</string>
<!--排程-->
@@ -101,6 +103,7 @@
<string name="delete_plan_tip">确定要删除该排程任务?</string>
<string name="delete_plan_success">删除成功</string>
<string name="close_plan_dialog_tip">确定关闭该排程任务?</string>
<string name="no_bound_devices_tips">暂无绑定设备</string>
<string name="plan_period">浇水周期</string>
<string name="plan_time">浇水时长</string>
<string name="plan_start_time">开始时间</string>
@@ -152,6 +155,7 @@
<string name="mine_psd_manager">密码管理</string>
<string name="mine_psd_reset">重置密码</string>
<string name="mine_find_psd">找回密码</string>
<string name="logout_tips">退出当前账号</string>