void RequestStopConfirm(int16_t fromView);
void StartMeasureFlow(BPMainView *mainView);
void StartCalibrationFlow(BPMainView *mainView, uint8_t round);
+ bool BlockIfBatteryTooLow();
void StartProgressSession(BPProgressMode mode);
void PauseProgressSession();
void ResumeProgressSession();
#include "bloodpressure/include/BPValueInputView.h"
#include "bloodpressure/include/BPModel.h"
#include "bloodpressure/include/BPViewClickIds.h"
+#include "health/HealthMeasureBattery.h"
#include "bloodpressure/include/BPCalibStopView.h"
#include "bloodpressure/include/BPMeasuringView.h"
#include "bloodpressure/include/BPAbnormalView.h"
}
/** 开始测量流程 */
+bool BPMainPresenter::BlockIfBatteryTooLow() {
+ if (!IsBatteryTooLowForMeasure()) {
+ return false;
+ }
+ ShowHealthMeasureLowBatteryNotify();
+ return true;
+}
+
void BPMainPresenter::StartMeasureFlow(BPMainView *mainView) {
+ if (BlockIfBatteryTooLow()) {
+ return;
+ }
int16_t hide = mainView->GetCurrentViewId();
mainView->ChangeView(hide, BP_MEASURING_VIEW);
StartProgressSession(BPProgressMode::Measure);
/** 开始校准流程 */
void BPMainPresenter::StartCalibrationFlow(BPMainView *mainView, uint8_t round) {
+ if (BlockIfBatteryTooLow()) {
+ return;
+ }
BPModel *model = BPModel::GetInstance();
model->SetCalibrationRound(round);
model->ResetInputValues();
}
/** 处理值确认事件 */
if (viewId == BP_CLICK_VALUE_CONFIRM) {
+ if (BlockIfBatteryTooLow()) {
+ return true;
+ }
if (model->GetInputSbp() > model->GetInputDbp()) {
mainView->ChangeView(BP_VALUE_CONFIRM_VIEW, BP_CALIBRATING_VIEW);
StartProgressSession(BPProgressMode::Calibrate);
if (viewId == BP_CLICK_RETRY) {
if (current == BP_ABNORMAL_VIEW) {
if (lastTimeoutMode_ == BPProgressMode::Calibrate) {
+ if (BlockIfBatteryTooLow()) {
+ return true;
+ }
mainView->ChangeView(BP_ABNORMAL_VIEW, BP_CALIBRATING_VIEW);
StartProgressSession(BPProgressMode::Calibrate);
} else {
bool HandleSwipeBack();
bool IsFlowSubPage(int16_t viewId) const;
void StartMeasureFlow(ECGMainView *mainView);
+ bool BlockIfBatteryTooLow();
void ShowWaitContact(ECGMainView *mainView);
void ShowContactGood(ECGMainView *mainView);
bool IsWaitingContact(ECGMainView *mainView) const;
#include "ecg/include/ECGMeasureCompleteView.h"
#include "ecg/include/ECGModel.h"
#include "ecg/include/ECGViewClickIds.h"
+#include "health/HealthMeasureBattery.h"
#include "NativeRegisterManager.h"
#include "NativeAbility.h"
#include "UiConfig.h"
}
void ECGMainPresenter::StartMeasureFlow(ECGMainView *mainView) {
+ if (BlockIfBatteryTooLow()) {
+ return;
+ }
ShowWaitContact(mainView);
StartMeasureTimer();
}
+bool ECGMainPresenter::BlockIfBatteryTooLow() {
+ if (!IsBatteryTooLowForMeasure()) {
+ return false;
+ }
+ ShowHealthMeasureLowBatteryNotify();
+ return true;
+}
+
void ECGMainPresenter::FinishMeasuringFlow(ECGMainView *mainView) {
if (measureDataReceived_ == false) {
return;
--- /dev/null
+#include "health/HealthMeasureBattery.h"
+
+#include "broadcast_feature.h"
+#include "custom_utils.h"
+#include "graphic_service.h"
+#include "msg_center.h"
+#include "notification_manager.h"
+#include "notify/charge_notification.h"
+
+#ifdef SUPPORT_BATTERY_SERVICE
+#include "battery_hal.h"
+#endif
+
+namespace OHOS {
+
+namespace {
+
+UIViewGroup *CreateHealthMeasureLowPowerNotifyView() { return lowPowerShow(); }
+
+void ShowHealthMeasureLowBatteryNotifyImpl() {
+ uapi_set_screen_on_api();
+ set_lowpower_falg(0);
+ NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
+ NotificationManager::GetInstance()->ShowNotify(
+ CreateHealthMeasureLowPowerNotifyView, TOPIC_EVENT_LOWPOWER_ALARM, true);
+}
+
+} // namespace
+
+bool IsBatteryTooLowForMeasure() {
+#ifdef SUPPORT_BATTERY_SERVICE
+ float voltage = 0.0f;
+ int percent = battery_get_voltage(&voltage);
+ return percent < kHealthMeasureMinBatteryPercent;
+#else
+ return false;
+#endif
+}
+
+void ShowHealthMeasureLowBatteryNotify() {
+ // 推迟到下一帧 UI 线程,避免在按钮 OnClick 栈里同步建 Notify 造成点击卡顿
+ GraphicService::GetInstance()->PostGraphicEvent(ShowHealthMeasureLowBatteryNotifyImpl);
+}
+
+} // namespace OHOS
--- /dev/null
+#ifndef HEALTH_MEASURE_BATTERY_H
+#define HEALTH_MEASURE_BATTERY_H
+
+namespace OHOS {
+
+static constexpr int kHealthMeasureMinBatteryPercent = 80;
+
+/** 电量低于 10% 时不允许开始测量/校准 */
+bool IsBatteryTooLowForMeasure();
+
+/** 复用系统低电量充电提醒弹窗(charge_notification::lowPowerShow) */
+void ShowHealthMeasureLowBatteryNotify();
+
+} // namespace OHOS
+
+#endif
UIViewGroup_lowpower->SetTouchable(true);
alarm_labelbutton->SetTouchable(true);
- ShowUpShutDownAnimatorView();
- if (group)
- UIViewGroup_lowpower->Add(group);
- if (battery_falg >= 3)
- {
- group->SetVisible(true);
- ShutDownImageAnimatorView->Start();
- ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON); // 关机动画已经开始了不能息屏
+ // 充电提醒(flag=0)不需要关机动画资源,避免同步加载 30 帧导致卡顿
+ if (battery_falg != 0) {
+ ShowUpShutDownAnimatorView();
+ if (group)
+ UIViewGroup_lowpower->Add(group);
+ if (battery_falg >= 3)
+ {
+ group->SetVisible(true);
+ ShutDownImageAnimatorView->Start();
+ ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON); // 关机动画已经开始了不能息屏
+ }
}
NotificationManager::GetInstance()->RegisterNotifyCleanupFunction(FreelowPower);
return UIViewGroup_lowpower;