注销账号

This commit is contained in:
fengjignqi
2026-07-08 14:15:21 +08:00
parent 1cfc6f9d73
commit 79e51ad044
12 changed files with 205 additions and 40 deletions

View File

@@ -2,6 +2,8 @@ package com.ckkj.water.device;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import android.view.View;
@@ -28,8 +30,12 @@ import com.ckkj.water.utils.show.ToastUtil;
import com.gyf.immersionbar.ImmersionBar;
import com.lxj.xpopup.XPopup;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import de.greenrobot.event.Subscribe;
import de.greenrobot.event.ThreadMode;
@@ -46,6 +52,16 @@ public class DeviceControlActivity extends BaseActivity<DeviceControlLayoutBindi
private DeviceTimeSelectAdapter mAdapter;
//用户自定义的浇水时长
private int mCustomDuration = 0;
private final Handler mProgressHandler = new Handler(Looper.getMainLooper());
private long mWorkStartTime = 0L;
private long mWorkEndTime = 0L;
private boolean mHasRefreshAfterWorkFinished = false;
private final Runnable mWorkProgressRunnable = new Runnable() {
@Override
public void run() {
updateWorkProgress();
}
};
@Override
public DevicePresenter createPresenter() {
return new DevicePresenter(new DeviceImpl());
@@ -124,6 +140,8 @@ public class DeviceControlActivity extends BaseActivity<DeviceControlLayoutBindi
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));
stopWorkProgressUpdate();
updateProgressView(0);
}
viewBinding.linearWifi.setBackground(mContext.getResources().getDrawable(R.drawable.shape_device_ctrl_green_cor12));
viewBinding.imgWifiLogo.setImageResource(R.mipmap.icon_ctrl_wifi_white);
@@ -135,6 +153,8 @@ public class DeviceControlActivity extends BaseActivity<DeviceControlLayoutBindi
viewBinding.tvConfirm.setBackgroundResource((R.drawable.shape_gray_button_bg_enable));
viewBinding.linearWifi.setBackground(mContext.getResources().getDrawable(R.drawable.shape_device_ctrl_white_cor12));
viewBinding.imgWifiLogo.setImageResource(R.mipmap.icon_ctrl_wifi_green);
stopWorkProgressUpdate();
updateProgressView(0);
}
}
@@ -384,9 +404,12 @@ public class DeviceControlActivity extends BaseActivity<DeviceControlLayoutBindi
if(status.equals("0")){
showCenterTipDialog(R.mipmap.icon_dialog_success,getString(R.string.end_watering));
viewBinding.tvConfirm.setText(getString(R.string.start_watering));
stopWorkProgressUpdate();
updateProgressView(0);
}else{
showCenterTipDialog(R.mipmap.icon_dialog_success,getString(R.string.start_watering));
viewBinding.tvConfirm.setText(getString(R.string.end_watering));
mPresenter.getDeviceWorkProgress(mDeviceEntity.getDeviceNo());
}
//开关设备之后,更新一下当前设备状态
mPresenter.getDeviceDetailInfo(mDeviceEntity.getDeviceNo());
@@ -411,6 +434,22 @@ public class DeviceControlActivity extends BaseActivity<DeviceControlLayoutBindi
*/
@Override
public void queryDeviceWorkTimeSuccess(WaterDeviceEntity bean) {
if (bean == null || TextUtils.isEmpty(bean.getStartTime()) || TextUtils.isEmpty(bean.getEndTime())) {
stopWorkProgressUpdate();
updateProgressView(0);
return;
}
mWorkStartTime = parseWorkTime(bean.getStartTime());
mWorkEndTime = parseWorkTime(bean.getEndTime());
mHasRefreshAfterWorkFinished = false;
if (mWorkStartTime <= 0 || mWorkEndTime <= mWorkStartTime) {
stopWorkProgressUpdate();
updateProgressView(0);
return;
}
updateWorkProgress();
//"startTime": "2026-07-06 16:35:00",
//"endTime": "2026-07-06 16:37:00"
@@ -420,6 +459,65 @@ public class DeviceControlActivity extends BaseActivity<DeviceControlLayoutBindi
}
private long parseWorkTime(String time) {
try {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA);
Date date = format.parse(time);
return date == null ? 0L : date.getTime();
} catch (ParseException e) {
e.printStackTrace();
}
return 0L;
}
private void updateWorkProgress() {
long now = System.currentTimeMillis();
int progress;
if (now <= mWorkStartTime) {
progress = 0;
} else if (now >= mWorkEndTime) {
progress = 100;
} else {
progress = (int) ((now - mWorkStartTime) * 100 / (mWorkEndTime - mWorkStartTime));
}
updateProgressView(progress);
mProgressHandler.removeCallbacks(mWorkProgressRunnable);
if (progress < 100 && mDeviceEntity != null && "1".equals(mDeviceEntity.getWorkStatus())) {
mProgressHandler.postDelayed(mWorkProgressRunnable, 1000);
} else if (progress >= 100 && !mHasRefreshAfterWorkFinished
&& mDeviceEntity != null && !TextUtils.isEmpty(mDeviceEntity.getDeviceNo())) {
mHasRefreshAfterWorkFinished = true;
ToastUtil.showShort(mContext,"任务结束");
showLoadingDialog();
mProgressHandler.postDelayed(new Runnable() {
@Override
public void run() {
if (mDeviceEntity != null && !TextUtils.isEmpty(mDeviceEntity.getDeviceNo())) {
mPresenter.getDeviceDetailInfo(mDeviceEntity.getDeviceNo());
}
}
}, 1500);
}
}
private void updateProgressView(int progress) {
viewBinding.progressWork.setProgress(progress);
viewBinding.tvProgressPercent.setText(getString(R.string.device_work_progress_title) + progress + "%");
}
private void stopWorkProgressUpdate() {
mProgressHandler.removeCallbacksAndMessages(null);
mWorkStartTime = 0L;
mWorkEndTime = 0L;
}
@Override
protected void onDestroy() {
stopWorkProgressUpdate();
super.onDestroy();
}
@Override
public void logOut(BaseBean bean) {

View File

@@ -334,7 +334,7 @@ public class LoginActivity extends BaseActivity<LoginLayoutBinding, LoginPresent
}
}
private CountDownTimer cdTimer = new CountDownTimer(6000, 1000) {
private CountDownTimer cdTimer = new CountDownTimer(60000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
viewBinding.tvGetVerifiCode.setText("(" + millisUntilFinished / 1000 + ") " + getString(R.string.login_resend));
@@ -387,8 +387,8 @@ public class LoginActivity extends BaseActivity<LoginLayoutBinding, LoginPresent
@Override
public void getPhoneCodeSuccess(BaseBean bean) {
hideDialogLoading();
ToastUtil.showLong(mContext, getString(R.string.login_code_sent) + ":" + bean.getDataString());
// cdTimer.start();
ToastUtil.showLong(mContext, getString(R.string.login_code_sent));
cdTimer.start();
}
@Override

View File

@@ -88,7 +88,6 @@ public class RegisterActivity extends BaseActivity<RegisterLayoutBinding, LoginP
}
//发送短信
mPresenter.getPhoneCode(viewBinding.etAccount.getText().toString(),"");
// cdTimer.start();
break;
case R.id.tv_commit:
@@ -145,7 +144,7 @@ public class RegisterActivity extends BaseActivity<RegisterLayoutBinding, LoginP
}
private CountDownTimer cdTimer = new CountDownTimer(6000, 1000) {
private CountDownTimer cdTimer = new CountDownTimer(60000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
viewBinding.tvGetVerifiCode.setText("(" + millisUntilFinished / 1000 + ") " + getString(R.string.login_resend));
@@ -187,13 +186,19 @@ public class RegisterActivity extends BaseActivity<RegisterLayoutBinding, LoginP
@Override
public void registerSuccess(BaseBean bean) {
hideDialogLoading();
ToastUtil.showShort(mContext,"注册成功");
ToastUtil.showShort(mContext,getString(R.string.register_success_title));
finish();
}
/**
* 获取验证码成功
* @param bean
*/
@Override
public void getPhoneCodeSuccess(BaseBean bean) {
hideDialogLoading();
ToastUtil.showShort(mContext,getString(R.string.verification_code_sent));
cdTimer.start();
}
@Override

View File

@@ -33,7 +33,7 @@ public class LoginContract {
//注销账号--发送验证码
void logoffAccountCode(Map<String,Object> map, CallBack callBack);
//注销账号--确认注销
void logoffAccount(Map<String,String> map, CallBack callBack);
void logoffAccount(JSONObject json, CallBack callBack);
}
public interface LoginView extends IView{

View File

@@ -148,13 +148,13 @@ public class LoginImpl implements LoginContract.DataModel {
/**
* 注销账号--确认
* @param map
* @param json
* @param callBack
*/
@Override
public void logoffAccount(Map<String,String> map, LoginContract.CallBack callBack) {
public void logoffAccount(JSONObject json, LoginContract.CallBack callBack) {
try {
NetWorkManager.getRequest().confirmLogiffAccount(NetWorkManager.getToken(), map)
NetWorkManager.getRequest().confirmLogiffAccount(NetWorkManager.getToken(), NetWorkManager.toRequestBody(json))
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())

View File

@@ -122,7 +122,7 @@ public class SettingsActivity extends BaseActivity<ActivitySettingsLayoutBinding
@Override
public void run() {
hideDialogLoading();
ToastUtil.showShort(mContext,"缓存清除成功");
ToastUtil.showShort(mContext,getString(R.string.cache_cleared_success));
displayCacheSize();
}
},800);
@@ -255,13 +255,17 @@ public class SettingsActivity extends BaseActivity<ActivitySettingsLayoutBinding
public void callBackGetPermisson(String permission) {
if (!hasRecordPermission(permission)) {
if (Manifest.permission.POST_NOTIFICATIONS.equals(permission)) {
getPermissionRequst(permission,"通知权限申请",
"渥田氏需要通知权限来显示应用下载进度",POST_NOTIFICATIONS_PERMISSION_CODE);
getPermissionRequst(permission,
getString(R.string.notification_permission_request),
getString(R.string.notification_permission_desc),
POST_NOTIFICATIONS_PERMISSION_CODE);
return;
}
// 没有权限只在ACTION_DOWN时去申请
getPermissionRequst(permission,"文件存储权限申请",
"渥田氏需要您的授权,获取存储权限来更新您的应用",WRITE_FILE_PERMISSON_CPDE);
getPermissionRequst(permission,
getString(R.string.storage_permission_request),
getString(R.string.storage_permission_desc),
WRITE_FILE_PERMISSON_CPDE);
}else{
@@ -273,7 +277,7 @@ public class SettingsActivity extends BaseActivity<ActivitySettingsLayoutBinding
runOnUiThread(new Runnable() {
@Override
public void run() {
ToastUtil.showShort(mContext,"下载完成,正在安装");
ToastUtil.showShort(mContext,getString(R.string.download_complete_installing));
}
});
}

View File

@@ -50,7 +50,7 @@ public class UserLogOffAccountActivity extends BaseActivity<UserLogOffActivityBi
.statusBarDarkFont(true) // 设置状态栏字体为黑色
.titleBar(viewBinding.rlTitle)
.init();
viewBinding.includeTitle.tvTitle.setText("注销账号");
viewBinding.includeTitle.tvTitle.setText(getString(R.string.delete_account));
viewBinding.includeTitle.imgBack.setOnClickListener(c -> finish());
if(AppConfig.USER_LOGIN){
String userAccount = (!TextUtils.isEmpty(WaterUserInfoManager.getInstance().getUserInfo().getUser().getPhonenumber()) ?
@@ -95,7 +95,7 @@ public class UserLogOffAccountActivity extends BaseActivity<UserLogOffActivityBi
}
showDialogtext(null, false, false, true,
getString(R.string.tip_text),
"该操作将会注销此账号",
getString(R.string.delete_account_tip),
getString(R.string.cancel_text),
getString(R.string.confirm_text),
new BaseFragment.OnDialogClick() {
@@ -120,7 +120,7 @@ public class UserLogOffAccountActivity extends BaseActivity<UserLogOffActivityBi
@Override
public void getAccountLogoffCodeSuccess(BaseBean bean) {
hideDialogLoading();
ToastUtil.showShort(mContext,"验证码已发送至该账户");
ToastUtil.showShort(mContext,getString(R.string.verification_code_sent));
}
/**
@@ -138,7 +138,7 @@ public class UserLogOffAccountActivity extends BaseActivity<UserLogOffActivityBi
private CountDownTimer cdTimer = new CountDownTimer(60000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
viewBinding.tvGetCode.setText("(" + millisUntilFinished / 1000 + ")秒后重发");
viewBinding.tvGetCode.setText("(" + millisUntilFinished / 1000 + ")" + getString(R.string.resend_after_seconds));
viewBinding.tvGetCode.setSelected(true);
viewBinding.tvGetCode.setClickable(false);
viewBinding.tvGetCode.setTextColor(mContext.getColor(R.color.color_c8c8c8));
@@ -146,7 +146,7 @@ public class UserLogOffAccountActivity extends BaseActivity<UserLogOffActivityBi
@Override
public void onFinish() {
viewBinding.tvGetCode.setText("重新发送");
viewBinding.tvGetCode.setText(getString(R.string.resend));
viewBinding.tvGetCode.setSelected(false);
viewBinding.tvGetCode.setClickable(true);
viewBinding.tvGetCode.setTextColor(mContext.getColor(R.color.color_zhu));

View File

@@ -222,22 +222,28 @@ public class MinePresenter extends BasePresenter<MineContract.MineView> {
* @param verCode
*/
public void confirmAccountLogoff(String verCode) {
Map<String,String> map = new HashMap<>();
map.put("code",verCode);
new LoginImpl().logoffAccount(map, new LoginContract.CallBack<BaseBean>() {
@Override
public void success(BaseBean bean) {
if(MinePresenter.this.getView() != null){
MinePresenter.this.getView().confirmAccountLogoffCodeSuccess(bean);
try {
Map<String,String> map = new HashMap<>();
map.put("code",verCode);
JSONObject json = new JSONObject();
json.put("code",verCode);
new LoginImpl().logoffAccount(json, new LoginContract.CallBack<BaseBean>() {
@Override
public void success(BaseBean bean) {
if(MinePresenter.this.getView() != null){
MinePresenter.this.getView().confirmAccountLogoffCodeSuccess(bean);
}
}
}
@Override
public void fail(String msg) {
if(MinePresenter.this.getView() != null){
MinePresenter.this.getView().showError(msg);
@Override
public void fail(String msg) {
if(MinePresenter.this.getView() != null){
MinePresenter.this.getView().showError(msg);
}
}
}
});
});
} catch (JSONException e) {
throw new RuntimeException(e);
}
}
}

View File

@@ -19,6 +19,7 @@ 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.Multipart;
import retrofit2.http.POST;
@@ -41,9 +42,9 @@ public interface Request {
@GET("resource/account/cancel/code")
Observable<BaseBean> logoffAccountCode(@HeaderMap Map<String, String> headMap);
//排程解绑设备
@DELETE("app/v1/account")
Observable<BaseBean> confirmLogiffAccount(@HeaderMap Map<String,String> headMap,@QueryMap Map<String, String> map);
//注销账户
@HTTP(method = "DELETE", path = "auth/account", hasBody = true)
Observable<BaseBean> confirmLogiffAccount(@HeaderMap Map<String,String> headMap,@Body RequestBody requestBody);
//注册

View File

@@ -115,10 +115,11 @@
android:orientation="horizontal"
android:gravity="center_vertical">
<TextView
android:id="@+id/tv_progress_percent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginVertical="@dimen/dp_2"
android:textSize="14sp"
android:textStyle="bold"
android:textColor="@color/textPrimaryColor"
android:text="@string/device_work_progress_title"
android:layout_marginLeft="@dimen/dp_30"/>

View File

@@ -267,6 +267,31 @@
<string name="user_agreement_mine">User Agreement</string>
<string name="cache_cleared_success">Cache cleared successfully</string>
<string name="notification_permission_request">Notification Permission Request</string>
<string name="notification_permission_desc">Notification permission is required to display the app download progress.</string>
<string name="storage_permission_request">Storage Permission Request</string>
<string name="storage_permission_desc">Storage permission is required to update your application.</string>
<string name="download_complete_installing">Download complete, installing...</string>
<string name="delete_account">Delete Account</string>
<string name="delete_account_tip">This action will permanently delete this account.</string>
<string name="verification_code_sent">The verification code has been sent to this account.</string>
<string name="resend_after_seconds">Resend in seconds</string>
<string name="resend">Resend</string>
<!-- End -->

View File

@@ -251,6 +251,31 @@
<string name="no_more_data">已经到底了</string>
<string name="cache_cleared_success">缓存清除成功</string>
<string name="notification_permission_request">通知权限申请</string>
<string name="notification_permission_desc">需要通知权限来显示应用下载进度</string>
<string name="storage_permission_request">文件存储权限申请</string>
<string name="storage_permission_desc">需要您的授权,获取存储权限来更新您的应用</string>
<string name="download_complete_installing">下载完成,正在安装</string>
<string name="delete_account">注销账号</string>
<string name="delete_account_tip">该操作将会注销此账号</string>
<string name="verification_code_sent">验证码已发送至该账户</string>
<string name="resend_after_seconds">秒后重发</string>
<string name="resend">重新发送</string>
<!--结束-->