diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/PhoneReplacementActivity.java b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/PhoneReplacementActivity.java index 16aac968..89682fc0 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/PhoneReplacementActivity.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/PhoneReplacementActivity.java @@ -13,10 +13,17 @@ import com.hjq.toast.ToastUtils; import com.xscm.modulemain.activity.user.conacts.PhoneReplacementConacts; import com.xscm.modulemain.activity.user.presenter.PhoneReplacementPresenter; import com.xscm.modulemain.BaseMvpActivity; +import com.xscm.modulemain.utils.CountDownManager; import com.xscm.moduleutil.base.CommonAppContext; import com.xscm.moduleutil.color.ThemeableDrawableUtils; import com.xscm.moduleutil.utils.ColorManager; import com.xscm.moduleutil.utils.SpUtil; +import com.xscm.moduleutil.utils.TimeUtils; +import com.xscm.moduleutil.utils.TimerManager; + +import java.util.concurrent.TimeUnit; + +import kotlin.Unit; /** * @author @@ -24,7 +31,7 @@ import com.xscm.moduleutil.utils.SpUtil; * @description: 手机换绑 */ public class PhoneReplacementActivity extends BaseMvpActivity implements PhoneReplacementConacts.View { - private CountDownTimer mTimer; + private CountDownManager countDownManager; private String mobile; private String type;//1:更换手机 2:绑定手机 @@ -86,9 +93,9 @@ public class PhoneReplacementActivity extends BaseMvpActivity { + // 倒计时进行中 + if (textView != null) { + textView.setText(String.format("重新发送(%s)", remainingSeconds)); + } + return null; + }, + tagParam -> { + // 倒计时结束 + if (textView != null) { + textView.setAlpha(1f); + textView.setEnabled(true); + textView.setText("重新发送"); + } + return null; } - }; - mTimer.start(); + ); } private void releaseTimer() { - if (mTimer != null) { - mTimer.cancel(); - mTimer = null; + if (countDownManager != null) { + countDownManager.cancelAll(); } } @Override public void sendCodeSuccess1(String phoneNumber, TextView textView) { - sendCodeSuccess2(mBinding.edPhone.getText().toString(),textView); + sendCodeSuccess2(mBinding.edPhone.getText().toString(), textView); } @Override @@ -177,10 +194,10 @@ public class PhoneReplacementActivity extends BaseMvpActivity() + + // 单例模式 + companion object { + private var instance: CountDownManager? = null + + fun getInstance(): CountDownManager { + return instance ?: synchronized(this) { + instance ?: CountDownManager().also { instance = it } + } + } + } + + data class CountDownTask( + val tag: String, + val totalSeconds: Long, + val interval: Long = 1000L, + var currentTime: Long = 0L, + var isRunning: Boolean = false, + val onTick: ((Long, String) -> Unit)? = null, + val onFinish: ((String) -> Unit)? = null + ) + + // 开始倒计时 + fun startCountDown( + tag: String, + totalSeconds: Long, + interval: Long = 1000L, + onTick: ((Long, String) -> Unit)? = null, + onFinish: ((String) -> Unit)? = null + ) { + // 如果已有相同tag的倒计时,先取消 + cancelCountDown(tag) + + val task = CountDownTask(tag, totalSeconds, interval, totalSeconds, true, onTick, onFinish) + timerMap[tag] = task + + val handler = Handler(Looper.getMainLooper()) + val runnable = object : Runnable { + override fun run() { + val currentTask = timerMap[tag] + if (currentTask == null || !currentTask.isRunning) { + return + } + + currentTask.currentTime -= 1 + + if (currentTask.currentTime > 0) { + onTick?.invoke(currentTask.currentTime, tag) + handler.postDelayed(this, interval) + } else { + currentTask.isRunning = false + timerMap.remove(tag) + onFinish?.invoke(tag) + } + } + } + + handler.postDelayed(runnable, interval) + } + + // 获取剩余时间 + fun getRemainingTime(tag: String): Long { + return timerMap[tag]?.currentTime ?: 0L + } + + // 检查是否在倒计时中 + fun isCounting(tag: String): Boolean { + return timerMap[tag]?.isRunning ?: false + } + + // 取消单个倒计时 + fun cancelCountDown(tag: String) { + timerMap[tag]?.isRunning = false + timerMap.remove(tag) + } + + // 取消所有倒计时 + fun cancelAll() { + timerMap.values.forEach { it.isRunning = false } + timerMap.clear() + } + + // 暂停倒计时(保存状态) + fun pauseCountDown(tag: String) { + timerMap[tag]?.isRunning = false + } + + // 恢复倒计时 + fun resumeCountDown(tag: String) { + val task = timerMap[tag] ?: return + if (task.currentTime > 0) { + startCountDown( + tag, + task.currentTime, + task.interval, + task.onTick, + task.onFinish + ) + } + } +} \ No newline at end of file diff --git a/MainModule/src/main/res/layout/room_dialog_message_list.xml b/MainModule/src/main/res/layout/room_dialog_message_list.xml index bca0f494..f249f2ae 100644 --- a/MainModule/src/main/res/layout/room_dialog_message_list.xml +++ b/MainModule/src/main/res/layout/room_dialog_message_list.xml @@ -11,6 +11,7 @@ android:id="@+id/parent" android:layout_width="match_parent" android:layout_height="@dimen/dp_600" + android:background="@mipmap/activity_bj" >