#include "securec.h"\r
#include "cmsis_os2.h"\r
#ifdef SUPPORT_OHOSFWK\r
-#include "BluetoothWrapper.h"\r
+#include "bluetooth/BluetoothWrapper.h"\r
#endif\r
\r
/* Gatt service UUID */\r
${ROOT_DIR}/middleware/services/gui/uikit/surface/interfaces/kits
${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/innerkits
${ROOT_DIR}/middleware/services/gui/uikit/ui/frameworks
- ${ROOT_DIR}/application/wearable/nativeapp/nativeui/applist/include/
${ROOT_DIR}/open_source/openharmony/drivers/peripheral/display/interfaces/include
)
set(SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/src/Ability.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/AbilitySlice.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/NativeAbility.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/StartNative.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/transition/ZoomTransition.cpp
#ifndef NATIVEABILITYFWK_ABILITY_H
#define NATIVEABILITYFWK_ABILITY_H
#include <cstdint>
-#include "SliceProxy.h"
-#include "Slice.h"
#include "wearable_log.h"
#include "TransitionType.h"
#include "soc_osal.h"
#include "gfx_utils/vector.h"
#include "graphic_mutex.h"
+#include "Slice.h"
+#include "SliceProxy.h"
+#include "SlicePageManager.h"
namespace OHOS {
const static uint16_t gSliceInvalid = 0;
+const static uint16_t gPageInvalid = 0;
const static uint16_t gSliceDefaultPriority = 4; // 页面默认是最低优先级
+
class Ability {
public:
- void AddSliceProxy(const uint16_t sliceId, SliceProxy* proxy);
- void ChangeSlice(const uint16_t targetSliceId, TransitionType type = TransitionType::TRANSITION_INVALID,
- const uint16_t priority = gSliceDefaultPriority, bool enableSlideBack = false);
- void SetDefaultSliceId(const uint16_t defaultSliceId) {
- defaultSliceId_ = defaultSliceId;
+ void AddSliceProxy(uint16_t sliceId, SliceProxy* proxy);
+
+ /**
+ * @brief Switch to specified page in the current slice, matched page will be created, and current slice will not be
+ * recreated. if slices or pages is being switched, this operation will be canceled
+ * @param pageId Indicates the specified id of the page in the current slice, it should not be zero
+ * @param data Indicates the data which will be transfered to next page, default value is nullptr
+ * @param type Indicates Transition animation type, which is declared in TransitionType.h. The matched
+ * Transitioncallback should have params: enableCurrentSnapshot_ = false enableTargetSnapshot_ = false
+ * @param canBack Indicates whether current page should be cached and can be back from target page
+ * @return Returns <b>true</b> if the pages is switched successfully, returns <b>false</b> otherwise.
+ */
+ bool SwitchPageInSlice(uint16_t pageId, void* data = nullptr,
+ TransitionType type = TransitionType::TRANSITION_INVALID, bool canBack = false);
+
+ /**
+ * @brief Switch to specified slice. matched slice will be created.
+ * 1. If pageId is valid or default page is exist, matched page will also be created
+ * 2. If slices is being switched, this operation will be cached and run later.
+ * @param sliceId Indicates the specified id of the slice
+ * @param pageId Indicates the specified id of the slice, if pageId is invalid, default page will be used.
+ * @param type Indicates Transition animation type, which is declared in TransitionType.h
+ * @param enableSliceBack Indicates whether can return to current slice from target slice by sliding
+ */
+ void SwitchSlice(uint16_t sliceId, uint16_t pageId = gPageInvalid,
+ TransitionType type = TransitionType::TRANSITION_INVALID, bool enableSlideBack = false);
+
+ /**
+ * @brief Switch to specified slice. matched slice will be created.
+ * 1. If default page is exist, default page will also be created
+ * 2. If slices is being switched, this operation will be cached and run later.
+ * Note: Method SwitchSlice is recommended, this method is reserved for compatibility.
+ * @param sliceId Indicates the specified id of the slice
+ * @param type Indicates Transition animation type, which is declared in TransitionType.h
+ * @param priority Indicates the priority of slice, default value is used currently. if needed, config it in
+ * XXXPresenter::OnResume using method SetCurSlicePriority
+ * @param enableSliceBack Indicates whether can return to current slice from target slice by sliding
+ */
+ void ChangeSlice(uint16_t sliceId, TransitionType type = TransitionType::TRANSITION_INVALID,
+ uint16_t priority = gSliceDefaultPriority, bool enableSlideBack = false);
+
+ /**
+ * @brief Get SlicePageManager of currrent slice. you can Use SlicePageManager to get page info in the slice.
+ * @return Returns <b>nullptr</b> if slices is being switched, or js ability is running
+ */
+ SlicePageManager* GetCurSlicePageManager();
+
+ void SetDefaultSliceId(uint16_t defaultSliceId, uint16_t pageId = gPageInvalid)
+ {
+ defaultTargetId_ = defaultSliceId | (static_cast<uint32_t>(pageId) << PAGE_OFFSET);
}
- uint16_t GetCurSliceId(void) {
+
+ /**
+ * @brief Get current slice id
+ * @return Returns <b>0</b> if js ability is running, detail refer to comments of variable allSlices_
+ */
+ uint16_t GetCurSliceId(void)
+ {
+ if (allSlices_.IsEmpty()) {
+ return gSliceInvalid;
+ }
+ return static_cast<uint16_t>(allSlices_[allSlices_.Size() - 1] & SLICE_MASK);
+ }
+
+ /**
+ * @brief Get prevoius slice id in the slice vector, detail refer to comments of variable allSlices_
+ */
+ uint16_t GetPreSliceId(void)
+ {
+ if (allSlices_.Size() < 2) {
+ return gSliceInvalid;
+ }
+ return static_cast<uint16_t>(allSlices_[allSlices_.Size() - 2] & SLICE_MASK);
+ }
+
+ void UpdateCurSlicePageId(uint16_t pageId);
+
+ uint32_t GetCurTargetId(void)
+ {
if (allSlices_.IsEmpty()) {
return gSliceInvalid;
}
return allSlices_[allSlices_.Size() - 1];
}
- uint16_t GetPreSliceId(void) {
- if (allSlices_.Size() < 2) {
+ uint32_t GetPreTargetId(void)
+ {
+ if (allSlices_.Size() < 2) { // 2, minimum count if contains previous target
return gSliceInvalid;
}
- return allSlices_[allSlices_.Size() - 2];
+
+ return allSlices_[allSlices_.Size() - 2]; // 2, index offset
}
- void SetCurSlicePriority(const uint16_t priority) {
+ void SetCurSlicePriority(uint16_t priority)
+ {
curSlicePriority_ = priority;
}
- uint16_t GetCurSlicePriority(void) {
+ uint16_t GetCurSlicePriority(void)
+ {
return curSlicePriority_;
}
- void StartSlice(const uint16_t sliceId, const uint16_t priority);
- void ResumeSliceWithoutJS();
+
void ResumeSlice();
void PauseSlice();
- void StopSlice();
- void StopPrevSlice();
void StopSliceTransition();
void BackToPreSlice();
protected:
+ // targetId consists of slice id and page id
+ void StartSlice(uint32_t targetId);
+ void ResumeSliceWithoutJS();
+ void StopSlice();
Ability() = default;
virtual ~Ability() = default;
struct ProxyStruct {
// 预加载的所有slices
Graphic::Vector<ProxyStruct> allSlicesProxy_{16};
- // 历史记录的所有slices, 当前只使用了id
- // TODO:: 整页面的能力恢复功能待考虑扩展
- Graphic::Vector<uint16_t> allSlices_;
+ /** Processing rule of allSlices_, its item value consists of slice and page. slice | page << 16.
+ * 1. When switch slice A to main slice, clear slice vector, and then push back main slice into slice vector
+ * 2. When switch slice A to slice B (not main), push back slice B into slice vector
+ * 3. When switch js to slice A, clear slice vector, and then push back slice A into slice vector
+ * 4. When switch slice A to js, push back 0 into slice vector. You Can get slice A by method GetPreSliceId()
+ */
+ Graphic::Vector<uint32_t> allSlices_;
SliceStruct curSlice_;
- SliceStruct prevSlice_;
- uint16_t targetSliceIdFromJS_ = 0;
- uint16_t defaultSliceId_ = gSliceInvalid;
+ SliceStruct nextSlice_;
+ uint32_t targetIdFromJS_ = 0;
+ uint32_t defaultTargetId_ = gSliceInvalid;
uint16_t curSlicePriority_ = gSliceDefaultPriority;
- void PostChangeSlice(const uint16_t targetSliceId, TransitionType type,
- const uint16_t priority, bool enableSlideBack);
+ void PostChangeSlice(uint32_t targetId, TransitionType type);
Ability::ProxyStruct* Find(const uint16_t sliceId);
};
}
#define NATIVEABILITYFWK_ABILITY_SLICE_H
#include <typeinfo>
#include "Slice.h"
-#include "wearable_log.h"
+#include "Presenter.h"
+#include "View.h"
+#include "SlicePageManager.h"
namespace OHOS {
enum class SliceState : uint8_t {
PAUSE,
STOP
};
-template<class V, class P, class M = void>
class AbilitySlice : public Slice {
public:
- AbilitySlice<V, P, M>()
- :view_(nullptr), presenter_(nullptr), state_(SliceState::UNINITIALIZED) {}
- ~AbilitySlice() {}
+ AbilitySlice(ViewBase* viewBase, PresenterBase* presenterBase, uint32_t targetId)
+ : sliceId_(targetId & SLICE_MASK), view_(viewBase), presenter_(presenterBase),
+ slicePageMgr_(targetId), state_(SliceState::UNINITIALIZED) {}
- void OnStart() override
- {
- if ((presenter_ != nullptr) || (view_ != nullptr)) {
- return;
- }
+ void OnStart() override;
- presenter_ = new P();
- view_ = new V();
+ void OnResume() override;
- presenter_->Attach(view_);
- view_->Attach(presenter_);
+ void OnPause() override;
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Slice %s OnStart", typeid(view_).name());
- view_->SetupView();
- view_->OnStart();
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Slice %s OnStart", typeid(presenter_).name());
- presenter_->OnStart();
- state_ = SliceState::START;
- }
+ void OnStop() override;
- void OnResume() override
- {
- if ((state_ != SliceState::START) && (state_ != SliceState::PAUSE)) { // avoid repeated resume
- return;
- }
- if (presenter_ != nullptr) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Slice %s OnResume", typeid(presenter_).name());
- presenter_->OnResume();
- }
- if (view_ != nullptr) {
- view_->Draw();
- }
- state_ = SliceState::RESUME;
- }
+ UIViewGroup* GetSliceContainer() override;
- void OnPause() override
- {
- if (state_ != SliceState::RESUME) { // avoid repeated pause
- return;
- }
- if (presenter_ != nullptr) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Slice %s OnPause", typeid(presenter_).name());
- presenter_->OnPause();
- }
- state_ = SliceState::PAUSE;
- }
+ bool ChangeSlicePage(uint16_t pageId, void* data, TransitionType type, bool canBack);
- void OnStop() override
+ SlicePageManager* GetSlicePageManger()
{
- if (view_ != nullptr) {
- view_->TearDownView();
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Slice %s OnStop", typeid(view_).name());
- view_->OnStop();
- delete view_;
- view_ = nullptr;
- }
- if (presenter_ != nullptr) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Slice %s OnStop", typeid(presenter_).name());
- presenter_->OnStop();
- delete presenter_;
- presenter_ = nullptr;
- }
- state_ = SliceState::STOP;
+ return &slicePageMgr_;
}
-
- UIViewGroup* GetSliceContainer() override
- {
- if (view_ != nullptr) {
- return view_->GetRootContainer();
- } else {
- return nullptr;
- }
- }
-
private:
- AbilitySlice(const AbilitySlice &);
- AbilitySlice &operator=(const AbilitySlice &);
-
- V* view_;
- P* presenter_;
+ uint16_t sliceId_;
+ ViewBase* view_;
+ PresenterBase* presenter_;
+ SlicePageManager slicePageMgr_;
SliceState state_;
};
} // namespace OHOS
#define NATIVEABILITYFWK_ABILITY_SLICE_PROXY_H
#include "AbilitySlice.h"
-
#include "wearable_log.h"
+#include "Presenter.h"
namespace OHOS {
template <class V, class P>
-
class AbilitySliceProxy : public SliceProxy {
public:
- AbilitySliceProxy<V, P>() {}
- ~AbilitySliceProxy() {}
-
- Slice* CreateSlice() override
+ Slice* CreateSlice(uint32_t targetId) override
{
- return new AbilitySlice<V, P>();
+ V* v = new V();
+ if (v == nullptr) {
+ return nullptr;
+ }
+ P* p = new P();
+ if (p == nullptr) {
+ delete v;
+ return nullptr;
+ }
+ return new AbilitySlice(v, p, targetId);
}
-
-private:
- AbilitySliceProxy(const AbilitySliceProxy &);
- AbilitySliceProxy &operator=(const AbilitySliceProxy &);
};
} // namespace OHOS
#endif // NATIVEABILITYFWK_ABILITY_SLICE_PROXY_H
#define BACK_DRAG_LISTENER_H
#include <functional>
#include "animator/animator.h"
-#include "components/ui_view.h"
+#include "components/ui_view_group.h"
namespace OHOS {
class BackDragListener : public UIView::OnDragListener {
public:
- static BackDragListener* GetInstance();
+ BackDragListener() = default;
+ ~BackDragListener() override;
bool OnDragStart(UIView& view, const DragEvent& event) override;
bool OnDrag(UIView& view, const DragEvent& event) override;
bool OnDragEnd(UIView& view, const DragEvent& event) override;
- void ClearStatus();
+ void ClearDragState();
+ void SetParentView(UIViewGroup* view)
+ {
+ parentView_ = view;
+ }
void SetCurrentAndTargetView(UIView *cur, UIView *tar)
{
curView_ = cur;
{
time_ = time;
}
+ BackDragListener(const BackDragListener &) = delete;
+ BackDragListener &operator=(const BackDragListener &) = delete;
+ BackDragListener(BackDragListener &&) = delete;
+ BackDragListener &operator=(BackDragListener &&) = delete;
private:
- BackDragListener() {};
- ~BackDragListener() {};
class BackAnimatorCallback : public AnimatorCallback {
public:
+ BackAnimatorCallback(BackDragListener* listener, uint16_t duration)
+ : dragListener_(listener), curtTime_(0), duration_(duration) {}
void Callback(UIView* view) override;
- void OnStop(UIView& view) override;
- void SetDragParam(int16_t startX, int16_t endX, uint16_t dragTimes)
- {
- startValueX_ = startX;
- endValueX_ = endX;
- dragTimes_ = dragTimes;
- }
-
- void SetAnimator(Animator *ani)
- {
- ani_ = ani;
- }
-
- void SetGoToTarget(bool goToTarget)
- {
- goToTarget_ = goToTarget;
- }
-
- void SetStopAction(const std::function<void()> &action)
- {
- stopAct_ = action;
- }
-
- void SetTargetView(UIView *target)
- {
- targetView_ = target;
- }
-
- void ResetStatus()
+ void OnStop(UIView& view) override
{
curtTime_ = 0;
- dragTimes_ = 0;
- startValueX_ = 0;
- endValueX_ = 0;
- ani_ = nullptr;
- stopAct_ = nullptr;
- targetView_ = nullptr;
- goToTarget_ = false;
}
- private:
- Animator *ani_ = nullptr;
- UIView *targetView_ = nullptr;
- uint16_t curtTime_ = 0;
- uint16_t dragTimes_ = 0;
- int16_t startValueX_ = 0;
- int16_t endValueX_ = 0;
- bool goToTarget_ = false;
- std::function<void()> stopAct_;
+ private:
+ BackDragListener* dragListener_;
+ uint16_t curtTime_;
+ uint16_t duration_;
};
+ bool StartAnimator();
+ void StopDragging();
Animator *backAnimator_ = nullptr;
- BackAnimatorCallback backCallback_;
+ BackAnimatorCallback* backCallback_ = nullptr;
UIView *targetView_ = nullptr;
UIView *curView_ = nullptr;
+ UIViewGroup* parentView_ = nullptr;
int16_t left_ = 0;
int16_t right_ = 0;
std::function<void()> targetAction_;
std::function<void()> curAction_;
const static uint16_t DEFAULT_TIME = 200;
uint16_t time_ = DEFAULT_TIME;
+ bool goToTarget_ = false;
+ int16_t animStartX_ = 0;
+ int16_t animEndX_ = 0;
+ bool isDragging_ = false;
+ bool isTargetViewAdded_ = false;
}; // BackDragListener
} // namespace OHOS
{
public:
static NativeAbility &GetInstance(void);
-
#ifdef JS_ENABLE
void InstallAbility(void);
#endif
- void ResumeAbility(uint16_t targetSliceId, uint16_t priority);
- void PauseAbility();
- void StopAbility();
-
// SliteAbility, AMS控制的应用生命周期
void OnStart(const Want &want) OVERRIDE;
void OnActive(const Want &want) OVERRIDE;
void OnStop() OVERRIDE;
int GetNativeAbilityState() const;
+
private:
+ // targetId consists of slice id and page id
+ void ResumeAbility(uint32_t targetId);
+ void PauseAbility();
+ void StopAbility();
NativeAbility() {}
void ResumeSliceWithJS();
~NativeAbility() override {}
#include "graphic_mutex.h"
#include "TransitionCallback.h"
#include "TransitionType.h"
+#include "gfx_utils/image_info.h"
namespace OHOS {
using TransitionAnimatorStopCallback = std::function<void()>;
// this function is called by application when slice is on pause phase if it need to custom its slideback snapshot
void SaveSlideBackSnapShotIfNecessary(UIView* view);
UIImageView* GetTopSlideBackImage();
+ /**
+ * @brief Check whether slide back is enabled currently, equivalent to:
+ * View::GetBackDragListener()
+ * Note: Don't use canSlideBack_ because it will be reset after transition
+ */
+ bool CanSlideBack()
+ {
+ return (GetTopSlideBackImage() != nullptr);
+ }
// remove top slice back image from rootview and delete it
void ClearTopSlideBackImage();
void SaveCurrentSourceIfNecessary(UIView* view);
return transitionCaller_ == TransitionCaller::BACK_TRANSITION;
}
+ /**
+ * @brief Set current app's recent img source. Should be invoked in OnResume method.
+ */
+ void SetRecentAppImg(uint32_t resId, std::string file);
+
+ /**
+ * @brief Set min lasting period of an app so that it could be added to recent manager.
+ */
+ void SetRecentMinPeriod(uint32_t minPeriod);
+
private:
PageTransitionMgr() {};
~PageTransitionMgr() {};
void SaveSlideBackSnapShotInner(UIView* view, bool custom);
void SaveCurrentSnapShotInner(UIView* view);
void ClearSlideBackHistory();
+ bool SnapshotRecentSource(UIView* view);
+ void AddRecentAppIfNecessary();
+ bool FillRecentSnapshot(bool& needToFreeSnapshot);
Animator* animator_ = nullptr;
PageTransAnimCallback* animatorCallback_ = nullptr;
std::shared_ptr<UIImageViewWithInfo> currentSlideBackSnapshot_ = nullptr;
std::shared_ptr<UIImageViewWithInfo> currentSnapshot_ = nullptr;
std::shared_ptr<UIImageViewWithInfo> targetSnapshot_ = nullptr;
+ ImageInfo recentSnapshot_ = {0};
+ uint32_t recentAppResId_ = 0;
+ std::string recentAppFile_ = "";
std::shared_ptr<UIImageViewWithInfo> slideBackHistroy_[MAX_SLIDE_BACK_NUM] = {nullptr};
uint8_t curSlideBackNum_ = 0;
UIViewGroup* currentView_ = nullptr;
GraphicMutex operationLock_;
void ClearTransitionResource();
ImageInfo RectifySnapshot(ImageInfo& dstInfo);
+ uint32_t lastTransitionTime_ = 0;
+ uint32_t recentMinPeriod_ = 0;
+ bool recentMinPeriodSatisfied_ = true;
+ bool isSnapshotRecent_ = false;
+ uint16_t recentSliceId_ = 0; // invalid slice
+ uint32_t recentTargetId_ = 0; // invalid slice
};
} // namespace OHOS
-#endif // PAGE_TRANSITION_MGR_H
+#endif // PAGE_TRANSITION_MGR_H
\ No newline at end of file
#ifndef APPFWK_PRESENTER_H
#define APPFWK_PRESENTER_H
-#include "components/root_view.h"
-#include "KeyInputListener.h"
-#include "dock/focus_manager.h"
-#include "PageTransitionMgr.h"
-#include "NativeAbility.h"
-#include "BackDragListener.h"
+#include "View.h"
namespace OHOS {
-template<class V, class M = void>
-
-class Presenter {
+class PresenterBase {
public:
- Presenter() : view_(nullptr), model_(nullptr) {}
- virtual ~Presenter() {}
+ PresenterBase() : viewBase_(nullptr) {}
+ virtual ~PresenterBase() = default;
/**
* @brief Scheduled by slice when it is started and before transition animator starts if exsit
* @brief Scheduled by slice when it will be visiable and after transition animator ends if exsit
*
* You can set custom input event listener, request focus, and start its own animator here.
- * Please call Presenter::OnResume in your implemention
*/
- virtual void OnResume()
- {
- // make sure root container was added because it maybe removed during transition when current snap is false
- if (view_->GetRootContainer()->GetParent() == nullptr) {
- RootView::GetInstance()->Add(view_->GetRootContainer());
- }
- // Reset the default key listener
- RootView::GetInstance()->SetOnKeyActListener(KeyInputListener::GetInstance());
- UIView* backView = PageTransitionMgr::GetInstance().GetTopSlideBackImage();
- if (backView == nullptr) {
- return;
- }
- BackDragListener::GetInstance()->ClearStatus();
- BackDragListener::GetInstance()->SetCurrentAndTargetView(view_->GetRootContainer(), backView);
- BackDragListener::GetInstance()->SetDragToTargetAction([]() { NativeAbility::GetInstance().BackToPreSlice(); });
- view_->GetRootContainer()->SetOnDragListener(BackDragListener::GetInstance());
- }
+ virtual void OnResume() {}
/**
* @brief Scheduled by slice when another slice will be started and before slice transition animator starts if exsit
*
* You can clear input event listener, clear focus, and stop animator here.
- * Please call Presenter::OnPause in your implemention if default key listener need to be cleared.
*/
- virtual void OnPause()
- {
- // Ensure that key listener is disabled during transition if exist
- RootView::GetInstance()->ClearOnKeyActListener();
- view_->GetRootContainer()->SetOnDragListener(nullptr);
- FocusManager::GetInstance()->ClearFocus();
- }
+ virtual void OnPause() {}
/**
* @brief Presenter lifecycle scheduled by slice when it will be invisible and another slice will be visible
* You can destroy non-ui resources here
*/
virtual void OnStop() {}
+
+ /**
+ * @brief This function will attach view to this presenter
+ *
+ * @param view view pointer defined by developer
+ */
+ virtual void Attach(ViewBase* view)
+ {
+ viewBase_ = view;
+ }
+
+ PresenterBase(const PresenterBase&) = delete;
+ PresenterBase& operator=(const PresenterBase&) = delete;
+ PresenterBase(PresenterBase&&) = delete;
+ PresenterBase& operator=(PresenterBase&&) = delete;
+protected:
+ ViewBase* viewBase_;
+};
+
+template<class V, class M = void>
+class Presenter : public PresenterBase {
+public:
+ Presenter() : model_(nullptr) {}
+
/**
* @brief This function will attach view to this presenter
*
* @param view view pointer defined by developer
*/
- void Attach(V* view)
+ void Attach(ViewBase* view) override
{
- view_ = view;
+ PresenterBase::Attach(view);
+ view_ = dynamic_cast<V*>(viewBase_);
}
/**
protected:
V* view_;
M* model_;
- BackDragListener* backDragListener_ = nullptr;
-
-private:
- Presenter(const Presenter&) = delete;
- Presenter& operator=(const Presenter&) = delete;
- Presenter(Presenter&&) = delete;
- Presenter& operator=(Presenter&&) = delete;
};
}
#endif
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef RECENT_MANAGER_H
+#define RECENT_MANAGER_H
+
+#include <cstdio>
+#include <string>
+#include "gfx_utils/image_info.h"
+#include "gfx_utils/list.h"
+#include "graphic_mutex.h"
+
+namespace OHOS {
+#define RECENT_APP_BUNDLE_NAME_MAX_LEN 127
+
+typedef struct {
+ bool isNativeSlice; // true: native; false: js
+ union {
+ uint32_t targetId;
+ char bundleName[RECENT_APP_BUNDLE_NAME_MAX_LEN];
+ };
+ ImageInfo* snapshot;
+} RecentAppInfo;
+
+class RecentManager {
+public:
+
+ /**
+ * @brief Get <b>RecentManager*</b> instance.
+ */
+ static RecentManager* GetInstance();
+
+ /**
+ * @brief Set max recent app size. Once current size > max, the oldest will be removed.
+ * Default value is 0, and it will not record any recent app.
+ */
+ void SetMaxSize(uint32_t max);
+
+ /**
+ * @brief Get max recent app size.
+ */
+ uint32_t GetMaxSize();
+
+ /**
+ * @brief Get current recent app size.
+ */
+ uint32_t GetCurrentSize();
+
+ /**
+ * @brief Add a native app to recent manager with its snapshot to be cached.
+ */
+ void AddRecentApp(uint32_t targetId, const ImageInfo* snapshot);
+
+ /**
+ * @brief Add a js app to recent manager with its snapshot to be cached.
+ */
+ void AddRecentApp(const char* bundleName, const ImageInfo* snapshot);
+
+ /**
+ * @brief Remove a native app with given targetId.
+ */
+ bool RemoveRecentApp(uint32_t targetId, bool deleteFile = true);
+
+ /**
+ * @brief Remove a js app with given bundleName.
+ */
+ bool RemoveRecentApp(const char* bundleName, bool deleteFile = true);
+
+ /**
+ * @brief Remove all recent apps.
+ */
+ void RemoveAllRecentApps();
+
+ /**
+ * @brief Get a list of RecentAppInfo.
+ */
+ const List<RecentAppInfo*>& GetRecentApps();
+
+ /**
+ * @brief Set scale ratio. When an app is added, its snapshot could be scaled and cached. Default value is 0.5f.
+ */
+ void SetScaleRatio(float ratio);
+
+ /**
+ * @brief Get scale ratio.
+ */
+ float GetScaleRatio();
+
+ /**
+ * @brief Add a sliceId to black list so that it will not be saved as a recent app.
+ */
+ void AddToBlackList(uint32_t sliceId);
+
+ /**
+ * @brief Remove a sliceId from black list so that it can be saved as a recent app.
+ */
+ void RemoveFromBlackList(uint32_t sliceId);
+
+ /**
+ * @brief Clear black list.
+ */
+ void ClearBlackList();
+
+ /**
+ * @brief Return whether the sliceId is on black list.
+ */
+ bool IsOnBlackList(uint32_t sliceId);
+
+ /**
+ * @brief Return whether it is updated.
+ */
+ bool IsUpdateCompleted();
+
+ /**
+ * @brief Set dir path to save recent snapshots.
+ */
+ void SetDirPath(std::string path);
+
+ /**
+ * @brief Return dir path to save recent snapshots.
+ */
+ std::string GetDirPath();
+
+ /**
+ * @brief Return whether it is enabled. It is enabled when max size is a valid value and dir path is set.
+ */
+ bool IsEnabled();
+
+ /**
+ * @brief Used internally.
+ */
+ void PushRecentApp(RecentAppInfo* info);
+
+ /**
+ * @brief Used internally.
+ */
+ void RemoveOldest();
+
+ /**
+ * @brief Used internally.
+ */
+ void DecLoadingCnt();
+
+ /**
+ * @brief Used internally.
+ */
+ uint32_t GetLoadingCnt();
+
+private:
+ RecentManager();
+ virtual ~RecentManager();
+
+ void AddRecentAppWithSourceInfo(RecentAppInfo* appInfo, const ImageInfo* snapshot);
+ void AddRecentAppInner(RecentAppInfo* appInfo, const ImageInfo* snapshot);
+ void RemoveRecentAppNode(ListNode<RecentAppInfo*>* node, bool deleteFile);
+ bool ScaleSnapshot(const ImageInfo* src, ImageInfo* dst);
+ ListNode<RecentAppInfo*>* FindRecentAppInfo(List<RecentAppInfo*>& list,
+ bool isNativeSlice, uint32_t sliceId, const char* bundleName);
+ void AddPersistingTask(RecentAppInfo* info);
+ static void AsyncPersisterRunnable(void* args);
+ static void FreeRecentAppInfo(void* data);
+ void AsyncFreeRecentAppInfo(RecentAppInfo* info);
+ void ProcessPersistingTasks();
+ void ProcessTask(RecentAppInfo* info);
+ static void LoadRecentApp(void* data);
+ List<RecentAppInfo*> recentApps_;
+ List<RecentAppInfo*> persistingTasks_;
+ List<uint32_t> blackList_;
+ static GraphicMutex recentAppsMutex_;
+ static GraphicMutex persistingTaskMutex_;
+ static GraphicCond newPersistingTaskCond_;
+ static GraphicCond persistingTaskDoneCond_;
+ uint32_t maxSize_ = 0;
+ float scaleRatio_ = 0.5f;
+ std::string dirPath_;
+ uint32_t loadingCnt_ = 0;
+};
+} // namespace OHOS
+
+#endif // RECENT_MANAGER_H
#include "components/ui_view_group.h"
namespace OHOS {
+extern const uint16_t SLICE_MASK;
+extern const uint32_t PAGE_OFFSET;
class Slice {
public:
- Slice() {}
- virtual ~Slice() {}
+ Slice() = default;
+ virtual ~Slice() = default;
/**
* @brief Called when the Slice is started and before transition animator starts if exits.
*
virtual void OnStop() = 0;
virtual UIViewGroup* GetSliceContainer() = 0;
-private:
- Slice(const Slice &);
- Slice &operator=(const Slice &);
+ Slice(const Slice &) = delete;
+ Slice &operator=(const Slice &) = delete;
+ Slice(Slice &&) = delete;
+ Slice &operator=(Slice &&) = delete;
};
} // namespace OHOS
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.
+ * Description: Slice Page
+ * Author: Hisi Graphic Team
+ * Create: 2025-4
+ */
+#ifndef SLICE_PAGE_H
+#define SLICE_PAGE_H
+#include "components/ui_view_group.h"
+#include "Presenter.h"
+
+namespace OHOS {
+class SlicePageBase {
+public:
+ SlicePageBase() : pageContainer_(nullptr), backDragListener_(nullptr) {}
+
+ virtual ~SlicePageBase() = default;
+
+ virtual void OnStart(void* data) = 0;
+
+ virtual void OnResume() {}
+
+ virtual void OnPause() {}
+
+ virtual void OnStop() {}
+
+ UIViewGroup* GetSlicePageContainer()
+ {
+ return pageContainer_;
+ }
+
+ BackDragListener* GetBackDragListener()
+ {
+ return backDragListener_;
+ }
+
+ void AddViewToPageContainer(UIView* view);
+
+ virtual void AttachPresenter(PresenterBase* p) = 0;
+
+ SlicePageBase(const SlicePageBase&) = delete;
+ SlicePageBase& operator=(const SlicePageBase&) = delete;
+ SlicePageBase(SlicePageBase&&) = delete;
+ SlicePageBase& operator=(SlicePageBase&&) = delete;
+ uint16_t pageId_;
+
+private:
+ friend class SlicePageManager;
+ void SetupView(bool canBack);
+ void TearDownView();
+ UIViewGroup* pageContainer_;
+ BackDragListener* backDragListener_;
+};
+
+template<class P>
+class SlicePage : public SlicePageBase {
+public:
+ void AttachPresenter(PresenterBase* p) override
+ {
+ presenter_ = dynamic_cast<P*>(p);
+ }
+protected:
+ P* presenter_ = nullptr;
+};
+}
+#endif
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.
+ * Description: SlicePageFactory
+ * Author: Hisi Graphic Team
+ * Create: 2025-4
+ */
+#ifndef SLICE_PAGE_FACTORY_H
+#define SLICE_PAGE_FACTORY_H
+#include <unordered_map>
+#include "SlicePage.h"
+
+namespace OHOS {
+class SlicePageProxyInterface;
+class SlicePageFactory : public HeapBase {
+public:
+ static SlicePageFactory& GetInstance()
+ {
+ static SlicePageFactory instance;
+ return instance;
+ }
+
+ bool IsSlicePageExist(uint16_t sliceId, uint16_t pageId);
+
+ SlicePageBase* CreateSlicePage(uint16_t sliceId, uint16_t pageId);
+
+ SlicePageBase* GetDefaultSlicePage(uint16_t sliceId, uint16_t& defaultPageId);
+
+ void RegisterPage(uint16_t sliceId, uint16_t pageId, SlicePageProxyInterface* proxy, bool isMainPage);
+
+private:
+ SlicePageFactory() {};
+ ~SlicePageFactory() {};
+ SlicePageFactory(const SlicePageFactory &) = delete;
+ SlicePageFactory &operator=(const SlicePageFactory &) = delete;
+ std::unordered_map<uint32_t, SlicePageProxyInterface*> pageProxyMap_;
+ std::unordered_map<uint16_t, SlicePageProxyInterface*> mainPageMap_;
+ std::unordered_map<uint16_t, uint16_t> mainPageIdMap_;
+};
+
+class SlicePageProxyInterface : public HeapBase {
+public:
+ virtual SlicePageBase* CreateSlicePage(uint16_t pageId) = 0;
+};
+
+class SlicePageRegister : public HeapBase {
+public:
+ SlicePageRegister(uint16_t sliceId, uint16_t pageId, SlicePageProxyInterface* proxy, bool isMainPage);
+};
+
+template<class V>
+class SlicePageProxy : public SlicePageProxyInterface {
+public:
+ SlicePageBase* CreateSlicePage(uint16_t pageId) override
+ {
+ V* v = new V();
+ SlicePageBase* page = dynamic_cast<SlicePageBase*>(v);
+ if (page == nullptr) {
+ delete v;
+ } else {
+ page->pageId_ = pageId;
+ }
+ return page;
+ }
+};
+}
+
+#define REGIST_SLICE_PAGE(sliceId, pageId, V, isMainPage) \
+ const static OHOS::SlicePageRegister (STATIC_VAR)(sliceId, pageId, new OHOS::SlicePageProxy<V>(), isMainPage)
+#endif
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.
+ * Description: SlicePageManager
+ * Author: Hisi Graphic Team
+ * Create: 2025-4
+ */
+#ifndef SLICE_PAGE_MANAGER_H
+#define SLICE_PAGE_MANAGER_H
+#include "animator/animator.h"
+#include "Presenter.h"
+#include "Slice.h"
+#include "SlicePage.h"
+#include "gfx_utils/vector.h"
+#include "TransitionType.h"
+#include "TransitionCallback.h"
+
+namespace OHOS {
+class SlicePageManager;
+class SlicePageSwitchCallback : public AnimatorCallback {
+public:
+ SlicePageSwitchCallback(SlicePageManager* transMgr)
+ : isStarted_(false), startTime_(0), pageTransMgr_(transMgr) {}
+ void Callback(UIView* view) override;
+ void OnStop(UIView& view) override;
+
+private:
+ bool isStarted_;
+ uint32_t startTime_;
+ SlicePageManager* pageTransMgr_;
+};
+
+class SlicePageManager : public HeapBase {
+public:
+ SlicePageManager(uint32_t targetId)
+ : isPageBeingSwitched_(false), sliceId_(static_cast<uint16_t>(targetId & SLICE_MASK)),
+ targetPageId_(static_cast<uint16_t>(targetId >> PAGE_OFFSET)),
+ curPage_(nullptr), nextPage_(nullptr), pagesInBackQueue_(4), // 4, default queue size
+ presenter_(nullptr), view_{nullptr}, transitionCallback_(nullptr), canBack_(false) {}
+
+ ~SlicePageManager();
+
+ // Get current page which is display on the screen
+ SlicePageBase* GetCurSlicePage()
+ {
+ return curPage_;
+ }
+
+ // Get specified page in the back queue
+ SlicePageBase* GetSlicePageInBackQueue(uint16_t sliceId);
+
+ // Get previous page before current page in the back queue
+ SlicePageBase* GetLastPageInBackQueue()
+ {
+ return pagesInBackQueue_.Back();
+ }
+
+ void ClearBackQueue();
+
+ bool ChangeSlicePage(uint16_t pageId, void* data, TransitionType type, bool canBack);
+
+ bool IsAnimatorRunning()
+ {
+ return ((animator_ != nullptr) && (animator_->GetState() != Animator::STOP));
+ }
+
+ void BackToPrevSlicePage();
+
+ SlicePageManager(const SlicePageManager&) = delete;
+ SlicePageManager& operator=(const SlicePageManager&) = delete;
+ SlicePageManager(SlicePageManager&&) = delete;
+ SlicePageManager& operator=(SlicePageManager&&) = delete;
+
+private:
+ friend class AbilitySlice;
+ friend class SlicePageSwitchCallback;
+ void AttachVP(PresenterBase* p, ViewBase* v)
+ {
+ presenter_ = p;
+ view_ = v;
+ }
+ void StartSlicePage(void* data = nullptr);
+ void ResumeSlicePage();
+ void PauseSlicePage();
+ void StopSlicePage(bool clearBackQueue = true);
+ void StartSwitchAnimator();
+ void StopSwitchAnimator();
+
+ Animator* animator_ = nullptr;
+ SlicePageSwitchCallback* switchCallback_ = nullptr;
+ bool isPageBeingSwitched_;
+ uint16_t sliceId_;
+ uint16_t targetPageId_;
+ SlicePageBase* curPage_;
+ SlicePageBase* nextPage_;
+ Graphic::Vector<SlicePageBase*> pagesInBackQueue_;
+ PresenterBase* presenter_;
+ ViewBase* view_;
+ TransitionCallback* transitionCallback_;
+ bool canBack_;
+};
+}
+#endif
\ No newline at end of file
namespace OHOS {
class SliceProxy {
public:
- SliceProxy() {}
- ~SliceProxy() {}
- virtual Slice* CreateSlice() = 0;
-
-private:
- SliceProxy(const SliceProxy &);
- SliceProxy &operator=(const SliceProxy &);
+ virtual Slice* CreateSlice(uint32_t targetId) = 0;
+ SliceProxy() = default;
+ virtual ~SliceProxy() = default;
+ SliceProxy(const SliceProxy&) = delete;
+ SliceProxy& operator=(const SliceProxy&) = delete;
+ SliceProxy(SliceProxy&&) = delete;
+ SliceProxy& operator=(SliceProxy&&) = delete;
};
} // namespace OHOS
#endif // SLICE_PROXY_H
#define APPFWK_VIEW_H
#include "components/ui_view_group.h"
-#include "components/root_view.h"
-#include "common/screen.h"
+#include "BackDragListener.h"
namespace OHOS {
-template<class P>
-class View {
+class PresenterBase;
+class ViewBase {
public:
- View() : presenter_(nullptr), rootContainer_(nullptr) {}
- virtual ~View() {}
+ ViewBase() : rootContainer_(nullptr), backDragListener_(nullptr) {}
+ virtual ~ViewBase() = default;
/**
- * @brief get container view
- *
- * @returns container
+ * @brief Get container view
+ * @returns rootContainer_
*/
- UIViewGroup* GetRootContainer() const
+ UIViewGroup* GetRootContainer()
{
return rootContainer_;
}
+ /**
+ * @brief Get back drag listener
+ * This method can be used in AbilitySlice.cpp, and also can be used in XXXView.cpp
+ * If used in XXXView.cpp, you can use it to check whether default OnDragListener is configured.
+ * @returns backDragListener_
+ */
+ BackDragListener* GetBackDragListener()
+ {
+ return backDragListener_;
+ }
+
/**
* @brief Scheduled by slice after funtion SetupView and before transition animator starts if exits.
*
virtual void OnStop() {}
/**
- * @brief Scheduled by slice to create root container add it to root view
+ * @brief draw container
*
- * This method is called by system class AbilitySlice, you should not override it.
*/
- void SetupView()
- {
- if (rootContainer_ != nullptr) {
- printf("OnStart Error: rootContainer_ already exist");
- } else {
- rootContainer_ = new UIViewGroup();
- }
- rootContainer_->SetPosition(0, 0, RootView::GetInstance()->GetWidth(), RootView::GetInstance()->GetHeight());
- RootView::GetInstance()->Add(rootContainer_);
- }
+ void Draw();
/**
- * @brief Scheduled by slice to remove and delete root container from root view
+ * @brief This function will attach presenter to this view
*
- * This method is called by by system class AbilitySlice, you should not override it.
+ * @param presenter presenter pointer defined by developer
*/
- void TearDownView()
- {
- // Todo: Only remove root container, and application should remove other children in its own implemention
- RootView::GetInstance()->Remove(rootContainer_);
- if (rootContainer_ != nullptr) {
- rootContainer_->RemoveAll();
- delete rootContainer_;
- rootContainer_ = nullptr;
- } else {
- printf("TearDownView Error: rootContainer_ was not initialized !!!");
- }
- }
+ virtual void Attach(PresenterBase* presenter) = 0;
- /**
- * @brief draw container
- *
- */
- void Draw()
- {
- RootView::GetInstance()->Invalidate();
- }
+ void AddViewToRootContainer(UIView* view);
+
+ ViewBase(const ViewBase&) = delete;
+ ViewBase& operator=(const ViewBase&) = delete;
+ ViewBase(ViewBase&&) = delete;
+ ViewBase& operator=(ViewBase&&) = delete;
+
+private:
+ friend class AbilitySlice;
+ void SetupView();
+ void TearDownView();
+ UIViewGroup* rootContainer_;
+ BackDragListener* backDragListener_;
+};
+
+template<class P>
+class View : public ViewBase {
+public:
+ View() : presenter_(nullptr) {}
/**
* @brief This function will attach presenter to this view
*
* @param presenter presenter pointer defined by developer
*/
- void Attach(P* presenter)
- {
- presenter_ = presenter;
- }
-
- void AddViewToRootContainer(UIView* view)
+ void Attach(PresenterBase* presenter) override
{
- if (rootContainer_ == nullptr) {
- printf("AddViewToContainer Error: rootContainer_ is nullptr");
- return;
- }
- rootContainer_->Add(view);
+ presenter_ = dynamic_cast<P*>(presenter);
}
protected:
P* presenter_;
-
-private:
- UIViewGroup* rootContainer_ = nullptr;
- View(const View&) = delete;
- View& operator=(const View&) = delete;
- View(View&&) = delete;
- View& operator=(View&&) = delete;
};
}
#endif
#include "common/graphic_utils.h"
#include "PageTransitionMgr.h"
#include "gfx_utils/list.h"
+#include "AbilitySlice.h"
namespace OHOS {
-const uint8_t MAX_SLICE_ID_LENGTH = 16;
-struct SliceOperation {
- uint16_t targetSliceId;
- TransitionType type;
-};
-
void Ability::AddSliceProxy(const uint16_t sliceId, SliceProxy* proxy)
{
WEARABLE_LOGD(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Ability AddSliceProxy sliceId = %d", sliceId);
allSlicesProxy_.PushBack(proxyPair);
}
-void Ability::StartSlice(const uint16_t sliceId, const uint16_t priority)
+void Ability::StartSlice(uint32_t targetId)
{
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Ability StartSlice %d", sliceId);
- if (sliceId <= gSliceInvalid) {
+ if (targetId <= gSliceInvalid) {
return;
}
-
+ uint16_t sliceId = static_cast<uint16_t>(targetId & SLICE_MASK);
Ability::ProxyStruct* proxyStruct = Find(sliceId);
if (proxyStruct == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "no slice %d was found", sliceId);
return;
}
InputDeviceManager::GetInstance()->ClearInputDeviceState();
- Slice* nextSlice = proxyStruct->proxy->CreateSlice();
- if (nextSlice == nullptr) {
+
+ Slice* newSlice = proxyStruct->proxy->CreateSlice(targetId);
+ if (newSlice == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "create slice %u failed", sliceId);
return;
}
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Ability::StartSlice Size = %d", allSlices_.Size());
- // 记录最多gMaxHistorySlices个页面id
- if (PageTransitionMgr::GetInstance().IsBackTransitionRunning()) {
- PageTransitionMgr::GetInstance().ClearTopSlideBackImage();
- }
- if (sliceId == defaultSliceId_) {
- allSlices_.Clear(); // clear slice history when return to home
- allSlices_.PushBack(defaultSliceId_);
+ if (sliceId == defaultTargetId_) {
+ allSlices_.Clear(); // clear slice history when return to main slice
+ allSlices_.PushBack(defaultTargetId_);
} else if (PageTransitionMgr::GetInstance().IsBackTransitionRunning()) {
allSlices_.PopBack();
} else {
- allSlices_.PushBack(sliceId);
- }
- if (curSlice_.slice != nullptr) {
- prevSlice_.sliceId = curSlice_.sliceId;
- prevSlice_.slice = curSlice_.slice;
- } else {
- prevSlice_.sliceId = gSliceInvalid;
- prevSlice_.slice = nullptr;
+ allSlices_.PushBack(targetId);
}
- curSlice_.sliceId = sliceId;
- curSlice_.slice = nextSlice;
- curSlicePriority_ = priority;
-
- nextSlice->OnStart();
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Ability StartSlice %d page %d size:%d", sliceId,
+ targetId >> PAGE_OFFSET, allSlices_.Size());
+ nextSlice_.sliceId = sliceId;
+ nextSlice_.slice = newSlice;
+ newSlice->OnStart();
}
Ability::ProxyStruct* Ability::Find(const uint16_t sliceId)
return nullptr;
}
-void Ability::ChangeSlice(const uint16_t targetSliceId, TransitionType type,
- const uint16_t priority, bool enableSlideBack)
+SlicePageManager* Ability::GetCurSlicePageManager()
+{
+ if (PageTransitionMgr::GetInstance().IsTransitionRunning())
+ {
+ WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "No valid SlicePageManager during slice switching");
+ return nullptr;
+ }
+ AbilitySlice* slice = dynamic_cast<AbilitySlice*>(curSlice_.slice);
+ if (slice == nullptr) {
+ WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "No valid SlicePageManager when js is running");
+ return nullptr;
+ }
+ return slice->GetSlicePageManger();
+}
+
+void Ability::UpdateCurSlicePageId(uint16_t pageId)
+{
+ if (allSlices_.IsEmpty()) {
+ return;
+ }
+ uint32_t sliceId = allSlices_[allSlices_.Size() - 1] & SLICE_MASK;
+ allSlices_[allSlices_.Size() - 1] = sliceId | (static_cast<uint32_t>(pageId) << PAGE_OFFSET);
+}
+
+bool Ability::SwitchPageInSlice(uint16_t pageId, void* data, TransitionType type, bool canBack)
+{
+ if (pageId == 0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "page id should be valid but no zero");
+ return false;
+ }
+ if (PageTransitionMgr::GetInstance().IsTransitionRunning()) {
+ WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "page can't be switched during transition");
+ return false;
+ }
+ AbilitySlice* slice = dynamic_cast<AbilitySlice*>(curSlice_.slice);
+ if (slice == nullptr) {
+ WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "page can't be switched because current slice is nullptr");
+ return false;
+ }
+ return slice->ChangeSlicePage(pageId, data, type, canBack);
+}
+
+void Ability::SwitchSlice(uint16_t sliceId, uint16_t pageId, TransitionType type, bool enableSlideBack)
{
+ if (Find(sliceId) == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "slice %d is not registered", sliceId);
+ return;
+ }
#ifdef JS_ENABLE
ElementName *elementName = OHOS::AbilityMsClient::GetInstance().GetTopAbility();
if (elementName != nullptr && strcmp(elementName->bundleName, "com.huawei.launcher") != 0) {
OHOS::AbilityMsClient::GetInstance().ForceStop(elementName->bundleName, type);
- targetSliceIdFromJS_ = targetSliceId;
+ targetIdFromJS_ = sliceId | (static_cast<uint32_t>(pageId) << PAGE_OFFSET);
FreeElement(elementName);
return;
}
FreeElement(elementName);
#endif
TransitionTarget target;
- target.sliceInfo = targetSliceId | (priority << 16);
+ target.sliceInfo = sliceId | (static_cast<uint32_t>(pageId) << PAGE_OFFSET);
bool runImmed = PageTransitionMgr::GetInstance().BeginTransition(TransitionCaller::CHANGE_SLICE, target,
type, enableSlideBack);
if (!runImmed) {
- printf("pending change slice id:%d type:%d enableSlideBack:%d\n", targetSliceId, type, enableSlideBack);
+ printf("pending change slice id:%d type:%d enableSlideBack:%d\n", target.sliceInfo, type, enableSlideBack);
return;
}
- GraphicService::GetInstance()->PostGraphicEvent(std::bind(&Ability::PostChangeSlice, this, targetSliceId,
- type, priority, enableSlideBack));
+ GraphicService::GetInstance()->PostGraphicEvent(std::bind(&Ability::PostChangeSlice, this, target.sliceInfo, type));
}
-void Ability::PostChangeSlice(const uint16_t targetSliceId, TransitionType type,
+void Ability::ChangeSlice(uint16_t sliceId, TransitionType type,
const uint16_t priority, bool enableSlideBack)
+{
+ (void)(priority);
+ SwitchSlice(sliceId, gPageInvalid, type, enableSlideBack);
+}
+
+void Ability::PostChangeSlice(uint32_t targetId, TransitionType type)
{
PauseSlice();
+ if (allSlices_.Size() > 0 && allSlices_[allSlices_.Size() - 1] == VIEW_AOD) {
+ allSlices_.PopBack();
+ if (allSlices_.Size() > 0 && (allSlices_[allSlices_.Size() - 1] & SLICE_MASK) == (targetId & SLICE_MASK)) {
+ allSlices_.PopBack();
+ }
+ }
PageTransitionMgr::GetInstance().SaveCurrentSourceIfNecessary(curSlice_.slice->GetSliceContainer());
if (!PageTransitionMgr::GetInstance().IsTransAnimNeeded() ||
PageTransitionMgr::GetInstance().IsCurrentSnapshotEnabled()) {
StopSlice();
}
- StartSlice(targetSliceId, priority);
+ StartSlice(targetId);
if (!PageTransitionMgr::GetInstance().IsTransAnimNeeded()) {
ResumeSliceWithoutJS();
} else {
- PageTransitionMgr::GetInstance().SaveTargetSource(curSlice_.slice->GetSliceContainer());
+ PageTransitionMgr::GetInstance().SaveTargetSource(nextSlice_.slice->GetSliceContainer());
PageTransitionMgr::GetInstance().StartTransAnim(std::bind(&Ability::ResumeSliceWithoutJS, this));
}
}
{
if (PageTransitionMgr::GetInstance().IsTransAnimNeeded() &&
!PageTransitionMgr::GetInstance().IsCurrentSnapshotEnabled()) {
- StopPrevSlice();
+ StopSlice();
}
ResumeSlice();
PageTransitionMgr::GetInstance().EndTransition(true);
void Ability::ResumeSlice()
{
+ // if new slice was created, set is as current slice and resume it
+ if (nextSlice_.slice != nullptr) {
+ if (curSlice_.slice != nullptr) {
+ GRAPHIC_LOGE("Both slice %d and %d is valid during resume", curSlice_.sliceId, nextSlice_.sliceId);
+ }
+ curSlice_.sliceId = nextSlice_.sliceId;
+ curSlice_.slice = nextSlice_.slice;
+ nextSlice_.sliceId = gSliceInvalid;
+ nextSlice_.slice = nullptr;
+ }
+
if (curSlice_.slice != nullptr) {
WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Ability ResumeSlice %d", curSlice_.sliceId);
curSlice_.slice->OnResume();
void Ability::PauseSlice()
{
if (curSlice_.slice != nullptr) {
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Ability PauseSlice %d", curSlice_.sliceId);
InputDeviceManager::GetInstance()->ClearInputDeviceState();
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Ability PauseSlice %d", curSlice_.sliceId);
curSlice_.slice->OnPause();
} else {
GRAPHIC_LOGE("No valid slice to pause");
}
}
-void Ability::StopPrevSlice()
-{
- if (prevSlice_.slice != nullptr) {
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Ability StopPrevSlice %d", prevSlice_.sliceId);
- prevSlice_.slice->OnStop();
- if (prevSlice_.slice != nullptr) {
- prevSlice_.sliceId = gSliceInvalid;
- delete prevSlice_.slice;
- prevSlice_.slice = nullptr;
- }
- } else {
- GRAPHIC_LOGE("No valid prev slice to stop");
- }
-}
-
void Ability::StopSliceTransition()
{
PageTransitionMgr::GetInstance().SyncStopAnimator();
void Ability::BackToPreSlice()
{
- uint16_t targetSliceId = GetPreSliceId();
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Ability BackToPreSlice %d", targetSliceId);
- if (targetSliceId == gSliceInvalid) {
+ uint32_t targetId = GetPreTargetId();
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Ability BackToPreSlice %d", targetId);
+ if (targetId == gSliceInvalid) {
WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "previous slice is invalid");
return;
}
TransitionTarget target;
- target.sliceInfo = targetSliceId | (gSliceDefaultPriority << 16);
+ target.sliceInfo = targetId;
+ uint16_t sliceId = static_cast<uint16_t>(targetId & SLICE_MASK);
+ uint16_t pageId = static_cast<uint16_t>(targetId >> PAGE_OFFSET);
PageTransitionMgr::GetInstance().BeginBackTransition(TransitionCaller::CHANGE_SLICE, target);
- ChangeSlice(targetSliceId);
+ SwitchSlice(sliceId, pageId);
}
} // namespace OHOS
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.
+ * Description: AbilitySlice
+ * Author: Hisi Graphic Team
+ * Create: 2025-4
+ */
+
+#include "AbilitySlice.h"
+#include "components/root_view.h"
+#include "dock/focus_manager.h"
+#include "wearable_log.h"
+#include "PageTransitionMgr.h"
+#include "NativeAbility.h"
+#include "View.h"
+#include "Presenter.h"
+#include "key/KeyInputListener.h"
+
+namespace OHOS {
+const uint16_t SLICE_MASK = 0xFFFF;
+const uint32_t PAGE_OFFSET = 16;
+
+void AbilitySlice::OnStart()
+{
+ if ((presenter_ == nullptr) || (view_ == nullptr)) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Presenter or View was nullptr for slice %s", sliceId_);
+ return;
+ }
+
+ // if back to current slice, delete slide back ImageView of current slice firstly
+ if (PageTransitionMgr::GetInstance().IsBackTransitionRunning()) {
+ PageTransitionMgr::GetInstance().ClearTopSlideBackImage();
+ }
+ presenter_->Attach(view_);
+ view_->Attach(presenter_);
+ slicePageMgr_.AttachVP(presenter_, view_);
+
+ view_->SetupView();
+ view_->OnStart();
+ slicePageMgr_.StartSlicePage();
+ presenter_->OnStart();
+ state_ = SliceState::START;
+}
+
+void AbilitySlice::OnResume()
+{
+ if ((state_ != SliceState::START) && (state_ != SliceState::PAUSE)) { // avoid repeated resume
+ return;
+ }
+ if ((presenter_ == nullptr) || (view_ == nullptr)) {
+ return;
+ }
+
+ if (view_->GetRootContainer()->GetParent() == nullptr) {
+ RootView::GetInstance()->Add(view_->GetRootContainer());
+ }
+ // Reset the default key listener
+ RootView::GetInstance()->SetOnKeyActListener(KeyInputListener::GetInstance());
+ NativeAbility::GetInstance().SetCurSlicePriority(gSliceDefaultPriority);
+
+ UIView* backView = PageTransitionMgr::GetInstance().GetTopSlideBackImage();
+ BackDragListener* backDragListener = view_->GetBackDragListener();
+ if ((backView != nullptr) && ((backDragListener != nullptr))) {
+ backDragListener->SetCurrentAndTargetView(view_->GetRootContainer(), backView);
+ backDragListener->SetParentView(RootView::GetInstance());
+ backDragListener->SetDragToTargetAction([]() { NativeAbility::GetInstance().BackToPreSlice(); });
+ view_->GetRootContainer()->SetTouchable(true);
+ view_->GetRootContainer()->SetDraggable(true);
+ view_->GetRootContainer()->SetOnDragListener(backDragListener);
+ }
+
+ slicePageMgr_.ResumeSlicePage();
+ presenter_->OnResume();
+ view_->Draw();
+ state_ = SliceState::RESUME;
+}
+
+void AbilitySlice::OnPause()
+{
+ if (state_ != SliceState::RESUME) { // avoid repeated pause
+ return;
+ }
+ if ((presenter_ == nullptr) || (view_ == nullptr)) {
+ return;
+ }
+
+ if (slicePageMgr_.IsAnimatorRunning()) {
+ slicePageMgr_.StopSwitchAnimator();
+ }
+ slicePageMgr_.PauseSlicePage();
+ RootView::GetInstance()->ClearOnKeyActListener();
+ BackDragListener* backDragListener = view_->GetBackDragListener();
+ if (backDragListener != nullptr) {
+ backDragListener->ClearDragState();
+ }
+ view_->GetRootContainer()->SetOnDragListener(nullptr);
+
+ FocusManager::GetInstance()->ClearFocus();
+ presenter_->OnPause();
+ state_ = SliceState::PAUSE;
+}
+
+void AbilitySlice::OnStop()
+{
+ if ((presenter_ == nullptr) || (view_ == nullptr)) {
+ return;
+ }
+
+ slicePageMgr_.StopSlicePage();
+ view_->TearDownView();
+ view_->OnStop();
+ delete view_;
+ view_ = nullptr;
+
+ presenter_->OnStop();
+ delete presenter_;
+ presenter_ = nullptr;
+
+ state_ = SliceState::STOP;
+}
+
+UIViewGroup* AbilitySlice::GetSliceContainer()
+{
+ if (view_ != nullptr) {
+ return view_->GetRootContainer();
+ } else {
+ return nullptr;
+ }
+}
+
+bool AbilitySlice::ChangeSlicePage(uint16_t pageId, void* data, TransitionType type, bool canBack)
+{
+ return slicePageMgr_.ChangeSlicePage(pageId, data, type, canBack);
+}
+}
\ No newline at end of file
#endif
}
-void NativeAbility::ResumeAbility(uint16_t targetSliceId, uint16_t priority)
+void NativeAbility::ResumeAbility(uint32_t targetId)
{
GraphicService::GetInstance()->SetNativeUIRunning(true);
NotificationManager::GetInstance()->SetNativeUIRunning(true);
- if (curSlice_.slice == nullptr) {
+ if ((targetId & SLICE_MASK) != VIEW_AOD) {
allSlices_.Clear(); // clear slice history when jump from js to native
- StartSlice(targetSliceId, priority);
} else {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "NativeAbility ResumeAbility with slice %d", curSlice_.sliceId);
+ allSlices_.PopBack(); // clear invalid slice id
+ }
+ StartSlice(targetId);
+ if (nextSlice_.slice == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "NativeAbility ResumeAbility %d failed", targetId);
+ return;
}
-
if (!PageTransitionMgr::GetInstance().IsTransAnimNeeded()) {
ResumeSliceWithJS();
} else {
- PageTransitionMgr::GetInstance().SaveTargetSource(curSlice_.slice->GetSliceContainer());
+ PageTransitionMgr::GetInstance().SaveTargetSource(nextSlice_.slice->GetSliceContainer());
PageTransitionMgr::GetInstance().StartTransAnim(std::bind(&NativeAbility::ResumeSliceWithJS, this));
}
}
void NativeAbility::OnActive(const Want &want)
{
- uint16_t targetSliceId = gSliceInvalid;
- if (targetSliceIdFromJS_ != gSliceInvalid) {
- targetSliceId = targetSliceIdFromJS_;
- targetSliceIdFromJS_ = gSliceInvalid;
- } else if (GetPreSliceId() != gSliceInvalid) {
- targetSliceId = GetPreSliceId();
- } else if (GetCurSliceId() != gSliceInvalid) {
- targetSliceId = GetCurSliceId();
+ uint32_t targetId = gSliceInvalid;
+ if (targetIdFromJS_ != gSliceInvalid) {
+ targetId = targetIdFromJS_;
+ targetIdFromJS_ = gSliceInvalid;
+ } else if (GetPreTargetId() != gSliceInvalid) {
+ targetId = GetPreTargetId(); // for forcestop or ternimate js
+ } else if (GetCurTargetId() != gSliceInvalid) {
+ targetId = GetCurTargetId();
}
- targetSliceId = (targetSliceId == gSliceInvalid) ? defaultSliceId_ : targetSliceId;
+ targetId = (targetId == gSliceInvalid) ? defaultTargetId_ : targetId;
#ifdef JS_ENABLE
if ((GetState() == STATE_ACTIVE)) {
#endif
WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "NativeAbility OnActive");
GraphicService::GetInstance()->PostGraphicEvent(std::bind(&NativeAbility::ResumeAbility, this,
- targetSliceId, gSliceDefaultPriority));
+ targetId));
}
void NativeAbility::PauseAbility()
!PageTransitionMgr::GetInstance().IsCurrentSnapshotEnabled()) {
StopSlice();
}
+ if (allSlices_.Size() > 0 && allSlices_[allSlices_.Size() - 1] == VIEW_AOD) {
+ allSlices_.PopBack();
+ }
allSlices_.PushBack(gSliceInvalid);
nativeAbilityState_ = STATE_UNINITIALIZED;
#ifdef JS_ENABLE
#include "TransitionManager.h"
#include "NativeAbility.h"
#include "components/root_view.h"
-#include "AppItemView.h"
+#include "applist/AppItemView.h"
#include "hal_tick.h"
#include "wearable_log.h"
#ifdef JS_ENABLE
#include "TransitionManager.h"
#include "NativeAbility.h"
#include "components/root_view.h"
-#include "AppItemView.h"
+#include "applist/AppItemView.h"
#include "hal_tick.h"
#include "wearable_log.h"
#ifdef JS_ENABLE
focusView_ = itemView;
break;
}
+#else
+ if (itemView->GetViewId() == sliceId) {
+ focusIndex_ = itemView->GetViewIndex();
+ focusView_ = itemView;
+ break;
+ }
#endif
childView = childView->GetNextSibling();
}
set(PUBLIC_HEADER
${NativeApp}/nativelauncher/include
- ${NativeApp}/nativeui/screennotify/include
- ${NativeApp}/nativeui/bluetooth/include
+ ${NativeApp}/nativeui/include
)
set(PRIVATE_HEADER
${NativeApp}/nativeui/
- ${NativeApp}/nativeui/main/include
- ${NativeApp}/nativeui/clock/include
- ${NativeApp}/nativeui/bloodoxygen/include
- ${NativeApp}/nativeui/bluetooth/include
- ${NativeApp}/nativeui/indoorwalk/include
- ${NativeApp}/nativeui/rebootdevice/include
- ${NativeApp}/nativeui/activity/include
- ${NativeApp}/nativeui/heartrate/include
- ${NativeApp}/nativeui/callerlog/include
- ${NativeApp}/nativeui/makephone/include
- ${NativeApp}/nativeui/rtcservice/include
- ${NativeApp}/nativeui/compass/include
- ${NativeApp}/nativeui/connectnewphone/include
- ${NativeApp}/nativeui/alarmclockmanage/include
- ${NativeApp}/nativeui/alarmclocktimerconfig/include
- ${NativeApp}/nativeui/alarm/include
- ${NativeApp}/nativeui/temperature/include
- ${NativeApp}/nativeui/offlinevoice/include
- ${NativeApp}/nativeui/settings/include
- ${NativeApp}/nativeui/set_desktop/include
- ${NativeApp}/nativeui/set_card/include
- ${NativeApp}/nativeui/add_card/include
- ${NativeApp}/nativeui/set_dial/include
- ${NativeApp}/nativeui/set_dial_style/include
- ${NativeApp}/nativeui/key/include
- ${NativeApp}/nativeui/player/include
- ${NativeApp}/nativeui/applist/include
- ${NativeApp}/nativeui/phoneservice/include
- ${NativeApp}/nativeui/screensetting/include
- ${NativeApp}/nativeui/uiservice/include
- ${NativeApp}/nativeui/uisample/include
${NativeApp}/nativeui/uisample/uitest/framework/include
- ${NativeApp}/nativeui/aod_view/include
-
- ${NativeApp}/nativeui/alipay/include
- ${NativeApp}/nativeui/alipay/include/AlipayList
-
- ${NativeApp}/nativeui/alipay/include/AlipayTrans
- ${NativeApp}/nativeui/restoredefaults/include
-
- ${NativeApp}/nativeui/videocard/include
-
${UI_SAMPLE_ROOT}/components
${NativeApp}/../service/smart_voice/smart_voice_service/interfaces/innerkits/native_c/include
${NativeApp}/../service/smart_voice/voice_engine_hal/interfaces/innerkits/native_c/include
${ROOT_DIR}/include/middleware/services/bts/common
${ROOT_DIR}/include/middleware/services/bts/ble
${ROOT_DIR}/include/middleware/services/bts/br
+ ${ROOT_DIR}/middleware/chips/brandy/nv/
${ROOT_DIR}/open_source/openharmony/drivers/peripheral/display/interfaces/include
${ROOT_DIR}/open_source/openharmony/foundation/distributedschedule/samgr_lite/interfaces/kits/samgr
- ${NativeApp}/nativeui/main/include/dial
${ROOT_DIR}/middleware/services/media/foundation/sample/wrapper
${ROOT_DIR}/application/wearable/service/msg_center/include
${ROOT_DIR}/application/wearable/nativeabilityfwk/include
+ ${ROOT_DIR}/application/wearable/service/device_msg
${ROOT_DIR}/open_source/openharmony/foundation/multimedia/audio_player/interfaces/kits
${ROOT_DIR}/open_source/openharmony/foundation/multimedia/audiomanager/interfaces/kits/audiomanager
${ROOT_DIR}/open_source/openharmony/foundation/multimedia/audiomanager/interfaces/kits/audiocommon
${UIKIT_ROOT_DIR}/proprietary/src/ui/innerkits
${ROOT_DIR}/application/wearable/service/dial_market
${ROOT_DIR}/open_source/openharmony/third_party/cJSON
+ ${ROOT_DIR}/middleware/utils/dfx/diag/
+ ${ROOT_DIR}/middleware/utils/dfx/diag/diag_cmd_router/include
+ ${ROOT_DIR}/open_source/openharmony/hiviewdfx/hilog/lite/interfaces/native/kits/hilog_lite
+ ${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/kits/animator
+ ${ROOTDIR}/open_source/flatbuffers/include
+ ${ROOT_DIR}/open_source/openharmony/third_party/lwip/lwip_adapter/lwip_driver_adapter
)
file(GLOB_RECURSE SOURCES "${NativeApp}/nativeui/*.cpp")
${SOURCES}
${NativeApp}/nativelauncher/src/NativeLauncher.cpp
${NativeApp}/nativelauncher/src/NativeRegisterManager.cpp
+ ${NativeApp}/nativelauncher/src/UICardPageFactory.cpp
+ ${UI_SAMPLE_ROOT}/components/ui_test_lottie/ui_test_lottie.cpp
${UI_SAMPLE_ROOT}/components/ui_test_tiger/tiger_view.cpp
${UI_SAMPLE_ROOT}/components/ui_test_tiger/ui_test_tiger.cpp
${UI_SAMPLE_ROOT}/components/ui_test_running_ball/ui_test_running_ball.cpp
set(UIKIT_NATIVE_FWK ${ROOT_DIR}/application/wearable/nativeabilityfwk)
set(UIKIT_NATIVE_DIAL ${NativeApp}/nativeui/main)
set(COMPONENT_SRC
+ ${UIKIT_NATIVE_FWK}/src/View.cpp
+ ${UIKIT_NATIVE_FWK}/src/SlicePage.cpp
${UIKIT_NATIVE_FWK}/src/BackDragListener.cpp
${UIKIT_NATIVE_FWK}/src/PageTransitionMgr.cpp
${UIKIT_NATIVE_FWK}/src/TransitionManager.cpp
+ ${UIKIT_NATIVE_FWK}/src/RecentManager.cpp
+ ${UIKIT_NATIVE_FWK}/src/SlicePageManager.cpp
+ ${UIKIT_NATIVE_FWK}/src/SlicePageFactory.cpp
${UIKIT_NATIVE_FWK}/src/TransitionRecord.cpp
${UIKIT_NATIVE_DIAL}/src/dial/parser/DialBinParser.cpp
${UIKIT_NATIVE_DIAL}/src/dial/parser/DialBinParserManager.cpp
${ROOT_DIR}/middleware/services/gui/uikit/surface/interfaces/kits
${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/innerkits
${ROOT_DIR}/middleware/services/gui/uikit/ui/frameworks
- ${ROOT_DIR}/application/wearable/nativeapp/nativeui/applist/include/
${ROOT_DIR}/open_source/openharmony/drivers/peripheral/display/interfaces/include
${ROOT_DIR}/open_source/openharmony/drivers/peripheral/format/interfaces/include
${UIKIT_NATIVE_DIAL}/include/dial
${ROOT_DIR}/middleware/services/media/foundation/sample/wrapper
${ROOT_DIR}/middleware/services/media/foundation/player/interfaces/kits
${UIKIT_ROOT_DIR}/proprietary/src/ui/innerkits
+ ${ROOT_DIR}/open_source/openharmony/base/security/appverify/include
)
set(PRIVATE_DEFINES
VIEW_INDOORWALK,
VIEW_REBOOT,
VIEW_UISAMPLE,
+ VIEW_MAIN_BREATHEASE,
+ VIEW_FLASHLIGHT, // 手电筒;
+ VIEW_STOPWATCH, // 秒表;
+ VIEW_WEATHER, // 天气
+ VIEW_TIMER, // 计时器
+ VIEW_BLOOD, // 血氧
+ VIEW_CAMERA, // 相机
+ VIEW_FIND_PHONE, // 寻找手机
+ VIEW_DATE, // 日期
+ VIEW_QRCODE_CONN, // 二维码连接;
+ VIEW_SPORTS,
+ VIEW_SLEEPING,
+ VIEW_TRAINING,
+ VIEW_EMPTY,
#ifdef SUPPORT_ALIPAY_SEC
VIEW_MAIN_ALIPAY,
#endif
VIEW_SET_DESKTOP,
+ VIEW_SET_OTA,
VIEW_SET_CARD,
VIEW_ADD_CARD,
VIEW_SET_DIAL,
VIEW_SET_DIAL_STYLE,
VIEW_AOD,
VIEW_RESTORE_DEFAULTS,
+ VIEW_RECENT_APP,
VIEW_MAX_INTER_ARRY_APP = 0x7FFF, // 在此之前添加内部数组native应用ID.
VIEW_MAX_INTER_APP = 0xFFFD, // 在此之前添加内部静态注册native应用ID,此ID在NativeRegisterType.h里单独管理
VIEW_EXTERN_APP = 0xFFFE, // 三方应用
static NativeLauncher &GetInstance(void);
void InitNativeLauncher(void);
private:
- void InitAllNativeSlices(void);
-
NativeLauncher();
NativeLauncher(const NativeLauncher &);
NativeLauncher &operator=(const NativeLauncher &);
#include "NativeRegisterType.h"
#include "SliceProxy.h"
#include "AbilitySliceProxy.h"
-#include "ApplistModel.h"
+#include "applist/ApplistModel.h"
#include "NativeAbility.h"
#include "wearable_log.h"
#include "UiConfig.h"
virtual void InitSlice() {};
};
-struct NativeMap {
- NativeRegisterType type;
- NativeRegisterCallback* native;
-};
-
struct SliceMap {
uint16_t id;
SliceProxy* slice;
return instance;
}
void InitAllNativesSlices();
- Graphic::Vector<NativeMap>& GetNatives();
List<AppItem>& GetNativeAppLists();
- void RegisterNative(const AppItem &nativeAppList, NativeRegisterCallback* native);
void RegisterSlice(const uint16_t id, SliceProxy* slice);
void RegisterMenu(const uint16_t id, const char *icon, const char *iconHexagon, const char *label);
+ void RegisterMenu(const AppItem &item);
bool IsSliceIdExist(AppViewId id);
private:
NativeRegisterManager() {};
- ~NativeRegisterManager();
+ ~NativeRegisterManager() {};
NativeRegisterManager(const NativeRegisterManager&) = delete;
NativeRegisterManager &operator=(const NativeRegisterManager&) = delete;
- Graphic::Vector<NativeMap> natives_;
Graphic::Vector<SliceMap> slices_;
List<AppItem> nativeAppLists_;
};
-class NativeRegister {
-public:
- NativeRegister(const AppItem &nativeAppList, NativeRegisterCallback* native)
- {
- NativeRegisterManager::GetInstance().RegisterNative(nativeAppList, native);
- }
-};
-
class SliceRegister {
public:
SliceRegister(const uint16_t id, SliceProxy* sliceProxy)
NativeRegisterManager::GetInstance().RegisterSlice(id, sliceProxy);
NativeRegisterManager::GetInstance().RegisterMenu(id, icon, iconHexagon, label);
}
+ SliceRegister(const AppItem &item, SliceProxy* sliceProxy)
+ {
+ NativeRegisterManager::GetInstance().RegisterSlice(item.id, sliceProxy);
+ NativeRegisterManager::GetInstance().RegisterMenu(item);
+ }
};
} // namespace OHOS
-#define REGIST_NATIVE(nativeAppList, func) \
- const static OHOS::NativeRegister (STATIC_VAR)(nativeAppList, new func())
#define REGIST_SLICE(id, V, P) \
const static OHOS::SliceRegister (STATIC_VAR)(static_cast<uint16_t>(id), new AbilitySliceProxy<V, P>())
#define REGIST_MENU(id, V, P, icon, iconHexagon, label) \
const static OHOS::SliceRegister (STATIC_VAR)(static_cast<uint16_t>(id), new AbilitySliceProxy<V, P>(), \
icon, iconHexagon, label)
+/*
+ * 目前支持两种模式的注册,如果需要扩展,请自行扩展AppItem的构造方法
+ * 支持多语言注册以及多图标打包功能的注册示例:REGIST_MENU_EXT((AppItem{VIEW_OFFLINEVOICE, VOICE_RES_ID,
+ * VOICE_HEXAGON_ID, RES_PATH, HEXAGON_PATH, VOICE_LANGUAGE_ID, nullptr}), MainVocassistView, VocassistPresenter);
+ * 不支持多语言,一个图标使用一个文件的注册示例:REGIST_MENU_EXT((AppItem{VIEW_OFFLINEVOICE, PNG_APPLIST_VOCASSIST_IMAGE,
+ * PNG_APPLIST_DEFAULT_IMG, "语音助手", nullptr}), MainVocassistView, VocassistPresenter);
+ */
+#define REGIST_MENU_EXT(item, V, P) \
+ const static OHOS::SliceRegister (STATIC_VAR)(item, new AbilitySliceProxy<V, P>())
#endif // NATIVE_MANAGER_H
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.
+ * Description: UICardPageFactory
+ * Author:
+ * Create: 2025-06
+ */
+
+#ifndef UI_CARD_PAGE_FACTORY_H
+#define UI_CARD_PAGE_FACTORY_H
+
+#include <unordered_map>
+#include "components/ui_card_page.h"
+#include "UiConfig.h"
+
+namespace OHOS {
+class UICardPageProxyInterface;
+class UICardPageFactory {
+public:
+ static UICardPageFactory& GetInstance()
+ {
+ static UICardPageFactory instance;
+ return instance;
+ }
+ void RegisterWatchDial(const uint16_t mode, const uint16_t id, UICardPageProxyInterface* uiCardPage);
+ UICardPage* CreateWatchDial(uint16_t mode, uint16_t id);
+
+private:
+ UICardPageFactory() {};
+ ~UICardPageFactory() {};
+ UICardPageFactory(const UICardPageFactory&) = delete;
+ UICardPageFactory &operator=(const UICardPageFactory&) = delete;
+ std::unordered_map<uint16_t, UICardPageProxyInterface*> watchDials_[static_cast<uint16_t>(DIAL_DISPLAY_MODE_MAX)];
+};
+
+class WatchDialRegister {
+public:
+ WatchDialRegister(const uint16_t mode, const uint16_t id, UICardPageProxyInterface* uiCardPage)
+ {
+ UICardPageFactory::GetInstance().RegisterWatchDial(mode, id, uiCardPage);
+ }
+};
+
+class UICardPageProxyInterface {
+public:
+ virtual UICardPage* CreateUICardPage() = 0;
+ UICardPageProxyInterface() = default;
+ virtual ~UICardPageProxyInterface() = default;
+ UICardPageProxyInterface(const UICardPageProxyInterface&) = delete;
+ UICardPageProxyInterface& operator=(const UICardPageProxyInterface&) = delete;
+ UICardPageProxyInterface(UICardPageProxyInterface&&) = delete;
+ UICardPageProxyInterface& operator=(UICardPageProxyInterface&&) = delete;
+};
+
+template <class U>
+class WatchDialProxy : public UICardPageProxyInterface {
+public:
+ UICardPage* CreateUICardPage() override
+ {
+ U* u = new U();
+ UICardPage* page = dynamic_cast<UICardPage*>(u);
+ if (page == nullptr) {
+ delete u;
+ }
+ return page;
+ }
+};
+} // namespace OHOS
+
+#define REGIST_WATCH_DIAL(mode, id, U) \
+ const static OHOS::WatchDialRegister (STATIC_VAR)(static_cast<uint16_t>(mode), static_cast<uint16_t>(id), \
+ new WatchDialProxy<U>())
+
+#endif // UI_CARD_PAGE_FACTORY_H
\ No newline at end of file
DIAL_MAX,
} DialId;
+ typedef enum {
+ DIAL_DISPLAY_MODE_MAIN = 0,
+ DIAL_DISPLAY_MODE_AOD,
+ DIAL_DISPLAY_MODE_MAX,
+ } DialDispayMode;
+
#ifndef UNUSED
#define UNUSED(x) ((void)(x))
#endif
static constexpr const char *PNG_PREVIEW_CARD_VIDEO = APP_RES_PATH"/noaudio_05.bin";
static constexpr const char *PNG_SET_DIAL_CLOCK = APP_RES_PATH"/DIAL_CLOCK.bin";
+
+ static constexpr const char *PNG_APPLIST_STOPWATCH_LOGO = APP_RES_PATH"/STOPWATCH_LOGO.bin";
+ static constexpr const char *PNG_APPLIST_STOPWATCH_IMAGE = APP_RES_PATH"/STOPWATCH.bin";
+ static constexpr const char *WEATHER_IMAGE = APP_RES_PATH"/WEATHER.bin";
+ static constexpr const char *WEATHER_MAIN_ICON = APP_RES_PATH"/WEATHER_LOGO.bin";
+ static constexpr const char *TIMER_IMAGE = APP_RES_PATH"/TIMER.bin";
+ static constexpr const char *TIMER_MAIN_ICON = APP_RES_PATH"/TIMER_ICON.bin";
+ static constexpr const char *DATE_IMAGE = APP_RES_PATH"/DATE.bin";
+ static constexpr const char *DATE_MAIN_ICON = APP_RES_PATH"/DATE_LOGO.bin";
+ static constexpr const char *FLASHLIGHT_IMAGE = APP_RES_PATH"/FLASHLIGHT.bin";
+ static constexpr const char *FLASHLIGHT_MAIN_ICON = APP_RES_PATH"/FLASHLIGHT_LOGO.bin";
+ static constexpr const char *SLEEP_IMAGE = APP_RES_PATH"/SLEEP.bin";
+ static constexpr const char *SLEEP_ICON = APP_RES_PATH"/SLEEP_ICON.bin";
+ static constexpr const char *BREATH_IMAGE = APP_RES_PATH"/BREATH.bin";
+ static constexpr const char *BREATH_MAIN_ICON = APP_RES_PATH"/BREATH_ICON.bin";
+ static constexpr const char *FINDPHONE_IMAGE = APP_RES_PATH"/FINDPHONE.bin";
+ static constexpr const char *FINDPHONE_MAIN_ICON = APP_RES_PATH"/FINDPHONE_LOGO.bin";
+ static constexpr const char *CAMERA_IMAGE = APP_RES_PATH"/CAMERA.bin";
+ static constexpr const char *CAMERA_MAIN_ICON = APP_RES_PATH"/CAMERA_ICON.bin";
}
#endif // UI_CONFIG_H
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UIBreathResource\r
+ * Create: 2025-06-05\r
+ */\r
+#ifndef UI_RESOURCE_BREATH_IMAGE_H\r
+#define UI_RESOURCE_BREATH_IMAGE_H\r
+#include <cstdint>\r
+namespace OHOS {\r
+ static const int IMAGE_CONVERTER_TOOL_BREATH001 = 0x100001;\r
+ static const int IMAGE_CONVERTER_TOOL_BREATH002 = 0x100002;\r
+ static const int IMAGE_CONVERTER_TOOL_BREATH003 = 0x100003;\r
+ static const int IMAGE_CONVERTER_TOOL_BREATH004 = 0x100004;\r
+ static const int IMAGE_CONVERTER_TOOL_BREATH005 = 0x100005;\r
+ static const int IMAGE_CONVERTER_TOOL_BREATH006 = 0x100006;\r
+ static const int IMAGE_CONVERTER_TOOL_BREATH007 = 0x100007;\r
+ static const int IMAGE_CONVERTER_TOOL_BREATH008 = 0x100008;\r
+ static const int IMAGE_CONVERTER_TOOL_BREATH009 = 0x100009;\r
+ static const int IMAGE_CONVERTER_TOOL_BREATH010 = 0x10000a;\r
+ static const int IMAGE_CONVERTER_TOOL_BREATH011 = 0x10000b;\r
+ static const int IMAGE_CONVERTER_TOOL_BREATH012 = 0x10000c;\r
+ static const int IMAGE_CONVERTER_TOOL_BREATH013 = 0x10000d;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE001 = 0x10000e;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE002 = 0x10000f;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE003 = 0x100010;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE004 = 0x100011;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE005 = 0x100012;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE006 = 0x100013;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE007 = 0x100014;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE008 = 0x100015;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE009 = 0x100016;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE010 = 0x100017;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE011 = 0x100018;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE012 = 0x100019;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE013 = 0x10001a;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE014 = 0x10001b;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE015 = 0x10001c;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE016 = 0x10001d;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE017 = 0x10001e;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE018 = 0x10001f;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE019 = 0x100020;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE020 = 0x100021;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE021 = 0x100022;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE022 = 0x100023;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE023 = 0x100024;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE024 = 0x100025;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE025 = 0x100026;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE026 = 0x100027;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE027 = 0x100028;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE028 = 0x100029;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE029 = 0x10002a;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE030 = 0x10002b;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE031 = 0x10002c;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE032 = 0x10002d;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE033 = 0x10002e;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE034 = 0x10002f;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE035 = 0x100030;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE036 = 0x100031;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE037 = 0x100032;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE038 = 0x100033;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE039 = 0x100034;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE040 = 0x100035;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE041 = 0x100036;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE042 = 0x100037;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE043 = 0x100038;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE044 = 0x100039;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE045 = 0x10003a;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE046 = 0x10003b;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE047 = 0x10003c;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE048 = 0x10003d;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE049 = 0x10003e;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE050 = 0x10003f;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE051 = 0x100040;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE052 = 0x100041;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE053 = 0x100042;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE054 = 0x100043;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE055 = 0x100044;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE056 = 0x100045;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE057 = 0x100046;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE058 = 0x100047;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE059 = 0x100048;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE060 = 0x100049;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE061 = 0x10004a;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE062 = 0x10004b;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE063 = 0x10004c;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE064 = 0x10004d;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE065 = 0x10004e;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE066 = 0x10004f;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE067 = 0x100050;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE068 = 0x100051;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE069 = 0x100052;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE070 = 0x100053;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE071 = 0x100054;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE072 = 0x100055;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE073 = 0x100056;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE074 = 0x100057;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE075 = 0x100058;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE076 = 0x100059;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE077 = 0x10005a;\r
+ static const int IMAGE_CONVERTER_TOOL_INOREX_HALE078 = 0x10005b;\r
+} // OHOS\r
+#endif // UI_RESOURCE_BREATH_IMAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UICameraResource\r
+ * Create: 2025-06-05\r
+ */\r
+#ifndef UI_RESOURCE_CAMERA_H\r
+#define UI_RESOURCE_CAMERA_H\r
+#include <cstdint>\r
+namespace OHOS {\r
+ static const int IMAGE_CONVERTER_TOOL_CAMERA_1 = 0x100001;\r
+ static const int IMAGE_CONVERTER_TOOL_CAMERA_2 = 0x100002;\r
+ static const int IMAGE_CONVERTER_TOOL_CAMERA_3 = 0x100003;\r
+ static const int IMAGE_CONVERTER_TOOL_CAMERA_4 = 0x100004;\r
+ static const int IMAGE_CONVERTER_TOOL_CAMERA_5 = 0x100005;\r
+\r
+} // OHOS\r
+#endif // UI_RESOURCE_CAMERA_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UIWeatherResource\r
+ * Create: 2025-06-10\r
+ */\r
+#ifndef UI_RESOURCE_DATE_H\r
+#define UI_RESOURCE_DATE_H\r
+#include <cstdint>\r
+namespace OHOS {\r
+ static const int DIR_MASK = 0xfff00000;\r
+ static const int PNG_MASK = 0x000fffff;\r
+ static const int IMAGE_CONVERTER_TOOL_DATE1 = 0x100001;\r
+ static const int IMAGE_CONVERTER_TOOL_DATE2 = 0x100002;\r
+ static const int IMAGE_CONVERTER_TOOL_DATE3 = 0x100003;\r
+ static const int IMAGE_CONVERTER_TOOL_DATE4 = 0x100004;\r
+ static const int IMAGE_CONVERTER_TOOL_DATE5 = 0x100005;\r
+ static const int IMAGE_CONVERTER_TOOL_DATE6 = 0x100006;\r
+ static const int IMAGE_CONVERTER_TOOL_DATE7 = 0x100007;\r
+ static const int IMAGE_CONVERTER_TOOL_DATE8 = 0x100008;\r
+} // OHOS\r
+#endif // UI_RESOURCE_DATE_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UIFindPhoneResource\r
+ * Create: 2025-2-13\r
+ */\r
+#ifndef UI_RESOURCE_FINDPHONE_H\r
+#define UI_RESOURCE_FINDPHONE_H\r
+#include <cstdint>\r
+namespace OHOS {\r
+ static const int IMAGE_CONVERTER_TOOL_CONNECT_PHONE_1 = 0x100001;\r
+ static const int IMAGE_CONVERTER_TOOL_CONNECT_PHONE_2 = 0x100002;\r
+ static const int IMAGE_CONVERTER_TOOL_CONNECT_PHONE_3 = 0x100003;\r
+ static const int IMAGE_CONVERTER_TOOL_CONNECT_PHONE_4 = 0x100004;\r
+ static const int IMAGE_CONVERTER_TOOL_CONNECT_PHONE_5 = 0x100005;\r
+ static const int IMAGE_CONVERTER_TOOL_CONNECT_PHONE_6 = 0x100006;\r
+ static const int IMAGE_CONVERTER_TOOL_CONNECT_PHONE_7 = 0x100007;\r
+ static const int IMAGE_CONVERTER_TOOL_FINDPHONE001 = 0x100008;\r
+ static const int IMAGE_CONVERTER_TOOL_FINDPHONE002 = 0x100009;\r
+ static const int IMAGE_CONVERTER_TOOL_FINDPHONE003 = 0x10000a;\r
+ static const int IMAGE_CONVERTER_TOOL_FINDPHONE004 = 0x10000b;\r
+ static const int IMAGE_CONVERTER_TOOL_FINDPHONE005 = 0x10000c;\r
+ static const int IMAGE_CONVERTER_TOOL_FINDPHONE006 = 0x10000d;\r
+ static const int IMAGE_CONVERTER_TOOL_FINDPHONE007 = 0x10000e;\r
+ static const int IMAGE_CONVERTER_TOOL_FINDPHONE008 = 0x10000f;\r
+ static const int IMAGE_CONVERTER_TOOL_FINDPHONE009 = 0x100010;\r
+ static const int IMAGE_CONVERTER_TOOL_FINDPHONE010 = 0x100011;\r
+ static const int IMAGE_CONVERTER_TOOL_FINDPHONE011 = 0x100012;\r
+ static const int IMAGE_CONVERTER_TOOL_FINDPHONE012 = 0x100013;\r
+ static const int IMAGE_CONVERTER_TOOL_FINDPHONE013 = 0x100014;\r
+ static const int IMAGE_CONVERTER_TOOL_FINDPHONE014 = 0x100015;\r
+ static const int IMAGE_CONVERTER_TOOL_FINDPHONE015 = 0x100016;\r
+ static const int IMAGE_CONVERTER_TOOL_FINDPHONE016 = 0x100017;\r
+ static const int IMAGE_CONVERTER_TOOL_FINDPHONE017 = 0x100018;\r
+ static const int IMAGE_CONVERTER_TOOL_FINDPHONE018 = 0x100019;\r
+ static const int IMAGE_CONVERTER_TOOL_FINDPHONE019 = 0x10001a;\r
+ static const int IMAGE_CONVERTER_TOOL_FINDPHONE020 = 0x10001b;\r
+ static const int IMAGE_CONVERTER_TOOL_FINDPHONE021 = 0x10001c;\r
+ static const int IMAGE_CONVERTER_TOOL_FINDPHONE022 = 0x10001d;\r
+ static const int IMAGE_CONVERTER_TOOL_FINDPHONE023 = 0x10001e;\r
+ static const int IMAGE_CONVERTER_TOOL_FINDPHONE024 = 0x10001f;\r
+ static const int IMAGE_CONVERTER_TOOL_FINDPHONE025 = 0x100020;\r
+ static const int IMAGE_CONVERTER_TOOL_FINDPHONE026 = 0x100021;\r
+ static const int IMAGE_CONVERTER_TOOL_FINDPHONE027 = 0x100022;\r
+ static const int IMAGE_CONVERTER_TOOL_FINDPHONE028 = 0x100023;\r
+} // OHOS\r
+#endif // UI_RESOURCE_FINDPHONE_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UISleepResource\r
+ * Create: 2025-06-05\r
+ */\r
+#ifndef UI_RESOURCE_SLEEP_H\r
+#define UI_RESOURCE_SLEEP_H\r
+#include <cstdint>\r
+namespace OHOS {\r
+ static const int IMAGE_CONVERTER_TOOL_BACKGROUND = 0x100001;\r
+ static const int IMAGE_CONVERTER_TOOL_BLACK_BG = 0x100002;\r
+ static const int IMAGE_CONVERTER_TOOL_BLUE_CIR = 0x100003;\r
+ static const int IMAGE_CONVERTER_TOOL_GREEN_CIR = 0x100004;\r
+ static const int IMAGE_CONVERTER_TOOL_NORECORD_SLEEP = 0x100005;\r
+ static const int IMAGE_CONVERTER_TOOL_ORANGE_CIR = 0x100006;\r
+ static const int IMAGE_CONVERTER_TOOL_RECORD_BG = 0x100007;\r
+ static const int IMAGE_CONVERTER_TOOL_RECORD_SLEEP = 0x100008;\r
+ static const int IMAGE_CONVERTER_TOOL_RED_CIR = 0x100009;\r
+ static const int IMAGE_CONVERTER_TOOL_SELECTEDTIME = 0x10000a;\r
+ static const int IMAGE_CONVERTER_TOOL_SELECTTIME = 0x10000b;\r
+ static const int IMAGE_CONVERTER_TOOL_SETTIMEBTN = 0x10000c;\r
+ static const int IMAGE_CONVERTER_TOOL_SETTING = 0x10000d;\r
+ static const int IMAGE_CONVERTER_TOOL_START_GRAY = 0x10000e;\r
+ static const int IMAGE_CONVERTER_TOOL_STAR_GRAY = 0x10000f;\r
+ static const int IMAGE_CONVERTER_TOOL_STAR_YELLOW = 0x100010;\r
+ static const int IMAGE_CONVERTER_TOOL_TIPS = 0x100011;\r
+} // OHOS\r
+#endif // UI_RESOURCE_SLEEP_H\r
--- /dev/null
+/*\r
+* Copyright (c) xxxxxxxx Technologies Co., Ltd. 2021-2021. All rights reserved.\r
+* Description: language\r
+* Author: Graphic develop team\r
+* Create: 2021-07-06\r
+*/\r
+\r
+#ifndef UI_RESOURCE_STRING_H\r
+#define UI_RESOURCE_STRING_H\r
+#include <cstdint>\r
+namespace OHOS {\r
+enum UIResourceTextId : uint16_t {\r
+ STR_LANGUAGE = 0,\r
+ STR_MAX_ID = 1,\r
+}; // UIResourceTextId\r
+\r
+enum FontLanguageId : uint8_t {\r
+ LANGUAGE_ID_ZH,\r
+ LANGUAGE_ID_EN,\r
+ LANGUAGE_ID_MAX\r
+}; // UITextLanguageTextId\r
+}\r
+#endif /* UI_RESOURCE_STRING_H */\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UITimerResource\r
+ * Create: 2025-06-05\r
+ */\r
+#ifndef UI_RESOURCE_TIMER_H\r
+#define UI_RESOURCE_TIMER_H\r
+#include <cstdint>\r
+namespace OHOS {\r
+ static const int IMAGE_CONVERTER_TOOL_BG_CIR = 0x100001;\r
+ static const int IMAGE_CONVERTER_TOOL_TIMER_1 = 0x100002;\r
+ static const int IMAGE_CONVERTER_TOOL_TIMER_15 = 0x100003;\r
+ static const int IMAGE_CONVERTER_TOOL_TIMER_3 = 0x100004;\r
+ static const int IMAGE_CONVERTER_TOOL_TIMER_30 = 0x100005;\r
+ static const int IMAGE_CONVERTER_TOOL_TIMER_BEGIN_GRAY = 0x100006;\r
+ static const int IMAGE_CONVERTER_TOOL_TIMER_BEGIN_ORANGE = 0x100007;\r
+ static const int IMAGE_CONVERTER_TOOL_TIMER_BG = 0x100008;\r
+ static const int IMAGE_CONVERTER_TOOL_TIMER_EXIT = 0x100009;\r
+ static const int IMAGE_CONVERTER_TOOL_TIMER_PAUSE = 0x10000a;\r
+ static const int IMAGE_CONVERTER_TOOL_TIMER_PAUSE_ORANGE = 0x10000b;\r
+ static const int IMAGE_CONVERTER_TOOL_TIMER_PBG = 0x10000c;\r
+ static const int IMAGE_CONVERTER_TOOL_TIMER_PLAY = 0x10000d;\r
+ static const int IMAGE_CONVERTER_TOOL_TIMER_POINTER = 0x10000e;\r
+ static const int IMAGE_CONVERTER_TOOL_TIMER_RESTART = 0x10000f;\r
+ static const int IMAGE_CONVERTER_TOOL_TIMER_USER = 0x100010;\r
+} // OHOS\r
+#endif // UI_RESOURCE_TIMER_H\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: UIWeatherResource\r
+ * Create: 2025-06-05\r
+ */\r
+#ifndef UI_RESOURCE_WEATHER_IMAGE_H\r
+#define UI_RESOURCE_WEATHER_IMAGE_H\r
+#include <cstdint>\r
+namespace OHOS {\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER00 = 0x100001;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER01 = 0x100002;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER02 = 0x100003;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER03 = 0x100004;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER04 = 0x100005;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER05 = 0x100006;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER06 = 0x100007;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER07 = 0x100008;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER08 = 0x100009;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER09 = 0x10000a;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER10 = 0x10000b;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER11 = 0x10000c;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER12 = 0x10000d;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER13 = 0x10000e;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER14 = 0x10000f;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER15 = 0x100010;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER16 = 0x100011;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER17 = 0x100012;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER18 = 0x100013;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER19 = 0x100014;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER20 = 0x100015;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER21 = 0x100016;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER22 = 0x100017;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER23 = 0x100018;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER24 = 0x100019;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER25 = 0x10001a;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER26 = 0x10001b;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER27 = 0x10001c;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER28 = 0x10001d;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER29 = 0x10001e;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER30 = 0x10001f;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER31 = 0x100020;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER32 = 0x100021;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER33 = 0x100022;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER34 = 0x100023;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER35 = 0x100024;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER36 = 0x100025;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER37 = 0x100026;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER38 = 0x100027;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER39 = 0x100028;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER40 = 0x100029;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER41 = 0x10002a;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER42 = 0x10002b;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER43 = 0x10002c;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER44 = 0x10002d;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER45 = 0x10002e;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER46 = 0x10002f;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER47 = 0x100030;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER48 = 0x100031;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER49 = 0x100032;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER50 = 0x100033;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER51 = 0x100034;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER52 = 0x100035;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER53 = 0x100036;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER54 = 0x100037;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER55 = 0x100038;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER56 = 0x100039;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER57 = 0x10003a;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER58 = 0x10003b;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER59 = 0x10003c;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER60 = 0x10003d;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER61 = 0x10003e;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER62 = 0x10003f;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER63 = 0x100040;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER64 = 0x100041;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER65 = 0x100042;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER66 = 0x100043;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER67 = 0x100044;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER68 = 0x100045;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER69 = 0x100046;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER70 = 0x100047;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER71 = 0x100048;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER72 = 0x100049;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER73 = 0x10004a;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER74 = 0x10004b;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER75 = 0x10004c;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER76 = 0x10004d;\r
+static const int IMAGE_CONVERTER_TOOL_WEATHER77 = 0x10004e;\r
+} // OHOS\r
+#endif // UI_RESOURCE_IMAGE_H\r
--- /dev/null
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.\r
+ * Description: UIStopWatchResource\r
+ * Create: 2025-06-05\r
+ */\r
+\r
+#ifndef UI_STOPWATCH_RESOURCE_H\r
+#define UI_STOPWATCH_RESOURCE_H\r
+\r
+#include <cstdint>\r
+\r
+namespace OHOS {\r
+static const int IMAGE_STOPWATCH_STOPWATCH01 = 0x100001;\r
+static const int IMAGE_STOPWATCH_STOPWATCH02 = 0x100002;\r
+static const int IMAGE_STOPWATCH_STOPWATCH04 = 0x100003;\r
+static const int IMAGE_STOPWATCH_STOPWATCH06 = 0x100004;\r
+static const int IMAGE_STOPWATCH_STOPWATCH08 = 0x100005;\r
+static const int IMAGE_STOPWATCH_STOPWATCH10 = 0x100006;\r
+static const int IMAGE_STOPWATCH_STOPWATCH12 = 0x100007;\r
+static const int IMAGE_STOPWATCH_STOPWATCH14 = 0x100008;\r
+static const int IMAGE_STOPWATCH_STOPWATCH16 = 0x100009;\r
+static const int IMAGE_STOPWATCH_STOPWATCH19 = 0x10000a;\r
+static const int IMAGE_STOPWATCH_STOPWATCH20 = 0x10000b;\r
+} // OHOS\r
+#endif // UI_STOPWATCH_RESOURCE_H\r
#include "SliceProxy.h"
#include "AbilitySliceProxy.h"
#include "wearable_log.h"
-#include "CallerLogModel.h"
-#include "ActivityModel.h"
-#include "HeartModel.h"
-#include "PlayersModel.h"
-#include "HealthModel.h"
-#include "VocassistModel.h"
-#include "ScreenModels.h"
-#include "BluetoothHeadsetEvent.h"
+#include "callerlog/CallerLogModel.h"
+#include "activity/ActivityModel.h"
+#include "heartrate/HeartModel.h"
+#include "player/PlayersModel.h"
+#include "main/HealthModel.h"
+#include "sports/SportsModel.h"
+#include "offlinevoice/VocassistModel.h"
+#include "screensetting/ScreenModels.h"
+#include "bluetooth/BluetoothHeadsetEvent.h"
#include "graphic_hardware_config.h"
#include "graphic_service.h"
#include "common/graphic_startup.h"
#ifdef JS_ENABLE
#include "product_adapter.h"
#endif
+#include "RecentManager.h"
+#include "PageTransitionMgr.h"
namespace OHOS {
{
#ifdef JS_ENABLE
ACELite::ProductAdapter::SetScreenSize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+ ACELite::ProductAdapter::SetDefaultFontStyle(
+ DEFAULT_VECTOR_FONT_FILENAME, ACELite::ProductAdapter::GetDefaultFontSize());
#endif
GraphicStartUp::InitFontEngine(MEM_POOL_UI_FONT, MEM_POOL_UI_FONT_SIZE,
OHOS::VECTOR_FONT_DIR, DEFAULT_VECTOR_FONT_FILENAME);
WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "NativeLauncher::InitNativeLauncher");
// 初始化所有预加载slice
InitBtHeadsetEvent(); // 蓝牙ct和tg适配初始化
- InitAllNativeSlices();
+ NativeRegisterManager::GetInstance().InitAllNativesSlices();
CallerLogModel::GetInstance()->InitPhoneService();
PlayersModel::GetInstance()->AudioInit();
ActivityModel::GetInstance()->Init();
VocassistModel::GetInstance()->Init();
HeartModel::GetInstance()->Init();
BluetoothModel::GetInstance()->Init();
+ SportsModel::GetInstance()->Init();
// 初始化默认首页
ScreenModels::GetInstance()->PreLoadAppimages();
NativeAbility::GetInstance().SetDefaultSliceId(VIEW_MAIN_SAMPLE);
-}
-void NativeLauncher::InitAllNativeSlices(void)
-{
- Graphic::Vector<NativeMap>& natives = NativeRegisterManager::GetInstance().GetNatives();
- for(uint16_t index =0; index < natives.Size(); index++) {
- if (static_cast<uint16_t>(natives[index].type) >= VIEW_MAX_INTER_APP) {
- continue;
- }
- natives[index].native->InitSlice();
- }
- NativeRegisterManager::GetInstance().InitAllNativesSlices();
- return;
+ RecentManager::GetInstance()->SetDirPath("system/recent/");
+ RecentManager::GetInstance()->AddToBlackList(VIEW_AOD);
+ RecentManager::GetInstance()->AddToBlackList(VIEW_RECENT_APP);
+ RecentManager::GetInstance()->AddToBlackList(VIEW_APPLIST);
+ RecentManager::GetInstance()->AddToBlackList(VIEW_MAIN_SAMPLE);
+ RecentManager::GetInstance()->SetMaxSize(5); // 5: max number of recent apps.
+ PageTransitionMgr::GetInstance().SetRecentMinPeriod(1000); // 1000: min period
}
}
#include "NativeRegisterManager.h"
namespace OHOS {
-NativeRegisterManager::~NativeRegisterManager()
-{
- for(uint16_t i =0; i < natives_.Size(); i++) {
- if (natives_[i].native != nullptr) {
- delete natives_[i].native;
- natives_[i].native = nullptr;
- }
- }
-}
void NativeRegisterManager::InitAllNativesSlices()
{
}
}
-Graphic::Vector<NativeMap>& NativeRegisterManager::GetNatives()
-{
- return natives_;
-}
-
List<AppItem>& NativeRegisterManager::GetNativeAppLists()
{
return nativeAppLists_;
}
-void NativeRegisterManager::RegisterNative(const AppItem &nativeAppList, NativeRegisterCallback* native)
-{
- if (native == nullptr) {
- GRAPHIC_LOGE("native can't be nullptr");
- return;
- }
- for(uint16_t i = 0; i < natives_.Size(); i++) {
- if (natives_[i].type == (NativeRegisterType)nativeAppList.id) {
- GRAPHIC_LOGE("RegisterNative failed because type %d already registered", nativeAppList.id);
- return;
- }
- }
- GRAPHIC_LOGI("register native %d", nativeAppList.id);
- NativeMap map = {(NativeRegisterType)nativeAppList.id, native};
- natives_.PushBack(map);
- nativeAppLists_.PushBack(nativeAppList);
-}
-
void NativeRegisterManager::RegisterSlice(const uint16_t id, SliceProxy* sliceProxy)
{
if (sliceProxy == nullptr) {
void NativeRegisterManager::RegisterMenu(const uint16_t id, const char *icon, const char *iconHexagon, const char *label)
{
- AppItem item = {id, icon, icon, iconHexagon, label, nullptr};
+ AppItem item = {id, icon, iconHexagon, label, nullptr};
ListNode<AppItem>* appNode = nativeAppLists_.Head();
while (appNode != nativeAppLists_.End()) {
if (id == appNode->data_.id) {
nativeAppLists_.PushBack(item);
}
+void NativeRegisterManager::RegisterMenu(const AppItem &item)
+{
+ ListNode<AppItem>* appNode = nativeAppLists_.Head();
+ while (appNode != nativeAppLists_.End()) {
+ if (item.id == appNode->data_.id) {
+ GRAPHIC_LOGE("Register menu failed because id %d already registered.", item.id);
+ return;
+ }
+ if (item.id < appNode->data_.id) {
+ nativeAppLists_.Insert(appNode, item);
+ return;
+ }
+ appNode = appNode->next_;
+ }
+ nativeAppLists_.PushBack(item);
+}
+
bool NativeRegisterManager::IsSliceIdExist(AppViewId id)
{
for (uint16_t index = 0; index < slices_.Size(); index++) {
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.
+ * Description: UICardPageFactory
+ * Author:
+ * Create: 2025-06
+ */
+
+#include "UICardPageFactory.h"
+#include "wearable_log.h"
+
+namespace OHOS {
+
+void UICardPageFactory::RegisterWatchDial(const uint16_t mode, const uint16_t id, UICardPageProxyInterface* uiCardPage)
+{
+ if (mode >= DIAL_DISPLAY_MODE_MAX || uiCardPage == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Can't register watch dial using invalid mode or proxy %d-%p",
+ mode, uiCardPage);
+ return;
+ }
+ if (watchDials_[mode].find(id) != watchDials_[mode].end()) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Watch dial mode %d id:%d has already been registered", mode, id);
+ return;
+ } else {
+ watchDials_[mode].insert({id, uiCardPage});
+ }
+}
+
+UICardPage* UICardPageFactory::CreateWatchDial(uint16_t mode, uint16_t id)
+{
+ if (mode >= DIAL_DISPLAY_MODE_MAX ) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Can't create watch dial using invalid mode %d", mode);
+ return nullptr;
+ }
+
+ auto it = watchDials_[mode].find(id);
+ if (it != watchDials_[mode].end()) {
+ return it->second->CreateUICardPage();
+ } else {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Watch dial mode %d id:%d was not registered", mode, id);
+ return nullptr;
+ }
+}
+} // namespace OHOS
* Create: 2022-03-02
*/
-#include "ActivityModel.h"
+#include "activity/ActivityModel.h"
#include <fstream>
#include "iostream"
#include <sstream>
#include "graphic_timer.h"
#include "securec.h"
#include "broadcast_service.h"
-#include "MainClockView.h"
-#include "IndoorWalkPresenter.h"
-#include "ActivityWeekView.h"
+#include "clock/MainClockView.h"
+#include "indoorwalk/IndoorWalkPresenter.h"
+#include "activity/ActivityWeekView.h"
#include "graphic_service.h"
#ifdef __cplusplus
{
MainClockView *mainClockView = OHOS::MainClockView::GetInstance();
if (mainClockView != nullptr) {
- GraphicService::GetInstance()->PostGraphicEvent(
- std::bind(&MainClockView::RefreshStep, mainClockView, value));
+ GraphicService::GetInstance()->PostGraphicEvent([value]() {
+ if (OHOS::MainClockView::GetInstance() != nullptr) {
+ OHOS::MainClockView::GetInstance()->RefreshStep(value);
+ }
+ });
}
IndoorWalkPresenter *indoorWalkPresenter = OHOS::IndoorWalkPresenter::GetInstance();
if (indoorWalkPresenter != nullptr) {
- GraphicService::GetInstance()->PostGraphicEvent(
- std::bind(&IndoorWalkPresenter::ModifiesSteps, indoorWalkPresenter, value));
+ GraphicService::GetInstance()->PostGraphicEvent([value]() {
+ if (OHOS::IndoorWalkPresenter::GetInstance() != nullptr) {
+ OHOS::IndoorWalkPresenter::GetInstance()->ModifiesSteps(value);
+ }
+ });
}
ActivityWeekView *activityWeekView = OHOS::ActivityWeekView::GetInstance();
if (activityWeekView == nullptr) {
return;
}
- GraphicService::GetInstance()->PostGraphicEvent(
- std::bind(&ActivityWeekView::RefreshSteps, activityWeekView, value));
+ GraphicService::GetInstance()->PostGraphicEvent([value]() {
+ if (OHOS::ActivityWeekView::GetInstance() != nullptr) {
+ OHOS::ActivityWeekView::GetInstance()->RefreshSteps(value);
+ }
+ });
if (msgId == TOPIC_EVENT_STEPDATA_UPDATE) {
- GraphicService::GetInstance()->PostGraphicEvent(
- std::bind(&ActivityWeekView::RefreshTodayView, activityWeekView, value));
+ GraphicService::GetInstance()->PostGraphicEvent([value]() {
+ if (OHOS::ActivityWeekView::GetInstance() != nullptr) {
+ OHOS::ActivityWeekView::GetInstance()->RefreshTodayView(value);
+ }
+ });
} else if (msgId == TOPIC_EVENT_NEXTDAY_UPDATE) {
- GraphicService::GetInstance()->PostGraphicEvent(
- std::bind(&ActivityWeekView::InitAvgStep, activityWeekView));
+ GraphicService::GetInstance()->PostGraphicEvent([]() {
+ if (OHOS::ActivityWeekView::GetInstance() != nullptr) {
+ OHOS::ActivityWeekView::GetInstance()->InitAvgStep();
+ }
+ });
if (OHOS::ActivityModel::GetInstance()->GetWeekToday() == MONDAY_STEP_COUNTER) {
- GraphicService::GetInstance()->PostGraphicEvent(
- std::bind(&ActivityWeekView::InitWeekView, activityWeekView));
+ GraphicService::GetInstance()->PostGraphicEvent([]() {
+ if (OHOS::ActivityWeekView::GetInstance() != nullptr) {
+ OHOS::ActivityWeekView::GetInstance()->InitWeekView();
+ }
+ });
}
}
}
counter += *(uint32_t *)request->data;
OHOS::ActivityModel::GetInstance()->ReviseStepCounter(counter);
- GraphicService::GetInstance()->PostGraphicEvent(
- std::bind(&ActivityModel::SetStepData, ActivityModel::GetInstance(), counter));
+ GraphicService::GetInstance()->PostGraphicEvent([counter]() {
+ if (ActivityModel::GetInstance() != nullptr) {
+ ActivityModel::GetInstance()->SetStepData(counter);
+ }
+ });
RefreshStepControls(counter, TOPIC_EVENT_STEPDATA_UPDATE);
}
GraphicService::GetInstance()->PostGraphicEvent(std::bind(SaveEveryMinCallbackProc, data));
}
-void ActivityModel::SetStepData(uint32_t &value)
+void ActivityModel::SetStepData(const uint32_t &value)
{
g_stepData1.weekSteps[weekToday] = value;
// 第一次上报数据后打开定时器
#include "gfx_utils/graphic_types.h"\r
#include "components/ui_checkbox.h"\r
#include "UiConfig.h"\r
-#include "ActivityPresenter.h"\r
+#include "activity/ActivityPresenter.h"\r
#include "NativeRegisterManager.h"\r
\r
namespace OHOS {\r
\r
REGIST_SLICE(VIEW_MAIN_ACTIVITY, MainActivityView, ActivityPresenter);\r
- \r
+\r
static ActivityPresenter *g_pActivityPresenter = nullptr;\r
ActivityPresenter::ActivityPresenter()\r
{\r
\r
bool ActivityPresenter::OnDrag(UIView& view, const DragEvent& event)\r
{\r
- WEARABLE_LOGD("WEARABLE_LOG_MODULE_APP", "ActivityPresenter::OnDrag");\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ActivityPresenter::OnDrag");\r
if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {\r
if (strcmp(view.GetViewId(), ACTIVITY_WEEK_VIEW) == 0) {\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ActivityPresenter::OnDrag on ACTIVITY_WEEK_VIEW");\r
* Create: 2021-10-18\r
*/\r
\r
-#include "ActivityWeekView.h"\r
-#include "ActivityPresenter.h"\r
+#include "activity/ActivityWeekView.h"\r
+#include "activity/ActivityPresenter.h"\r
#include "common/image_cache_manager.h"\r
\r
namespace OHOS {\r
*/\r
\r
#include "components/ui_label.h"\r
-#include "MainActivityView.h"\r
+#include "activity/MainActivityView.h"\r
\r
namespace OHOS {\r
\r
* Create: 2021-09-18
*/
-#include "AddCardAdapter.h"
+#include "add_card/AddCardAdapter.h"
namespace OHOS {
AddCardAdapter::AddCardAdapter() {}
-#include "AddCardItem.h"\r
-#include "AddCardPresenter.h"\r
+#include "add_card/AddCardItem.h"\r
+#include "add_card/AddCardPresenter.h"\r
#include "wearable_log.h"\r
\r
namespace OHOS {\r
* Create: 2021-11-23
*/
-#include "AddCardModel.h"
+#include "add_card/AddCardModel.h"
#include "kv_store.h"
#include "securec.h"
* Create: 2021-11-23
*/
-#include "AddCardView.h"
-#include "AddCardModel.h"
-#include "AddCardPresenter.h"
+#include "add_card/AddCardView.h"
+#include "add_card/AddCardModel.h"
+#include "add_card/AddCardPresenter.h"
#include "hal_tick.h"
#include "NativeRegisterManager.h"
*/
#include <string>
-#include "AddCardView.h"
-#include "AddCardPresenter.h"
+#include "add_card/AddCardView.h"
+#include "add_card/AddCardPresenter.h"
namespace OHOS {
AddCardView::AddCardView()
#include "samgr_lite.h"
#include "graphic_mutex.h"
#include "UiConfig.h"
-#include "AlarmClockModel.h"
-#include "AlarmPopUpPresenter.h"
+#include "alarm/AlarmClockModel.h"
+#include "alarm/AlarmPopUpPresenter.h"
#include "graphic_service.h"
-#include "PlayersModel.h"
-#include "PhoneService.h"
-#include "ui_service.h"
+#include "player/PlayersModel.h"
+#include "phoneservice/PhoneService.h"
+#include "uiservice/ui_service.h"
#ifdef __cplusplus
extern "C" {
}
currentAlarm[clockListener]->delayNum++;
clockQueueMsg->eventType = EVENT_ALARM_RING_DELAY;
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmClockModel::ButtonStatusRing clockQueueMsg->eventType is %u",
- clockQueueMsg->eventType);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmClockModel::SetDelayAlarm %u %u", clockQueueMsg->eventType, alarm);
(clockQueueMsg->data).value = alarm;
AlmmgrAlarmClockEventProcess(clockQueueMsg);
return;
return;
}
clockQueueMsg->eventType = EVENT_ALARM_RING_CANCEL;
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmClockModel::ButtonStatusRing clockQueueMsg->eventType is %u",
- clockQueueMsg->eventType);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmClockModel::SetCancelAlarm %u %u", clockQueueMsg->eventType, alarm);
(clockQueueMsg->data).value = alarm;
AlmmgrAlarmClockEventProcess(clockQueueMsg);
return;
void AlarmPlayerCallbackImpl::OnPlaybackComplete()
{
- GraphicService::GetInstance()->PostGraphicEvent(
- std::bind(&OHOS::AlarmClockModel::DeactAudioInter, OHOS::AlarmClockModel::GetInstance()));
+ /* msg center已处理,此处注释 */
+ // GraphicService::GetInstance()->PostGraphicEvent(
+ // std::bind(&OHOS::AlarmClockModel::DeactAudioInter, OHOS::AlarmClockModel::GetInstance()));
}
uint16_t AlarmClockModel::JudgePreSlice(void)
* Create: 2021-09-11\r
*/\r
\r
-#include "AlarmCloseRingView.h"\r
+#include "alarm/AlarmCloseRingView.h"\r
#include "common/screen.h"\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
#include "ohos_timer.h"\r
#include "graphic_timer.h"\r
\r
-#include "AlarmPopUpPresenter.h"\r
-#include "PhoneService.h"\r
+#include "alarm/AlarmPopUpPresenter.h"\r
+#include "phoneservice/PhoneService.h"\r
\r
namespace OHOS {\r
#define CLOSE "关闭"\r
* Create: 2021-09-11\r
*/\r
\r
-#include "AlarmConfigView.h"\r
+#include "alarm/AlarmConfigView.h"\r
#include "UiConfig.h"\r
#include <string>\r
-#include "AlarmPresenter.h"\r
+#include "alarm/AlarmPresenter.h"\r
#include <sstream>\r
#include "color.h"\r
\r
* Create: 2021-09-11\r
*/\r
\r
-#include "AlarmJudgeView.h"\r
+#include "alarm/AlarmJudgeView.h"\r
#include "UiConfig.h"\r
#include <string>\r
-#include "AlarmPresenter.h"\r
+#include "alarm/AlarmPresenter.h"\r
\r
namespace OHOS {\r
#define DELETE_INETERFACES "是否删除此闹钟?"\r
* Create: 2021-09-11\r
*/\r
\r
-#include "AlarmMaxClock.h"\r
+#include "alarm/AlarmMaxClock.h"\r
#include "UiConfig.h"\r
#include <string>\r
#include "ohos_timer.h"\r
#include "graphic_timer.h"\r
\r
-#include "AlarmPresenter.h"\r
-#include "MainAlarmView.h"\r
+#include "alarm/AlarmPresenter.h"\r
+#include "alarm/MainAlarmView.h"\r
\r
namespace OHOS {\r
#define MAX_INETERFACES "当前闹钟个数已达上限"\r
* Create: 2021-09-11\r
*/\r
\r
-#include "AlarmNewTimeView.h"\r
+#include "alarm/AlarmNewTimeView.h"\r
#include "common/screen.h"\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
*/\r
\r
\r
-#include "AlarmPopUpPresenter.h"\r
-#include "MainAlarmView.h"\r
+#include "alarm/AlarmPopUpPresenter.h"\r
+#include "alarm/MainAlarmView.h"\r
#include "ChangeSliceListener.h"\r
-#include "PhoneService.h"\r
-#include "PlayersModel.h"\r
+#include "phoneservice/PhoneService.h"\r
+#include "player/PlayersModel.h"\r
#include "NativeRegisterManager.h"\r
\r
namespace OHOS {\r
* Create: 2021-09-11\r
*/\r
\r
-#include "AlarmPopUpView.h"\r
-#include "AlarmPopUpPresenter.h"\r
+#include "alarm/AlarmPopUpView.h"\r
+#include "alarm/AlarmPopUpPresenter.h"\r
#include "common/screen.h"\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
*/\r
\r
\r
-#include "AlarmPresenter.h"\r
-#include "MainAlarmView.h"\r
+#include "alarm/AlarmPresenter.h"\r
+#include "alarm/MainAlarmView.h"\r
#include "NativeRegisterManager.h"\r
#include "ChangeSliceListener.h"\r
#include "string"\r
* Create: 2021-09-11\r
*/\r
\r
-#include "AlarmRingView.h"\r
+#include "alarm/AlarmRingView.h"\r
#include "common/screen.h"\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
#include <string>\r
-#include "AlarmPopUpPresenter.h"\r
+#include "alarm/AlarmPopUpPresenter.h"\r
#include "ohos_timer.h"\r
#include "graphic_timer.h"\r
-#include "PhoneService.h"\r
+#include "phoneservice/PhoneService.h"\r
\r
namespace OHOS {\r
#define RING_AGAIN "响铃将在十分钟后再次响起"\r
* Create: 2021-09-11\r
*/\r
\r
-#include "AlarmSetTimeView.h"\r
+#include "alarm/AlarmSetTimeView.h"\r
#include "common/screen.h"\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
* Create: 2021-09-11\r
*/\r
\r
-#include "AlarmSetWeekView.h"\r
+#include "alarm/AlarmSetWeekView.h"\r
#include "common/screen.h"\r
#include "components/ui_digital_clock.h"\r
\r
* Create: 2021-09-11
*/
-#include "MainAlarmView.h"
+#include "alarm/MainAlarmView.h"
#include "UiConfig.h"
#include "ui_label_button.h"
-#include "PhoneService.h"
+#include "phoneservice/PhoneService.h"
namespace OHOS {
static MainAlarmView *g_MainAlarmView = nullptr;
#include "broadcast_service.h"
#include "samgr_lite.h"
-#include "RtcService.h"
-#include "AlarmClockTimerConfig.h"
-#include "AlarmClockManage.h"
+#include "rtcservice/RtcService.h"
+#include "alarmclocktimerconfig/AlarmClockTimerConfig.h"
+#include "alarmclockmanage/AlarmClockManage.h"
#ifdef __cplusplus
extern "C" {
#include "thread_adapter.h"\r
#include "graphic_service.h"\r
\r
-#include "AlarmClockTimerConfig.h"\r
+#include "alarmclocktimerconfig/AlarmClockTimerConfig.h"\r
\r
#ifdef __cplusplus\r
extern "C" {\r
if ((g_alarmCtrA.callback != nullptr) &&\r
(g_alarmCtrA.info.hour == curTime.tm_hour) &&\r
(g_alarmCtrA.info.minute == curTime.tm_min)) {\r
- g_alarmCtrA.callback();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmA Called %d %d", curTime.tm_hour, curTime.tm_min);\r
g_alarmCtrA.state = ALARM_STATUS_CREATED;\r
+ g_alarmCtrA.callback();\r
}\r
}\r
\r
(g_alarmCtrB.info.week == curTime.tm_wday) &&\r
(g_alarmCtrB.info.hour == curTime.tm_hour) &&\r
(g_alarmCtrB.info.minute == curTime.tm_min)) {\r
- g_alarmCtrB.callback();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmB Called %d %d", curTime.tm_hour, curTime.tm_min);\r
g_alarmCtrB.state = ALARM_STATUS_CREATED;\r
+ g_alarmCtrB.callback();\r
}\r
}\r
}\r
#include "UiConfig.h"\r
#include <string>\r
#include "cmsis_os.h"\r
-#include "AlipayBarCode.h"\r
-#include "AlipayModel.h"\r
+#include "alipay/AlipayBarCode.h"\r
+#include "alipay/AlipayModel.h"\r
\r
namespace OHOS {\r
#define ALIPAY_BARCODE_SPACE 32\r
*/\r
#include "UiConfig.h"\r
#include <string>\r
-#include "AlipayBind.h"\r
-#include "AlipayModel.h"\r
+#include "alipay/AlipayBind.h"\r
+#include "alipay/AlipayModel.h"\r
\r
namespace OHOS {\r
static const char *BIND_TITLE = (char *)"使用支付宝扫码绑定";\r
#include "layout/grid_layout.h"\r
#include "font/ui_font.h"\r
#include <string>\r
-#include "AlipayBindAni.h"\r
+#include "alipay/AlipayBindAni.h"\r
#include "common/image_cache_manager.h"\r
#include "graphic_service.h"\r
\r
#include "font/ui_font.h"\r
#include <string>\r
#include "cmsis_os.h"\r
-#include "AlipayBindRes.h"\r
-#include "AlipayModel.h"\r
+#include "alipay/AlipayBindRes.h"\r
+#include "alipay/AlipayModel.h"\r
\r
namespace OHOS {\r
static const int16 EXIT_LABEL_X_FIRST = 151;\r
#include "layout/grid_layout.h"\r
#include "font/ui_font.h"\r
#include <string>\r
-#include "AlipayExitBind.h"\r
+#include "alipay/AlipayExitBind.h"\r
\r
namespace OHOS {\r
static const int16 EXIT_LABEL_X_FIRST = 132;\r
#include "UiConfig.h"\r
#include <string>\r
#include "cmsis_os.h"\r
-#include "AlipayHelp.h"\r
-#include "AlipayModel.h"\r
+#include "alipay/AlipayHelp.h"\r
+#include "alipay/AlipayModel.h"\r
\r
namespace OHOS {\r
static const char *HELP_TITLE = (char*)"使用支付宝扫码求助";\r
* Create:
*/
-#include "AlipayListAdapter.h"
-#include "AlipayListItemView.h"
+#include "alipay/AlipayList/AlipayListAdapter.h"
+#include "alipay/AlipayList/AlipayListItemView.h"
namespace OHOS {
AlipayListAdapter::AlipayListAdapter()
*/
#include "wearable_log.h"
-#include "AlipayListItemView.h"
+#include "alipay/AlipayList/AlipayListItemView.h"
namespace OHOS {
static constexpr int16 ALIPAY_LIST_ICON_X = 20;
*/
#include <string>
-#include "AlipayListView.h"
-#include "AlipayListItem.h"
+#include "alipay/AlipayList/AlipayListView.h"
+#include "alipay/AlipayList/AlipayListItem.h"
#include "cmsis_os2.h"
namespace OHOS {
* Create:\r
*/\r
\r
-#include "AlipayMainView.h"\r
+#include "alipay/AlipayMainView.h"\r
#include "UiConfig.h"\r
#include "alipay_feature.h"\r
\r
\r
#include "UiConfig.h"\r
#include "alipay_feature.h"\r
-#include "AlipayModel.h"\r
-#include "AlipayMainView.h"\r
+#include "alipay/AlipayModel.h"\r
+#include "alipay/AlipayMainView.h"\r
#include "graphic_service.h"\r
\r
namespace OHOS {\r
#include "UiConfig.h"\r
#include <string>\r
#include "cmsis_os.h"\r
-#include "AlipayPayCode.h"\r
-#include "AlipayModel.h"\r
+#include "alipay/AlipayPayCode.h"\r
+#include "alipay/AlipayModel.h"\r
\r
namespace OHOS {\r
static AlipayPayCode *g_alipayPayCode = nullptr;\r
* Create:\r
*/\r
\r
-#include "AlipayPresenter.h"\r
-#include "AlipayMainView.h"\r
+#include "alipay/AlipayPresenter.h"\r
+#include "alipay/AlipayMainView.h"\r
#include "ChangeSliceListener.h"\r
#include "graphic_service.h"\r
#include "string"\r
#include "sstream"\r
#include "errcode.h"\r
#include "pm_definition.h"\r
-#include "AlipayListView.h"\r
-#include "AlipayListItemView.h"\r
-#include "AlipayTransListItemView.h"\r
-#include "AlipayTransListView.h"\r
+#include "alipay/AlipayList/AlipayListView.h"\r
+#include "alipay/AlipayList/AlipayListItemView.h"\r
+#include "alipay/AlipayTrans/AlipayTransListItemView.h"\r
+#include "alipay/AlipayTrans/AlipayTransListView.h"\r
#include "NativeRegisterManager.h"\r
\r
namespace OHOS {\r
\r
void AlipayPresenter::OnResume(void)\r
{\r
- Presenter<AlipayMainView>::OnResume();\r
svr_alipay_create_task();\r
}\r
\r
#include "UiConfig.h"\r
#include <string>\r
#include "cmsis_os.h"\r
-#include "AlipaySetting.h"\r
-#include "AlipayModel.h"\r
+#include "alipay/AlipaySetting.h"\r
+#include "alipay/AlipayModel.h"\r
\r
namespace OHOS {\r
static const char *SETTING_TITLE = (char *)"设置";\r
#include "font/ui_font.h"\r
#include <string>\r
#include "cmsis_os.h"\r
-#include "AlipayGetTransList.h"\r
+#include "alipay/AlipayTrans/AlipayGetTransList.h"\r
\r
namespace OHOS {\r
static const int16 EXIT_LABEL_X_FIRST = 60;\r
#include "font/ui_font.h"\r
#include <string>\r
#include "cmsis_os.h"\r
-#include "AlipayTransAni.h"\r
+#include "alipay/AlipayTrans/AlipayTransAni.h"\r
#include "common/image_cache_manager.h"\r
#include "graphic_service.h"\r
\r
#include "UiConfig.h"\r
#include <string>\r
#include "cmsis_os.h"\r
-#include "AlipayTransCode.h"\r
-#include "AlipayModel.h"\r
+#include "alipay/AlipayTrans/AlipayTransCode.h"\r
+#include "alipay/AlipayModel.h"\r
\r
namespace OHOS {\r
static const char *TRANSCODE_BUTTON = (char *)"切换交通卡";\r
#include "UiConfig.h"\r
#include <string>\r
#include "cmsis_os.h"\r
-#include "AlipayTransEnable.h"\r
-#include "AlipayModel.h"\r
+#include "alipay/AlipayTrans/AlipayTransEnable.h"\r
+#include "alipay/AlipayModel.h"\r
\r
namespace OHOS {\r
static const char *TRANSCODE_TITLE = (char *)"乘车码未开通";\r
* Create:
*/
-#include "AlipayTransListAdapter.h"
-#include "AlipayTransListItemView.h"
+#include "alipay/AlipayTrans/AlipayTransListAdapter.h"
+#include "alipay/AlipayTrans/AlipayTransListItemView.h"
namespace OHOS {
AlipayTransListAdapter::AlipayTransListAdapter()
*/
#include "wearable_log.h"
-#include "AlipayTransListItemView.h"
+#include "alipay/AlipayTrans/AlipayTransListItemView.h"
namespace OHOS {
static constexpr int16_t ALIPAY_TRANS_LIST_ITEM_BUTTON_HEIGHT = 95;
*/
#include <string>
-#include "AlipayTransListView.h"
-#include "AlipayTransListItem.h"
-#include "AlipayModel.h"
+#include "alipay/AlipayTrans/AlipayTransListView.h"
+#include "alipay/AlipayTrans/AlipayTransListItem.h"
+#include "alipay/AlipayModel.h"
#include "cmsis_os2.h"
#include "common_def.h"
#include "font/ui_font.h"\r
#include <string>\r
#include "cmsis_os.h"\r
-#include "AlipayTransRes.h"\r
-#include "AlipayModel.h"\r
+#include "alipay/AlipayTrans/AlipayTransRes.h"\r
+#include "alipay/AlipayModel.h"\r
\r
namespace OHOS {\r
static const int16 EXIT_LABEL_X_FIRST = 38;\r
#include "font/ui_font.h"\r
#include <string>\r
#include "cmsis_os.h"\r
-#include "AlipayTransTips.h"\r
-#include "AlipayModel.h"\r
+#include "alipay/AlipayTrans/AlipayTransTips.h"\r
+#include "alipay/AlipayModel.h"\r
\r
namespace OHOS {\r
static const int16 TIPS_LABEL_X_FIRST = 38;\r
#include "font/ui_font.h"\r
#include <string>\r
#include "cmsis_os.h"\r
-#include "AlipayUnbind.h"\r
+#include "alipay/AlipayUnbind.h"\r
\r
namespace OHOS {\r
static const int16 EXIT_LABEL_X_FIRST = 132;\r
#include "UiConfig.h"\r
#include <string>\r
#include "cmsis_os.h"\r
-#include "AlipayUnbindFinish.h"\r
+#include "alipay/AlipayUnbindFinish.h"\r
\r
namespace OHOS {\r
static AlipayUnbindFinish *g_alipayUnbindFinish = nullptr;\r
* Create: 2024-10-30
*/
-#include "AodModel.h"
+#include "aod_view/AodModel.h"
+#include <unistd.h>
+#include "securec.h"
#include "kv_store.h"
namespace OHOS {
* Create: 2024-10-30
*/
-#include "AodPresenter.h"
+#include "aod_view/AodPresenter.h"
#include "NativeRegisterManager.h"
namespace OHOS {
* Create: 2024-10-30
*/
-#include "AodView.h"
-#include "AodPresenter.h"
-#include "AodModel.h"
+#include "aod_view/AodView.h"
+#include "aod_view/AodPresenter.h"
+#include "aod_view/AodModel.h"
#include "common/graphic_utils.h"
-#include "DialBinParser.h"
-#include "DialViewGroup.h"
-#include "AmbientClockView.h"
-#include "DialModelTime.h"
+#include "UICardPageFactory.h"
+#include "main/DialBinParser.h"
+#include "main/dial/DialViewGroup.h"
+#include "clock/AmbientClockView.h"
+#include "main/dial/DialModelTime.h"
namespace OHOS {
AodView::~AodView()
UIViewGroup *AodView::InitAodDial(DialSetting &setting)
{
- switch (setting.dialId) {
- case DIAL_CLOCK:
- return new AmbientClockView;
- default:
- return nullptr;
- }
- return nullptr;
+ return UICardPageFactory::GetInstance().CreateWatchDial(DIAL_DISPLAY_MODE_AOD, setting.dialId);
}
UIViewGroup *AodView::InitAodOffDial(DialSetting &setting)
if (fp == nullptr) {
return nullptr;
}
- bool ret = DialBinParserManager::GetInstance()->GetDialPreviewInfo(fp, &preview);
+ bool ret = DialBinParserManager::GetInstance()->GetDialPreviewInfo(setting.dialFullName, fp, &preview);
fclose(fp);
if (!ret) {
return nullptr;
+++ /dev/null
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: ApplistModel.h
- * Author:
- * Create: 2021-09-18
- */
-
-#ifndef APPLIST_MODEL_H
-#define APPLIST_MODEL_H
-
-#include "bundle_info.h"
-#include "AppViewIDs.h"
-#include "ohos_types.h"
-
-#define APP_MAX_NUM 50
-
-namespace OHOS {
-typedef struct {
- uint16_t id;
- const char *iconLarge;
- const char *iconSmall;
- const char *iconHexagon;
- const char *label;
- const char *uid;
-} AppItem;
-
-enum AppListStyle {
- APPLIST_STYLE,
- HEXAGONS_STYLE,
- FOOTBALL_STYLE,
- WATERFALL_STYLE
-};
-
-class ApplistPresenter;
-class ApplistModel {
-public:
- static ApplistModel &GetInstance(void);
-
- void Init();
- const AppItem *GetApplistItems() const;
- uint8 GetAppListNum() const;
- void ResolvingJSAppItems(void);
- void SetStartIndex(uint16_t index);
- uint16_t GetStartIndex(void);
- void SetHeadItemY(int index);
- int GetHeadItemY(void);
- void ApplistUpdate(void);
- void SetPresenter(ApplistPresenter *p);
- AppListStyle GetCurrentStyle(void);
- void SetInitFlag(bool flag);
-
-private:
- ApplistModel();
- ApplistModel(const ApplistModel &);
- ApplistModel &operator=(const ApplistModel &);
- virtual ~ApplistModel();
- ApplistPresenter *presenter{nullptr};
-
- AppItem applist[APP_MAX_NUM] = { VIEW_INVALID, nullptr, nullptr, nullptr, nullptr, nullptr };
- BundleInfo *bundleInfos = nullptr;
- int32 bundleLen = 0;
- uint8 appLen = 0;
-
- uint16_t startIndex = 0;
- int headItemY = 0;
- bool initFlag{false};
-};
-}
-
-#endif
* Create: 2021-09-18
*/
-#include "AppItemView.h"
+#include "applist/AppItemView.h"
+#include "common/image_cache_manager.h"
#include "wearable_log.h"
namespace OHOS {
{
Remove(&icon_);
Remove(&label_);
+ if (itemInfo_.iconSmall == nullptr && itemInfo_.resPath != nullptr) {
+ ImageCacheManager::GetInstance().UnloadOneInMultiRes(itemInfo_.resId, itemInfo_.resPath);
+ }
}
void AppItemView::SetUpChild()
void AppItemView::SetItemInfo(const AppItem &itemInfo)
{
itemInfo_ = itemInfo;
- icon_.SetSrc(itemInfo.iconSmall);
- label_.SetText(itemInfo.label);
+ if (itemInfo.label == nullptr) {
+ if (itemInfo.labelId != STR_MAX_ID) {
+ label_.SetTextId(itemInfo.labelId);
+ } else {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AppItemView::SetItemInfo label is null and labelId equal STR_MAX_ID!");
+ }
+ } else {
+ label_.SetText(itemInfo.label);
+ }
+ if (itemInfo.iconSmall == nullptr && itemInfo_.resPath != nullptr) {
+ ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(itemInfo.resId, itemInfo.resPath);
+ if (image != nullptr) {
+ icon_.SetSrc(image);
+ } else {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AppItemView::SetItemInfo image get failed!");
+ }
+ } else {
+ icon_.SetSrc(itemInfo.iconSmall);
+ }
}
AppViewId AppItemView::GetViewId()
HexagonsItemView::~HexagonsItemView()
{
+ if (itemInfo_.iconSmall == nullptr && itemInfo_.resPath != nullptr) {
+ ImageCacheManager::GetInstance().UnloadOneInMultiRes(itemInfo_.resId, itemInfo_.resPath);
+ }
}
void HexagonsItemView::SetItemInfo(const AppItem &itemInfo)
return itemInfo_.uid;
}
+ FootballItemView::~FootballItemView()
+ {
+ if (itemInfo_.iconHexagon == nullptr && itemInfo_.hexagonPath != nullptr) {
+ ImageCacheManager::GetInstance().UnloadOneInMultiRes(itemInfo_.hexagonId, itemInfo_.hexagonPath);
+ }
+ }
+
void FootballItemView::SetItemInfo(const AppItem &itemInfo)
{
itemInfo_ = itemInfo;
{
return itemInfo_.uid;
}
+
+ WaterfallItemView::~WaterfallItemView()
+ {
+ if (itemInfo_.iconSmall == nullptr && itemInfo_.resPath != nullptr) {
+ ImageCacheManager::GetInstance().UnloadOneInMultiRes(itemInfo_.resId, itemInfo_.resPath);
+ }
+ }
void WaterfallItemView::SetItemInfo(const AppItem &itemInfo)
{
* Create: 2021-09-18
*/
-#include "ApplistAdapter.h"
+#include "applist/ApplistAdapter.h"
namespace OHOS {
ApplistAdapter::ApplistAdapter() {}
#include "utils.h"
#include "bundlems_slite_client.h"
#include "wearable_log.h"
-
#include "UiConfig.h"
-#include "ApplistModel.h"
-#include "ApplistPresenter.h"
-#include "SetDesktopView.h"
+#include "applist/ApplistModel.h"
+#include "applist/ApplistPresenter.h"
+#include "font/font_global_manager.h"
+#include "settings/SetDesktopModel.h"
#include "NativeRegisterManager.h"
namespace OHOS {
applist[appLen] = {
VIEW_EXTERN_APP,
bundleInfos[len].smallIconPath,
- bundleInfos[len].smallIconPath,
bundleInfos[len].bigIconPath,
bundleInfos[len].label,
bundleInfos[len].bundleName
AppListStyle ApplistModel::GetCurrentStyle(void)
{
- uint8_t currenStyle = SetDesktopView::GetInstance()->GetCurrentSelectedStyle();
- if (currenStyle == 1) { // 1: hexagons desktop style
- return HEXAGONS_STYLE;
- } else if (currenStyle == 2) { // 2: football desktop style
- return FOOTBALL_STYLE;
- } else if (currenStyle == 3) { // 3: waterfall desktop style
- return WATERFALL_STYLE;
- } else {
- return APPLIST_STYLE;
- }
+ return static_cast<AppListStyle>(SetDesktopModel::GetInstance().GetDesktopStyle());
}
}
* Create: 2021-09-18
*/
-#include "ApplistPresenter.h"
+#include "applist/ApplistPresenter.h"
#include "ability_manager.h"
#include "securec.h"
#include "components/ui_hexagons_list.h"
void ApplistPresenter::OnResume()
{
- Presenter::OnResume();
if (GetCurrentStyle() == AppListStyle::FOOTBALL_STYLE) {
view_->StartFootBallAnimator();
} else if (GetCurrentStyle() == AppListStyle::WATERFALL_STYLE) {
*/
#include "components/ui_view_group.h"
-#include "ApplistView.h"
-#include "ApplistPresenter.h"
-#include "AppItemView.h"
+#include "applist/ApplistView.h"
+#include "applist/ApplistPresenter.h"
+#include "applist/AppItemView.h"
#include "common/image_cache_manager.h"
+#include "common/screen.h"
#include "hal_tick.h"
namespace OHOS {
presenter_->SetStartIndex(listHeadIndex);
}
+void ApplistView::LoadAppIconImage(UIImageView *view, const uint32_t id, const char *path)
+{
+ ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(id, path);
+ if (image == nullptr) {
+ GRAPHIC_LOGE("Load App Icon path %s Image %x fail\n", path, id);
+ return;
+ }
+ view->SetSrc(image);
+}
+
void ApplistView::AddAppItemToList(const AppItem &item)
{
AppListStyle style = presenter_->GetCurrentStyle();
if (style == AppListStyle::FOOTBALL_STYLE) {
FootballItemView *itemView = new FootballItemView();
itemView->SetItemInfo(item);
- itemView->SetSrc(item.iconHexagon);
+ if (item.iconHexagon == nullptr && item.hexagonPath != nullptr) {
+ LoadAppIconImage(itemView, item.hexagonId, item.hexagonPath);
+ } else {
+ itemView->SetSrc(item.iconHexagon);
+ }
itemView->SetTouchable(true);
itemView->SetOnClickListener(presenter_);
footballList_->Add(itemView);
} else if (style == AppListStyle::HEXAGONS_STYLE) {
HexagonsItemView *itemView = new HexagonsItemView();
itemView->SetItemInfo(item);
- itemView->SetSrc(item.iconSmall);
+ if (item.iconSmall == nullptr && item.resPath != nullptr) {
+ LoadAppIconImage(itemView, item.resId, item.resPath);
+ } else {
+ itemView->SetSrc(item.iconSmall);
+ }
itemView->SetTouchable(true);
itemView->SetOnClickListener(presenter_);
hexagonsList_->Add(itemView);
} else if (style == AppListStyle::WATERFALL_STYLE) {
WaterfallItemView *itemView = new WaterfallItemView();
itemView->SetItemInfo(item);
- itemView->SetSrc(item.iconSmall);
+ if (item.iconSmall == nullptr && item.resPath != nullptr) {
+ LoadAppIconImage(itemView, item.resId, item.resPath);
+ } else {
+ itemView->SetSrc(item.iconSmall);
+ }
itemView->SetTouchable(true);
itemView->SetOnClickListener(presenter_);
waterfallList_->Add(itemView);
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ */\r
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: SettingModel.cpp\r
+ * Author:\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include <sys/time.h>\r
+#include "blood/BloodModel.h"\r
+#include "blood/BloodView.h"\r
+#include "ohos_timer.h"\r
+#include "wearable_log.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint64_t CENTI_SECOND_UNIT = 100;\r
+static constexpr uint64_t MS_ONE_SECONDS = 1000;\r
+static constexpr uint16_t NUM_TEN = 10;\r
+static constexpr uint16_t NUM_TIME_MIN = 60;\r
+static constexpr uint16_t NUM_TIME_HOUR = 3600;\r
+static constexpr int32_t NUM_TIME_DAY = 86400;\r
+\r
+static constexpr int16_t MIN_TO_HOUR = 60;\r
+static constexpr int16_t HOURLY_SYSTEM = 24;\r
+BloodModel::BloodModel()\r
+{\r
+ InitCurrentTimeTimer();\r
+}\r
+\r
+BloodModel::~BloodModel()\r
+{\r
+ DisableCurrentTimeTimer();\r
+}\r
+\r
+BloodModel &BloodModel::GetInstance()\r
+{\r
+ static BloodModel instance;\r
+ return instance;\r
+}\r
+void BloodModel::SetbuttonStatus(bool status)\r
+{\r
+ buttonStatus = status;\r
+}\r
+\r
+bool BloodModel::GetbuttonStatus()\r
+{\r
+ return buttonStatus;\r
+}\r
+\r
+/* 定时器回调函数 */\r
+static void CurrentTimeTimerCallback(void *data)\r
+{\r
+ (void)data;\r
+ BloodView *view = BloodView::GetInstance();\r
+ if (view != nullptr && view->IsCurrentTimeLabelValid()) {\r
+ std::string currTime = BloodModel::GetInstance().GetCurrentTimeString();\r
+ view->UpdateCurrentTimeLabel(currTime.c_str());\r
+ }\r
+}\r
+\r
+std::string BloodModel::GetCurrentTimeString()\r
+{\r
+ std::string strHours;\r
+ std::string strMinute;\r
+ struct timeval tv;\r
+ gettimeofday(&tv, NULL);\r
+ uint64_t second = tv.tv_sec;\r
+ uint64_t uSecond = tv.tv_usec;\r
+ uint64_t minute = second / MIN_TO_HOUR;\r
+ uint64_t hour = minute / MIN_TO_HOUR;\r
+ uint8_t realHour = static_cast<uint8_t>(hour % HOURLY_SYSTEM);\r
+ uint8_t realMinute = static_cast<uint8_t>(minute % MIN_TO_HOUR);\r
+\r
+ if (realHour >= 0 && realHour < NUM_TEN) {\r
+ strHours = "0" + std::to_string(realHour);\r
+ } else {\r
+ strHours = std::to_string(realHour);\r
+ }\r
+ if (realMinute >= 0 && realMinute < NUM_TEN) {\r
+ strMinute = "0" + std::to_string(realMinute);\r
+ } else {\r
+ strMinute = std::to_string(realMinute);\r
+ }\r
+ return strHours + ":" + strMinute;\r
+}\r
+\r
+void BloodModel::InitCurrentTimeTimer()\r
+{\r
+ if (pCurrentTimeTimer_ != nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchModel::InitCurrentTimeTimer GraphicTimer already exists!!");\r
+ return;\r
+ }\r
+ uint32_t tick = GetOSTick(MS_ONE_SECONDS);\r
+ pCurrentTimeTimer_ = new GraphicTimer(tick, CurrentTimeTimerCallback, nullptr, true);\r
+ if (pCurrentTimeTimer_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchModel::InitCurrentTimeTimer new GraphicTimer failed!!");\r
+ return;\r
+ }\r
+}\r
+\r
+void BloodModel::DisableCurrentTimeTimer()\r
+{\r
+ if (pCurrentTimeTimer_ != nullptr) {\r
+ pCurrentTimeTimer_->Stop();\r
+ delete pCurrentTimeTimer_;\r
+ pCurrentTimeTimer_ = nullptr;\r
+ }\r
+}\r
+\r
+void BloodModel::StartCurrentTimeTimer()\r
+{\r
+ if (pCurrentTimeTimer_ != nullptr) {\r
+ bool retTimer = pCurrentTimeTimer_->Start();\r
+ if (!retTimer) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StartStopwatchTimer GraphicTimer Start failed!!");\r
+ if (pCurrentTimeTimer_ != nullptr) {\r
+ delete pCurrentTimeTimer_;\r
+ pCurrentTimeTimer_ = nullptr;\r
+ }\r
+ return;\r
+ }\r
+ }\r
+}\r
+\r
+void BloodModel::PauseCurrentTimeTimer()\r
+{\r
+ if (pCurrentTimeTimer_ != nullptr) {\r
+ pCurrentTimeTimer_->Stop();\r
+ }\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingPresenter.cpp\r
+ * Author:\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include "blood/BloodPresenter.h"\r
+#include "blood/BloodView.h"\r
+#include "blood/BloodModel.h"\r
+#include "uiservice/ui_service.h"\r
+#include "NativeRegisterManager.h"\r
+namespace OHOS {\r
+\r
+REGIST_MENU(VIEW_BLOOD, BloodView, BloodPresenter, PNG_APPLIST_TEMP_IMAGE, PNG_APPLIST_TEMP_IMAGE, "血氧");\r
+\r
+static BloodPresenter *g_pBloodPresenter = nullptr;\r
+\r
+BloodPresenter::BloodPresenter()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodPresenter::BloodPresenter");\r
+ findPhoneModel = &BloodModel::GetInstance();\r
+ g_pBloodPresenter = this;\r
+}\r
+\r
+BloodPresenter::~BloodPresenter()\r
+{\r
+ g_pBloodPresenter = nullptr;\r
+}\r
+\r
+void BloodPresenter::OnResume(void)\r
+{\r
+ Presenter<BloodView>::OnResume();\r
+ SendMsgToUIService(UI_ADD_SLEEP_VETO, 0, nullptr, 0);\r
+ BloodModel::GetInstance().StartCurrentTimeTimer();\r
+}\r
+\r
+void BloodPresenter::OnPause(void)\r
+{\r
+ Presenter<BloodView>::OnPause();\r
+ SendMsgToUIService(UI_RM_SLEEP_VETO, 0, nullptr, 0);\r
+ BloodModel::GetInstance().PauseCurrentTimeTimer();\r
+ return;\r
+}\r
+\r
+BloodPresenter *BloodPresenter::GetInstance()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodPresenter GetInstance");\r
+ return g_pBloodPresenter;\r
+}\r
+\r
+bool BloodPresenter::ClickFuncId(const char *buttonName)\r
+{\r
+ if (buttonName == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TempPresenter::ClickFuncId buttonName nullptr error!");\r
+ return false;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TempPresenter::ClickFuncId buttonName = %s", buttonName);\r
+ if (strcmp(buttonName, "button1") == 0) {\r
+ } else if (strcmp(buttonName, "button2") == 0) {\r
+ }\r
+ return false;\r
+}\r
+\r
+bool BloodPresenter::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TempPresenter::OnClick ");\r
+ UNUSED(event);\r
+ BloodView::GetInstance()->DropView(view, 1);\r
+ return true;\r
+}\r
+\r
+bool BloodPresenter::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherOnDragListener::OnDrag");\r
+ UNUSED(view);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPresenter::OnDrag %s", view.GetViewId());\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPresenter::OnDrag %s", event.GetDragDirection());\r
+ if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPresenter::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+ BloodView::GetInstance()->DropView(view, 0);\r
+ } else if (event.GetDragDirection() == DragEvent::DIRECTION_RIGHT_TO_LEFT) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPresenter::OnDrag DIRECTION_RIGHT_TO_LEFT");\r
+ BloodView::GetInstance()->DropView(view, 1);\r
+ }\r
+ return false;\r
+}\r
+\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingView.cpp\r
+ * Author:\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include <string>\r
+\r
+#include "blood/BloodView.h"\r
+#include "blood/BloodPresenter.h"\r
+#include "ui_test_group.h"\r
+\r
+namespace OHOS {\r
+static BloodView *g_pBloodView = nullptr;\r
+static const char *BLOOD_LABEL_TWO = (char *)"本功能用于18岁以上健康人群测量运动过程,及之后腕部皮肤温度和体温的变化,"\r
+ "请加入研究,以便及时观察运动前后身体的变化。";\r
+static const char *BLOOD_LABEL_THREE = (char *)"测量需佩戴10分钟以上,且容易受到环境因素影响。目前达不到水银体温计的精"\r
+ "度,测量结果仅供参考,不作为医疗诊断依据。";\r
+static constexpr uint16_t BLOOD_FIRST_LABEL_FONT = 35;\r
+static constexpr uint16_t BLOOD_LABEL_FIRST_X = 45;\r
+static constexpr uint16_t BLOOD_LABEL_FIRST_Y = 120;\r
+static constexpr uint16_t BLOOD_LABEL_SECOND_Y = 350;\r
+static constexpr uint16_t BLOOD_LABEL_THIRD_Y = 650;\r
+static constexpr uint16_t BLOOD_LABEL_FIRST_WIDTH = 350;\r
+static constexpr uint16_t BLOOD_LABEL_FIRST_HEIGHT = 400;\r
+static constexpr uint16_t BLOOD_IMAGE_POSITION_X = 92;\r
+static constexpr uint16_t BLOOD_IMAGE_POSITION_y = 127;\r
+static constexpr uint16_t BLOOD_IMAGE_WIDTH = 276;\r
+static constexpr uint16_t BLOOD_IMAGE_HEIGHT = 125;\r
+static const char *BLOOD_LABEL_ONE =\r
+ (char *)"本功能通过内置温度传感器测量腕部皮肤温度,主要研究腕部皮肤温度和体温的关系。";\r
+static constexpr uint16_t WATCH_TIME_LABEL_CURTIME_XPOS = 188;\r
+static constexpr uint16_t WATCH_TIME_LABEL_CURTIME_YPOS = 12;\r
+static constexpr uint16_t WATCH_TIME_LABEL_CURTIME_WIDTH = 361;\r
+static constexpr uint16_t WATCH_TIME_LABEL_CURTIME_HEIGHT = 80;\r
+static constexpr uint16_t WATCH_TIME_LABEL_CURTIME_FONT_SIZE = 40;\r
+static constexpr uint16_t BLOOD_LAYOUT_POSITION_X = 370;\r
+static constexpr uint16_t BLOOD_LAYOUT_WIDTH = 320;\r
+static constexpr uint16_t BLOOD_BUTTON_POSITION_X = 188;\r
+static constexpr uint16_t BLOOD_BUTTON_POSITION_Y = 320;\r
+static constexpr uint16_t BLOOD_BUTTON_WIDTH = 180;\r
+static constexpr uint16_t BLOOD_BUTTON_HEIGHT = 80;\r
+static constexpr uint16_t BLOOD_BUTTON_TWO_POSITION_Y = 330;\r
+static constexpr uint16_t BLOOD_BUTTON_TWO_WIDTH = 120;\r
+static constexpr uint16_t BLOOD_LABEL_FRONT = 25;\r
+static constexpr uint16_t BLOOD_LABEL1_POSITION_X = 150;\r
+static constexpr uint16_t BLOOD_LABEL1_POSITION_Y = 161;\r
+static constexpr uint16_t BLOOD_LABEL1_WIDTH = 200;\r
+static constexpr uint16_t BLOOD_LABEL1_HEIGHT = 60;\r
+static constexpr uint16_t BLOOD_LABEL_FRONT1 = 60;\r
+static constexpr uint16_t BLOOD_LABEL2_POSITION_X = 150;\r
+static constexpr uint16_t BLOOD_LABEL2_POSITION_Y = 132;\r
+static constexpr uint16_t BLOOD_LABEL2_WIDTH = 200;\r
+static constexpr uint16_t BLOOD_LABEL2_HEIGHT = 60;\r
+static constexpr uint16_t BLOOD_IMAGEANIMATOR_POSITION_X = 84;\r
+static constexpr uint16_t BLOOD_IMAGEANIMATOR_POSITION_Y = 108;\r
+static constexpr uint16_t BLOOD_IMAGEANIMATOR_WIDTH = 100;\r
+static constexpr uint16_t BLOOD_IMAGEANIMATOR_HEIGHT = 100;\r
+\r
+static ImageAnimatorInfo g_imageAnimatorInfo[4] = {\r
+ {PNG_SETTTING_BUTTON_IMAGE, {84, 108}, 116, 116, IMG_SRC_FILE_PATH},\r
+ {PNG_NEW_DEVICE, {84, 108}, 116, 116, IMG_SRC_FILE_PATH},\r
+ {PNG_BT_LIST, {84, 108}, 116, 116, IMG_SRC_FILE_PATH},\r
+ {PNG_GANTAN, {84, 108}, 116, 116, IMG_SRC_FILE_PATH},\r
+};\r
+\r
+BloodView::BloodView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodView::BloodView");\r
+ g_pBloodView = this;\r
+ findPhoneModel = &BloodModel::GetInstance();\r
+}\r
+\r
+BloodView::~BloodView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodView::~BloodView");\r
+ g_pBloodView = nullptr;\r
+ if (currentTime_ != nullptr) {\r
+ delete currentTime_;\r
+ currentTime_ = nullptr;\r
+ }\r
+ if (button != nullptr) {\r
+ delete button;\r
+ button = nullptr;\r
+ }\r
+ if (buttonMore != nullptr) {\r
+ delete buttonMore;\r
+ buttonMore = nullptr;\r
+ }\r
+ if (label1_ != nullptr) {\r
+ delete label1_;\r
+ label1_ = nullptr;\r
+ }\r
+ if (label2_ != nullptr) {\r
+ delete label2_;\r
+ label2_ = nullptr;\r
+ }\r
+ if (layout_ != nullptr) {\r
+ delete layout_;\r
+ layout_ = nullptr;\r
+ }\r
+ if (currentTime_ != nullptr) {\r
+ delete currentTime_;\r
+ currentTime_ = nullptr;\r
+ }\r
+ if (group != nullptr) {\r
+ delete group;\r
+ group = nullptr;\r
+ }\r
+ if (groupTest != nullptr) {\r
+ delete groupTest;\r
+ groupTest = nullptr;\r
+ }\r
+ if (scrollGroup != nullptr) {\r
+ delete scrollGroup;\r
+ scrollGroup = nullptr;\r
+ }\r
+ for (int16_t numGroup = SET_ZERO; numGroup <= MAX_BLOOD_PAGE; numGroup++) {\r
+ if (container[numGroup] != nullptr) {\r
+ container[numGroup] = nullptr;\r
+ }\r
+ }\r
+}\r
+\r
+BloodView *BloodView::GetInstance()\r
+{\r
+ return g_pBloodView;\r
+}\r
+\r
+void BloodView::OnStart()\r
+{\r
+ SetupCurrentTime();\r
+ InitStart();\r
+}\r
+\r
+void BloodView::OnStop()\r
+{\r
+ if (dragListener_ != nullptr) {\r
+ delete dragListener_;\r
+ dragListener_ = nullptr;\r
+ }\r
+ return;\r
+}\r
+\r
+void BloodView::SetupCurrentTime()\r
+{\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::SetupCurrentTime new Label");\r
+ currentTime_ = new UILabel();\r
+ if (currentTime_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::SetupCurrentTime new Label currentTime_ fail");\r
+ return;\r
+ }\r
+ currentTime_->SetPosition(WATCH_TIME_LABEL_CURTIME_XPOS, WATCH_TIME_LABEL_CURTIME_YPOS);\r
+ currentTime_->Resize(WATCH_TIME_LABEL_CURTIME_WIDTH, WATCH_TIME_LABEL_CURTIME_HEIGHT);\r
+ std::string curtime = BloodModel::GetInstance().GetCurrentTimeString();\r
+ currentTime_->SetText(curtime.c_str());\r
+ currentTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WATCH_TIME_LABEL_CURTIME_FONT_SIZE);\r
+ currentTime_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ currentTime_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ currentTime_->SetRollSpeed(0);\r
+ currentTime_->SetVisible(true);\r
+}\r
+\r
+void BloodView::SetUpImageAnimator()\r
+{\r
+ imageAnimator_ = new UIImageAnimatorView();\r
+ if (imageAnimator_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::UIImageAnimatorView new Label currentTime_ fail");\r
+ return;\r
+ }\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::SetUpImageAnimator ");\r
+ imageAnimator_ = new UIImageAnimatorView();\r
+ imageAnimator_->SetPosition(BLOOD_IMAGE_POSITION_X, BLOOD_IMAGE_POSITION_y, BLOOD_IMAGE_WIDTH,\r
+ BLOOD_IMAGE_HEIGHT); // 50 : offset 50 : offset 200 : offset 200: offset\r
+ int imageNumber = 4;\r
+ int ImageUpdate = 300;\r
+ imageAnimator_->SetImageAnimatorSrc(g_imageAnimatorInfo, imageNumber,\r
+ ImageUpdate); // 4: the number of images, 100: updating time\r
+ imageAnimator_->Stop();\r
+ imageAnimator_->LayoutCenterOfParent();\r
+ imageAnimator_->SetDraggable(true);\r
+ UIView::OnDragListener *listener = static_cast<UIView::OnDragListener *>(BloodPresenter::GetInstance());\r
+ imageAnimator_->SetOnDragListener(listener);\r
+ container[BLOOD_START]->Add(imageAnimator_);\r
+ if (layout_ == nullptr) {\r
+ layout_ = new GridLayout();\r
+ uint16_t height = Screen::GetInstance().GetHeight();\r
+\r
+ int heightOffset = 50;\r
+ layout_->SetPosition(BLOOD_LAYOUT_POSITION_X, 0, BLOOD_LAYOUT_WIDTH,\r
+ height - heightOffset); // 370: x , 320: width, 50: offset\r
+ container[BLOOD_START]->Add(layout_);\r
+ layout_->SetLayoutDirection(LAYOUT_VER);\r
+ layout_->SetRows(SET_NINE); // 9 : rows\r
+ layout_->SetCols(SET_TWO); // 2 : columns\r
+ }\r
+ InitImageInfo();\r
+}\r
+\r
+void BloodView::InitStart()\r
+{\r
+ if (group == nullptr) {\r
+ group = new UIViewGroup();\r
+ }\r
+ group->SetPosition(0, 0);\r
+ group->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);\r
+ UIView::OnDragListener *dragListener = static_cast<UIView::OnDragListener *>(BloodPresenter::GetInstance());\r
+ if (dragListener == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "start dragListener = nullptr");\r
+ }\r
+ group->SetOnDragListener(dragListener);\r
+ group->SetViewId("startPage");\r
+ group->SetDraggable(true);\r
+ group->SetTouchable(true);\r
+\r
+ if (button == nullptr) {\r
+ button = new UILabelButton();\r
+ }\r
+ button->SetPosition(BLOOD_BUTTON_POSITION_X,\r
+ BLOOD_BUTTON_TWO_POSITION_Y); // widget's left position and top position\r
+ button->Resize(BLOOD_BUTTON_TWO_WIDTH, BLOOD_BUTTON_HEIGHT); // widget's width and height\r
+ button->SetViewId("button1"); // Set style\r
+ UIView::OnClickListener *clickListener = (UIView::OnClickListener *)(BloodPresenter::GetInstance());\r
+ button->SetOnClickListener(clickListener);\r
+ button->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);\r
+ button->SetVisible(true);\r
+ button->SetText("开始");\r
+\r
+ group->Add(currentTime_);\r
+ group->Add(button);\r
+ container[BLOOD_START] = group;\r
+\r
+ AddViewToRootContainer(container[BLOOD_START]);\r
+ GetRootContainer()->Invalidate();\r
+}\r
+\r
+void BloodView::InitTest()\r
+{\r
+ if (groupTest == nullptr) {\r
+ groupTest = new UIViewGroup();\r
+ }\r
+ groupTest->SetPosition(0, 0);\r
+ groupTest->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);\r
+\r
+ UIView::OnDragListener *dragListener = static_cast<UIView::OnDragListener *>(BloodPresenter::GetInstance());\r
+ if (dragListener == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "init test dragListener = nullptr");\r
+ }\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "init test dragListener successful");\r
+\r
+ groupTest->SetOnDragListener(dragListener);\r
+ groupTest->SetViewId("testPage");\r
+ groupTest->SetDraggable(true);\r
+ groupTest->SetTouchable(true);\r
+\r
+ if (label1_ == nullptr) {\r
+ label1_ = new UILabel();\r
+ }\r
+\r
+ label1_->SetPosition(BLOOD_LABEL1_POSITION_X, BLOOD_LABEL1_POSITION_Y); // widget's left position and top position\r
+ label1_->Resize(BLOOD_LABEL1_WIDTH, BLOOD_LABEL1_HEIGHT); // widget's width and height\r
+ label1_->SetViewId("label1"); // Set style\r
+ label1_->SetStyle(STYLE_TEXT_FONT, BLOOD_LABEL_FRONT1);\r
+\r
+ // Set additional property\r
+ label1_->SetText("99%");\r
+ label1_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ label1_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ label1_->SetRollSpeed(0);\r
+ label1_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_LABEL_FRONT1);\r
+\r
+ // Add to rootView\r
+ label1_->SetVisible(true);\r
+\r
+ // Add Label to App\r
+ if (label2_ == nullptr) {\r
+ label2_ = new UILabel();\r
+ }\r
+\r
+ label2_->SetPosition(BLOOD_LABEL2_POSITION_X, BLOOD_LABEL2_POSITION_Y); // widget's left position and top position\r
+ label2_->Resize(BLOOD_LABEL2_WIDTH, BLOOD_LABEL2_HEIGHT); // widget's width and height\r
+ label2_->SetViewId("label1"); // Set style\r
+ label2_->SetStyle(STYLE_TEXT_FONT, BLOOD_LABEL_FRONT);\r
+\r
+ // Set additional property\r
+ label2_->SetText("血氧");\r
+ label2_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ label2_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ label2_->SetRollSpeed(0);\r
+ label2_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_LABEL_FRONT);\r
+ label2_->SetVisible(true);\r
+\r
+ // Add to rootView\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "init test label successful");\r
+\r
+ if (buttonMore == nullptr) {\r
+ buttonMore = new UILabelButton();\r
+ }\r
+\r
+ buttonMore->SetPosition(BLOOD_BUTTON_POSITION_X,\r
+ BLOOD_BUTTON_POSITION_Y); // widget's left position and top position\r
+ buttonMore->Resize(BLOOD_BUTTON_WIDTH, BLOOD_BUTTON_HEIGHT); // widget's width and height\r
+ buttonMore->SetViewId("button2"); // Set style\r
+ UIView::OnClickListener *clickListener = (UIView::OnClickListener *)(BloodPresenter::GetInstance());\r
+ buttonMore->SetOnClickListener(clickListener);\r
+ buttonMore->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);\r
+ buttonMore->SetVisible(true);\r
+ buttonMore->SetText("了解更多");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "init test button successful");\r
+\r
+ groupTest->Add(label1_);\r
+ groupTest->Add(label2_);\r
+ groupTest->Add(currentTime_);\r
+ groupTest->Add(buttonMore);\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "init test add button successful");\r
+}\r
+\r
+void BloodView::InitMore()\r
+{\r
+ if (scrollGroup == nullptr) {\r
+ scrollGroup = new UIScrollView();\r
+ }\r
+ scrollGroup->Add(currentTime_);\r
+\r
+ scrollGroup->SetViewId("moreGroup");\r
+ scrollGroup->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ scrollGroup->SetThrowDrag(true);\r
+ scrollGroup->SetScrollBlankSize(50); // 50:font size\r
+ UIView::OnDragListener *listener = static_cast<UIView::OnDragListener *>(BloodPresenter::GetInstance());\r
+ scrollGroup->SetOnDragListener(listener);\r
+ scrollGroup->SetDraggable(true);\r
+ scrollGroup->SetTouchable(true);\r
+ if (!InitSimilarLabel(SET_ZERO, BLOOD_LABEL_FIRST_Y, BLOOD_LABEL_ONE)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TempJoinStudy::TempInitLabel new tempLabel[SET_ZERO] error");\r
+ }\r
+ if (!InitSimilarLabel(SET_ONE, BLOOD_LABEL_SECOND_Y, BLOOD_LABEL_TWO)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TempJoinStudy::TempInitLabel new tempLabel[SET_ONE] error");\r
+ }\r
+ if (!InitSimilarLabel(SET_TWO, BLOOD_LABEL_THIRD_Y, BLOOD_LABEL_THREE)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TempJoinStudy::TempInitLabel new tempLabel[SET_ONE] error");\r
+ }\r
+}\r
+\r
+bool BloodView::InitSimilarLabel(int16 num, int16 labelY, const char *labelText)\r
+{\r
+ tempLabel[num] = new UILabel();\r
+ if (tempLabel[num] == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TempJoinStudy::TempInitLabel new tempLabel[%d] error", num);\r
+ return false;\r
+ }\r
+ tempLabel[num]->SetPosition(BLOOD_LABEL_FIRST_X, labelY, BLOOD_LABEL_FIRST_WIDTH, BLOOD_LABEL_FIRST_HEIGHT);\r
+ tempLabel[num]->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);\r
+ tempLabel[num]->SetText(labelText);\r
+ tempLabel[num]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLOOD_FIRST_LABEL_FONT);\r
+ scrollGroup->Add(tempLabel[num]);\r
+\r
+ return true;\r
+}\r
+\r
+bool BloodView::TempInitLabel(void)\r
+{\r
+ scrollGroup->Add(currentTime_);\r
+ UIView::OnDragListener *dragListener = static_cast<UIView::OnDragListener *>(BloodPresenter::GetInstance());\r
+ if (dragListener == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "init more dragListener = nullptr");\r
+ }\r
+ if (!InitSimilarLabel(SET_ZERO, BLOOD_LABEL_FIRST_Y, BLOOD_LABEL_ONE)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TempJoinStudy::TempInitLabel new tempLabel[SET_ZERO] error");\r
+ return false;\r
+ }\r
+ if (!InitSimilarLabel(SET_ONE, BLOOD_LABEL_SECOND_Y, BLOOD_LABEL_TWO)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TempJoinStudy::TempInitLabel new tempLabel[SET_ONE] error");\r
+ return false;\r
+ }\r
+ if (!InitSimilarLabel(SET_TWO, BLOOD_LABEL_THIRD_Y, BLOOD_LABEL_THREE)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TempJoinStudy::TempInitLabel new tempLabel[SET_ONE] error");\r
+ return false;\r
+ }\r
+ return true;\r
+}\r
+\r
+void BloodView::InitImageInfo()\r
+{\r
+ const uint16_t pixelByteSize = 4; // 4: bytes per pixel\r
+ const uint16_t width = 100; // 100: image's width\r
+ const uint16_t height = 100; // 100: image's height\r
+ uint32_t dataSize = width * height * pixelByteSize;\r
+ uint8_t *srcData1 = static_cast<uint8_t *>(UIMalloc(dataSize));\r
+ if (srcData1 == nullptr) {\r
+ return;\r
+ }\r
+\r
+ for (uint32_t i = 0; i < dataSize; i += pixelByteSize) {\r
+ srcData1[i] = SET_INT_MAX; // 255: pixel value\r
+ srcData1[i + 1] = 0; // 1: set green channel\r
+ srcData1[i + 2] = 0; // 2: set red channel\r
+ srcData1[i + 3] = OPA_OPAQUE; // 3: set alpha channel\r
+ }\r
+ imageInfo1_ = static_cast<ImageInfo *>(UIMalloc(sizeof(ImageInfo)));\r
+ if (imageInfo1_ == nullptr) {\r
+ UIFree(srcData1);\r
+ return;\r
+ }\r
+\r
+ imageInfo1_->header.width = width;\r
+ imageInfo1_->header.height = height;\r
+ imageInfo1_->header.colorMode = ColorMode::ARGB8888;\r
+ imageInfo1_->dataSize = dataSize;\r
+ imageInfo1_->data = srcData1;\r
+\r
+ uint8_t *srcData2 = static_cast<uint8_t *>(UIMalloc(dataSize));\r
+ if (srcData2 == nullptr) {\r
+ UIFree(imageInfo1_);\r
+ UIFree(srcData1);\r
+ return;\r
+ }\r
+ for (uint32_t i = 0; i < dataSize; i += pixelByteSize) {\r
+ srcData2[i] = 0; // set blue channel\r
+ srcData2[i + 1] = SET_INT_MAX; // 1: set green channel 255: pixel value\r
+ srcData2[i + 2] = 0; // 2: set red channel\r
+ srcData2[i + 3] = OPA_OPAQUE; // 3: set alpha channel\r
+ }\r
+\r
+ imageInfo2_ = static_cast<ImageInfo *>(UIMalloc(sizeof(ImageInfo)));\r
+ if (imageInfo2_ == nullptr) {\r
+ UIFree(srcData2);\r
+ UIFree(imageInfo1_);\r
+ UIFree(srcData1);\r
+ return;\r
+ }\r
+ imageInfo2_->header.width = width;\r
+ imageInfo2_->header.height = height;\r
+ imageInfo2_->header.colorMode = ARGB8888;\r
+ imageInfo2_->dataSize = dataSize;\r
+ imageInfo2_->data = srcData2;\r
+\r
+ uint8_t *srcData3 = static_cast<uint8_t *>(UIMalloc(dataSize));\r
+ if (srcData3 == nullptr) {\r
+ UIFree(imageInfo2_);\r
+ UIFree(srcData2);\r
+ UIFree(imageInfo1_);\r
+ UIFree(srcData1);\r
+ return;\r
+ }\r
+ for (uint32_t i = 0; i < dataSize; i += pixelByteSize) {\r
+ srcData3[i] = 0; // set blue channel\r
+ srcData3[i + 1] = 0; // 1: set green channel\r
+ srcData3[i + 2] = SET_INT_MAX; // 2: set red channel 255: pixel value\r
+ srcData3[i + 3] = OPA_OPAQUE; // 3: set alpha channel\r
+ }\r
+\r
+ imageInfo3_ = static_cast<ImageInfo *>(UIMalloc(sizeof(ImageInfo)));\r
+ if (imageInfo3_ == nullptr) {\r
+ UIFree(srcData3);\r
+ UIFree(imageInfo2_);\r
+ UIFree(srcData2);\r
+ UIFree(imageInfo1_);\r
+ UIFree(srcData1);\r
+ return;\r
+ }\r
+ imageInfo3_->header.width = width;\r
+ imageInfo3_->header.height = height;\r
+ imageInfo3_->header.colorMode = ARGB8888;\r
+ imageInfo3_->dataSize = dataSize;\r
+ imageInfo3_->data = srcData3;\r
+\r
+ imageAnimatorImageInfo_[0].imageInfo = imageInfo1_;\r
+ imageAnimatorImageInfo_[0].pos = {BLOOD_IMAGEANIMATOR_POSITION_X, BLOOD_IMAGEANIMATOR_POSITION_Y};\r
+ imageAnimatorImageInfo_[0].width = BLOOD_IMAGEANIMATOR_WIDTH; // 100: width value\r
+ imageAnimatorImageInfo_[0].height = BLOOD_IMAGEANIMATOR_HEIGHT; // 100: height value\r
+ imageAnimatorImageInfo_[0].imageType = IMG_SRC_IMAGE_INFO;\r
+\r
+ imageAnimatorImageInfo_[1].imageInfo = imageInfo2_;\r
+ imageAnimatorImageInfo_[1].pos = {BLOOD_IMAGEANIMATOR_POSITION_X, BLOOD_IMAGEANIMATOR_POSITION_Y};\r
+ imageAnimatorImageInfo_[1].width = BLOOD_IMAGEANIMATOR_WIDTH; // 100: width value\r
+ imageAnimatorImageInfo_[1].height = BLOOD_IMAGEANIMATOR_HEIGHT; // 100: height value\r
+ imageAnimatorImageInfo_[1].imageType = IMG_SRC_IMAGE_INFO;\r
+\r
+ imageAnimatorImageInfo_[2].imageInfo = imageInfo3_; // 2: image index\r
+ imageAnimatorImageInfo_[2].pos = {BLOOD_IMAGEANIMATOR_POSITION_X, BLOOD_IMAGEANIMATOR_POSITION_Y}; // 2: image index\r
+ imageAnimatorImageInfo_[2].width = BLOOD_IMAGEANIMATOR_WIDTH; // 2: image index, 100: width value\r
+ imageAnimatorImageInfo_[2].height = BLOOD_IMAGEANIMATOR_HEIGHT; // 2: image index, 100: height value\r
+ imageAnimatorImageInfo_[2].imageType = IMG_SRC_IMAGE_INFO; // 2: image index\r
+}\r
+\r
+void BloodView::UpdateCurrentTimeLabel(const char *currentTime)\r
+{\r
+ currentTime_->SetText(currentTime);\r
+ currentTime_->Invalidate();\r
+}\r
+\r
+bool BloodView::IsCurrentTimeLabelValid()\r
+{\r
+ return currentTime_ != nullptr ? true : false;\r
+}\r
+\r
+void BloodView::DropView(UIView &view, int type)\r
+{\r
+ if (type == 0) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::DropView::container[WEATHER_ondrop]-0");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::DropView::container[WEATHER_ondrop] view name :%s",\r
+ view.GetViewId());\r
+ if (&view == container[BLOOD_START]) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::DropView::container[CHANGE_INTERFACE_CONFIG]-0");\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+ } else if (&view == container[BLOOD_TEST]) {\r
+ ChangeView(BLOOD_TEST, BLOOD_START);\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::DropView::container[BLOOD_START]-0");\r
+ } else if (&view == container[BLOOD_MORE]) {\r
+ ChangeView(BLOOD_MORE, BLOOD_TEST);\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::DropView::container[WEATHER_SCROLL]-0");\r
+ }\r
+ } else if (type == 1) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::DropView::container[WEATHER_ondrop] view name :%s",\r
+ view.GetViewId());\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::DropView::container[WEATHER_ondrop]-1");\r
+ if (&view == button || view.GetViewId() == "button1") {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::DropView::container[WEATHER_SWIPE]-1");\r
+ ChangeView(BLOOD_START, BLOOD_TEST);\r
+ } else if (&view == buttonMore || view.GetViewId() == "button1") {\r
+ ChangeView(BLOOD_TEST, BLOOD_MORE);\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::DropView::container[WEATHER_SCROLL]-1");\r
+ } else if (&view == container[BLOOD_MORE]) {\r
+ }\r
+ }\r
+}\r
+\r
+bool BloodView::ChangeBloodStart(int16_t thisView)\r
+{\r
+ if (container[thisView] == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodView::WeatherGroupView");\r
+ AddViewToRootContainer(container[thisView]);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool BloodView::ChangeBloodTest(int16_t thisView)\r
+{\r
+ if (container[thisView] == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::ChangeBloodTest");\r
+ InitTest();\r
+ container[thisView] = groupTest;\r
+ AddViewToRootContainer(container[thisView]);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool BloodView::ChangeBloodMore(int16_t thisView)\r
+{\r
+ if (container[thisView] == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodView::WeatherScrollView");\r
+ InitMore();\r
+ container[thisView] = scrollGroup;\r
+ AddViewToRootContainer(container[thisView]);\r
+ }\r
+ return true;\r
+}\r
+\r
+struct BloodViewMapper {\r
+ uint16_t viewId;\r
+ bool (BloodView::*func)(int16 thisView);\r
+};\r
+\r
+static const BloodViewMapper ViewMapper[] = {\r
+ {BLOOD_START, &BloodView::ChangeBloodStart},\r
+ {BLOOD_TEST, &BloodView::ChangeBloodTest},\r
+ {BLOOD_MORE, &BloodView::ChangeBloodMore},\r
+};\r
+\r
+bool BloodView::ClickFunc(int16 interf)\r
+{\r
+ int funcSize = sizeof(ViewMapper) / sizeof(ViewMapper[0]);\r
+ for (int i = 0; i < funcSize; i++) {\r
+ if (interf == ViewMapper[i].viewId) {\r
+ bool jug = (this->*(ViewMapper[i].func))(interf);\r
+ if (!jug) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView:: ChangeInterFace[%d] false", interf);\r
+ return false;\r
+ }\r
+ return true;\r
+ }\r
+ }\r
+ return false;\r
+}\r
+\r
+void BloodView::ChangeView(int16 hideView, int16 showView)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodView::ChangeView hideView = %d, showView = %d", hideView, showView);\r
+ if (hideView > MAX_BLOOD_PAGE) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::ChangeView Overstep ones bounds");\r
+ return;\r
+ }\r
+ if (!ClickFunc(showView)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::ChangeView ClickFunc ercror");\r
+ return;\r
+ }\r
+ container[hideView]->SetVisible(false);\r
+ container[showView]->SetVisible(true);\r
+ Draw();\r
+ return;\r
+}\r
+}\r
*/\r
#include "UiConfig.h"\r
#include "wearable_log.h"\r
-#include "BloodBandoffView.h"\r
-#include "BloodOxygenModel.h"\r
+#include "bloodoxygen/BloodBandoffView.h"\r
+#include "bloodoxygen/BloodOxygenModel.h"\r
\r
namespace OHOS {\r
// 动态显示图片设置\r
* Create: 2021-08-01\r
*/\r
\r
-#include "BloodOxygenModel.h"\r
+#include "bloodoxygen/BloodOxygenModel.h"\r
\r
namespace OHOS {\r
BloodOxygenModel::BloodOxygenModel()\r
* Create: 2021-08-01\r
*/\r
\r
-#include "BloodOxygenPresenter.h"\r
+#include "bloodoxygen/BloodOxygenPresenter.h"\r
#include "common/task_manager.h"\r
-#include "BloodOxygenView.h"\r
-#include "BloodOxygenModel.h"\r
+#include "bloodoxygen/BloodOxygenView.h"\r
+#include "bloodoxygen/BloodOxygenModel.h"\r
#include "components/ui_label.h"\r
-#include "BloodBandoffView.h"\r
+#include "bloodoxygen/BloodBandoffView.h"\r
#include "ChangeSliceListener.h"\r
-#include "ui_service.h"\r
+#include "uiservice/ui_service.h"\r
#include "NativeRegisterManager.h"\r
\r
namespace OHOS {\r
* Create: 2021-08-01\r
*/\r
\r
-#include "BloodOxygenView.h"\r
-#include "BloodOxygenModel.h"\r
+#include "bloodoxygen/BloodOxygenView.h"\r
+#include "bloodoxygen/BloodOxygenModel.h"\r
\r
namespace OHOS {\r
// 按钮设置\r
* Create: 2021-07-26
*/
#include <string>
-#include "BluetoothCaseListAdapter.h"
-#include "BluetoothEarPhoneView.h"
+#include "bluetooth/BluetoothCaseListAdapter.h"
+#include "bluetooth/BluetoothEarPhoneView.h"
#include "gfx_utils/list.h"
-#include "PlayersPresenter.h"
+#include "player/PlayersPresenter.h"
#include "wearable_log.h"
#include "UiConfig.h"
-#include "BluetoothModel.h"
+#include "bluetooth/BluetoothModel.h"
namespace OHOS {
BluetoothCaseListAdapter::~BluetoothCaseListAdapter()
* Create: 2021-07-26
*/
#include <string>
-#include "BluetoothDeviceCaseListAdapter.h"
-#include "BluetoothOptionsView.h"
+#include "bluetooth/BluetoothDeviceCaseListAdapter.h"
+#include "bluetooth/BluetoothOptionsView.h"
#include "gfx_utils/list.h"
-#include "BluetoothModel.h"
+#include "bluetooth/BluetoothModel.h"
#include "wearable_log.h"
#include "UiConfig.h"
-#include "BluetoothPresenter.h"
+#include "bluetooth/BluetoothPresenter.h"
namespace OHOS {
BluetoothDeviceCaseListAdapter::~BluetoothDeviceCaseListAdapter()
* Author:\r
* Create: 2021-10-13\r
*/\r
-#include "BluetoothDeviceListView.h"\r
+#include "bluetooth/BluetoothDeviceListView.h"\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
-#include "PlayersPresenter.h"\r
-#include "BluetoothPresenter.h"\r
-#include "BluetoothModel.h"\r
+#include "player/PlayersPresenter.h"\r
+#include "bluetooth/BluetoothPresenter.h"\r
+#include "bluetooth/BluetoothModel.h"\r
\r
namespace OHOS {\r
static BluetoothDeviceListView *g_pBluetoothDeviceListView{nullptr};\r
* Author:\r
* Create: 2021-10-13\r
*/\r
-#include "BluetoothModel.h"\r
-#include "BluetoothEarListView.h"\r
+#include "bluetooth/BluetoothModel.h"\r
+#include "bluetooth/BluetoothEarListView.h"\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
-#include "PlayersPresenter.h"\r
-#include "BluetoothPresenter.h"\r
-#include "SettingModel.h"\r
+#include "player/PlayersPresenter.h"\r
+#include "bluetooth/BluetoothPresenter.h"\r
+#include "settings/SettingModel.h"\r
\r
namespace OHOS {\r
static BluetoothEarListView *g_pBluetoothEarListView{nullptr};\r
* Create: 2021-10-13\r
*/\r
#include <functional>\r
-#include "BluetoothEarPhoneView.h"\r
+#include "bluetooth/BluetoothEarPhoneView.h"\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
-#include "BluetoothPresenter.h"\r
-#include "PlayersPresenter.h"\r
-#include "BluetoothItemView.h"\r
-#include "SettingModel.h"\r
+#include "bluetooth/BluetoothPresenter.h"\r
+#include "player/PlayersPresenter.h"\r
+#include "bluetooth/BluetoothItemView.h"\r
+#include "settings/SettingModel.h"\r
#include "common/image_cache_manager.h"\r
#include "graphic_service.h"\r
\r
* Create: 2022-3-22\r
*/\r
\r
-#include "BluetoothHeadsetEvent.h"\r
+#include "bluetooth/BluetoothHeadsetEvent.h"\r
#include "bts_avrcp_target.h"\r
#include "bts_avrcp_controller.h"\r
-#include "PlayersModel.h"\r
+#include "player/PlayersModel.h"\r
#include "graphic_service.h"\r
\r
using namespace OHOS;\r
* Create: 2021-10-13\r
*/\r
\r
-#include "BluetoothItemView.h"\r
+#include "bluetooth/BluetoothItemView.h"\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
#include "common/image_cache_manager.h"\r
* Create: 2021-10-13\r
*/\r
#include <cstdint>\r
-#include "BluetoothModel.h"\r
-#include "BluetoothWrapper.h"\r
-#include "BluetoothPresenter.h"\r
-#include "ConnectPhonePresenter.h"\r
-#include "BluetoothView.h"\r
-#include "BluetoothItemView.h"\r
-#include "PlayersModel.h"\r
-#include "PhoneAudio.h"\r
+#include "bluetooth/BluetoothModel.h"\r
+#include "bluetooth/BluetoothWrapper.h"\r
+#include "bluetooth/BluetoothPresenter.h"\r
+#include "connectnewphone/ConnectPhonePresenter.h"\r
+#include "player/BluetoothView.h"\r
+#include "bluetooth/BluetoothItemView.h"\r
+#include "player/PlayersModel.h"\r
+#include "phoneservice/PhoneAudio.h"\r
#include "graphic_service.h"\r
#include "msg_center.h"\r
#include "bts_def.h"\r
#include "msg_center_protocol.h"\r
#include "dfx_channel.h"\r
#include "tcxo.h"\r
-#include "ui_service.h"\r
+#include "uiservice/ui_service.h"\r
#include "network/network_listener.h"\r
+#if defined(SUPPORT_LWIP) && defined(SUPPORT_BREDR)\r
+#include "lwip_driver_adapter.h"\r
+#endif\r
namespace OHOS {\r
\r
#define BT_SPP_TASK_STACK_SIZE 2048\r
}\r
}\r
\r
+void ChangeBleConnectToMax()\r
+{\r
+ if (msg_center_get_trans_channel() == DIAG_FRAME_FID_BT) {\r
+ gap_conn_param_update_t conn_param = { 0 };\r
+ conn_param.conn_handle = BLUETOOTH_CONN_HANDLE;\r
+ conn_param.interval_min = BLUETOOTH_INTERVAL_TOMAX_MIN;\r
+ conn_param.interval_max = BLUETOOTH_INTERVAL_TOMAX_MAX;\r
+ conn_param.slave_latency = BLUETOOTH_LATENCY;\r
+ conn_param.timeout_multiplier = BLUETOOTH_TIMEOUT_MUTIPLIER;\r
+ errcode_t ret = gap_ble_connect_param_update(&conn_param);\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BleConnectCallback change to max interval ret:%d : latency-min:%u latency-max:%u\n", \r
+ ret, conn_param.interval_min, conn_param.interval_max);\r
+ }\r
+}\r
+\r
+void ChangeBleConnectToDefault()\r
+{\r
+ if (msg_center_get_trans_channel() == DIAG_FRAME_FID_BT) {\r
+ gap_conn_param_update_t conn_param = { 0 };\r
+ conn_param.conn_handle = BLUETOOTH_CONN_HANDLE;\r
+ conn_param.interval_min = BLUETOOTH_INTERVAL_TODEFAULT_MIN;\r
+ conn_param.interval_max = BLUETOOTH_INTERVAL_TODEFAULT_MAX;\r
+ conn_param.slave_latency = BLUETOOTH_LATENCY;\r
+ conn_param.timeout_multiplier = BLUETOOTH_TIMEOUT_MUTIPLIER;\r
+ errcode_t ret = gap_ble_connect_param_update(&conn_param);\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BleConnectCallback change to default interval ret:%d : latency-min:%u latency-max:%u\n", \r
+ ret, conn_param.interval_min, conn_param.interval_max);\r
+ }\r
+}\r
+\r
// 回调:ACL连接状态上报\r
void GapAclStateChangedCallback(const bd_addr_t *bdAddr, gap_acl_state_t state, unsigned int reason)\r
{\r
SendMsgToUIService(BT_CONNECTED_TO_UI, 0, nullptr, 0);\r
// send to ace network\r
// SetAclConnected(true);\r
+#if defined(SUPPORT_LWIP) && defined(SUPPORT_BREDR)\r
+ bt_pan_open();\r
+#endif\r
net_connect_status_change(NETWORK_TYPE_BLUETOOTH, CONNECTION_STATUS_CONNECTED);\r
}\r
return;\r
BtA2dpSnkConfigChangedCb\r
};\r
\r
+static void BleConnectCallback(uint16_t conn_id, errcode_t status, const gap_ble_conn_param_update_t *param)\r
+{\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BleConnectCallback conn_id:%u, interval-1:%u latency:%u timeout:%u\n",conn_id, param->interval, param->latency, param->timeout);\r
+}\r
+\r
void BtInitCallBacks()\r
{\r
g_btGapCallBacks.discovery_result_callback = BtGapDiscoveryResultCallback;\r
g_gapBleCallbacks.start_adv_cb = BleAdvStartCallback;\r
g_gapBleCallbacks.stop_adv_cb = BleAdvStopCallback;\r
g_gapBleCallbacks.terminate_adv_cb = BleAdvTerminateCallback;\r
+ g_gapBleCallbacks.conn_param_update_cb = BleConnectCallback;\r
wrapper_gap_ble_register_callbacks(&g_gapBleCallbacks);\r
\r
g_btGattsCallbacks.add_service_cb = BtGattsServiceAddCallback;\r
param.socket_type = SPP_SOCKET_RFCOMM;\r
param.is_encrypt = true;\r
\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "uuid: %s uuid_len: %u\n", spp_uuid, param.uuid.uuid_len);\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "socket_type: %x is_encrypt: %d name: %s nameLen: %u\n", param.socket_type,\r
- param.is_encrypt, name, name_len);\r
-\r
int ret = spp_server_create(¶m, name, name_len);\r
WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "spp_server_create ret: %x\n", ret);\r
}\r
static int BtSppServerAcceptTaskBody(void *data)\r
{\r
int server_id = (int)(intptr_t)data;\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "server_id: %x\n", server_id);\r
-\r
int ret = spp_server_accept(server_id);\r
\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "spp_server_accept ret: %x\n", ret);\r
-\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "spp_server_accept ret: %x, server_id: %d\r\n", ret, server_id);\r
return OSAL_SUCCESS;\r
}\r
\r
if (ret != OSAL_SUCCESS) {\r
WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "set pri error: %08x\n", ret);\r
}\r
-\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "create task success.\n");\r
}\r
\r
void BtInitSpp(void)\r
* Author:\r
* Create: 2021-10-13\r
*/\r
-#include "BluetoothOptionsView.h"\r
-#include "BluetoothModel.h"\r
+#include "bluetooth/BluetoothOptionsView.h"\r
+#include "bluetooth/BluetoothModel.h"\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
-#include "PlayersPresenter.h"\r
-#include "BluetoothPresenter.h"\r
+#include "player/PlayersPresenter.h"\r
+#include "bluetooth/BluetoothPresenter.h"\r
\r
namespace OHOS {\r
static BluetoothOptionsView *g_pBluetoothOptionsView{nullptr};\r
\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
-#include "BluetoothPresenter.h"\r
-#include "BluetoothReconnectView.h"\r
-#include "MainBluetoothView.h"\r
+#include "bluetooth/BluetoothPresenter.h"\r
+#include "bluetooth/BluetoothReconnectView.h"\r
+#include "bluetooth/MainBluetoothView.h"\r
#include "NativeRegisterManager.h"\r
#include "UiConfig.h"\r
\r
* Create: 2021-10-13\r
*/\r
\r
-#include "BluetoothReconnectView.h"\r
-#include "BluetoothModel.h"\r
+#include "bluetooth/BluetoothReconnectView.h"\r
+#include "bluetooth/BluetoothModel.h"\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
-#include "PlayersPresenter.h"\r
-#include "BluetoothPresenter.h"\r
+#include "player/PlayersPresenter.h"\r
+#include "bluetooth/BluetoothPresenter.h"\r
#include "common/image_cache_manager.h"\r
\r
namespace OHOS {\r
*/\r
\r
#include <list>\r
-#include "BluetoothWrapper.h"\r
+#include "bluetooth/BluetoothWrapper.h"\r
\r
#ifdef __cplusplus\r
extern "C" {\r
* Author:\r
* Create: 2021-10-13\r
*/\r
-#include "MainBluetoothView.h"\r
-#include "BluetoothModel.h"\r
+#include "bluetooth/MainBluetoothView.h"\r
+#include "bluetooth/BluetoothModel.h"\r
#include "wearable_log.h"\r
\r
namespace OHOS {\r
* Author:\r
* Create: 2021-10-13\r
*/\r
-#include "TipsConnFailMessageView.h"\r
-#include "BluetoothModel.h"\r
+#include "bluetooth/TipsConnFailMessageView.h"\r
+#include "bluetooth/BluetoothModel.h"\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
-#include "PlayersPresenter.h"\r
-#include "BluetoothPresenter.h"\r
+#include "player/PlayersPresenter.h"\r
+#include "bluetooth/BluetoothPresenter.h"\r
\r
namespace OHOS {\r
static TipsConnFailMessageView *g_pConnFailMessageView{nullptr};\r
* Author:\r
* Create: 2021-10-13\r
*/\r
-#include "TipsFailMessageView.h"\r
-#include "BluetoothModel.h"\r
+#include "bluetooth/TipsFailMessageView.h"\r
+#include "bluetooth/BluetoothModel.h"\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
-#include "PlayersPresenter.h"\r
-#include "BluetoothPresenter.h"\r
+#include "player/PlayersPresenter.h"\r
+#include "bluetooth/BluetoothPresenter.h"\r
\r
namespace OHOS {\r
static TipsFailMessageView *g_pFailMessageView{nullptr};\r
* Author:\r
* Create: 2021-10-13\r
*/\r
-#include "TipsSuccMessageView.h"\r
-#include "BluetoothModel.h"\r
+#include "bluetooth/TipsSuccMessageView.h"\r
+#include "bluetooth/BluetoothModel.h"\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
-#include "PlayersPresenter.h"\r
-#include "BluetoothPresenter.h"\r
+#include "player/PlayersPresenter.h"\r
+#include "bluetooth/BluetoothPresenter.h"\r
\r
namespace OHOS {\r
static TipsSuccMessageView *g_pSuccMessageView{nullptr};\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathDurPage\r
+ * Create: 2025-5-13\r
+ */\r
+#include "components/root_view.h"\r
+#include "gfx_utils/graphic_math.h"\r
+#include "UiConfig.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "NativeAbility.h"\r
+#include "alarm/MainAlarmView.h"\r
+#include "TransitionType.h"\r
+#include "SlicePageFactory.h"\r
+#include "ui_resource_breath.h"\r
+#include "main/LoadImg.h"\r
+#include "breath/BreathView.h"\r
+#include "breath/BreathDurPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_MAIN_BREATHEASE, BrearhView::BREATH_DUR_VIEW, BreathDurPage, false);\r
+\r
+#define WND_BTHDUR_BTN_OK_ID "BTH_DUR_OK"\r
+#define WND_BTHDUR_TITLE_X 100\r
+#define WND_BTHDUR_TITLE_Y 38\r
+#define WND_BTHDUR_TITLE_W 253\r
+#define WND_BTHDUR_TITLE_H 53\r
+#define WND_BTHDUR_TITLE_FONT_SIZE 38\r
+#define WND_BTHDUR_PICKER_X 64\r
+#define WND_BTHDUR_PICKER_Y 109\r
+#define WND_BTHDUR_PICKER_W 321\r
+#define WND_BTHDUR_PICKER_H 218\r
+#define WND_BTHDUR_PICKER_B_FONT_SIZE 44\r
+#define WND_BTHDUR_PICKER_H_FONT_SIZE 44\r
+#define WND_BTHDUR_PICKER_ITEM_H 80\r
+#define WND_BTHDUR_OK_X 61\r
+#define WND_BTHDUR_OK_Y 362\r
+#define WND_BTHDUR_OK_W 331\r
+#define WND_BTHDUR_OK_H 98\r
+#define BREATH_GROUP_SIZE 466\r
+\r
+BreathDurPage::BreathDurPage() {}\r
+\r
+BreathDurPage::~BreathDurPage()\r
+{\r
+ group->RemoveAll();\r
+ if (lableTitle != nullptr) {\r
+ delete lableTitle;\r
+ lableTitle = nullptr;\r
+ }\r
+ if (pickerTime != nullptr) {\r
+ delete pickerTime;\r
+ pickerTime = nullptr;\r
+ }\r
+ if (buttonOk != nullptr) {\r
+ delete buttonOk;\r
+ buttonOk = nullptr;\r
+ }\r
+ if (group != nullptr) {\r
+ delete group;\r
+ group = nullptr;\r
+ }\r
+ if (center != nullptr) {\r
+ delete center;\r
+ center = nullptr;\r
+ }\r
+}\r
+\r
+void BreathDurPage::OnStart(void *data)\r
+{\r
+ if (group == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathDurPage::OnStart new Group ERROR");\r
+ group = new UIViewGroup();\r
+ }\r
+ group->SetPosition(0, 0);\r
+ group->Resize(BREATH_GROUP_SIZE, BREATH_GROUP_SIZE);\r
+ group->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+\r
+ if (lableTitle == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathDurPage::OnStart new lableTitle ERROR");\r
+ lableTitle = new UILabel();\r
+ }\r
+ lableTitle->SetPosition(WND_BTHDUR_TITLE_X, WND_BTHDUR_TITLE_Y);\r
+ lableTitle->Resize(WND_BTHDUR_TITLE_W, WND_BTHDUR_TITLE_H);\r
+ lableTitle->SetText("时间设置");\r
+ lableTitle->SetTextColor(Color::White());\r
+ lableTitle->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHDUR_TITLE_FONT_SIZE);\r
+ lableTitle->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group->Add(lableTitle);\r
+\r
+ if (pickerTime == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathDurPage::OnStart new pickerTime ERROR");\r
+ pickerTime = new UIPicker();\r
+ }\r
+ pickerTime->SetPosition(WND_BTHDUR_PICKER_X, WND_BTHDUR_PICKER_Y);\r
+ pickerTime->Resize(WND_BTHDUR_PICKER_W, WND_BTHDUR_PICKER_H);\r
+ pickerTime->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ pickerTime->SetBackgroundFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHDUR_PICKER_B_FONT_SIZE);\r
+ pickerTime->SetHighlightFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHDUR_PICKER_H_FONT_SIZE);\r
+ pickerTime->SetItemHeight(WND_BTHDUR_PICKER_ITEM_H);\r
+ pickerTime->SetTextColor(Color::GetColorFromRGBA(0xfa, 0xf3, 0xf3, 0xff),\r
+ Color::GetColorFromRGBA(0xfa, 0xf3, 0xf3, 0xff));\r
+ uint8_t selectTime = BreathModel::GetInstance().GetSelectTime();\r
+ pickerTime->SetSelected(selectTime);\r
+ pickerTime->SetOnDragListener(this);\r
+ pickerTime->SetLoopState(false);\r
+ group->Add(pickerTime);\r
+\r
+ if (center == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathDurPage::OnStart new center ERROR");\r
+ center = new UIImageView();\r
+ }\r
+ center->SetPosition(WND_BTHDUR_PICKER_X, WND_BTHDUR_PICKER_Y);\r
+ center->Resize(WND_BTHDUR_PICKER_W, WND_BTHDUR_PICKER_H);\r
+ LOADIMG::LoadImageViewImg(center, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH013);\r
+ group->Add(center);\r
+\r
+ if (buttonOk == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathDurPage::OnStart new buttonOk ERROR");\r
+ buttonOk = new UIButton();\r
+ }\r
+ buttonOk->SetPosition(WND_BTHDUR_OK_X, WND_BTHDUR_OK_Y);\r
+ buttonOk->Resize(WND_BTHDUR_OK_W, WND_BTHDUR_OK_H);\r
+ buttonOk->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ buttonOk->SetViewId(WND_BTHDUR_BTN_OK_ID);\r
+ LOADIMG::LoadBtnImage(buttonOk, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH005, IMAGE_CONVERTER_TOOL_BREATH005);\r
+ buttonOk->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ buttonOk->SetOnClickListener(this);\r
+ group->Add(buttonOk);\r
+\r
+ AddViewToPageContainer(group);\r
+}\r
+\r
+void BreathDurPage::OnStop() {}\r
+\r
+void BreathDurPage::OnResume()\r
+{\r
+ pickerTime->SetValues(BreathModel::GetInstance().GetDurListData(), BreathModel::GetInstance().GetDurListSize());\r
+ GetSlicePageContainer()->SetIntercept(true);\r
+ GetSlicePageContainer()->SetOnDragListener(nullptr);\r
+}\r
+\r
+void BreathDurPage::OnPause() {}\r
+\r
+bool BreathDurPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ if (strcmp(view.GetViewId(), WND_BTHDUR_BTN_OK_ID) == 0) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathDurPage OnClick...ChangeTo DUR");\r
+ BreathModel::GetInstance().SetTimeDuration(pickerTime->GetSelected());\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_MAIN_VIEW, nullptr, TransitionType::TRANSITION_INVALID,\r
+ true);\r
+ } else {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathDurPage OnClick...ChangeTo unknow");\r
+ return false;\r
+ }\r
+ return true;\r
+}\r
+\r
+bool BreathDurPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathDurPage::OnDrag");\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathDurPage::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_MAIN_VIEW, nullptr, TransitionType::TRANSITION_INVALID,\r
+ true);\r
+ }\r
+ return true;\r
+}\r
+} // namespace OHOS
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathExerPage\r
+ * Create: 2025-5-13\r
+ */\r
+#include <string>\r
+#include <sys/time.h>\r
+#include "gfx_utils/graphic_math.h"\r
+#include "common/image_cache_manager.h"\r
+#include "components/ui_image_animator.h"\r
+#include "components/root_view.h"\r
+#include "UiConfig.h"\r
+#include "ohos_timer.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "ui_resource_breath.h"\r
+#include "main/LoadImg.h"\r
+#include "breath/BreathView.h"\r
+#include "breath/BreathExerPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_MAIN_BREATHEASE, BrearhView::BREATH_EXER_VIEW, BreathExerPage, false);\r
+\r
+#define BREATH_GROUP_SIZE 454\r
+#define BREATH_ZERO 0\r
+#define BREATH_ONE 1\r
+#define BREATH_TWO 2\r
+#define BREATH_THREE 3\r
+static constexpr uint16_t BREATH_PHONE_IMAGE_POSITION_X = 0;\r
+static constexpr uint16_t BREATH_PHONE_IMAGE_POSITION_y = 0;\r
+static constexpr uint16_t BREATH_PHONE_IMAGE_WIDTH = 400;\r
+static constexpr uint16_t BREATH_PHONE_IMAGE_HEIGHT = 400;\r
+static constexpr uint16_t BREATH_PHONE_IMAGEANIMATOR_POSITION_X = 170;\r
+static constexpr uint16_t BREATH_PHONE_IMAGEANIMATOR_POSITION_Y = 170;\r
+static constexpr uint16_t BREATH_PHONE_IMAGEANIMATOR_WIDTH = 100;\r
+static constexpr uint16_t BREATH_PHONE_IMAGEANIMATOR_HEIGHT = 100;\r
+static constexpr uint16_t IMAGE_SIZE = 454;\r
+static constexpr uint16_t IMAGEANIMATOERVIEW_SIZE = 80;\r
+static constexpr uint16_t FIND_PHONE_IMAGE_X = 1;\r
+static constexpr uint16_t FIND_PHONE_IMAGE_y = 1;\r
+static constexpr uint16_t FIND_PHONE_PIXELBYTE_SIZE = 4;\r
+static constexpr uint16_t FIND_PHONE_PIXELBYTEH = 100;\r
+static constexpr uint16_t END_TIME = 20;\r
+\r
+const int g_imageAnimatorInfo[IMAGEANIMATOERVIEW_SIZE] = {\r
+ IMAGE_CONVERTER_TOOL_INOREX_HALE001, IMAGE_CONVERTER_TOOL_INOREX_HALE002, IMAGE_CONVERTER_TOOL_INOREX_HALE003,\r
+ IMAGE_CONVERTER_TOOL_INOREX_HALE004, IMAGE_CONVERTER_TOOL_INOREX_HALE005, IMAGE_CONVERTER_TOOL_INOREX_HALE006,\r
+ IMAGE_CONVERTER_TOOL_INOREX_HALE007, IMAGE_CONVERTER_TOOL_INOREX_HALE008, IMAGE_CONVERTER_TOOL_INOREX_HALE009,\r
+ IMAGE_CONVERTER_TOOL_INOREX_HALE010, IMAGE_CONVERTER_TOOL_INOREX_HALE011, IMAGE_CONVERTER_TOOL_INOREX_HALE012,\r
+ IMAGE_CONVERTER_TOOL_INOREX_HALE013, IMAGE_CONVERTER_TOOL_INOREX_HALE014, IMAGE_CONVERTER_TOOL_INOREX_HALE015,\r
+ IMAGE_CONVERTER_TOOL_INOREX_HALE016, IMAGE_CONVERTER_TOOL_INOREX_HALE017, IMAGE_CONVERTER_TOOL_INOREX_HALE018,\r
+ IMAGE_CONVERTER_TOOL_INOREX_HALE019, IMAGE_CONVERTER_TOOL_INOREX_HALE020, IMAGE_CONVERTER_TOOL_INOREX_HALE021,\r
+ IMAGE_CONVERTER_TOOL_INOREX_HALE022, IMAGE_CONVERTER_TOOL_INOREX_HALE023, IMAGE_CONVERTER_TOOL_INOREX_HALE024,\r
+ IMAGE_CONVERTER_TOOL_INOREX_HALE025, IMAGE_CONVERTER_TOOL_INOREX_HALE026, IMAGE_CONVERTER_TOOL_INOREX_HALE027,\r
+ IMAGE_CONVERTER_TOOL_INOREX_HALE028, IMAGE_CONVERTER_TOOL_INOREX_HALE029, IMAGE_CONVERTER_TOOL_INOREX_HALE030,\r
+ IMAGE_CONVERTER_TOOL_INOREX_HALE031, IMAGE_CONVERTER_TOOL_INOREX_HALE032, IMAGE_CONVERTER_TOOL_INOREX_HALE033,\r
+ IMAGE_CONVERTER_TOOL_INOREX_HALE034, IMAGE_CONVERTER_TOOL_INOREX_HALE035, IMAGE_CONVERTER_TOOL_INOREX_HALE036,\r
+ IMAGE_CONVERTER_TOOL_INOREX_HALE037, IMAGE_CONVERTER_TOOL_INOREX_HALE038, IMAGE_CONVERTER_TOOL_INOREX_HALE039,\r
+ IMAGE_CONVERTER_TOOL_INOREX_HALE040, IMAGE_CONVERTER_TOOL_INOREX_HALE041, IMAGE_CONVERTER_TOOL_INOREX_HALE042,\r
+ IMAGE_CONVERTER_TOOL_INOREX_HALE043, IMAGE_CONVERTER_TOOL_INOREX_HALE044, IMAGE_CONVERTER_TOOL_INOREX_HALE045,\r
+ IMAGE_CONVERTER_TOOL_INOREX_HALE046, IMAGE_CONVERTER_TOOL_INOREX_HALE047, IMAGE_CONVERTER_TOOL_INOREX_HALE048,\r
+ IMAGE_CONVERTER_TOOL_INOREX_HALE049, IMAGE_CONVERTER_TOOL_INOREX_HALE050, IMAGE_CONVERTER_TOOL_INOREX_HALE051,\r
+ IMAGE_CONVERTER_TOOL_INOREX_HALE052, IMAGE_CONVERTER_TOOL_INOREX_HALE053, IMAGE_CONVERTER_TOOL_INOREX_HALE054,\r
+ IMAGE_CONVERTER_TOOL_INOREX_HALE055, IMAGE_CONVERTER_TOOL_INOREX_HALE056, IMAGE_CONVERTER_TOOL_INOREX_HALE057,\r
+ IMAGE_CONVERTER_TOOL_INOREX_HALE058, IMAGE_CONVERTER_TOOL_INOREX_HALE059, IMAGE_CONVERTER_TOOL_INOREX_HALE060,\r
+ IMAGE_CONVERTER_TOOL_INOREX_HALE061, IMAGE_CONVERTER_TOOL_INOREX_HALE062, IMAGE_CONVERTER_TOOL_INOREX_HALE063,\r
+ IMAGE_CONVERTER_TOOL_INOREX_HALE064, IMAGE_CONVERTER_TOOL_INOREX_HALE065, IMAGE_CONVERTER_TOOL_INOREX_HALE066,\r
+ IMAGE_CONVERTER_TOOL_INOREX_HALE067, IMAGE_CONVERTER_TOOL_INOREX_HALE068, IMAGE_CONVERTER_TOOL_INOREX_HALE068,\r
+ IMAGE_CONVERTER_TOOL_INOREX_HALE069, IMAGE_CONVERTER_TOOL_INOREX_HALE070, IMAGE_CONVERTER_TOOL_INOREX_HALE071,\r
+ IMAGE_CONVERTER_TOOL_INOREX_HALE072, IMAGE_CONVERTER_TOOL_INOREX_HALE073, IMAGE_CONVERTER_TOOL_INOREX_HALE074,\r
+ IMAGE_CONVERTER_TOOL_INOREX_HALE075, IMAGE_CONVERTER_TOOL_INOREX_HALE076, IMAGE_CONVERTER_TOOL_INOREX_HALE077,\r
+ IMAGE_CONVERTER_TOOL_INOREX_HALE078, IMAGE_CONVERTER_TOOL_INOREX_HALE078,\r
+};\r
+\r
+BreathExerPage::BreathExerPage() {}\r
+\r
+BreathExerPage::~BreathExerPage()\r
+{\r
+ group->RemoveAll();\r
+ if (group != nullptr) {\r
+ delete group;\r
+ group = nullptr;\r
+ }\r
+ if (imageAnimator_ != nullptr) {\r
+ delete imageAnimator_;\r
+ imageAnimator_ = nullptr;\r
+ }\r
+ if (animatorCallBack != nullptr) {\r
+ delete animatorCallBack;\r
+ animatorCallBack = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(BREATH_IMAGE);\r
+}\r
+\r
+void BreathExerPage::OnStart(void *data)\r
+{\r
+ if (group == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathExerPage::OnStart new group ERROR");\r
+ group = new UIViewGroup();\r
+ }\r
+ group->SetPosition(0, 0);\r
+ group->Resize(BREATH_GROUP_SIZE, BREATH_GROUP_SIZE);\r
+ group->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ group->SetTouchable(true);\r
+ group->SetDraggable(true);\r
+ group->SetOnDragListener(this);\r
+\r
+ palyNumber = BreathModel::GetInstance().GetTheNumberOfPlays();\r
+ SetUpImageAnimator();\r
+\r
+ imageAnimator_->Start();\r
+ imageAnimator_->SetVisible(true);\r
+ animatorCallBack = new BreathExerPageCallback(this);\r
+ if (animatorCallBack == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathExerPage::OnStart new animatorCallBack ERROR");\r
+ return;\r
+ }\r
+ animation = new Animator(animatorCallBack, nullptr, 0, true);\r
+ if (animation == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathExerPage::OnStart new animation ERROR");\r
+ return;\r
+ }\r
+ animation->Start();\r
+\r
+ AddViewToPageContainer(group);\r
+}\r
+void BreathExerPage::OnStop() {}\r
+\r
+void BreathExerPage::SetUpImageAnimator()\r
+{\r
+ imageAnimator_ = new UIImageAnimatorView();\r
+ if (imageAnimator_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathExerPage::UIImageAnimatorView new Label SetUpImageAnimator fail");\r
+ return;\r
+ }\r
+\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathExerPage::SetUpImageAnimator ");\r
+ imageAnimator_ = new UIImageAnimatorView();\r
+ for (uint32_t DATA = 0; DATA < IMAGEANIMATOERVIEW_SIZE; DATA++) {\r
+ searchImageInfo[DATA].imageInfo =\r
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(g_imageAnimatorInfo[DATA], BREATH_IMAGE);\r
+ searchImageInfo[DATA].imageType = IMG_SRC_IMAGE_INFO;\r
+ searchImageInfo[DATA].pos.x = FIND_PHONE_IMAGE_X;\r
+ searchImageInfo[DATA].pos.y = FIND_PHONE_IMAGE_y;\r
+ searchImageInfo[DATA].width = IMAGE_SIZE;\r
+ searchImageInfo[DATA].height = IMAGE_SIZE;\r
+ }\r
+ imageAnimator_->SetPosition(BREATH_PHONE_IMAGE_POSITION_X, BREATH_PHONE_IMAGE_POSITION_y, BREATH_PHONE_IMAGE_WIDTH,\r
+ BREATH_PHONE_IMAGE_HEIGHT);\r
+ int imageNumber = IMAGEANIMATOERVIEW_SIZE;\r
+ int ImageUpdate = BreathModel::GetInstance().GetStatusRespiratory();\r
+ imageAnimator_->SetImageAnimatorSrc(searchImageInfo, imageNumber, ImageUpdate);\r
+ imageAnimator_->LayoutCenterOfParent();\r
+ imageAnimator_->SetDraggable(true);\r
+ imageAnimator_->SetRepeat(false);\r
+ imageAnimator_->SetRepeatTimes(palyNumber);\r
+ imageAnimator_->SetOnDragListener(this);\r
+ group->Add(imageAnimator_);\r
+ InitImageInfo();\r
+}\r
+\r
+void BreathExerPage::BreathExerPageCallback::Callback(UIView *view)\r
+{\r
+ UNUSED(view);\r
+ static int count = 0;\r
+ struct timeval currentTime;\r
+ uint32_t breathingTime;\r
+\r
+ breathingTime = BreathModel::GetInstance().GetTimeBreathing();\r
+ gettimeofday(¤tTime, nullptr);\r
+ int32_t StartTime = BreathModel::GetInstance().GetBeginsTime();\r
+ int32_t remTime = breathingTime - (currentTime.tv_sec - StartTime);\r
+ if (remTime <= END_TIME) {\r
+ if (BreathExerPage->imageAnimator_->GetState() == false) {\r
+ BreathExerPage->animation->Stop();\r
+ BreathExerPage->imageAnimator_->Stop();\r
+ BreathExerPage->imageAnimator_->SetVisible(false);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_RESULT_VIEW, nullptr,\r
+ TransitionType::TRANSITION_INVALID, true);\r
+ }\r
+ }\r
+}\r
+\r
+void BreathExerPage::OnPause()\r
+{\r
+ animation->Stop();\r
+ imageAnimator_->Stop();\r
+ imageAnimator_->SetVisible(false);\r
+}\r
+\r
+bool BreathExerPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathExerPage::OnDrag");\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathExerPage::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+ animation->Stop();\r
+ imageAnimator_->Stop();\r
+ imageAnimator_->SetVisible(false);\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_MAIN_VIEW, nullptr, TransitionType::TRANSITION_INVALID,\r
+ true);\r
+ }\r
+ return true;\r
+}\r
+void BreathExerPage::OnTimer() {}\r
+\r
+void BreathExerPage::InitImageInfo()\r
+{\r
+ const uint16_t pixelByteSize = FIND_PHONE_PIXELBYTE_SIZE;\r
+ const uint16_t width = FIND_PHONE_PIXELBYTEH;\r
+ const uint16_t height = FIND_PHONE_PIXELBYTEH;\r
+ uint32_t dataSize = width * height * pixelByteSize;\r
+ uint8_t *srcData1 = static_cast<uint8_t *>(UIMalloc(dataSize));\r
+ if (srcData1 == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathExerPage::InitImageInfo new srcData1 ERROR");\r
+ return;\r
+ }\r
+\r
+ for (uint32_t i = 0; i < dataSize; i += pixelByteSize) {\r
+ srcData1[i] = SET_INT_MAX_;\r
+ srcData1[i + BREATH_ONE] = 0;\r
+ srcData1[i + BREATH_TWO] = 0;\r
+ srcData1[i + BREATH_THREE] = OPA_OPAQUE;\r
+ }\r
+ imageInfoOen = static_cast<ImageInfo *>(UIMalloc(sizeof(ImageInfo)));\r
+ if (imageInfoOen == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathExerPage::InitImageInfo new imageInfoOen ERROR");\r
+ UIFree(srcData1);\r
+ return;\r
+ }\r
+\r
+ imageInfoOen->header.width = width;\r
+ imageInfoOen->header.height = height;\r
+ imageInfoOen->header.colorMode = ColorMode::ARGB8888;\r
+ imageInfoOen->dataSize = dataSize;\r
+ imageInfoOen->data = srcData1;\r
+\r
+ uint8_t *srcData2 = static_cast<uint8_t *>(UIMalloc(dataSize));\r
+ if (srcData2 == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathExerPage::InitImageInfo new srcData2 ERROR");\r
+ UIFree(imageInfoOen);\r
+ UIFree(srcData1);\r
+ return;\r
+ }\r
+ for (uint32_t i = 0; i < dataSize; i += pixelByteSize) {\r
+ srcData2[i] = 0;\r
+ srcData2[i + BREATH_ONE] = SET_INT_MAX_;\r
+ srcData2[i + BREATH_TWO] = 0;\r
+ srcData2[i + BREATH_THREE] = OPA_OPAQUE;\r
+ }\r
+\r
+ imageInfoTwo = static_cast<ImageInfo *>(UIMalloc(sizeof(ImageInfo)));\r
+ if (imageInfoTwo == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathExerPage::InitImageInfo new imageInfoTwo ERROR");\r
+ UIFree(srcData2);\r
+ UIFree(imageInfoOen);\r
+ UIFree(srcData1);\r
+ return;\r
+ }\r
+ imageInfoTwo->header.width = width;\r
+ imageInfoTwo->header.height = height;\r
+ imageInfoTwo->header.colorMode = ARGB8888;\r
+ imageInfoTwo->dataSize = dataSize;\r
+ imageInfoTwo->data = srcData2;\r
+\r
+ uint8_t *srcData3 = static_cast<uint8_t *>(UIMalloc(dataSize));\r
+ if (srcData3 == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathExerPage::InitImageInfo new srcData3 ERROR");\r
+ UIFree(imageInfoTwo);\r
+ UIFree(srcData2);\r
+ UIFree(imageInfoOen);\r
+ UIFree(srcData1);\r
+ return;\r
+ }\r
+ for (uint32_t i = 0; i < dataSize; i += pixelByteSize) {\r
+ srcData3[i] = 0;\r
+ srcData3[i + BREATH_ONE] = 0;\r
+ srcData3[i + BREATH_TWO] = SET_INT_MAX_;\r
+ srcData3[i + BREATH_THREE] = OPA_OPAQUE;\r
+ }\r
+\r
+ imageInfoThree = static_cast<ImageInfo *>(UIMalloc(sizeof(ImageInfo)));\r
+ if (imageInfoThree == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathExerPage::InitImageInfo new imageInfoThree ERROR");\r
+ UIFree(srcData3);\r
+ UIFree(imageInfoTwo);\r
+ UIFree(srcData2);\r
+ UIFree(imageInfoOen);\r
+ UIFree(srcData1);\r
+ return;\r
+ }\r
+ imageInfoThree->header.width = width;\r
+ imageInfoThree->header.height = height;\r
+ imageInfoThree->header.colorMode = ARGB8888;\r
+ imageInfoThree->dataSize = dataSize;\r
+ imageInfoThree->data = srcData3;\r
+\r
+ imageAnimatorImageInfo[BREATH_ZERO].imageInfo = imageInfoOen;\r
+ imageAnimatorImageInfo[BREATH_ZERO].pos = {BREATH_PHONE_IMAGEANIMATOR_POSITION_X,\r
+ BREATH_PHONE_IMAGEANIMATOR_POSITION_Y};\r
+ imageAnimatorImageInfo[BREATH_ZERO].width = BREATH_PHONE_IMAGEANIMATOR_WIDTH;\r
+ imageAnimatorImageInfo[BREATH_ZERO].height = BREATH_PHONE_IMAGEANIMATOR_HEIGHT;\r
+ imageAnimatorImageInfo[BREATH_ZERO].imageType = IMG_SRC_IMAGE_INFO;\r
+\r
+ imageAnimatorImageInfo[BREATH_ONE].imageInfo = imageInfoTwo;\r
+ imageAnimatorImageInfo[BREATH_ONE].pos = {BREATH_PHONE_IMAGEANIMATOR_POSITION_X,\r
+ BREATH_PHONE_IMAGEANIMATOR_POSITION_Y};\r
+ imageAnimatorImageInfo[BREATH_ONE].width = BREATH_PHONE_IMAGEANIMATOR_WIDTH;\r
+ imageAnimatorImageInfo[BREATH_ONE].height = BREATH_PHONE_IMAGEANIMATOR_HEIGHT;\r
+ imageAnimatorImageInfo[BREATH_ONE].imageType = IMG_SRC_IMAGE_INFO;\r
+\r
+ imageAnimatorImageInfo[BREATH_TWO].imageInfo = imageInfoThree;\r
+ imageAnimatorImageInfo[BREATH_TWO].pos = {BREATH_PHONE_IMAGEANIMATOR_POSITION_X,\r
+ BREATH_PHONE_IMAGEANIMATOR_POSITION_Y};\r
+ imageAnimatorImageInfo[BREATH_TWO].width = BREATH_PHONE_IMAGEANIMATOR_WIDTH;\r
+ imageAnimatorImageInfo[BREATH_TWO].height = BREATH_PHONE_IMAGEANIMATOR_HEIGHT;\r
+ imageAnimatorImageInfo[BREATH_TWO].imageType = IMG_SRC_IMAGE_INFO;\r
+}\r
+} // namespace OHOS
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathMainPage\r
+ * Create: 2025-5-13\r
+ */\r
+#include "gfx_utils/graphic_math.h"\r
+#include "UiConfig.h"\r
+#include "AppViewIDs.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "alarm/MainAlarmView.h"\r
+#include "NativeAbility.h"\r
+#include "TransitionType.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "ui_resource_breath.h"\r
+#include "main/LoadImg.h"\r
+#include "breath/BreathModel.h"\r
+#include "breath/BreathMainPage.h"\r
+\r
+namespace OHOS {\r
+\r
+#define WND_BTHMAIN_BTN_DUR_ID "BTH_MAIN_DUR"\r
+#define WND_BTHMAIN_BTN_RHY_ID "BTH_MAIN_RHY"\r
+#define WND_BTHMAIN_BTN_START_ID "BTH_MAIN_START"\r
+#define WND_BTHMAIN_TITLE_X 97\r
+#define WND_BTHMAIN_TITLE_Y 34\r
+#define WND_BTHMAIN_TITLE_W 260\r
+#define WND_BTHMAIN_TITLE_H 53\r
+#define WND_BTHMAIN_TITLE_FONT_SIZE 38\r
+#define WND_BTHMAIN_DURBTN_X 16\r
+#define WND_BTHMAIN_DURBTN_Y 190\r
+#define WND_BTHMAIN_DURBTN_W 74\r
+#define WND_BTHMAIN_DURBTN_H 74\r
+#define WND_BTHMAIN_RHYBTN_X 364\r
+#define WND_BTHMAIN_RHYBTN_Y 190\r
+#define WND_BTHMAIN_RHYBTN_W 74\r
+#define WND_BTHMAIN_RHYBTN_H 74\r
+#define WND_BTHMAIN_STARTBTN_X 60\r
+#define WND_BTHMAIN_STARTBTN_Y 358\r
+#define WND_BTHMAIN_STARTBTN_W 333\r
+#define WND_BTHMAIN_STARTBTN_H 96\r
+#define WND_BTHMAIN_DURLAB_X 20\r
+#define WND_BTHMAIN_DURLAB_Y 275\r
+#define WND_BTHMAIN_DURLAB_W 65\r
+#define WND_BTHMAIN_DURLAB_H 30\r
+#define WND_BTHMAIN_RHYLAB_X 376\r
+#define WND_BTHMAIN_RHYLAB_Y 275\r
+#define WND_BTHMAIN_RHYLAB_W 50\r
+#define WND_BTHMAIN_RHYLAB_H 30\r
+#define WND_BTHMAIN_CENTER_XY 127\r
+#define WND_BTHMAIN_CENTER_WH 200\r
+#define WND_BTHMAIN_lableSetting_FONT_SIZE 24\r
+#define WND_BTHMAIN_lableTime_FONT_SIZE 20\r
+#define BREATH_GROUP_SIZE 466\r
+\r
+REGIST_SLICE_PAGE(VIEW_MAIN_BREATHEASE, BrearhView::BREATH_MAIN_VIEW, BreathMainPage, true);\r
+\r
+BreathMainPage::~BreathMainPage()\r
+{\r
+ group->RemoveAll();\r
+ if (lableSetting != nullptr) {\r
+ delete lableSetting;\r
+ lableSetting = nullptr;\r
+ }\r
+ if (buttonStart != nullptr) {\r
+ delete buttonStart;\r
+ buttonStart = nullptr;\r
+ }\r
+ if (buttonSetting != nullptr) {\r
+ delete buttonSetting;\r
+ buttonSetting = nullptr;\r
+ }\r
+ if (buttonTime != nullptr) {\r
+ delete buttonTime;\r
+ buttonTime = nullptr;\r
+ }\r
+ if (lableBreathing != nullptr) {\r
+ delete lableBreathing;\r
+ lableBreathing = nullptr;\r
+ }\r
+ if (lableTime != nullptr) {\r
+ delete lableTime;\r
+ lableTime = nullptr;\r
+ }\r
+ if (group != nullptr) {\r
+ delete group;\r
+ group = nullptr;\r
+ }\r
+ if (background != nullptr) {\r
+ delete background;\r
+ background = nullptr;\r
+ }\r
+ if (center != nullptr) {\r
+ delete center;\r
+ center = nullptr;\r
+ }\r
+}\r
+\r
+void BreathMainPage::OnStart(void *data)\r
+{\r
+ if (group == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathMainPage::OnStart new group ERROR");\r
+ group = new UIViewGroup();\r
+ }\r
+ group->SetPosition(0, 0);\r
+ group->Resize(BREATH_GROUP_SIZE, BREATH_GROUP_SIZE);\r
+ group->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ group->SetTouchable(true);\r
+ group->SetDraggable(true);\r
+ group->SetOnDragListener(this);\r
+\r
+ if (background == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathMainPage::OnStart new Background ERROR");\r
+ background = new UIImageView();\r
+ }\r
+ background->SetPosition(0, 0);\r
+ background->Resize(BREATH_GROUP_SIZE, BREATH_GROUP_SIZE);\r
+ LOADIMG::LoadImageViewImg(background, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH001);\r
+ group->Add(background);\r
+\r
+ if (center == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathMainPage::OnStart new Center ERROR");\r
+ center = new UIImageView();\r
+ }\r
+ center->SetPosition(WND_BTHMAIN_CENTER_XY, WND_BTHMAIN_CENTER_XY);\r
+ center->Resize(WND_BTHMAIN_CENTER_WH, WND_BTHMAIN_CENTER_WH);\r
+ LOADIMG::LoadImageViewImg(center, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH012);\r
+ group->Add(center);\r
+\r
+ if (lableBreathing == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathMainPage::OnStart new lableBreathing ERROR");\r
+ lableBreathing = new UILabel();\r
+ }\r
+ lableBreathing->SetPosition(WND_BTHMAIN_TITLE_X, WND_BTHMAIN_TITLE_Y);\r
+ lableBreathing->Resize(WND_BTHMAIN_TITLE_W, WND_BTHMAIN_TITLE_H);\r
+ lableBreathing->SetText("呼吸");\r
+ lableBreathing->SetTextColor(Color::White());\r
+ lableBreathing->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ lableBreathing->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHMAIN_TITLE_FONT_SIZE);\r
+ group->Add(lableBreathing);\r
+\r
+ if (buttonTime == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathMainPage::OnStart new buttonTime ERROR");\r
+ buttonTime = new UIButton();\r
+ }\r
+ buttonTime->SetPosition(WND_BTHMAIN_DURBTN_X, WND_BTHMAIN_DURBTN_Y);\r
+ buttonTime->Resize(WND_BTHMAIN_DURBTN_W, WND_BTHMAIN_DURBTN_H);\r
+ buttonTime->SetViewId(WND_BTHMAIN_BTN_DUR_ID);\r
+ buttonTime->SetOnClickListener(this);\r
+ LOADIMG::LoadBtnImage(buttonTime, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH002, IMAGE_CONVERTER_TOOL_BREATH002);\r
+ buttonTime->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ buttonTime->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ group->Add(buttonTime);\r
+\r
+ if (buttonSetting == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathMainPage::OnStart new buttonSetting ERROR");\r
+ buttonSetting = new UIButton();\r
+ }\r
+ buttonSetting->SetPosition(WND_BTHMAIN_RHYBTN_X, WND_BTHMAIN_RHYBTN_Y);\r
+ buttonSetting->Resize(WND_BTHMAIN_RHYBTN_W, WND_BTHMAIN_RHYBTN_H);\r
+ buttonSetting->SetViewId(WND_BTHMAIN_BTN_RHY_ID);\r
+ buttonSetting->SetOnClickListener(this);\r
+ LOADIMG::LoadBtnImage(buttonSetting, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH004, IMAGE_CONVERTER_TOOL_BREATH004);\r
+ buttonSetting->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ buttonSetting->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ group->Add(buttonSetting);\r
+\r
+ if (buttonStart == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathMainPage::OnStart new buttonStart ERROR");\r
+ buttonStart = new UIButton();\r
+ }\r
+ buttonStart->SetPosition(WND_BTHMAIN_STARTBTN_X, WND_BTHMAIN_STARTBTN_Y);\r
+ buttonStart->Resize(WND_BTHMAIN_STARTBTN_W, WND_BTHMAIN_STARTBTN_H);\r
+ buttonStart->SetViewId(WND_BTHMAIN_BTN_START_ID);\r
+ buttonStart->SetOnClickListener(this);\r
+ LOADIMG::LoadBtnImage(buttonStart, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH006, IMAGE_CONVERTER_TOOL_BREATH006);\r
+ buttonStart->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ buttonStart->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ group->Add(buttonStart);\r
+\r
+ if (lableSetting == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathMainPage::OnStart new lableSetting ERROR");\r
+ lableSetting = new UILabel();\r
+ }\r
+ lableSetting->SetPosition(WND_BTHMAIN_RHYLAB_X, WND_BTHMAIN_RHYLAB_Y);\r
+ lableSetting->Resize(WND_BTHMAIN_RHYLAB_W, WND_BTHMAIN_RHYLAB_H);\r
+ lableSetting->SetText("设置");\r
+ lableSetting->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);\r
+ lableSetting->SetTextColor(Color::White());\r
+ lableSetting->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ lableSetting->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHMAIN_lableSetting_FONT_SIZE);\r
+ group->Add(lableSetting);\r
+\r
+ if (lableTime == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathMainPage::OnStart new lableTime ERROR");\r
+ lableTime = new UILabel();\r
+ }\r
+ lableTime->SetPosition(WND_BTHMAIN_DURLAB_X, WND_BTHMAIN_DURLAB_Y);\r
+ lableTime->Resize(WND_BTHMAIN_DURLAB_W, WND_BTHMAIN_DURLAB_H);\r
+ lableTime->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);\r
+ lableTime->SetTextColor(Color::White());\r
+ lableTime->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ lableTime->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHMAIN_lableTime_FONT_SIZE);\r
+ group->Add(lableTime);\r
+\r
+ AddViewToPageContainer(group);\r
+}\r
+\r
+void BreathMainPage::OnStop(void) {}\r
+\r
+void BreathMainPage::OnResume(void)\r
+{\r
+ lableTime->SetText(BreathModel::GetInstance().GetTimeDuration());\r
+}\r
+\r
+bool BreathMainPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ if (strcmp(view.GetViewId(), WND_BTHMAIN_BTN_DUR_ID) == 0) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathMainPage OnClick...ChangeTo DUR");\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_DUR_VIEW, nullptr, TransitionType::TRANSITION_INVALID,\r
+ true);\r
+ } else if (strcmp(view.GetViewId(), WND_BTHMAIN_BTN_RHY_ID) == 0) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathMainPage OnClick...ChangeTo RHY");\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_RHY_VIEW, nullptr, TransitionType::TRANSITION_INVALID,\r
+ true);\r
+ } else if (strcmp(view.GetViewId(), WND_BTHMAIN_BTN_START_ID) == 0) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathMainPage OnClick...ChangeTo START");\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_START_VIEW, nullptr, TransitionType::TRANSITION_INVALID,\r
+ true);\r
+ struct timeval current_time;\r
+ gettimeofday(¤t_time, nullptr);\r
+ uint32_t remTime = current_time.tv_sec;\r
+ BreathModel::GetInstance().SetSaveTime(remTime);\r
+ } else {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathMainPage OnClick...ChangeTo unknow");\r
+ return false;\r
+ }\r
+ return true;\r
+}\r
+\r
+bool BreathMainPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathMainPage::OnDrag");\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathMainPage::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+ }\r
+ return true;\r
+}\r
+} // namespace OHOS
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathModel\r
+ * Create: 2025-5-13\r
+ */\r
+#include "uiservice/ui_service.h"\r
+#include "main/HealthModel.h"\r
+#include "breath/BreathDurPage.h"\r
+#include "breath/BreathModel.h"\r
+\r
+namespace OHOS {\r
+#define MINUTE_IDX_1 0\r
+#define MINUTE_IDX_2 1\r
+#define MINUTE_IDX_3 2\r
+#define SPEED_IDX_1 0\r
+#define SPEED_IDX_2 1\r
+#define SPEED_IDX_3 2\r
+#define MINUTE_1 "1 分钟"\r
+#define MINUTE_2 "2 分钟"\r
+#define MINUTE_3 "3 分钟"\r
+#define SPEED_FAST_8 "稍快 8次/分"\r
+#define SPEED_SLOW_7 "舒缓 7次/分"\r
+#define SPEED_SLOW_6 "缓慢 6次/分"\r
+#define TIME_1 "1"\r
+#define TIME_2 "2"\r
+#define TIME_3 "3"\r
+#define SPEED_FASTER_LITTLE "稍快"\r
+#define SPEED_SOOTHING "舒缓"\r
+#define SPEED_SLOWING "缓慢"\r
+#define MINUTE_0_DATA 0\r
+#define MINUTE_1_DATA 1\r
+#define MINUTE_2_DATA 2\r
+#define MINUTE_3_DATA 3\r
+#define NUMBLE_PLAY_8_DATA 8\r
+#define NUMBLE_PLAY_7_DATA 7\r
+#define NUMBLE_PLAY_6_DATA 6\r
+#define NUMBLE_PLAY_16_DATA 16\r
+#define NUMBLE_PLAY_14_DATA 14\r
+#define NUMBLE_PLAY_12_DATA 12\r
+#define NUMBLE_PLAY_24_DATA 24\r
+#define NUMBLE_PLAY_21_DATA 21\r
+#define NUMBLE_PLAY_18_DATA 18\r
+#define Frequency_Score_LOWER 60\r
+#define Frequency_Score_RANGE 40\r
+#define Heart_Rate_LOWER 90\r
+#define Heart_Rate_RANGE 10\r
+#define ONE_MINUTE 60\r
+#define TWO_MINUTES 120\r
+#define THREE_MINUTES 180\r
+#define SIX_POINTS_FOR_ONE 125\r
+#define SEVEN_POINTS_FOR_ONE 106\r
+#define EIGHT_POINTS_FOR_ONE 98\r
+uint8_t g_frequencyScore;\r
+uint8_t g_heartRate;\r
+\r
+BreathModel::BreathModel()\r
+{\r
+ DefaultData();\r
+}\r
+\r
+BreathModel::~BreathModel() {}\r
+\r
+void BreathModel::DefaultData()\r
+{\r
+ durList[MINUTE_IDX_1] = MINUTE_1;\r
+ durList[MINUTE_IDX_2] = MINUTE_2;\r
+ durList[MINUTE_IDX_3] = MINUTE_3;\r
+ rhyList[SPEED_IDX_1] = SPEED_FAST_8;\r
+ rhyList[SPEED_IDX_2] = SPEED_SLOW_7;\r
+ rhyList[SPEED_IDX_3] = SPEED_SLOW_6;\r
+ durListVal[MINUTE_IDX_1] = MINUTE_1_DATA;\r
+ durListVal[MINUTE_IDX_2] = MINUTE_2_DATA;\r
+ durListVal[MINUTE_IDX_3] = MINUTE_3_DATA;\r
+}\r
+\r
+BreathModel &BreathModel::GetInstance()\r
+{\r
+ static BreathModel instance;\r
+ return instance;\r
+}\r
+\r
+const char **BreathModel::GetDurListData()\r
+{\r
+ return durList;\r
+}\r
+\r
+const char **BreathModel::GetRhyListData()\r
+{\r
+ return rhyList;\r
+}\r
+\r
+uint8_t BreathModel::GetDurListSize()\r
+{\r
+ return sizeof(durList) / sizeof(durList[0]);\r
+}\r
+\r
+uint8_t BreathModel::GetRhyListSize()\r
+{\r
+ return sizeof(rhyList) / sizeof(rhyList[0]);\r
+}\r
+\r
+void BreathModel::SetTimeDuration(uint16_t idx)\r
+{\r
+ data = idx;\r
+}\r
+\r
+void BreathModel::SetTimeRhyation(uint16_t idx)\r
+{\r
+ date = idx;\r
+}\r
+\r
+uint8_t BreathModel::GetSelectTime()\r
+{\r
+ if (data == MINUTE_0_DATA) {\r
+ return MINUTE_IDX_1;\r
+ } else if (data == MINUTE_1_DATA) {\r
+ return MINUTE_IDX_2;\r
+ } else if (data == MINUTE_2_DATA) {\r
+ return MINUTE_IDX_3;\r
+ }\r
+ return 0;\r
+}\r
+\r
+uint8_t BreathModel::GetSelectTempo()\r
+{\r
+ if (date == MINUTE_0_DATA) {\r
+ return SPEED_IDX_1;\r
+ } else if (date == MINUTE_1_DATA) {\r
+ return SPEED_IDX_2;\r
+ } else if (date == MINUTE_2_DATA) {\r
+ return SPEED_IDX_3;\r
+ }\r
+ return 0;\r
+}\r
+\r
+char *BreathModel::GetTimeDuration()\r
+{\r
+ if (data == MINUTE_0_DATA) {\r
+ return MINUTE_1;\r
+ } else if (data == MINUTE_1_DATA) {\r
+ return MINUTE_2;\r
+ } else if (data == MINUTE_2_DATA) {\r
+ return MINUTE_3;\r
+ }\r
+ return nullptr;\r
+}\r
+\r
+char *BreathModel::GetDuration()\r
+{\r
+ if (data == MINUTE_0_DATA) {\r
+ return TIME_1;\r
+ } else if (data == MINUTE_1_DATA) {\r
+ return TIME_2;\r
+ } else if (data == MINUTE_2_DATA) {\r
+ return TIME_3;\r
+ }\r
+ return nullptr;\r
+}\r
+\r
+char *BreathModel::GetRhythm()\r
+{\r
+ if (date == MINUTE_0_DATA) {\r
+ return SPEED_FASTER_LITTLE;\r
+ } else if (date == MINUTE_1_DATA) {\r
+ return SPEED_SOOTHING;\r
+ } else if (date == MINUTE_2_DATA) {\r
+ return SPEED_SLOWING;\r
+ }\r
+ return nullptr;\r
+}\r
+\r
+void BreathModel::SetSaveTime(int32_t idx)\r
+{\r
+ saveTime = idx;\r
+}\r
+\r
+int32_t BreathModel::GetSaveTime()\r
+{\r
+ return saveTime;\r
+}\r
+\r
+void BreathModel::SetBeginsTime(int32_t idx)\r
+{\r
+ beginsTime = idx;\r
+}\r
+\r
+int32_t BreathModel::GetBeginsTime()\r
+{\r
+ return beginsTime;\r
+}\r
+\r
+uint32_t BreathModel::GetTimeBreathing()\r
+{\r
+ if (data == MINUTE_0_DATA) {\r
+ return ONE_MINUTE;\r
+ } else if (data == MINUTE_1_DATA) {\r
+ return TWO_MINUTES;\r
+ } else if (data == MINUTE_2_DATA) {\r
+ return THREE_MINUTES;\r
+ }\r
+ return 0;\r
+}\r
+\r
+uint32_t BreathModel::GetStatusRespiratory()\r
+{\r
+ if (date == MINUTE_0_DATA) {\r
+ return EIGHT_POINTS_FOR_ONE;\r
+ } else if (date == MINUTE_1_DATA) {\r
+ return SEVEN_POINTS_FOR_ONE;\r
+ } else if (date == MINUTE_2_DATA) {\r
+ return SIX_POINTS_FOR_ONE;\r
+ }\r
+ return 0;\r
+}\r
+\r
+void BreathModel::SetFrequencyScore()\r
+{\r
+ g_frequencyScore = Frequency_Score_LOWER + rand() % Frequency_Score_RANGE;\r
+}\r
+\r
+uint8_t BreathModel::GetFrequencyScore()\r
+{\r
+ return g_frequencyScore;\r
+}\r
+\r
+void BreathModel::SetHeartRate()\r
+{\r
+ g_heartRate = Heart_Rate_LOWER + rand() % Heart_Rate_RANGE;\r
+}\r
+\r
+uint8_t BreathModel::GetHeartRate()\r
+{\r
+ return g_heartRate;\r
+}\r
+\r
+uint32_t BreathModel::GetTheNumberOfPlays()\r
+{\r
+ if (date == MINUTE_0_DATA && data == MINUTE_0_DATA) {\r
+ return NUMBLE_PLAY_8_DATA;\r
+ } else if (date == MINUTE_1_DATA && data == MINUTE_0_DATA) {\r
+ return NUMBLE_PLAY_7_DATA;\r
+ } else if (date == MINUTE_2_DATA && data == MINUTE_0_DATA) {\r
+ return NUMBLE_PLAY_6_DATA;\r
+ } else if (date == MINUTE_0_DATA && data == MINUTE_1_DATA) {\r
+ return NUMBLE_PLAY_16_DATA;\r
+ } else if (date == MINUTE_1_DATA && data == MINUTE_1_DATA) {\r
+ return NUMBLE_PLAY_14_DATA;\r
+ } else if (date == MINUTE_2_DATA && data == MINUTE_1_DATA) {\r
+ return NUMBLE_PLAY_12_DATA;\r
+ } else if (date == MINUTE_0_DATA && data == MINUTE_2_DATA) {\r
+ return NUMBLE_PLAY_24_DATA;\r
+ } else if (date == MINUTE_1_DATA && data == MINUTE_2_DATA) {\r
+ return NUMBLE_PLAY_21_DATA;\r
+ } else if (date == MINUTE_2_DATA && data == MINUTE_2_DATA) {\r
+ return NUMBLE_PLAY_18_DATA;\r
+ }\r
+ return 0;\r
+}\r
+} // namespace OHOS
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathPresenter\r
+ * Create: 2025-5-13\r
+ */\r
+#include "AppViewIDs.h"\r
+#include "NativeRegisterManager.h"\r
+#include "breath/BreathView.h"\r
+#include "breath/BreathPresenter.h"\r
+\r
+namespace OHOS {\r
+REGIST_MENU(VIEW_MAIN_BREATHEASE, BreathView, BreathPresenter, BREATH_MAIN_ICON, BREATH_MAIN_ICON, "呼吸训练");\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathReult\r
+ * Create: 2025-5-13\r
+ */\r
+#include <sstream>\r
+#include "gfx_utils/graphic_math.h"\r
+#include "components/root_view.h"\r
+#include "UiConfig.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "NativeAbility.h"\r
+#include "TransitionType.h"\r
+#include "SlicePageFactory.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_breath.h"\r
+#include "breath/BreathView.h"\r
+#include "breath/BreathResultPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_MAIN_BREATHEASE, BrearhView::BREATH_RESULT_VIEW, BreathResultPage, false);\r
+#define WND_BTHMAIN_RESULTS_X 97\r
+#define WND_BTHMAIN_RESULTS_Y 34\r
+#define WND_BTHMAIN_RESULTS_W 260\r
+#define WND_BTHMAIN_RESULTS_H 53\r
+#define WND_BTHMAIN_MAX_FONT_SIZE 38\r
+#define WND_BTHMAIN_FREQUENCIES_X 140\r
+#define WND_BTHMAIN_FREQUENCIES_Y 133\r
+#define WND_BTHMAIN_FREQUENCIES_W 164\r
+#define WND_BTHMAIN_FREQUENCIES_H 30\r
+#define WND_BTHMAIN_MIN_FONT_SIZE 24\r
+#define WND_BTHMAIN_HEARTRATE_X 149\r
+#define WND_BTHMAIN_HEARTRATE_Y 233\r
+#define WND_BTHMAIN_HEARTRATE_W 120\r
+#define WND_BTHMAIN_HEARTRATE_H 30\r
+#define WND_BTHMAIN_FREQUEBCY_TIMES_X 204\r
+#define WND_BTHMAIN_FREQUEBCY_TIMES_Y 179\r
+#define WND_BTHMAIN_FREQUEBCY_TIMES_W 29\r
+#define WND_BTHMAIN_FREQUEBCY_TIMES_H 29\r
+#define WND_BTHMAIN_HEARTRATE_TIMES_X 204\r
+#define WND_BTHMAIN_HEARTRATE_TIMES_Y 279\r
+#define WND_BTHMAIN_HEARTRATE_TIMES_W 58\r
+#define WND_BTHMAIN_HEARTRATE_TIMES_H 29\r
+#define WND_BTHMAIN_DURATION_X 149\r
+#define WND_BTHMAIN_DURATION_Y 333\r
+#define WND_BTHMAIN_DURATION_W 96\r
+#define WND_BTHMAIN_DURATION_H 30\r
+#define WND_BTHMAIN_FREQUENCIES_SCOUT_X 149\r
+#define WND_BTHMAIN_FREQUENCIES_SCOUT_Y 165\r
+#define WND_BTHMAIN_FREQUENCIES_SCOUT_W 49\r
+#define WND_BTHMAIN_FREQUENCIES_SCOUT_H 49\r
+#define WND_BTHMAIN_SCOUT_FONT_SIZE 40\r
+#define WND_BTHMAIN_HEARTRATE_SCOUT_X 149\r
+#define WND_BTHMAIN_HEARTRATE_SCOUT_Y 265\r
+#define WND_BTHMAIN_HEARTRATE_SCOUT_W 49\r
+#define WND_BTHMAIN_HEARTRATE_SCOUT_H 49\r
+#define WND_BTHMAIN_RHYTHM_X 161\r
+#define WND_BTHMAIN_RHYTHM_Y 83\r
+#define WND_BTHMAIN_RHYTHM_W 132\r
+#define WND_BTHMAIN_RHYTHM_H 30\r
+#define WND_BTHMAIN_TIME_X 149\r
+#define WND_BTHMAIN_TIME_Y 365\r
+#define WND_BTHMAIN_TIME_W 25\r
+#define WND_BTHMAIN_TIME_H 48\r
+#define WND_BTHMAIN_TIME_UNIT_X 180\r
+#define WND_BTHMAIN_TIME_UNIT_Y 379\r
+#define WND_BTHMAIN_TIME_UNIT_W 58\r
+#define WND_BTHMAIN_TIME_UNIT_H 29\r
+#define WND_BTHMAIN_SCORES_X 241\r
+#define WND_BTHMAIN_SCORES_Y 177\r
+#define WND_BTHMAIN_SCORES_W 72\r
+#define WND_BTHMAIN_SCORES_H 32\r
+#define BREATH_GROUP_SIZE 466\r
+#define BREATH_GUINEAS_SIZE 100\r
+#define BREATH_NINETY_SIZE 90\r
+#define BREATH_EIGHTY_NINE_SIZE 89\r
+#define BREATH_EIGHTY_SIZE 80\r
+#define BREATH_SEVENTY_NINE_SIZE 79\r
+#define BREATH_SEVENTY_SIZE 70\r
+#define BREATH_SIXTY_NINE_SIZE 69\r
+#define BREATH_SIXTY_SIZE 60\r
+#define TEXT_OPACITY 147\r
+#define TEXT_SIZE 5\r
+\r
+BreathResultPage::BreathResultPage() {}\r
+\r
+BreathResultPage::~BreathResultPage()\r
+{\r
+ group->RemoveAll();\r
+ if (trainingResults != nullptr) {\r
+ delete trainingResults;\r
+ trainingResults = nullptr;\r
+ }\r
+ if (trainingFrequencies != nullptr) {\r
+ delete trainingFrequencies;\r
+ trainingFrequencies = nullptr;\r
+ }\r
+ if (trainingHeartRate != nullptr) {\r
+ delete trainingHeartRate;\r
+ trainingHeartRate = nullptr;\r
+ }\r
+ if (trainingDuration != nullptr) {\r
+ delete trainingDuration;\r
+ trainingDuration = nullptr;\r
+ }\r
+ if (frequenciesScout != nullptr) {\r
+ delete frequenciesScout;\r
+ frequenciesScout = nullptr;\r
+ }\r
+ if (heartRateScout != nullptr) {\r
+ delete heartRateScout;\r
+ heartRateScout = nullptr;\r
+ }\r
+ if (descriptionBreathing != nullptr) {\r
+ delete descriptionBreathing;\r
+ descriptionBreathing = nullptr;\r
+ }\r
+ if (time != nullptr) {\r
+ delete time;\r
+ time = nullptr;\r
+ }\r
+ if (timeUnit != nullptr) {\r
+ delete timeUnit;\r
+ timeUnit = nullptr;\r
+ }\r
+ if (heartRateTimes != nullptr) {\r
+ delete heartRateTimes;\r
+ heartRateTimes = nullptr;\r
+ }\r
+ if (frequencyTimes != nullptr) {\r
+ delete frequencyTimes;\r
+ frequencyTimes = nullptr;\r
+ }\r
+ if (group != nullptr) {\r
+ delete group;\r
+ group = nullptr;\r
+ }\r
+ if (scores != nullptr) {\r
+ delete scores;\r
+ scores = nullptr;\r
+ }\r
+}\r
+\r
+void BreathResultPage::OnStart(void *data)\r
+{\r
+ if (group == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathResultPage::OnStart new group ERROR");\r
+ group = new UIViewGroup();\r
+ }\r
+ group->SetPosition(0, 0);\r
+ group->Resize(BREATH_GROUP_SIZE, BREATH_GROUP_SIZE);\r
+ group->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ group->SetTouchable(true);\r
+ group->SetDraggable(true);\r
+ group->SetOnDragListener(this);\r
+\r
+ if (trainingResults == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathResultPage::OnStart new trainingResults ERROR");\r
+ trainingResults = new UILabel();\r
+ }\r
+ trainingResults->SetPosition(WND_BTHMAIN_RESULTS_X, WND_BTHMAIN_RESULTS_Y);\r
+ trainingResults->Resize(WND_BTHMAIN_RESULTS_W, WND_BTHMAIN_RESULTS_H);\r
+ trainingResults->SetText("训练结果");\r
+ trainingResults->SetTextColor(Color::White());\r
+ trainingResults->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHMAIN_MAX_FONT_SIZE);\r
+ trainingResults->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group->Add(trainingResults);\r
+\r
+ if (trainingFrequencies == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathResultPage::OnStart new trainingFrequencies ERROR");\r
+ trainingFrequencies = new UILabel();\r
+ }\r
+ trainingFrequencies->SetPosition(WND_BTHMAIN_FREQUENCIES_X, WND_BTHMAIN_FREQUENCIES_Y);\r
+ trainingFrequencies->Resize(WND_BTHMAIN_FREQUENCIES_W, WND_BTHMAIN_FREQUENCIES_H);\r
+ trainingFrequencies->SetText("呼吸频率得分");\r
+ trainingFrequencies->SetTextColor(Color::White());\r
+ trainingFrequencies->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHMAIN_MIN_FONT_SIZE);\r
+ trainingFrequencies->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ trainingFrequencies->SetStyle(STYLE_TEXT_OPA, TEXT_OPACITY);\r
+ group->Add(trainingFrequencies);\r
+\r
+ if (trainingHeartRate == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathResultPage::OnStart new trainingHeartRate ERROR");\r
+ trainingHeartRate = new UILabel();\r
+ }\r
+ trainingHeartRate->SetPosition(WND_BTHMAIN_HEARTRATE_X, WND_BTHMAIN_HEARTRATE_Y);\r
+ trainingHeartRate->Resize(WND_BTHMAIN_HEARTRATE_W, WND_BTHMAIN_HEARTRATE_H);\r
+ trainingHeartRate->SetText("呼吸前心率");\r
+ trainingHeartRate->SetTextColor(Color::White());\r
+ trainingHeartRate->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHMAIN_MIN_FONT_SIZE);\r
+ trainingHeartRate->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ trainingHeartRate->SetStyle(STYLE_TEXT_OPA, TEXT_OPACITY);\r
+ group->Add(trainingHeartRate);\r
+\r
+ if (frequencyTimes == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathResultPage::OnStart new frequencyTimes ERROR");\r
+ frequencyTimes = new UILabel();\r
+ }\r
+ frequencyTimes->SetPosition(WND_BTHMAIN_FREQUEBCY_TIMES_X, WND_BTHMAIN_FREQUEBCY_TIMES_Y);\r
+ frequencyTimes->Resize(WND_BTHMAIN_FREQUEBCY_TIMES_W, WND_BTHMAIN_FREQUEBCY_TIMES_H);\r
+ frequencyTimes->SetText("分");\r
+ frequencyTimes->SetTextColor(Color::White());\r
+ frequencyTimes->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHMAIN_MIN_FONT_SIZE);\r
+ frequencyTimes->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ frequencyTimes->SetStyle(STYLE_TEXT_OPA, TEXT_OPACITY);\r
+ group->Add(frequencyTimes);\r
+\r
+ if (heartRateTimes == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathResultPage::OnStart new HeartRate_Times ERROR");\r
+ heartRateTimes = new UILabel();\r
+ }\r
+ heartRateTimes->SetPosition(WND_BTHMAIN_HEARTRATE_TIMES_X, WND_BTHMAIN_HEARTRATE_TIMES_Y);\r
+ heartRateTimes->Resize(WND_BTHMAIN_HEARTRATE_TIMES_W, WND_BTHMAIN_HEARTRATE_TIMES_H);\r
+ heartRateTimes->SetText("次/分");\r
+ heartRateTimes->SetTextColor(Color::White());\r
+ heartRateTimes->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHMAIN_MIN_FONT_SIZE);\r
+ heartRateTimes->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ heartRateTimes->SetStyle(STYLE_TEXT_OPA, TEXT_OPACITY);\r
+ group->Add(heartRateTimes);\r
+\r
+ if (trainingDuration == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathResultPage::OnStart new trainingDuration ERROR");\r
+ trainingDuration = new UILabel();\r
+ }\r
+ trainingDuration->SetPosition(WND_BTHMAIN_DURATION_X, WND_BTHMAIN_DURATION_Y);\r
+ trainingDuration->Resize(WND_BTHMAIN_DURATION_W, WND_BTHMAIN_DURATION_H);\r
+ trainingDuration->SetText("训练时长");\r
+ trainingDuration->SetTextColor(Color::White());\r
+ trainingDuration->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHMAIN_MIN_FONT_SIZE);\r
+ trainingDuration->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ trainingDuration->SetStyle(STYLE_TEXT_OPA, TEXT_OPACITY);\r
+ group->Add(trainingDuration);\r
+\r
+ if (frequenciesScout == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathResultPage::OnStart new Frequencies_scout ERROR");\r
+ frequenciesScout = new UILabel();\r
+ }\r
+ frequenciesScout->SetPosition(WND_BTHMAIN_FREQUENCIES_SCOUT_X, WND_BTHMAIN_FREQUENCIES_SCOUT_Y);\r
+ frequenciesScout->Resize(WND_BTHMAIN_FREQUENCIES_SCOUT_W, WND_BTHMAIN_FREQUENCIES_SCOUT_H);\r
+ frequenciesScout->SetTextColor(Color::White());\r
+ frequenciesScout->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHMAIN_SCOUT_FONT_SIZE);\r
+ frequenciesScout->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group->Add(frequenciesScout);\r
+\r
+ if (heartRateScout == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathResultPage::OnStart new HeartRate_scout ERROR");\r
+ heartRateScout = new UILabel();\r
+ }\r
+ heartRateScout->SetPosition(WND_BTHMAIN_HEARTRATE_SCOUT_X, WND_BTHMAIN_HEARTRATE_SCOUT_Y);\r
+ heartRateScout->Resize(WND_BTHMAIN_HEARTRATE_SCOUT_W, WND_BTHMAIN_HEARTRATE_SCOUT_H);\r
+ heartRateScout->SetTextColor(Color::White());\r
+ heartRateScout->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHMAIN_SCOUT_FONT_SIZE);\r
+ heartRateScout->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group->Add(heartRateScout);\r
+\r
+ if (descriptionBreathing == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathResultPage::OnStart new Rhythm ERROR");\r
+ descriptionBreathing = new UILabel();\r
+ }\r
+ descriptionBreathing->SetPosition(WND_BTHMAIN_RHYTHM_X, WND_BTHMAIN_RHYTHM_Y);\r
+ descriptionBreathing->Resize(WND_BTHMAIN_RHYTHM_W, WND_BTHMAIN_RHYTHM_H);\r
+ descriptionBreathing->SetTextColor(Color::Green());\r
+ descriptionBreathing->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHMAIN_MIN_FONT_SIZE);\r
+ descriptionBreathing->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group->Add(descriptionBreathing);\r
+\r
+ if (time == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathResultPage::OnStart new Time ERROR");\r
+ time = new UILabel();\r
+ }\r
+ time->SetPosition(WND_BTHMAIN_TIME_X, WND_BTHMAIN_TIME_Y);\r
+ time->Resize(WND_BTHMAIN_TIME_W, WND_BTHMAIN_TIME_H);\r
+ time->SetTextColor(Color::White());\r
+ time->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHMAIN_SCOUT_FONT_SIZE);\r
+ time->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group->Add(time);\r
+\r
+ if (timeUnit == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathResultPage::OnStart new Time_Unit ERROR");\r
+ timeUnit = new UILabel();\r
+ }\r
+ timeUnit->SetPosition(WND_BTHMAIN_TIME_UNIT_X, WND_BTHMAIN_TIME_UNIT_Y);\r
+ timeUnit->Resize(WND_BTHMAIN_TIME_UNIT_W, WND_BTHMAIN_TIME_UNIT_H);\r
+ timeUnit->SetText("分钟");\r
+ timeUnit->SetTextColor(Color::White());\r
+ timeUnit->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHMAIN_MIN_FONT_SIZE);\r
+ timeUnit->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ timeUnit->SetStyle(STYLE_TEXT_OPA, TEXT_OPACITY);\r
+ group->Add(timeUnit);\r
+\r
+ if (scores == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathResultPage::OnStart new Scores ERROR");\r
+ scores = new UIImageView();\r
+ }\r
+ scores->SetPosition(WND_BTHMAIN_SCORES_X, WND_BTHMAIN_SCORES_Y);\r
+ scores->Resize(WND_BTHMAIN_SCORES_W, WND_BTHMAIN_SCORES_H);\r
+ group->Add(scores);\r
+\r
+ AddViewToPageContainer(group);\r
+}\r
+void BreathResultPage::OnStop() {}\r
+void BreathResultPage::OnResume(void)\r
+{\r
+ std::ostringstream oss;\r
+ oss << BreathModel::GetInstance().GetTimeDuration() << " | " << BreathModel::GetInstance().GetRhythm();\r
+ std::string weatherHumidity = oss.str();\r
+ descriptionBreathing->SetText(weatherHumidity.c_str());\r
+ time->SetText(BreathModel::GetInstance().GetDuration());\r
+\r
+ BreathModel::GetInstance().SetFrequencyScore();\r
+ BreathModel::GetInstance().SetHeartRate();\r
+\r
+ frequencyScore = BreathModel::GetInstance().GetFrequencyScore();\r
+ char szFrequencyScore[TEXT_SIZE] = "";\r
+ sprintf_s(szFrequencyScore, sizeof(szFrequencyScore), "%d", frequencyScore);\r
+ frequenciesScout->SetText(szFrequencyScore);\r
+\r
+ if (frequencyScore >= BREATH_NINETY_SIZE && frequencyScore <= BREATH_GUINEAS_SIZE) {\r
+ LOADIMG::LoadImageViewImg(scores, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH008);\r
+ } else if (frequencyScore >= BREATH_EIGHTY_SIZE && frequencyScore <= BREATH_EIGHTY_NINE_SIZE) {\r
+ LOADIMG::LoadImageViewImg(scores, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH007);\r
+ } else if (frequencyScore >= BREATH_SEVENTY_SIZE && frequencyScore <= BREATH_SEVENTY_NINE_SIZE) {\r
+ LOADIMG::LoadImageViewImg(scores, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH011);\r
+ } else if (frequencyScore >= BREATH_SIXTY_SIZE && frequencyScore <= BREATH_SIXTY_NINE_SIZE) {\r
+ LOADIMG::LoadImageViewImg(scores, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH009);\r
+ } else {\r
+ LOADIMG::LoadImageViewImg(scores, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH010);\r
+ }\r
+\r
+ heartRate = BreathModel::GetInstance().GetHeartRate();\r
+ char szHeartRate[TEXT_SIZE] = "";\r
+ sprintf_s(szHeartRate, sizeof(szHeartRate), "%d", heartRate);\r
+ heartRateScout->SetText(szHeartRate);\r
+}\r
+\r
+bool BreathResultPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ return true;\r
+}\r
+\r
+bool BreathResultPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathResultPage::OnDrag");\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathResultPage::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_MAIN_VIEW, nullptr, TransitionType::TRANSITION_INVALID,\r
+ true);\r
+ }\r
+ return true;\r
+}\r
+} // namespace OHOS
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathRhyPage\r
+ * Create: 2025-5-13\r
+ */\r
+#include "gfx_utils/graphic_math.h"\r
+#include "UiConfig.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "NativeAbility.h"\r
+#include "alarm/MainAlarmView.h"\r
+#include "SlicePageFactory.h"\r
+#include "ui_resource_breath.h"\r
+#include "main/LoadImg.h"\r
+#include "breath/BreathView.h"\r
+#include "breath/BreathModel.h"\r
+#include "breath/BreathRhyPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_MAIN_BREATHEASE, BrearhView::BREATH_RHY_VIEW, BreathRhyPage, false);\r
+#define WND_BTHRHY_BTN_OK_ID "BTH_RHY_OK"\r
+#define WND_BTHRHY_TITLE_X 100\r
+#define WND_BTHRHY_TITLE_Y 38\r
+#define WND_BTHRHY_TITLE_W 253\r
+#define WND_BTHRHY_TITLE_H 53\r
+#define WND_BTHRHY_TITLE_FONT_SIZE 38\r
+#define WND_BTHRHY_PICKER_X 64\r
+#define WND_BTHRHY_PICKER_Y 109\r
+#define WND_BTHRHY_PICKER_W 321\r
+#define WND_BTHRHY_PICKER_H 218\r
+#define WND_BTHRHY_PICKER_B_FONT_SIZE 44\r
+#define WND_BTHRHY_PICKER_H_FONT_SIZE 44\r
+#define WND_BTHRHY_PICKER_ITEM_H 80\r
+#define WND_BTHRHY_OK_X 61\r
+#define WND_BTHRHY_OK_Y 362\r
+#define WND_BTHRHY_OK_W 331\r
+#define WND_BTHRHY_OK_H 98\r
+#define BREATH_GROUP_SIZE 466\r
+\r
+BreathRhyPage::BreathRhyPage() {}\r
+\r
+BreathRhyPage::~BreathRhyPage()\r
+{\r
+ group->RemoveAll();\r
+ if (lableRhythm != nullptr) {\r
+ delete lableRhythm;\r
+ lableRhythm = nullptr;\r
+ }\r
+ if (pickerRhythm != nullptr) {\r
+ delete pickerRhythm;\r
+ pickerRhythm = nullptr;\r
+ }\r
+ if (buttonOk != nullptr) {\r
+ delete buttonOk;\r
+ buttonOk = nullptr;\r
+ }\r
+ if (group != nullptr) {\r
+ delete group;\r
+ group = nullptr;\r
+ }\r
+ if (center != nullptr) {\r
+ delete center;\r
+ center = nullptr;\r
+ }\r
+}\r
+\r
+void BreathRhyPage::OnStart(void *data)\r
+{\r
+ if (group == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathRhyPage::OnStart new group ERROR");\r
+ group = new UIViewGroup();\r
+ }\r
+ group->SetPosition(0, 0);\r
+ group->Resize(BREATH_GROUP_SIZE, BREATH_GROUP_SIZE);\r
+ group->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ group->SetTouchable(false);\r
+ group->SetDraggable(false);\r
+\r
+ if (lableRhythm == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathRhyPage::OnStart new lableRhythm ERROR");\r
+ lableRhythm = new UILabel();\r
+ }\r
+ lableRhythm->SetPosition(WND_BTHRHY_TITLE_X, WND_BTHRHY_TITLE_Y);\r
+ lableRhythm->Resize(WND_BTHRHY_TITLE_W, WND_BTHRHY_TITLE_H);\r
+ lableRhythm->SetText("节奏设置");\r
+ lableRhythm->SetTextColor(Color::White());\r
+ lableRhythm->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ lableRhythm->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHRHY_TITLE_FONT_SIZE);\r
+ group->Add(lableRhythm);\r
+\r
+ if (pickerRhythm == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathRhyPage::OnStart new pickerRhythm ERROR");\r
+ pickerRhythm = new UIPicker();\r
+ }\r
+ pickerRhythm->SetPosition(WND_BTHRHY_PICKER_X, WND_BTHRHY_PICKER_Y);\r
+ pickerRhythm->Resize(WND_BTHRHY_PICKER_W, WND_BTHRHY_PICKER_H);\r
+ pickerRhythm->SetBackgroundFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHRHY_PICKER_B_FONT_SIZE);\r
+ pickerRhythm->SetHighlightFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHRHY_PICKER_H_FONT_SIZE);\r
+ pickerRhythm->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ pickerRhythm->SetItemHeight(WND_BTHRHY_PICKER_ITEM_H);\r
+ pickerRhythm->SetTextColor(Color::GetColorFromRGBA(0xfa, 0xf3, 0xf3, 0xff),\r
+ Color::GetColorFromRGBA(0xfa, 0xf3, 0xf3, 0xff));\r
+ uint8_t selectTempo = BreathModel::GetInstance().GetSelectTempo();\r
+ pickerRhythm->SetSelected(selectTempo);\r
+ pickerRhythm->RegisterSelectedListener(this);\r
+ pickerRhythm->SetVisible(true);\r
+ pickerRhythm->SetOnDragListener(this);\r
+ pickerRhythm->SetLoopState(false);\r
+ group->Add(pickerRhythm);\r
+\r
+ if (center == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathRhyPage::OnStart new Center ERROR");\r
+ center = new UIImageView();\r
+ }\r
+ center->SetPosition(WND_BTHRHY_PICKER_X, WND_BTHRHY_PICKER_Y);\r
+ center->Resize(WND_BTHRHY_PICKER_W, WND_BTHRHY_PICKER_H);\r
+ LOADIMG::LoadImageViewImg(center, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH013);\r
+ group->Add(center);\r
+\r
+ if (buttonOk == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathRhyPage::OnStart new buttonOk ERROR");\r
+ buttonOk = new UIButton();\r
+ }\r
+ buttonOk->SetPosition(WND_BTHRHY_OK_X, WND_BTHRHY_OK_Y);\r
+ buttonOk->Resize(WND_BTHRHY_OK_W, WND_BTHRHY_OK_H);\r
+ buttonOk->SetViewId(WND_BTHRHY_BTN_OK_ID);\r
+ buttonOk->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ LOADIMG::LoadBtnImage(buttonOk, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH005, IMAGE_CONVERTER_TOOL_BREATH005);\r
+ buttonOk->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ buttonOk->SetOnClickListener(this);\r
+ group->Add(buttonOk);\r
+\r
+ AddViewToPageContainer(group);\r
+}\r
+void BreathRhyPage::OnResume()\r
+{\r
+ pickerRhythm->SetValues(BreathModel::GetInstance().GetRhyListData(), BreathModel::GetInstance().GetRhyListSize());\r
+ GetSlicePageContainer()->SetIntercept(true);\r
+ GetSlicePageContainer()->SetOnDragListener(nullptr);\r
+}\r
+\r
+void BreathRhyPage::OnPause() {}\r
+\r
+void BreathRhyPage::OnStop() {}\r
+\r
+bool BreathRhyPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ if (strcmp(view.GetViewId(), WND_BTHRHY_BTN_OK_ID) == 0) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathRhyPage OnClick...ChangeTo DUR");\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_MAIN_VIEW, nullptr, TransitionType::TRANSITION_INVALID,\r
+ true);\r
+ BreathModel::GetInstance().SetTimeRhyation(pickerRhythm->GetSelected());\r
+ } else {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathRhyPage OnClick...ChangeTo unknow");\r
+ return false;\r
+ }\r
+ return true;\r
+}\r
+\r
+bool BreathRhyPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathRhyPage::OnDrag");\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathRhyPage::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_MAIN_VIEW, nullptr, TransitionType::TRANSITION_INVALID,\r
+ true);\r
+ }\r
+ return true;\r
+}\r
+} // namespace OHOS
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathStartPage\r
+ * Create: 2025-5-13\r
+ */\r
+#include <string>\r
+#include <sstream>\r
+#include <sys/time.h>\r
+#include "gfx_utils/graphic_math.h"\r
+#include "components/root_view.h"\r
+#include "UiConfig.h"\r
+#include "ohos_timer.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "NativeAbility.h"\r
+#include "TransitionType.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "ui_resource_breath.h"\r
+#include "main/LoadImg.h"\r
+#include "breath/BreathView.h"\r
+#include "breath/BreathModel.h"\r
+#include "breath/BreathStartPage.h"\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_MAIN_BREATHEASE, BrearhView::BREATH_START_VIEW, BreathStartPage, false);\r
+\r
+#define WND_BTHSTART_TITLE_X 97\r
+#define WND_BTHSTART_TITLE_Y 40\r
+#define WND_BTHSTART_TITLE_W 260\r
+#define WND_BTHSTART_TITLE_H 53\r
+#define WND_BTHSTART_TITLE_FONT_SIZE 36\r
+#define WND_BTHSTART_CENTERIMG_X 88\r
+#define WND_BTHSTART_CENTERIMG_Y 88\r
+#define WND_BTHSTART_CENTERIMG_W 279\r
+#define WND_BTHSTART_CENTERIMG_H 280\r
+#define WND_BTHSTART_GUIDE_X 126\r
+#define WND_BTHSTART_GUIDE_Y 354\r
+#define WND_BTHSTART_GUIDE_W 202\r
+#define WND_BTHSTART_GUIDE_H 68\r
+#define WND_BTHSTART_GUIDE_FONT_SIZE 24\r
+#define BREATH_GROUP_SIZE 466\r
+#define TEXT_OPACITY 147\r
+#define countDown 5\r
+#define SIZE 64\r
+\r
+BreathStartPage::BreathStartPage() {}\r
+\r
+BreathStartPage::~BreathStartPage()\r
+{\r
+ group->RemoveAll();\r
+ if (titleLable != nullptr) {\r
+ delete titleLable;\r
+ titleLable = nullptr;\r
+ }\r
+ if (guideLable != nullptr) {\r
+ delete guideLable;\r
+ guideLable = nullptr;\r
+ }\r
+ if (centerImge != nullptr) {\r
+ delete centerImge;\r
+ centerImge = nullptr;\r
+ }\r
+ if (group != nullptr) {\r
+ delete group;\r
+ group = nullptr;\r
+ }\r
+ if (background != nullptr) {\r
+ delete background;\r
+ background = nullptr;\r
+ }\r
+ if (animation != nullptr) {\r
+ delete animation;\r
+ animation = nullptr;\r
+ }\r
+ if (animatorCallBack != nullptr) {\r
+ delete animatorCallBack;\r
+ animatorCallBack = nullptr;\r
+ }\r
+}\r
+\r
+void BreathStartPage::OnStart(void *data)\r
+{\r
+ if (group == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathStartPage::OnStart new group ERROR");\r
+ group = new UIViewGroup();\r
+ }\r
+ group->SetPosition(0, 0);\r
+ group->Resize(BREATH_GROUP_SIZE, BREATH_GROUP_SIZE);\r
+ group->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ group->SetTouchable(true);\r
+ group->SetDraggable(true);\r
+ group->SetOnDragListener(this);\r
+\r
+ if (background == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathStartPage::OnStart new background ERROR");\r
+ background = new UIImageView();\r
+ }\r
+ background->SetPosition(0, 0);\r
+ background->Resize(BREATH_GROUP_SIZE, BREATH_GROUP_SIZE);\r
+ LOADIMG::LoadImageViewImg(background, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH001);\r
+ group->Add(background);\r
+\r
+ if (titleLable == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathStartPage::OnStart new titleLable ERROR");\r
+ titleLable = new UILabel();\r
+ }\r
+ titleLable->SetPosition(WND_BTHSTART_TITLE_X, WND_BTHSTART_TITLE_Y);\r
+ titleLable->Resize(WND_BTHSTART_TITLE_W, WND_BTHSTART_TITLE_H);\r
+ titleLable->SetText("请保持静止");\r
+ titleLable->SetTextColor(Color::White());\r
+ titleLable->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ titleLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHSTART_TITLE_FONT_SIZE);\r
+ group->Add(titleLable);\r
+\r
+ if (centerImge == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathStartPage::OnStart new centerImg ERROR");\r
+ centerImge = new UIImageView();\r
+ }\r
+ centerImge->SetPosition(WND_BTHSTART_CENTERIMG_X, WND_BTHSTART_CENTERIMG_Y);\r
+ centerImge->Resize(WND_BTHSTART_CENTERIMG_W, WND_BTHSTART_CENTERIMG_H);\r
+ LOADIMG::LoadImageViewImg(centerImge, BREATH_IMAGE, IMAGE_CONVERTER_TOOL_BREATH003);\r
+ group->Add(centerImge);\r
+\r
+ if (guideLable == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathStartPage::OnStart new guideLable ERROR");\r
+ guideLable = new UILabel();\r
+ }\r
+ guideLable->SetPosition(WND_BTHSTART_GUIDE_X, WND_BTHSTART_GUIDE_Y);\r
+ guideLable->Resize(WND_BTHSTART_GUIDE_W, WND_BTHSTART_GUIDE_H);\r
+ guideLable->SetTextColor(Color::White());\r
+ guideLable->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ guideLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WND_BTHSTART_GUIDE_FONT_SIZE);\r
+ guideLable->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ guideLable->SetStyle(STYLE_TEXT_OPA, TEXT_OPACITY);\r
+ group->Add(guideLable);\r
+\r
+ animatorCallBack = new BreathStartCallback(this);\r
+ if (animatorCallBack == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathStartPage::OnStart new animatorCallBack ERROR");\r
+ return;\r
+ }\r
+ animation = new Animator(animatorCallBack, nullptr, 0, true);\r
+ if (animation == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BreathStartPage::OnStart new animation ERROR");\r
+ return;\r
+ }\r
+ animation->Start();\r
+ AddViewToPageContainer(group);\r
+}\r
+\r
+void BreathStartPage::OnStop() {}\r
+\r
+void BreathStartPage::BreathStartCallback::Callback(UIView *view)\r
+{\r
+ UNUSED(view);\r
+ struct timeval current_time;\r
+ gettimeofday(¤t_time, nullptr);\r
+ int32_t overTime = countDown;\r
+ int32_t start_time = BreathModel::GetInstance().GetSaveTime();\r
+ int32_t remTime = overTime - (current_time.tv_sec - start_time);\r
+\r
+ char szText[SIZE] = "";\r
+ sprintf_s(szText, sizeof(szText), "%d秒后跟随训练指引开始吸气和呼气", remTime);\r
+ BreathStartPage->guideLable->SetText(szText);\r
+ if (remTime <= 0) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_EXER_VIEW, nullptr, TransitionType::TRANSITION_INVALID,\r
+ true);\r
+ BreathStartPage->animation->Stop();\r
+ struct timeval start_breathing_time;\r
+ gettimeofday(&start_breathing_time, nullptr);\r
+ uint32_t breathing_time = start_breathing_time.tv_sec;\r
+ BreathModel::GetInstance().SetBeginsTime(breathing_time);\r
+ }\r
+}\r
+\r
+void BreathStartPage::OnPause()\r
+{\r
+ animation->Stop();\r
+}\r
+\r
+bool BreathStartPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathStartPage::OnDrag");\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BreathStartPage::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+ NativeAbility::GetInstance().SwitchPageInSlice(BREATH_MAIN_VIEW, nullptr, TransitionType::TRANSITION_INVALID,\r
+ true);\r
+ }\r
+ return true;\r
+}\r
+\r
+void BreathStartPage::OnTimer() {}\r
+\r
+} // namespace OHOS
\ No newline at end of file
* Create: 2021-10-12\r
*/\r
\r
-#include "CallerItemView.h"\r
-#include "CallerLogPresenter.h"\r
+#include "callerlog/CallerItemView.h"\r
+#include "sys/time.h"\r
#include "wearable_log.h"\r
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\r
\r
namespace OHOS {\r
static constexpr int16 ICON_X = 100;\r
* Author:
* Create: 2021-10-12
*/
-#include "CallerLogModel.h"
-#include "CallerLogView.h"
-#include "DialingScreenView.h"
-#include "CallingView.h"
+#include "callerlog/CallerLogModel.h"
+#include "callerlog/CallerLogView.h"
+#include "makephone/DialingScreenView.h"
+#include "makephone/CallingView.h"
#include "ohos_timer.h"
#include "graphic_timer.h"
#include "samgr_lite.h"
-#include "MainCallingPresenter.h"
-#include "PlayersModel.h"
+#include "makephone/MainCallingPresenter.h"
+#include "player/PlayersModel.h"
#include "graphic_service.h"
#ifdef __cplusplus
* Create: 2021-10-12\r
*/\r
\r
-#include "CallerLogPresenter.h"\r
-#include "CallerLogView.h"\r
+#include "callerlog/CallerLogPresenter.h"\r
+#include "callerlog/CallerLogView.h"\r
#include "common/task_manager.h"\r
#include "wearable_log.h"\r
-#include "PhoneService.h"\r
+#include "phoneservice/PhoneService.h"\r
#include "NativeRegisterManager.h"\r
\r
namespace OHOS {\r
* Create: 2021-10-12\r
*/\r
\r
-#include "CallerLogView.h"\r
-#include "CallerLogPresenter.h"\r
-#include "CallerLogModel.h"\r
+#include "callerlog/CallerLogView.h"\r
+#include "callerlog/CallerLogPresenter.h"\r
+#include "callerlog/CallerLogModel.h"\r
#include "wearable_log.h"\r
\r
namespace OHOS {\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: CameraMainPage\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#include <string>\r
+#include "ui_test_group.h"\r
+#include "phoneservice/PhoneService.h"\r
+#include "uiservice/ui_service.h"\r
+#include "common/image_cache_manager.h"\r
+#include "main/LoadImg.h"\r
+#include "msg_center_device.h"\r
+#include "bts_spp.h"\r
+#include "ui_resource_camera.h"\r
+#include "camera/CameraView.h"\r
+#include "camera/CameraMainPage.h"\r
+#include "camera/CameraPresenter.h"\r
+\r
+namespace OHOS {\r
+static CameraMainPage *g_pCameraMainPage = nullptr;\r
+\r
+static constexpr uint16_t BLUETOOTH_XPOS = 158;\r
+static constexpr uint16_t BLUETOOTH_XPOY = 154;\r
+static constexpr uint16_t TITLE_XPOS = 15;\r
+static constexpr uint16_t TITLE_XPOY = 329;\r
+static constexpr uint16_t TITLE_WIDTH = 424;\r
+static constexpr uint16_t TITLE_HIGHT = 50;\r
+static constexpr uint16_t TITLE_FONT_SIZE = 36;\r
+static constexpr uint16_t CAMERATITLE_FONT_SIZE = 38;\r
+static constexpr uint16_t CAMERATITLE_XPOS = 97;\r
+static constexpr uint16_t CAMERATITLE_XPOY = 37;\r
+static constexpr uint16_t CAMERATITLE_WIDTH = 260;\r
+static constexpr uint16_t CAMERATITLE_HIGHT = 53;\r
+static constexpr uint16_t CAMERAFIND_XPOS = 123;\r
+static constexpr uint16_t CAMERAFIND_XPOY = 200;\r
+static constexpr uint16_t CAMERAFIND_WIDTH = 250;\r
+static constexpr uint16_t CAMERAFIND_HIGHT = 42;\r
+static constexpr uint16_t CAMERATIME_XPOS = 200;\r
+static constexpr uint16_t BUTTON_WIDTH = 171;\r
+static constexpr uint16_t BUTTON_HIGHT = 171;\r
+static constexpr uint16_t COUNTDOWN_TIME = 5;\r
+static constexpr uint16_t CAMERA_SIZE = 466;\r
+static constexpr uint16_t CAMERA_BUTTON_POSITION_X = 144;\r
+static constexpr uint16_t CAMERA_BUTTON_POSITION_Y = 154;\r
+static constexpr uint16_t TIME_FONT_SIZE = 50;\r
+static constexpr uint16_t CAMERATIME_HIGHT = 55;\r
+static constexpr uint16_t ERROR_NUM = 2;\r
+\r
+REGIST_SLICE_PAGE(VIEW_CAMERA, CAMERA_PAGES::CAMERA_MAIN_PAGE, CameraMainPage, true);\r
+\r
+CameraMainPage::CameraMainPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CameraMainPage::CameraMainPage");\r
+ ImageCacheManager::GetInstance().LoadAllInMultiRes(CAMERA_IMAGE);\r
+ g_pCameraMainPage = this;\r
+}\r
+\r
+CameraMainPage::~CameraMainPage()\r
+{\r
+ g_pCameraMainPage = nullptr;\r
+ if (container_ != nullptr) {\r
+ container_->RemoveAll();\r
+ delete container_;\r
+ container_ = nullptr;\r
+ }\r
+\r
+ if (title != nullptr) {\r
+ delete title;\r
+ title = nullptr;\r
+ }\r
+\r
+ if (bluetoothDisconnected != nullptr) {\r
+ delete bluetoothDisconnected;\r
+ bluetoothDisconnected = nullptr;\r
+ }\r
+\r
+ if (cameraFind != nullptr) {\r
+ delete cameraFind;\r
+ cameraFind = nullptr;\r
+ }\r
+\r
+ if (cameraTitle != nullptr) {\r
+ delete cameraTitle;\r
+ cameraTitle = nullptr;\r
+ }\r
+\r
+ if (cameraTime != nullptr) {\r
+ delete cameraTime;\r
+ cameraTime = nullptr;\r
+ }\r
+\r
+ if (button != nullptr) {\r
+ delete button;\r
+ button = nullptr;\r
+ }\r
+\r
+ if (animator_ != nullptr) {\r
+ delete animator_;\r
+ animator_ = nullptr;\r
+ }\r
+\r
+ if (callBack_ != nullptr) {\r
+ delete callBack_;\r
+ callBack_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(CAMERA_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CameraMainPage::~CameraMainPage");\r
+}\r
+\r
+CameraMainPage *CameraMainPage::GetInstance()\r
+{\r
+ return g_pCameraMainPage;\r
+}\r
+\r
+void CameraMainPage::OnStart(void *data)\r
+{\r
+ if (container_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CameraMainPage::new container fail");\r
+ container_ = new UIScrollView();\r
+ container_->SetPosition(0, 0, CAMERA_SIZE, CAMERA_SIZE);\r
+ container_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+ }\r
+ container_->SetTouchable(true);\r
+ container_->SetDraggable(true);\r
+ container_->SetOnDragListener(this);\r
+\r
+ bluetoothDisconnected = new UIImageView();\r
+ if (bluetoothDisconnected == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothDisconnected is nullptr");\r
+ return;\r
+ }\r
+ LOADIMG::LoadImageViewImg(bluetoothDisconnected, CAMERA_IMAGE, IMAGE_CONVERTER_TOOL_CAMERA_2);\r
+ bluetoothDisconnected->SetPosition(BLUETOOTH_XPOS, BLUETOOTH_XPOY);\r
+ bluetoothDisconnected->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ bluetoothDisconnected->SetVisible(false);\r
+ container_->Add(bluetoothDisconnected);\r
+\r
+ title = new UILabel();\r
+ if (title == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "title is nullptr");\r
+ return;\r
+ }\r
+ title->SetText("蓝牙已断开");\r
+ title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TITLE_FONT_SIZE);\r
+ title->SetPosition(TITLE_XPOS, TITLE_XPOY, TITLE_WIDTH, TITLE_HIGHT);\r
+ title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ title->SetVisible(false);\r
+ container_->Add(title);\r
+\r
+ cameraTitle = new UILabel();\r
+ if (cameraTitle == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cameraTitle is nullptr");\r
+ return;\r
+ }\r
+ cameraTitle->SetText("相机");\r
+ cameraTitle->SetFont(DEFAULT_VECTOR_FONT_FILENAME, CAMERATITLE_FONT_SIZE);\r
+ cameraTitle->SetPosition(CAMERATITLE_XPOS, CAMERATITLE_XPOY, CAMERATITLE_WIDTH, CAMERATITLE_HIGHT);\r
+ cameraTitle->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ cameraTitle->SetVisible(false);\r
+ container_->Add(cameraTitle);\r
+\r
+ cameraFind = new UILabel();\r
+ if (cameraFind == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cameraFind is nullptr");\r
+ return;\r
+ }\r
+ cameraFind->SetText("正在连接手机...");\r
+ cameraFind->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TITLE_FONT_SIZE);\r
+ cameraFind->SetPosition(CAMERAFIND_XPOS, CAMERAFIND_XPOY, CAMERAFIND_WIDTH, CAMERAFIND_HIGHT);\r
+ cameraFind->SetVisible(false);\r
+ container_->Add(cameraFind);\r
+\r
+ cameraTime = new UILabel();\r
+ if (cameraTime == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cameraTime is nullptr");\r
+ return;\r
+ }\r
+ cameraTime->SetText("5s");\r
+ cameraTime->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TIME_FONT_SIZE);\r
+ cameraTime->SetPosition(CAMERATIME_XPOS, CAMERAFIND_XPOY, CAMERAFIND_WIDTH, CAMERATIME_HIGHT);\r
+ cameraTime->SetVisible(false);\r
+ container_->Add(cameraTime);\r
+ SetUpButton();\r
+ callBack_ = new CameraAnimatorCallback(this);\r
+ animator_ = new Animator(callBack_, nullptr, 0, true);\r
+\r
+ AddViewToPageContainer(container_);\r
+ InitCameraView();\r
+}\r
+\r
+uint8_t CameraMainPage::GetConnectStatus()\r
+{\r
+ uint8_t conn_status = 0;\r
+\r
+#ifdef _WIN32\r
+ conn_status = 1;\r
+#else\r
+ if (msg_center_get_trans_channel() == DIAG_FRAME_FID_PHONE) {\r
+ conn_status = is_spp_connected(0) == true ? 1 : 0;\r
+ } else if (msg_center_get_trans_channel() == DIAG_FRAME_FID_BT) {\r
+ conn_status = msg_center_get_ble_conn_state();\r
+ }\r
+#endif\r
+ return conn_status;\r
+}\r
+\r
+void CameraMainPage::InitCameraView()\r
+{\r
+ if (GetConnectStatus() == 1) {\r
+ cameraTitle->SetVisible(true);\r
+ cameraFind->SetVisible(true);\r
+ title->SetVisible(false);\r
+ bluetoothDisconnected->SetVisible(false);\r
+ cameraTime->SetVisible(false);\r
+ button->SetVisible(false);\r
+ button->SetTouchable(false);\r
+ container_->Invalidate();\r
+ uint8_t value = 1;\r
+ errcode_t ret;\r
+#ifdef _WIN32\r
+ ret = 0;\r
+#else\r
+ ret = msg_center_send_data(MSGCENTER_CMD_DEVICE,\r
+ MSGCENTER_TYPE_ID_CAMERA_CONNECT_PHONE, &value, sizeof(value));\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MSGCENTER_TYPE_ID_CAMERA_CONNECT_PHONE ret = %d", ret);\r
+#endif\r
+ } else {\r
+ title->SetVisible(true);\r
+ bluetoothDisconnected->SetVisible(true);\r
+ cameraTitle->SetVisible(false);\r
+ cameraFind->SetVisible(false);\r
+ cameraTime->SetVisible(false);\r
+ button->SetVisible(false);\r
+ button->SetTouchable(false);\r
+ container_->Invalidate();\r
+ }\r
+}\r
+\r
+void CameraMainPage::Refresh_page()\r
+{\r
+ cameraTitle->SetVisible(true);\r
+ button->SetVisible(true);\r
+ button->SetTouchable(true);\r
+ cameraFind->SetVisible(false);\r
+ title->SetVisible(false);\r
+ bluetoothDisconnected->SetVisible(false);\r
+ cameraTime->SetVisible(false);\r
+ container_->Invalidate();\r
+}\r
+\r
+void CameraMainPage::SetUpButton()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CameraMainPage::SetupButton new Label");\r
+ if (button == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "button is nullptr");\r
+ button = new UILabelButton();\r
+ }\r
+\r
+ button->SetPosition(CAMERA_BUTTON_POSITION_X, CAMERA_BUTTON_POSITION_Y);\r
+ button->Resize(BUTTON_WIDTH, BUTTON_HIGHT);\r
+ button->SetViewId("button1");\r
+ button->SetOnClickListener(this);\r
+ button->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ button->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ button->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::RELEASED);\r
+ button->SetVisible(false);\r
+ button->SetTouchable(false);\r
+ LOADIMG::LoadBtnImage(button, CAMERA_IMAGE, IMAGE_CONVERTER_TOOL_CAMERA_1, IMAGE_CONVERTER_TOOL_CAMERA_1);\r
+ container_->Add(button);\r
+}\r
+\r
+void CameraMainPage::OnPause()\r
+{\r
+ animator_->Stop();\r
+}\r
+\r
+bool CameraMainPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UNUSED(event);\r
+ if (view.GetViewId() == "button1") {\r
+ if (GetConnectStatus() == 1) {\r
+ button->SetVisible(false);\r
+ cameraTime->SetVisible(true);\r
+ SetFirstFlag(true);\r
+ animator_->Start();\r
+ } else {\r
+ title->SetVisible(true);\r
+ bluetoothDisconnected->SetVisible(true);\r
+ cameraTitle->SetVisible(false);\r
+ cameraFind->SetVisible(false);\r
+ cameraTime->SetVisible(false);\r
+ button->SetVisible(false);\r
+ button->SetTouchable(false);\r
+ container_->Invalidate();\r
+ }\r
+ }\r
+ return true;\r
+}\r
+\r
+bool CameraMainPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CameraPresenter::OnDrag");\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CameraOnDragListener::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+ uint8_t value = 1;\r
+ errcode_t ret;\r
+#ifdef _WIN32\r
+ ret = 0;\r
+#else\r
+ ret = msg_center_send_data(MSGCENTER_CMD_DEVICE,\r
+ MSGCENTER_TYPE_ID_CAMERA_PHONE_EXIT, &value, sizeof(value));\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MSGCENTER_TYPE_ID_CAMERA_PHONE_EXIT ret = %d", ret);\r
+#endif\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+ }\r
+ return true;\r
+}\r
+\r
+void CameraMainPage::CameraAnimatorCallback::Callback(UIView *view)\r
+{\r
+ (void)view;\r
+ static int count = 0;\r
+ static struct timeval start_time;\r
+ struct timeval current_time;\r
+ if (page_->GetFirstFlag()) {\r
+ gettimeofday(&start_time, nullptr);\r
+ page_->SetFirstFlag(false);\r
+ }\r
+ gettimeofday(¤t_time, nullptr);\r
+ int time = current_time.tv_sec - start_time.tv_sec;\r
+ std::string strTime1 = std::to_string(COUNTDOWN_TIME - time) + "s";\r
+ page_->SetCameraTime(time);\r
+ if (time == COUNTDOWN_TIME) {\r
+ page_->StopAnimator();\r
+ }\r
+}\r
+\r
+void CameraMainPage::StopAnimator()\r
+{\r
+ animator_->Stop();\r
+ button->SetVisible(true);\r
+ cameraTime->SetVisible(false);\r
+ cameraTime->SetText("5s");\r
+ SetFirstFlag(false);\r
+ uint8_t value = 1;\r
+ errcode_t ret;\r
+#ifdef _WIN32\r
+ ret = 0;\r
+#else\r
+ ret = msg_center_send_data(MSGCENTER_CMD_DEVICE,\r
+ MSGCENTER_TYPE_ID_ON_CAMERA, &value, sizeof(value));\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MSGCENTER_TYPE_ID_ON_CAMERA ret = %d", ret);\r
+#endif\r
+}\r
+\r
+void CameraMainPage::SetCameraTime(int time)\r
+{\r
+ int progressTime = COUNTDOWN_TIME - time;\r
+ int progressValue = 0;\r
+ std::string strTime = std::to_string(COUNTDOWN_TIME - time) + "s";\r
+ cameraTime->SetText(strTime.c_str());\r
+}\r
+\r
+bool CameraMainPage::GetFirstFlag()\r
+{\r
+ return isFirst;\r
+}\r
+\r
+void CameraMainPage::SetFirstFlag(bool value)\r
+{\r
+ isFirst = value;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: CameraModel\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#include <sys/time.h>\r
+#include "ohos_timer.h"\r
+#include "wearable_log.h"\r
+#include "camera/CameraModel.h"\r
+#include "camera/CameraView.h"\r
+\r
+namespace OHOS {\r
+\r
+CameraModel::CameraModel() {}\r
+\r
+CameraModel::~CameraModel() {}\r
+\r
+CameraModel &CameraModel::GetInstance()\r
+{\r
+ static CameraModel instance;\r
+ return instance;\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: CameraPresenter\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#include "uiservice/ui_service.h"\r
+#include "NativeRegisterManager.h"\r
+#include "camera/CameraView.h"\r
+#include "camera/CameraModel.h"\r
+#include "camera/CameraPresenter.h"\r
+\r
+namespace OHOS {\r
+REGIST_MENU(VIEW_CAMERA, CameraView, CameraPresenter, CAMERA_MAIN_ICON, PNG_APPLIST_SETTING_IMAGE, "相机");\r
+}\r
* Create: 2024-10-30
*/
-#include "AmbientClockView.h"
-#include "MainPresenterSample.h"
+#include "clock/AmbientClockView.h"
+#include "main/MainPresenterSample.h"
#include "components/ui_label.h"
#include "wearable_log.h"
#include "ui_resource_image.h"
#include "common/image_cache_manager.h"
+#include "UICardPageFactory.h"
namespace OHOS {
+
+REGIST_WATCH_DIAL(DIAL_DISPLAY_MODE_AOD, DIAL_CLOCK, AmbientClockView);
+
static constexpr uint16_t POINT_POSITION_X = 202;
static constexpr uint16_t POINT_POSITION_Y = 16;
static constexpr uint16_t SECOND_POINT_POSITION_Y = 16;
* Create: 2021-08-14
*/
-#include "MainClockView.h"
-#include "MainPresenterSample.h"
+#include "clock/MainClockView.h"
+#include "main/MainPresenterSample.h"
#include "components/ui_label.h"
#include "wearable_log.h"
#include "ui_resource_image.h"
#include "common/image_cache_manager.h"
+#include "UICardPageFactory.h"
#include <ctime>
namespace OHOS {
+
+REGIST_WATCH_DIAL(DIAL_DISPLAY_MODE_MAIN, DIAL_CLOCK, MainClockView);
+
static MainClockView *g_pMainClockView = nullptr;
static constexpr uint16_t FONT_DEFAULT_SIZE = 25;
+++ /dev/null
-/*\r
- * Copyright (c) CompanyNameMagicTag 2022-2022. All rights reserved.\r
- * Description: CompassCalibrationView.h\r
- * Author:\r
- * Create: 2022-04-02\r
- */\r
-\r
-#ifndef COMPASS_CALIBRATION_VIEW_H\r
-#define COMPASS_CALIBRATION_VIEW_H\r
-\r
-#include "components/ui_label.h"\r
-#include "View.h"\r
-#include "ohos_types.h"\r
-#include "AppGroupView.h"\r
-#include "components/ui_image_view.h"\r
-\r
-namespace OHOS {\r
-class CompassCalibrationView : public AppGroupView {\r
-public:\r
- CompassCalibrationView();\r
- ~CompassCalibrationView() override;\r
-\r
- bool CreateUIViewGroup(void);\r
- static CompassCalibrationView *GetInstance(void);\r
- bool InitView(void *caller) override;\r
-private:\r
- UILabel *labelOne{nullptr};\r
- UILabel *labelTwo{nullptr};\r
- UIImageView *imageView{nullptr};\r
-\r
- void ClearAll(void);\r
-};\r
-}\r
-#endif
\ No newline at end of file
+++ /dev/null
-/*\r
- * Copyright (c) CompanyNameMagicTag 2022-2022. All rights reserved.\r
- * Description: CompassControlView.h\r
- * Author:\r
- * Create: 2022-04-02\r
- */\r
-\r
-#ifndef COMPASS_CONTROL_VIEW_H\r
-#define COMPASS_CONTROL_VIEW_H\r
-\r
-#include "components/root_view.h"\r
-#include "UiConfig.h"\r
-#include "components/ui_card_page.h"\r
-#include "CompassCalibrationView.h"\r
-#include "CompassView.h"\r
-\r
-namespace OHOS {\r
-\r
-class CompassControlView : public UICardPage {\r
-public:\r
- CompassControlView();\r
- ~CompassControlView() override;\r
- bool InitView(void);\r
- void PreLoad(void) override;\r
- void UnLoad(void) override;\r
- void SetCalibrationView(bool flag);\r
-private:\r
- CompassCalibrationView *compassCalibrationView{nullptr};\r
- CompassView *compassView{nullptr};\r
- bool viewiInitStatus{false};\r
- bool isCalibration{false};\r
-\r
- void ClearAll(void);\r
-};\r
-}\r
-#endif\r
+++ /dev/null
-/*\r
- * Copyright (c) CompanyNameMagicTag 2022-2022. All rights reserved.\r
- * Description: CompassModel.h\r
- * Author:\r
- * Create: 2022-04-02\r
- */\r
-\r
-#ifndef COMPASS_MODEL_H\r
-#define COMPASS_MODEL_H\r
-\r
-#include <cstdint>\r
-\r
-namespace OHOS {\r
-class CompassModel {\r
-public:\r
- static CompassModel *GetInstance(void);\r
- bool OpenCompassSensor(void);\r
- bool CloseCompassSensor(void);\r
- void SetCalibrationStatus(uint8_t status);\r
- uint8_t GetCalibrationStatus(void);\r
- void SetDisplayAngle(uint16_t angle);\r
- uint16_t GetDisplayAngle(void);\r
-#if defined(_WIN32)\r
-#undef GetCurrentTime\r
-#endif\r
- time_t GetCurrentTime(void);\r
- void SetLastTime(time_t value);\r
- time_t GetLastTime(void);\r
-\r
-private:\r
- uint8_t calibrationStatus{1};\r
- uint16_t displayAngle{0};\r
- time_t lastTime{0};\r
-};\r
-}\r
-\r
-#endif\r
-\r
+++ /dev/null
-/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: CompassPresenter.h\r
- * Author:\r
- * Create: 2021-12-21\r
- */\r
-#ifndef COMPASS_PRESENTER_H\r
-#define COMPASS_PRESENTER_H\r
-\r
-#include "Presenter.h"\r
-#include "components/ui_view.h"\r
-#include "components/ui_image_view.h"\r
-#include "ohos_types.h"\r
-#include "UiConfig.h"\r
-#include "AppViewIDs.h"\r
-#include "CompassView.h"\r
-\r
-namespace OHOS {\r
-typedef struct {\r
- uint16_t beginAngle;\r
- uint16_t endAngle;\r
- const char *dir;\r
-} CompassItem;\r
-\r
-class CompassView;\r
-class CompassPresenter {\r
-public:\r
- CompassPresenter();\r
- virtual ~CompassPresenter();\r
-\r
- static CompassPresenter *GetInstance(void);\r
- void DisplayAngleDir(uint16_t angle);\r
- void DetermineToRotate(void);\r
- void InScopeRotate(void);\r
- void TimeCreateRandomNum(void);\r
- void DisplayAngleRight(uint16_t angle);\r
-\r
-private:\r
- int16_t lastRotateAngle{0};\r
- int16_t currentRotateAngle{0};\r
- int16_t angleDiff{0};\r
- bool getAngleStatus{false};\r
- bool initDisplayStatus{true};\r
-};\r
-}\r
-#endif
\ No newline at end of file
+++ /dev/null
-/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: CompassView.h\r
- * Author:\r
- * Create: 2021-12-21\r
- */\r
-\r
-#ifndef COMPASS_VIEW_H\r
-#define COMPASS_VIEW_H\r
-\r
-#include "View.h"\r
-#include "components/root_view.h"\r
-#include "components/ui_label.h"\r
-#include "components/ui_image_view.h"\r
-#include "ChangeSliceListener.h"\r
-#include "UiConfig.h"\r
-#include "AppGroupView.h"\r
-#include "CompassCalibrationView.h"\r
-\r
-namespace OHOS {\r
-static constexpr float VIEW_CENTERS = 227;\r
-\r
-class CompassView : public AppGroupView {\r
-public:\r
- CompassView();\r
- ~CompassView() override;\r
-\r
- void DirectionSetText(const char *text, const char *angle);\r
- static CompassView *GetInstance(void);\r
- void CompassStartRotate(int16_t numb);\r
- bool InitPage(void);\r
- bool InitView(void *caller) override;\r
- bool GetInitViewState(void);\r
- bool InitCompassImage(void);\r
-\r
-private:\r
- bool LoadCompassImage(UIImageView *view, uint32_t resId);\r
- void ClearAll(void);\r
- UILabel *directionLabel{nullptr};\r
- UILabel *angledLabel{nullptr};\r
- UIImageView *backGround{nullptr};\r
- UIImageView *rotateShaft{nullptr};\r
- UIImageView *triangulation{nullptr};\r
- const Vector2<float> VIEW_CENTER = {VIEW_CENTERS, VIEW_CENTERS};\r
-};\r
-}\r
-#endif
\ No newline at end of file
+++ /dev/null
-/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: MainCompassPresenter.h\r
- * Author:\r
- * Create: 2021-12-21\r
- */\r
-#ifndef COMPASS_MAINPRESENTER_H\r
-#define COMPASS_MAINPRESENTER_H\r
-\r
-#include "Presenter.h"\r
-#include "ModelListenerSample.h"\r
-#include "ohos_types.h"\r
-#include "UiConfig.h"\r
-#include "AppViewIDs.h"\r
-#include "MainCompassView.h"\r
-#include "CompassPresenter.h"\r
-#include "CompassModel.h"\r
-#include "CompassCalibrationView.h"\r
-\r
-namespace OHOS {\r
-class MainCompassPresenter : public Presenter<MainCompassView>, public CompassPresenter,\r
- public ModelListenerSample, public UIView::OnDragListener {\r
-public:\r
- MainCompassPresenter();\r
- ~MainCompassPresenter() override;\r
-\r
- static MainCompassPresenter *GetInstance(void);\r
- bool OnDrag(UIView& view, const DragEvent& event) override;\r
- void Notify() override;\r
-};\r
-}\r
-#endif
\ No newline at end of file
+++ /dev/null
-/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: MainCompassView\r
- * Author:\r
- * Create: 2021-12-23\r
- */\r
-\r
-#ifndef MAIN_COMPASS_VIEW_H\r
-#define MAIN_COMPASS_VIEW_H\r
-\r
-#include <string>\r
-#include "View.h"\r
-#include "components/ui_label.h"\r
-#include "components/root_view.h"\r
-#include "components/ui_view_group.h"\r
-#include "components/ui_image_view.h"\r
-#include "components/ui_label_button.h"\r
-#include "ChangeSliceListener.h"\r
-#include "graphic_config.h"\r
-#include "CompassView.h"\r
-#include "CompassModel.h"\r
-#include "CompassCalibrationView.h"\r
-\r
-namespace OHOS {\r
-class MainCompassPresenter;\r
-class CompassView;\r
-class MainCompassView : public View<MainCompassPresenter> {\r
-public:\r
- MainCompassView();\r
- ~MainCompassView() override;\r
-\r
- void OnStart() override;\r
- void OnStop() override;\r
-\r
- static MainCompassView *GetInstance(void);\r
- void SetDisplayTure(void);\r
- void SetDisplayFalse(void);\r
-\r
-private:\r
- CompassView *compassView{nullptr};\r
- CompassCalibrationView *compassCalibrationView{nullptr};\r
-};\r
-} // namespace OHOS\r
-#endif
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright (c) CompanyNameMagicTag 2022-2022. All rights reserved.
- * Description: CompassCalibrationView.cpp
- * Author:
- * Create: 2022-04-02
- */
-#include "UiConfig.h"
-#include "wearable_log.h"
-#include "CompassCalibrationView.h"
-#include "CompassModel.h"
-
-namespace OHOS {
-// 标签设置
-static constexpr uint16_t LABEL_POSITION_X = 118;
-static constexpr uint16_t LABEL_POSITION_Y = 80;
-static constexpr uint16_t LABEL_POSITION_WIDTH = 200;
-static constexpr uint16_t LABEL_POSITION_HEIGHT = 50;
-
-static constexpr uint16_t LABEL_POSITION_X1 = 28;
-static constexpr uint16_t LABEL_POSITION_Y1 = 130;
-static constexpr uint16_t LABEL_POSITION_WIDTH1 = 400;
-static constexpr uint16_t LABEL_POSITION_HEIGHT1 = 50;
-static constexpr uint16_t FONT_DEFAULT_SIZE = 35;
-
-static CompassCalibrationView *g_pMainView = nullptr;
-CompassCalibrationView::CompassCalibrationView()
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CompassCalibrationView::CompassCalibrationView");
- SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
- g_pMainView = this;
-}
-
-CompassCalibrationView::~CompassCalibrationView()
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CompassCalibrationView::~CompassCalibrationView");
- ClearAll();
- g_pMainView = nullptr;
-}
-
-void CompassCalibrationView::ClearAll(void)
-{
- RemoveAll();
- if (labelOne != nullptr) {
- delete labelOne;
- labelOne = nullptr;
- }
- if (imageView != nullptr) {
- delete imageView;
- imageView = nullptr;
- }
- if (labelTwo != nullptr) {
- delete labelTwo;
- labelTwo = nullptr;
- }
-}
-
-CompassCalibrationView *CompassCalibrationView::GetInstance(void)
-{
- return g_pMainView;
-}
-
-bool CompassCalibrationView::CreateUIViewGroup(void)
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CompassCalibrationView::CreateUIViewGroup");
- imageView = new UIImageView();
- if (imageView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CompassCalibrationView::new UIImageView fail");
- return false;
- }
- imageView->SetPosition(0, 0);
- imageView->SetSrc(COMPASS_CALIBRATE_IMAGE);
-
- labelOne = new UILabel();
- if (labelOne == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CompassCalibrationView::new labelOne fail");
- ClearAll();
- return false;
- }
-
- labelOne->SetPosition(LABEL_POSITION_X, LABEL_POSITION_Y, LABEL_POSITION_WIDTH, LABEL_POSITION_HEIGHT);
- labelOne->SetText("请按图示");
- labelOne->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);
- labelOne->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
- labelOne->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);
- labelOne->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
- labelOne->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
-
- labelTwo = new UILabel();
- if (labelTwo == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CompassCalibrationView::new labelTwo fail");
- ClearAll();
- return false;
- }
-
- labelTwo->SetPosition(LABEL_POSITION_X1, LABEL_POSITION_Y1, LABEL_POSITION_WIDTH1, LABEL_POSITION_HEIGHT1);
- labelTwo->SetText("旋转手表进行校准");
- labelTwo->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);
- labelTwo->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
- labelTwo->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);
- labelTwo->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
- labelTwo->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
-
- Add(imageView);
- Add(labelOne);
- Add(labelTwo);
- SetDraggable(false);
- SetTouchable(false);
- initViewStatus = true;
- return true;
-}
-
-bool CompassCalibrationView::InitView(void *caller)
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CompassCalibrationView InitView %p", caller);
- bool ret = CreateUIViewGroup();
- if (!ret) {
- return false;
- }
- SetDraggable(true);
- SetTouchable(true);
- return true;
-}
-
-}
* Author:
* Create: 2022-04-02
*/
-#include "CompassControlView.h"
-#include "CompassModel.h"
+#include "compass/CompassControlView.h"
+#include "wearable_log.h"
namespace OHOS {
CompassControlView::CompassControlView()
{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CompassControlView::CompassControlView()");
SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
}
-CompassControlView::~CompassControlView()
+void CompassControlView::PreLoad(void)
{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CompassControlView::~CompassControlView()");
- if (viewiInitStatus) {
- ClearAll();
+ if (compassFragment_ == nullptr) {
+ compassFragment_ = new CompassFragment();
+ if (compassFragment_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CompassView::new compassFragment_ fail");
+ return;
+ }
}
+
+ compassFragment_->CreateView();
+ Add(compassFragment_->GetFragmentView());
}
-void CompassControlView::ClearAll(void)
+void CompassControlView::UnLoad(void)
{
- RemoveAll();
- if (compassCalibrationView != nullptr) {
- delete compassCalibrationView;
- compassCalibrationView = nullptr;
- }
- if (compassView != nullptr) {
- delete compassView;
- compassView = nullptr;
+ if (compassFragment_ != nullptr) {
+ compassFragment_->DestroyView();
+ Remove(compassFragment_->GetFragmentView());
+ delete compassFragment_;
+ compassFragment_ = nullptr;
}
}
-bool CompassControlView::InitView(void)
+void CompassControlView::OnPause(void)
{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CompassControlView InitView");
- compassCalibrationView = new CompassCalibrationView();
- if (compassCalibrationView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CompassCalibrationView::new compassCalibrationView fail");
- return false;
- }
- if (!compassCalibrationView->CreateUIViewGroup()) {
- return false;
- }
-
- compassView = new CompassView();
- if (compassView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CompassView::new compassView fail");
- return false;
+ if (compassFragment_ != nullptr) {
+ compassFragment_->PauseView();
}
- if (!compassView->InitPage()) {
- return false;
- }
- Add(compassView);
- Add(compassCalibrationView);
- uint8_t status = CompassModel::GetInstance()->GetCalibrationStatus();
- if (status == 1) {
- compassView->SetVisible(false);
- compassCalibrationView->SetVisible(true);
- } else {
- compassView->SetVisible(true);
- compassCalibrationView->SetVisible(false);
- }
- return true;
}
-void CompassControlView::SetCalibrationView(bool flag)
+void CompassControlView::OnActive(void)
{
- if (flag == isCalibration) {
- return;
- }
-
- if (flag) {
- compassCalibrationView->SetVisible(true);
- compassView->SetVisible(false);
- } else {
- compassCalibrationView->SetVisible(false);
- compassView->SetVisible(true);
+ if (compassFragment_ != nullptr) {
+ compassFragment_->ResumeView();
}
}
-void CompassControlView::PreLoad(void)
+void CompassControlView::ScrollBegin(bool isActive)
{
- if (!viewiInitStatus) {
- InitView();
- viewiInitStatus = true;
+ if (isActive && (compassFragment_ != nullptr)) {
+ compassFragment_->PauseView();
}
}
-void CompassControlView::UnLoad(void)
+void CompassControlView::ScrollEnd(bool isActive)
{
- // Compass's usage scenes is complicated, so we do not release it's resources inner slice.
+ if (isActive && (compassFragment_ != nullptr)) {
+ compassFragment_->ResumeView();
+ }
}
}
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: CompassFragment.cpp
+ * Author:
+ * Create: 2021-12-21
+ */
+#include "compass/CompassFragment.h"
+
+#include <string>
+#include "UiConfig.h"
+#include "common/image_cache_manager.h"
+#include "ui_resource_image.h"
+#include "compass/CompassModel.h"
+#include "wearable_log.h"
+
+namespace OHOS {
+static constexpr float VIEW_CENTERS = 227;
+static constexpr int16_t POINT_CENTER_IMAGE_X = 150;
+static constexpr int16_t POINT_CENTER_IMAGE_Y = 150;
+static constexpr int16_t trianImg__X = 210;
+static constexpr int16_t trianImg__Y = 0;
+static constexpr int16_t directionLabel__X = 160;
+static constexpr int16_t directionLabel__Y = 215;
+static constexpr int16_t FONT_TEXT_SIZE = 25;
+static constexpr int16_t angleLabel__X = 215;
+static constexpr int16_t angleLabel__Y = 215;
+static constexpr int16_t TEXT_WIDTH = 90;
+static constexpr int16_t TEXT_HEIGHT = 35;
+static constexpr int16_t RANDOM_NUMBER_720 = 720;
+static constexpr int16_t RANDOM_NUMBER_360 = 360;
+static constexpr int16_t DELAYING_NUMS = 2000;
+static constexpr int16_t RIGHT_NORTH_DOWN_23 = 23;
+static constexpr int16_t RIGHT_EASTNORTH_UP_68 = 68;
+static constexpr int16_t RIGHT_WESTNORTH_UP_338 = 338;
+static constexpr int16_t RIGHT_SOUTH_UP_203 = 203;
+static constexpr int16_t RIGHT_EASTSOUTH_UP_158 = 158;
+static constexpr int16_t RIGHT_WESTSOUTH_UP_248 = 248;
+static constexpr int16_t RIGHT_WEST_UP_293 = 293;
+static constexpr int16_t RIGHT_EAST_UP_113 = 113;
+static constexpr int16_t DIRECTION_COUNT = 7;
+
+typedef struct {
+ uint16_t beginAngle;
+ uint16_t endAngle;
+ const char *dir;
+} CompassItem;
+
+const CompassItem g_compassList[] = {
+ {RIGHT_NORTH_DOWN_23, RIGHT_EASTNORTH_UP_68, "东北"},
+ {RIGHT_EASTNORTH_UP_68, RIGHT_EAST_UP_113, "东"},
+ {RIGHT_EAST_UP_113, RIGHT_EASTSOUTH_UP_158, "东南"},
+ {RIGHT_EASTSOUTH_UP_158, RIGHT_SOUTH_UP_203, "南"},
+ {RIGHT_SOUTH_UP_203, RIGHT_WESTSOUTH_UP_248, "西南"},
+ {RIGHT_WESTSOUTH_UP_248, RIGHT_WEST_UP_293, "西"},
+ {RIGHT_WEST_UP_293, RIGHT_WESTNORTH_UP_338, "西北"}
+};
+
+void CompassFragment::Callback(void)
+{
+ if (!initialized_) {
+ return;
+ }
+ int16_t angle = CompassModel::GetInstance()->GetAngle();
+ bgImg_->Rotate(-angle, Vector2<float>(VIEW_CENTERS, VIEW_CENTERS));
+ if ((angle >= RIGHT_WESTNORTH_UP_338) || (angle >= 0 && angle < RIGHT_NORTH_DOWN_23)) {
+ directionLabel_->SetText("北");
+ angleLabel_->SetText((std::to_string(angle) + "°").c_str());
+ }
+ for (int i = 0; i < DIRECTION_COUNT; i++) {
+ if ((angle >= g_compassList[i].beginAngle) && (angle < g_compassList[i].endAngle)) {
+ directionLabel_->SetText(g_compassList[i].dir);
+ angleLabel_->SetText((std::to_string(angle) + "°").c_str());
+ }
+ }
+ CompassModel::GetInstance()->UpdateAngle();
+}
+
+bool CompassFragment::LoadCompassImage(UIImageView *view, uint32_t resId)
+{
+ std::string file = COMPASS_IAMGES;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CompassFragment LoadCompassImage: %s, resID=0x%x", COMPASS_IAMGES, resId);
+ ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId, file);
+ if (image == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CompassFragment::LoadCompassImage %x fail", resId);
+ return false;
+ }
+ view->SetSrc(image);
+ return true;
+}
+
+bool CompassFragment::InitCompassImage(void)
+{
+ bgImg_ = new UIImageView();
+ if (bgImg_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[%d], bgImg_ new fail", __LINE__);
+ return false;
+ }
+ bgImg_->SetPosition(0, 0);
+
+ if (!LoadCompassImage(bgImg_, COMPASS_COMPASS)) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[%d], trianImg_ load fail", __LINE__);
+ return false;
+ }
+
+ fgImg_ = new UIImageView();
+ if (fgImg_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[%d], fgImg_ new fail", __LINE__);
+ return false;
+ }
+ fgImg_->SetPosition(POINT_CENTER_IMAGE_X, POINT_CENTER_IMAGE_Y);
+ if (!LoadCompassImage(fgImg_, COMPASS_ROTATE_CENTER_IMAGE)) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[%d], fgImg_ load fail", __LINE__);
+ return false;
+ }
+
+ trianImg_ = new UIImageView();
+ if (trianImg_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[%d], trianImg_ new fail", __LINE__);
+ return false;
+ }
+ trianImg_->SetPosition(trianImg__X, trianImg__Y);
+ if (!LoadCompassImage(trianImg_, COMPASS_CORRESPONDENCE_DEGREE)) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "trianImg_ load fail");
+ return false;
+ }
+ return true;
+}
+
+void CompassFragment::OnCreateView(void* data)
+{
+ fragmentView_.SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CompassFragment InitView");
+ if (!InitCompassImage()) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitCompassImage fail");
+ initialized_ = false;
+ return;
+ }
+
+ directionLabel_ = new UILabel();
+ if (directionLabel_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "directionLabel_ new fail");
+ initialized_ = false;
+ return;
+ }
+ directionLabel_->SetPosition(directionLabel__X, directionLabel__Y);
+ directionLabel_->Resize(TEXT_WIDTH, TEXT_HEIGHT);
+ directionLabel_->SetText("北");
+ directionLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_TEXT_SIZE);
+ directionLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ directionLabel_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);
+ directionLabel_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+ directionLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+
+ angleLabel_ = new UILabel();
+ if (angleLabel_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "angleLabel_ new fail");
+ initialized_ = false;
+ return;
+ }
+ angleLabel_->SetPosition(angleLabel__X, angleLabel__Y);
+ angleLabel_->Resize(TEXT_WIDTH, TEXT_HEIGHT);
+ angleLabel_->SetText("0°");
+ angleLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_TEXT_SIZE);
+ angleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ angleLabel_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);
+ angleLabel_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+ angleLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+
+ fragmentView_.Add(bgImg_);
+ fragmentView_.Add(fgImg_);
+ fragmentView_.Add(trianImg_);
+ fragmentView_.Add(directionLabel_);
+ fragmentView_.Add(angleLabel_);
+ CompassModel::GetInstance()->ResetAngle();
+ initialized_ = true;
+}
+
+void CompassFragment::OnPauseView()
+{
+ Deinit();
+}
+
+void CompassFragment::OnResumeView()
+{
+ Init();
+}
+
+void CompassFragment::OnDestroyView()
+{
+ Deinit();
+ fragmentView_.RemoveAll();
+ if (directionLabel_ != nullptr) {
+ delete directionLabel_;
+ directionLabel_= nullptr;
+ }
+ if (angleLabel_ != nullptr) {
+ delete angleLabel_;
+ angleLabel_ = nullptr;
+ }
+ if (bgImg_ != nullptr) {
+ delete bgImg_;
+ bgImg_ = nullptr;
+ }
+ if (fgImg_ != nullptr) {
+ delete fgImg_;
+ fgImg_ = nullptr;
+ }
+ if (trianImg_ != nullptr) {
+ delete trianImg_;
+ trianImg_ = nullptr;
+ }
+}
+}
* Create: 2022-04-02
*/
-#include <sys/time.h>
-#include "CompassModel.h"
-#include <ctime>
+#include "compass/CompassModel.h"
+#include "gfx_utils/graphic_math.h"
#ifdef __cplusplus
extern "C" {
#endif
namespace OHOS {
+static constexpr int16_t DELTA_ANGLE = 1;
+
CompassModel *CompassModel::GetInstance(void)
{
static CompassModel instance;
return &instance;
}
-void CompassModel::SetCalibrationStatus(uint8_t status)
-{
- calibrationStatus = status;
-}
-
-uint8_t CompassModel::GetCalibrationStatus(void)
+void CompassModel::UpdateAngle()
{
- return 0;
-}
-
-void CompassModel::SetDisplayAngle(uint16_t angle)
-{
- displayAngle += angle;
- if (displayAngle > 359) {
- displayAngle = 0;
+ if (clockwise_) {
+ angle_ += DELTA_ANGLE;
+ } else {
+ angle_ -= DELTA_ANGLE;
+ }
+ if (angle_ >= CIRCLE_IN_DEGREE) {
+ angle_ = 360;
+ clockwise_ = false;
+ }
+ if (angle_ <= 0) {
+ angle_ = 0;
+ clockwise_ = true;
}
}
-uint16_t CompassModel::GetDisplayAngle(void)
-{
- return displayAngle;
-}
-
-void CompassModel::SetLastTime(time_t value)
-{
- lastTime = value;
-}
-
-time_t CompassModel::GetLastTime(void)
+int16_t CompassModel::GetAngle(void)
{
- return lastTime;
+ return angle_;
}
-time_t CompassModel::GetCurrentTime(void)
+void CompassModel::ResetAngle(void)
{
- struct timeval tv;
- gettimeofday(&tv, nullptr);
- return tv.tv_sec;
+ angle_ = 0;
}
bool CompassModel::OpenCompassSensor(void)
{
+ // Add implemetion later
return true;
}
bool CompassModel::CloseCompassSensor(void)
{
+ // Add implemetion later
return true;
}
}
+++ /dev/null
-/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: CompassPresenter.cpp\r
- * Author:\r
- * Create: 2021-12-21\r
- */\r
-#include "CompassView.h"\r
-#include "CompassPresenter.h"\r
-#include "CompassModel.h"\r
-#include "graphic_service.h"\r
-\r
-namespace OHOS {\r
-static constexpr int16_t RIGHT_NORTH_DOWN_23 = 23;\r
-static constexpr int16_t RIGHT_EASTNORTH_UP_68 = 68;\r
-static constexpr int16_t RIGHT_WESTNORTH_UP_338 = 338;\r
-static constexpr int16_t RIGHT_SOUTH_UP_203 = 203;\r
-static constexpr int16_t RIGHT_EASTSOUTH_UP_158 = 158;\r
-static constexpr int16_t RIGHT_WESTSOUTH_UP_248 = 248;\r
-static constexpr int16_t RIGHT_WEST_UP_293 = 293;\r
-static constexpr int16_t RIGHT_EAST_UP_113 = 113;\r
-static constexpr int16_t RIGHT_MAX_ANGLE_360 = 360;\r
-static constexpr int16_t RIGHT_HALF_ANGLE_180 = 180;\r
-static constexpr int16_t RIGHT_ROTATION_INTERVAL = 2;\r
-static constexpr int16_t DIRECTION_COUNT = 7;\r
-static constexpr int16_t LEFT_NORTH_DOWN_23 = -23;\r
-static constexpr int16_t LEFT_EASTNORTH_DOWN_337 = -337;\r
-static constexpr int16_t LEFT_WESTNORTH_DOWN_68 = -68;\r
-static constexpr int16_t LEFT_SOUTH_DOWN_202 = -202;\r
-static constexpr int16_t LEFT_EASTSOUTH_DOWN_247 = -247;\r
-static constexpr int16_t LEFT_WESTSOUTH_DOWN_157 = -157;\r
-static constexpr int16_t LEFT_WEST_DOWN_113 = -113;\r
-static constexpr int16_t LEFT_EAST_DOWN_292 = -292;\r
-static constexpr int16_t RIGHT_MIN_ANGLE_360 = -360;\r
-static constexpr int16_t LEFT_HALF_ANGLE_180 = -180;\r
-static constexpr int16_t LEFT_ROTATION_INTERVAL = -2;\r
-\r
-static constexpr const char *NORTH_DIRECTION = (char *)"北";\r
-static constexpr const char *SOUTH_DIRECTION = (char *)"南";\r
-static constexpr const char *WEST_DIRECTION = (char *)"西";\r
-static constexpr const char *EAST_DIRECTION = (char *)"东";\r
-static constexpr const char *WESTNORTH_DIRECTION = (char *)"西北";\r
-static constexpr const char *WESTSOUTH_DIRECTION = (char *)"西南";\r
-static constexpr const char *EASTSOUTH_DIRECTION = (char *)"东南";\r
-static constexpr const char *EASTNORTH_DIRECTION = (char *)"东北";\r
-\r
-const CompassItem g_compassList[] = {\r
- {RIGHT_NORTH_DOWN_23, RIGHT_EASTNORTH_UP_68, EASTNORTH_DIRECTION},\r
- {RIGHT_EASTNORTH_UP_68, RIGHT_EAST_UP_113, EAST_DIRECTION},\r
- {RIGHT_EAST_UP_113, RIGHT_EASTSOUTH_UP_158, EASTSOUTH_DIRECTION},\r
- {RIGHT_EASTSOUTH_UP_158, RIGHT_SOUTH_UP_203, SOUTH_DIRECTION},\r
- {RIGHT_SOUTH_UP_203, RIGHT_WESTSOUTH_UP_248, WESTSOUTH_DIRECTION},\r
- {RIGHT_WESTSOUTH_UP_248, RIGHT_WEST_UP_293, WEST_DIRECTION},\r
- {RIGHT_WEST_UP_293, RIGHT_WESTNORTH_UP_338, WESTNORTH_DIRECTION}\r
-};\r
-\r
-static CompassPresenter *g_pMainView = nullptr;\r
-\r
-CompassPresenter::CompassPresenter()\r
-{\r
- g_pMainView = this;\r
-}\r
-\r
-CompassPresenter::~CompassPresenter()\r
-{\r
- g_pMainView = nullptr;\r
-}\r
-\r
-CompassPresenter* CompassPresenter::GetInstance(void)\r
-{\r
- return g_pMainView;\r
-}\r
-\r
-void CompassPresenter::DisplayAngleRight(uint16_t angle)\r
-{\r
- if ((angle >= RIGHT_WESTNORTH_UP_338) || (angle >= 0 && angle < RIGHT_NORTH_DOWN_23)) {\r
- CompassView::GetInstance()->DirectionSetText(NORTH_DIRECTION, (std::to_string(angle) + "°").c_str());\r
- }\r
- for (int i = 0; i < DIRECTION_COUNT; i++) {\r
- if ((angle >= g_compassList[i].beginAngle) && (angle < g_compassList[i].endAngle)) {\r
- CompassView::GetInstance()->DirectionSetText(g_compassList[i].dir, (std::to_string(angle) + "°").c_str());\r
- }\r
- }\r
-}\r
-\r
-void CompassPresenter::DisplayAngleDir(uint16_t angle)\r
-{\r
- if (CompassView::GetInstance() == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DisplayAngleDir]CompassView::GetInstance() is nullptr");\r
- return;\r
- }\r
- if (angle >= 0 && angle <= RIGHT_MAX_ANGLE_360) {\r
- DisplayAngleRight(angle);\r
- }\r
-}\r
-\r
-\r
-void CompassPresenter::InScopeRotate(void)\r
-{\r
- angleDiff = lastRotateAngle - currentRotateAngle;\r
- if (angleDiff > LEFT_HALF_ANGLE_180 && angleDiff < RIGHT_HALF_ANGLE_180) {\r
- if (lastRotateAngle < currentRotateAngle) {\r
- CompassView::GetInstance()->CompassStartRotate(lastRotateAngle);\r
- if (angleDiff <= LEFT_ROTATION_INTERVAL) {\r
- lastRotateAngle+=RIGHT_ROTATION_INTERVAL;\r
- } else {\r
- lastRotateAngle++;\r
- }\r
- } else if (lastRotateAngle != currentRotateAngle) {\r
- CompassView::GetInstance()->CompassStartRotate(lastRotateAngle);\r
- if (angleDiff >= RIGHT_ROTATION_INTERVAL) {\r
- lastRotateAngle-=RIGHT_ROTATION_INTERVAL;\r
- } else {\r
- lastRotateAngle--;\r
- }\r
- }\r
- } else {\r
- if (lastRotateAngle < currentRotateAngle) {\r
- CompassView::GetInstance()->CompassStartRotate(lastRotateAngle);\r
- if (angleDiff <= LEFT_ROTATION_INTERVAL) {\r
- lastRotateAngle-=RIGHT_ROTATION_INTERVAL;\r
- } else {\r
- lastRotateAngle--;\r
- }\r
- if (lastRotateAngle <= 0) {\r
- lastRotateAngle = RIGHT_MAX_ANGLE_360;\r
- }\r
- } else if (lastRotateAngle != currentRotateAngle) {\r
- CompassView::GetInstance()->CompassStartRotate(lastRotateAngle);\r
- if (angleDiff >= RIGHT_ROTATION_INTERVAL) {\r
- lastRotateAngle+=RIGHT_ROTATION_INTERVAL;\r
- } else {\r
- lastRotateAngle++;\r
- }\r
- if (lastRotateAngle >= RIGHT_MAX_ANGLE_360) {\r
- lastRotateAngle = 0;\r
- }\r
- }\r
- }\r
-}\r
-\r
-void CompassPresenter::DetermineToRotate(void)\r
-{\r
- if (CompassView::GetInstance() == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DetermineToRotate]CompassView::GetInstance() is nullptr");\r
- return;\r
- }\r
- bool initState = CompassView::GetInstance()->GetInitViewState();\r
- if (initState) {\r
- if (initDisplayStatus) {\r
- currentRotateAngle = CompassModel::GetInstance()->GetDisplayAngle();\r
- lastRotateAngle = currentRotateAngle;\r
- CompassView::GetInstance()->CompassStartRotate(lastRotateAngle);\r
- DisplayAngleDir(currentRotateAngle);\r
- initDisplayStatus = false;\r
- } else {\r
- if (!getAngleStatus) {\r
- currentRotateAngle = CompassModel::GetInstance()->GetDisplayAngle();\r
- }\r
- InScopeRotate();\r
- getAngleStatus = true;\r
- if (lastRotateAngle == currentRotateAngle) {\r
- CompassView::GetInstance()->CompassStartRotate(lastRotateAngle);\r
- DisplayAngleDir(currentRotateAngle);\r
- getAngleStatus = false;\r
- }\r
- }\r
- }\r
- CompassModel::GetInstance()->SetDisplayAngle(1);\r
-}\r
-\r
-}
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: CompassView.cpp
- * Author:
- * Create: 2021-12-21
- */
-#include <string>
-#include "common/image_cache_manager.h"
-#include "ui_resource_image.h"
-#include "CompassView.h"
-#include "MainCompassView.h"
-
-namespace OHOS {
-static constexpr int16_t POINT_CENTER_IMAGE_X = 150;
-static constexpr int16_t POINT_CENTER_IMAGE_Y = 150;
-static constexpr int16_t TRIANGULATION_X = 210;
-static constexpr int16_t TRIANGULATION_Y = 0;
-static constexpr int16_t DIRECTIONLABEL_X = 160;
-static constexpr int16_t DIRECTIONLABEL_Y = 215;
-static constexpr int16_t FONT_TEXT_SIZE = 25;
-static constexpr int16_t ANGLEDLABEL_X = 215;
-static constexpr int16_t ANGLEDLABEL_Y = 215;
-static constexpr int16_t TEXT_WIDTH = 90;
-static constexpr int16_t TEXT_HEIGHT = 35;
-static constexpr int16_t RANDOM_NUMBER_720 = 720;
-static constexpr int16_t RANDOM_NUMBER_360 = 360;
-static constexpr int16_t DELAYING_NUMS = 2000;
-
-static CompassView *g_pCompassView = nullptr;
-
-CompassView::CompassView()
-{
- SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
- g_pCompassView = this;
-}
-
-CompassView::~CompassView()
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CompassView::~CompassView()");
- ClearAll();
- g_pCompassView = nullptr;
-}
-
-void CompassView::ClearAll(void)
-{
- RemoveAll();
- if (directionLabel != nullptr) {
- delete directionLabel;
- directionLabel= nullptr;
- }
- if (angledLabel != nullptr) {
- delete angledLabel;
- angledLabel = nullptr;
- }
- if (backGround != nullptr) {
- delete backGround;
- backGround = nullptr;
- }
- if (rotateShaft != nullptr) {
- delete rotateShaft;
- rotateShaft = nullptr;
- }
- if (triangulation != nullptr) {
- delete triangulation;
- triangulation = nullptr;
- }
-}
-
-void CompassView::DirectionSetText(const char *text, const char *angle)
-{
- directionLabel->SetText(text);
- angledLabel->SetText(angle);
-}
-
-bool CompassView::LoadCompassImage(UIImageView *view, uint32_t resId)
-{
- std::string file = COMPASS_IAMGES;
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CompassView LoadCompassImage: %s, resID=0x%x", COMPASS_IAMGES, resId);
- ImageInfo* image = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId, file);
- if (image == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CompassView::LoadCompassImage %x fail", resId);
- return false;
- }
- view->SetSrc(image);
- return true;
-}
-
-bool CompassView::InitCompassImage(void)
-{
- backGround = new UIImageView();
- if (backGround == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[%d], backGround new fail", __LINE__);
- return false;
- }
- backGround->SetPosition(0, 0);
-
- if (!LoadCompassImage(backGround, COMPASS_COMPASS)) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[%d], triangulation load fail", __LINE__);
- return false;
- }
-
- rotateShaft = new UIImageView();
- if (rotateShaft == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[%d], rotateShaft new fail", __LINE__);
- return false;
- }
- rotateShaft->SetPosition(POINT_CENTER_IMAGE_X, POINT_CENTER_IMAGE_Y);
- if (!LoadCompassImage(rotateShaft, COMPASS_ROTATE_CENTER_IMAGE)) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[%d], rotateShaft load fail", __LINE__);
- return false;
- }
-
- triangulation = new UIImageView();
- if (triangulation == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[%d], triangulation new fail", __LINE__);
- return false;
- }
- triangulation->SetPosition(TRIANGULATION_X, TRIANGULATION_Y);
- if (!LoadCompassImage(triangulation, COMPASS_CORRESPONDENCE_DEGREE)) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "triangulation load fail");
- return false;
- }
- return true;
-}
-
-bool CompassView::InitPage(void)
-{
- if (!InitCompassImage()) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitCompassImage fail");
- ClearAll();
- return false;
- }
-
- directionLabel = new UILabel();
- if (directionLabel == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "directionLabel new fail");
- ClearAll();
- return false;
- }
- directionLabel->SetPosition(DIRECTIONLABEL_X, DIRECTIONLABEL_Y);
- directionLabel->Resize(TEXT_WIDTH, TEXT_HEIGHT);
- directionLabel->SetText("北");
- directionLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_TEXT_SIZE);
- directionLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
- directionLabel->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);
- directionLabel->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
- directionLabel->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
-
- angledLabel = new UILabel();
- if (angledLabel == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "angledLabel new fail");
- ClearAll();
- return false;
- }
- angledLabel->SetPosition(ANGLEDLABEL_X, ANGLEDLABEL_Y);
- angledLabel->Resize(TEXT_WIDTH, TEXT_HEIGHT);
- angledLabel->SetText("0°");
- angledLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_TEXT_SIZE);
- angledLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
- angledLabel->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);
- angledLabel->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
- angledLabel->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
-
- Add(backGround);
- Add(rotateShaft);
- Add(triangulation);
- Add(directionLabel);
- Add(angledLabel);
- SetDraggable(false);
- SetTouchable(false);
- initViewStatus = true;
- return true;
-}
-
-
-bool CompassView::InitView(void *caller)
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CompassView InitView %p", caller);
- if (!InitPage()) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitPage fail");
- return false;
- }
- SetDraggable(true);
- SetTouchable(true);
- return true;
-}
-
-bool CompassView::GetInitViewState(void)
-{
- return initViewStatus;
-}
-
-CompassView *CompassView::GetInstance(void)
-{
- return g_pCompassView;
-}
-
-void CompassView::CompassStartRotate(int16_t numb)
-{
- if (backGround == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "backGround is nullptr");
- return;
- }
- backGround->Rotate(-numb, VIEW_CENTER);
-}
-}
* Author:
* Create: 2021-12-21
*/
-#include "CompassView.h"
-#include "MainCompassPresenter.h"
-#include "MainCompassView.h"
+#include "compass/MainCompassPresenter.h"
+#include "compass/MainCompassView.h"
#include "NativeRegisterManager.h"
namespace OHOS {
-REGIST_MENU(VIEW_COMPASS, MainCompassView, MainCompassPresenter, PNG_APPLIST_COMPASS_IMAGE, PNG_APPLIST_DEFAULT_IMG, "指南针");
-
-static MainCompassPresenter *g_pMainView = nullptr;
-
-MainCompassPresenter::MainCompassPresenter()
-{
- g_pMainView = this;
-}
-
-MainCompassPresenter::~MainCompassPresenter()
-{
- g_pMainView = nullptr;
-}
-
-
-MainCompassPresenter* MainCompassPresenter::GetInstance()
-{
- return g_pMainView;
-}
+REGIST_MENU(VIEW_COMPASS, MainCompassView, MainCompassPresenter, PNG_APPLIST_COMPASS_IMAGE,
+ PNG_APPLIST_DEFAULT_IMG, "指南针");
bool MainCompassPresenter::OnDrag(UIView& view, const DragEvent& event)
{
UNUSED(view);
- if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&
+ (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {
NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
}
return true;
}
-void MainCompassPresenter::Notify()
+void MainCompassPresenter::OnResume()
{
- if (MainCompassView::GetInstance() == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[Notify]MainCompassView::GetInstance() == nullptr");
- return;
+ if ((view_ != nullptr) && (view_->compassFragment_ != nullptr)) {
+ view_->compassFragment_->ResumeView();
}
- uint8_t status = CompassModel::GetInstance()->GetCalibrationStatus();
- if (status == 1) {
- MainCompassView::GetInstance()->SetDisplayTure();
- } else {
- MainCompassView::GetInstance()->SetDisplayFalse();
- DetermineToRotate();
+}
+
+void MainCompassPresenter::OnPause()
+{
+ if ((view_ != nullptr) && (view_->compassFragment_ != nullptr)) {
+ view_->compassFragment_->PauseView();
}
}
}
* Create: 2021-12-23
*/
-#include "MainCompassView.h"
-#include "MainCompassPresenter.h"
+#include "compass/MainCompassView.h"
+#include "compass/MainCompassPresenter.h"
+#include "compass/CompassModel.h"
+#include "wearable_log.h"
namespace OHOS {
static constexpr int16_t TWO_HOUR_SECOND = 7200;
-static MainCompassView *g_pMainCompassView = nullptr;
-
-MainCompassView::MainCompassView()
-{
- g_pMainCompassView = this;
-}
-
-MainCompassView::~MainCompassView()
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCompassView::~MainCompassView");
- delete compassView;
- compassView = nullptr;
- delete compassCalibrationView;
- compassCalibrationView = nullptr;
- g_pMainCompassView = nullptr;
-}
-
-MainCompassView *MainCompassView::GetInstance()
-{
- return g_pMainCompassView;
-}
-
-void MainCompassView::SetDisplayTure()
-{
- if (compassView == nullptr || compassCalibrationView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCompassView::SetDisplayTure null");
- return;
- }
- compassView->SetVisible(false);
- compassCalibrationView->SetVisible(true);
-}
-
-void MainCompassView::SetDisplayFalse()
-{
- if (compassView == nullptr || compassCalibrationView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCompassView::SetDisplayFalse null");
- return;
- }
- compassView->SetVisible(true);
- compassCalibrationView->SetVisible(false);
-}
void MainCompassView::OnStart()
{
-
- compassCalibrationView = new CompassCalibrationView();
- if (compassCalibrationView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCompassView:: OnStart compassCalibrationView null");
- return;
- }
-
- compassView = new CompassView();
- if (compassView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCompassView:: OnStart compassView null");
+ compassFragment_ = new CompassFragment();
+ if (compassFragment_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCompassView:: OnStart compassFragment_ null");
return;
}
-
- UIView::OnDragListener *compassCalibrationDragListener = (UIView::OnDragListener *)
- OHOS::MainCompassPresenter::GetInstance();
- if (compassCalibrationDragListener == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "compassCalibrationDragListener new fail");
- return;
- }
-
- UIView::OnDragListener *compassDragListener = (UIView::OnDragListener *)OHOS::MainCompassPresenter::GetInstance();
- if (compassDragListener == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "compassDragListener new fail");
- return;
- }
- compassView->SetOnDragListener(compassDragListener);
- compassView->InitView(this);
-
- compassCalibrationView->SetOnDragListener(compassCalibrationDragListener);
- compassCalibrationView->InitView(this);
- AddViewToRootContainer(compassView);
- AddViewToRootContainer(compassCalibrationView);
-
- time_t currTime = CompassModel::GetInstance()->GetCurrentTime();
- time_t lastTime = CompassModel::GetInstance()->GetLastTime();
- if (currTime >= TWO_HOUR_SECOND + lastTime) {
- CompassModel::GetInstance()->SetCalibrationStatus(1);
- }
-
- uint8_t status = CompassModel::GetInstance()->GetCalibrationStatus();
- if (status == 1) {
- compassView->SetVisible(false);
- compassCalibrationView->SetVisible(true);
- } else {
- compassView->SetVisible(true);
- compassCalibrationView->SetVisible(false);
- }
+ compassFragment_->CreateView();
+ compassFragment_->GetFragmentView()->SetTouchable(true);
+ compassFragment_->GetFragmentView()->SetDraggable(true);
+ compassFragment_->GetFragmentView()->SetOnDragListener(presenter_);
+ AddViewToRootContainer(compassFragment_->GetFragmentView());
CompassModel::GetInstance()->OpenCompassSensor();
}
void MainCompassView::OnStop()
{
+ if (compassFragment_ != nullptr) {
+ compassFragment_->DestroyView();
+ delete compassFragment_;
+ compassFragment_ = nullptr;
+ }
CompassModel::GetInstance()->CloseCompassSensor();
return;
}
* Description: ConnectOpen View\r
* Create: 2022-03-22\r
*/\r
-#include "ConnectOpenView.h"\r
+#include "connectnewphone/ConnectOpenView.h"\r
+#include "PageTransitionMgr.h"\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
-#include "ConnectPhonePresenter.h"\r
-#include "BluetoothModel.h"\r
+#include "connectnewphone/ConnectPhonePresenter.h"\r
+#include "bluetooth/BluetoothModel.h"\r
\r
namespace OHOS {\r
static ConnectOpenView *g_pConnectOpenView{nullptr};\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "tipsDragListener GetInstance fail");\r
return nullptr;\r
}\r
- if (PageTransitionMgr::GetInstance().GetTopSlideBackImage() == nullptr) { // support default slide back firstly\r
+ if (!PageTransitionMgr::GetInstance().CanSlideBack()) { // support default slide back firstly\r
group->SetOnDragListener(tipsDragListener);\r
}\r
group->SetViewId(CONNECT_OPEN_VIEW);\r
* Create: 2022-01-19\r
*/\r
\r
-#include "ConnectPhonePresenter.h"\r
-#include "ConnectPhoneView.h"\r
+#include "connectnewphone/ConnectPhonePresenter.h"\r
+#include "connectnewphone/ConnectPhoneView.h"\r
#include "drag_event.h"\r
#include "cmsis_os.h"\r
#include "UiConfig.h"\r
#include "wearable_log.h"\r
-#include "ui_service.h"\r
+#include "uiservice/ui_service.h"\r
#include "NativeRegisterManager.h"\r
\r
namespace OHOS {\r
* Create: 2022-01-19\r
*/\r
\r
-#include "ConnectPhoneView.h"\r
+#include "connectnewphone/ConnectPhoneView.h"\r
#include "components/ui_label.h"\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
* Description: ConnectSelect View\r
* Create: 2022-03-22\r
*/\r
-#include "ConnectSelectView.h"\r
+#include "connectnewphone/ConnectSelectView.h"\r
+#include "PageTransitionMgr.h"\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
-#include "ConnectPhonePresenter.h"\r
+#include "connectnewphone/ConnectPhonePresenter.h"\r
\r
namespace OHOS {\r
static ConnectSelectView *g_pConnectSelectView{nullptr};\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "connectDragListener GetInstance fail");\r
return nullptr;\r
}\r
- if (PageTransitionMgr::GetInstance().GetTopSlideBackImage() == nullptr) { // support default slide back firstly\r
+ if (!PageTransitionMgr::GetInstance().CanSlideBack()) { // support default slide back firstly\r
group->SetOnDragListener(connectDragListener);\r
}\r
group->SetViewId(CONNECT_SELECT_VIEW);\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateAdapter\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include "date/DateAdapter.h"\r
+\r
+namespace OHOS {\r
+DateAdapter::DateAdapter() {}\r
+\r
+DateAdapter::~DateAdapter()\r
+{\r
+ listData.clear();\r
+}\r
+\r
+uint16_t DateAdapter::GetCount(void)\r
+{\r
+ return listData.size();\r
+}\r
+\r
+void DateAdapter::SetData(std::list<DateItem> &data)\r
+{\r
+ if (!listData.empty()) {\r
+ listData.clear();\r
+ }\r
+ std::list<DateItem>::iterator it;\r
+ for (it = data.begin(); it != data.end(); it++) {\r
+ listData.push_back(*it);\r
+ }\r
+}\r
+\r
+UIView *DateAdapter::GetView(UIView *inView, int16_t index)\r
+{\r
+ if (listData.empty()) {\r
+ return nullptr;\r
+ }\r
+ if (index < 0) {\r
+ return nullptr;\r
+ }\r
+ size_t uindex = index;\r
+ if (uindex >= listData.size()) {\r
+ return nullptr;\r
+ }\r
+\r
+ std::list<DateItem>::iterator it = listData.begin();\r
+ for (int i = 0; i < index; i++) {\r
+ it++;\r
+ }\r
+ DateItem itemData = *it;\r
+ DateItemView *item = nullptr;\r
+ if (inView == nullptr) {\r
+ item = new DateItemView();\r
+ } else {\r
+ item = static_cast<DateItemView *>(inView);\r
+ }\r
+\r
+ item->SetItemInfo(itemData);\r
+ item->SetOnClickListener(itemClickListener);\r
+ return item;\r
+}\r
+\r
+void DateAdapter::AddListItem(const DateItem &item)\r
+{\r
+ listData.push_back(item);\r
+}\r
+\r
+void DateAdapter::ClearListItem()\r
+{\r
+ listData.clear();\r
+}\r
+\r
+} // namespace OHOS\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateButtonAdapter\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include "date/DateButtonAdapter.h"\r
+\r
+namespace OHOS {\r
+DateButtonAdapter::DateButtonAdapter() {}\r
+\r
+DateButtonAdapter::~DateButtonAdapter()\r
+{\r
+ listData.clear();\r
+}\r
+\r
+uint16_t DateButtonAdapter::GetCount(void)\r
+{\r
+ return listData.size();\r
+}\r
+\r
+void DateButtonAdapter::SetData(std::list<DateButtonItem> &data)\r
+{\r
+ if (!listData.empty()) {\r
+ listData.clear();\r
+ }\r
+ std::list<DateButtonItem>::iterator it;\r
+ for (it = data.begin(); it != data.end(); it++) {\r
+ listData.push_back(*it);\r
+ }\r
+}\r
+\r
+UIView *DateButtonAdapter::GetView(UIView *inView, int16_t index)\r
+{\r
+ if (listData.empty()) {\r
+ return nullptr;\r
+ }\r
+ if (index < 0) {\r
+ return nullptr;\r
+ }\r
+ size_t uindex = index;\r
+ if (uindex >= listData.size()) {\r
+ return nullptr;\r
+ }\r
+\r
+ std::list<DateButtonItem>::iterator it = listData.begin();\r
+ for (int i = 0; i < index; i++) {\r
+ it++;\r
+ }\r
+ DateButtonItem itemData = *it;\r
+ DateButtonItemView *item = nullptr;\r
+ if (inView == nullptr) {\r
+ item = new DateButtonItemView();\r
+ } else {\r
+ item = static_cast<DateButtonItemView *>(inView);\r
+ }\r
+\r
+ item->SetItemInfo(itemData);\r
+ item->SetOnClickListener(itemClickListener);\r
+ return item;\r
+}\r
+\r
+void DateButtonAdapter::AddListItem(const DateButtonItem &item)\r
+{\r
+ listData.push_back(item);\r
+}\r
+\r
+void DateButtonAdapter::ClearListItem()\r
+{\r
+ listData.clear();\r
+}\r
+\r
+} // namespace OHOS\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateButtonItemView\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include "date/DateButtonItemView.h"\r
+#include "UiConfig.h"\r
+#include "common/image_cache_manager.h"\r
+#include "ui_resource_date.h"\r
+#include "wearable_log.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t DATE_ITEM_BUTTON_POSITION_X = 0;\r
+static constexpr int16_t DATE_ITEM_BUTTON_POSITION_Y = 20;\r
+static constexpr int16_t DATE_ITEM_BUTTON_WIDTH = 80;\r
+static constexpr int16_t DATE_ITEM_BUTTON_HEIGHT = 55;\r
+static constexpr int16 DATE_ITEM_FONT_SIZE = 36;\r
+static constexpr int16_t DATE_ITEM_WIDTH = 95;\r
+static constexpr int16_t DATE_ITEM_HEIGHT = 60;\r
+\r
+DateButtonItemView::DateButtonItemView()\r
+{\r
+ SetPosition(0, 0, DATE_ITEM_WIDTH, DATE_ITEM_HEIGHT);\r
+ SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ SetTouchable(true);\r
+ SetUpChild();\r
+\r
+ Add(&sLabelButton);\r
+}\r
+\r
+DateButtonItemView::~DateButtonItemView()\r
+{\r
+ Remove(&sLabelButton);\r
+}\r
+\r
+void DateButtonItemView::SetItemInfo(const DateButtonItem itemInfo)\r
+{\r
+ sItemInfo = itemInfo;\r
+ sLabelButton.SetText(sItemInfo.button_day);\r
+ ImageInfo *image1;\r
+ ImageInfo *image2;\r
+ if (sItemInfo.isFirst) {\r
+ if (sItemInfo.isSelect) {\r
+ image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE6, DATE_IMAGE);\r
+ sLabelButton.SetTextColor(Color::White());\r
+ } else {\r
+ sLabelButton.SetTextColor(Color::GetColorFromRGBA(0xe0, 0x2d, 0x2f, 0xff));\r
+ image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE3, DATE_IMAGE);\r
+ }\r
+ if (image1 == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadBtnImage resId1 fail");\r
+ return;\r
+ }\r
+ image2 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE6, DATE_IMAGE);\r
+ if (image2 == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadBtnImage resId2 fail");\r
+ return;\r
+ }\r
+ } else {\r
+ if (sItemInfo.isSelect) {\r
+ image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE4, DATE_IMAGE);\r
+ } else {\r
+ image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE2, DATE_IMAGE);\r
+ }\r
+ if (image1 == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadBtnImage resId1 fail");\r
+ return;\r
+ }\r
+ image2 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE4, DATE_IMAGE);\r
+ if (image2 == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadBtnImage resId2 fail");\r
+ return;\r
+ }\r
+ sLabelButton.SetTextColor(Color::White());\r
+ }\r
+ sLabelButton.SetImageSrc(image1, image2);\r
+}\r
+\r
+void DateButtonItemView::SetUpChild()\r
+{\r
+ sLabelButton.SetPosition(DATE_ITEM_BUTTON_POSITION_X, 0);\r
+ sLabelButton.Resize(DATE_ITEM_BUTTON_WIDTH, DATE_ITEM_BUTTON_HEIGHT);\r
+ sLabelButton.SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_ITEM_FONT_SIZE);\r
+ sLabelButton.SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ sLabelButton.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ sLabelButton.SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+ sLabelButton.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+}\r
+\r
+DateButtonItem DateButtonItemView ::GetItem()\r
+{\r
+ return sItemInfo;\r
+}\r
+\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateItemView\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include "date/DateItemView.h"\r
+#include "UiConfig.h"\r
+#include "common/image_cache_manager.h"\r
+#include "ui_resource_date.h"\r
+#include "wearable_log.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t DATE_ITEM_BUTTON_HEIGHT = 65;\r
+static constexpr int16_t DATE_ITEM_LABEL_POSITION_X = 43;\r
+static constexpr int16_t DATE_ITEM_LABEL_POSITION_Y = 22;\r
+static constexpr int16_t DATE_ITEM_LABEL_TWO_POSITION_X = 23;\r
+static constexpr int16_t DATE_ITEM_LABEL_TWO_POSITION_Y = 60;\r
+static constexpr int16_t DATE_ITEM_LABEL_WIDTH = 135;\r
+static constexpr int16_t DATE_ITEM_LABEL_HEIGHT = 40;\r
+static constexpr int16_t DATE_ITEM_LABEL2_HEIGHT = 96;\r
+static constexpr int16_t DATE_ITEM_LABEL_TWO_WIDTH = 314;\r
+static constexpr int16 DATE_ITEM_FONT_SIZE = 24;\r
+static constexpr int16 DATE_ITEM_FONT2_SIZE = 32;\r
+static constexpr int16_t DATE_ITEM_WIDTH = 376;\r
+static constexpr int16_t DATE_ITEM_HEIGHT = 190;\r
+\r
+DateItemView::DateItemView()\r
+{\r
+ SetPosition(0, 0, DATE_ITEM_WIDTH, DATE_ITEM_HEIGHT);\r
+ SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ SetTouchable(true);\r
+ SetUpChild();\r
+\r
+ Add(&sLabel_1);\r
+ Add(&sLabel_2);\r
+ Add(&Signs);\r
+ Add(&BackGround);\r
+}\r
+\r
+DateItemView::~DateItemView()\r
+{\r
+ Remove(&sLabel_1);\r
+ Remove(&sLabel_2);\r
+ Remove(&Signs);\r
+ Remove(&BackGround);\r
+}\r
+\r
+void DateItemView::SetItemInfo(const DateItem itemInfo)\r
+{\r
+ sItemInfo = itemInfo;\r
+ sLabel_1.SetText(itemInfo.label_1);\r
+ sLabel_2.SetText(itemInfo.label_2);\r
+ BackGround.SetPosition(0, 0);\r
+ if (itemInfo.visiable) {\r
+ int offsetX1 = 100;\r
+ int offsetY1 = 10;\r
+ int offsetX2 = 30;\r
+ int offsetY2 = 40;\r
+ sLabel_1.SetPosition(DATE_ITEM_LABEL_POSITION_X + offsetX1, DATE_ITEM_LABEL_POSITION_Y + offsetY1);\r
+ sLabel_2.SetPosition(DATE_ITEM_LABEL_TWO_POSITION_X + offsetX2, DATE_ITEM_LABEL_TWO_POSITION_Y + offsetY2);\r
+ sLabel_1.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ sLabel_2.SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+ sLabel_1.SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_ITEM_FONT2_SIZE);\r
+ sLabel_2.SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_ITEM_FONT_SIZE);\r
+ Signs.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ } else {\r
+ sLabel_1.SetPosition(DATE_ITEM_LABEL_POSITION_X, DATE_ITEM_LABEL_POSITION_Y);\r
+ sLabel_2.SetPosition(DATE_ITEM_LABEL_TWO_POSITION_X, DATE_ITEM_LABEL_TWO_POSITION_Y);\r
+ sLabel_1.SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+ sLabel_2.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ sLabel_1.SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_ITEM_FONT_SIZE);\r
+ sLabel_2.SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_ITEM_FONT2_SIZE);\r
+ Signs.SetPosition(DATE_ITEM_LABEL_TWO_POSITION_X, DATE_ITEM_FONT_SIZE);\r
+ }\r
+ Signs.SetVisible(!itemInfo.visiable);\r
+}\r
+\r
+void DateItemView::SetUpChild()\r
+{\r
+ sLabel_1.Resize(DATE_ITEM_LABEL_WIDTH, DATE_ITEM_LABEL_HEIGHT);\r
+ sLabel_1.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_LEFT);\r
+ sLabel_1.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ sLabel_1.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ sLabel_1.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+\r
+ sLabel_2.Resize(DATE_ITEM_LABEL_TWO_WIDTH, DATE_ITEM_LABEL2_HEIGHT);\r
+ sLabel_2.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_LEFT);\r
+ sLabel_2.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ sLabel_2.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ sLabel_2.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+\r
+ ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE5, DATE_IMAGE);\r
+ if (image == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+ "DateMessagePage::OnStart LoadStopwatchImage IMAGE_CONVERTER_TOOL_DATE5 fail");\r
+ return;\r
+ }\r
+ Signs.SetSrc(image);\r
+ image = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE1, DATE_IMAGE);\r
+ if (image == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+ "DateMessagePage::OnStart LoadStopwatchImage IMAGE_CONVERTER_TOOL_DATE1 fail");\r
+ return;\r
+ }\r
+ BackGround.SetSrc(image);\r
+}\r
+\r
+const char *DateItemView ::GetViewId()\r
+{\r
+ return sItemInfo.index;\r
+}\r
+bool DateItemView::GetVisiable()\r
+{\r
+ return sItemInfo.visiable;\r
+}\r
+\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateMainPage\r
+ * Created: 2025-4\r
+ */\r
+\r
+#include "date/DateMainPage.h"\r
+#include "date/DateModel.h"\r
+#include "date/DatePresenter.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "UiConfig.h"\r
+#include "common/image_cache_manager.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "ui_resource_date.h"\r
+\r
+static constexpr int16_t DOWNSELECTPOSITION = 100;\r
+static constexpr int16_t DOWNCONTENTLIST_POSITION_X = 39;\r
+static constexpr int16_t DOWNCONTENTLIST_POSITION_Y = 171;\r
+static constexpr int16_t DOWNCONTENTLIST_WIDTH = 376;\r
+static constexpr int16_t DOWNCONTENTLIST_HEIGHT = 260;\r
+static constexpr int16_t BUTTONCONTENTLIST_POSITION_X = 36;\r
+static constexpr int16_t BUTTONCONTENTLIST_POSITION_Y = 97;\r
+static constexpr int16_t BUTTONCONTENTLIST_WIDTH = 410;\r
+static constexpr int16_t BUTTONCONTENTLIST_HEIGHT = 55;\r
+static constexpr int16_t BUTTONCONTENTLIST_SELECT_POSITON = 90;\r
+static constexpr uint16_t DATE_MONTH_FONT = 25;\r
+static constexpr uint16_t DATE_MONTH_POS_X = 129;\r
+static constexpr uint16_t DATE_MONTH_POS_Y = 31;\r
+static constexpr uint16_t DATE_MONTH_WIDTH = 196;\r
+static constexpr uint16_t LIST_POSITION_Y = 155;\r
+static constexpr uint16_t DATE_MONTH_HEIGHT = 50;\r
+static constexpr uint8_t FONT_FORTY_SIZE = 36;\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_DATE, DATE_PAGES::DATE_MAIN_PAGE, DateMainPage, true);\r
+\r
+DateMainPage::DateMainPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DateMainPage::DateMainPage");\r
+}\r
+\r
+DateMainPage::~DateMainPage()\r
+{\r
+ if (uiScrollView != nullptr) {\r
+ uiScrollView->RemoveAll();\r
+ delete uiScrollView;\r
+ uiScrollView = nullptr;\r
+ }\r
+\r
+ if (listAdapter != nullptr) {\r
+ delete listAdapter;\r
+ listAdapter = nullptr;\r
+ }\r
+\r
+ if (buttonAdapter != nullptr) {\r
+ delete buttonAdapter;\r
+ buttonAdapter = nullptr;\r
+ }\r
+\r
+ if (buttonContentList != nullptr) {\r
+ delete buttonContentList;\r
+ buttonContentList = nullptr;\r
+ }\r
+\r
+ if (downContentList != nullptr) {\r
+ delete downContentList;\r
+ downContentList = nullptr;\r
+ }\r
+\r
+ if (title != nullptr) {\r
+ delete title;\r
+ title = nullptr;\r
+ }\r
+\r
+ if (image1 != nullptr) {\r
+ delete image1;\r
+ image1 = nullptr;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DateMainPage::~DateMainPage");\r
+}\r
+\r
+void DateMainPage::OnStart(void *data)\r
+{\r
+ uiScrollView = new UIScrollView();\r
+ if (uiScrollView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DateView::OnStart::scrollView is nullptr");\r
+ return;\r
+ }\r
+ uiScrollView->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ uiScrollView->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ uiScrollView->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ uiScrollView->SetThrowDrag(true);\r
+ uiScrollView->SetOnDragListener(this);\r
+ uiScrollView->SetThrowDrag(true);\r
+ image1 = new UIImageView();\r
+ if (image1 == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DateView::OnStart::image1 is nullptr");\r
+ return;\r
+ }\r
+ image1->SetPosition(0, 0);\r
+ image1->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ ImageInfo *imgSrc = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE7, DATE_IMAGE);\r
+ if (imgSrc == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+ "DateMainPage::OnStart LoadOneInMultiRes IMAGE_CONVERTER_TOOL_DATE8 fail");\r
+ return;\r
+ }\r
+ image1->SetSrc(imgSrc);\r
+ uiScrollView->Add(image1);\r
+\r
+ DateModel::GetInstance().InitDate();\r
+ title = new UILabel();\r
+ if (title == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DateView::OnStart::title is nullptr");\r
+ return;\r
+ }\r
+ title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_MONTH_FONT);\r
+ std::stringstream ss;\r
+ title->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_RIGHT, UITextLanguageAlignment::TEXT_ALIGNMENT_RIGHT);\r
+ title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_FORTY_SIZE);\r
+ title->SetPosition(DATE_MONTH_POS_X, DATE_MONTH_POS_Y, DATE_MONTH_WIDTH, DATE_MONTH_HEIGHT);\r
+ uiScrollView->Add(title);\r
+ InitDownList();\r
+ AddViewToPageContainer(uiScrollView);\r
+}\r
+\r
+void DateMainPage::InitDownList()\r
+{\r
+ if (buttonContentList == nullptr) {\r
+ buttonContentList = new UIList(0);\r
+ }\r
+ buttonAdapter = new DateButtonAdapter();\r
+ if (buttonAdapter == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DateView::OnStart::listAdapter is nullptr");\r
+ return;\r
+ }\r
+ buttonAdapter->SetItemClickListener(this);\r
+ buttonContentList->SetViewId("buttonList");\r
+ buttonContentList->SetPosition(BUTTONCONTENTLIST_POSITION_X, BUTTONCONTENTLIST_POSITION_Y, BUTTONCONTENTLIST_WIDTH,\r
+ BUTTONCONTENTLIST_HEIGHT);\r
+ buttonContentList->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ buttonContentList->SetSelectPosition(BUTTONCONTENTLIST_SELECT_POSITON);\r
+ buttonContentList->SetDraggable(true);\r
+ buttonContentList->SetThrowDrag(true);\r
+ buttonContentList->EnableAutoAlign(true);\r
+ buttonContentList->ScrollTo(0);\r
+ buttonContentList->SetAdapter(buttonAdapter);\r
+ buttonContentList->SetStyle(STYLE_BACKGROUND_COLOR, Color::White().full);\r
+ InitDateTop();\r
+ RefreshButtonListDate(0);\r
+ if (downContentList == nullptr) {\r
+ downContentList = new UIList();\r
+ }\r
+\r
+ listAdapter = new DateAdapter();\r
+ if (listAdapter == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DateView::OnStart::listAdapter is nullptr");\r
+ return;\r
+ }\r
+ listAdapter->SetItemClickListener(this);\r
+ SetDownListAdapter();\r
+ downContentList->SetViewId("downList");\r
+ downContentList->SetPosition(DOWNCONTENTLIST_POSITION_X, DOWNCONTENTLIST_POSITION_Y);\r
+ downContentList->Resize(DOWNCONTENTLIST_WIDTH, DOWNCONTENTLIST_HEIGHT); // 364: height\r
+ downContentList->SetSelectPosition(DOWNSELECTPOSITION);\r
+ downContentList->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ downContentList->SetDraggable(true);\r
+ downContentList->SetThrowDrag(true);\r
+ downContentList->EnableAutoAlign(true);\r
+ downContentList->SetElastic(true);\r
+ downContentList->ScrollTo(0);\r
+ downContentList->SetAdapter(listAdapter);\r
+ UpdateMsg(listTop.front().button_viewId);\r
+ uiScrollView->Add(downContentList);\r
+ uiScrollView->Add(buttonContentList);\r
+}\r
+\r
+int calculateWeekday(int year, int month, int day)\r
+{\r
+ if (month < SET_THREE) {\r
+ month += SET_TWELVE;\r
+ year--;\r
+ }\r
+ int K = year % SET_HUNDRED;\r
+ int J = year / SET_HUNDRED;\r
+ int h = (day + SET_THIRTEEN * (month + SET_ONE) / SET_FIVE + K + K / SET_FOUR + J / SET_FOUR + SET_FIVE * J) %\r
+ SET_SEVEN;\r
+ return h;\r
+}\r
+\r
+// 刷新List数据\r
+void DateMainPage::UpdateMsg(std::string dateMsg)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DateView::UpdateMsg:%s", dateMsg.c_str());\r
+ listAdapter->ClearListItem(); // 清空list数据\r
+ DateModel::GetInstance().InitDateVec(dateMsg);\r
+ SetDownListAdapter(); // 将设置的数据写入list\r
+ int year;\r
+ int month;\r
+ int day;\r
+ int ret = sscanf_s(dateMsg.c_str(), "%d-%d-%d", &year, &month, &day);\r
+ if (ret != SET_THREE) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DateMainPage::OnStart strDate");\r
+ return;\r
+ }\r
+ std::string weekDay[] = {"星期六", "星期日", "星期一", "星期二", "星期三", "星期四", "星期五"};\r
+ int today = calculateWeekday(year, month, day);\r
+ std::string titleDay;\r
+ if (dateMsg == listTop.front().button_viewId) {\r
+ titleDay = "今天 ";\r
+ } else {\r
+ titleDay = std::to_string(month) + "月 ";\r
+ }\r
+ titleDay += weekDay[today];\r
+ DateModel::GetInstance().titleName = titleDay;\r
+ title->SetText(titleDay.c_str());\r
+ downContentList->ScrollTo(SET_ZERO);\r
+ downContentList->RefreshList();\r
+}\r
+\r
+void DateMainPage::SetDownListAdapter()\r
+{\r
+ for (const auto &item : DateModel::GetInstance().listDate) {\r
+ listAdapter->AddListItem(item);\r
+ }\r
+}\r
+\r
+void DateMainPage::RefreshButtonListDate(int value)\r
+{\r
+ buttonAdapter->ClearListItem();\r
+ for (auto &item : listTop) {\r
+ if (item.index == value) {\r
+ item.isSelect = true;\r
+ } else {\r
+ item.isSelect = false;\r
+ }\r
+ buttonAdapter->AddListItem(item);\r
+ }\r
+ buttonContentList->RefreshList();\r
+}\r
+\r
+bool DateMainPage::InitDateTop()\r
+{\r
+ listTop.clear();\r
+ for (int i = 0; i < SET_SEVEN; ++i) {\r
+ strDate[i] = GetFutureDate(i);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DateMainPage::OnStart strDate[%d]:%s", i, strDate[i].c_str());\r
+ strDay[i] = strDate[i].substr(strDate[i].length() - SET_TWO);\r
+ if (i == 0) {\r
+ listTop.push_back({strDate[i].c_str(), strDay[i].c_str(), i, true, true});\r
+ } else {\r
+ listTop.push_back({strDate[i].c_str(), strDay[i].c_str(), i, false, false});\r
+ }\r
+ }\r
+ return true;\r
+}\r
+\r
+std::string DateMainPage::GetFutureDate(int days_ahead)\r
+{\r
+ time_t now = time(nullptr);\r
+ time_t future_time = now + (days_ahead * HOUR_COUNT * NUM_TIME_MIN * NUM_TIME_MIN);\r
+ tm *tm = localtime(&future_time);\r
+ char buffer[80]; // 存储格式化后的日期字符串\r
+ strftime(buffer, sizeof(buffer), "%Y-%m-%d", tm);\r
+ return std::string(buffer);\r
+}\r
+\r
+bool DateMainPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool DateMainPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ int posY = event.GetCurrentPos().y;\r
+ if (posY > LIST_POSITION_Y) {\r
+ DateItemView *dateItemView = static_cast<DateItemView *>(&view);\r
+ std::string view_id = dateItemView->GetViewId();\r
+ bool visiable = dateItemView->GetVisiable();\r
+ if (visiable) {\r
+ return false;\r
+ }\r
+ DateModel::GetInstance().messageIndex = view_id;\r
+ NativeAbility::GetInstance().SwitchPageInSlice(DATE_PAGES::DATE_MESSAGE_PAGE, nullptr,\r
+ TransitionType::TRANSITION_INVALID, true);\r
+ } else {\r
+ DateButtonItemView *dateButtonItemView = static_cast<DateButtonItemView *>(&view);\r
+ DateButtonItem item = dateButtonItemView->GetItem();\r
+ RefreshButtonListDate(item.index);\r
+ UpdateMsg(item.button_viewId);\r
+ }\r
+ UNUSED(event);\r
+ return true;\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateMessagePage\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#include "date/DateMessagePage.h"\r
+#include "date/DateModel.h"\r
+#include "date/DatePresenter.h"\r
+#include "date/DateView.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "UiConfig.h"\r
+#include "common/image_cache_manager.h"\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "ui_resource_date.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t DATE_MONTH_WIDTH = 221;\r
+static constexpr uint16_t DATE_MESSAGE_WIDTH = 180;\r
+static constexpr uint16_t DATE_MESSAGE_HEIGHT = 50;\r
+static constexpr uint16_t DATE_MESSAGE_POSITON_X = 117;\r
+static constexpr uint16_t DATE_MESSAGE_POSITON_Y = 20;\r
+static constexpr uint16_t DATE_MESSAGE_POSITON_X1 = 137;\r
+static constexpr uint16_t DATE_MESSAGE_FRONT_SIZE_ONE = 36;\r
+static constexpr uint16_t DATE_MESSAGE_FRONT_SIZE_TWO = 32;\r
+static constexpr uint16_t DATE_MESSAGE_TWO_POSITION_X = 31;\r
+static constexpr uint16_t DATE_MESSAGE_TWO_POSITION_Y = 100;\r
+static constexpr uint16_t DATE_MESSAGE_TWO_WIDTH = 392;\r
+static constexpr uint16_t DATE_MESSAGE_TWO_HEIGHT = 120;\r
+static constexpr uint16_t DATE_MESSAGE_MAX_LINE_HEIGHT = 140;\r
+\r
+REGIST_SLICE_PAGE(VIEW_DATE, DATE_PAGES::DATE_MESSAGE_PAGE, DateMessagePage, false);\r
+\r
+DateMessagePage::DateMessagePage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DateMessagePage::DateMessagePage");\r
+}\r
+\r
+DateMessagePage::~DateMessagePage()\r
+{\r
+ if (group != nullptr) {\r
+ group->RemoveAll();\r
+ delete group;\r
+ group = nullptr;\r
+ }\r
+\r
+ if (image1 != nullptr) {\r
+ delete image1;\r
+ image1 = nullptr;\r
+ }\r
+\r
+ if (labelTitle != nullptr) {\r
+ delete labelTitle;\r
+ labelTitle = nullptr;\r
+ }\r
+\r
+ if (labelMessage != nullptr) {\r
+ delete labelMessage;\r
+ labelMessage = nullptr;\r
+ }\r
+\r
+ if (labelTime != nullptr) {\r
+ delete labelTime;\r
+ labelTime = nullptr;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DateMessagePage::~DateMessagePage");\r
+}\r
+\r
+void DateMessagePage::OnStart(void *data)\r
+{\r
+ group = new UIViewGroup();\r
+ group->SetPosition(0, 0);\r
+ group->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);\r
+ image1 = new UIImageView;\r
+ if (image1 == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherView::OnStart::title is nullptr");\r
+ return;\r
+ }\r
+ image1->SetPosition(0, 0);\r
+ image1->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ ImageInfo *imgSrc = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_DATE8, DATE_IMAGE);\r
+ if (imgSrc == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::LoadOneInMultiRes fail");\r
+ }\r
+ image1->SetSrc(imgSrc);\r
+ group->Add(image1);\r
+\r
+ labelTitle = new UILabel();\r
+ if (labelTitle == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherView::OnStart::title is nullptr");\r
+ return;\r
+ }\r
+ labelTitle->SetPosition(DATE_MESSAGE_POSITON_X, DATE_MESSAGE_POSITON_Y, DATE_MONTH_WIDTH, DATE_MESSAGE_HEIGHT);\r
+ labelTitle->SetStyle(STYLE_TEXT_COLOR, Color::Purple().full);\r
+ labelTitle->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_MESSAGE_FRONT_SIZE_ONE);\r
+ labelTitle->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelTitle->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ labelTitle->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ group->Add(labelTitle);\r
+\r
+ labelMessage = new UILabel();\r
+ if (labelMessage == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherView::OnStart::title is nullptr");\r
+ return;\r
+ }\r
+ labelMessage->SetPosition(DATE_MESSAGE_TWO_POSITION_X, DATE_MESSAGE_TWO_POSITION_Y, DATE_MESSAGE_TWO_WIDTH,\r
+ DATE_MESSAGE_TWO_HEIGHT);\r
+ labelMessage->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelMessage->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ labelMessage->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ labelMessage->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ labelMessage->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_MESSAGE_FRONT_SIZE_ONE);\r
+ labelMessage->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);\r
+ labelMessage->SetRollSpeed(0);\r
+ group->Add(labelMessage);\r
+\r
+ labelTime = new UILabel();\r
+ if (labelTime == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WeatherView::OnStart::title is nullptr");\r
+ return;\r
+ }\r
+ labelTime->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ labelTime->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ labelTime->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ labelTime->SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+ labelTime->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DATE_MESSAGE_FRONT_SIZE_TWO);\r
+ group->Add(labelTime);\r
+\r
+ std::string strTitle = DateModel::GetInstance().titleName;\r
+ labelTitle->SetText(strTitle.c_str());\r
+ for (const auto &item : DateModel::GetInstance().listDate) {\r
+ std::string strIndex = DateModel::GetInstance().messageIndex;\r
+ if (strIndex == item.index) {\r
+ labelTime->SetText(item.label_1);\r
+ labelMessage->SetText(item.label_2);\r
+ }\r
+ }\r
+ int posTextHeight = labelMessage->GetTextHeight();\r
+ int posHeight = DATE_MESSAGE_TWO_POSITION_Y;\r
+ int pos = 0;\r
+ if (posTextHeight < DATE_MESSAGE_MAX_LINE_HEIGHT) {\r
+ int offsetY = 50;\r
+ pos = DATE_MESSAGE_TWO_POSITION_Y + posTextHeight + offsetY;\r
+ labelMessage->SetY(DATE_MESSAGE_TWO_POSITION_Y + offsetY);\r
+ } else {\r
+ pos = DATE_MESSAGE_TWO_POSITION_Y + posTextHeight;\r
+ labelMessage->SetY(DATE_MESSAGE_TWO_POSITION_Y);\r
+ }\r
+ labelMessage->SetHeight(posTextHeight);\r
+ labelTime->SetPosition(DATE_MESSAGE_POSITON_X1, pos, DATE_MESSAGE_WIDTH, DATE_MESSAGE_HEIGHT);\r
+ group->SetOnDragListener(this);\r
+ group->SetDraggable(true);\r
+ AddViewToPageContainer(group);\r
+}\r
+\r
+bool DateMessagePage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DatePresenter::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+ }\r
+ return true;\r
+}\r
+\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateModel\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include "date/DateModel.h"\r
+#include "date/DatePresenter.h"\r
+#include "phoneservice/PhoneService.h"\r
+#include "ohos_timer.h"\r
+#include "wearable_log.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16 DATE_COUNT = 24;\r
+static constexpr int16 DATE_HOUR = 12;\r
+\r
+DateModel::DateModel() {}\r
+\r
+DateModel::~DateModel() {}\r
+\r
+DateModel &DateModel::GetInstance()\r
+{\r
+ static DateModel instance;\r
+ return instance;\r
+}\r
+\r
+bool DateModel::InitDateVec(std::string dateStr)\r
+{\r
+ int index = 0;\r
+ listDate.clear();\r
+ if (GetBtConnectStatus() != PROFILE_STATE_CONNECTED) {\r
+ listDate.push_back({"无日程", "请连接手机,同步日程信息", "0", true});\r
+ } else {\r
+ for (const auto &msg : keyValues) {\r
+ for (const auto &item : msg.second) {\r
+ if (msg.first == dateStr) {\r
+ index++;\r
+ strIndex = std::to_string(index);\r
+ listDate.push_back({item.hour.c_str(), item.eventTitle.c_str(), strIndex.c_str(), false});\r
+ }\r
+ }\r
+ }\r
+ if (listDate.size() == 0) {\r
+ listDate.push_back({"无日程", "请前往手机日历创建日程", "0", true});\r
+ }\r
+ }\r
+ return true;\r
+}\r
+\r
+bool DateModel::InitDate()\r
+{\r
+ keyValues.clear();\r
+ std::ifstream file("/user/app/user/ace/data/com.vendor.Weather/calendar.json");\r
+ if (!file.is_open()) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cannot open file");\r
+ return false;\r
+ }\r
+ std::stringstream buffer;\r
+ buffer << file.rdbuf();\r
+ std::string content = buffer.str();\r
+ int intsize = sizeof(content);\r
+ cJSON *root = nullptr;\r
+ if (intsize != 0) {\r
+ root = cJSON_Parse(content.c_str());\r
+ }\r
+ if (root == NULL) {\r
+ const char *error_ptr;\r
+ return false;\r
+ }\r
+ cJSON *dateSum = cJSON_GetObjectItemCaseSensitive(root, "dateSum");\r
+ if (!cJSON_IsObject(dateSum)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error observe:");\r
+ cJSON_Delete(root);\r
+ return false;\r
+ }\r
+ int sum = std::atoi(cJSON_GetObjectItemCaseSensitive(dateSum, "count")->valuestring);\r
+ for (int i = 0; i < sum; i++) {\r
+ cJSON *date = cJSON_GetObjectItemCaseSensitive(dateSum, std::to_string(i).c_str());\r
+ if (!cJSON_IsObject(date)) {\r
+ cJSON_Delete(root);\r
+ continue;\r
+ }\r
+ std::string hour = cJSON_GetObjectItemCaseSensitive(date, "hour")->valuestring;\r
+ std::string eventTitle = cJSON_GetObjectItemCaseSensitive(date, "eventTitle")->valuestring;\r
+ std::string startTime = cJSON_GetObjectItemCaseSensitive(date, "startTime")->valuestring;\r
+ std::string time = cJSON_GetObjectItemCaseSensitive(date, "time")->valuestring;\r
+ std::string week = cJSON_GetObjectItemCaseSensitive(date, "week")->valuestring;\r
+ DateMsg item = {hour, eventTitle, startTime, week};\r
+ keyValues[time].push_back(item);\r
+ }\r
+ return true;\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DatePresenter\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include "date/DatePresenter.h"\r
+#include "date/DateModel.h"\r
+#include "date/DateView.h"\r
+#include "NativeRegisterManager.h"\r
+#include "uiservice/ui_service.h"\r
+#include "wearable_log.h"\r
+\r
+namespace OHOS {\r
+REGIST_MENU(VIEW_DATE, DateView, DatePresenter, DATE_MAIN_ICON, DATE_MAIN_ICON, "日程");\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: EmptyPage\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#include "emptypage/EmptyPage.h"\r
+#include "emptypage/EmptyPresenter.h"\r
+#include "SlicePageFactory.h"\r
+#include "flashlight/FlashLightView.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+\r
+namespace OHOS {\r
+static const uint16_t MEM_LABEL_FONT_SIZE = 40;\r
+static uint32_t EMPTY_PAGE = 1;\r
+REGIST_SLICE_PAGE(VIEW_EMPTY, EMPTY_PAGE, EmptyPage, true);\r
+void EmptyPage::OnStart(void *data)\r
+{\r
+ if (container_ == nullptr) {\r
+ container_ = new UIScrollView();\r
+ container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ // 设置界面组件回调函数\r
+ container_->SetOnDragListener(this);\r
+ container_->SetOnClickListener(this);\r
+ }\r
+#if !defined(_WIN32)\r
+ test_get_mem_info(1, &used_, &free_);\r
+#endif\r
+ // Add Label to App\r
+ if (memLabel_ == nullptr) {\r
+ memLabel_ = new UILabel();\r
+ }\r
+ memLabel_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ std::string memInfo = "Used : " + std::to_string(used_) + "\n" + "Free : " + std::to_string(free_);\r
+ memLabel_->SetText(memInfo.c_str());\r
+ memLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ memLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MEM_LABEL_FONT_SIZE);\r
+ container_->Add(memLabel_);\r
+ AddViewToPageContainer(container_);\r
+}\r
+\r
+EmptyPage::~EmptyPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "EmptyPage::~EmptyPage");\r
+ if (container_ != nullptr) {\r
+ container_->RemoveAll();\r
+ delete container_;\r
+ container_ = nullptr;\r
+ }\r
+ if (memLabel_ != nullptr) {\r
+ delete memLabel_;\r
+ memLabel_ = nullptr;\r
+ }\r
+}\r
+\r
+bool EmptyPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ return false;\r
+}\r
+\r
+bool EmptyPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ return false;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: EmptyPresenter\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#include "emptypage/EmptyView.h"\r
+#include "emptypage/EmptyPresenter.h"\r
+#include "NativeRegisterManager.h"\r
+\r
+namespace OHOS {\r
+REGIST_MENU(VIEW_EMPTY, EmptyView, EmptyPresenter, FLASHLIGHT_MAIN_ICON, PNG_APPLIST_DEFAULT_IMG, "空页面");\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FindPhoneMainPage\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include "phoneservice/PhoneService.h"\r
+#include "UiConfig.h"\r
+#include "bts_spp.h"\r
+#include "common/image_cache_manager.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_findPhone.h"\r
+#include "uiservice/ui_service.h"\r
+#include "ui_test_group.h"\r
+#include "wearable_onlinelog.h"\r
+#include "msg_center_protocol.h"\r
+#include "msg_center_device.h"\r
+#include "findphone/FindPhoneMainPage.h"\r
+#include "findphone/FindPhonePresenter.h"\r
+#include "findphone/FindPhoneView.h"\r
+\r
+static uint8_t data = 0;\r
+namespace OHOS {\r
+\r
+static FindPhoneMainPage *g_pFindPhoneMainPage = nullptr;\r
+static constexpr uint16_t FIND_PHONE_IMAGE_WIDTH = 500;\r
+static constexpr uint16_t FIND_PHONE_IMAGE_HEIGHT = 500;\r
+static constexpr uint16_t FIND_PHONE_BUTTON_POSITION_X = 154;\r
+static constexpr uint16_t FIND_PHONE_BUTTON_POSITION_Y = 154;\r
+static constexpr uint16_t FIND_PHONE_BUTTON_WIDTH = 146;\r
+static constexpr uint16_t FIND_PHONE_BUTTON_HEIGHT = 146;\r
+static constexpr uint16_t FIND_PHONE_RTYBUTTON_POSITION_X = 179;\r
+static constexpr uint16_t FIND_PHONE_RTYBUTTON_POSITION_Y = 289;\r
+static constexpr uint16_t FIND_PHONE_RTYBUTTON = 96;\r
+static constexpr uint16_t FIND_PHONE_SIZE = 466;\r
+static constexpr uint16_t FIND_PHONE_IMAGEANIMATOR_POSITION_X = 170;\r
+static constexpr uint16_t FIND_PHONE_IMAGEANIMATOR_POSITION_Y = 170;\r
+static constexpr uint16_t FIND_PHONE_IMAGEANIMATOR_WIDTH = 100;\r
+static constexpr uint16_t FIND_PHONE_IMAGEANIMATOR_HEIGHT = 100;\r
+static constexpr uint16_t FONT_DEFAULT_SIZE_1 = 36;\r
+static constexpr uint16_t FONT_DEFAULT_SIZE_2 = 38;\r
+static constexpr uint16_t FIND_PHONE_INITIAL = 0;\r
+static constexpr uint16_t FIND_PHONE_TITLDE_X = 140;\r
+static constexpr uint16_t FIND_PHONE_TITLDE_Y = 345;\r
+static constexpr uint16_t FIND_PHONE_TITLDE_WIDTH = 314;\r
+static constexpr uint16_t FIND_PHONE_FINDTITLE_X = 150;\r
+static constexpr uint16_t FIND_PHONE_FINDTITLE_Y = 31;\r
+static constexpr uint16_t FIND_PHONE_FINDTITLE_WIDTH = 253;\r
+static constexpr uint16_t FIND_PHONE_FINDTITLE_HEIGHT = 53;\r
+static constexpr uint16_t FIND_PHONE_RINGING_X = 200;\r
+static constexpr uint16_t FIND_PHONE_RINGING2_X = 156;\r
+static constexpr uint16_t FIND_PHONE_RINGING_Y = 353;\r
+static constexpr uint16_t FIND_PHONE_RINGING_WIDTH = 93;\r
+static constexpr uint16_t FIND_PHONE_RINGING2_WIDTH = 144;\r
+static constexpr uint16_t FIND_PHONE_RINGING_HEIGHT = 42;\r
+static constexpr uint16_t FIND_PHONE_SEARCHTIMEOUT_X = 50;\r
+static constexpr uint16_t FIND_PHONE_SEARCHTIMEOUT_Y = 185;\r
+static constexpr uint16_t FIND_PHONE_SEARCHTIMEOUT_WIDTH = 424;\r
+static constexpr uint16_t FIND_PHONE_SEARCHTIMEOUT_HEIGHT = 50;\r
+static constexpr uint16_t FIND_PHONE_DURATION_TIME = 60;\r
+static constexpr uint16_t IMAGE_SIZE = 500;\r
+static constexpr uint16_t IMAGEANIMATOERVIEW_SIZE = 28;\r
+static constexpr uint16_t IMAGEANIMATOERVIEW_TIME = 60;\r
+static constexpr uint16_t FIND_PHONE_IMAGE_X = 5;\r
+static constexpr uint16_t FIND_PHONE_IMAGE_y = 1;\r
+static constexpr uint16_t FIND_PHONE_PIXELBYTE_SIZE = 4;\r
+static constexpr uint16_t FIND_PHONE_PIXELBYTEH = 100;\r
+\r
+REGIST_SLICE_PAGE(VIEW_FIND_PHONE, FIND_PHONE_PAGES::FIND_PHONE_MAIN_PAGE, FindPhoneMainPage, true);\r
+\r
+const int g_imageAnimatorInfo[IMAGEANIMATOERVIEW_SIZE] = {\r
+ IMAGE_CONVERTER_TOOL_FINDPHONE001, IMAGE_CONVERTER_TOOL_FINDPHONE002, IMAGE_CONVERTER_TOOL_FINDPHONE003,\r
+ IMAGE_CONVERTER_TOOL_FINDPHONE004, IMAGE_CONVERTER_TOOL_FINDPHONE005, IMAGE_CONVERTER_TOOL_FINDPHONE006,\r
+ IMAGE_CONVERTER_TOOL_FINDPHONE007, IMAGE_CONVERTER_TOOL_FINDPHONE008, IMAGE_CONVERTER_TOOL_FINDPHONE009,\r
+ IMAGE_CONVERTER_TOOL_FINDPHONE010, IMAGE_CONVERTER_TOOL_FINDPHONE011, IMAGE_CONVERTER_TOOL_FINDPHONE012,\r
+ IMAGE_CONVERTER_TOOL_FINDPHONE013, IMAGE_CONVERTER_TOOL_FINDPHONE014, IMAGE_CONVERTER_TOOL_FINDPHONE015,\r
+ IMAGE_CONVERTER_TOOL_FINDPHONE016, IMAGE_CONVERTER_TOOL_FINDPHONE017, IMAGE_CONVERTER_TOOL_FINDPHONE018,\r
+ IMAGE_CONVERTER_TOOL_FINDPHONE019, IMAGE_CONVERTER_TOOL_FINDPHONE020, IMAGE_CONVERTER_TOOL_FINDPHONE021,\r
+ IMAGE_CONVERTER_TOOL_FINDPHONE022, IMAGE_CONVERTER_TOOL_FINDPHONE023, IMAGE_CONVERTER_TOOL_FINDPHONE024,\r
+ IMAGE_CONVERTER_TOOL_FINDPHONE025, IMAGE_CONVERTER_TOOL_FINDPHONE026, IMAGE_CONVERTER_TOOL_FINDPHONE027,\r
+ IMAGE_CONVERTER_TOOL_FINDPHONE028,\r
+};\r
+\r
+FindPhoneMainPage::FindPhoneMainPage()\r
+{\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::FindPhoneMainPage");\r
+ g_pFindPhoneMainPage = this;\r
+}\r
+\r
+FindPhoneMainPage::~FindPhoneMainPage()\r
+{\r
+ g_pFindPhoneMainPage = nullptr;\r
+ if (container_ != nullptr) {\r
+ container_->RemoveAll();\r
+ delete container_;\r
+ container_ = nullptr;\r
+ }\r
+\r
+ if (buttonFind != nullptr) {\r
+ delete buttonFind;\r
+ buttonFind = nullptr;\r
+ }\r
+\r
+ if (mainImage != nullptr) {\r
+ delete mainImage;\r
+ mainImage = nullptr;\r
+ }\r
+\r
+ if (labelUnder != nullptr) {\r
+ delete labelUnder;\r
+ labelUnder = nullptr;\r
+ }\r
+\r
+ if (labelFindTitle != nullptr) {\r
+ delete labelFindTitle;\r
+ labelFindTitle = nullptr;\r
+ }\r
+\r
+ if (labelRing != nullptr) {\r
+ delete labelRing;\r
+ labelRing = nullptr;\r
+ }\r
+\r
+ if (buttonRty != nullptr) {\r
+ delete buttonRty;\r
+ buttonRty = nullptr;\r
+ }\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::~FindPhoneMainPage");\r
+}\r
+\r
+FindPhoneMainPage *FindPhoneMainPage::GetInstance()\r
+{\r
+ return g_pFindPhoneMainPage;\r
+}\r
+\r
+void FindPhoneMainPage::OnStop()\r
+{\r
+ if (imageAnimator_->GetState() == true) {\r
+ DisableFindPhoneTimer();\r
+#ifndef _WIN32\r
+ errcode_t result =\r
+ uapi_diag_service_send_log(msg_center_get_trans_channel(), MSGCENTER_TYPE_ID_OFF_FIND_PHONE, nullptr, 0);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnStop::uapi_diag_service_send_log OFF result:%d ", result);\r
+#endif\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(FINDPHONE_IMAGE);\r
+ }\r
+ data = 0;\r
+}\r
+\r
+void FindPhoneMainPage::OnStart(void *data)\r
+{\r
+ if (container_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new container_ fail");\r
+ container_ = new UIViewGroup();\r
+ container_->SetPosition(FIND_PHONE_INITIAL, FIND_PHONE_INITIAL, FIND_PHONE_SIZE, FIND_PHONE_SIZE);\r
+ container_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ }\r
+ container_->SetTouchable(true);\r
+ container_->SetDraggable(true);\r
+ container_->SetOnDragListener(this);\r
+\r
+ if (mainImage == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new mainImage fail");\r
+ mainImage = new UIImageView();\r
+ }\r
+ mainImage->SetPosition(FIND_PHONE_INITIAL, FIND_PHONE_INITIAL);\r
+ LOADIMG::LoadImageViewImg(mainImage, FINDPHONE_IMAGE, IMAGE_CONVERTER_TOOL_CONNECT_PHONE_2);\r
+ container_->Add(mainImage);\r
+\r
+ SetUpImageAnimator();\r
+ SetupButton();\r
+\r
+ labelUnder = new UILabel();\r
+ if (labelUnder == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new labelUnder fail");\r
+ return;\r
+ }\r
+ labelUnder->SetText("蓝牙已断开");\r
+ labelUnder->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE_1);\r
+ labelUnder->SetPosition(FIND_PHONE_TITLDE_X, FIND_PHONE_TITLDE_Y, FIND_PHONE_TITLDE_WIDTH,\r
+ FIND_PHONE_IMAGEANIMATOR_HEIGHT);\r
+ container_->Add(labelUnder);\r
+ labelFindTitle = new UILabel();\r
+ if (labelFindTitle == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new labelFindTitle fail");\r
+ return;\r
+ }\r
+ labelFindTitle->SetText("查找手机");\r
+ labelFindTitle->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE_2);\r
+ labelFindTitle->SetPosition(FIND_PHONE_FINDTITLE_X, FIND_PHONE_FINDTITLE_Y, FIND_PHONE_FINDTITLE_WIDTH,\r
+ FIND_PHONE_FINDTITLE_HEIGHT);\r
+ container_->Add(labelFindTitle);\r
+\r
+ labelRing = new UILabel();\r
+ if (labelRing == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new labelRing fail");\r
+ return;\r
+ }\r
+ labelRing->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE_1);\r
+ container_->Add(labelRing);\r
+ if (GetConnectStatus() == 1) {\r
+ labelRing->SetVisible(true);\r
+ labelUnder->SetVisible(false);\r
+ LOADIMG::LoadBtnImage(buttonFind, FINDPHONE_IMAGE, IMAGE_CONVERTER_TOOL_CONNECT_PHONE_5,\r
+ IMAGE_CONVERTER_TOOL_CONNECT_PHONE_5);\r
+ buttonFind->Enable();\r
+ } else {\r
+ LOADIMG::LoadBtnImage(buttonFind, FINDPHONE_IMAGE, IMAGE_CONVERTER_TOOL_CONNECT_PHONE_4,\r
+ IMAGE_CONVERTER_TOOL_CONNECT_PHONE_4);\r
+ buttonFind->Disable();\r
+ labelUnder->SetVisible(true);\r
+ labelRing->SetVisible(false);\r
+ }\r
+ imageAnimator_->Stop();\r
+ imageAnimator_->SetVisible(false);\r
+ AddViewToPageContainer(container_);\r
+}\r
+\r
+void FindPhoneMainPage::SetUpImageAnimator()\r
+{\r
+ imageAnimator_ = new UIImageAnimatorView();\r
+ if (imageAnimator_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+ "FindPhoneMainPage::UIImageAnimatorView new Label SetUpImageAnimator fail");\r
+ return;\r
+ }\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::SetUpImageAnimator ");\r
+ imageAnimator_ = new UIImageAnimatorView();\r
+ for (data; data < IMAGEANIMATOERVIEW_SIZE; data++) {\r
+ searchImageInfo[data].imageInfo =\r
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(g_imageAnimatorInfo[data], FINDPHONE_IMAGE);\r
+ ;\r
+ searchImageInfo[data].imageType = IMG_SRC_IMAGE_INFO;\r
+ searchImageInfo[data].pos.x = FIND_PHONE_IMAGE_X;\r
+ searchImageInfo[data].pos.y = FIND_PHONE_IMAGE_y;\r
+ searchImageInfo[data].width = IMAGE_SIZE;\r
+ searchImageInfo[data].height = IMAGE_SIZE;\r
+ }\r
+ imageAnimator_->SetPosition(FIND_PHONE_IMAGE_X, FIND_PHONE_IMAGE_y, FIND_PHONE_IMAGE_WIDTH,\r
+ FIND_PHONE_IMAGE_HEIGHT); // 50 : offset 50 : offset 200 : offset 200: offset\r
+ int imageNumber = IMAGEANIMATOERVIEW_SIZE;\r
+ int ImageUpdate = IMAGEANIMATOERVIEW_TIME;\r
+ imageAnimator_->SetImageAnimatorSrc(searchImageInfo, imageNumber,\r
+ ImageUpdate); // 4: the number of images, 100: updating time\r
+ imageAnimator_->Stop();\r
+ imageAnimator_->LayoutCenterOfParent();\r
+ imageAnimator_->SetDraggable(true);\r
+ imageAnimator_->SetOnDragListener(this);\r
+ container_->Add(imageAnimator_);\r
+ InitImageInfo();\r
+}\r
+\r
+void FindPhoneMainPage::SetupButton()\r
+{\r
+ // Add Button to App\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::SetupButton new Label");\r
+ if (buttonFind == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new buttonFind fail");\r
+ buttonFind = new UIButton();\r
+ }\r
+ buttonFind->SetPosition(FIND_PHONE_BUTTON_POSITION_X, FIND_PHONE_BUTTON_POSITION_Y);\r
+ buttonFind->Resize(FIND_PHONE_BUTTON_WIDTH, FIND_PHONE_BUTTON_HEIGHT);\r
+ buttonFind->SetViewId("button1");\r
+ buttonFind->SetOnClickListener(this);\r
+ buttonFind->SetStyle(STYLE_BACKGROUND_COLOR, Color::White().full);\r
+ buttonFind->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ buttonFind->SetVisible(true);\r
+ LOADIMG::LoadBtnImage(buttonFind, FINDPHONE_IMAGE, IMAGE_CONVERTER_TOOL_CONNECT_PHONE_5,\r
+ IMAGE_CONVERTER_TOOL_CONNECT_PHONE_5);\r
+ if (buttonRty == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new buttonRty fail");\r
+ buttonRty = new UIButton();\r
+ }\r
+ buttonRty->SetPosition(FIND_PHONE_RTYBUTTON_POSITION_X, FIND_PHONE_RTYBUTTON_POSITION_Y);\r
+ buttonRty->Resize(FIND_PHONE_RTYBUTTON, FIND_PHONE_RTYBUTTON);\r
+ buttonRty->SetViewId("buttonRty");\r
+ buttonRty->SetOnClickListener(this);\r
+ buttonRty->SetStyle(STYLE_BACKGROUND_COLOR, Color::Red().full);\r
+ buttonRty->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ LOADIMG::LoadBtnImage(buttonRty, FINDPHONE_IMAGE, IMAGE_CONVERTER_TOOL_CONNECT_PHONE_7,\r
+ IMAGE_CONVERTER_TOOL_CONNECT_PHONE_7);\r
+ buttonRty->SetVisible(false);\r
+ // Add to rootView\r
+ container_->Add(buttonRty);\r
+ container_->Add(buttonFind);\r
+}\r
+\r
+bool FindPhoneMainPage::ClickButtonChange()\r
+{\r
+#ifndef _WIN32\r
+ errcode_t result;\r
+ if (imageAnimator_->GetState() == true) {\r
+ // 关闭定时器\r
+ result =\r
+ uapi_diag_service_send_log(msg_center_get_trans_channel(), MSGCENTER_TYPE_ID_OFF_FIND_PHONE, nullptr, 0);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_diag_service_send_log OFF result:%d ", result);\r
+ if (result == 0) {\r
+ DisableFindPhoneTimer();\r
+ LOADIMG::LoadBtnImage(buttonFind, FINDPHONE_IMAGE, IMAGE_CONVERTER_TOOL_CONNECT_PHONE_5,\r
+ IMAGE_CONVERTER_TOOL_CONNECT_PHONE_5);\r
+ imageAnimator_->Stop();\r
+ imageAnimator_->SetVisible(false);\r
+ buttonFind->SetOpaScale(OPA_OPAQUE);\r
+ mainImage->SetVisible(true);\r
+ labelRing->SetText("响铃");\r
+ labelRing->SetPosition(FIND_PHONE_RINGING_X, FIND_PHONE_RINGING_Y, FIND_PHONE_RINGING_WIDTH,\r
+ FIND_PHONE_RINGING_HEIGHT);\r
+ return true;\r
+ } else {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OFF send to phone fail:%d ", result);\r
+ return false;\r
+ }\r
+ } else {\r
+ // 开启定时器\r
+ result =\r
+ uapi_diag_service_send_log(msg_center_get_trans_channel(), MSGCENTER_TYPE_ID_ON_FIND_PHONE, nullptr, 0);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_diag_service_send_log ON result:%d ", result);\r
+ if (result == 0) {\r
+ InitFindPhoneTimer();\r
+ g_startCount->Start();\r
+ imageAnimator_->Start();\r
+ imageAnimator_->SetVisible(true);\r
+ buttonFind->SetOpaScale(OPA_TRANSPARENT);\r
+ mainImage->SetVisible(false);\r
+ labelRing->SetText("停止响铃");\r
+ labelRing->SetPosition(FIND_PHONE_RINGING2_X, FIND_PHONE_RINGING_Y, FIND_PHONE_RINGING2_WIDTH,\r
+ FIND_PHONE_RINGING_HEIGHT);\r
+ return true;\r
+ } else {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ON send to phone fail:%d ", result);\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+ return true;\r
+}\r
+\r
+void FindPhoneMainPage::ShowReset()\r
+{\r
+ // rtybutton、title显示,findTitle、button隐藏,imageAnimator停止\r
+ labelUnder->SetText("查找手机超时,请重试");\r
+ labelUnder->SetPosition(FIND_PHONE_SEARCHTIMEOUT_X, FIND_PHONE_SEARCHTIMEOUT_Y, FIND_PHONE_SEARCHTIMEOUT_WIDTH,\r
+ FIND_PHONE_SEARCHTIMEOUT_HEIGHT);\r
+ labelUnder->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE_1);\r
+ labelUnder->SetVisible(true);\r
+ buttonRty->SetVisible(true);\r
+ labelFindTitle->SetVisible(false);\r
+ labelRing->SetVisible(false);\r
+ buttonFind->SetVisible(false);\r
+ mainImage->SetVisible(false);\r
+ imageAnimator_->Stop();\r
+ imageAnimator_->SetVisible(false);\r
+ DisableFindPhoneTimer();\r
+}\r
+\r
+bool FindPhoneMainPage::StopFindPhone()\r
+{\r
+#ifndef _WIN32\r
+ errcode_t result;\r
+ if (imageAnimator_->GetState() == true) {\r
+ // 关闭定时器\r
+ result =\r
+ uapi_diag_service_send_log(msg_center_get_trans_channel(), MSGCENTER_TYPE_ID_OFF_FIND_PHONE, nullptr, 0);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_diag_service_send_log OFF result:%d ", result);\r
+ if (result == 0) {\r
+ DisableFindPhoneTimer();\r
+ LOADIMG::LoadBtnImage(buttonFind, FINDPHONE_IMAGE, IMAGE_CONVERTER_TOOL_CONNECT_PHONE_5,\r
+ IMAGE_CONVERTER_TOOL_CONNECT_PHONE_5);\r
+ imageAnimator_->Stop();\r
+ imageAnimator_->SetVisible(false);\r
+ buttonFind->SetOpaScale(OPA_OPAQUE);\r
+ mainImage->SetVisible(true);\r
+ labelRing->SetText("响铃");\r
+ labelRing->SetPosition(FIND_PHONE_RINGING_X, FIND_PHONE_RINGING_Y, FIND_PHONE_RINGING_WIDTH,\r
+ FIND_PHONE_RINGING_HEIGHT);\r
+ return true;\r
+ } else {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OFF send to phone fail:%d ", result);\r
+ return false;\r
+ }\r
+ } else {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::imageAnimator is stop");\r
+ }\r
+#endif\r
+ return true;\r
+}\r
+\r
+bool FindPhoneMainPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+#ifndef _WIN32\r
+ UNUSED(event);\r
+ if (view.GetViewId() == "buttonRty") {\r
+ // rtybutton、title隐藏,findTitle、button显示,imageAnimator播放\r
+ InitFindPhoneTimer();\r
+ static uint8_t buffer[1024] = {16};\r
+ errcode_t result =\r
+ uapi_diag_service_send_log(msg_center_get_trans_channel(), MSGCENTER_TYPE_ID_ON_FIND_PHONE, buffer, 16);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_diag_service_send_log ON result:%d ", result);\r
+ if (result == 0) {\r
+ buttonRty->SetVisible(false);\r
+ labelUnder->SetVisible(false);\r
+ mainImage->SetVisible(false);\r
+ buttonFind->SetVisible(true);\r
+ labelFindTitle->SetVisible(true);\r
+ imageAnimator_->Start();\r
+ imageAnimator_->SetVisible(true);\r
+ buttonFind->SetOpaScale(OPA_TRANSPARENT);\r
+ labelRing->SetVisible(true);\r
+ labelRing->SetText("停止响铃");\r
+ labelRing->SetPosition(FIND_PHONE_RINGING2_X, FIND_PHONE_RINGING_Y, FIND_PHONE_RINGING2_WIDTH,\r
+ FIND_PHONE_RINGING_HEIGHT);\r
+ return true;\r
+ } else {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "try send to phone fail:%d ", result);\r
+ return false;\r
+ }\r
+ } else {\r
+ ClickButtonChange();\r
+ }\r
+#endif\r
+ return true;\r
+}\r
+\r
+bool FindPhoneMainPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "FindPhonePresenter::OnDrag");\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FindPhoneOnDragListener::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+ }\r
+ return false;\r
+}\r
+\r
+uint8_t FindPhoneMainPage::GetConnectStatus()\r
+{\r
+ uint8_t conn_status = 0;\r
+#ifndef _WIN32\r
+ if (msg_center_get_trans_channel() == DIAG_FRAME_FID_PHONE) {\r
+ conn_status = is_spp_connected(0) == true ? 1 : 0;\r
+ } else if (msg_center_get_trans_channel() == DIAG_FRAME_FID_BT) {\r
+ conn_status = msg_center_get_ble_conn_state();\r
+ }\r
+#endif\r
+ return conn_status;\r
+}\r
+\r
+void FindPhoneMainPage::ChangeToDisConnect()\r
+{\r
+ LOADIMG::LoadBtnImage(buttonFind, FINDPHONE_IMAGE, IMAGE_CONVERTER_TOOL_CONNECT_PHONE_4,\r
+ IMAGE_CONVERTER_TOOL_CONNECT_PHONE_4);\r
+ imageAnimator_->Stop();\r
+ imageAnimator_->SetVisible(false);\r
+ buttonFind->SetOpaScale(OPA_OPAQUE);\r
+ buttonFind->Disable();\r
+ labelFindTitle->SetVisible(false);\r
+ labelUnder->SetVisible(true);\r
+ labelRing->SetVisible(false);\r
+}\r
+\r
+/* 定时器回调函数 */\r
+void FindPhoneTimerCallback(void *data)\r
+{\r
+ (void)data;\r
+ timeCount++;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::timeCount:%d", timeCount);\r
+ if (timeCount == FIND_PHONE_DURATION_TIME) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Searching for phone timed out!!");\r
+ FindPhoneMainPage::GetInstance()->ShowReset();\r
+ timeCount = 0;\r
+ }\r
+ if (FindPhoneMainPage::GetInstance()->GetConnectStatus() != 1) {\r
+ FindPhoneMainPage::GetInstance()->ChangeToDisConnect();\r
+ }\r
+}\r
+\r
+/* 开启定时器 */\r
+void FindPhoneMainPage::InitFindPhoneTimer()\r
+{\r
+ if (g_startCount != nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage already exists!!");\r
+ return;\r
+ }\r
+ uint32 tick = GetOSTick(MS_ONE_SECONDS);\r
+ g_startCount = new GraphicTimer(tick, FindPhoneTimerCallback, nullptr, true);\r
+ if (g_startCount == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage new GraphicTimer failed!!");\r
+ return;\r
+ }\r
+ bool retTimer = g_startCount->Start();\r
+ if (!retTimer) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage osTimerStart failed!!");\r
+ if (g_startCount != nullptr) {\r
+ delete g_startCount;\r
+ g_startCount = nullptr;\r
+ }\r
+ return;\r
+ }\r
+}\r
+\r
+/* 关闭定时器 */\r
+void FindPhoneMainPage::DisableFindPhoneTimer()\r
+{\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "CameraModel::DisableFindPhoneTimer!!");\r
+ if (g_startCount != nullptr) {\r
+ g_startCount->Stop();\r
+ delete g_startCount;\r
+ g_startCount = nullptr;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CameraModel::DisableFindPhoneTimer delete g_startCount!!");\r
+ }\r
+ timeCount = 0;\r
+}\r
+\r
+void FindPhoneMainPage::InitImageInfo()\r
+{\r
+ const uint16_t pixelByteSize = FIND_PHONE_PIXELBYTE_SIZE; // 4: bytes per pixel\r
+ const uint16_t width = FIND_PHONE_PIXELBYTEH; // 100: image's width\r
+ const uint16_t height = FIND_PHONE_PIXELBYTEH; // 100: image's height\r
+ uint32_t dataSize = width * height * pixelByteSize;\r
+ uint8_t *srcData1 = static_cast<uint8_t *>(UIMalloc(dataSize));\r
+ if (srcData1 == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::srcData1 fail");\r
+ return;\r
+ }\r
+ for (uint32_t i = 0; i < dataSize; i += pixelByteSize) {\r
+ srcData1[i] = SET_INT_MAX; // 255: pixel value\r
+ srcData1[i + 1] = 0; // 1: set green channel\r
+ srcData1[i + SET_TWO] = 0; // 2: set red channel\r
+ srcData1[i + SET_THREE] = OPA_OPAQUE; // 3: set alpha channel\r
+ }\r
+ imageInfo1_ = static_cast<ImageInfo *>(UIMalloc(sizeof(ImageInfo)));\r
+ if (imageInfo1_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new imageInfo1_ fail");\r
+ UIFree(srcData1);\r
+ return;\r
+ }\r
+\r
+ imageInfo1_->header.width = width;\r
+ imageInfo1_->header.height = height;\r
+ imageInfo1_->header.colorMode = ColorMode::ARGB8888;\r
+ imageInfo1_->dataSize = dataSize;\r
+ imageInfo1_->data = srcData1;\r
+\r
+ uint8_t *srcData2 = static_cast<uint8_t *>(UIMalloc(dataSize));\r
+ if (srcData2 == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::srcData2 fail");\r
+ UIFree(imageInfo1_);\r
+ UIFree(srcData1);\r
+ return;\r
+ }\r
+ for (uint32_t i = 0; i < dataSize; i += pixelByteSize) {\r
+ srcData2[i] = 0; // set blue channel\r
+ srcData2[i + 1] = SET_INT_MAX; // 1: set green channel 255: pixel value\r
+ srcData2[i + SET_TWO] = 0; // 2: set red channel\r
+ srcData2[i + SET_THREE] = OPA_OPAQUE; // 3: set alpha channel\r
+ }\r
+\r
+ imageInfo2_ = static_cast<ImageInfo *>(UIMalloc(sizeof(ImageInfo)));\r
+ if (imageInfo2_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new imageInfo2_ fail");\r
+ UIFree(srcData2);\r
+ UIFree(imageInfo1_);\r
+ UIFree(srcData1);\r
+ return;\r
+ }\r
+ imageInfo2_->header.width = width;\r
+ imageInfo2_->header.height = height;\r
+ imageInfo2_->header.colorMode = ARGB8888;\r
+ imageInfo2_->dataSize = dataSize;\r
+ imageInfo2_->data = srcData2;\r
+\r
+ uint8_t *srcData3 = static_cast<uint8_t *>(UIMalloc(dataSize));\r
+ if (srcData3 == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::srcData3 fail");\r
+ UIFree(imageInfo2_);\r
+ UIFree(srcData2);\r
+ UIFree(imageInfo1_);\r
+ UIFree(srcData1);\r
+ return;\r
+ }\r
+ for (uint32_t i = 0; i < dataSize; i += pixelByteSize) {\r
+ srcData3[i] = 0; // set blue channel\r
+ srcData3[i + 1] = 0; // 1: set green channel\r
+ srcData3[i + SET_TWO] = SET_INT_MAX; // 2: set red channel 255: pixel value\r
+ srcData3[i + SET_THREE] = OPA_OPAQUE; // 3: set alpha channel\r
+ }\r
+\r
+ imageInfo3_ = static_cast<ImageInfo *>(UIMalloc(sizeof(ImageInfo)));\r
+ if (imageInfo3_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneMainPage::new imageInfo3_ fail");\r
+ UIFree(srcData3);\r
+ UIFree(imageInfo2_);\r
+ UIFree(srcData2);\r
+ UIFree(imageInfo1_);\r
+ UIFree(srcData1);\r
+ return;\r
+ }\r
+ imageInfo3_->header.width = width;\r
+ imageInfo3_->header.height = height;\r
+ imageInfo3_->header.colorMode = ARGB8888;\r
+ imageInfo3_->dataSize = dataSize;\r
+ imageInfo3_->data = srcData3;\r
+\r
+ imageAnimatorImageInfo_[0].imageInfo = imageInfo1_;\r
+ imageAnimatorImageInfo_[0].pos = {FIND_PHONE_IMAGEANIMATOR_POSITION_X, FIND_PHONE_IMAGEANIMATOR_POSITION_Y};\r
+ imageAnimatorImageInfo_[0].width = FIND_PHONE_IMAGEANIMATOR_WIDTH; // 100: width value\r
+ imageAnimatorImageInfo_[0].height = FIND_PHONE_IMAGEANIMATOR_HEIGHT; // 100: height value\r
+ imageAnimatorImageInfo_[0].imageType = IMG_SRC_IMAGE_INFO;\r
+\r
+ imageAnimatorImageInfo_[1].imageInfo = imageInfo2_;\r
+ imageAnimatorImageInfo_[1].pos = {FIND_PHONE_IMAGEANIMATOR_POSITION_X, FIND_PHONE_IMAGEANIMATOR_POSITION_Y};\r
+ imageAnimatorImageInfo_[1].width = FIND_PHONE_IMAGEANIMATOR_WIDTH; // 100: width value\r
+ imageAnimatorImageInfo_[1].height = FIND_PHONE_IMAGEANIMATOR_HEIGHT; // 100: height value\r
+ imageAnimatorImageInfo_[1].imageType = IMG_SRC_IMAGE_INFO;\r
+\r
+ imageAnimatorImageInfo_[SET_TWO].imageInfo = imageInfo3_; // 2: image index\r
+ imageAnimatorImageInfo_[SET_TWO].pos = {FIND_PHONE_IMAGEANIMATOR_POSITION_X, FIND_PHONE_IMAGEANIMATOR_POSITION_Y};\r
+ imageAnimatorImageInfo_[SET_TWO].width = FIND_PHONE_IMAGEANIMATOR_WIDTH; // 2: image index, 100: width value\r
+ imageAnimatorImageInfo_[SET_TWO].height = FIND_PHONE_IMAGEANIMATOR_HEIGHT; // 2: image index, 100: height value\r
+ imageAnimatorImageInfo_[SET_TWO].imageType = IMG_SRC_IMAGE_INFO; // 2: image index\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FindPhoneModel\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include "ohos_timer.h"\r
+#include "wearable_log.h"\r
+#include "findphone/FindPhoneModel.h"\r
+#include "findphone/FindPhoneView.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint64_t CENTI_SECOND_UNIT = 100;\r
+static constexpr uint64_t MS_ONE_SECONDS = 1000;\r
+static constexpr uint16_t NUM_TEN = 10;\r
+static constexpr uint16_t NUM_TIME_MIN = 60;\r
+static constexpr uint16_t NUM_TIME_HOUR = 3600;\r
+static constexpr int32_t NUM_TIME_DAY = 86400;\r
+static constexpr int16_t MIN_TO_HOUR = 60;\r
+static constexpr int16_t HOURLY_SYSTEM = 24;\r
+FindPhoneModel::FindPhoneModel() {}\r
+\r
+FindPhoneModel::~FindPhoneModel() {}\r
+\r
+FindPhoneModel &FindPhoneModel::GetInstance()\r
+{\r
+ static FindPhoneModel instance;\r
+ return instance;\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FindPhonePresenter\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include "NativeRegisterManager.h"\r
+#include "uiservice/ui_service.h"\r
+#include "findphone/FindPhonePresenter.h"\r
+#include "findphone/FindPhoneModel.h"\r
+#include "findphone/FindPhoneView.h"\r
+\r
+namespace OHOS {\r
+REGIST_MENU(VIEW_FIND_PHONE, FindPhoneView, FindPhonePresenter, FINDPHONE_MAIN_ICON, FINDPHONE_MAIN_ICON, "查找手机");\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightBlinkPage\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#include "flashlight/FlashLightBlinkPage.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "SlicePageFactory.h"\r
+#include "flashlight/FlashLightView.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "NativeAbility.h"\r
+#include "flashlight/FlashLightModel.h"\r
+#include "main/LoadImg.h"\r
+#include "flashlight/FlashlightUiResourceImage.h"\r
+namespace OHOS {\r
+static const uint16_t BLINK_PICKER_POS_X = 106;\r
+static const uint16_t BLINK_PICKER_POS_Y = 113;\r
+static const uint16_t BLINK_PICKER_WIDTH = 254;\r
+static const uint16_t BLINK_PICKER_HEIGHT = 218;\r
+static const uint16_t BLINK_PICKER_BACKGROUND_FONT_SIZE = 38;\r
+static const uint16_t BLINK_PICKER_HIGHLIGHT_FONT_SIZE = 44;\r
+static const uint16_t BLINK_PICKER_ITEM_HEIGHT = 73;\r
+static const uint16_t BLINK_PICKER_NUM = 3;\r
+static const uint16_t BLINK_BUTTON_POS_X = 59;\r
+static const uint16_t BLINK_BUTTON_POS_Y = 358;\r
+static const uint16_t BLINK_BUTTON_WIDTH = 337;\r
+static const uint16_t BLINK_BUTTON_HEIGHT = 96;\r
+static const uint16_t BLINK_TEXT_POS_X = 100;\r
+static const uint16_t BLINK_TEXT_POS_Y = 38;\r
+static const uint16_t BLINK_TEXT_WIDTH = 253;\r
+static const uint16_t BLINK_TEXT_HEIGHT = 53;\r
+static const uint16_t BLINK_TEXT_FONT_SIZE = 38;\r
+static const std::string START_BLINK_BUTTON_ID = "startBlink";\r
+\r
+REGIST_SLICE_PAGE(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_BLINK_VIEW, FlashLightBlinkPage, false);\r
+void FlashLightBlinkPage::OnStart(void *data)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightBlinkPage::OnStart");\r
+ if (container_ == nullptr) {\r
+ container_ = new UIScrollView();\r
+ container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ container_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+ }\r
+\r
+ if (blinkLabel_ == nullptr) {\r
+ blinkLabel_ = new UILabel();\r
+ }\r
+ blinkLabel_->SetPosition(BLINK_TEXT_POS_X, BLINK_TEXT_POS_Y, BLINK_TEXT_WIDTH, BLINK_TEXT_HEIGHT);\r
+ blinkLabel_->SetText("闪烁频率");\r
+ blinkLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ blinkLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ blinkLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BLINK_TEXT_FONT_SIZE);\r
+ container_->Add(blinkLabel_);\r
+ blinkLabel_->SetVisible(true);\r
+\r
+ // Add Picker to App\r
+ if (blinkPicker_ == nullptr) {\r
+ blinkPicker_ = new UIPicker();\r
+ }\r
+ blinkPicker_->SetPosition(BLINK_PICKER_POS_X, BLINK_PICKER_POS_Y, BLINK_PICKER_WIDTH, BLINK_PICKER_HEIGHT);\r
+ blinkPicker_->SetViewId("uiPicker1");\r
+ blinkPicker_->SetBackgroundFont(DEFAULT_VECTOR_FONT_FILENAME, BLINK_PICKER_BACKGROUND_FONT_SIZE);\r
+ blinkPicker_->SetHighlightFont(DEFAULT_VECTOR_FONT_FILENAME, BLINK_PICKER_HIGHLIGHT_FONT_SIZE);\r
+ const char *uiPicker1Data[] = {"慢", "快", "不闪烁"};\r
+ blinkPicker_->SetValues(uiPicker1Data, BLINK_PICKER_NUM);\r
+ uint16_t selectBlink = FlashLightModel::GetInstance().GetBlinkFrequency();\r
+ blinkPicker_->SetSelected(selectBlink);\r
+ blinkPicker_->SetTextColor(Color::Gray(), Color::White());\r
+ blinkPicker_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ blinkPicker_->SetItemHeight(BLINK_PICKER_ITEM_HEIGHT);\r
+ container_->Add(blinkPicker_);\r
+ blinkPicker_->SetVisible(true);\r
+\r
+ // Add LabelButtonExt to App\r
+ if (blinkButton_ == nullptr) {\r
+ blinkButton_ = new UILabelButtonExt();\r
+ }\r
+ blinkButton_->SetPosition(BLINK_BUTTON_POS_X, BLINK_BUTTON_POS_Y, BLINK_BUTTON_WIDTH, BLINK_BUTTON_HEIGHT);\r
+ blinkButton_->SetViewId(START_BLINK_BUTTON_ID.c_str());\r
+ LOADIMG::LoadBtnImage(blinkButton_, FLASHLIGHT_IMAGE, IMAGE_CONVERTER_TOOL_BLINKBUTTON,\r
+ IMAGE_CONVERTER_TOOL_BLINKBUTTON);\r
+ blinkButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ blinkButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ container_->Add(blinkButton_);\r
+ blinkButton_->SetVisible(true);\r
+\r
+ blinkButton_->SetOnClickListener(this);\r
+ container_->SetOnDragListener(this);\r
+ AddViewToPageContainer(container_);\r
+}\r
+\r
+FlashLightBlinkPage::~FlashLightBlinkPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightBlinkPage::~FlashLightBlinkPage");\r
+ if (container_ != nullptr) {\r
+ container_->RemoveAll();\r
+ delete container_;\r
+ container_ = nullptr;\r
+ }\r
+ if (blinkLabel_ != nullptr) {\r
+ delete blinkLabel_;\r
+ blinkLabel_ = nullptr;\r
+ }\r
+ if (blinkPicker_ != nullptr) {\r
+ delete blinkPicker_;\r
+ blinkPicker_ = nullptr;\r
+ }\r
+ if (blinkButton_ != nullptr) {\r
+ delete blinkButton_;\r
+ blinkButton_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadSingleRes(FLASHLIGHT_IMAGE);\r
+}\r
+\r
+bool FlashLightBlinkPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightBlinkPage::OnDrag");\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_SET_VIEW);\r
+ }\r
+ return false;\r
+}\r
+\r
+bool FlashLightBlinkPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ std::string viewId = view.GetViewId();\r
+ uint16_t itemIndex = blinkPicker_->GetSelected();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightBlinkPage::OnClick [%s], itemIndex : [%d] ", viewId.c_str(),\r
+ itemIndex);\r
+ if (viewId == START_BLINK_BUTTON_ID) {\r
+ FlashLightModel::GetInstance().SetBlinkFrequency((FlashLightBlinkFrequency)itemIndex);\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
+ } else {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightBlinkPage::OnClick [Invalid]");\r
+ }\r
+ return false;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightColorPage\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#include "flashlight/FlashLightColorPage.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "SlicePageFactory.h"\r
+#include "flashlight/FlashLightView.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "NativeAbility.h"\r
+#include "flashlight/FlashLightModel.h"\r
+#include "main/LoadImg.h"\r
+#include "flashlight/FlashlightUiResourceImage.h"\r
+namespace OHOS {\r
+static const uint16_t COLOR_LABEL_POS_X = 100;\r
+static const uint16_t COLOR_LABEL_POS_Y = 38;\r
+static const uint16_t COLOR_LABEL_WIDTH = 253;\r
+static const uint16_t COLOR_LABEL_HEIGHT = 53;\r
+static const uint16_t COLOR_LABEL_FONT_SIZE = 38;\r
+static const uint16_t CONTAINER_BLANK_SIZE = 100;\r
+// 行坐标\r
+const uint16_t FIRST_ROW_COLOR_BUTTON_POS_Y = 104;\r
+const uint16_t SECOND_ROW_COLOR_BUTTON_POS_Y = 225;\r
+const uint16_t THIRD_ROW_COLOR_BUTTON_POS_Y = 346;\r
+// 列坐标\r
+const uint16_t FIRST_COLUMN_COLOR_BUTTON_POS_X = 46;\r
+const uint16_t SECOND_COLUMN_COLOR_BUTTON_POS_X = 169;\r
+const uint16_t THIRD_COLUMN_COLOR_BUTTON_POS_X = 290;\r
+// 按钮大小\r
+const uint16_t COLOR_BUTTON_WIDTH = 117;\r
+const uint16_t COLOR_BUTTON_HEIGHT = 117;\r
+static const uint32_t SELECT_COLOR_BUTTON_RES[10] = {\r
+ 0,\r
+ IMAGE_CONVERTER_TOOL_COLOR1PRESSBUTTON,\r
+ IMAGE_CONVERTER_TOOL_COLOR2PRESSBUTTON,\r
+ IMAGE_CONVERTER_TOOL_COLOR3PRESSBUTTON,\r
+ IMAGE_CONVERTER_TOOL_COLOR4PRESSBUTTON,\r
+ IMAGE_CONVERTER_TOOL_COLOR5PRESSBUTTON,\r
+ IMAGE_CONVERTER_TOOL_COLOR6PRESSBUTTON,\r
+ IMAGE_CONVERTER_TOOL_COLOR7PRESSBUTTON,\r
+ IMAGE_CONVERTER_TOOL_COLOR8PRESSBUTTON,\r
+ IMAGE_CONVERTER_TOOL_COLOR9PRESSBUTTON,\r
+};\r
+static const std::string COLOR1_BUTTON_ID = "color1Button";\r
+static const std::string COLOR2_BUTTON_ID = "color2Button";\r
+static const std::string COLOR3_BUTTON_ID = "color3Button";\r
+static const std::string COLOR4_BUTTON_ID = "color4Button";\r
+static const std::string COLOR5_BUTTON_ID = "color5Button";\r
+static const std::string COLOR6_BUTTON_ID = "color6Button";\r
+static const std::string COLOR7_BUTTON_ID = "color7Button";\r
+static const std::string COLOR8_BUTTON_ID = "color8Button";\r
+static const std::string COLOR9_BUTTON_ID = "color9Button";\r
+REGIST_SLICE_PAGE(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_COLOR_VIEW, FlashLightColorPage, false);\r
+void FlashLightColorPage::OnStart(void *data)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::OnStart");\r
+ uint32_t COLOR_BUTTON_RES[10] = {\r
+ 0,\r
+ IMAGE_CONVERTER_TOOL_COLOR1BUTTON,\r
+ IMAGE_CONVERTER_TOOL_COLOR2BUTTON,\r
+ IMAGE_CONVERTER_TOOL_COLOR3BUTTON,\r
+ IMAGE_CONVERTER_TOOL_COLOR4BUTTON,\r
+ IMAGE_CONVERTER_TOOL_COLOR5BUTTON,\r
+ IMAGE_CONVERTER_TOOL_COLOR6BUTTON,\r
+ IMAGE_CONVERTER_TOOL_COLOR7BUTTON,\r
+ IMAGE_CONVERTER_TOOL_COLOR8BUTTON,\r
+ IMAGE_CONVERTER_TOOL_COLOR9BUTTON,\r
+ };\r
+ uint16_t selectColor = (uint16_t)FlashLightModel::GetInstance().GetViewColor();\r
+ COLOR_BUTTON_RES[selectColor] = SELECT_COLOR_BUTTON_RES[selectColor];\r
+ if (container_ == nullptr) {\r
+ container_ = new UIScrollView();\r
+ container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ container_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+ container_->SetScrollBlankSize(CONTAINER_BLANK_SIZE, UIAbstractScroll::Direction::TOP);\r
+ container_->SetScrollBlankSize(CONTAINER_BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+ }\r
+\r
+ if (colorLabel_ == nullptr) {\r
+ colorLabel_ = new UILabel();\r
+ }\r
+ colorLabel_->SetPosition(COLOR_LABEL_POS_X, COLOR_LABEL_POS_Y, COLOR_LABEL_WIDTH, COLOR_LABEL_HEIGHT);\r
+ colorLabel_->SetText("灯光颜色");\r
+ colorLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ colorLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ colorLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, COLOR_LABEL_FONT_SIZE);\r
+ container_->Add(colorLabel_);\r
+ colorLabel_->SetVisible(true);\r
+ // 第一行颜色按钮\r
+ if (color1Button_ == nullptr) {\r
+ color1Button_ = new UILabelButtonExt();\r
+ }\r
+ color1Button_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X, FIRST_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
+ COLOR_BUTTON_HEIGHT);\r
+ color1Button_->SetViewId(COLOR1_BUTTON_ID.c_str());\r
+ color1Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ color1Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ color1Button_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ LOADIMG::LoadBtnImage(color1Button_, FLASHLIGHT_IMAGE, COLOR_BUTTON_RES[WHITE_COLOR], COLOR_BUTTON_RES[WHITE_COLOR]);\r
+ container_->Add(color1Button_);\r
+ color1Button_->SetVisible(true);\r
+\r
+ if (color2Button_ == nullptr) {\r
+ color2Button_ = new UILabelButtonExt();\r
+ }\r
+ color2Button_->SetPosition(SECOND_COLUMN_COLOR_BUTTON_POS_X, FIRST_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
+ COLOR_BUTTON_HEIGHT);\r
+ color2Button_->SetViewId(COLOR2_BUTTON_ID.c_str());\r
+ color2Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ color2Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ color2Button_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ LOADIMG::LoadBtnImage(color2Button_, FLASHLIGHT_IMAGE, COLOR_BUTTON_RES[RED_COLOR], COLOR_BUTTON_RES[RED_COLOR]);\r
+ container_->Add(color2Button_);\r
+ color2Button_->SetVisible(true);\r
+\r
+ if (color3Button_ == nullptr) {\r
+ color3Button_ = new UILabelButtonExt();\r
+ }\r
+ color3Button_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X, FIRST_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
+ COLOR_BUTTON_HEIGHT);\r
+ color3Button_->SetViewId(COLOR3_BUTTON_ID.c_str());\r
+ color3Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ color3Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ color3Button_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ LOADIMG::LoadBtnImage(color3Button_, FLASHLIGHT_IMAGE, COLOR_BUTTON_RES[ORANGE_COLOR],\r
+ COLOR_BUTTON_RES[ORANGE_COLOR]);\r
+ container_->Add(color3Button_);\r
+ color3Button_->SetVisible(true);\r
+\r
+ // 第二行颜色按钮\r
+ if (color4Button_ == nullptr) {\r
+ color4Button_ = new UILabelButtonExt();\r
+ }\r
+ color4Button_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X, SECOND_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
+ COLOR_BUTTON_HEIGHT);\r
+ color4Button_->SetViewId(COLOR4_BUTTON_ID.c_str());\r
+ color4Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ color4Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ color4Button_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ LOADIMG::LoadBtnImage(color4Button_, FLASHLIGHT_IMAGE, COLOR_BUTTON_RES[YELLOW_COLOR],\r
+ COLOR_BUTTON_RES[YELLOW_COLOR]);\r
+ container_->Add(color4Button_);\r
+ color4Button_->SetVisible(true);\r
+\r
+ if (color5Button_ == nullptr) {\r
+ color5Button_ = new UILabelButtonExt();\r
+ }\r
+ color5Button_->SetPosition(SECOND_COLUMN_COLOR_BUTTON_POS_X, SECOND_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
+ COLOR_BUTTON_HEIGHT);\r
+ color5Button_->SetViewId(COLOR5_BUTTON_ID.c_str());\r
+ color5Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ color5Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ color5Button_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ LOADIMG::LoadBtnImage(color5Button_, FLASHLIGHT_IMAGE, COLOR_BUTTON_RES[GREEN_COLOR], COLOR_BUTTON_RES[GREEN_COLOR]);\r
+ container_->Add(color5Button_);\r
+ color5Button_->SetVisible(true);\r
+\r
+ if (color6Button_ == nullptr) {\r
+ color6Button_ = new UILabelButtonExt();\r
+ }\r
+ color6Button_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X, SECOND_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
+ COLOR_BUTTON_HEIGHT);\r
+ color6Button_->SetViewId(COLOR6_BUTTON_ID.c_str());\r
+ color6Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ color6Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ color6Button_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ LOADIMG::LoadBtnImage(color6Button_, FLASHLIGHT_IMAGE, COLOR_BUTTON_RES[LIGHT_BLUE_COLOR],\r
+ COLOR_BUTTON_RES[LIGHT_BLUE_COLOR]);\r
+\r
+ container_->Add(color6Button_);\r
+ color6Button_->SetVisible(true);\r
+\r
+ // 第三行颜色按钮\r
+ if (color7Button_ == nullptr) {\r
+ color7Button_ = new UILabelButtonExt();\r
+ }\r
+ color7Button_->SetPosition(FIRST_COLUMN_COLOR_BUTTON_POS_X, THIRD_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
+ COLOR_BUTTON_HEIGHT);\r
+ color7Button_->SetViewId(COLOR7_BUTTON_ID.c_str());\r
+ color7Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ color7Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ color7Button_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ LOADIMG::LoadBtnImage(color7Button_, FLASHLIGHT_IMAGE, COLOR_BUTTON_RES[DARK_BLUE_COLOR],\r
+ COLOR_BUTTON_RES[DARK_BLUE_COLOR]);\r
+ container_->Add(color7Button_);\r
+ color7Button_->SetVisible(true);\r
+\r
+ if (color8Button_ == nullptr) {\r
+ color8Button_ = new UILabelButtonExt();\r
+ }\r
+ color8Button_->SetPosition(SECOND_COLUMN_COLOR_BUTTON_POS_X, THIRD_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
+ COLOR_BUTTON_HEIGHT);\r
+ color8Button_->SetViewId(COLOR8_BUTTON_ID.c_str());\r
+ color8Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ color8Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ color8Button_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ LOADIMG::LoadBtnImage(color8Button_, FLASHLIGHT_IMAGE, COLOR_BUTTON_RES[PURPLE_COLOR],\r
+ COLOR_BUTTON_RES[PURPLE_COLOR]);\r
+ container_->Add(color8Button_);\r
+ color8Button_->SetVisible(true);\r
+\r
+ if (color9Button_ == nullptr) {\r
+ color9Button_ = new UILabelButtonExt();\r
+ }\r
+ color9Button_->SetPosition(THIRD_COLUMN_COLOR_BUTTON_POS_X, THIRD_ROW_COLOR_BUTTON_POS_Y, COLOR_BUTTON_WIDTH,\r
+ COLOR_BUTTON_HEIGHT);\r
+ color9Button_->SetViewId(COLOR9_BUTTON_ID.c_str());\r
+ color9Button_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ color9Button_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ color9Button_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ LOADIMG::LoadBtnImage(color9Button_, FLASHLIGHT_IMAGE, COLOR_BUTTON_RES[MULTI_COLOR], COLOR_BUTTON_RES[MULTI_COLOR]);\r
+ container_->Add(color9Button_);\r
+ color9Button_->SetVisible(true);\r
+\r
+ // 设置界面组件回调函数\r
+ container_->SetOnDragListener(this);\r
+ // 设置手电筒多个颜色按钮回调函数\r
+ color3Button_->SetOnClickListener(this);\r
+ color1Button_->SetOnClickListener(this);\r
+ color2Button_->SetOnClickListener(this);\r
+ color6Button_->SetOnClickListener(this);\r
+ color5Button_->SetOnClickListener(this);\r
+ color4Button_->SetOnClickListener(this);\r
+ color9Button_->SetOnClickListener(this);\r
+ color8Button_->SetOnClickListener(this);\r
+ color7Button_->SetOnClickListener(this);\r
+ AddViewToPageContainer(container_);\r
+}\r
+\r
+FlashLightColorPage::~FlashLightColorPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::~FlashLightColorPage");\r
+ if (container_ != nullptr) {\r
+ container_->RemoveAll();\r
+ delete container_;\r
+ container_ = nullptr;\r
+ }\r
+ if (colorLabel_ != nullptr) {\r
+ delete colorLabel_;\r
+ colorLabel_ = nullptr;\r
+ }\r
+ if (color1Button_ != nullptr) {\r
+ delete color1Button_;\r
+ color1Button_ = nullptr;\r
+ }\r
+ if (color2Button_ != nullptr) {\r
+ delete color2Button_;\r
+ color2Button_ = nullptr;\r
+ }\r
+ if (color3Button_ != nullptr) {\r
+ delete color3Button_;\r
+ color3Button_ = nullptr;\r
+ }\r
+ if (color4Button_ != nullptr) {\r
+ delete color4Button_;\r
+ color4Button_ = nullptr;\r
+ }\r
+ if (color5Button_ != nullptr) {\r
+ delete color5Button_;\r
+ color5Button_ = nullptr;\r
+ }\r
+ if (color6Button_ != nullptr) {\r
+ delete color6Button_;\r
+ color6Button_ = nullptr;\r
+ }\r
+ if (color7Button_ != nullptr) {\r
+ delete color7Button_;\r
+ color7Button_ = nullptr;\r
+ }\r
+ if (color8Button_ != nullptr) {\r
+ delete color8Button_;\r
+ color8Button_ = nullptr;\r
+ }\r
+ if (color9Button_ != nullptr) {\r
+ delete color9Button_;\r
+ color9Button_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadSingleRes(FLASHLIGHT_IMAGE);\r
+}\r
+\r
+bool FlashLightColorPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::OnDrag");\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_SET_VIEW);\r
+ }\r
+ return false;\r
+}\r
+\r
+bool FlashLightColorPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ std::string viewId = view.GetViewId();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::OnClick [%s]", viewId.c_str());\r
+ if (viewId == COLOR1_BUTTON_ID) {\r
+ FlashLightModel::GetInstance().SetViewColor(FlashLightColorAttribute::WHITE_COLOR);\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
+ } else if (viewId == COLOR2_BUTTON_ID) {\r
+ FlashLightModel::GetInstance().SetViewColor(FlashLightColorAttribute::RED_COLOR);\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
+ } else if (viewId == COLOR3_BUTTON_ID) {\r
+ FlashLightModel::GetInstance().SetViewColor(FlashLightColorAttribute::ORANGE_COLOR);\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
+ } else if (viewId == COLOR4_BUTTON_ID) {\r
+ FlashLightModel::GetInstance().SetViewColor(FlashLightColorAttribute::YELLOW_COLOR);\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
+ } else if (viewId == COLOR5_BUTTON_ID) {\r
+ FlashLightModel::GetInstance().SetViewColor(FlashLightColorAttribute::GREEN_COLOR);\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
+ } else if (viewId == COLOR6_BUTTON_ID) {\r
+ FlashLightModel::GetInstance().SetViewColor(FlashLightColorAttribute::LIGHT_BLUE_COLOR);\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
+ } else if (viewId == COLOR7_BUTTON_ID) {\r
+ FlashLightModel::GetInstance().SetViewColor(FlashLightColorAttribute::DARK_BLUE_COLOR);\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
+ } else if (viewId == COLOR8_BUTTON_ID) {\r
+ FlashLightModel::GetInstance().SetViewColor(FlashLightColorAttribute::PURPLE_COLOR);\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
+ } else if (viewId == COLOR9_BUTTON_ID) {\r
+ FlashLightModel::GetInstance().SetViewColor(FlashLightColorAttribute::MULTI_COLOR);\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
+ } else {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::OnClick [Invalid]");\r
+ }\r
+ return false;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightDefaultPage\r
+ * Create: 2025-04-24\r
+ */\r
+#include "flashlight/FlashLightDefaultPage.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "SlicePageFactory.h"\r
+#include "flashlight/FlashLightView.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "NativeAbility.h"\r
+#include "flashlight/FlashLightModel.h"\r
+#include "main/LoadImg.h"\r
+#include "flashlight/FlashlightUiResourceImage.h"\r
+namespace OHOS {\r
+static const uint16_t RECOVER_LABEL_POS_X = 15;\r
+static const uint16_t RECOVER_LABEL_POS_Y = 185;\r
+static const uint16_t RECOVER_LABEL_WIDTH = 424;\r
+static const uint16_t RECOVER_LABEL_HEIGHT = 50;\r
+static const uint16_t RECOVER_LABEL_FONT_SIZE = 36;\r
+static const uint16_t CANCLE_BUTTON_POS_X = 115;\r
+static const uint16_t CANCLE_BUTTON_POS_Y = 300;\r
+static const uint16_t CONFIRM_BUTTON_POS_X = 255;\r
+static const uint16_t CONFIRM_BUTTON_POS_Y = 300;\r
+static const uint16_t CANCLE_BUTTON_WIDTH = 85;\r
+static const uint16_t CANCLE_BUTTON_HEIGHT = 85;\r
+static const std::string CANCLE_BUTTON_ID = "cancle";\r
+static const std::string CONFIRM_BUTTON_ID = "confirm";\r
+\r
+REGIST_SLICE_PAGE(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_DEFAULT_VIEW, FlashLightDefaultPage, false);\r
+void FlashLightDefaultPage::OnStart(void *data)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightDefaultPage::OnStart");\r
+ if (container_ == nullptr) {\r
+ container_ = new UIScrollView();\r
+ container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ container_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+ }\r
+\r
+ if (recoverLabel_ == nullptr) {\r
+ recoverLabel_ = new UILabel();\r
+ }\r
+ recoverLabel_->SetPosition(RECOVER_LABEL_POS_X, RECOVER_LABEL_POS_Y, RECOVER_LABEL_WIDTH, RECOVER_LABEL_HEIGHT);\r
+ recoverLabel_->SetText("是否恢复默认设置");\r
+ recoverLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ recoverLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ recoverLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, RECOVER_LABEL_FONT_SIZE);\r
+ // Add to rootView\r
+ container_->Add(recoverLabel_);\r
+ recoverLabel_->SetVisible(true);\r
+\r
+ if (cancelButton_ == nullptr) {\r
+ cancelButton_ = new UILabelButtonExt();\r
+ }\r
+ cancelButton_->SetPosition(CANCLE_BUTTON_POS_X, CANCLE_BUTTON_POS_Y, CANCLE_BUTTON_WIDTH, CANCLE_BUTTON_HEIGHT);\r
+ cancelButton_->SetViewId(CANCLE_BUTTON_ID.c_str());\r
+ LOADIMG::LoadBtnImage(cancelButton_, FLASHLIGHT_IMAGE, IMAGE_CONVERTER_TOOL_RECOVERCANCLE,\r
+ IMAGE_CONVERTER_TOOL_RECOVERCANCLE);\r
+ cancelButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ cancelButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ container_->Add(cancelButton_);\r
+ cancelButton_->SetVisible(true);\r
+\r
+ if (confirmButton_ == nullptr) {\r
+ confirmButton_ = new UILabelButtonExt();\r
+ }\r
+ confirmButton_->SetPosition(CONFIRM_BUTTON_POS_X, CONFIRM_BUTTON_POS_Y, CANCLE_BUTTON_WIDTH, CANCLE_BUTTON_HEIGHT);\r
+ confirmButton_->SetViewId(CONFIRM_BUTTON_ID.c_str());\r
+ LOADIMG::LoadBtnImage(confirmButton_, FLASHLIGHT_IMAGE, IMAGE_CONVERTER_TOOL_RECOVERCONFIRM,\r
+ IMAGE_CONVERTER_TOOL_RECOVERCONFIRM);\r
+ confirmButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ confirmButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ container_->Add(confirmButton_);\r
+ confirmButton_->SetVisible(true);\r
+\r
+ // 设置界面组件回调函数\r
+ container_->SetOnDragListener(this);\r
+ cancelButton_->SetOnClickListener(this);\r
+ confirmButton_->SetOnClickListener(this);\r
+ AddViewToPageContainer(container_);\r
+}\r
+\r
+FlashLightDefaultPage::~FlashLightDefaultPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightDefaultPage::~FlashLightDefaultPage");\r
+ if (container_ != nullptr) {\r
+ container_->RemoveAll();\r
+ delete container_;\r
+ container_ = nullptr;\r
+ }\r
+ if (recoverLabel_ != nullptr) {\r
+ delete recoverLabel_;\r
+ recoverLabel_ = nullptr;\r
+ }\r
+ if (cancelButton_ != nullptr) {\r
+ delete cancelButton_;\r
+ cancelButton_ = nullptr;\r
+ }\r
+ if (confirmButton_ != nullptr) {\r
+ delete confirmButton_;\r
+ confirmButton_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadSingleRes(FLASHLIGHT_IMAGE);\r
+}\r
+\r
+bool FlashLightDefaultPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::OnDrag");\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_SET_VIEW);\r
+ }\r
+ return false;\r
+}\r
+\r
+bool FlashLightDefaultPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ std::string viewId = view.GetViewId();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightDefaultPage::OnClick [%s]", viewId.c_str());\r
+ uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();\r
+ if (viewId == CONFIRM_BUTTON_ID) {\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGTH_VIEW);\r
+ FlashLightModel::GetInstance().SetDefault();\r
+ } else if (viewId == CANCLE_BUTTON_ID) {\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_SET_VIEW);\r
+ } else {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightDefaultPage::OnClick [Invalid]");\r
+ }\r
+ return false;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightModel\r
+ * Create: 2025-04-24\r
+ */\r
+#include "flashlight/FlashLightModel.h"\r
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\r
+\r
+namespace OHOS {\r
+static const uint32_t TIME_DISPLAY_NUM = 10;\r
+FlashLightModel::FlashLightModel(FlashLightColorAttribute color, FlashLightBlinkFrequency blinkFrequency)\r
+{\r
+ color_ = color;\r
+ blinkFrequency_ = blinkFrequency;\r
+}\r
+\r
+FlashLightModel::~FlashLightModel() {}\r
+\r
+FlashLightModel &FlashLightModel::GetInstance()\r
+{\r
+ static FlashLightModel instance;\r
+ return instance;\r
+}\r
+\r
+FlashLightColorAttribute FlashLightModel::GetViewColor()\r
+{\r
+ return color_;\r
+}\r
+\r
+void FlashLightModel::SetViewColor(FlashLightColorAttribute color)\r
+{\r
+ color_ = color;\r
+}\r
+\r
+FlashLightBlinkFrequency FlashLightModel::GetBlinkFrequency()\r
+{\r
+ return blinkFrequency_;\r
+}\r
+\r
+void FlashLightModel::SetBlinkFrequency(FlashLightBlinkFrequency blinkFrequency)\r
+{\r
+ blinkFrequency_ = blinkFrequency;\r
+}\r
+\r
+void FlashLightModel::SetDefault()\r
+{\r
+ blinkFrequency_ = FlashLightBlinkFrequency::NOT_BLINK; // 不闪烁;\r
+ color_ = FlashLightColorAttribute::WHITE_COLOR; // 白色;\r
+}\r
+\r
+uint32_t FlashLightModel::GetSysCurrentTime(std::string ¤tTime)\r
+{\r
+#ifdef _WIN32\r
+ struct tm localTime;\r
+ time_t timep;\r
+ gettimeofday(&sysTime_, NULL);\r
+ timep = (time_t)sysTime_.tv_sec;\r
+ localtime_r(&timep, &localTime);\r
+#else\r
+ struct tm localTime;\r
+ time64_t timep;\r
+ gettimeofday64(&sysTime_, NULL);\r
+ timep = (time64_t)sysTime_.tv_sec;\r
+ localtime64_r(&sysTime_.tv_sec, &localTime);\r
+#endif\r
+ if (localTime.tm_hour < TIME_DISPLAY_NUM) {\r
+ currentTime += "0";\r
+ }\r
+ currentTime += std::to_string(localTime.tm_hour) + ":";\r
+ if (localTime.tm_min < TIME_DISPLAY_NUM) {\r
+ currentTime += "0";\r
+ }\r
+ currentTime += std::to_string(localTime.tm_min);\r
+ return 0;\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightPage\r
+ * Create: 2025-04-24\r
+ */\r
+#include <string>\r
+#include "flashlight/FlashLightPage.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "flashlight/FlashLightModel.h"\r
+#include "SlicePageFactory.h"\r
+#include "flashlight/FlashLightView.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "main/LoadImg.h"\r
+#include "flashlight/FlashlightUiResourceImage.h"\r
+\r
+namespace OHOS {\r
+static const uint16_t SWITCH_BUTTON_POS_X = 168;\r
+static const uint16_t SWITCH_BUTTON_POS_Y = 168;\r
+static const uint16_t SWITCH_BUTTON_WIDTH = 119;\r
+static const uint16_t SWITCH_BUTTON_HEIGHT = 119;\r
+static const uint16_t SWITCH_LABEL_POS_X = 168;\r
+static const uint16_t SWITCH_LABEL_POS_Y = 308;\r
+static const uint16_t SWITCH_LABEL_WIDTH = 128;\r
+static const uint16_t SWITCH_LABEL_HEIGHT = 46;\r
+static const uint16_t SWITCH_LABEL_FONT_SIZE = 32;\r
+static const uint16_t TIME_LABEL_FONT_SIZE = 38;\r
+static const uint16_t IMAGE_VIEW_POS_X = 213;\r
+static const uint16_t IMAGE_VIEW_POS_Y = 414;\r
+static const uint16_t TIME_TEXT_POS_X = 151;\r
+static const uint16_t TIME_TEXT_POS_Y = 31;\r
+static const uint16_t TIME_TEXT_WIDTH = 153;\r
+static const uint16_t TIME_TEXT_HEIGHT = 53;\r
+static const uint16_t Y_OFFSET = 300;\r
+static const std::string SWITCH_BUTTON_ID = "switch";\r
+\r
+REGIST_SLICE_PAGE(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGTH_VIEW, FlashLightPage, true);\r
+void FlashLightPage::OnStart(void *data)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPage::OnStart");\r
+ if (container_ == nullptr) {\r
+ container_ = new UIScrollView();\r
+ container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ }\r
+\r
+ if (OnLabel_ == nullptr) {\r
+ OnLabel_ = new UILabel();\r
+ }\r
+ OnLabel_->SetPosition(SWITCH_LABEL_POS_X, SWITCH_LABEL_POS_Y, SWITCH_LABEL_WIDTH, SWITCH_LABEL_HEIGHT);\r
+ OnLabel_->SetText("点击照明");\r
+ OnLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ OnLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SWITCH_LABEL_FONT_SIZE);\r
+ OnLabel_->SetStyle(STYLE_BACKGROUND_COLOR, OPA_OPAQUE);\r
+ OnLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ OnLabel_->SetVisible(true);\r
+ container_->Add(OnLabel_);\r
+\r
+ if (flashLightOn_ == nullptr) {\r
+ flashLightOn_ = new UILabelButton();\r
+ }\r
+ flashLightOn_->SetPosition(SWITCH_BUTTON_POS_X, SWITCH_BUTTON_POS_Y, SWITCH_BUTTON_WIDTH, SWITCH_BUTTON_HEIGHT);\r
+ flashLightOn_->SetViewId(SWITCH_BUTTON_ID.c_str());\r
+ flashLightOn_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ flashLightOn_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ LOADIMG::LoadBtnImage(flashLightOn_, FLASHLIGHT_IMAGE, IMAGE_CONVERTER_TOOL_FLASHLIGHTON,\r
+ IMAGE_CONVERTER_TOOL_FLASHLIGHTON);\r
+ flashLightOn_->SetVisible(true);\r
+ container_->Add(flashLightOn_);\r
+\r
+ // 创建时间显示组件\r
+ if (systemTime_ == nullptr) {\r
+ systemTime_ = new UILabel();\r
+ }\r
+ systemTime_->SetPosition(TIME_TEXT_POS_X, TIME_TEXT_POS_Y, TIME_TEXT_WIDTH, TIME_TEXT_HEIGHT);\r
+ systemTime_->SetText("12:00");\r
+ systemTime_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ systemTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TIME_LABEL_FONT_SIZE);\r
+ systemTime_->SetStyle(STYLE_BACKGROUND_COLOR, OPA_OPAQUE);\r
+ systemTime_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ systemTime_->SetVisible(true);\r
+ container_->Add(systemTime_);\r
+ if (timeCallback_ == nullptr) {\r
+ timeCallback_ = new TimeAnimatorCallback();\r
+ }\r
+ if (timeAnimator_ == nullptr) {\r
+ timeAnimator_ = new Animator(timeCallback_, systemTime_, 0, true);\r
+ }\r
+ timeAnimator_->Start();\r
+\r
+ // Add ImageView to App\r
+ if (imageArrow_ == nullptr) {\r
+ imageArrow_ = new UIImageView();\r
+ }\r
+ imageArrow_->SetPosition(IMAGE_VIEW_POS_X, IMAGE_VIEW_POS_Y);\r
+ container_->Add(imageArrow_);\r
+ imageArrow_->SetVisible(true);\r
+ LOADIMG::LoadImageViewImg(imageArrow_, FLASHLIGHT_IMAGE, IMAGE_CONVERTER_TOOL_DOWNARROW);\r
+\r
+ flashLightOn_->SetOnClickListener(this);\r
+ container_->SetOnDragListener(this);\r
+ AddViewToPageContainer(container_);\r
+}\r
+\r
+FlashLightPage::~FlashLightPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPage::~FlashLightPage");\r
+ if (timeAnimator_ != nullptr) {\r
+ timeAnimator_->Stop();\r
+ }\r
+ if (container_ != nullptr) {\r
+ container_->RemoveAll();\r
+ delete container_;\r
+ container_ = nullptr;\r
+ }\r
+ if (flashLightOn_ != nullptr) {\r
+ delete flashLightOn_;\r
+ flashLightOn_ = nullptr;\r
+ }\r
+ if (systemTime_ != nullptr) {\r
+ delete systemTime_;\r
+ systemTime_ = nullptr;\r
+ }\r
+ if (imageArrow_ != nullptr) {\r
+ delete imageArrow_;\r
+ imageArrow_ = nullptr;\r
+ }\r
+ if (timeAnimator_ != nullptr) {\r
+ delete timeAnimator_;\r
+ timeAnimator_ = nullptr;\r
+ }\r
+ if (timeCallback_ != nullptr) {\r
+ delete timeCallback_;\r
+ timeCallback_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadSingleRes(FLASHLIGHT_IMAGE);\r
+}\r
+\r
+bool FlashLightPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::OnDrag");\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+ } else if ((event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP) &&\r
+ (event.GetStartPoint().y > Y_OFFSET)) {\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_SET_VIEW);\r
+ }\r
+ return false;\r
+}\r
+\r
+bool FlashLightPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ std::string viewId = view.GetViewId();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPage::OnClick [%s]", viewId.c_str());\r
+ if (viewId == SWITCH_BUTTON_ID) {\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW);\r
+ } else {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPage::OnClick [Invalid]");\r
+ }\r
+ return false;\r
+}\r
+\r
+void FlashLightPage::TimeAnimatorCallback::Callback(UIView *view)\r
+{\r
+ UILabel *timeLabel = dynamic_cast<UILabel *>(view);\r
+ if (timeLabel == nullptr) {\r
+ return;\r
+ }\r
+ std::string currTime;\r
+ FlashLightModel::GetInstance().GetSysCurrentTime(currTime);\r
+ timeLabel->SetText(currTime.c_str());\r
+ timeLabel->Invalidate();\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightPlayPage\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#include "flashlight/FlashLightPlayPage.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "SlicePageFactory.h"\r
+#include "flashlight/FlashLightView.h"\r
+#include "wearable_log.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "main/LoadImg.h"\r
+\r
+namespace OHOS {\r
+static const uint32_t FLASHLIGHT_PAGE_RES[10] = {\r
+ IMAGE_CONVERTER_TOOL_PLAYBLACKPAGE, IMAGE_CONVERTER_TOOL_PLAY1PAGE, IMAGE_CONVERTER_TOOL_PLAY2PAGE,\r
+ IMAGE_CONVERTER_TOOL_PLAY3PAGE, IMAGE_CONVERTER_TOOL_PLAY4PAGE, IMAGE_CONVERTER_TOOL_PLAY5PAGE,\r
+ IMAGE_CONVERTER_TOOL_PLAY6PAGE, IMAGE_CONVERTER_TOOL_PLAY7PAGE, IMAGE_CONVERTER_TOOL_PLAY8PAGE,\r
+ IMAGE_CONVERTER_TOOL_PLAY9PAGE,\r
+};\r
+static const uint32_t FLASHLIGHT_BLINK_FREQ[3] = {500, 100, 0};\r
+static const uint32_t IMAGE_NUM = 2;\r
+static const std::string PLAY_VIEW_ID = "flashLightPlayPage";\r
+\r
+REGIST_SLICE_PAGE(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_PLAY_VIEW, FlashLightPlayPage, false);\r
+void FlashLightPlayPage::OnStart(void *data)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPlayPage::OnStart");\r
+ if (container_ == nullptr) {\r
+ container_ = new UIScrollView();\r
+ container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ container_->SetViewId(PLAY_VIEW_ID.c_str());\r
+ }\r
+ uint16_t colorIndex = (uint16_t)FlashLightModel::GetInstance().GetViewColor();\r
+ uint16_t blinkIndex = (uint16_t)FlashLightModel::GetInstance().GetBlinkFrequency();\r
+ if (playImageAnimal == nullptr) {\r
+ playImageAnimal = new UIImageAnimatorView();\r
+ }\r
+ playImageInfo[0].imageInfo =\r
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(FLASHLIGHT_PAGE_RES[colorIndex], FLASHLIGHT_IMAGE);\r
+ playImageInfo[0].imageType = IMG_SRC_IMAGE_INFO;\r
+ playImageInfo[0].pos.x = 0;\r
+ playImageInfo[0].pos.y = 0;\r
+ playImageInfo[0].width = HORIZONTAL_RESOLUTION;\r
+ playImageInfo[0].height = VERTICAL_RESOLUTION;\r
+ playImageInfo[1].imageInfo =\r
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(FLASHLIGHT_PAGE_RES[0], FLASHLIGHT_IMAGE);\r
+ playImageInfo[1].imageType = IMG_SRC_IMAGE_INFO;\r
+ playImageInfo[1].pos.x = 0;\r
+ playImageInfo[1].pos.y = 0;\r
+ playImageInfo[1].width = HORIZONTAL_RESOLUTION;\r
+ playImageInfo[1].height = VERTICAL_RESOLUTION;\r
+ playImageAnimal->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ playImageAnimal->SetImageAnimatorSrc(playImageInfo, IMAGE_NUM, FLASHLIGHT_BLINK_FREQ[blinkIndex]);\r
+ playImageAnimal->SetRepeat(true);\r
+ playImageAnimal->SetAutoEnable(false);\r
+ playImageAnimal->SetResizeMode(UIImageView::FILL);\r
+ container_->Add(playImageAnimal);\r
+\r
+ playImageAnimal->Start();\r
+ container_->SetOnDragListener(this);\r
+ container_->SetOnClickListener(this);\r
+ AddViewToPageContainer(container_);\r
+}\r
+\r
+FlashLightPlayPage::~FlashLightPlayPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPlayPage::~FlashLightPlayPage");\r
+ if (container_ != nullptr) {\r
+ container_->RemoveAll();\r
+ delete container_;\r
+ container_ = nullptr;\r
+ }\r
+ if (playImageAnimal != nullptr) {\r
+ playImageAnimal->Stop();\r
+ delete playImageAnimal;\r
+ playImageAnimal = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadSingleRes(FLASHLIGHT_IMAGE);\r
+}\r
+\r
+bool FlashLightPlayPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ std::string id = view.GetViewId();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::OnDrag [%s]", id.c_str());\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+ }\r
+ return false;\r
+}\r
+\r
+bool FlashLightPlayPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ std::string viewId = view.GetViewId();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightPlayPage::OnClick [%s]", viewId.c_str());\r
+ if (viewId == PLAY_VIEW_ID) {\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGTH_VIEW);\r
+ }\r
+ return false;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightPresenter\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#include "flashlight/FlashLightView.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "NativeRegisterManager.h"\r
+\r
+namespace OHOS {\r
+REGIST_MENU(VIEW_FLASHLIGHT, FlashLightView, FlashLightPresenter, FLASHLIGHT_MAIN_ICON, PNG_APPLIST_DEFAULT_IMG,\r
+ "手电筒");\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightSetItemAdapter.cpp\r
+ * Create: 2025-11-23\r
+ */\r
+#include "flashlight/FlashLightSetItemAdapter.h"\r
+#include "flashlight/FlashLightSetItemView.h"\r
+\r
+namespace OHOS {\r
+FlashLightSetItemAdapter::FlashLightSetItemAdapter() {}\r
+\r
+FlashLightSetItemAdapter::~FlashLightSetItemAdapter()\r
+{\r
+ itemDatas_.Clear();\r
+}\r
+\r
+uint16_t FlashLightSetItemAdapter::GetCount(void)\r
+{\r
+ return itemDatas_.Size();\r
+}\r
+\r
+void FlashLightSetItemAdapter::SetData(const Graphic::Vector<FlashLightSetItem> &data)\r
+{\r
+ if (!itemDatas_.IsEmpty()) {\r
+ itemDatas_.Clear();\r
+ }\r
+ itemDatas_ = data;\r
+}\r
+\r
+UIView *FlashLightSetItemAdapter::GetView(UIView *inView, int16_t index)\r
+{\r
+ if (itemDatas_.IsEmpty()) {\r
+ return nullptr;\r
+ }\r
+\r
+ if (index >= itemDatas_.Size() || index < 0) {\r
+ return nullptr;\r
+ }\r
+\r
+ FlashLightSetItem itemData = itemDatas_[index];\r
+ FlashLightSetItemView *item = nullptr;\r
+ if (inView == nullptr) {\r
+ item = new FlashLightSetItemView();\r
+ } else {\r
+ item = static_cast<FlashLightSetItemView *>(inView);\r
+ }\r
+ item->SetItemInfo(itemData);\r
+ item->SetViewId(itemData.label.c_str());\r
+ item->SetOnClickListener(itemClickListener);\r
+ return item;\r
+}\r
+\r
+void FlashLightSetItemAdapter::AddListItem(const FlashLightSetItem &item)\r
+{\r
+ itemDatas_.PushBack(item);\r
+}\r
+} // namespace OHOS\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightSetItemView\r
+ * Create: 2025-02-15\r
+ */\r
+\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "flashlight/FlashLightSetItemView.h"\r
+#include "screensetting/ScreenModels.h"\r
+#include "main/LoadImg.h"\r
+#include "flashlight/FlashLightModel.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t ITEM_X = 0;\r
+static constexpr uint16_t ITEM_Y = 0;\r
+static constexpr uint16_t ITEM_W = 340;\r
+static constexpr uint16_t ITEM_H = 122;\r
+static constexpr uint16_t ICON_X = 0;\r
+static constexpr uint16_t ICON_Y = 10;\r
+static constexpr uint16_t LABEL_X = 109;\r
+static constexpr uint16_t LABEL_Y = 0;\r
+static constexpr uint16_t LABEL_W = 172;\r
+static constexpr uint16_t LABEL_H = 53;\r
+static constexpr uint16_t LABEL_FONT = 38;\r
+static constexpr uint16_t IMAGE_X = 315;\r
+static constexpr uint16_t IMAGE_Y = 33;\r
+static constexpr uint16_t ITEM_LABEL_X = 109;\r
+static constexpr uint16_t ITEM_LABEL_Y = 52;\r
+static constexpr uint16_t ITEM_LABEL_W = 172;\r
+static constexpr uint16_t ITEM_LABEL_H = 46;\r
+static constexpr uint16_t ITEM_LABEL_FONT = 32;\r
+\r
+FlashLightSetItemView::FlashLightSetItemView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightSetItemView");\r
+ SetPosition(ITEM_X, ITEM_Y, ITEM_W, ITEM_H);\r
+ SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ SetTouchable(true);\r
+\r
+ sIcon.SetPosition(ICON_X, ICON_Y);\r
+ sIcon.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
+\r
+ sLabel.SetPosition(LABEL_X, LABEL_Y);\r
+ sLabel.Resize(LABEL_W, LABEL_H);\r
+ sLabel.SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+ sLabel.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ sLabel.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ sLabel.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ sLabel.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ sLabel.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+\r
+ itemLabel.SetPosition(ITEM_LABEL_X, ITEM_LABEL_Y);\r
+ itemLabel.Resize(ITEM_LABEL_W, ITEM_LABEL_H);\r
+ itemLabel.SetFont(DEFAULT_VECTOR_FONT_FILENAME, ITEM_LABEL_FONT);\r
+ itemLabel.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ itemLabel.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ itemLabel.SetStyle(STYLE_TEXT_COLOR, Color::Gray().full);\r
+ itemLabel.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ itemLabel.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+\r
+ sNextImage.SetPosition(IMAGE_X, IMAGE_Y);\r
+ sNextImage.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
+ LOADIMG::LoadImageViewImg(&sNextImage, FLASHLIGHT_IMAGE, IMAGE_CONVERTER_TOOL_RIGHTARROW);\r
+\r
+ Add(&sIcon);\r
+ Add(&sLabel);\r
+ Add(&itemLabel);\r
+ Add(&sNextImage);\r
+}\r
+\r
+FlashLightSetItemView::~FlashLightSetItemView()\r
+{\r
+ Remove(&sIcon);\r
+ Remove(&sLabel);\r
+ Remove(&itemLabel);\r
+ Remove(&sNextImage);\r
+ ImageCacheManager::GetInstance().UnloadSingleRes(FLASHLIGHT_IMAGE);\r
+}\r
+\r
+void FlashLightSetItemView::SetItemInfo(const FlashLightSetItem itemInfo)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightSetItemView::SetItemInfo %[s]", itemInfo.viewId.c_str());\r
+ sItemInfo = itemInfo;\r
+ sLabel.SetText(itemInfo.label.c_str());\r
+ itemLabel.SetText(itemInfo.itemLabel.c_str());\r
+ LOADIMG::LoadImageViewImg(&sIcon, FLASHLIGHT_IMAGE, itemInfo.resId);\r
+}\r
+\r
+const char *FlashLightSetItemView::GetViewId() const\r
+{\r
+ return sItemInfo.viewId.c_str();\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightSetPage\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#include "flashlight/FlashLightSetPage.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "SlicePageFactory.h"\r
+#include "flashlight/FlashLightView.h"\r
+#include "flashlight/FlashLightModel.h"\r
+#include "AppViewIDs.h"\r
+#include "wearable_log.h"\r
+#include "NativeAbility.h"\r
+#include <iostream>\r
+#include "main/LoadImg.h"\r
+\r
+namespace OHOS {\r
+\r
+static const uint16_t SET_LABEL_POS_X = 117;\r
+static const uint16_t SET_LABEL_POS_Y = 31;\r
+static const uint16_t SET_LABEL_WIDTH = 220;\r
+static const uint16_t SET_LABEL_HEIGHT = 53;\r
+static const uint16_t SET_LABEL_FONT_SIZE = 38;\r
+static const uint16_t SET_LIST_POS_X = 59;\r
+static const uint16_t SET_LIST_POS_Y = 127;\r
+static const uint16_t SET_LIST_WIDTH = 340;\r
+static const uint16_t SET_LIST_HEIGHT = 244;\r
+static const uint16_t RECOVER_BUTTON_POS_X = 120;\r
+static const uint16_t RECOVER_BUTTON_POS_Y = 408;\r
+static const uint16_t RECOVER_BUTTON_WIDTH = 220;\r
+static const uint16_t RECOVER_BUTTON_HEIGHT = 80;\r
+static const uint16_t RECOVER_BUTTON_FONT_SIZE = 36;\r
+static const uint16_t CONTAINER_BLANK_SIZE = 100;\r
+static const std::string COLOR__BUTTON_ID = "setColorItem";\r
+static const std::string BLINK_BUTTON_ID = "setBlinkItem";\r
+static const std::string RECOVER_BUTTON_ID = "recoverDefault";\r
+static std::string BLINK_ITEM_CONTENT[3] = {"慢", "快", "不闪烁"};\r
+static std::string COLOR_ITEM_CONTENT[10] = {"黑色", "白色", "红色", "橙色", "黄色",\r
+ "绿色", "浅蓝色", "深蓝色", "紫色", "彩色"};\r
+\r
+REGIST_SLICE_PAGE(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_SET_VIEW, FlashLightSetPage, false);\r
+void FlashLightSetPage::OnStart(void *data)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightSetPage::OnStart");\r
+ if (container_ == nullptr) {\r
+ container_ = new UIScrollView();\r
+ container_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ container_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+ container_->SetScrollBlankSize(CONTAINER_BLANK_SIZE, UIAbstractScroll::Direction::TOP);\r
+ container_->SetScrollBlankSize(CONTAINER_BLANK_SIZE, UIAbstractScroll::Direction::BOTTOM);\r
+ }\r
+\r
+ if (setLabel_ == nullptr) {\r
+ setLabel_ = new UILabel();\r
+ }\r
+ setLabel_->SetPosition(SET_LABEL_POS_X, SET_LABEL_POS_Y, SET_LABEL_WIDTH, SET_LABEL_HEIGHT);\r
+ setLabel_->SetText("手电筒设置");\r
+ setLabel_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ setLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ setLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SET_LABEL_FONT_SIZE);\r
+ container_->Add(setLabel_);\r
+ setLabel_->SetVisible(true);\r
+\r
+ if (setItemList_ == nullptr) {\r
+ setItemList_ = new UIList();\r
+ }\r
+ setItemList_->SetPosition(SET_LIST_POS_X, SET_LIST_POS_Y, SET_LIST_WIDTH, SET_LIST_HEIGHT);\r
+ setItemList_->SetLoopState(false);\r
+ setItemList_->EnableAutoAlign(true);\r
+ if (setItemAdapter_ == nullptr) {\r
+ setItemAdapter_ = new FlashLightSetItemAdapter();\r
+ }\r
+ uint16_t colorIndex = (uint16_t)FlashLightModel::GetInstance().GetViewColor();\r
+ uint16_t blinkIndex = (uint16_t)FlashLightModel::GetInstance().GetBlinkFrequency();\r
+ colorItem_.itemLabel = COLOR_ITEM_CONTENT[colorIndex];\r
+ colorItem_.viewId = COLOR__BUTTON_ID;\r
+ blinkItem_.itemLabel = BLINK_ITEM_CONTENT[blinkIndex];\r
+ blinkItem_.viewId = BLINK_BUTTON_ID;\r
+ setItemAdapter_->AddListItem(colorItem_);\r
+ setItemAdapter_->AddListItem(blinkItem_);\r
+ setItemAdapter_->SetItemClickListener(this);\r
+ setItemList_->SetAdapter(setItemAdapter_);\r
+ container_->Add(setItemList_);\r
+ setItemList_->SetVisible(true);\r
+\r
+ if (recoverButton_ == nullptr) {\r
+ recoverButton_ = new UILabelButtonExt();\r
+ }\r
+ recoverButton_->SetPosition(RECOVER_BUTTON_POS_X, RECOVER_BUTTON_POS_Y, RECOVER_BUTTON_WIDTH,\r
+ RECOVER_BUTTON_HEIGHT);\r
+ recoverButton_->SetViewId(RECOVER_BUTTON_ID.c_str());\r
+ recoverButton_->SetText("恢复默认\n");\r
+ recoverButton_->SetTextColor(Color::Red());\r
+ recoverButton_->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ recoverButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, RECOVER_BUTTON_FONT_SIZE);\r
+ LOADIMG::LoadBtnImage(recoverButton_, FLASHLIGHT_IMAGE, IMAGE_CONVERTER_TOOL_RECOVERBUTTON,\r
+ IMAGE_CONVERTER_TOOL_RECOVERBUTTON);\r
+ recoverButton_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ recoverButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::PRESSED);\r
+ container_->Add(recoverButton_);\r
+ recoverButton_->SetVisible(true);\r
+\r
+ // 设置界面组件回调函数\r
+ container_->SetOnDragListener(this);\r
+ recoverButton_->SetOnClickListener(this);\r
+ AddViewToPageContainer(container_);\r
+}\r
+\r
+FlashLightSetPage::~FlashLightSetPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightSetPage::~FlashLightSetPage");\r
+ if (container_ != nullptr) {\r
+ container_->RemoveAll();\r
+ delete container_;\r
+ container_ = nullptr;\r
+ }\r
+ if (setLabel_ != nullptr) {\r
+ delete setLabel_;\r
+ setLabel_ = nullptr;\r
+ }\r
+ if (recoverButton_ != nullptr) {\r
+ delete recoverButton_;\r
+ recoverButton_ = nullptr;\r
+ }\r
+ if (setItemList_ != nullptr) {\r
+ delete setItemList_;\r
+ setItemList_ = nullptr;\r
+ }\r
+ if (setItemAdapter_ != nullptr) {\r
+ delete setItemAdapter_;\r
+ setItemAdapter_ = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadSingleRes(FLASHLIGHT_IMAGE);\r
+}\r
+\r
+bool FlashLightSetPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FlashLightColorPage::OnDrag");\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGTH_VIEW);\r
+ }\r
+ return false;\r
+}\r
+\r
+bool FlashLightSetPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ uint8_t viewType = view.GetViewType();\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FlashLightSetPage::OnClick [%d]", viewType);\r
+ if (viewType == UIViewType::UI_VIEW_GROUP) {\r
+ FlashLightSetItemView *itemView = static_cast<FlashLightSetItemView *>(&view);\r
+ std::string viewId = itemView->GetViewId();\r
+ if (viewId == COLOR__BUTTON_ID) {\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_COLOR_VIEW);\r
+ } else if (viewId == BLINK_BUTTON_ID) {\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_BLINK_VIEW);\r
+ }\r
+ } else if (viewType == UIViewType::UI_LABEL_BUTTON_EXT && view.GetViewId() == RECOVER_BUTTON_ID) {\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_FLASHLIGHT, FlashLightAllView::FLASH_LIGHT_DEFAULT_VIEW);\r
+ } else {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FlashLightSetPage::OnClick [Invalid]");\r
+ }\r
+ return false;\r
+}\r
+}
\ No newline at end of file
-#include "HeartModel.h"\r
+#include "heartrate/HeartModel.h"\r
#include "wearable_log.h"\r
#include "graphic_service.h"\r
-#include "IndoorWalkPreparedView.h"\r
-#include "IndoorWalkPresenter.h"\r
-#include "MainViewSample.h"\r
-#include "HeartRateView.h"\r
+#include "indoorwalk/IndoorWalkPreparedView.h"\r
+#include "indoorwalk/IndoorWalkPresenter.h"\r
+#include "main/MainViewSample.h"\r
+#include "heartrate/HeartRateView.h"\r
\r
#ifdef __cplusplus\r
extern "C" {\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[Notify] malloc fail");\r
}\r
\r
- int rets = memcpy_s(heartInfo, sizeof(HeartDatas), (HeartInfo*)request->data, request->len);\r
+ int rets = memcpy_s(heartInfo, sizeof(HeartDatas), (HeartDatas*)request->data, request->len);\r
if (rets != EOK) {\r
free(heartInfo);\r
heartInfo = nullptr;\r
*/\r
\r
#include <securec.h>\r
-#include "HeartRateView.h"\r
+#include "heartrate/HeartRateView.h"\r
#include "common/screen.h"\r
#include "UiConfig.h"\r
-#include "ScreenModels.h"\r
+#include "screensetting/ScreenModels.h"\r
#include "ui_resource_image.h"\r
#include "common/image_cache_manager.h"\r
\r
#include <ctime>\r
#include <cstdio>\r
#include "ohos_types.h"\r
-#include "RtcService.h"\r
+#include "rtcservice/RtcService.h"\r
#include "samgr_lite.h"\r
\r
namespace OHOS {\r
uint32 GetStepCounter(void);\r
void ReviseStepCounter(uint32 &counter);\r
void GetStepData(const StepDataDistribute &type, uint32_t *value);\r
- void SetStepData(uint32_t &value);\r
+ void SetStepData(const uint32_t &value);\r
void SaveStepToFile(struct tm *tm_data);\r
int GetWeekToday(void);\r
uint32 GetLastSavedValue(void);\r
\r
#include <ctime>\r
#include "Presenter.h"\r
-#include "MainActivityView.h"\r
+#include "activity/MainActivityView.h"\r
\r
namespace OHOS {\r
static constexpr const char *ACTIVITY_WEEK_VIEW = "activityweekview";\r
#include "UiConfig.h"\r
#include "wearable_log.h"\r
#include "components/ui_card_page.h"\r
-#include "ActivityModel.h"\r
+#include "activity/ActivityModel.h"\r
\r
namespace OHOS {\r
#define DAYS 7\r
#include "font/ui_font_bitmap.h"\r
#include "font/ui_font.h"\r
#include "graphic_config.h"\r
-#include "ModelListenerSample.h"\r
-#include "ActivityModel.h"\r
-#include "ActivityPresenter.h"\r
-#include "ActivityWeekView.h"\r
+#include "main/ModelListenerSample.h"\r
+#include "activity/ActivityModel.h"\r
+#include "activity/ActivityPresenter.h"\r
+#include "activity/ActivityWeekView.h"\r
\r
namespace OHOS {\r
class ActivityPresenter;\r
#include "components/abstract_adapter.h"
#include "UiConfig.h"
#include "wearable_log.h"
-#include "AddCardItem.h"
+#include "add_card/AddCardItem.h"
namespace OHOS {
class AddCardAdapter : public AbstractAdapter {
#include <map>
#include "AppViewIDs.h"
#include "UiConfig.h"
-#include "AddCardPresenter.h"
-#include "MainModel.h"
+#include "add_card/AddCardPresenter.h"
+#include "main/MainModel.h"
namespace OHOS {
class AddCardModel {
#include "Presenter.h"
#include "components/ui_list.h"
#include "components/ui_view.h"
-#include "ModelListenerSample.h"
+#include "main/ModelListenerSample.h"
#define TOAST_KEEP_TIME 1000
#include "components/ui_toggle_button.h"
#include "ChangeSliceListener.h"
#include "UiConfig.h"
-#include "AddCardAdapter.h"
-#include "AddCardModel.h"
+#include "add_card/AddCardAdapter.h"
+#include "add_card/AddCardModel.h"
namespace OHOS {
class AddCardPresenter;
\r
#include "ohos_types.h"\r
#include "list.h"\r
-#include "AlmmgrAlarmClockManage.h"\r
+#include "alarmclockmanage/AlmmgrAlarmClockManage.h"\r
#include "player.h"\r
#include "source.h"\r
#include "broadcast_feature.h"\r
#include "components/ui_button.h"\r
#include "components/ui_label_button.h"\r
#include "UiConfig.h"\r
-#include "AlarmClockModel.h"\r
+#include "alarm/AlarmClockModel.h"\r
#include "ChangeSliceListener.h"\r
\r
namespace OHOS {\r
#include "font/ui_font.h"\r
#include "common/screen.h"\r
#include "gfx_utils/graphic_log.h"\r
-#include "AlarmClockModel.h"\r
+#include "alarm/AlarmClockModel.h"\r
\r
namespace OHOS {\r
class AlarmConfigView {\r
#include "layout/grid_layout.h"\r
#include "font/ui_font.h"\r
#include "common/screen.h"\r
-#include "AlarmPresenter.h"\r
-#include "AlarmClockModel.h"\r
+#include "alarm/AlarmPresenter.h"\r
+#include "alarm/AlarmClockModel.h"\r
\r
namespace OHOS {\r
class AlarmJudgeView {\r
#include "layout/grid_layout.h"\r
#include "font/ui_font.h"\r
#include "common/screen.h"\r
-#include "AlarmPresenter.h"\r
-#include "AlarmClockModel.h"\r
+#include "alarm/AlarmPresenter.h"\r
+#include "alarm/AlarmClockModel.h"\r
\r
namespace OHOS {\r
void CancelScanHandle(void);\r
#include "components/ui_scroll_view.h"\r
#include "components/ui_time_picker.h"\r
#include "View.h"\r
-#include "AlarmPresenter.h"\r
-#include "AlarmClockModel.h"\r
+#include "alarm/AlarmPresenter.h"\r
+#include "alarm/AlarmClockModel.h"\r
\r
namespace OHOS {\r
class AlarmNewTimeView : public UITimePicker::SelectedListener {\r
#include "Presenter.h"\r
#include "ChangeSliceListener.h"\r
#include "UiConfig.h"\r
-#include "AlarmPopUpView.h"\r
+#include "alarm/AlarmPopUpView.h"\r
#include "components/ui_label.h"\r
#include "common/screen.h"\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
#include "components/ui_digital_clock.h"\r
#include "gfx_utils/graphic_log.h"\r
-#include "ModelListenerSample.h"\r
-#include "AlarmCloseRingView.h"\r
-#include "AlarmRingView.h"\r
-#include "AlarmPopUpView.h"\r
-#include "AlarmClockModel.h"\r
+#include "main/ModelListenerSample.h"\r
+#include "alarm/AlarmCloseRingView.h"\r
+#include "alarm/AlarmRingView.h"\r
+#include "alarm/AlarmPopUpView.h"\r
+#include "alarm/AlarmClockModel.h"\r
#include "wearable_log.h"\r
\r
namespace OHOS {\r
#include "components/ui_label_button.h"\r
#include "ChangeSliceListener.h"\r
#include "components/ui_digital_clock.h"\r
-#include "AlarmSetTimeView.h"\r
-#include "AlarmCloseRingView.h"\r
-#include "AlarmRingView.h"\r
-#include "AlarmClockModel.h"\r
+#include "alarm/AlarmSetTimeView.h"\r
+#include "alarm/AlarmCloseRingView.h"\r
+#include "alarm/AlarmRingView.h"\r
+#include "alarm/AlarmClockModel.h"\r
#include "UiConfig.h"\r
\r
namespace OHOS {\r
#include "components/ui_time_picker.h"\r
#include "components/ui_digital_clock.h"\r
#include "gfx_utils/graphic_log.h"\r
-#include "AlarmClockModel.h"\r
+#include "alarm/AlarmClockModel.h"\r
#include "wearable_log.h"\r
#include "color.h"\r
\r
#include "ChangeSliceListener.h"\r
#include "components/ui_digital_clock.h"\r
#include "UiConfig.h"\r
-#include "AlarmClockModel.h"\r
+#include "alarm/AlarmClockModel.h"\r
#include "ChangeSliceListener.h"\r
\r
namespace OHOS {\r
#include "components/ui_scroll_view.h"\r
#include "components/ui_time_picker.h"\r
#include "View.h"\r
-#include "AlarmPresenter.h"\r
-#include "AlarmClockModel.h"\r
+#include "alarm/AlarmPresenter.h"\r
+#include "alarm/AlarmClockModel.h"\r
#include "wearable_log.h"\r
\r
namespace OHOS {\r
#include "layout/grid_layout.h"\r
#include "components/root_view.h"\r
#include "components/ui_time_picker.h"\r
-#include "AlarmPresenter.h"\r
-#include "AlarmClockModel.h"\r
+#include "alarm/AlarmPresenter.h"\r
+#include "alarm/AlarmClockModel.h"\r
\r
namespace OHOS {\r
class AlarmSetWeekView {\r
#include "ChangeSliceListener.h"
#include "components/ui_digital_clock.h"
#include "components/ui_toggle_button.h"
-#include "AlarmPresenter.h"
-#include "AlarmSetTimeView.h"
-#include "AlarmSetWeekView.h"
-#include "AlarmJudgeView.h"
-#include "AlarmConfigView.h"
-#include "AlarmNewTimeView.h"
-#include "AlarmMaxClock.h"
-#include "AlarmClockModel.h"
+#include "alarm/AlarmPresenter.h"
+#include "alarm/AlarmSetTimeView.h"
+#include "alarm/AlarmSetWeekView.h"
+#include "alarm/AlarmJudgeView.h"
+#include "alarm/AlarmConfigView.h"
+#include "alarm/AlarmNewTimeView.h"
+#include "alarm/AlarmMaxClock.h"
+#include "alarm/AlarmClockModel.h"
namespace OHOS {
constexpr int16_t D_CLOCK_Y = 210;
#include <climits>\r
\r
#include "ohos_types.h"\r
-#include "AlarmClockTimerConfig.h"\r
+#include "alarmclocktimerconfig/AlarmClockTimerConfig.h"\r
\r
#ifdef __cplusplus\r
extern "C" {\r
#define ALMMGR_ALARM_CLOCK_MANAGE_H\r
\r
#include "ohos_types.h"\r
-#include "AlarmClockManage.h"\r
+#include "alarmclockmanage/AlarmClockManage.h"\r
\r
#ifdef __cplusplus\r
extern "C" {\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
#include "components/ui_barcode.h"\r
-#include "AlipayPresenter.h"\r
+#include "alipay/AlipayPresenter.h"\r
\r
namespace OHOS {\r
class AlipayBarCode : public UIViewGroup {\r
#include "components/ui_image_view.h"\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
-#include "AlipayPresenter.h"\r
+#include "alipay/AlipayPresenter.h"\r
#include "components/ui_qrcode.h"\r
\r
namespace OHOS {\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
#include "components/ui_image_animator.h"\r
-#include "AlipayPresenter.h"\r
+#include "alipay/AlipayPresenter.h"\r
\r
#define ALIPAY_BIND_SEARCH_IMAGE_NUM 8\r
\r
#include "components/ui_image_view.h"\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
-#include "AlipayPresenter.h"\r
+#include "alipay/AlipayPresenter.h"\r
\r
namespace OHOS {\r
class AlipayBindRes : public UIViewGroup {\r
#include "components/ui_image_view.h"\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
-#include "AlipayPresenter.h"\r
+#include "alipay/AlipayPresenter.h"\r
\r
namespace OHOS {\r
class AlipayExitBind : public UIViewGroup {\r
#include "components/ui_image_view.h"\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
-#include "AlipayPresenter.h"\r
+#include "alipay/AlipayPresenter.h"\r
#include "components/ui_qrcode.h"\r
\r
namespace OHOS {\r
#include "components/abstract_adapter.h"
#include "wearable_log.h"
#include "UiConfig.h"
-#include "AlipayListItem.h"
+#include "alipay/AlipayList/AlipayListItem.h"
namespace OHOS {
class AlipayListAdapter : public AbstractAdapter {
#include "components/ui_image_view.h"
#include "UiConfig.h"
-#include "AlipayListItem.h"
-#include "AlipayListView.h"
+#include "alipay/AlipayList/AlipayListItem.h"
+#include "alipay/AlipayList/AlipayListView.h"
namespace OHOS {
class AlipayListItemView : public UIViewGroup {
#include "components/ui_scroll_view.h"
#include "components/ui_list.h"
#include "components/icon_adapter.h"
-#include "AlipayPresenter.h"
+#include "alipay/AlipayPresenter.h"
#include "AppViewIDs.h"
#include "UiConfig.h"
-#include "AlipayListAdapter.h"
-#include "AlipayListItem.h"
+#include "alipay/AlipayList/AlipayListAdapter.h"
+#include "alipay/AlipayList/AlipayListItem.h"
namespace OHOS {
class AlipayListAdapter;
#include "components/ui_view_group.h"\r
#include "ChangeSliceListener.h"\r
#include "components/ui_swipe_view.h"\r
-#include "AlipayPresenter.h"\r
-#include "AlipayModel.h"\r
-#include "AlipayBind.h"\r
-#include "AlipayExitBind.h"\r
-#include "AlipayBindRes.h"\r
-#include "AlipayBindAni.h"\r
-#include "AlipayListView.h"\r
-#include "AlipayBarCode.h"\r
-#include "AlipayPayCode.h"\r
-#include "AlipaySetting.h"\r
-#include "AlipayHelp.h"\r
-#include "AlipayUnbindFinish.h"\r
-#include "AlipayUnbind.h"\r
+#include "alipay/AlipayPresenter.h"\r
+#include "alipay/AlipayModel.h"\r
+#include "alipay/AlipayBind.h"\r
+#include "alipay/AlipayExitBind.h"\r
+#include "alipay/AlipayBindRes.h"\r
+#include "alipay/AlipayBindAni.h"\r
+#include "alipay/AlipayList/AlipayListView.h"\r
+#include "alipay/AlipayBarCode.h"\r
+#include "alipay/AlipayPayCode.h"\r
+#include "alipay/AlipaySetting.h"\r
+#include "alipay/AlipayHelp.h"\r
+#include "alipay/AlipayUnbindFinish.h"\r
+#include "alipay/AlipayUnbind.h"\r
\r
-#include "AlipayGetTransList.h"\r
-#include "AlipayTransTips.h"\r
-#include "AlipayTransCode.h"\r
-#include "AlipayTransEnable.h"\r
-#include "AlipayTransRes.h"\r
-#include "AlipayTransListView.h"\r
-#include "AlipayTransAni.h"\r
+#include "alipay/AlipayTrans/AlipayGetTransList.h"\r
+#include "alipay/AlipayTrans/AlipayTransTips.h"\r
+#include "alipay/AlipayTrans/AlipayTransCode.h"\r
+#include "alipay/AlipayTrans/AlipayTransEnable.h"\r
+#include "alipay/AlipayTrans/AlipayTransRes.h"\r
+#include "alipay/AlipayTrans/AlipayTransListView.h"\r
+#include "alipay/AlipayTrans/AlipayTransAni.h"\r
\r
namespace OHOS {\r
class AlipayMainView;\r
#include "components/ui_label_button.h"\r
#include "components/ui_button.h"\r
#include "components/ui_qrcode.h"\r
-#include "AlipayPresenter.h"\r
+#include "alipay/AlipayPresenter.h"\r
\r
namespace OHOS {\r
class AlipayPayCode : public UIViewGroup {\r
#include "UiConfig.h"\r
#include "wearable_log.h"\r
#include "color.h"\r
-#include "AlipayModel.h"\r
+#include "alipay/AlipayModel.h"\r
\r
namespace OHOS {\r
constexpr char *ALIPAY_LIST_PAY_BUTTON = (char *)"alipaylistpay";\r
#include "components/ui_image_view.h"\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
-#include "AlipayPresenter.h"\r
+#include "alipay/AlipayPresenter.h"\r
#include "components/ui_qrcode.h"\r
\r
namespace OHOS {\r
#include "components/ui_image_view.h"\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
-#include "AlipayPresenter.h"\r
+#include "alipay/AlipayPresenter.h"\r
#include "components/ui_qrcode.h"\r
\r
namespace OHOS {\r
#include "components/ui_image_view.h"\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
-#include "AlipayPresenter.h"\r
+#include "alipay/AlipayPresenter.h"\r
\r
namespace OHOS {\r
class AlipayGetTransList : public UIViewGroup {\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
#include "components/ui_image_animator.h"\r
-#include "AlipayPresenter.h"\r
+#include "alipay/AlipayPresenter.h"\r
\r
#define ALIPAY_TRANS_SEARCH_IMAGE_NUM 8\r
\r
#include "components/ui_label_button.h"\r
#include "components/ui_button.h"\r
#include "components/ui_qrcode.h"\r
-#include "AlipayPresenter.h"\r
+#include "alipay/AlipayPresenter.h"\r
\r
namespace OHOS {\r
class AlipayTransCode : public UIViewGroup {\r
#include "components/ui_label_button.h"\r
#include "components/ui_button.h"\r
#include "components/ui_qrcode.h"\r
-#include "AlipayPresenter.h"\r
+#include "alipay/AlipayPresenter.h"\r
\r
namespace OHOS {\r
class AlipayTransEnable : public UIViewGroup {\r
#include "components/abstract_adapter.h"
#include "wearable_log.h"
#include "UiConfig.h"
-#include "AlipayTransListItem.h"
+#include "alipay/AlipayTrans/AlipayTransListItem.h"
namespace OHOS {
class AlipayTransListAdapter : public AbstractAdapter {
#include "components/ui_image_view.h"
#include "UiConfig.h"
-#include "AlipayTransListItem.h"
-#include "AlipayTransListView.h"
+#include "alipay/AlipayTrans/AlipayTransListItem.h"
+#include "alipay/AlipayTrans/AlipayTransListView.h"
namespace OHOS {
class AlipayTransListItemView : public UIViewGroup {
#include "components/ui_list.h"
#include "components/ui_button.h"
#include "components/icon_adapter.h"
-#include "AlipayPresenter.h"
+#include "alipay/AlipayPresenter.h"
#include "AppViewIDs.h"
#include "UiConfig.h"
-#include "AlipayTransListAdapter.h"
-#include "AlipayTransListItem.h"
+#include "alipay/AlipayTrans/AlipayTransListAdapter.h"
+#include "alipay/AlipayTrans/AlipayTransListItem.h"
namespace OHOS {
#include "components/ui_image_view.h"\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
-#include "AlipayPresenter.h"\r
+#include "alipay/AlipayPresenter.h"\r
\r
namespace OHOS {\r
class AlipayTransRes : public UIViewGroup {\r
#include "components/ui_image_view.h"\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
-#include "AlipayPresenter.h"\r
+#include "alipay/AlipayPresenter.h"\r
\r
namespace OHOS {\r
class AlipayTransTips : public UIViewGroup {\r
#include "components/ui_image_view.h"\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
-#include "AlipayPresenter.h"\r
+#include "alipay/AlipayPresenter.h"\r
\r
namespace OHOS {\r
class AlipayUnbind : public UIViewGroup {\r
#include "components/ui_image_view.h"\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
-#include "AlipayPresenter.h"\r
+#include "alipay/AlipayPresenter.h"\r
#include "components/ui_qrcode.h"\r
\r
namespace OHOS {\r
#ifndef AODMODEL_H
#define AODMODEL_H
-#include "AodView.h"
-#include "components/ui_view.h"
+#include "main/MainModel.h"
namespace OHOS {
class AodModel {
#ifndef AODPRESENTER_H
#define AODPRESENTER_H
#include "Presenter.h"
-#include "AodView.h"
+#include "aod_view/AodView.h"
#include "components/ui_view.h"
-#include "KeyInputListener.h"
-#include "ModelListenerSample.h"
+#include "key/KeyInputListener.h"
+#include "main/ModelListenerSample.h"
namespace OHOS {
class AodView;
#ifndef AODVIEW_H
#define AODVIEW_H
#include "View.h"
-#include "MainModel.h"
-#include "SetDialInfo.h"
-#include "DialBinTypesV2.h"
+#include "main/MainModel.h"
+#include "set_dial/SetDialInfo.h"
+#include "main/DialBinTypesV2.h"
#include "components/ui_view.h"
#include "components/ui_card_page.h"
#ifndef APP_ITEM_VIEW_H
#define APP_ITEM_VIEW_H
-#include "components/ui_label.h"
+#include "components/ui_label_ext.h"
#include "components/ui_view_group.h"
#include "components/ui_image_view.h"
-#include "ApplistModel.h"
+#include "applist/ApplistModel.h"
#include "UiConfig.h"
namespace OHOS {
AppItemView &operator = (const AppItemView &);
UIImageView icon_;
- UILabel label_;
- AppItem itemInfo_ = { VIEW_INVALID, nullptr, nullptr, nullptr, nullptr };
+ UILabelExt label_;
+ AppItem itemInfo_;
};
class HexagonsItemView : public UIImageView {
private:
HexagonsItemView(const HexagonsItemView &);
HexagonsItemView &operator = (const HexagonsItemView &);
- AppItem itemInfo_ = { VIEW_INVALID, nullptr, nullptr, nullptr, nullptr };
+ AppItem itemInfo_;
};
class FootballItemView : public UIImageView {
public:
explicit FootballItemView() {}
- ~FootballItemView() {}
+ ~FootballItemView();
void SetItemInfo(const AppItem &itemInfo);
AppViewId GetViewId();
const char *GetAppUid();
private:
FootballItemView(const FootballItemView &);
FootballItemView &operator = (const FootballItemView &);
- AppItem itemInfo_ = { VIEW_INVALID, nullptr, nullptr, nullptr, nullptr };
+ AppItem itemInfo_;
};
class WaterfallItemView : public UIImageView {
public:
explicit WaterfallItemView() {}
- ~WaterfallItemView() {}
+ ~WaterfallItemView();
void SetItemInfo(const AppItem &itemInfo);
AppViewId GetViewId();
const char *GetAppUid();
private:
WaterfallItemView(const WaterfallItemView &);
WaterfallItemView &operator = (const WaterfallItemView &);
- AppItem itemInfo_ = { VIEW_INVALID, nullptr, nullptr, nullptr, nullptr };
+ AppItem itemInfo_;
};
}
#include "components/abstract_adapter.h"
#include "UiConfig.h"
#include "wearable_log.h"
-#include "AppItemView.h"
-#include "ApplistModel.h"
+#include "applist/AppItemView.h"
+#include "applist/ApplistModel.h"
namespace OHOS {
class ApplistAdapter : public AbstractAdapter {
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: ApplistModel.h
+ * Author:
+ * Create: 2021-09-18
+ */
+
+#ifndef APPLIST_MODEL_H
+#define APPLIST_MODEL_H
+
+#include "bundle_info.h"
+#include "AppViewIDs.h"
+#include "ohos_types.h"
+
+#define APP_MAX_NUM 50
+
+namespace OHOS {
+static const int INVALID_MASK = 0x0;
+
+enum UIResourceTextId : uint16_t {
+ STR_MAX_ID = 0,
+};
+
+struct AppItem {
+ uint16_t id = VIEW_INVALID;
+ const char *iconSmall = nullptr; // 小图标资源路径
+ const char *iconHexagon = nullptr; // 六边形图标资源路径
+ const char *label = nullptr; // 应用名
+ uint32_t resId = INVALID_MASK; // 小图标压缩资源对应的id
+ uint32_t hexagonId = INVALID_MASK; // 六边形图标压缩资源对应的id
+ const char *resPath = nullptr; // 小图标压缩资源路径
+ const char *hexagonPath = nullptr; // 六边形图标压缩资源路径
+ uint16_t labelId = STR_MAX_ID; // 多语言环境下对应的字符id
+ const char *uid = nullptr;
+ // resId、resPath和iconSmall互斥, hexagonId、hexagonPath和iconHexagon互斥, labelId和label互斥
+
+ AppItem() = default;
+
+ // 使用该构造方法初始化,支持多语言注册以及多图标打包功能
+ AppItem(uint16_t id, uint32_t resId, uint32_t hexagonId, const char *resPath,
+ const char *hexagonPath, uint16_t labelId, const char *uid) :
+ id(id),
+ resId(resId),
+ hexagonId(hexagonId),
+ resPath(resPath),
+ hexagonPath(hexagonPath),
+ labelId(labelId),
+ uid(uid) {}
+
+ // 使用该构造方法初始化,不支持多语言,一个图标使用一个文件
+ AppItem(uint16_t id, const char *iconSmall, const char *iconHexagon,
+ const char *label, const char *uid) :
+ id(id),
+ iconSmall(iconSmall),
+ iconHexagon(iconHexagon),
+ label(label),
+ uid(uid) {}
+};
+
+enum AppListStyle {
+ APPLIST_STYLE,
+ HEXAGONS_STYLE,
+ FOOTBALL_STYLE,
+ WATERFALL_STYLE
+};
+
+class ApplistPresenter;
+class ApplistModel {
+public:
+ static ApplistModel &GetInstance(void);
+
+ void Init();
+ const AppItem *GetApplistItems() const;
+ uint8 GetAppListNum() const;
+ void ResolvingJSAppItems(void);
+ void SetStartIndex(uint16_t index);
+ uint16_t GetStartIndex(void);
+ void SetHeadItemY(int index);
+ int GetHeadItemY(void);
+ void ApplistUpdate(void);
+ void SetPresenter(ApplistPresenter *p);
+ AppListStyle GetCurrentStyle(void);
+ void SetInitFlag(bool flag);
+
+private:
+ ApplistModel();
+ ApplistModel(const ApplistModel &);
+ ApplistModel &operator=(const ApplistModel &);
+ virtual ~ApplistModel();
+ ApplistPresenter *presenter{nullptr};
+
+ AppItem applist[APP_MAX_NUM];
+ BundleInfo *bundleInfos = nullptr;
+ int32 bundleLen = 0;
+ uint8 appLen = 0;
+
+ uint16_t startIndex = 0;
+ int headItemY = 0;
+ bool initFlag{false};
+};
+}
+
+#endif
#include "Presenter.h"
#include "ohos_types.h"
-#include "AppItemView.h"
-#include "ApplistView.h"
-#include "ApplistModel.h"
+#include "applist/AppItemView.h"
+#include "applist/ApplistView.h"
+#include "applist/ApplistModel.h"
#include "components/root_view.h"
namespace OHOS {
#include "components/ui_icosahedron_view.h"
#include "gfx_utils/list.h"
#include "ohos_types.h"
-#include "ApplistAdapter.h"
+#include "applist/ApplistAdapter.h"
#include "ChangeSliceListener.h"
#include "drag_event.h"
#include "UiConfig.h"
void OnStart() override;
void OnStop() override;
+ void LoadAppIconImage(UIImageView *view, const uint32_t id, const char *path);
void AddAppItemToList(const AppItem &item);
void ClearAppItemToList();
void RefreshAppList(void);
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingModel.h\r
+ * Author:\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef BLOOD_MODEL_H\r
+#define BLOOD_MODEL_H\r
+\r
+#include <string>\r
+#include <list>\r
+#include "graphic_timer.h"\r
+\r
+namespace OHOS {\r
+ class BloodModel {\r
+ public:\r
+ static BloodModel &GetInstance(void);\r
+ bool GetbuttonStatus();\r
+ void SetbuttonStatus(bool status);\r
+ std::string GetCurrentTimeString();\r
+ void StartCurrentTimeTimer();\r
+ void PauseCurrentTimeTimer();\r
+ private:\r
+ virtual ~BloodModel();\r
+ BloodModel();\r
+ BloodModel(const BloodModel &);\r
+ void InitCurrentTimeTimer();\r
+ void DisableCurrentTimeTimer();\r
+ BloodModel &operator=(const BloodModel &);\r
+ bool buttonStatus = 0;\r
+ GraphicTimer *pCurrentTimeTimer_ = nullptr;\r
+ };\r
+}\r
+#endif // BLOOD_MODEL_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingPresenter.h\r
+ * Author:\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef BLOOD_PRESENTER_H\r
+#define BLOOD_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+#include "components/ui_view.h"\r
+\r
+namespace OHOS {\r
+typedef enum {\r
+ BLOOD_START,\r
+ BLOOD_TEST,\r
+ BLOOD_MORE,\r
+ MAX_BLOOD_PAGE,\r
+} PageId;\r
+constexpr short SET_ZERO = 0;\r
+constexpr short SET_ONE = 1;\r
+constexpr short SET_TWO = 2;\r
+constexpr short SET_THREE = 3;\r
+constexpr short SET_FOUR = 4;\r
+constexpr short SET_FIVE = 5;\r
+constexpr short TEMP_SET_SIX = 6;\r
+constexpr short SET_SEVEN = 7;\r
+constexpr short SET_EIGHT = 8;\r
+constexpr short SET_NINE = 9;\r
+constexpr short SET_HUNDRED = 100;\r
+constexpr short SET_INT_MAX = 255;\r
+class BloodView;\r
+class BloodModel;\r
+class BloodPresenter : public Presenter<BloodView>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ BloodPresenter();\r
+ ~BloodPresenter() override;\r
+ static BloodPresenter *GetInstance();\r
+\r
+ void OnResume() override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ void OnPause() override;\r
+ bool ClickFuncId(const char *buttonName);\r
+\r
+private:\r
+ BloodModel *findPhoneModel;\r
+};\r
+}\r
+\r
+#endif // BLOOD_PRESENTER_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingView.h\r
+ * Author:\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef BLOOD_VIEW_H\r
+#define BLOOD_VIEW_H\r
+\r
+#include "View.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_digital_clock.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_list.h"\r
+#include "components/ui_image_animator.h"\r
+#include "ChangeSliceListener.h"\r
+#include "test_case_list_adapter.h"\r
+#include "UiConfig.h"\r
+#include "blood/BloodModel.h"\r
+#include "blood/BloodPresenter.h"\r
+#include "layout/grid_layout.h"\r
+#include "ui_test.h"\r
+namespace OHOS {\r
+class BloodPresenter;\r
+\r
+class BloodModel;\r
+class BloodView : public View<BloodPresenter> {\r
+public:\r
+ BloodView();\r
+ ~BloodView() override;\r
+\r
+ static BloodView *GetInstance();\r
+\r
+ void OnStart() override;\r
+ void OnStop() override;\r
+ bool ClickButtonChange(bool status);\r
+ void SetupCurrentTime();\r
+ void SetupImageAnimator();\r
+ void UpdateCurrentTimeLabel(const char *currentTime);\r
+ bool IsCurrentTimeLabelValid();\r
+ void SetUpImageAnimator();\r
+ void SetupButton();\r
+ void InitImageInfo();\r
+\r
+ void InitStart();\r
+ void InitTest();\r
+ void InitMore();\r
+ bool TempInitLabel(void);\r
+ bool InitSimilarLabel(int16 num, int16 labelY, const char *labelText);\r
+ void ChangeView(int16 hideView, int16 showView);\r
+\r
+ void DropView(UIView& view, int type);\r
+ bool ClickFunc(int16 interf);\r
+ bool ChangeBloodStart(int16_t thisView);\r
+ bool ChangeBloodTest(int16_t thisView);\r
+ bool ChangeBloodMore(int16_t thisView);\r
+private:\r
+ UIView::OnDragListener *dragListener_ = nullptr;\r
+ TestCaseListAdapter* adapter_ = nullptr;\r
+ BloodModel *findPhoneModel;\r
+ UILabel *currentTime_{nullptr};\r
+ GridLayout* layout_ = nullptr;\r
+\r
+ UIViewGroup* container[MAX_BLOOD_PAGE] = {nullptr};\r
+ UIViewGroup *group = nullptr;\r
+ UIViewGroup *groupTest = nullptr;\r
+ UIScrollView *scrollGroup = nullptr;\r
+ UILabelButton* button = nullptr;\r
+ UILabelButton* buttonMore = nullptr;\r
+ UILabel *label1_ = nullptr;\r
+ UILabel *label2_ = nullptr;\r
+\r
+ ImageInfo* imageInfo1_ = nullptr;\r
+ ImageInfo* imageInfo2_ = nullptr;\r
+ ImageInfo* imageInfo3_ = nullptr;\r
+ ImageAnimatorInfo imageAnimatorImageInfo_[3] = { 0 };\r
+ UIImageAnimatorView* imageAnimator_ = nullptr;\r
+\r
+ UILabel *tempTitle{nullptr};\r
+ UILabel *tempLabel[SET_THREE]{nullptr};\r
+};\r
+}\r
+#endif // BLOOD_VIEW_H\r
#define BLOOD_OXYGEN_PRESENTER_H\r
\r
#include "Presenter.h"\r
-#include "ModelListenerSample.h"\r
+#include "main/ModelListenerSample.h"\r
#include "components/ui_circle_progress.h"\r
#include "ohos_types.h"\r
\r
#include "components/ui_image_animator.h"\r
#include "components/ui_circle_progress.h"\r
#include "components/ui_view_group.h"\r
-#include "BloodOxygenPresenter.h"\r
-#include "BloodBandoffView.h"\r
+#include "bloodoxygen/BloodOxygenPresenter.h"\r
+#include "bloodoxygen/BloodBandoffView.h"\r
\r
namespace OHOS {\r
class BloodOxygenView : public View<BloodOxygenPresenter> {\r
#include "components/abstract_adapter.h"
#include "components/ui_label.h"
#include "components/ui_label_button.h"
-#include "PlayersPresenter.h"
-#include "BluetoothItemView.h"
+#include "player/PlayersPresenter.h"
+#include "bluetooth/BluetoothItemView.h"
namespace OHOS {
class BluetoothCaseListAdapter : public AbstractAdapter {
--- /dev/null
+/*\r
+ * Copyright (c) @CompanyNameMagicTag 2021-2023. All rights reserved.\r
+ * Description: transmit header file\r
+ * This file should be changed only infrequently and with great care.\r
+ */\r
+#ifndef BLUETOOTH_CHANGE_BLE_H\r
+#define BLUETOOTH_CHANGE_BLE_H\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+void ChangeBleConnectToMax(void);\r
+void ChangeBleConnectToDefault(void);\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+#endif\r
#include "components/abstract_adapter.h"
#include "components/ui_label.h"
#include "components/ui_label_button.h"
-#include "BluetoothItemView.h"
+#include "bluetooth/BluetoothItemView.h"
namespace OHOS {
class BluetoothDeviceCaseListAdapter : public AbstractAdapter {
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
#include "components/ui_list.h"\r
-#include "BluetoothDeviceCaseListAdapter.h"\r
+#include "bluetooth/BluetoothDeviceCaseListAdapter.h"\r
\r
namespace OHOS {\r
class BluetoothDeviceCaseListAdapter;\r
#include "components/ui_label_button.h"\r
#include "components/ui_image_animator.h"\r
#include "components/ui_list.h"\r
-#include "BluetoothCaseListAdapter.h"\r
+#include "bluetooth/BluetoothCaseListAdapter.h"\r
\r
namespace OHOS {\r
class BluetoothCaseListAdapter;\r
#include "components/ui_image_animator.h"\r
#include "ohos_timer.h"\r
#include "graphic_timer.h"\r
-#include "BluetoothModel.h"\r
+#include "bluetooth/BluetoothModel.h"\r
#define BLUETOOTH_SEARCH_IMAGE_NUM 8\r
\r
namespace OHOS {\r
#include "components/ui_label_button.h"\r
#include "components/ui_image_animator.h"\r
\r
-#include "BluetoothModel.h"\r
+#include "bluetooth/BluetoothModel.h"\r
#include "UiConfig.h"\r
#define BLUETOOTH_CONNECT_IMAGE_NUM 8\r
\r
#include "bts_br_gap.h"\r
\r
namespace OHOS {\r
+constexpr uint16_t BLUETOOTH_CONN_HANDLE = 64;\r
+constexpr uint16_t BLUETOOTH_INTERVAL_TOMAX_MIN = 12;\r
+constexpr uint16_t BLUETOOTH_INTERVAL_TOMAX_MAX = 12;\r
+constexpr uint16_t BLUETOOTH_INTERVAL_TODEFAULT_MIN = 24;\r
+constexpr uint16_t BLUETOOTH_INTERVAL_TODEFAULT_MAX = 48;\r
+constexpr uint16_t BLUETOOTH_LATENCY = 0;\r
+constexpr uint16_t BLUETOOTH_TIMEOUT_MUTIPLIER = 500;\r
+\r
typedef enum : uint16_t {\r
CALLERSETTING,\r
CALLERPLAYERS,\r
int ConnectRemoteDevice(const bd_addr_t *addr);\r
bool ConnectRemoteCheck(const bd_addr_t *addr);\r
char* getWatchName(void);\r
-\r
+ void ChangeBleConnectToMax();\r
+ void ChangeBleConnectToDefault();\r
+ \r
private:\r
BluetoothModel();\r
int16_t callerid{0};\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
#include "components/ui_image_animator.h"\r
-#include "BluetoothCaseListAdapter.h"\r
+#include "bluetooth/BluetoothCaseListAdapter.h"\r
\r
namespace OHOS {\r
class BluetoothOptionsView {\r
#define BLUETOOTH_PRESENTER_H\r
\r
#include "Presenter.h"\r
-#include "BluetoothModel.h"\r
-#include "MainBluetoothView.h"\r
+#include "bluetooth/BluetoothModel.h"\r
+#include "bluetooth/MainBluetoothView.h"\r
#include "components/ui_view.h"\r
#include "components/ui_image_view.h"\r
#include "components/ui_label_button.h"\r
#include "components/ui_view_group.h"\r
-#include "VolumeSettingView.h"\r
-#include "UiViewId.h"\r
+#include "main/VolumeSettingView.h"\r
+#include "main/UiViewId.h"\r
\r
namespace OHOS {\r
enum BluetoothPresenterNum : uint8_t {\r
#include "View.h"\r
#include "UiConfig.h"\r
#include "ChangeSliceListener.h"\r
-#include "BluetoothPresenter.h"\r
-#include "BluetoothCaseListAdapter.h"\r
-#include "BluetoothEarListView.h"\r
-#include "BluetoothEarPhoneView.h"\r
-#include "BluetoothOptionsView.h"\r
-#include "BluetoothReconnectView.h"\r
-#include "TipsConnFailMessageView.h"\r
-#include "TipsSuccMessageView.h"\r
-#include "TipsFailMessageView.h"\r
-#include "BluetoothDeviceListView.h"\r
-#include "BluetoothItemView.h"\r
+#include "bluetooth/BluetoothPresenter.h"\r
+#include "bluetooth/BluetoothCaseListAdapter.h"\r
+#include "bluetooth/BluetoothEarListView.h"\r
+#include "bluetooth/BluetoothEarPhoneView.h"\r
+#include "bluetooth/BluetoothOptionsView.h"\r
+#include "bluetooth/BluetoothReconnectView.h"\r
+#include "bluetooth/TipsConnFailMessageView.h"\r
+#include "bluetooth/TipsSuccMessageView.h"\r
+#include "bluetooth/TipsFailMessageView.h"\r
+#include "bluetooth/BluetoothDeviceListView.h"\r
+#include "bluetooth/BluetoothItemView.h"\r
\r
namespace OHOS {\r
constexpr int16_t NUM_CONTAINER = 9; // NUM_CONTAINER :蓝牙耳机连接的9个界面容器\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathDurPage\r
+ * Create: 2025-5-13\r
+ */\r
+#ifndef BREATH_DUR_PAGE_H\r
+#define BREATH_DUR_PAGE_H\r
+\r
+#include <string>\r
+#include "components/ui_label.h"\r
+#include "components/ui_picker.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_toggle_button.h"\r
+#include "View.h"\r
+#include "UiConfig.h"\r
+#include "SlicePage.h"\r
+#include "SlicePageFactory.h"\r
+#include "breath/BreathModel.h"\r
+#include "breath/BreathPresenter.h"\r
+\r
+namespace OHOS {\r
+\r
+class BreathDurPage : public SlicePage<BreathPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ BreathDurPage();\r
+ ~BreathDurPage() override;\r
+ void OnStart(void* data) override;\r
+ void OnStop() override;\r
+ void OnResume() override;\r
+ void OnPause() override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+private:\r
+ UILabel *lableTitle = nullptr;\r
+ UIPicker *pickerTime = nullptr;\r
+ UIButton *buttonOk = nullptr;\r
+ UIViewGroup *group = nullptr;\r
+ UIImageView *center = nullptr;\r
+};\r
+} // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathExerPage\r
+ * Create: 2025-5-13\r
+ */\r
+#ifndef BREATH_EXER_PAGE_H\r
+#define BREATH_EXER_PAGE_H\r
+\r
+#include "layout/grid_layout.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_digital_clock.h"\r
+#include "components/ui_image_animator.h"\r
+#include "View.h"\r
+#include "SlicePage.h"\r
+#include "graphic_timer.h"\r
+#include "SlicePageFactory.h"\r
+#include "power_display_service.h"\r
+#include "breath/BreathModel.h"\r
+#include "breath/BreathPresenter.h"\r
+\r
+#define ALIPAY_BIND_SEARCH_IMAGE_NUM 80\r
+#define SPEED_IDX_3 3\r
+\r
+namespace OHOS {\r
+class BreathExerPage : public SlicePage<BreathPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ BreathExerPage();\r
+ ~BreathExerPage() override;\r
+ void OnStart(void* data) override;\r
+ void OnStop() override;\r
+ void OnPause() override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ void OnTimer();\r
+ void SetUpImageAnimator();\r
+ void InitImageInfo();\r
+\r
+private:\r
+ UIViewGroup *group = nullptr;\r
+ UIImageAnimatorView* imageAnimator_ = nullptr;\r
+ ImageInfo* imageInfoOen = nullptr;\r
+ ImageInfo* imageInfoTwo = nullptr;\r
+ ImageInfo* imageInfoThree = nullptr;\r
+ uint32_t palyNumber;\r
+ ImageAnimatorInfo imageAnimatorImageInfo[SPEED_IDX_3] = { 0 };\r
+ ImageAnimatorInfo searchImageInfo[ALIPAY_BIND_SEARCH_IMAGE_NUM];\r
+\r
+ class BreathExerPageCallback : public AnimatorCallback {\r
+ public:\r
+ BreathExerPageCallback(BreathExerPage* page) : BreathExerPage(page) {}\r
+ virtual ~BreathExerPageCallback() override {}\r
+ void Callback(UIView* view) override;\r
+ private:\r
+ BreathExerPage* BreathExerPage{nullptr};\r
+ };\r
+ BreathExerPageCallback* animatorCallBack{nullptr};\r
+ Animator *animation = nullptr;\r
+};\r
+} // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathMainPage\r
+ * Create: 2025-5-13\r
+ */\r
+#ifndef BREATH_MAIN_PAGE_H\r
+#define BREATH_MAIN_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_digital_clock.h"\r
+#include "components/ui_image_animator.h"\r
+#include "View.h"\r
+#include "SlicePageFactory.h"\r
+#include "SlicePage.h"\r
+#include "breath/BreathView.h"\r
+#include "breath/BreathModel.h"\r
+#include "breath/BreathPresenter.h"\r
+\r
+namespace OHOS {\r
+\r
+class BreathMainPage : public SlicePage<BreathPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ BreathMainPage() = default;\r
+ ~BreathMainPage() override;\r
+ void OnStart(void* data) override;\r
+ void OnStop() override;\r
+ void OnResume() override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+\r
+private:\r
+ UILabel *lableBreathing = nullptr;\r
+ UIButton *buttonTime = nullptr;\r
+ UIButton *buttonSetting = nullptr;\r
+ UIButton *buttonStart = nullptr;\r
+ UILabel *lableSetting = nullptr;\r
+ UILabel *lableTime = nullptr;\r
+ UIViewGroup *group = nullptr;\r
+ UIImageView *background = nullptr;\r
+ UIImageView *center = nullptr;\r
+};\r
+} // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathModel\r
+ * Create: 2025-5-13\r
+ */\r
+#ifndef BREATH_MODEL_H\r
+#define BREATH_MODEL_H\r
+\r
+#include "gfx_utils/graphic_math.h"\r
+namespace OHOS {\r
+#define SPEED_IDX_3 3\r
+class BreathModel {\r
+public:\r
+ static BreathModel &GetInstance();\r
+ virtual ~BreathModel();\r
+ const char **GetDurListData();\r
+ const char **GetRhyListData();\r
+ uint8_t GetDurListSize();\r
+ uint8_t GetRhyListSize();\r
+ char *GetTimeDuration();\r
+ void SetTimeDuration(uint16_t idx);\r
+ void SetTimeRhyation(uint16_t idx);\r
+ uint8_t GetSelectTime();\r
+ uint8_t GetSelectTempo();\r
+ char *GetDuration();\r
+ char *GetRhythm();\r
+ void SetSaveTime(int32_t idx);\r
+ int32_t GetSaveTime();\r
+ uint32_t GetTimeBreathing();\r
+ uint32_t GetStatusRespiratory();\r
+ void SetBeginsTime(int32_t idx);\r
+ int32_t GetBeginsTime();\r
+ void SetFrequencyScore();\r
+ uint8_t GetFrequencyScore();\r
+ void SetHeartRate();\r
+ uint8_t GetHeartRate();\r
+ uint32_t GetTheNumberOfPlays();\r
+\r
+protected:\r
+ void DefaultData();\r
+\r
+private:\r
+ BreathModel();\r
+ BreathModel(const BreathModel &);\r
+ BreathModel &operator=(const BreathModel &);\r
+ const char *durList[SPEED_IDX_3];\r
+ const char *rhyList[SPEED_IDX_3];\r
+ uint32_t durListVal[SPEED_IDX_3];\r
+ uint32_t rhyListVal[SPEED_IDX_3];\r
+ uint16_t data;\r
+ uint16_t date;\r
+ int32_t saveTime;\r
+ int32_t beginsTime;\r
+};\r
+}\r
+\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathPresenter\r
+ * Create: 2025-5-23\r
+ */\r
+\r
+#ifndef Breath_PRESENTER_H\r
+#define Breath_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+\r
+namespace OHOS {\r
+constexpr int16_t SET_INT_MAX_ = 255;\r
+\r
+class BreathView;\r
+class BreathPresenter : public Presenter<BreathView> {};\r
+}\r
+\r
+#endif // Breath_PRESENTER_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathResult\r
+ * Create: 2025-5-13\r
+ */\r
+#ifndef BREATH_RESULT_PAGE_H\r
+#define BREATH_RESULT_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_picker.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_toggle_button.h"\r
+#include "View.h"\r
+#include "UiConfig.h"\r
+#include "SlicePage.h"\r
+#include "SlicePageFactory.h"\r
+#include "breath/BreathModel.h"\r
+#include "breath/BreathPresenter.h"\r
+\r
+namespace OHOS {\r
+\r
+class BreathResultPage : public SlicePage<BreathPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ BreathResultPage();\r
+ ~BreathResultPage() override;\r
+ void OnStart(void* data) override;\r
+ void OnStop() override;\r
+ void OnResume() override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+\r
+private:\r
+ UILabel *trainingResults = nullptr;\r
+ UILabel *trainingFrequencies = nullptr;\r
+ UILabel *trainingHeartRate = nullptr;\r
+ UILabel *trainingDuration = nullptr;\r
+ UILabel *heartRateScout = nullptr;\r
+ UILabel *frequenciesScout = nullptr;\r
+ UIImageView *scores = nullptr;\r
+ UILabel *descriptionBreathing = nullptr;\r
+ UILabel *time = nullptr;\r
+ UILabel *timeUnit = nullptr;\r
+ UILabel *frequencyTimes = nullptr;\r
+ UILabel *heartRateTimes = nullptr;\r
+ UIViewGroup *group = nullptr;\r
+ uint8_t frequencyScore;\r
+ uint8_t heartRate;\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathRhyPage\r
+ * Create: 2025-5-13\r
+ */\r
+#ifndef BREATH_RHY_PAGE_H\r
+#define BREATH_RHY_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_picker.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label_button.h"\r
+#include "View.h"\r
+#include "SlicePage.h"\r
+#include "SlicePageFactory.h"\r
+#include "breath/BreathModel.h"\r
+#include "breath/BreathPresenter.h"\r
+\r
+namespace OHOS {\r
+\r
+class BreathRhyPage : public SlicePage<BreathPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener,\r
+ public UIPicker::SelectedListener {\r
+public:\r
+ BreathRhyPage();\r
+ ~BreathRhyPage() override;\r
+ void OnStart(void* data) override;\r
+ void OnResume() override;\r
+ void OnPause() override;\r
+ void OnStop() override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+\r
+private:\r
+ UILabel *lableRhythm = nullptr;\r
+ UIPicker *pickerRhythm = nullptr;\r
+ UIButton *buttonOk = nullptr;\r
+ UIViewGroup *group = nullptr;\r
+ UIImageView *center = nullptr;\r
+};\r
+} // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathStartPage\r
+ * Create: 2025-5-13\r
+ */\r
+#ifndef BREATH_START_PAGE_H\r
+#define BREATH_START_PAGE_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_image_view.h"\r
+#include "View.h"\r
+#include "SlicePage.h"\r
+#include "graphic_timer.h"\r
+#include "SlicePageFactory.h"\r
+#include "breath/BreathModel.h"\r
+#include "breath/BreathPresenter.h"\r
+\r
+namespace OHOS {\r
+\r
+class BreathStartPage : public SlicePage<BreathPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ BreathStartPage();\r
+ ~BreathStartPage() override;\r
+ void OnStart(void* data) override;\r
+ void OnStop() override;\r
+ void OnTimer();\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ void OnPause() override;\r
+private:\r
+ UILabel *titleLable = nullptr;\r
+ UILabel *guideLable = nullptr;\r
+ UIImageView *centerImge = nullptr;\r
+ UIViewGroup *group = nullptr;\r
+ UIImageView *background = nullptr;\r
+\r
+ class BreathStartCallback : public AnimatorCallback {\r
+ public:\r
+ BreathStartCallback(BreathStartPage* page) : BreathStartPage(page) {}\r
+ virtual ~BreathStartCallback() override {}\r
+ void Callback(UIView* view) override;\r
+ private:\r
+ BreathStartPage* BreathStartPage{nullptr};\r
+ };\r
+ BreathStartCallback* animatorCallBack{nullptr};\r
+ Animator *animation = nullptr;\r
+};\r
+} // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BreathView\r
+ * Create: 2025-5-14\r
+ */\r
+\r
+#ifndef BREATH_VIEW_H\r
+#define BREATH_VIEW_H\r
+\r
+#include "View.h"\r
+namespace OHOS {\r
+enum BrearhView {\r
+ BREATH_MAIN_VIEW = 1,\r
+ BREATH_DUR_VIEW = 2,\r
+ BREATH_EXER_VIEW = 3,\r
+ BREATH_RHY_VIEW = 4,\r
+ BREATH_START_VIEW = 5,\r
+ BREATH_RESULT_VIEW = 6,\r
+};\r
+\r
+class BreathPresenter;\r
+class BreathView : public View<BreathPresenter> {};\r
+}\r
+#endif // BREATH_VIEW_H
\ No newline at end of file
#include "components/ui_image_view.h"\r
#include "components/ui_label_button.h"\r
\r
-#include "CallerLogModel.h"\r
+#include "callerlog/CallerLogModel.h"\r
#include "UiConfig.h"\r
-#include "PhoneService.h"\r
+#include "phoneservice/PhoneService.h"\r
\r
namespace OHOS {\r
class CallerItemView : public UIViewGroup {\r
#define CALLER_LOG_MODEL_H\r
\r
#include "string"\r
-#include "PhoneService.h"\r
+#include "phoneservice/PhoneService.h"\r
#include "AppViewIDs.h"\r
#include "message.h"\r
#include "msg_center.h"\r
\r
#include "Presenter.h"\r
#include "ohos_types.h"\r
-#include "CallerLogModel.h"\r
+#include "callerlog/CallerLogModel.h"\r
#include "graphic_timer.h"\r
#include "sys/time.h"\r
\r
#define CALLER_LOG_VIEW_H\r
\r
#include "View.h"\r
-#include "CallerLogPresenter.h"\r
-#include "CallerItemView.h"\r
+#include "callerlog/CallerLogPresenter.h"\r
+#include "callerlog/CallerItemView.h"\r
#include "components/ui_view_group.h"\r
#include "components/ui_image_animator.h"\r
#include "components/ui_scroll_view.h"\r
#include "components/ui_label_button.h"\r
#include "components/ui_list.h"\r
#include "components/abstract_adapter.h"\r
-#include "PhoneService.h"\r
+#include "phoneservice/PhoneService.h"\r
#include "vector.h"\r
#include "ChangeSliceListener.h"\r
\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: CameraMainPage\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#ifndef CAMERA_MAIN_PAGE_H\r
+#define CAMERA_MAIN_PAGE_H\r
+\r
+#include <sys/time.h>\r
+#include "View.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_digital_clock.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_list.h"\r
+#include "components/ui_image_animator.h"\r
+#include "ChangeSliceListener.h"\r
+#include "UiConfig.h"\r
+#include "layout/grid_layout.h"\r
+#include "SlicePageFactory.h"\r
+#include "SlicePage.h"\r
+#include "diag_service.h"\r
+#include "ohos_timer.h"\r
+#include "components/ui_chart.h"\r
+#include "camera/CameraModel.h"\r
+#include "camera/CameraPresenter.h"\r
+\r
+namespace OHOS {\r
+\r
+class CameraPresenter;\r
+\r
+class CameraModel;\r
+class CameraMainPage : public SlicePage<CameraPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ CameraMainPage();\r
+ ~CameraMainPage() override;\r
+\r
+ static CameraMainPage *GetInstance();\r
+\r
+ void OnStart(void* data) override;\r
+ uint8_t GetConnectStatus();\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ void OnPause() override;\r
+ \r
+ bool GetFirstFlag();\r
+ void SetFirstFlag(bool value);\r
+ void SetUpButton();\r
+ void InitCameraTimer();\r
+ void InitCameraView();\r
+ void DisableCameraTimer();\r
+ void SetCameraTime(int time);\r
+ void StopAnimator();\r
+ void PhotoTaken();\r
+ void Refresh_page();\r
+private:\r
+ UILabel *title = nullptr;\r
+ UILabel *cameraFind = nullptr;\r
+ UILabel *cameraTitle = nullptr;\r
+ UILabel *cameraTime = nullptr;\r
+ UIButton *button = nullptr;\r
+ bool isFirst;\r
+ UIScrollView* container_ = nullptr;\r
+ UIImageView *bluetoothDisconnected = nullptr;\r
+\r
+class CameraAnimatorCallback : public AnimatorCallback {\r
+public:\r
+ explicit CameraAnimatorCallback(CameraMainPage* page) : page_(page) {}\r
+ ~CameraAnimatorCallback() override {}\r
+ void Callback(UIView *view) override;\r
+\r
+private:\r
+ CameraMainPage* page_{nullptr};\r
+};\r
+ Animator *animator_ = nullptr;\r
+ CameraAnimatorCallback *callBack_ = nullptr;\r
+};\r
+}\r
+#endif // CAMERA_VIEW_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: CameraModel\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#ifndef CAMERA_MODEL_H\r
+#define CAMERA_MODEL_H\r
+\r
+#include <string>\r
+#include <list>\r
+#include "graphic_timer.h"\r
+\r
+namespace OHOS {\r
+class CameraModel {\r
+public:\r
+ static CameraModel &GetInstance(void);\r
+private:\r
+ CameraModel();\r
+ CameraModel(const CameraModel &);\r
+ CameraModel &operator=(const CameraModel &);\r
+ virtual ~CameraModel();\r
+ bool buttonStatus = 0;\r
+};\r
+}\r
+\r
+#endif // CAMERA_MODEL_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: CameraPresenter\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#ifndef CAMERA_PRESENTER_H\r
+#define CAMERA_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+#include "components/ui_view.h"\r
+\r
+namespace OHOS {\r
+\r
+class CameraView;\r
+class CameraPresenter : public Presenter<CameraView> {\r
+};\r
+}\r
+\r
+#endif // CAMERA_PRESENTER_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: CameraView\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#ifndef CAMERA_VIEW_H\r
+#define CAMERA_VIEW_H\r
+\r
+#include "View.h"\r
+namespace OHOS {\r
+enum CAMERA_PAGES {\r
+ CAMERA_MAIN_PAGE = 1, // 0 is invalid\r
+};\r
+\r
+class CameraPresenter;\r
+class CameraView : public View<CameraPresenter> {\r
+};\r
+}\r
+#endif // CAMERA_VIEW_H\r
#include "font/ui_font_bitmap.h"
#include "font/ui_font.h"
#include "graphic_config.h"
-#include "HealthModel.h"
-#include "ActivityModel.h"
+#include "main/HealthModel.h"
+#include "activity/ActivityModel.h"
#include "UiConfig.h"
#include "components/ui_card_page.h"
#include "animator/animator_manager.h"
#include "font/ui_font_bitmap.h"
#include "font/ui_font.h"
#include "graphic_config.h"
-#include "HealthModel.h"
-#include "ActivityModel.h"
+#include "main/HealthModel.h"
+#include "activity/ActivityModel.h"
#include "UiConfig.h"
#include "components/ui_card_page.h"
#include "animator/animator_manager.h"
--- /dev/null
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2022-2022. All rights reserved.\r
+ * Description: CompassControlView.h\r
+ * Author:\r
+ * Create: 2022-04-02\r
+ */\r
+\r
+#ifndef COMPASS_CONTROL_VIEW_H\r
+#define COMPASS_CONTROL_VIEW_H\r
+\r
+#include "components/ui_card_page.h"\r
+#include "compass/CompassFragment.h"\r
+\r
+namespace OHOS {\r
+\r
+class CompassControlView : public UICardPage {\r
+public:\r
+ CompassControlView();\r
+ void PreLoad(void) override;\r
+ void UnLoad(void) override;\r
+ void OnPause(void) override;\r
+ void OnActive(void) override;\r
+ void ScrollBegin(bool isActive) override;\r
+ void ScrollEnd(bool isActive) override;\r
+private:\r
+ CompassFragment *compassFragment_{nullptr};\r
+};\r
+}\r
+#endif\r
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: CompassView.h
+ * Author:
+ * Create: 2021-12-21
+ */
+
+#ifndef COMPASS_VIEW_H
+#define COMPASS_VIEW_H
+
+#include "components/ui_label.h"
+#include "components/ui_image_view.h"
+#include "components/ui_fragment.h"
+#include "common/task.h"
+
+namespace OHOS {
+class CompassFragment : public UIFragment, public Task {
+public:
+ void OnCreateView(void* data) override;
+ void OnResumeView() override;
+ void OnPauseView() override;
+ void OnDestroyView() override;
+ void Callback() override;
+
+private:
+ bool InitCompassImage(void);
+ bool LoadCompassImage(UIImageView *view, uint32_t resId);
+ UILabel *directionLabel_{nullptr};
+ UILabel *angleLabel_{nullptr};
+ UIImageView *bgImg_{nullptr};
+ UIImageView *fgImg_{nullptr};
+ UIImageView *trianImg_{nullptr};
+ bool initialized_{false};
+};
+}
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2022-2022. All rights reserved.\r
+ * Description: CompassModel.h\r
+ * Author:\r
+ * Create: 2022-04-02\r
+ */\r
+\r
+#ifndef COMPASS_MODEL_H\r
+#define COMPASS_MODEL_H\r
+\r
+#include <cstdint>\r
+\r
+namespace OHOS {\r
+class CompassModel {\r
+public:\r
+ static CompassModel *GetInstance(void);\r
+ bool OpenCompassSensor(void);\r
+ bool CloseCompassSensor(void);\r
+ void UpdateAngle(void);\r
+ void ResetAngle(void);\r
+ int16_t GetAngle(void);\r
+\r
+private:\r
+ int16_t angle_{0};\r
+ bool clockwise_{true};\r
+};\r
+}\r
+\r
+#endif\r
+\r
--- /dev/null
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: MainCompassPresenter.h\r
+ * Author:\r
+ * Create: 2021-12-21\r
+ */\r
+#ifndef COMPASS_MAINPRESENTER_H\r
+#define COMPASS_MAINPRESENTER_H\r
+\r
+#include "Presenter.h"\r
+#include "compass/MainCompassView.h"\r
+#include "compass/CompassModel.h"\r
+\r
+namespace OHOS {\r
+class MainCompassView;\r
+class MainCompassPresenter : public Presenter<MainCompassView>, public UIView::OnDragListener {\r
+public:\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+\r
+ void OnResume() override;\r
+\r
+ void OnPause() override;\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: MainCompassView\r
+ * Author:\r
+ * Create: 2021-12-23\r
+ */\r
+\r
+#ifndef MAIN_COMPASS_VIEW_H\r
+#define MAIN_COMPASS_VIEW_H\r
+\r
+#include "View.h"\r
+#include "compass/CompassFragment.h"\r
+\r
+namespace OHOS {\r
+class MainCompassPresenter;\r
+class MainCompassView : public View<MainCompassPresenter> {\r
+public:\r
+ MainCompassView() : compassFragment_(nullptr) {}\r
+ void OnStart() override;\r
+ void OnStop() override;\r
+\r
+private:\r
+ friend class MainCompassPresenter;\r
+ CompassFragment *compassFragment_;\r
+};\r
+} // namespace OHOS\r
+#endif
\ No newline at end of file
#define CONNECT_PHONE_PRESENTER_H\r
\r
#include "Presenter.h"\r
-#include "ConnectOpenView.h"\r
+#include "connectnewphone/ConnectOpenView.h"\r
#include "NativeLauncher.h"\r
#include "NativeAbility.h"\r
\r
#define CONNECT_PHONE_VIEW_H\r
\r
#include "View.h"\r
-#include "ConnectPhonePresenter.h"\r
-#include "ConnectSelectView.h"\r
-#include "AppGroupView.h"\r
+#include "connectnewphone/ConnectPhonePresenter.h"\r
+#include "connectnewphone/ConnectSelectView.h"\r
+#include "main/AppGroupView.h"\r
\r
namespace OHOS {\r
constexpr int16_t NUM_CONNECT_PHONE_CONTAINER = 2;\r
#define CONNECT_SELECT_VIEW_H\r
\r
#include "View.h"\r
-#include "ConnectPhonePresenter.h"\r
+#include "connectnewphone/ConnectPhonePresenter.h"\r
#include "components/ui_label.h"\r
#include "components/ui_button.h"\r
#include "components/ui_view_group.h"\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateAdapter\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef DATE_ADAPTER_H\r
+#define DATE_ADAPTER_H\r
+\r
+#include <list>\r
+#include <string>\r
+#include "components/ui_list.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/abstract_adapter.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "date/DateModel.h"\r
+#include "date/DateItemView.h"\r
+\r
+namespace OHOS {\r
+class DateAdapter : public AbstractAdapter {\r
+public:\r
+ explicit DateAdapter();\r
+ ~DateAdapter() override;\r
+ void SetData(std::list<DateItem> &data);\r
+ uint16_t GetCount(void) override;\r
+ UIView *GetView(UIView *inView, int16_t index) override;\r
+ void AddListItem(const DateItem &item);\r
+ void SetItemClickListener(UIView::OnClickListener *itemclicklistener)\r
+ {\r
+ itemClickListener = itemclicklistener;\r
+ }\r
+ void ClearListItem();\r
+\r
+private:\r
+ std::list<DateItem> listData;\r
+ UIView::OnClickListener *itemClickListener{nullptr};\r
+};\r
+}\r
+\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateButtonAdapter\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef DATE_BUTTON_ADAPTER_H\r
+#define DATE_BUTTON_ADAPTER_H\r
+\r
+#include <list>\r
+#include <string>\r
+#include "components/ui_list.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/abstract_adapter.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "date/DateModel.h"\r
+#include "date/DateButtonItemView.h"\r
+\r
+namespace OHOS {\r
+class DateButtonAdapter : public AbstractAdapter {\r
+public:\r
+ explicit DateButtonAdapter();\r
+ ~DateButtonAdapter() override;\r
+\r
+ void SetData(std::list<DateButtonItem> &data);\r
+ uint16_t GetCount(void) override;\r
+ UIView *GetView(UIView *inView, int16_t index) override;\r
+ void AddListItem(const DateButtonItem &item);\r
+ void SetItemClickListener(UIView::OnClickListener *itemclicklistener)\r
+ {\r
+ itemClickListener = itemclicklistener;\r
+ }\r
+ void ClearListItem();\r
+\r
+private:\r
+ std::list<DateButtonItem> listData;\r
+ UIView::OnClickListener *itemClickListener{nullptr};\r
+};\r
+}\r
+\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateButtonItemView\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef DATE_BUTTON_ITEM_VIEW_H\r
+#define DATE_BUTTON_ITEM_VIEW_H\r
+\r
+#include "date/DateModel.h"\r
+#include "UiConfig.h"\r
+#include "components/ui_canvas.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_view_group.h"\r
+#include "main/LoadImg.h"\r
+\r
+namespace OHOS {\r
+class DateButtonItemView : public UIViewGroup {\r
+public:\r
+ explicit DateButtonItemView();\r
+ ~DateButtonItemView() override;\r
+ virtual void SetItemInfo(const DateButtonItem itemInfo);\r
+ virtual void SetUpChild();\r
+ DateButtonItem GetItem();\r
+\r
+private:\r
+ static bool flag;\r
+ UILabelButton sLabelButton;\r
+ DateButtonItem sItemInfo = {nullptr, 0, false, false};\r
+};\r
+}\r
+\r
+#endif\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateItemView\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef DATE_ITEM_VIEW_H\r
+#define DATE_ITEM_VIEW_H\r
+\r
+#include "date/DateModel.h"\r
+#include "UiConfig.h"\r
+#include "components/ui_canvas.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_view_group.h"\r
+\r
+namespace OHOS {\r
+class DateItemView : public UIViewGroup {\r
+public:\r
+ explicit DateItemView();\r
+ ~DateItemView() override;\r
+ virtual void SetItemInfo(const DateItem itemInfo);\r
+ virtual void SetUpChild();\r
+ const char *GetViewId();\r
+ bool GetVisiable();\r
+\r
+private:\r
+ UILabel sLabel_1;\r
+ UIImageView sIcon;\r
+ UILabel sLabel_2;\r
+ UIImageView sNextImage;\r
+ UIImageView Schedule;\r
+ UIImageView Signs;\r
+ UIImageView BackGround;\r
+ DateItem sItemInfo = {nullptr, nullptr, nullptr, false};\r
+};\r
+}\r
+\r
+#endif\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateMainPage\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef DATE_MAIN_PAGE_H\r
+#define DATE_MAIN_PAGE_H\r
+\r
+#include <string>\r
+#include <iomanip>\r
+#include <string>\r
+#include <sys/time.h>\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_list.h"\r
+#include "date/DateAdapter.h"\r
+#include "date/DateButtonAdapter.h"\r
+#include "date/DatePresenter.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "date/DateView.h"\r
+#include "components/ui_button.h"\r
+\r
+namespace OHOS {\r
+#define LABEL_COUNT 4\r
+static constexpr int16_t START_YEAR = 1900;\r
+\r
+class DatePresenter;\r
+class DateMainPage : public SlicePage<DatePresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ DateMainPage();\r
+ ~DateMainPage() override;\r
+ void OnStart(void* data) override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ void InitDownList();\r
+ void UpdateMsg(std::string dateMsg);\r
+ void SetDownListAdapter();\r
+ bool InitDateTop();\r
+ std::string GetFutureDate(int days_ahead);\r
+ void RefreshButtonListDate(int value);\r
+private:\r
+ UIScrollView *uiScrollView = nullptr;\r
+ DateAdapter *listAdapter{nullptr};\r
+ UIList *downContentList{nullptr};\r
+ UIImageView *image1{nullptr};\r
+ DateButtonAdapter *buttonAdapter{nullptr};\r
+ UIList *buttonContentList{nullptr};\r
+ UILabel *title{nullptr};\r
+ std::list<DateButtonItem> listTop;\r
+ std::string strDate[SET_SEVEN];\r
+ std::string strDay[SET_SEVEN];\r
+};\r
+}\r
+#endif // SETTING_MAIN_PAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateMessagePage\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#ifndef DATE_MESSAGE_H\r
+#define DATE_MESSAGE_H\r
+\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_swipe_view.h"\r
+#include "ui_swipe_view.h"\r
+#include "date/DatePresenter.h"\r
+#include "date/DateModel.h"\r
+#include "date/DateView.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+\r
+namespace OHOS {\r
+#define LABEL_COUNT 8\r
+class DatePresenter;\r
+class DateMessagePage : public SlicePage<DatePresenter>,\r
+ public UIView::OnDragListener {\r
+public:\r
+ DateMessagePage();\r
+ ~DateMessagePage() override;\r
+ void OnStart(void* data) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+\r
+private:\r
+ UIViewGroup *group;\r
+ UIImageView *image1;\r
+ UILabel *labelTitle{nullptr};\r
+ UILabel *labelMessage{nullptr};\r
+ UILabel *labelTime{nullptr};\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateModel\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef DATE_MODEL_H\r
+#define DATE_MODEL_H\r
+\r
+#include <sys/time.h>\r
+#include <chrono>\r
+#include <cstdint>\r
+#include <ctime>\r
+#include <fstream>\r
+#include <iomanip>\r
+#include <iostream>\r
+#include <list>\r
+#include <map>\r
+#include <random>\r
+#include <sstream>\r
+#include <unordered_map>\r
+#include "hal_tick.h"\r
+#include "AppViewIDs.h"\r
+#include "UiConfig.h"\r
+#include "cJSON.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16 HOUR_COUNT = 24;\r
+static constexpr uint64_t CENTI_SECOND_UNIT = 100;\r
+static constexpr uint64_t MS_ONE_SECONDS = 1000;\r
+static constexpr uint16_t NUM_TEN = 10;\r
+static constexpr uint16_t NUM_TIME_MIN = 60;\r
+static constexpr uint16_t NUM_TIME_HOUR = 3600;\r
+static constexpr int32_t NUM_TIME_DAY = 86400;\r
+static constexpr int16_t MIN_TO_HOUR = 60;\r
+static constexpr int16_t HOURLY_SYSTEM = 24;\r
+typedef struct {\r
+ std::string hour;\r
+ std::string eventTitle;\r
+ std::string startTime;\r
+ std::string week;\r
+} DateMsg;\r
+\r
+typedef struct {\r
+ const char *label_1;\r
+ const char *label_2;\r
+ const char *index;\r
+ bool visiable;\r
+} DateItem;\r
+\r
+typedef struct {\r
+ const char *button_viewId;\r
+ const char *button_day;\r
+ int index;\r
+ bool isFirst;\r
+ bool isSelect;\r
+} DateButtonItem;\r
+\r
+static const uint16_t DATE_ITEM_COUNT = 10;\r
+class DateModel {\r
+public:\r
+ static DateModel &GetInstance(void);\r
+ virtual ~DateModel();\r
+ bool InitDateVec(std::string dateStr);\r
+ bool InitDate();\r
+\r
+ const char *GetViewId();\r
+ std::unordered_map<std::string, std::vector<DateMsg>> keyValues;\r
+ std::list<DateItem> listDate;\r
+ std::string now;\r
+ std::string titleName;\r
+ std::string messageIndex;\r
+ std::string strIndex;\r
+\r
+private:\r
+ DateModel();\r
+ DateModel(const DateModel &);\r
+ DateModel &operator=(const DateModel &);\r
+};\r
+}\r
+\r
+#endif // DATE_MODEL_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DatePresenter\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef DATE_PRESENTER_H\r
+#define DATE_PRESENTER_H\r
+\r
+#include "date/DateModel.h"\r
+#include "Presenter.h"\r
+#include "components/ui_view.h"\r
+namespace OHOS {\r
+constexpr int16 BACKGROUND_IMAGE_WIDTH = 190;\r
+constexpr int16 SET_ZERO = 0;\r
+constexpr int16 SET_ONE = 1;\r
+constexpr int16 SET_TWO = 2;\r
+constexpr int16 SET_THREE = 3;\r
+constexpr int16 SET_FOUR = 4;\r
+constexpr int16 SET_FIVE = 5;\r
+constexpr int16 SET_SIX = 6;\r
+constexpr int16 SET_SEVEN = 7;\r
+constexpr int16 SET_EIGHT = 8;\r
+constexpr int16 SET_NINE = 9;\r
+constexpr int16 SET_TEN = 10;\r
+constexpr int16 SET_TWELVE = 12;\r
+constexpr int16 SET_THIRTEEN = 13;\r
+constexpr int16 SET_FOURTEEN = 14;\r
+constexpr int16 SET_HUNDRED = 100;\r
+constexpr int16 SET_TWO_HUNDRED = 200;\r
+\r
+class DateView;\r
+class DatePresenter : public Presenter<DateView> {};\r
+}\r
+\r
+#endif // DATE_PRESENTER_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: DateView\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef DATE_VIEW_H\r
+#define DATE_VIEW_H\r
+\r
+#include "View.h"\r
+namespace OHOS {\r
+enum DATE_PAGES {\r
+ DATE_MAIN_PAGE = 1, // 0 is invalid\r
+ DATE_MESSAGE_PAGE = 2,\r
+};\r
+\r
+class DatePresenter;\r
+class DateView : public View<DatePresenter> {};\r
+}\r
+#endif // Date_VIEW_H\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: EmptyPage\r
+ * Create: 2025-04-24\r
+ */\r
+#ifndef EMPTY_PAGE_H\r
+#define EMPTY_PAGE_H\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label.h"\r
+#include "SlicePage.h"\r
+#include "emptypage/EmptyPresenter.h"\r
+\r
+namespace OHOS {\r
+\r
+class EmptyPage : public SlicePage<EmptyPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ EmptyPage(){};\r
+ ~EmptyPage();\r
+ void OnStart(void* data) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+\r
+private:\r
+ EmptyPage(const EmptyPage &) = delete;\r
+ EmptyPage &operator=(const EmptyPage &) = delete;\r
+ EmptyPage(EmptyPage &&) = delete;\r
+ EmptyPage &operator=(EmptyPage &&) = delete;\r
+\r
+ UIScrollView *container_ = nullptr;\r
+ UILabel *memLabel_ = nullptr;\r
+ uint32_t used_ = 0;\r
+ uint32_t free_ = 0;\r
+};\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+#if !defined(_WIN32)\r
+uint32_t test_get_mem_info(uint8_t memType, uint32_t *used, uint32_t *free);\r
+#endif\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+} // namespace OHOS\r
+#endif /* EMPTY_PAGE_H */\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: EmptyPresenter\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef EMPTY_PRESENTER_H\r
+#define EMPTY_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+\r
+namespace OHOS {\r
+class EmptyView;\r
+class EmptyPresenter : public Presenter<EmptyView> {};\r
+}\r
+\r
+#endif // EMPTY_PRESENTER_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: EmptyView\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef EMPTY_VIEW_H\r
+#define EMPTY_VIEW_H\r
+#include "View.h"\r
+namespace OHOS {\r
+class EmptyPresenter;\r
+class EmptyView : public View<EmptyPresenter> {};\r
+}\r
+#endif // EMPTY_VIEW_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FindPhoneMainPage\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef FINDPHONE_MAIN_PAGE_H\r
+#define FINDPHONE_MAIN_PAGE_H\r
+\r
+#include <string>\r
+#include "View.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_digital_clock.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_list.h"\r
+#include "components/ui_image_animator.h"\r
+#include "ChangeSliceListener.h"\r
+#include "UiConfig.h"\r
+#include "layout/grid_layout.h"\r
+#include "SlicePageFactory.h"\r
+#include "SlicePage.h"\r
+#include "diag_service.h"\r
+#include "ohos_timer.h"\r
+#include "findphone/FindPhoneModel.h"\r
+#include "findphone/FindPhonePresenter.h"\r
+\r
+#define ALIPAY_BIND_SEARCH_IMAGE_NUM 28\r
+namespace OHOS {\r
+static int timeCount = 0;\r
+static constexpr uint64_t MS_ONE_SECONDS = 1000;\r
+class FindPhonePresenter;\r
+class FindPhoneModel;\r
+class FindPhoneMainPage : public SlicePage<FindPhonePresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ FindPhoneMainPage();\r
+ ~FindPhoneMainPage() override;\r
+ static FindPhoneMainPage *GetInstance();\r
+ void OnStart(void* data) override;\r
+ void OnStop() override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool ClickButtonChange();\r
+ void SetUpImageAnimator();\r
+ void SetupButton();\r
+ void InitImageInfo();\r
+ void ShowReset();\r
+ void DisableFindPhoneTimer();\r
+ void InitFindPhoneTimer();\r
+ bool StopFindPhone();\r
+ uint8_t GetConnectStatus();\r
+ void ChangeToDisConnect();\r
+private:\r
+ UIViewGroup* container_ = nullptr;\r
+ UILabel* labelUnder = nullptr;\r
+ UILabel* labelFindTitle = nullptr;\r
+ UIButton* buttonFind = nullptr;\r
+ UIButton* buttonRty = nullptr;\r
+ UILabel *labelRing = nullptr;\r
+ UIImageView *mainImage = nullptr;\r
+ ImageInfo* imageInfo1_ = nullptr;\r
+ ImageInfo* imageInfo2_ = nullptr;\r
+ ImageInfo* imageInfo3_ = nullptr;\r
+ ImageAnimatorInfo imageAnimatorImageInfo_[SET_THREE] = { 0 };\r
+ UIImageAnimatorView* imageAnimator_ = nullptr;\r
+ GraphicTimer *g_startCount = nullptr;\r
+ ImageAnimatorInfo searchImageInfo[ALIPAY_BIND_SEARCH_IMAGE_NUM];\r
+};\r
+}\r
+#endif // FINDPHONE_VIEW_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FindPhoneModel\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef FINDPHONE_MODEL_H\r
+#define FINDPHONE_MODEL_H\r
+\r
+#include <sys/time.h>\r
+#include <list>\r
+#include <string>\r
+#include "graphic_timer.h"\r
+\r
+namespace OHOS {\r
+constexpr int16_t SET_ZERO = 0;\r
+constexpr int16_t SET_ONE = 1;\r
+constexpr int16_t SET_TWO = 2;\r
+constexpr int16_t SET_THREE = 3;\r
+constexpr int16_t SET_FOUR = 4;\r
+constexpr int16_t SET_FIVE = 5;\r
+constexpr int16_t SET_SIX = 6;\r
+constexpr int16_t SET_SEVEN = 7;\r
+constexpr int16_t SET_EIGHT = 8;\r
+constexpr int16_t SET_NINE = 9;\r
+constexpr int16_t SET_TEN = 10;\r
+constexpr int16_t SET_INT_MAX = 255;\r
+\r
+class FindPhoneModel {\r
+public:\r
+ static FindPhoneModel &GetInstance(void);\r
+\r
+private:\r
+ FindPhoneModel();\r
+ FindPhoneModel(const FindPhoneModel &);\r
+ FindPhoneModel &operator=(const FindPhoneModel &);\r
+ virtual ~FindPhoneModel();\r
+ bool buttonStatus = 0;\r
+};\r
+}\r
+\r
+#endif // FINDPHONE_MODEL_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FindPhonePresenter\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef FINDPHONE_PRESENTER_H\r
+#define FINDPHONE_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+#include "components/ui_view.h"\r
+\r
+namespace OHOS {\r
+class FindPhoneView;\r
+class FindPhonePresenter : public Presenter<FindPhoneView> {};\r
+}\r
+\r
+#endif // FINDPHONE_PRESENTER_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FindPhoneView\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef FINDPHONE_VIEW_H\r
+#define FINDPHONE_VIEW_H\r
+\r
+#include "View.h"\r
+namespace OHOS {\r
+enum FIND_PHONE_PAGES {\r
+ FIND_PHONE_MAIN_PAGE = 1, // 0 is invalid\r
+ FIND_PHONE_MESSAGE_PAGE = 2,\r
+};\r
+\r
+class FindPhonePresenter;\r
+class FindPhoneView : public View<FindPhonePresenter> {};\r
+}\r
+#endif // FINDPHONE_VIEW_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightBlinkPage\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef FLASHLIGHT_BLINK_PAGE_H\r
+#define FLASHLIGHT_BLINK_PAGE_H\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button_ext.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "SlicePage.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "components/ui_picker.h"\r
+\r
+namespace OHOS {\r
+class FlashLightBlinkPage : public SlicePage<FlashLightPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ FlashLightBlinkPage(){};\r
+ ~FlashLightBlinkPage();\r
+ void OnStart(void* data) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+\r
+private:\r
+ FlashLightBlinkPage(const FlashLightBlinkPage &) = delete;\r
+ FlashLightBlinkPage &operator=(const FlashLightBlinkPage &) = delete;\r
+ FlashLightBlinkPage(FlashLightBlinkPage &&) = delete;\r
+ FlashLightBlinkPage &operator=(FlashLightBlinkPage &&) = delete;\r
+\r
+ UIScrollView *container_ = nullptr;\r
+ UILabel *blinkLabel_ = nullptr;\r
+ UIPicker* blinkPicker_ = nullptr;\r
+ UILabelButtonExt* blinkButton_ = nullptr;\r
+};\r
+} // namespace OHOS\r
+#endif /* FLASHLIGHT_BLINK_PAGE_H */\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightColorPage\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef FLASHLIGHT_COLOR_PAGE_H\r
+#define FLASHLIGHT_COLOR_PAGE_H\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button_ext.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "SlicePage.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+\r
+namespace OHOS {\r
+class FlashLightColorPage : public SlicePage<FlashLightPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ FlashLightColorPage(){};\r
+ ~FlashLightColorPage();\r
+ void OnStart(void* data) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+\r
+private:\r
+ FlashLightColorPage(const FlashLightColorPage &) = delete;\r
+ FlashLightColorPage &operator=(const FlashLightColorPage &) = delete;\r
+ FlashLightColorPage(FlashLightColorPage &&) = delete;\r
+ FlashLightColorPage &operator=(FlashLightColorPage &&) = delete;\r
+\r
+ UIScrollView *container_ = nullptr;\r
+ UILabel *colorLabel_ = nullptr;\r
+ UILabelButtonExt *color1Button_ = nullptr;\r
+ UILabelButtonExt *color2Button_ = nullptr;\r
+ UILabelButtonExt *color3Button_ = nullptr;\r
+ UILabelButtonExt *color4Button_ = nullptr;\r
+ UILabelButtonExt *color5Button_ = nullptr;\r
+ UILabelButtonExt *color6Button_ = nullptr;\r
+ UILabelButtonExt *color7Button_ = nullptr;\r
+ UILabelButtonExt *color8Button_ = nullptr;\r
+ UILabelButtonExt *color9Button_ = nullptr;\r
+};\r
+} // namespace OHOS\r
+#endif /* FLASHLIGHT_COLOR_PAGE_H */\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightDefaultPage\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef FLASHLIGHT_DEFAULT_PAGE_H\r
+#define FLASHLIGHT_DEFAULT_PAGE_H\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button_ext.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "SlicePage.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+\r
+namespace OHOS {\r
+class FlashLightDefaultPage : public SlicePage<FlashLightPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ FlashLightDefaultPage(){};\r
+ ~FlashLightDefaultPage();\r
+ void OnStart(void* data) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+\r
+private:\r
+ FlashLightDefaultPage(const FlashLightDefaultPage &) = delete;\r
+ FlashLightDefaultPage &operator=(const FlashLightDefaultPage &) = delete;\r
+ FlashLightDefaultPage(FlashLightDefaultPage &&) = delete;\r
+ FlashLightDefaultPage &operator=(FlashLightDefaultPage &&) = delete;\r
+\r
+ UIScrollView *container_ = nullptr;\r
+ UILabel *recoverLabel_ = nullptr;\r
+ UILabelButtonExt *cancelButton_ = nullptr;\r
+ UILabelButtonExt *confirmButton_ = nullptr;\r
+};\r
+} // namespace OHOS\r
+#endif /* FLASHLIGHT_DEFAULT_PAGE_H */\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightModel\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef FLASHLIGHT_MODEL_H\r
+#define FLASHLIGHT_MODEL_H\r
+\r
+#include <cstdint>\r
+#include <map>\r
+#include <string>\r
+#include <sys/time.h>\r
+#include "AppViewIDs.h"\r
+#include "UiConfig.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "flashlight/FlashlightUiResourceImage.h"\r
+#ifndef _WIN32\r
+#include "time64.h"\r
+#endif\r
+namespace OHOS {\r
+enum FlashLightBlinkFrequency { SLOW_BLINK = 0, FAST_BLINK, NOT_BLINK };\r
+\r
+enum FlashLightColorAttribute {\r
+ BLACK_COLOR = 0,\r
+ WHITE_COLOR = 1,\r
+ RED_COLOR = 2,\r
+ ORANGE_COLOR = 3,\r
+ YELLOW_COLOR = 4,\r
+ GREEN_COLOR = 5,\r
+ LIGHT_BLUE_COLOR = 6,\r
+ DARK_BLUE_COLOR = 7,\r
+ PURPLE_COLOR = 8,\r
+ MULTI_COLOR = 9,\r
+};\r
+\r
+class FlashLightModel {\r
+public:\r
+ static FlashLightModel &GetInstance(void);\r
+ // 设置手电筒颜色;\r
+ FlashLightColorAttribute GetViewColor();\r
+ void SetViewColor(FlashLightColorAttribute color);\r
+ // 设置手电筒闪烁频率;\r
+ FlashLightBlinkFrequency GetBlinkFrequency();\r
+ void SetBlinkFrequency(FlashLightBlinkFrequency blinkFrequency);\r
+ // 恢复默认参数;\r
+ void SetDefault();\r
+ // 获取当前时间;\r
+ uint32_t GetSysCurrentTime(std::string ¤tTime);\r
+\r
+private:\r
+ FlashLightModel(FlashLightColorAttribute color = FlashLightColorAttribute::WHITE_COLOR,\r
+ FlashLightBlinkFrequency blinkFrequency = FlashLightBlinkFrequency::NOT_BLINK);\r
+ FlashLightModel(const FlashLightModel &);\r
+ FlashLightModel &operator=(const FlashLightModel &);\r
+ virtual ~FlashLightModel();\r
+\r
+private:\r
+#ifdef _WIN32\r
+ struct timeval sysTime_ {\r
+ 0\r
+ };\r
+#else\r
+ struct timeval64 sysTime_ {\r
+ 0\r
+ };\r
+#endif\r
+ FlashLightColorAttribute color_;\r
+ FlashLightBlinkFrequency blinkFrequency_;\r
+};\r
+}\r
+\r
+#endif // FLASHLIGHT_MODEL_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightPage\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef FLASHLIGHT_PAGE_H\r
+#define FLASHLIGHT_PAGE_H\r
+\r
+#include <string>\r
+#include "View.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_list.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_image_view.h"\r
+#include "ChangeSliceListener.h"\r
+#include "UiConfig.h"\r
+#include "SlicePage.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "animator.h"\r
+\r
+namespace OHOS {\r
+class FlashLightPage : public SlicePage<FlashLightPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ FlashLightPage(){};\r
+ ~FlashLightPage();\r
+\r
+ void OnStart(void* data) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+\r
+private:\r
+ class TimeAnimatorCallback : public AnimatorCallback {\r
+ public:\r
+ TimeAnimatorCallback() {}\r
+ virtual ~TimeAnimatorCallback() override {}\r
+ void Callback(UIView* view) override;\r
+ };\r
+ TimeAnimatorCallback* timeCallback_ = nullptr;\r
+ Animator* timeAnimator_ = nullptr;\r
+ UILabelButton* flashLightOn_ = nullptr;\r
+ UILabel* systemTime_ = nullptr;\r
+ UILabel* OnLabel_ = nullptr;\r
+ UIImageView* imageArrow_ = nullptr;\r
+ UIScrollView *container_ = nullptr;\r
+};\r
+}\r
+#endif // FLASHLIGHT_PAGE_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightPlayPage\r
+ * Create: 2025-04-24\r
+ */\r
+#ifndef FLASHLIGHT_PLAY_PAGE_H\r
+#define FLASHLIGHT_PLAY_PAGE_H\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_image_animator.h"\r
+#include "SlicePage.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "flashlight/FlashLightModel.h"\r
+\r
+namespace OHOS {\r
+class FlashLightPlayPage : public SlicePage<FlashLightPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ FlashLightPlayPage(){};\r
+ ~FlashLightPlayPage();\r
+ void OnStart(void* data) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+\r
+private:\r
+ FlashLightPlayPage(const FlashLightPlayPage &) = delete;\r
+ FlashLightPlayPage &operator=(const FlashLightPlayPage &) = delete;\r
+ FlashLightPlayPage(FlashLightPlayPage &&) = delete;\r
+ FlashLightPlayPage &operator=(FlashLightPlayPage &&) = delete;\r
+\r
+ UIScrollView *container_ = nullptr;\r
+ UIImageAnimatorView *playImageAnimal = nullptr;\r
+ ImageAnimatorInfo playImageInfo[2];\r
+};\r
+} // namespace OHOS\r
+#endif /* FLASHLIGHT_PLAY_PAGE_H */\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightPresenter\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef FLASHLIGHT_PRESENTER_H\r
+#define FLASHLIGHT_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+\r
+namespace OHOS {\r
+\r
+class FlashLightView;\r
+class FlashLightPresenter : public Presenter<FlashLightView> {};\r
+}\r
+\r
+#endif // FLASHLIGHT_PRESENTER_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightSetItemAdapter\r
+ * Create: 2025-11-23\r
+ */\r
+\r
+#ifndef FLASHLIGHTSET_ITEM_ADAPTER_H\r
+#define FLASHLIGHTSET_ITEM_ADAPTER_H\r
+\r
+#include "flashlight/FlashLightSetItemAdapter.h"\r
+#include "flashlight/FlashLightSetItemView.h"\r
+#include "components/abstract_adapter.h"\r
+#include "gfx_utils/vector.h"\r
+\r
+namespace OHOS {\r
+\r
+class FlashLightSetItemAdapter : public AbstractAdapter {\r
+public:\r
+ explicit FlashLightSetItemAdapter();\r
+ ~FlashLightSetItemAdapter() override;\r
+\r
+ /* *\r
+ * @brief Sets the UIView adapter data, which is a SettingItem linked list.\r
+ *\r
+ * @param data Indicates the SettingItem linked list data.\r
+ * @since 1.0\r
+ * @version 1.0\r
+ */\r
+ void SetData(const Graphic::Vector<FlashLightSetItem> &data);\r
+\r
+ /* *\r
+ * @brief Obtains the <b>data</b> size of the UILabel adapter.\r
+ *\r
+ * @return Returns the <b>data</b> size of the UILabel adapter.\r
+ * @since 1.0\r
+ * @version 1.0\r
+ */\r
+ uint16_t GetCount(void) override;\r
+\r
+ UIView *GetView(UIView *inView, int16_t index) override;\r
+\r
+ void AddListItem(const FlashLightSetItem &item);\r
+\r
+ void SetItemClickListener(UIView::OnClickListener *itemclicklistener)\r
+ {\r
+ itemClickListener = itemclicklistener;\r
+ }\r
+private:\r
+ Graphic::Vector<FlashLightSetItem> itemDatas_;\r
+ UIView::OnClickListener *itemClickListener{nullptr};\r
+};\r
+}\r
+\r
+#endif // FLASHLIGHTSET_ITEM_ADAPTER_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightSetItemView\r
+ * Create: 2025-05-18\r
+ */\r
+\r
+#ifndef FLASHLIGHTSET_ITEM_VIEW_H\r
+#define FLASHLIGHTSET_ITEM_VIEW_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+ uint8_t item;\r
+ uint32_t resId;\r
+ std::string label;\r
+ std::string itemLabel;\r
+ std::string viewId;\r
+} FlashLightSetItem;\r
+\r
+class FlashLightSetItemView : public UIViewGroup {\r
+public:\r
+ FlashLightSetItemView();\r
+ ~FlashLightSetItemView() override;\r
+ virtual void SetItemInfo(const FlashLightSetItem itemInfo);\r
+ const char *GetViewId() const;\r
+\r
+private:\r
+ UIImageView sIcon;\r
+ UILabel sLabel;\r
+ UILabel itemLabel;\r
+ UIImageView sNextImage;\r
+ FlashLightSetItem sItemInfo = {0, 0, "", "", ""};\r
+};\r
+}\r
+#endif // FLASHLIGHTSET_ITEM_VIEW_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightSetPage\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef FLASHLIGHT_SET_PAGE_H\r
+#define FLASHLIGHT_SET_PAGE_H\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button_ext.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_list.h"\r
+#include "SlicePage.h"\r
+#include "flashlight/FlashLightPresenter.h"\r
+#include "flashlight/FlashLightSetItemAdapter.h"\r
+#include "flashlight/FlashLightSetItemView.h"\r
+#include "UiConfig.h"\r
+#include "main/LoadImg.h"\r
+#include "flashlight/FlashlightUiResourceImage.h"\r
+\r
+namespace OHOS {\r
+class FlashLightSetPage : public SlicePage<FlashLightPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ FlashLightSetPage(){};\r
+ ~FlashLightSetPage();\r
+ void OnStart(void* data) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+\r
+private:\r
+ FlashLightSetPage(const FlashLightSetPage &) = delete;\r
+ FlashLightSetPage &operator=(const FlashLightSetPage &) = delete;\r
+ FlashLightSetPage(FlashLightSetPage &&) = delete;\r
+ FlashLightSetPage &operator=(FlashLightSetPage &&) = delete;\r
+\r
+ UIScrollView *container_ = nullptr;\r
+ UILabel *setLabel_ = nullptr;\r
+ UILabelButtonExt *recoverButton_ = nullptr;\r
+\r
+ UIList* setItemList_ = nullptr;\r
+ FlashLightSetItemAdapter *setItemAdapter_ = nullptr;\r
+ FlashLightSetItem colorItem_ = {1, IMAGE_CONVERTER_TOOL_COLORITEM, "灯光颜色"};\r
+ FlashLightSetItem blinkItem_ = {2, IMAGE_CONVERTER_TOOL_BLINKITEM, "闪烁频率"};\r
+};\r
+} // namespace OHOS\r
+#endif /* FLASHLIGHT_SET_PAGE_H */\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashLightView\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef FLASHLIGHT_VIEW_H\r
+#define FLASHLIGHT_VIEW_H\r
+#include "View.h"\r
+namespace OHOS {\r
+\r
+enum FlashLightAllView {\r
+ FLASH_LIGTH_VIEW = 1, // 手电筒主界面\r
+ FLASH_LIGHT_PLAY_VIEW, // 手电筒显示播放\r
+ FLASH_LIGHT_SET_VIEW, // 手电筒设置\r
+ FLASH_LIGHT_COLOR_VIEW, // 手电筒颜色\r
+ FLASH_LIGHT_BLINK_VIEW, // 手电筒闪烁\r
+ FLASH_LIGHT_DEFAULT_VIEW, // 手电筒默认\r
+ FLASH_LIGHT_ALL_VIEW,\r
+};\r
+\r
+class FlashLightPresenter;\r
+class FlashLightView : public View<FlashLightPresenter> {};\r
+}\r
+#endif // FLASHLIGHT_VIEW_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FlashlightUiResourceImage\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef FLASHLIGHT_UI_RESOURCE_IMAGE_H\r
+#define FLASHLIGHT_UI_RESOURCE_IMAGE_H\r
+#include <cstdint>\r
+namespace OHOS {\r
+static const int IMAGE_CONVERTER_TOOL_BLINKBUTTON = 0x100001;\r
+static const int IMAGE_CONVERTER_TOOL_BLINKITEM = 0x100002;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR1BUTTON = 0x100003;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR1PRESSBUTTON = 0x100004;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR2BUTTON = 0x100005;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR2PRESSBUTTON = 0x100006;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR3BUTTON = 0x100007;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR3PRESSBUTTON = 0x100008;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR4BUTTON = 0x100009;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR4PRESSBUTTON = 0x10000a;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR5BUTTON = 0x10000b;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR5PRESSBUTTON = 0x10000c;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR6BUTTON = 0x10000d;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR6PRESSBUTTON = 0x10000e;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR7BUTTON = 0x10000f;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR7PRESSBUTTON = 0x100010;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR8BUTTON = 0x100011;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR8PRESSBUTTON = 0x100012;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR9BUTTON = 0x100013;\r
+static const int IMAGE_CONVERTER_TOOL_COLOR9PRESSBUTTON = 0x100014;\r
+static const int IMAGE_CONVERTER_TOOL_COLORITEM = 0x100015;\r
+static const int IMAGE_CONVERTER_TOOL_DOWNARROW = 0x100016;\r
+static const int IMAGE_CONVERTER_TOOL_FLASHLIGHTON = 0x100017;\r
+static const int IMAGE_CONVERTER_TOOL_PLAY1PAGE = 0x100018;\r
+static const int IMAGE_CONVERTER_TOOL_PLAY2PAGE = 0x100019;\r
+static const int IMAGE_CONVERTER_TOOL_PLAY3PAGE = 0x10001a;\r
+static const int IMAGE_CONVERTER_TOOL_PLAY4PAGE = 0x10001b;\r
+static const int IMAGE_CONVERTER_TOOL_PLAY5PAGE = 0x10001c;\r
+static const int IMAGE_CONVERTER_TOOL_PLAY6PAGE = 0x10001d;\r
+static const int IMAGE_CONVERTER_TOOL_PLAY7PAGE = 0x10001e;\r
+static const int IMAGE_CONVERTER_TOOL_PLAY8PAGE = 0x10001f;\r
+static const int IMAGE_CONVERTER_TOOL_PLAY9PAGE = 0x100020;\r
+static const int IMAGE_CONVERTER_TOOL_PLAYBLACKPAGE = 0x100021;\r
+static const int IMAGE_CONVERTER_TOOL_RECOVERBUTTON = 0x100022;\r
+static const int IMAGE_CONVERTER_TOOL_RECOVERCANCLE = 0x100023;\r
+static const int IMAGE_CONVERTER_TOOL_RECOVERCONFIRM = 0x100024;\r
+static const int IMAGE_CONVERTER_TOOL_RIGHTARROW = 0x100025;\r
+} // OHOS\r
+#endif // FLASHLIGHT_UI_RESOURCE_IMAGE_H\r
#include "broadcast_feature.h"\r
#include "broadcast_service.h"\r
#include "samgr_lite.h"\r
-#include "MainClockView.h"\r
+#include "clock/MainClockView.h"\r
\r
#ifdef __cplusplus\r
extern "C" {\r
#include "wearable_log.h"\r
#include "ohos_types.h"\r
#include "components/ui_card_page.h"\r
-#include "HeartModel.h"\r
+#include "heartrate/HeartModel.h"\r
\r
namespace OHOS {\r
#define HEART_AVE_NUM 360\r
#define INDOORWALK_MOTION_VIEW_H\r
\r
#include "View.h"\r
-#include "MotionPageFirst.h"\r
-#include "MotionPageSecond.h"\r
-#include "MotionPageThird.h"\r
-#include "MotionPageFourth.h"\r
-#include "MotionPageFifth.h"\r
+#include "indoorwalk/MotionPageFirst.h"\r
+#include "indoorwalk/MotionPageSecond.h"\r
+#include "indoorwalk/MotionPageThird.h"\r
+#include "indoorwalk/MotionPageFourth.h"\r
+#include "indoorwalk/MotionPageFifth.h"\r
#include "components/ui_swipe_view.h"\r
\r
namespace OHOS {\r
#ifndef INDOORWALK_VIEW_H\r
#define INDOORWALK_VIEW_H\r
\r
-#include "IndoorWalkEndView.h"\r
+#include "indoorwalk/IndoorWalkEndView.h"\r
#include "View.h"\r
-#include "IndoorWalkPresenter.h"\r
-#include "IndoorWalkPreparedView.h"\r
-#include "CustomizationView.h"\r
-#include "IndoorWalkMotionView.h"\r
+#include "indoorwalk/IndoorWalkPresenter.h"\r
+#include "indoorwalk/IndoorWalkPreparedView.h"\r
+#include "indoorwalk/CustomizationView.h"\r
+#include "indoorwalk/IndoorWalkMotionView.h"\r
#include "components/ui_view_group.h"\r
\r
namespace OHOS {\r
#include "ohos_types.h"\r
#include "components/ui_label.h"\r
#include "components/ui_image_view.h"\r
-#include "AppGroupView.h"\r
+#include "main/AppGroupView.h"\r
\r
namespace OHOS {\r
class MotionPageFifth : public AppGroupView {\r
#include "ohos_types.h"\r
#include "components/ui_label.h"\r
#include "components/ui_image_view.h"\r
-#include "AppGroupView.h"\r
+#include "main/AppGroupView.h"\r
\r
namespace OHOS {\r
class MotionPageFirst : public AppGroupView {\r
#include "ohos_types.h"\r
#include "components/ui_label.h"\r
#include "components/ui_image_view.h"\r
-#include "AppGroupView.h"\r
+#include "main/AppGroupView.h"\r
\r
namespace OHOS {\r
class MotionPageFourth : public AppGroupView {\r
#include "ohos_types.h"\r
#include "components/ui_label.h"\r
#include "components/ui_image_view.h"\r
-#include "AppGroupView.h"\r
+#include "main/AppGroupView.h"\r
\r
namespace OHOS {\r
class MotionPageSecond : public AppGroupView {\r
#include "ohos_types.h"\r
#include "components/ui_label.h"\r
#include "components/ui_image_view.h"\r
-#include "AppGroupView.h"\r
+#include "main/AppGroupView.h"\r
\r
namespace OHOS {\r
class MotionPageThird : public AppGroupView {\r
*/\r
#ifndef GRAPHIC_LITE_DIAL_BIN_PARSER_H\r
#define GRAPHIC_LITE_DIAL_BIN_PARSER_H\r
-#include "DialBinParserManager.h"\r
-#include "DialBinTypesV2.h"\r
+#include "main/DialBinParserManager.h"\r
+#include "main/DialBinTypesV2.h"\r
#include "components/ui_abstract_progress.h"\r
\r
namespace OHOS {\r
class DialBinParser : public DialBinParserInterface {\r
public:\r
bool UpdateDial(const std::string& file, FILE* fp, DialViewGroup* group, DisplayState state) override;\r
- bool GetDialPreviewInfo(FILE* fp, DialPreviewInfo* info) override;\r
+ bool GetDialPreviewInfo(const std::string& file, FILE* fp, DialPreviewInfo* info) override;\r
DialBinParser();\r
~DialBinParser() override;\r
\r
#include <iostream>
#include <cstring>
#include "graphic_types.h"
-#include "DialViewGroup.h"
-#include "DialBinTypes.h"
+#include "main/dial/DialViewGroup.h"
+#include "main/DialBinTypes.h"
namespace OHOS {
class DialBinParserInterface {
public:
virtual bool UpdateDial(const std::string& file, FILE* fp, DialViewGroup* group, DisplayState state) = 0;
- virtual bool GetDialPreviewInfo(FILE* fp, DialPreviewInfo* info) = 0;
+ virtual bool GetDialPreviewInfo(const std::string& file, FILE* fp, DialPreviewInfo* info) = 0;
+ virtual void SetEncryptData(uint8_t *data, uint32_t len) {}
virtual ~DialBinParserInterface() {}
}; // class DialBinParserInterface
public:
static DialBinParserManager *GetInstance(void);
bool UpdateDial(const std::string &file, FILE *fp, DialViewGroup *group, DisplayState state);
- bool GetDialPreviewInfo(FILE *fp, DialPreviewInfo *info);
+ bool GetDialPreviewInfo(const std::string& file, FILE *fp, DialPreviewInfo *info, bool isNeedVerify = false);
bool RegisterParser(const std::string &version, DialBinParserInterface *parser);
uint8_t GetSupportVersionCnt() const
DialBinParserManager();
virtual ~DialBinParserManager();
DialBinParserInterface *GetParser(FILE* fp) const;
+ DialBinParserInterface *GetParser(const std::string &fileName, FILE *fp, bool isNeedVerify = false) const;
static constexpr uint8_t PARSER_MAX_NUM = 8;
struct Pair {
std::string version;
#ifndef GRAPHIC_LITE_DIAL_BIN_PARSER_V3_H
#define GRAPHIC_LITE_DIAL_BIN_PARSER_V3_H
-#include "DialBinParserManager.h"
-#include "DialModelTime.h"
+#include "main/DialBinParserManager.h"
+#include "main/dial/DialModelTime.h"
#include "components/ui_abstract_progress.h"
-#include "DialViewContainer.h"
-#include "DialDataType.h"
-#include "DialOHSliceId.h"
+#include "main/dial/DialViewContainer.h"
+#include "main/dial/DialDataType.h"
+#include "main/dial/DialOHSliceId.h"
namespace OHOS {
class DialBinParserV3 : public DialBinParserInterface {
DialBinParserV3();
~DialBinParserV3() override;
bool UpdateDial(const std::string& file, FILE* fp, DialViewGroup* group, DisplayState state) override;
- bool GetDialPreviewInfo(FILE* fp, DialPreviewInfo* info) override;
+ bool GetDialPreviewInfo(const std::string& file, FILE* fp, DialPreviewInfo* info) override;
+ void SetEncryptData(uint8_t *data, uint32_t len) override final;
protected:
bool ParseDialHeader(FILE* file);
bool ParseViewType(uint8_t *viewType, uint8_t dialViewCount, FILE *file);
bool ParseContainerSubviews(DialViewContainer *container, uint8_t num);
bool ParseOptionsSubviews(ContainerInterface &parent);
+ DialHeader *GetHeader(FILE *fp);
+ uint8_t *GetVeiwType(FILE *fp, DialHeader *dialHeader);
DialViewGroup* dialGroup_ = nullptr;
std::string file_;
const uint32_t dirId_ = 0xfef << 20; // 20: offset
uint32_t imageOffset_ = 0;
DisplayState state_ = DisplayState::NORMAL;
+ uint8_t *encryptedData_ = nullptr;
+ uint32_t encrpytedLen_ = 0;
}; // class DialBinParserV3
} // namespace OHOS
#ifndef GRAPHIC_LITE_DIAL_BIN_TYPE_V2_H
#define GRAPHIC_LITE_DIAL_BIN_TYPE_V2_H
-#include "DialBinTypes.h"
+#include "main/DialBinTypes.h"
namespace OHOS {
enum class DisplayState {
\r
#include <cstdio>\r
#include "gfx_utils/list.h"\r
-#include "UiServersMsg.h"\r
+#include "main/UiServersMsg.h"\r
\r
namespace OHOS {\r
#define NUM_1 1\r
--- /dev/null
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.\r
+ * Description: LoadImg\r
+ * Create: 2025-06-05\r
+ */\r
+#ifndef LOAD_IMG_H\r
+#define LOAD_IMG_H\r
+\r
+#include <string>\r
+#include "wearable_log.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_image_view.h"\r
+#include "common/image_cache_manager.h"\r
+\r
+namespace OHOS {\r
+namespace LOADIMG {\r
+// 加载图片资源\r
+void LoadBtnImage(UIButton *btn, std::string file, uint32_t resId1, uint32_t resId2);\r
+\r
+void LoadImageViewImg(UIImageView *view, std::string file, uint32_t resId);\r
+}\r
+}\r
+#endif // LOAD_IMG_H
\ No newline at end of file
#define MAIN_PRESENTER_SAMPLE_H
#include "Presenter.h"
-#include "ModelListenerSample.h"
+#include "main/ModelListenerSample.h"
#include "components/root_view.h"
#include "drag_event.h"
-#include "MainViewSample.h"
-#include "MainModel.h"
+#include "main/MainViewSample.h"
+#include "main/MainModel.h"
#include "components/ui_swipe_view.h"
#include "components/ui_view.h"
-#include "MainCompassView.h"
-#include "MainCompassPresenter.h"
-#include "PlayersView.h"
-#include "HeartRateView.h"
+#include "compass/MainCompassView.h"
+#include "compass/MainCompassPresenter.h"
+#include "player/PlayersView.h"
+#include "heartrate/HeartRateView.h"
#include "swipe_effect/zoom_effect.h"
namespace OHOS {
class MainViewSample;
class MainPresenterSample : public Presenter<MainViewSample>, public ModelListenerSample,
public UIView::OnClickListener, public UISwipeView::OnSwipeListener,
- public UIView::OnLongPressListener, public UISwipeView, public CompassPresenter {
+ public UIView::OnLongPressListener, public UISwipeView {
public:
MainPresenterSample();
~MainPresenterSample() override;
private:
void ProcessDataNotify(void);
void SetCircleProgress(void);
- void SetCompassRotate(void);
uint8_t state_ = UICheckBox::UICheckBoxState::MAX_STATUS_NUM;
int64_t playerCurrentTime_{0};
int64_t playerMusicDuration_{0};
#include "ChangeSliceListener.h"
#include "font/ui_font.h"
#include "graphic_config.h"
-#include "ModelListenerSample.h"
-#include "ScreenModels.h"
-#include "ActivityWeekView.h"
-#include "CompassControlView.h"
-#include "DialViewGroup.h"
-#include "MainClockView.h"
-#include "PlayersView.h"
-#include "MainPresenterSample.h"
-#include "HeartRateView.h"
+#include "main/ModelListenerSample.h"
+#include "screensetting/ScreenModels.h"
+#include "activity/ActivityWeekView.h"
+#include "compass/CompassControlView.h"
+#include "main/dial/DialViewGroup.h"
+#include "clock/MainClockView.h"
+#include "player/PlayersView.h"
+#include "main/MainPresenterSample.h"
+#include "heartrate/HeartRateView.h"
#include "components/ui_card_page.h"
-#include "PullUpDownView.h"
+#include "main/PullUpDownView.h"
#include "components/ui_cross_view.h"
-#include "SetCardModel.h"
-#include "VideoCard.h"
+#include "set_card/SetCardModel.h"
+#include "videocard/VideoCard.h"
namespace OHOS {
class MainPresenterSample;
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ */\r
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: MessageAdapter.h\r
+ * Author:\r
+ * Create: 2021-11-23\r
+ */\r
+\r
+#ifndef MESSAGE_ADAPTER_H\r
+#define MESSAGE_ADAPTER_H\r
+\r
+#include <list>\r
+#include <string>\r
+#include "components/ui_list.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/abstract_adapter.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "main/MainModel.h"\r
+#include "main/MessageItemView.h"\r
+\r
+namespace OHOS {\r
+class MessageAdapter : public AbstractAdapter {\r
+public:\r
+ explicit MessageAdapter();\r
+ ~MessageAdapter() override;\r
+\r
+ /* *\r
+ * @brief Sets the UIView adapter data, which is a WeatherItem linked list.\r
+ *\r
+ * @param data Indicates the MessageItem linked list data.\r
+ * @since 1.0\r
+ * @version 1.0\r
+ */\r
+ void SetData(std::list<MessageItem> &data);\r
+\r
+ /* *\r
+ * @brief Obtains the <b>data</b> size of the UILabel adapter.\r
+ *\r
+ * @return Returns the <b>data</b> size of the UILabel adapter.\r
+ * @since 1.0\r
+ * @version 1.0\r
+ */\r
+ uint16_t GetCount(void) override;\r
+\r
+ UIView *GetView(UIView *inView, int16_t index) override;\r
+\r
+ void AddListItem(const MessageItem &item);\r
+\r
+ void ClearListItem();\r
+\r
+ void SetItemClickListener(UIView::OnClickListener *itemclicklistener)\r
+ {\r
+ itemClickListener = itemclicklistener;\r
+ }\r
+private:\r
+ std::list<MessageItem> listData;\r
+ UIView::OnClickListener *itemClickListener{nullptr};\r
+};\r
+}\r
+\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ */\r
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: weather/WeatherItemView.h\r
+ * Author:\r
+ * Create: 2021-11-23\r
+ */\r
+\r
+#ifndef MESSAGE_ITEM_VIEW_H\r
+#define MESSAGE_ITEM_VIEW_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_canvas.h"\r
+\r
+#include "UiConfig.h"\r
+#include "main/MessageModel.h"\r
+\r
+namespace OHOS {\r
+class MessageItemView : public UIViewGroup {\r
+public:\r
+ explicit MessageItemView();\r
+ ~MessageItemView() override;\r
+ virtual void SetItemInfo(const MessageItem itemInfo);\r
+ virtual void SetUpChild();\r
+private:\r
+ UILabel sLabel_1;\r
+ UIImageView sIcon;\r
+ UILabel sLabel_2;\r
+ UILabel sLabel_3;\r
+ UIImageView sNextImage;\r
+ UILabel sback;\r
+ MessageItem sItemInfo = { nullptr, nullptr, nullptr, nullptr};\r
+};\r
+}\r
+\r
+#endif\r
--- /dev/null
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: WeekStep\r
+ * Author:\r
+ * Create: 2021-09-11\r
+ */\r
+\r
+#ifndef MESSAGE_MAIN_VIEW_H\r
+#define MESSAGE_MAIN_VIEW_H\r
+\r
+#include "graphic_types.h"\r
+#include "wearable_log.h"\r
+#include "components/ui_card_page.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "main/MessageModel.h"\r
+#include "main/MessageAdapter.h"\r
+\r
+namespace OHOS {\r
+class MessageMainView : public UICardPage {\r
+public:\r
+ MessageMainView();\r
+ ~MessageMainView() override;\r
+ static MessageMainView *GetInstance(void);\r
+ bool InitView();\r
+ void PreLoad(void) override;\r
+ void VerticalViewInits(void);\r
+ void ConfirmDeletion(void);\r
+ void CancelDeletion(void);\r
+ void ShowMessageList(void);\r
+ void DeletionView(void);\r
+ void NoNotify(void);\r
+ void NewNotify(void);\r
+ void RefreshMessageList(std::vector<MessageItem> item);\r
+ bool InitScrollData();\r
+ MessageAdapter *listAdapter{nullptr};\r
+ UIList *contentList{nullptr}; // 列表\r
+private:\r
+ UILabel *messageLables{nullptr}; // 无消息\r
+ UILabel *messageLable{nullptr}; // 通知\r
+ UILabel *deletereminder{nullptr}; // 是否删除通知?\r
+ UILabelButton *confirm{nullptr}; // 确认\r
+ UILabelButton *cancel{nullptr}; // 取消\r
+ UIImageView *notice{nullptr}; // 删除图标\r
+ UIView::OnClickListener *clickListener{nullptr};\r
+ UIView::OnClickListener *confirmListener{nullptr};\r
+ UIView::OnClickListener *cancelListener{nullptr};\r
+ UIView::OnClickListener *notifyListener{nullptr};\r
+ UIView::OnClickListener *newNotifyListener{nullptr};\r
+};\r
+}\r
+#endif\r
--- /dev/null
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: MainModel.h\r
+ * Author:\r
+ * Create: 2021-11-23\r
+ */\r
+\r
+#ifndef MESSAGE_MODEL_H\r
+#define MESSAGE_MODEL_H\r
+\r
+#include <string>\r
+#include <vector>\r
+#include "UiConfig.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+ std::string label_1;\r
+ std::string icon;\r
+ std::string label_2;\r
+ std::string label_3;\r
+} MessageItem;\r
+\r
+ // static const uint16_t WEATHER_ITEM_COUNT = 10;\r
+ class MessageModel {\r
+ public:\r
+ static MessageModel &GetInstance(void);\r
+ void InitMessageItem();\r
+ const std::vector<MessageItem> GetMessagelistItems() const;\r
+ void ClearListItem();\r
+ void GetMessageInfo(std::string app, std::string contact, std::string information);\r
+ void SetViewStatus(bool viewStatus);\r
+ bool GetViewStatus(void);\r
+ private:\r
+ MessageModel();\r
+ MessageModel(const MessageModel &);\r
+ MessageModel &operator=(const MessageModel &);\r
+ virtual ~MessageModel();\r
+ std::vector<MessageItem> vecMsg;\r
+ MessageItem mes;\r
+ bool viewInitStatus{false};\r
+ };\r
+}\r
+\r
+#endif
\ No newline at end of file
#include "components/ui_label_button.h"
#include "components/ui_view_group.h"
#include "components/ui_slider.h"
-#include "VolumeSettingView.h"
-#include "PlayersView.h"
+#include "main/VolumeSettingView.h"
+#include "player/PlayersView.h"
namespace OHOS {
#define INCREASE_BUTTON "increaseButton"
#include "components/ui_button.h"\r
#include "components/ui_view_group.h"\r
#include "components/ui_slider.h"\r
-#include "PlayersView.h"\r
+#include "player/PlayersView.h"\r
#include "wearable_log.h"\r
-#include "VolumeSettingPresenter.h"\r
+#include "main/VolumeSettingPresenter.h"\r
\r
namespace OHOS {\r
#define VOLUME_MIN 0\r
#define DIAL_ARC_LABEL_VIEW_H
#include <cstdint>
-#include "DialView.h"
+#include "main/dial/DialView.h"
#include "components/ui_arc_label.h"
#include "font/font_global_manager.h"
#ifndef DIAL_ARC_PROGRESS_VIEW_H
#define DIAL_ARC_PROGRESS_VIEW_H
-#include "DialView.h"
+#include "main/dial/DialView.h"
#include "components/ui_circle_progress.h"
namespace OHOS {
DialArcProgressView();
~DialArcProgressView() override;
void HandleFloatData(float data) override;
+ void OnDraw(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea) override;
private:
int32_t value_ = -1;
};
#include <cstdint>
#include "heap_base.h"
-#include "OnDialDataUpdateListener.h"
+#include "main/dial/OnDialDataUpdateListener.h"
namespace OHOS {
class DialBaseModel : public HeapBase {
#ifndef DIAL_BOX_PROGRESS_VIEW_H
#define DIAL_BOX_PROGRESS_VIEW_H
-#include "DialView.h"
+#include "main/dial/DialView.h"
#include "components/ui_box_progress.h"
namespace OHOS {
DialBoxProgressView();
~DialBoxProgressView() override;
void HandleFloatData(float data) override;
+ void OnDraw(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea) override;
private:
int32_t value_ = -1;
};
#ifndef DIAL_DATA_BASE_H
#define DIAL_DATA_BASE_H
-#include "DialDataType.h"
+#include "main/dial/DialDataType.h"
enum class DialOldDataType {
DATA_TYPE_FLOAT_BASE = 0,
#define DIAL_DIGITAL_IMG_VIEW_H
#include <cstdint>
-#include "DialView.h"
-#include "DialModelTime.h"
+#include "main/dial/DialView.h"
+#include "main/dial/DialModelTime.h"
#include "components/ui_image_view.h"
#include "gfx_utils/graphic_math.h"
#include "components/ui_view_group.h"
#define DIAL_LABEL_VIEW_H
#include <cstdint>
-#include "DialView.h"
+#include "main/dial/DialView.h"
#include "components/ui_label.h"
#include "font/font_global_manager.h"
#ifndef DIAL_MODEL_HEART_RATE_H
#define DIAL_MODEL_HEART_RATE_H
-#include "DialBaseModel.h"
+#include "main/dial/DialBaseModel.h"
namespace OHOS {
class DialModelHeartRate : public DialBaseModel {
#ifndef DIAL_MODEL_POWER_H
#define DIAL_MODEL_POWER_H
-#include "DialBaseModel.h"
+#include "main/dial/DialBaseModel.h"
namespace OHOS {
class DialModelPower : public DialBaseModel {
#ifndef DIAL_MODEL_STEPS_H
#define DIAL_MODEL_STEPS_H
-#include "DialBaseModel.h"
+#include "main/dial/DialBaseModel.h"
namespace OHOS {
class DialModelSteps : public DialBaseModel {
#ifndef DIAL_MODEL_TIME_H
#define DIAL_MODEL_TIME_H
-#include "DialBaseModel.h"
+#include "main/dial/DialBaseModel.h"
#include "gfx_utils/list.h"
namespace OHOS {
#define DIAL_OPTION_IMG_VIEW_H
#include <cstdint>
-#include "DialView.h"
-#include "DialModelTime.h"
+#include "main/dial/DialView.h"
+#include "main/dial/DialModelTime.h"
#include "components/ui_image_view.h"
#include "font/font_global_manager.h"
#define DIAL_ROTATE_IMG_VIEW_H
#include <cstdint>
-#include "DialView.h"
+#include "main/dial/DialView.h"
#include "components/ui_image_view.h"
#include "gfx_utils/graphic_math.h"
#include "components/ui_image_view.h"
#include "font/font_global_manager.h"
-#include "DialModelTime.h"
+#include "main/dial/DialModelTime.h"
namespace OHOS {
class DialStaticImgView : public UIImageView,
#include <cstdint>
#include <string>
-#include "DialDataType.h"
+#include "main/dial/DialDataType.h"
namespace OHOS {
#define DIAL_VIEW_CONTAINER_H
#include "components/ui_view_group.h"
#include "gfx_utils/list.h"
-#include "dial/DialView.h"
-#include "dial/DialDataBase.h"
+#include "main/dial/DialView.h"
+#include "main/dial/DialDataBase.h"
namespace OHOS {
class ContainerInterface {
#include <unordered_map>
#include <memory>
-#include "DialDataBase.h"
+#include "main/dial/DialDataBase.h"
#include "components/ui_view_group.h"
#include "components/ui_image_animator.h"
#include "components/ui_label.h"
-#include "OnDialDataUpdateListener.h"
+#include "main/dial/OnDialDataUpdateListener.h"
#include "components/ui_card_page.h"
#include "components/ui_kaleidoscope_view.h"
#include "gfx_utils/list.h"
#include "gfx_utils/vector.h"
-#include "DialView.h"
-#include "DialVideoView.h"
-#include "DialBinTypesV2.h"
-#include "DialViewContainer.h"
+#include "main/dial/DialView.h"
+#include "main/dial/DialVideoView.h"
+#include "main/DialBinTypesV2.h"
+#include "main/dial/DialViewContainer.h"
namespace OHOS {
class DialViewGroup : public UICardPage, public OnDialDataUpdateListener, public ContainerInterface {
#define MODE_DIAL_DATA_FACTORY
#include <unordered_map>
-#include "DialBaseModel.h"
-#include "DialDataBase.h"
-#include "ModelDialDataFactory.h"
+#include "main/dial/DialBaseModel.h"
+#include "main/dial/DialDataBase.h"
+#include "main/dial/ModelDialDataFactory.h"
namespace OHOS {
class ModelDialDataFactory : public HeapBase {
#ifndef ON_DIAL_DATA_UPDATE_LISTENER_H
#define ON_DIAL_DATA_UPDATE_LISTENER_H
-#include "DialDataBase.h"
+#include "main/dial/DialDataBase.h"
namespace OHOS {
class OnDialDataUpdateListener : public HeapBase {
#ifndef REGISTER_DIAL_MODEL_H
#define REGISTER_DIAL_MODEL_H
-#include "DialDataBase.h"
-#include "ModelDialDataFactory.h"
+#include "main/dial/DialDataBase.h"
+#include "main/dial/ModelDialDataFactory.h"
namespace OHOS {
class RegisterDialModel {
public:
/**
* @brief Get all watch face information
- * @param[out] info Pointer to store the watch face information
- * @param[out] num Pointer to store the number of watch faces
- * @param[in] maxCnt Maximum number of watch faces to retrieve
- * @return bool Returns true if successful, false otherwise
+ * @param [out] watch_dial_info **info
+ * A pointer to a pointer where the retrieved watch face information will be stored.
+ * @param [out] uint8_t *num
+ * A pointer to the number of watch face information entries retrieved.
+ * @return bool
+ * - true: Successfully retrieved watch face information.
+ * The pointer pointed to by `info` needs to be released
+ * externally.
+ * - false: Failed to retrieve watch face information.
+ * @remarks
+ * - If the function returns true,
+ * the memory pointed to by `info` must be freed by the caller to prevent
+ * memory leaks.
+ * - If the function returns false, the values of `info` and `num` remain unchanged.
*/
-bool GetAllWatchFaceInfo(watch_dial_info *info, uint8_t *num, uint8_t maxCnt);
+bool GetAllWatchFaceInfo(watch_dial_info **info, uint8_t *num);
/**
* @brief Get information of a specific watch face by UUID
bool UninstallWatch(uint32_t uuid);
/**
- * @brief Install a watch face from a specified path
- * @param[in] path Path to the watch face file
- * @param[out] uuid Pointer to store the unique identifier of the installed watch face
- * @return bool Returns true if successful, false otherwise
- * @note If a watch face with the same UUID already exists, it will be replaced
+ * @brief Retrieves the unique identifier (UUID) associated with a specified path.
+ *
+ * @param[in] path The path to look up.
+ * @param[out] uuid A pointer to a variable where the UUID will be stored if found.
+ *
+ * @return bool
+ * - true if the UUID is successfully retrieved.
+ * - false if the path is invalid or the UUID cannot be obtained.
+ *
+ * @remarks The caller is responsible for ensuring that the 'uuid' pointer is valid and properly aligned.
*/
-bool InstallWatch(const char *path, uint32_t *uuid);
+bool GetUuidByPath(const char *path, uint32_t *uuid);
#ifdef __cplusplus
}
#endif
-#endif // WATCH_INTERFACE_H
\ No newline at end of file
+#endif // WATCH_INTERFACE_H
\ No newline at end of file
\r
#include "Presenter.h"\r
#include "ohos_types.h"\r
-#include "CallerLogModel.h"\r
-#include "VolumeSettingView.h"\r
-#include "VolumeSettingPresenter.h"\r
+#include "callerlog/CallerLogModel.h"\r
+#include "main/VolumeSettingView.h"\r
+#include "main/VolumeSettingPresenter.h"\r
\r
namespace OHOS {\r
class MainCallingView;\r
#include "View.h"\r
#include "components/ui_view_group.h"\r
#include "ohos_types.h"\r
-#include "CallerDisplayView.h"\r
-#include "CallingView.h"\r
-#include "DialingScreenView.h"\r
-#include "WaitingHintsView.h"\r
+#include "makephone/CallerDisplayView.h"\r
+#include "makephone/CallingView.h"\r
+#include "makephone/DialingScreenView.h"\r
+#include "makephone/WaitingHintsView.h"\r
\r
namespace OHOS {\r
class MainCallingPresenter;\r
#define MAIN_VOCASSIST_VIEW_H\r
\r
#include "View.h"\r
-#include "VocassistModel.h"\r
-#include "VocassistView.h"\r
+#include "offlinevoice/VocassistModel.h"\r
+#include "offlinevoice/VocassistView.h"\r
\r
namespace OHOS {\r
class VocassistPresenter;\r
#define VOCASSIST_MODEL_H\r
\r
#include "smart_voice_service.h"\r
-#include "VocassistView.h"\r
+#include "offlinevoice/VocassistView.h"\r
\r
#ifdef __cplusplus\r
extern "C" {\r
\r
#include "Presenter.h"\r
#include "NativeAbility.h"\r
-#include "VocassistView.h"\r
-#include "MainVocassistView.h"\r
+#include "offlinevoice/VocassistView.h"\r
+#include "offlinevoice/MainVocassistView.h"\r
\r
namespace OHOS {\r
class MainVocassistView;\r
#include "UiConfig.h"\r
#include "dfx/event_injector.h"\r
#include "wearable_log.h"\r
-#include "AppGroupView.h"\r
+#include "main/AppGroupView.h"\r
\r
static constexpr const char VOCPHOTO_ID[] = "VOCPIC";\r
static constexpr const char VOC_ID[] = "VOC";\r
#include "bts_br_gap.h"
#include "bts_hfp_hf.h"
#include "ohos_types.h"
-#include "PhoneAudio.h"
+#include "phoneservice/PhoneAudio.h"
#ifdef __cplusplus
extern "C" {
--- /dev/null
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: Bluetooth view 设置页面\r
+ * Create: 2021-09-5\r
+ */\r
+\r
+#ifndef BLUETOOTH_VIEW_H\r
+#define BLUETOOTH_VIEW_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_radio_button.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_view_group.h"\r
+\r
+namespace OHOS {\r
+class PlayerOnDragListener;\r
+class BluetoothView {\r
+public:\r
+ BluetoothView();\r
+ virtual ~BluetoothView();\r
+ UIViewGroup *LoadBluetoothView(void);\r
+ static BluetoothView *GetInstance(void);\r
+ UIViewGroup *group{nullptr};\r
+ UIRadioButton *GetPhoneButton(void);\r
+ UIRadioButton *GetWatchButton(void);\r
+ UIButton *GetSettingButton(void);\r
+ UILabelButton *GetDeleteButton(void);\r
+private:\r
+ UILabel *watchLabel{nullptr};\r
+ UILabel *phoneLabel{nullptr};\r
+ UILabel *bluetoothLabel{nullptr};\r
+ UIImageView *watchImage{nullptr};\r
+ UIImageView *phoneImage{nullptr};\r
+ UIImageView *bluetoothImage{nullptr};\r
+ UIRadioButton *watchButton{nullptr};\r
+ UIRadioButton *phoneButton{nullptr};\r
+ UIButton *settingButton{nullptr};\r
+ UILabelButton *deleteButton{nullptr};\r
+ int LoadRadioButton();\r
+ int LoadButtonView();\r
+ int LoadLabelButton();\r
+ int LoadLabel();\r
+ int LoadImage();\r
+\r
+ void SetUpButton(UILabelButton *btn, const Point& point, int16_t width, int16_t height,\r
+ UIView::OnClickListener *listener);\r
+};\r
+} // namespace OHOS\r
+#endif
\ No newline at end of file
#include <cstdio>
#include "gfx_utils/list.h"
-#include "UiServersMsg.h"
+#include "main/UiServersMsg.h"
#include "player.h"
#include "source.h"
#include "audio_manager.h"
#include "audio_base_type.h"
-#include "PlayersPresenter.h"
+#include "player/PlayersPresenter.h"
#include "bts_avrcp_controller.h"
namespace OHOS {
int DecreaseVolume(void);
int32_t GetPlayerstatus();
void SetBTMusicPlay(avrcp_key_operation_t notification);
- void ConnectBtAndLocalPlay(int32_t connCtState, int32_t connTgState, int32_t playerState); // 蓝牙连接和本地播放
- void ConnectBtAndLocalPause(int32_t connCtState, int32_t connTgState);
+ int32_t ConnectBtAndLocalPlay(int32_t connCtState, int32_t connTgState, int32_t playerState); // 蓝牙连接和本地播放
+ int32_t ConnectBtAndLocalPause(int32_t connCtState, int32_t connTgState);
void ConncetBtResetButton();
void ClearActivateAudioInterrupt(void);
void GetDuration(int64_t &duration);
private:
int64_t duration_{0};
+ bool isInterruptedPause_{false};
bool audioInitStatus{false};
char *sliceId{nullptr};
List<PlayersMsg> listPlayers;
#include "player.h"
#include "audio_manager.h"
#include "audio_base_type.h"
-#include "BluetoothView.h"
-#include "VolumeSettingView.h"
-#include "VolumeSettingPresenter.h"
-#include "BluetoothModel.h"
-#include "BluetoothEarPhoneView.h"
-#include "BluetoothEarListView.h"
-#include "BluetoothOptionsView.h"
-#include "BluetoothReconnectView.h"
-#include "TipsSuccMessageView.h"
-#include "TipsConnFailMessageView.h"
-#include "TipsFailMessageView.h"
-#include "BluetoothDeviceListView.h"
-#include "BluetoothItemView.h"
+#include "player/BluetoothView.h"
+#include "main/VolumeSettingView.h"
+#include "main/VolumeSettingPresenter.h"
+#include "bluetooth/BluetoothModel.h"
+#include "bluetooth/BluetoothEarPhoneView.h"
+#include "bluetooth/BluetoothEarListView.h"
+#include "bluetooth/BluetoothOptionsView.h"
+#include "bluetooth/BluetoothReconnectView.h"
+#include "bluetooth/TipsSuccMessageView.h"
+#include "bluetooth/TipsConnFailMessageView.h"
+#include "bluetooth/TipsFailMessageView.h"
+#include "bluetooth/BluetoothDeviceListView.h"
+#include "bluetooth/BluetoothItemView.h"
namespace OHOS {
using OHOS::Media::Player;
bool IsResumed();
bool IsBeginStopped();
bool IsEndStopped();
+ bool IsInterruptedPaused();
void OnInterrupt(int32_t type, int32_t hint) override;
void PausePlayer(void);
void ResumePlayer(void);
bool isResumed_{false};
bool isBeginStopped_{false};
bool isEndStopped_{false};
+ bool isInterruptedPause_{false};
};
// 滑动手势
#include "font/ui_font.h"\r
#include "graphic_config.h"\r
#include "components/ui_card_page.h"\r
-#include "PlayersPresenter.h"\r
+#include "player/PlayersPresenter.h"\r
\r
namespace OHOS {\r
#define PLAY_PROGRESS_MIN 0\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: QrcodeConnModel.h\r
+ * Author:\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef QRCODE_CONN_MODEL_H\r
+#define QRCODE_CONN_MODEL_H\r
+\r
+#include <cstdint>\r
+#include <map>\r
+#include "AppViewIDs.h"\r
+#include "UiConfig.h"\r
+\r
+namespace OHOS {\r
+class QrcodeConnModel {\r
+public:\r
+ static QrcodeConnModel &GetInstance(void);\r
+\r
+private:\r
+ QrcodeConnModel();\r
+ QrcodeConnModel(const QrcodeConnModel &);\r
+ QrcodeConnModel &operator=(const QrcodeConnModel &);\r
+ virtual ~QrcodeConnModel();\r
+\r
+private:\r
+};\r
+}\r
+\r
+#endif // QRCODE_CONN_MODEL_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: QrcodeConnPresenter.h\r
+ * Author:\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef QRCODE_CONN_PRESENTER_H\r
+#define QRCODE_CONN_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+#include "components/ui_view.h"\r
+#include "qrcode_conn/QrcodeConnView.h"\r
+#include "qrcode_conn/QrcodeConnModel.h"\r
+\r
+namespace OHOS {\r
+\r
+class QrcodeConnView;\r
+class QrcodeConnModel;\r
+class QrcodeConnPresenter : public Presenter<QrcodeConnView>,\r
+ public UIView::OnDragListener {\r
+public:\r
+ QrcodeConnPresenter();\r
+ ~QrcodeConnPresenter() override;\r
+ static QrcodeConnPresenter *GetInstance();\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+private:\r
+};\r
+}\r
+\r
+#endif // QRCODE_CONN_PRESENTER_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: QrcodeConnView.h\r
+ * Author:\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#ifndef QRCODE_CONN_VIEW_H\r
+#define QRCODE_CONN_VIEW_H\r
+\r
+#include <string>\r
+#include "View.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label.h"\r
+#include "UiConfig.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_qrcode.h"\r
+\r
+namespace OHOS {\r
+\r
+class QrcodeConnPresenter;\r
+class QrcodeConnView : public View<QrcodeConnPresenter> {\r
+public:\r
+ QrcodeConnView();\r
+ ~QrcodeConnView() override;\r
+\r
+ static QrcodeConnView *GetInstance();\r
+\r
+ void OnStart() override;\r
+ void OnStop() override;\r
+ void InitView();\r
+ void DeInit();\r
+\r
+private:\r
+ UIScrollView *group_ = nullptr;\r
+ UIQrcode *qrcode_ = nullptr;\r
+};\r
+}\r
+#endif // QRCODE_CONN_VIEW_H\r
#define REBOOT_VIEW_H\r
\r
#include "View.h"\r
-#include "ShutdownDeviceView.h"\r
-#include "RebootDeviceView.h"\r
+#include "rebootdevice/ShutdownDeviceView.h"\r
+#include "rebootdevice/RebootDeviceView.h"\r
#include "components/ui_view_group.h"\r
#include "components/ui_label.h"\r
#include "components/ui_button.h"\r
--- /dev/null
+/*
+ * Copyright (c) 2025 CompanyNameMagicTag.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef RECENT_APP_PRESENTER_H
+#define RECENT_APP_PRESENTER_H
+
+#include "Presenter.h"
+#include "components/ui_view.h"
+
+namespace OHOS {
+class RecentAppView;
+class RecentAppPresenter : public Presenter<RecentAppView>, public UIView::OnClickListener {
+public:
+ RecentAppPresenter();
+ ~RecentAppPresenter() override;
+ void OnResume() override;
+ bool OnClick(UIView &view, const ClickEvent &event) override;
+};
+}
+
+#endif // RECENT_APP_PRESENTER_H
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) 2025 CompanyNameMagicTag.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef RECENT_APP_VIEW_H
+#define RECENT_APP_VIEW_H
+
+#include <string>
+#include "recent_app/RecentAppPresenter.h"
+#include "View.h"
+#include "animator/animator.h"
+#include "components/ui_label.h"
+#include "components/ui_label_button.h"
+#include "components/ui_roller_view.h"
+
+namespace OHOS {
+static constexpr const char* RECENT_APP_DELETE_BTN_ID = "RecentAppDeleteBtn";
+static std::string RECENT_ITEM_NATIVE_PREFIX = "NA_";
+static std::string RECENT_ITEM_JS_PREFIX = "JS_";
+static constexpr const uint8_t RECENT_ITEM_PREFIX_LEN = 3;
+class RecentAppView : public View<RecentAppPresenter> {
+public:
+ RecentAppView();
+ ~RecentAppView() override;
+ void OnStart() override;
+ void LoadContent();
+ UIRollerView* GetRollerView()
+ {
+ return roller_;
+ }
+private:
+ class LoadingAnimCb : public AnimatorCallback {
+ public:
+ LoadingAnimCb() {}
+ ~LoadingAnimCb() override {}
+ void Callback(UIView* view) override;
+ void SetRecentAppView(RecentAppView* recentAppView)
+ {
+ recentAppView_ = recentAppView;
+ }
+ private:
+ RecentAppView* recentAppView_;
+ };
+
+ void AddRecentAppToRoller();
+ void LoadRecentAppContent();
+ void InitRecentApps();
+ UIRollerView* roller_ = nullptr;
+ Animator* loadingAnim_ = nullptr;
+ UILabel* loadingLabel_ = nullptr;
+ UILabel* noRecentAppLabel_ = nullptr;
+ UILabelButton* delBtn_ = nullptr;
+ LoadingAnimCb loadingAnimCb_;
+ bool viewiInitStatus_ = false;
+};
+} // namespace OHOS
+#endif // RECENT_APP_VIEW_H
\ No newline at end of file
#define RESTORE_DEFAULTS_VIEW_H\r
\r
#include "View.h"\r
-#include "RestoreDefaultsPresenter.h"\r
-#include "RestoreSelectView.h"\r
-#include "AppGroupView.h"\r
+#include "restoredefaults/RestoreDefaultsPresenter.h"\r
+#include "restoredefaults/RestoreSelectView.h"\r
+#include "main/AppGroupView.h"\r
\r
namespace OHOS {\r
constexpr int16_t NUM_RESTORE_DEFAULTS_CONTAINER = 1;\r
#define RESTORE_SELECT_VIEW_H\r
\r
#include "View.h"\r
-#include "RestoreDefaultsPresenter.h"\r
+#include "restoredefaults/RestoreDefaultsPresenter.h"\r
#include "components/ui_label.h"\r
#include "components/ui_button.h"\r
#include "components/ui_view_group.h"\r
#include "service.h"\r
#include "iunknown.h"\r
#include "broadcast_feature.h"\r
-#include "AlarmClockManage.h"\r
+#include "alarmclockmanage/AlarmClockManage.h"\r
\r
#ifdef __cplusplus\r
extern "C" {\r
*/
uint32_t get_back_to_home_interval(void);
+/**
+ * @brief 设置进入AOD后返回上一个应用的可返回时间间隔,需要在slice对应的Presentor的OnStart方法中调用
+ * 默认可返回时间间隔是5秒,进入AOD超过5秒后再次亮屏会跳回主界面
+ * @param time_sec 设置的可返回时间间隔
+ */
+void set_back_to_pre_slice_interval(uint32_t time_sec);
+
+/**
+ * @brief 获取进入AOD后返回上一个应用的可返回时间间隔,需要在slice对应的Presentor的OnStart方法中调用
+ * 默认可返回时间间隔是5秒,进入AOD超过5秒后再次亮屏会跳回主界面
+ * @param time_sec 获取的可返回时间间隔
+ */
+uint32_t get_back_to_pre_slice_interval(void);
+
#ifdef __cplusplus
}
#endif
#include "components/abstract_adapter.h"
#include "UiConfig.h"
#include "wearable_log.h"
-#include "SetCardItem.h"
+#include "set_card/SetCardItem.h"
namespace OHOS {
class SetCardAdapter : public AbstractAdapter {
#define SET_CARD_DELETE_VIEW_H\r
\r
#include "components/ui_label_button.h"\r
-#include "SetCardPresenter.h"\r
+#include "set_card/SetCardPresenter.h"\r
\r
namespace OHOS {\r
class SetCardDeleteView : public UIViewGroup {\r
#include "components/ui_view.h"\r
#include "components/ui_view_group.h"\r
#include "components/ui_image_view.h"\r
-#include "MainModel.h"\r
+#include "main/MainModel.h"\r
#include "UiConfig.h"\r
\r
namespace OHOS {\r
#include <map>
#include "AppViewIDs.h"
#include "UiConfig.h"
-#include "SetCardPresenter.h"
-#include "SetCardItem.h"
+#include "set_card/SetCardPresenter.h"
+#include "set_card/SetCardItem.h"
namespace OHOS {
class SetCardModel {
#include "components/ui_image_view.h"\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
-#include "SetCardPresenter.h"\r
+#include "set_card/SetCardPresenter.h"\r
\r
namespace OHOS {\r
class SetCardNoCardView : public UIViewGroup {\r
#include "Presenter.h"
#include "components/ui_list.h"
#include "components/ui_view.h"
-#include "ModelListenerSample.h"
+#include "main/ModelListenerSample.h"
namespace OHOS {
#include "components/ui_toggle_button.h"
#include "ChangeSliceListener.h"
#include "UiConfig.h"
-#include "SetCardAdapter.h"
-#include "SetCardModel.h"
-#include "SetCardDeleteView.h"
-#include "SetCardNoCardView.h"
+#include "set_card/SetCardAdapter.h"
+#include "set_card/SetCardModel.h"
+#include "set_card/SetCardDeleteView.h"
+#include "set_card/SetCardNoCardView.h"
namespace OHOS {
class SetCardPresenter;
#define SET_DIAL_MODEL_H
#include "AppViewIDs.h"
#include "UiConfig.h"
-#include "SetDialInfo.h"
+#include "set_dial/SetDialInfo.h"
namespace OHOS {
class SetDialModel {
#ifndef SET_DIAL_PRESENTER_H
#define SET_DIAL_PRESENTER_H
-#include "SetDialInfo.h"
-#include "SetDialModel.h"
+#include "set_dial/SetDialInfo.h"
+#include "set_dial/SetDialModel.h"
#include "Presenter.h"
#include "components/ui_view.h"
#include "components/ui_roller_view.h"
-#include "KeyInputListener.h"
-#include "ModelListenerSample.h"
+#include "key/KeyInputListener.h"
+#include "main/ModelListenerSample.h"
+#include "components/ui_coverflow_view.h"
+#include "main/MainModel.h"
namespace OHOS {
public:
SetDialPresenter();
~SetDialPresenter() override;
+ static SetDialPresenter *GetCurrentInstance();
+ void SpecifyDialSetting(const DialSetting &setting);
size_t GetDialCount(void);
std::vector<SetDialInfo>& GetDialInfo(void);
uint8_t GetPageIndex(void);
void OnClickAction(void);
SetDialModel *model{nullptr};
uint64_t startTime{0};
+ bool isSpecific = false;
+ DialSetting specificSetting;
};
}
#ifndef SET_DIAL_STYLE_MODEL_H
#define SET_DIAL_STYLE_MODEL_H
-#include "SetDialView.h"
+#include "set_dial/SetDialView.h"
#include "components/ui_view.h"
namespace OHOS {
#ifndef SET_DIAL_STYLE_PRESENTER_H
#define SET_DIAL_STYLE_PRESENTER_H
-#include "SetDialView.h"
+#include "set_dial/SetDialView.h"
#include "components/ui_view.h"
#include "Presenter.h"
public UIView::OnDragListener {
public:
SetDialStylePresenter();
- ~SetDialStylePresenter();
+ ~SetDialStylePresenter() override;
SetDialStylePresenter(const SetDialStylePresenter&) = delete;
SetDialStylePresenter& operator=(const SetDialStylePresenter&) = delete;
bool OnClick(UIView &view, const ClickEvent &event) override;
#include "components/ui_label.h"
#include "components/ui_view_group.h"
#include "components/ui_toggle_button.h"
-#include "SetDialView.h"
+#include "set_dial/SetDialView.h"
#include "View.h"
namespace OHOS {
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: ota local update\r
+ * Author: wangle\r
+ * Create: 2025-5-6\r
+ */\r
+#ifndef OTA_COMMON_H\r
+#define OTA_COMMON_H\r
+\r
+#define MODLE_THREAD_STACK_SIZE 4096\r
+\r
+#define LOCAL_UPDATE_PROGRESS_5 5\r
+#define LOCAL_UPDATE_PROGRESS_25 25\r
+#define LOCAL_UPDATE_PROGRESS_40 40\r
+#define LOCAL_UPDATE_PROGRESS_50 50\r
+#define LOCAL_UPDATE_PROGRESS_100 100\r
+\r
+#define SLEEP_TIME_S 1000\r
+\r
+#define SLIDING_LENGTH 30\r
+\r
+#define VIEW_MESSAGE_X 53\r
+#define VIEW_MESSAGE_Y 148\r
+#define VIEW_MESSAGE_W 360\r
+#define VIEW_MESSAGE_H 20\r
+#define VIEW_MESSAGE_FONT 20\r
+\r
+#define VIEW_PROGRESS_X 73\r
+#define VIEW_PROGRESS_Y 226\r
+#define VIEW_PROGRESS_W 320\r
+#define VIEW_PROGRESS_H 10\r
+\r
+#define VIEW_UPDATE_X 173\r
+#define VIEW_UPDATE_Y 312\r
+#define VIEW_UPDATE_W 120\r
+#define VIEW_UPDATE_H 40\r
+#define VIEW_UPDATE_FONT 16\r
+\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: ota local update\r
+ * Author: wangle\r
+ * Create: 2025-5-6\r
+ */\r
+#ifndef OTA_MODEL_H\r
+#define OTA_MODEL_H\r
+#include "osal_task.h"\r
+#include "osal_wait.h"\r
+#include "Model.h"\r
+#include <atomic>\r
+namespace OHOS {\r
+\r
+enum class TaskType { UpdateInfo, LocalUpdate, Unknown };\r
+\r
+struct LocalUpdateData {\r
+ uint32_t fileSize;\r
+};\r
+\r
+class OTAPresenter;\r
+class OTAModel : public Model<OTAPresenter> {\r
+public:\r
+ OTAModel();\r
+ ~OTAModel();\r
+\r
+public:\r
+ bool ModelRunTask(TaskType type, void *data);\r
+\r
+protected:\r
+ void SwitchTask();\r
+ void UpdateInfo(void *data);\r
+ void LocalUpdate(void *data);\r
+\r
+protected:\r
+ void DelayRebootFor5S();\r
+ void UpdatePercentCallback(uint32_t percent);\r
+\r
+protected:\r
+ static int OSALKthreadCallback(void *data);\r
+ static int WaitCondition(const void *data);\r
+\r
+protected:\r
+ static void OtaUpdatePercentCallback(uint32_t percent);\r
+\r
+private:\r
+ osal_task *task = nullptr;\r
+ osal_wait wait;\r
+ std::atomic_bool isIdel;\r
+ TaskType type = TaskType::Unknown;\r
+ void *data = nullptr;\r
+};\r
+\r
+} // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: ota local update\r
+ * Author: wangle\r
+ * Create: 2025-5-6\r
+ */\r
+#ifndef OTA_PRESENTER_H\r
+#define OTA_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+#include "components/ui_view.h"\r
+#include "set_ota/OTAModel.h"\r
+\r
+namespace OHOS {\r
+\r
+class OTAView;\r
+class OTAPresenter : public Presenter<OTAView, OTAModel>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ void OnStart() override;\r
+ void OnStop() override;\r
+\r
+public:\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+public:\r
+ // Model调用\r
+ void SetPackageInfo(const char* filePath, uint32_t fileSize);\r
+ void SetUpdateProgress(const char* message, uint8_t progress);\r
+ void SetErrorMessage(const char* message);\r
+ void SetMessage(const char* message);\r
+protected:\r
+ void SaveSystemScreen();\r
+ void BackSystemScreen();\r
+private:\r
+ bool updateEnable = true;\r
+ const char* updateFilePath = nullptr;\r
+ uint32_t updateFileSize = 0;\r
+ uint32_t briScrStatus = 0;\r
+};\r
+} // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: ota local update\r
+ * Author: wangle\r
+ * Create: 2025-5-6\r
+ */\r
+#ifndef OTA_VIEW_H\r
+#define OTA_VIEW_H\r
+\r
+#include "View.h"\r
+#include "Presenter.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_box_progress.h"\r
+#include "components/ui_label_button.h"\r
+\r
+namespace OHOS {\r
+class OTAPresenter;\r
+class OTAView : public View<OTAPresenter> {\r
+public:\r
+ OTAView(){};\r
+ ~OTAView(){};\r
+ void OnStart() override;\r
+ void OnStop() override;\r
+ void InitMessageCtrl();\r
+ void InitProgressCtrl();\r
+ void InitUpdateCtrl();\r
+ void AddCtrlToView();\r
+ void DeInitMessageCtrl();\r
+ void DeInitProgressCtrl();\r
+ void DeInitUpdateCtrl();\r
+\r
+public:\r
+ void SetUpdateEnable();\r
+ void SetUpdateDisable();\r
+ void SetMessage(const char *msg);\r
+ void SetProgress(uint8_t progress);\r
+\r
+private:\r
+ UILabel *message = nullptr;\r
+ UIBoxProgress *progress = nullptr;\r
+ UILabelButton *update = nullptr;\r
+};\r
+} // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SetDesktopModel.h
- * Author:
- * Create: 2021-11-23
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SetDesktopModel
+ * Author: Hisi Graphic Team
+ * Created: 2025-4
*/
#ifndef SET_DESKTOP_MODEL_H
DesktopStyle GetDesktopStyle(void);
void SetDesktopStyle(DesktopStyle style);
private:
- SetDesktopModel();
- SetDesktopModel(const SetDesktopModel &);
- SetDesktopModel &operator=(const SetDesktopModel &);
- virtual ~SetDesktopModel();
+ SetDesktopModel() = default;
+ virtual ~SetDesktopModel() = default;
};
}
#include "components/abstract_adapter.h"
#include "wearable_log.h"
#include "UiConfig.h"
-#include "SettingModel.h"
-#include "SettingItemView.h"
+#include "settings/SettingModel.h"
+#include "settings/SettingItemView.h"
namespace OHOS {
class SettingAdapter : public AbstractAdapter {
--- /dev/null
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingDesktopPage
+ * Author: Hisi Graphic Team
+ * Created: 2025-4
+ */
+
+#ifndef SETTING_DESKTOP_PAGE_H
+#define SETTING_DESKTOP_PAGE_H
+
+#include "View.h"
+#include "components/ui_scroll_view.h"
+#include "components/ui_view_group.h"
+#include "components/ui_label.h"
+#include "components/ui_image_view.h"
+#include "components/ui_toggle_button.h"
+#include "SlicePage.h"
+#include "UiConfig.h"
+#include "settings/SetDesktopModel.h"
+#include "settings/SettingPresenter.h"
+
+namespace OHOS {
+class SettingDesktopPage : public SlicePage<SettingPresenter>,
+ public UIView::OnClickListener,
+ public UIView::OnDragListener {
+public:
+ SettingDesktopPage();
+ ~SettingDesktopPage() override;
+ void OnStart(void* data) override;
+ void UpdateSelectedStyle(DesktopStyle selectedStyle);
+ bool OnClick(UIView &view, const ClickEvent &event) override;
+ bool OnDrag(UIView& view, const DragEvent& event) override;
+
+private:
+ void InitFootballItem();
+ void InitWaterfallItem();
+ UIScrollView *scrollview{nullptr};
+ UILabel titleText;
+ UIToggleButton hexagonsBtn;
+ UIToggleButton listBtn;
+ UIToggleButton footballBtn_;
+ UIToggleButton waterfallBtn_;
+ UIImageView hexagonsImage;
+ UIImageView listImage;
+ UIImageView footballImage_;
+ UIImageView waterfallImage_;
+ UILabel listText;
+ UILabel hexagonsText;
+ UILabel footballText_;
+ UILabel waterfallText_;
+};
+}
+#endif // SETTING_DESKTOP_PAGE_H
namespace OHOS {
typedef struct {
- AppViewId viewId;
+ uint32_t targetId;
const char *icon;
const char *label;
bool hasSecondMenu;
#include "components/ui_image_view.h"
#include "UiConfig.h"
-#include "SettingModel.h"
+#include "settings/SettingModel.h"
namespace OHOS {
class SettingItemView : public UIViewGroup {
{
return sItemInfo.enableSlideBack;
}
- AppViewId GetViewId();
+ uint32_t GetTargetId();
const char* GetIconId();
private:
UIImageView sIcon;
--- /dev/null
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingMainPage
+ * Author: Hisi Graphic Team
+ * Created: 2025-4
+ */
+
+#ifndef SETTING_MAIN_PAGE_H
+#define SETTING_MAIN_PAGE_H
+
+#include "components/ui_scroll_view.h"
+#include "components/ui_label.h"
+#include "components/ui_list.h"
+#include "SlicePage.h"
+#include "settings/SettingAdapter.h"
+#include "settings/SettingPresenter.h"
+
+namespace OHOS {
+class SettingPresenter;
+class SettingMainPage : public SlicePage<SettingPresenter>,
+ public UIView::OnClickListener,
+ public UIView::OnDragListener {
+public:
+ SettingMainPage() = default;
+ ~SettingMainPage() override;
+
+ void OnStart(void* data) override;
+ void RefreshSettingsList(const SettingItem* item, uint8_t count);
+ bool OnClick(UIView &view, const ClickEvent &event) override;
+ bool OnDrag(UIView& view, const DragEvent& event) override;
+private:
+ SettingAdapter *listAdapter{nullptr};
+ UIScrollView *scrollView{nullptr};
+ UIList *contentList{nullptr};
+ UILabel *title{nullptr};
+};
+}
+#endif // SETTING_MAIN_PAGE_H
\ No newline at end of file
#include <map>
#include "AppViewIDs.h"
#include "UiConfig.h"
-#include "SettingItem.h"
-#include "SettingPresenter.h"
+#include "settings/SettingItem.h"
+#include "settings/SettingPresenter.h"
namespace OHOS {
static const uint16_t SETTING_ITEM_COUNT = 10;
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: SettingPresenter.h
+ * Author:
+ * Create: 2021-11-23
+ */
+
+#ifndef SETTING_PRESENTER_H
+#define SETTING_PRESENTER_H
+
+#include "Presenter.h"
+
+namespace OHOS {
+class SettingView;
+class SettingPresenter : public Presenter<SettingView> {
+};
+}
+
+#endif // SETTING_PRESENTER_H
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025. All rights reserved.
+ * Description: SettingPage.h
+ * Author:
+ * Create: 2025-04-14
+ */
+
+#ifndef SETTING_VIEW_H
+#define SETTING_VIEW_H
+
+#include "View.h"
+namespace OHOS {
+enum SETTING_PAGES {
+ SETTING_MAIN_PAGE = 1, // 0 is invalid
+ SETTING_DESKTOP_PAGE = 2,
+};
+
+class SettingPresenter;
+class SettingView : public View<SettingPresenter> {
+};
+}
+#endif // SETTING_VIEW_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepingDetailsPage\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef SLEEPING_DETAILS_PAGE_H\r
+#define SLEEPING_DETAILS_PAGE_H\r
+\r
+#include "View.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_image_animator.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "SlicePage.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_sleep.h"\r
+#include "sleep/SleepingPresenter.h"\r
+#include "sleep/SleepingView.h"\r
+#include "sleep/SleepingModel.h"\r
+\r
+namespace OHOS {\r
+class SleepingPresenter;\r
+class SleepingDetailsPage : public SlicePage<SleepingPresenter>,\r
+ public UIView::OnDragListener {\r
+public:\r
+ SleepingDetailsPage();\r
+ ~SleepingDetailsPage() override;\r
+\r
+ void OnStart(void* data) override;\r
+ void InitPage();\r
+ void InitNoDeatilPage();\r
+ void InitDetailPage();\r
+\r
+ void InitSoberingTime();\r
+ void InitRapidEyeMovement();\r
+ void InitLightSleepTime();\r
+ void InitDeepSleepTime();\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ bool GetRecord();\r
+ std::string SetTimeText(std::tuple<uint32_t, uint32_t> timeTuple);\r
+ void InitActualSleepTime(std::tuple<uint32_t, uint32_t> timeTuple);\r
+ void IoadDeatilActualSleepTime();\r
+private:\r
+\r
+ UIScrollView *group{nullptr};\r
+ UIImageView *detailsSleepView{nullptr};\r
+ UILabel *sleep{nullptr};\r
+ UILabel *actualSleepTime{nullptr};\r
+ UILabel *actualSleepTimeHours{nullptr};\r
+ UILabel *actualSleepTimeHoursText{nullptr};\r
+ UILabel *actualSleepTimeMinutes{nullptr};\r
+ UILabel *actualSleepTimeMinutesText{nullptr};\r
+ UIImageView *grayBg{nullptr};\r
+\r
+ UIImageView *image1{nullptr};\r
+ UILabel *soberingTime_{nullptr};\r
+ UILabel *soberingTimeText{nullptr};\r
+ UIImageView *image2{nullptr};\r
+ UILabel *rapidEyeMovement_ {nullptr};\r
+ UILabel *rapidEyeMovementText{nullptr};\r
+ UIImageView *image3{nullptr};\r
+ UILabel *lightSleepTime_{nullptr};\r
+ UILabel *lightSleepTimeText{nullptr};\r
+ UIImageView *image4{nullptr};\r
+ UILabel *deepSleepTime_{nullptr};\r
+ UILabel *deepSleepTimeText{nullptr};\r
+};\r
+}\r
+\r
+#endif // SLEEPING_DETAILS_PAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepingMainPage\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef SLEEPING_MAIN_PAGE_H\r
+#define SLEEPING_MAIN_PAGE_H\r
+\r
+#include "View.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_image_animator.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "ui_resource_sleep.h"\r
+#include "main/LoadImg.h"\r
+#include "sleep/TargetSleepTime.h"\r
+#include "sleep/SleepingPresenter.h"\r
+#include "sleep/SleepingView.h"\r
+#include "sleep/SleepingModel.h"\r
+\r
+\r
+namespace OHOS {\r
+class SleepingPresenter;\r
+class SleepingMainPage : public SlicePage<SleepingPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ SleepingMainPage();\r
+ ~SleepingMainPage() override;\r
+\r
+ void OnStart(void* data) override;\r
+ void InitNoRecordPage();\r
+ void InitRecordPage();\r
+ void IoadActualSleepTime(std::tuple<uint32_t, uint32_t> timeTuple);\r
+ void IoadTargetTimeButton(std::tuple<uint32_t, uint32_t> timeTuple);\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ void CircleProgress();\r
+ void TargetTimeButton();\r
+ uint32_t GetSleepingScores();\r
+ void InitSleepTimeLabel();\r
+ void ScoreDisplay();\r
+ bool GetRecord();\r
+ void InitScoreDisplayPicture();\r
+private:\r
+\r
+ UIImageView *imageViewMain{nullptr};\r
+ UILabel *sleep{nullptr};\r
+ UIImageView *moonNoRecord{nullptr};\r
+ UIImageView *moon{nullptr};\r
+ UILabel *noRecord{nullptr};\r
+ UILabel *tips{nullptr};\r
+\r
+ UILabel *sleepScores_{nullptr};\r
+ UILabel *scoreText{nullptr};\r
+ UILabel *sleepScore{nullptr};\r
+\r
+ UIImageView *scoreDisplayPicture1{nullptr};\r
+ UIImageView *scoreDisplayPicture2{nullptr};\r
+ UIImageView *scoreDisplayPicture3{nullptr};\r
+ UIImageView *scoreDisplayPicture4{nullptr};\r
+ UIImageView *scoreDisplayPicture5{nullptr};\r
+ UIImageView *setting{nullptr};\r
+ UILabel *actualSleepTimeHours{nullptr};\r
+ UILabel *actualSleepTimeHoursText{nullptr};\r
+ UILabel *actualSleepTimeMinutes{nullptr};\r
+ UILabel *actualSleepTimeMinutesText{nullptr};\r
+\r
+ UILabelButton *targetTimeButton{nullptr};\r
+ UILabel *targetTimeText{nullptr};\r
+ UICircleProgress* circleProgress{nullptr};\r
+\r
+ UIScrollView *group{nullptr};\r
+};\r
+}\r
+\r
+#endif // SLEEPING_MAIN_PAGE_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepingModel\r
+ * Created: 2025-06-05\r
+ */\r
+#ifndef SLEEPING_MODEL_H\r
+#define SLEEPING_MODEL_H\r
+\r
+#include <cstdint>\r
+#include <map>\r
+#include <vector>\r
+#include <string>\r
+#include <sstream>\r
+#include <ctime>\r
+#include <iomanip>\r
+#include "AppViewIDs.h"\r
+#include "UiConfig.h"\r
+#include "graphic_timer.h"\r
+#include "ohos_timer.h"\r
+#include "wearable_log.h"\r
+#include "diag_service.h"\r
+#include "msg_center_device.h"\r
+#include "diag_common.h"\r
+#include "sleep/SleepingPresenter.h"\r
+\r
+namespace OHOS {\r
+ static const uint16_t SLEEP_DATA_DATE_RANGE = 20;\r
+ static const uint16_t SLEEP_DATA_START_DATA_RANGE = 24;\r
+\r
+ #pragma pack(1)\r
+ typedef struct {\r
+ bool isSend;\r
+ char date[SLEEP_DATA_DATE_RANGE];\r
+ uint8_t type; // 睡眠类别 深睡 浅睡 快速动眼 清醒\r
+ char start[SLEEP_DATA_START_DATA_RANGE];\r
+ char end[SLEEP_DATA_START_DATA_RANGE];\r
+ char sleepStart[SLEEP_DATA_START_DATA_RANGE];\r
+ char sleepEnd[SLEEP_DATA_START_DATA_RANGE];\r
+ } SleepData;\r
+ #pragma pack()\r
+\r
+\r
+ class SleepingModel {\r
+ public:\r
+ static SleepingModel &GetInstance(void);\r
+ void SendData();\r
+ uint8_t* SerializeSleepData(const SleepData* sleepData, size_t* outSize);\r
+ void SetSleepData();\r
+ void SetTime(uint32_t minute);\r
+ std::tuple<uint32_t, uint32_t> GetTime();\r
+ void SetData();\r
+ std::tuple<uint32_t, uint32_t> GetSoberingTime();\r
+ std::tuple<uint32_t, uint32_t> GetRapidEyeMovementTime();\r
+ std::tuple<uint32_t, uint32_t> GetLightSleepTime();\r
+ std::tuple<uint32_t, uint32_t> GetDeepSleepTime();\r
+ std::tuple<uint32_t, uint32_t> GetSleepTime();\r
+ void SetSoberingTime();\r
+ void SetRapidEyeMovementTime();\r
+ void SetLightSleepTime();\r
+ void SetDeepSleepTime();\r
+ bool GetRecord();\r
+ uint32_t GetSleepTimeHours();\r
+ uint32_t GetSleepTimeMinutes();\r
+ std::tuple<uint32_t, uint32_t> MinutesToHours(uint32_t minutes);\r
+ uint32_t TimeDiffInMinutes(const std::string& timeStr1, const std::string& timeStr2);\r
+ uint32_t GetDetailData(int type);\r
+ uint32_t GetTotalSleepTime();\r
+\r
+ private:\r
+ SleepingModel();\r
+ void PrintSleepData(const SleepData *data);\r
+ virtual ~SleepingModel();\r
+ uint32_t sleepTarget = 0;\r
+ std::vector<SleepData> sleepDataVector;\r
+ uint32_t soberingTime;\r
+ uint32_t eyeMoveTime;\r
+ uint32_t lightTime;\r
+ uint32_t deepTime;\r
+ };\r
+}\r
+\r
+#endif\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepingPresenter\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#ifndef SETTING_PRESENTER_H\r
+#define SETTING_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+\r
+namespace OHOS {\r
+class SleepingView;\r
+class SleepingPresenter : public Presenter<SleepingView> {\r
+};\r
+}\r
+\r
+#endif // SETTING_PRESENTER_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepingView\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#ifndef SLEEPING_VIEW_H\r
+#define SLEEPING_VIEW_H\r
+\r
+#include "View.h"\r
+namespace OHOS {\r
+enum SLEEPING_PAGES {\r
+ SLEEPING_MAIN_PAGE = 1, // 0 is invalid\r
+ SLEEPING_DEATIL_PAGE = 2,\r
+ SLEEPING_TARGET_PAGE = 3,\r
+};\r
+\r
+class SleepingPresenter;\r
+class SleepingView : public View<SleepingPresenter> {\r
+};\r
+}\r
+#endif // SLEEPING_VIEW_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TargetSleepTime\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#ifndef TARGET_SLEEP_TIME_H\r
+#define TARGET_SLEEP_TIME_H\r
+\r
+#include "View.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_image_animator.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_picker.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "main/LoadImg.h"\r
+#include "sleep/SleepingPresenter.h"\r
+#include "sleep/SleepingView.h"\r
+namespace OHOS {\r
+class TargetSleepTime : public SlicePage<SleepingPresenter>,\r
+ public UIPicker::SelectedListener,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ TargetSleepTime() = default;\r
+ ~TargetSleepTime() override;\r
+\r
+ void OnStart(void* data) override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ void OnPickerStoped(UIPicker& picker) override;\r
+ void TargetTimeButton();\r
+ void CreatePicker();\r
+ void CreateLabel();\r
+ void SetPickerTime();\r
+private:\r
+ UILabel* setTraget{nullptr};\r
+ UILabel* timerLabel{nullptr};\r
+ UILabelButton *startButton{nullptr};\r
+ UIImageView *backgroundImage{nullptr};\r
+ UIScrollView *group{nullptr};\r
+ UIPicker* timerPicker[2]{nullptr};\r
+};\r
+}\r
+#endif // TARGET_SLEEP_TIME_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Sports Model\r
+ * Create: 2025-04-28\r
+ */\r
+\r
+#ifndef SPORTS_MODEL_H\r
+#define SPORTS_MODEL_H\r
+#include "graphic_timer.h"\r
+\r
+namespace OHOS {\r
+\r
+typedef struct sport_data {\r
+ uint32_t step;\r
+ uint32_t distance;\r
+ int32_t lat;\r
+ int32_t lng;\r
+ uint32_t speed;\r
+ uint16_t heartrate;\r
+} sport_data_t;\r
+\r
+class SportsModel {\r
+public:\r
+ ~SportsModel();\r
+ static SportsModel *GetInstance(void);\r
+ void Init();\r
+ bool StartSportsTimer();\r
+ void StopSportsTimer(bool isDelete);\r
+ void IncrSportsTime();\r
+ std::string CountingSportsTime();\r
+ bool IsActive();\r
+ sport_data_t *GetSportsData();\r
+ void ResetSportsData();\r
+ uint32_t CalculateSpeed(uint32_t distance);\r
+\r
+private:\r
+ SportsModel();\r
+ void InitSportsTimer();\r
+ uint32_t uiSportTime_ = 0;\r
+ bool isActive_{false};\r
+ GraphicTimer *pGraphicTimer_{nullptr};\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: sports Presenter\r
+ * Create: 2025-04-28\r
+ */\r
+\r
+#ifndef SPORTS_PRESENTER_H\r
+#define SPORTS_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+\r
+namespace OHOS {\r
+\r
+class SportsView;\r
+class SportsPresenter : public Presenter<SportsView>,\r
+ public UIView::OnDragListener {\r
+public:\r
+ SportsPresenter();\r
+ ~SportsPresenter();\r
+ static SportsPresenter *GetInstance();\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+private:\r
+};\r
+} // namespace OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: sports View\r
+ * Create: 2025-04-28\r
+ */\r
+#ifndef SPORTS_VIEW_H\r
+#define SPORTS_VIEW_H\r
+\r
+#include "View.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_image_view.h"\r
+\r
+namespace OHOS {\r
+\r
+enum SportDataType {\r
+ SPORT_TIME = 0,\r
+ SPORT_SETP,\r
+ SPORT_DISTANCE,\r
+ SPORT_HEARTRATE,\r
+ SPORT_SPEED,\r
+ SPORT_MAX,\r
+};\r
+\r
+class SportsPresenter;\r
+class SportsView : public View<SportsPresenter> {\r
+public:\r
+ SportsView();\r
+ ~SportsView() override;\r
+ static SportsView *GetInstance();\r
+ void OnStart() override;\r
+ void SetStep(uint32_t step);\r
+ void SetHeartRate(uint16_t heartrate);\r
+ void SetDistance(uint32_t distance);\r
+ void SetTime(const char *time);\r
+ void SetSpeed(uint32_t speed);\r
+\r
+private:\r
+ bool InitView();\r
+ bool InitLableView(int index, const char *text, uint16_t x, uint16_t y1, uint16_t w, uint16_t y2);\r
+ void InitSportDataLabel();\r
+ UILabel TitleLabel[SPORT_MAX];\r
+ UILabel ContentLabel[SPORT_MAX];\r
+ UIViewGroup *group{nullptr};\r
+ UIImageView *backGround{nullptr};\r
+};\r
+} // namespace OHOS\r
+#endif // SPORTS_VIEW_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: StopwatchAdapter\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef STOPWATCH_ADAPTER_H\r
+#define STOPWATCH_ADAPTER_H\r
+\r
+#include "gfx_utils/list.h"\r
+#include "components/abstract_adapter.h"\r
+#include "stopwatch/StopwatchItemView.h"\r
+\r
+namespace OHOS {\r
+\r
+class StopwatchAdapter : public AbstractAdapter {\r
+public:\r
+ explicit StopwatchAdapter();\r
+ ~StopwatchAdapter() override;\r
+\r
+ void SetData(const List<StopwatchItem> &data);\r
+\r
+ uint16_t GetCount(void) override;\r
+ UIView *GetView(UIView *inView, int16_t index) override;\r
+\r
+private:\r
+ List<StopwatchItem> listData_;\r
+};\r
+}\r
+\r
+#endif // STOPWATCH_ADAPTER_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: StopwatchItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef STOPWATCH_ITEM_VIEW_H\r
+#define STOPWATCH_ITEM_VIEW_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_view_group.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+ std::string record;\r
+ bool isLatest;\r
+} StopwatchItem;\r
+\r
+class StopwatchItemView : public UIViewGroup {\r
+public:\r
+ explicit StopwatchItemView();\r
+ virtual ~StopwatchItemView() override;\r
+ void SetItemInfo(int16_t index, const StopwatchItem &itemInfo);\r
+\r
+private:\r
+ UILabel nameLabel_;\r
+ UILabel recordLabel_;\r
+ UILabelButton itemBg_;\r
+};\r
+}\r
+\r
+#endif\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: StopwatchModel\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef STOPWATCH_MODEL_H\r
+#define STOPWATCH_MODEL_H\r
+\r
+#include "stopwatch/StopwatchItemView.h"\r
+#include "gfx_utils/list.h"\r
+#ifndef _WIN32\r
+#include "time64.h"\r
+#endif\r
+\r
+namespace OHOS {\r
+class StopwatchModel {\r
+public:\r
+ ~StopwatchModel();\r
+ static StopwatchModel &GetInstance(void);\r
+\r
+ void SetStartTime();\r
+ void SaveElapsedTime();\r
+ uint64_t GetElapsedTime();\r
+ uint64_t UpdateElapsedTime();\r
+ void ResetCounter();\r
+ bool GetActiveState();\r
+ void SetActiveState();\r
+ void SetInactiveState();\r
+ List<StopwatchItem> &GetRecordsList();\r
+ void AddRecordToList(const StopwatchItem &record);\r
+ void ClearData();\r
+ bool IsInRecordView();\r
+ void SetRecordViewState(bool state);\r
+ bool GetOverflowState()\r
+ {\r
+ return isOverflow_;\r
+ }\r
+ void SetOverflowState(bool state)\r
+ {\r
+ isOverflow_ = state;\r
+ }\r
+\r
+private:\r
+ StopwatchModel();\r
+ StopwatchModel(const StopwatchModel &);\r
+ StopwatchModel &operator=(const StopwatchModel &);\r
+#ifdef _WIN32\r
+ struct timeval startTime_ {0};\r
+#else\r
+ struct timeval64 startTime_ {0};\r
+#endif\r
+ bool isOverflow_{false};\r
+ uint64_t uiElapsedTime_{0};\r
+ uint64_t uiSavedElapsedTime_{0};\r
+ bool bIsActive_{false};\r
+ bool bIsRecordView_{false};\r
+ List<StopwatchItem> records_;\r
+};\r
+}\r
+\r
+#endif // STOPWATCH_MODEL_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: StopwatchPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef STOPWATCH_PAGE_H\r
+#define STOPWATCH_PAGE_H\r
+\r
+#include "UiConfig.h"\r
+#include "SlicePage.h"\r
+#include "stopwatch/StopwatchPresenter.h"\r
+#include "stopwatch/StopwatchAdapter.h"\r
+#include "NativeRegisterManager.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_list.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_sweep_clock.h"\r
+#include "animator/animator.h"\r
+\r
+namespace OHOS {\r
+\r
+#define STOPWATCH_APP_NAME "秒表"\r
+\r
+class StopwatchPresenter;\r
+class StopwatchPage : public SlicePage<StopwatchPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ StopwatchPage();\r
+ ~StopwatchPage() override;\r
+\r
+ void OnStart(void* data) override;\r
+ void OnStop() override;\r
+ void OnPause() override;\r
+ void OnResume() override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ void Overflowing(void);\r
+ UISweepClock* GetSweepClock(){return sweepClock_;}\r
+ UILabel* GetElapsedTimeLabel(){return elapsedTime_;}\r
+private:\r
+ void DrawButtonStatusView(bool isActive);\r
+ void DrawContainRecordListView(bool isContainRecordList);\r
+ void RefreshRecordsList(void);\r
+ class StopwatchAnimatorCallback : public AnimatorCallback {\r
+ public:\r
+ StopwatchAnimatorCallback(StopwatchPage* page) : stopwatchPage(page) {}\r
+ virtual ~StopwatchAnimatorCallback() override {}\r
+ void Callback(UIView* view) override;\r
+ private:\r
+ StopwatchPage* stopwatchPage{nullptr};\r
+ };\r
+ class TimeAnimatorCallback : public AnimatorCallback {\r
+ public:\r
+ TimeAnimatorCallback() {}\r
+ virtual ~TimeAnimatorCallback() override {}\r
+ void Callback(UIView* view) override;\r
+ };\r
+ Animator* animator_{nullptr};\r
+ StopwatchAnimatorCallback* animatorCallback_{nullptr};\r
+ TimeAnimatorCallback* timeCallback_{nullptr};\r
+ Animator* timeAnimator_{nullptr};\r
+ UISweepClock *sweepClock_{nullptr};\r
+ Image *secondHand_{nullptr};\r
+ UILabel *currentTime_{nullptr};\r
+ UILabel *appName_{nullptr};\r
+ UILabel *elapsedTime_{nullptr};\r
+ UIList *recordsList_{nullptr};\r
+ StopwatchAdapter *listAdapter_{nullptr};\r
+ UILabelButton *startButton_{nullptr};\r
+ UILabelButton *resetButton_{nullptr};\r
+ UIImageView *backGround_{nullptr};\r
+ UIImageView *imgScale_{nullptr};\r
+};\r
+}\r
+#endif // STOPWATCH_PAGE_H\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: StopwatchPresenter\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef STOPWATCH_PRESENTER_H\r
+#define STOPWATCH_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+\r
+namespace OHOS {\r
+class StopwatchView;\r
+class StopwatchPresenter : public Presenter<StopwatchView> {};\r
+}\r
+\r
+#endif // STOPWATCH_PRESENTER_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: StopwatchView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#ifndef STOPWATCH_VIEW_H\r
+#define STOPWATCH_VIEW_H\r
+\r
+#include "View.h"\r
+namespace OHOS {\r
+enum STOPWATCH_PAGES {\r
+ STOPWATCH_MAIN_PAGE = 1, // 0 is invalid\r
+};\r
+\r
+class StopwatchPresenter;\r
+class StopwatchView : public View<StopwatchPresenter> {};\r
+}\r
+#endif // STOPWATCH_VIEW_H\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
#include "components/ui_scroll_view.h"\r
-#include "TempPresenter.h"\r
+#include "temperature/TempPresenter.h"\r
\r
namespace OHOS {\r
class TempClickMea : public UIScrollView {\r
#include "components/ui_image_view.h"\r
#include "components/ui_label.h"\r
#include "components/ui_view_group.h"\r
-#include "TempPresenter.h"\r
+#include "temperature/TempPresenter.h"\r
\r
namespace OHOS {\r
class TempContinueWarn : public UIViewGroup {\r
\r
#include "components/ui_image_view.h"\r
#include "components/ui_label.h"\r
-#include "AppGroupView.h"\r
-#include "TempPresenter.h"\r
+#include "main/AppGroupView.h"\r
+#include "temperature/TempPresenter.h"\r
\r
namespace OHOS {\r
class TempExitInter : public AppGroupView {\r
#include "components/ui_image_view.h"\r
#include "components/ui_label.h"\r
#include "components/ui_scroll_view.h"\r
-#include "TempPresenter.h"\r
+#include "temperature/TempPresenter.h"\r
\r
namespace OHOS {\r
class TempExitPrompt : public UIScrollView {\r
#include "components/ui_image_view.h"\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
-#include "AppGroupView.h"\r
-#include "TempPresenter.h"\r
+#include "main/AppGroupView.h"\r
+#include "temperature/TempPresenter.h"\r
\r
namespace OHOS {\r
class TempInitInter : public AppGroupView {\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
#include "components/ui_scroll_view.h"\r
-#include "TempPresenter.h"\r
+#include "temperature/TempPresenter.h"\r
\r
namespace OHOS {\r
class TempJoinStudy : public UIScrollView {\r
\r
#include "components/ui_label.h"\r
#include "components/ui_scroll_view.h"\r
-#include "TempPresenter.h"\r
+#include "temperature/TempPresenter.h"\r
\r
namespace OHOS {\r
class TempLittleTip : public UIScrollView {\r
#include "components/ui_view_group.h"\r
#include "ChangeSliceListener.h"\r
#include "components/ui_swipe_view.h"\r
-#include "TempPresenter.h"\r
-#include "TempJoinStudy.h"\r
-#include "TempMeasure.h"\r
-#include "TempExitInter.h"\r
-#include "TempPromptWear.h"\r
-#include "TempClickMea.h"\r
-#include "TempRemindWear.h"\r
-#include "TempMeaProcess.h"\r
-#include "TempInitInter.h"\r
-#include "TempWarn.h"\r
-#include "TempLittleTip.h"\r
-#include "TempModel.h"\r
-#include "TempStudyAbout.h"\r
-#include "TempExitPrompt.h"\r
-#include "TempContinueWarn.h"\r
-#include "TempReport.h"\r
+#include "temperature/TempPresenter.h"\r
+#include "temperature/TempJoinStudy.h"\r
+#include "temperature/TempMeasure.h"\r
+#include "temperature/TempExitInter.h"\r
+#include "temperature/TempPromptWear.h"\r
+#include "temperature/TempClickMea.h"\r
+#include "temperature/TempRemindWear.h"\r
+#include "temperature/TempMeaProcess.h"\r
+#include "temperature/TempInitInter.h"\r
+#include "temperature/TempWarn.h"\r
+#include "temperature/TempLittleTip.h"\r
+#include "temperature/TempModel.h"\r
+#include "temperature/TempStudyAbout.h"\r
+#include "temperature/TempExitPrompt.h"\r
+#include "temperature/TempContinueWarn.h"\r
+#include "temperature/TempReport.h"\r
\r
namespace OHOS {\r
class TempMainView;\r
#include "components/ui_label.h"\r
#include "components/ui_scroll_view.h"\r
#include "components/ui_circle_progress.h"\r
-#include "TempPresenter.h"\r
+#include "temperature/TempPresenter.h"\r
\r
namespace OHOS {\r
class TempMeaProcess : public UIScrollView {\r
#include "components/ui_image_view.h"\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
-#include "AppGroupView.h"\r
-#include "TempPresenter.h"\r
+#include "main/AppGroupView.h"\r
+#include "temperature/TempPresenter.h"\r
\r
namespace OHOS {\r
class TempMeasure : public AppGroupView {\r
#include "components/ui_swipe_view.h"\r
#include "wearable_log.h"\r
#include "color.h"\r
-#include "ModelListenerSample.h"\r
+#include "main/ModelListenerSample.h"\r
\r
namespace OHOS {\r
constexpr char* TEMP_JOIN_STUDY = (char*)"tempjoinstudy";\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
#include "components/ui_scroll_view.h"\r
-#include "TempPresenter.h"\r
+#include "temperature/TempPresenter.h"\r
\r
namespace OHOS {\r
class TempPromptWear : public UIScrollView {\r
#include "components/ui_image_view.h"\r
#include "components/ui_label.h"\r
#include "components/ui_scroll_view.h"\r
-#include "TempPresenter.h"\r
+#include "temperature/TempPresenter.h"\r
\r
namespace OHOS {\r
class TempRemindWear : public UIScrollView {\r
\r
#include "components/ui_image_view.h"\r
#include "components/ui_label.h"\r
-#include "AppGroupView.h"\r
-#include "TempPresenter.h"\r
+#include "main/AppGroupView.h"\r
+#include "temperature/TempPresenter.h"\r
\r
namespace OHOS {\r
class TempReport : public AppGroupView {\r
\r
#include "components/ui_label.h"\r
#include "components/ui_scroll_view.h"\r
-#include "TempPresenter.h"\r
+#include "temperature/TempPresenter.h"\r
\r
namespace OHOS {\r
class TempStudyAbout : public UIScrollView {\r
#include "components/ui_label.h"\r
#include "components/ui_label_button.h"\r
#include "components/ui_scroll_view.h"\r
-#include "TempPresenter.h"\r
+#include "temperature/TempPresenter.h"\r
\r
namespace OHOS {\r
class TempWarn : public UIScrollView {\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TimerMainPage\r
+ * Create: 2025-06-09\r
+ */\r
+\r
+#ifndef TIMER_MAIN_PAGE_H\r
+#define TIMER_MAIN_PAGE_H\r
+\r
+#include <sys/time.h>\r
+#include "View.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "UiConfig.h"\r
+#include "ChangeSliceListener.h"\r
+#include "components/ui_image_view.h"\r
+#include "timers/TimerPresenter.h"\r
+#include "timers/TimerModel.h"\r
+#include "SlicePage.h"\r
+#include "common/image_cache_manager.h"\r
+#include "ui_resource_timer.h"\r
+\r
+namespace OHOS {\r
+ class TimerMainPage : public SlicePage<TimerPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+ public:\r
+ TimerMainPage() = default;\r
+ ~TimerMainPage() override;\r
+\r
+ void OnStart(void *data) override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ void LabelTitle();\r
+ void CreateButton();\r
+ void InitView();\r
+\r
+ private:\r
+ UIScrollView *group{nullptr};\r
+ UIImageView *selectMin[4]{nullptr}; // 分钟计时\r
+ UIImageView *addButton{nullptr}; // 自定义按钮\r
+ UILabel *title{nullptr}; // 计时器\r
+ UIImageView *backround{nullptr};\r
+ };\r
+}\r
+#endif // TIMER_MAIN_PAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TimerModel\r
+ * Create: 2025-06-09\r
+ */\r
+\r
+#ifndef TIMER_MODEL_H\r
+#define TIMER_MODEL_H\r
+\r
+#include <sys/time.h>\r
+#include <cstdint>\r
+#include <map>\r
+#include <mutex>\r
+#include "AppViewIDs.h"\r
+#include "UiConfig.h"\r
+#include "timers/TimerPresenter.h"\r
+#include "graphic_timer.h"\r
+#include "ohos_timer.h"\r
+\r
+namespace OHOS {\r
+ class TimerModel {\r
+ public:\r
+ static TimerModel &GetInstance(void);\r
+\r
+ void SetDurationTime(uint32_t time); // 设置计时器的总时间\r
+ uint32_t GetDurationTime(); // 获取计时器的总时间\r
+ bool GetIsTiming() { return isTiming; }\r
+ void SetIsTiming(bool value) { isTiming = value; }\r
+ bool GetIsPause() { return isPause; }\r
+ void SetIsPause(bool value) { isPause = value; }\r
+ uint32_t GetStartTime() { return start_time; };\r
+ void SetStartTime(uint32_t value) { start_time = value; };\r
+ uint32_t GetSaveTime();\r
+ void SetSaveTime(bool falg, uint32_t value);\r
+\r
+ void InitTimer();\r
+ void DisableTimer();\r
+ bool GetExistTimer() { return haveTimer; };\r
+ void SetExistTimer(bool value) { haveTimer = value; };\r
+\r
+ private:\r
+ TimerModel();\r
+ virtual ~TimerModel();\r
+ TimerModel(const TimerModel &) = delete;\r
+ TimerModel &operator=(const TimerModel &) = delete;\r
+ uint32_t start_time;\r
+ uint32_t save_time;\r
+ uint32_t durationTime = 0;\r
+ GraphicTimer *g_startCounting = nullptr; // 定时器\r
+ bool haveTimer = false;\r
+ bool isTiming = false;\r
+ bool isPause = false;\r
+ };\r
+}\r
+\r
+#endif // TIMER_MODEL_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TimerPresenter\r
+ * Create: 2025-06-09\r
+ */\r
+\r
+#ifndef TIMER_PRESENTER_H\r
+#define TIMER_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+#include "components/ui_view.h"\r
+\r
+namespace OHOS {\r
+\r
+#define SETTING_TIMER "setting_timer"\r
+#define STOPWATCH_RESET "stopwatch_reset"\r
+#define ONE_MIN "onemine"\r
+#define THREE_MIN "threemine"\r
+#define FIFTY_MIN "fiftymine"\r
+#define THIRTY_MIN "thirtymine"\r
+#define BACK_TIMER "backtimer"\r
+#define RESET "reset"\r
+#define START_PAUSE "start_pause"\r
+#define START_TIMING "start_timing"\r
+\r
+ class TimerView;\r
+ class TimerPresenter : public Presenter<TimerView> {\r
+ };\r
+}\r
+\r
+#endif // TIMER_PRESENTER_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TimerSettingPage\r
+ * Create: 2025-06-09\r
+ */\r
+\r
+#ifndef TIMER_SETTING_PAGE_H\r
+#define TIMER_SETTING_PAGE_H\r
+\r
+#include "View.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_time_picker.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "UiConfig.h"\r
+#include "timers/TimerPresenter.h"\r
+#include "timers/TimerModel.h"\r
+#include "SlicePage.h"\r
+#include "ChangeSliceListener.h"\r
+#include "ui_resource_timer.h"\r
+\r
+namespace OHOS {\r
+ class TimerSettingPage : public UIPicker::SelectedListener,\r
+ public SlicePage<TimerPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+ public:\r
+ TimerSettingPage() = default;\r
+ ~TimerSettingPage() override;\r
+\r
+ void OnStart(void *data) override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+\r
+ void CreateLabel(void);\r
+ void CreateStartButton(void);\r
+ void CreatePicker();\r
+ UIScrollView *InitTimerSetView();\r
+ void OnPickerStoped(UIPicker& picker) override;\r
+\r
+ private:\r
+ UIScrollView *group{nullptr};\r
+ UIButton *back{nullptr};\r
+ UILabel *title{nullptr};\r
+ UIImageView *start{nullptr};\r
+\r
+ UILabel *timerLabel{nullptr};\r
+ UIPicker *timerPicker[3]{nullptr};\r
+ ImageInfo *image1 = nullptr;\r
+ ImageInfo *image2 = nullptr;\r
+ };\r
+}\r
+#endif // TIMER_SETTING_PAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TimerTimingPage\r
+ * Create: 2025-06-09\r
+ */\r
+\r
+#ifndef TIMER_TIMING_PAGE_H\r
+#define TIMER_TIMING_PAGE_H\r
+\r
+#include <sys/time.h>\r
+#include "View.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_digital_clock.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_circle_progress.h"\r
+#include "UiConfig.h"\r
+#include "timers/TimerModel.h"\r
+#include "timers/TimerPresenter.h"\r
+#include "SlicePage.h"\r
+#include "ChangeSliceListener.h"\r
+#include "components/ui_sweep_clock.h"\r
+#include "ui_resource_timer.h"\r
+\r
+namespace OHOS {\r
+ class TimerTimingPage : public SlicePage<TimerPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+ public:\r
+ TimerTimingPage() = default;\r
+ ~TimerTimingPage() override;\r
+ void OnStart(void *data) override;\r
+ void OnResume() override;\r
+ void OnPause() override;\r
+\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ void CreateButton();\r
+ void CreateTimerTime();\r
+ void CircleProgress();\r
+ void SetTimerTime(uint32_t durationTime);\r
+ void SetupAnimator();\r
+ void SetAnimatorStatus(bool status);\r
+\r
+ private:\r
+ class TimeAnimatorCallback : public AnimatorCallback {\r
+ public:\r
+ TimeAnimatorCallback() {}\r
+ virtual ~TimeAnimatorCallback() override {}\r
+ void Callback(UIView *view) override;\r
+ };\r
+\r
+ class TimerTimingCallback : public AnimatorCallback {\r
+ public:\r
+ explicit TimerTimingCallback(TimerTimingPage *page) : page_(page) {}\r
+ ~TimerTimingCallback() override {}\r
+ void Callback(UIView *view) override;\r
+\r
+ private:\r
+ TimerTimingPage *page_{nullptr};\r
+ };\r
+\r
+ UIScrollView *group{nullptr};\r
+ UISweepClock *sweepClock_{nullptr};\r
+ UIDigitalClock *dClock{nullptr};\r
+ UILabel *title{nullptr};\r
+ UIDigitalClock *timerTime{nullptr};\r
+ UIImageView *reset{nullptr};\r
+ UIImageView *start{nullptr};\r
+ UICircleProgress *circleProgress{nullptr};\r
+ UILabel *currentTime_{nullptr};\r
+ TimeAnimatorCallback *timeCallback_{nullptr};\r
+ Animator *timeAnimator_{nullptr};\r
+ TimerTimingCallback *callBack_ = nullptr;\r
+ Animator *animator_ = nullptr;\r
+ Image *secondHand_{nullptr};\r
+ UIImageView *backround{nullptr};\r
+ };\r
+}\r
+#endif // TIMER_TIMING_PAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TimerView\r
+ * Create: 2025-06-09\r
+ */\r
+\r
+#ifndef TIMER_VIEW_H\r
+#define TIMER_VIEW_H\r
+\r
+#include "View.h"\r
+\r
+namespace OHOS {\r
+ enum TIMER_PAGES {\r
+ TIMER_MAIN_PAGE = 1, // 主页面\r
+ TIMER_SETTING_PAGE, // 自定义页面\r
+ TIMER_TIMING_PAGE, // 显示计时页面\r
+ TIMER_ALL_VIEW,\r
+ };\r
+\r
+ class TimerPresenter;\r
+ class TimerView : public View<TimerPresenter> {\r
+ };\r
+}\r
+#endif // TIMER_VIEW_H\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Data View\r
+ * Create: 2025-03-22\r
+ */\r
+\r
+#ifndef TRAINING_DATA_VIEW_H\r
+#define TRAINING_DATA_VIEW_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_canvas.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_view_group.h"\r
+\r
+namespace OHOS {\r
+class DataView {\r
+public:\r
+ DataView();\r
+ ~DataView();\r
+ static DataView *GetInstance();\r
+ UIViewGroup *InitShowUpView(void);\r
+ void UpdateDataViewByType();\r
+\r
+private:\r
+ void ShowupBackgroup();\r
+ void ShowupTopView();\r
+ void ShowupLeftView();\r
+ void ShowupRightView();\r
+ void ShowupBottomView();\r
+ void ShowupSepLine();\r
+ UIImageView *backGround{nullptr};\r
+ UIImageView *heartrate{nullptr};\r
+ UICanvas *sepLine{nullptr};\r
+ UILabel *topValueLabel{nullptr};\r
+ UILabel *topUnitLabel{nullptr};\r
+ UILabel *leftValueLabel{nullptr};\r
+ UILabel *leftUnitLabel{nullptr};\r
+ UILabel *rightValueLabel{nullptr};\r
+ UILabel *rightUnitLabel{nullptr};\r
+ UILabel *bottomValueLabel{nullptr};\r
+ UILabel *bottomUnitLabel{nullptr};\r
+ UIViewGroup *group{nullptr};\r
+};\r
+} // namespace OHOS\r
+#endif // TRAINING_DATA_VIEW_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Menu View\r
+ * Create: 2025-03-22\r
+ */\r
+\r
+#ifndef TRAINING_MENU_VIEW_H\r
+#define TRAINING_MENU_VIEW_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_list.h"\r
+#include "components/ui_view_group.h"\r
+#include "training/TrainingItemView.h"\r
+#include "training/TrainingAdapter.h"\r
+#include "UiConfig.h"\r
+namespace OHOS {\r
+enum TrainingTypes : uint8_t {\r
+ TRAINING_TYPE_OUTDOOR_RUNNING = 0,\r
+ TRAINING_TYPE_INDOOR_RUNNING,\r
+ TRAINING_TYPE_CYCLING,\r
+ TRAINING_TYPE_CLIMBING,\r
+ TRAINING_TYPE_INDOOR_SWIMMING,\r
+ TRAINING_TYPE_OUTDOOR_SWIMMING,\r
+ TRAINING_TYPE_MAX,\r
+};\r
+\r
+#define TRAINING_ITEM_OUTDOOR_RUNNING "trainingItemOutdoorRunning"\r
+#define TRAINING_ITEM_INDOOR_RUNNING "trainingItemIndoorRunning"\r
+#define TRAINING_ITEM_CYCLING "trainingItemCycling"\r
+#define TRAINING_ITEM_CLIMBING "trainingItemClimbing"\r
+#define TRAINING_ITEM_INDOOR_SWIMMING "trainingItemIndoorSwimming"\r
+#define TRAINING_ITEM_OUTDOOR_SWIMMING "trainingItemOutdoorSwimming"\r
+\r
+class MenuView {\r
+public:\r
+ MenuView();\r
+ ~MenuView();\r
+ static MenuView *GetInstance();\r
+ UIViewGroup *InitShowUpView(void);\r
+\r
+private:\r
+ void CreateUILabel(void);\r
+ void CreateUIList(void);\r
+ UILabel *titleLabel{nullptr};\r
+ UIList *trainingList{nullptr};\r
+ TrainingAdapter *listAdapter_{nullptr};\r
+ UIViewGroup *group{nullptr};\r
+ TrainingItem trainings[TRAINING_TYPE_MAX] = {\r
+ {TRAINING_TYPE_OUTDOOR_RUNNING, PNG_APPLIST_WALK_IMAGE, "户外跑步", TRAINING_ITEM_OUTDOOR_RUNNING},\r
+ {TRAINING_TYPE_INDOOR_RUNNING, PNG_APPLIST_WALK_IMAGE, "室内跑步", TRAINING_ITEM_INDOOR_RUNNING},\r
+ {TRAINING_TYPE_CYCLING, PNG_APPLIST_WALK_IMAGE, "骑行", TRAINING_ITEM_CYCLING},\r
+ {TRAINING_TYPE_CLIMBING, PNG_APPLIST_WALK_IMAGE, "登山", TRAINING_ITEM_CLIMBING},\r
+ {TRAINING_TYPE_INDOOR_SWIMMING, PNG_APPLIST_WALK_IMAGE, "室内游泳", TRAINING_ITEM_INDOOR_SWIMMING},\r
+ {TRAINING_TYPE_OUTDOOR_SWIMMING, PNG_APPLIST_WALK_IMAGE, "户外游泳", TRAINING_ITEM_OUTDOOR_SWIMMING}};\r
+};\r
+} // namespace OHOS\r
+#endif // TRAINING_MENU_VIEW_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Pause View\r
+ * Create: 2025-03-22\r
+ */\r
+\r
+#ifndef TRAINING_PAUSE_VIEW_H\r
+#define TRAINING_PAUSE_VIEW_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_view_group.h"\r
+\r
+namespace OHOS {\r
+#define TRAINING_PAUSE_CONTINUE_BUTTON "trainingPauseContinueButton"\r
+#define TRAINING_PAUSE_FINISH_BUTTON "trainingPauseFinishButton"\r
+\r
+class PauseView {\r
+public:\r
+ PauseView();\r
+ ~PauseView();\r
+ static PauseView *GetInstance();\r
+ UIViewGroup *InitShowUpView(void);\r
+\r
+private:\r
+ void CreateUILabel(void);\r
+ void CreateUIButton(void);\r
+ UILabel *timeLabel{nullptr};\r
+ UILabel *textLabel{nullptr};\r
+ UILabelButton *continueButton{nullptr};\r
+ UILabelButton *finishButton{nullptr};\r
+ UIViewGroup *group{nullptr};\r
+};\r
+} // namespace OHOS\r
+#endif // TRAINING_PAUSE_VIEW_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Prepare View\r
+ * Create: 2025-03-22\r
+ */\r
+\r
+#ifndef TRAINING_PREPARE_VIEW_H\r
+#define TRAINING_PREPARE_VIEW_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_view_group.h"\r
+\r
+namespace OHOS {\r
+#define TRAINING_PREPARE_START_BUTTON "trainingPrepareStartButton"\r
+class PrepareView {\r
+public:\r
+ PrepareView();\r
+ ~PrepareView();\r
+ static PrepareView *GetInstance();\r
+ UIViewGroup *InitShowUpView(void);\r
+ void UpdateViewByTrainingType(uint8_t trainingType);\r
+\r
+private:\r
+ bool InitBatteryView();\r
+ bool InitHeartbeatView();\r
+ bool InitTimeLableVIew();\r
+ bool InitLocatingLableVIew();\r
+ bool InitCenterView();\r
+ bool InitGPSView();\r
+ bool InitHeartrateView();\r
+ bool InitStartButtonView();\r
+ UILabel *timeLabel{nullptr};\r
+ UIImageView *battery{nullptr};\r
+ UILabel *batteryLabel{nullptr};\r
+ UIImageView *gpsImageView{nullptr};\r
+ UILabel *gpsLabel{nullptr};\r
+ UIImageView *heartRateImageView{nullptr};\r
+ UILabel *heartRateLabel{nullptr};\r
+ UILabel *locatingLabel{nullptr};\r
+ UILabelButton *startButton{nullptr};\r
+ UIButton *iconImageView{nullptr};\r
+ UIViewGroup *group{nullptr};\r
+};\r
+} // namespace OHOS\r
+#endif // TRAINING_PREPARE_VIEW_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Prompt View\r
+ * Create: 2025-03-22\r
+ */\r
+\r
+#ifndef PROMPT_VIEW_H\r
+#define PROMPT_VIEW_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_view_group.h"\r
+\r
+namespace OHOS {\r
+#define TRAINING_PROMPT_CANCEL_BUTTON "trainingPromptCancelButton"\r
+#define TRAINING_PROMPT_CONFIRM_BUTTON "trainingPromptConfirmButton"\r
+\r
+class PromptView {\r
+public:\r
+ PromptView();\r
+ ~PromptView();\r
+ static PromptView *GetInstance();\r
+ UIViewGroup *InitShowUpView(void);\r
+\r
+private:\r
+ void CreateUILabel(void);\r
+ void CreateUIButton(void);\r
+ UILabel *titleLabel{nullptr};\r
+ UIButton *cancelButton{nullptr};\r
+ UIButton *confirmButton{nullptr};\r
+ UIViewGroup *group{nullptr};\r
+};\r
+} // namespace OHOS\r
+#endif // PROMPT_VIEW_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TargetAdapter.h\r
+ * Author:\r
+ * Create: 2025-11-23\r
+ */\r
+\r
+#ifndef TARGET_ADAPTER_H\r
+#define TARGET_ADAPTER_H\r
+\r
+#include <list>\r
+#include "training/TargetItemView.h"\r
+#include "components/abstract_adapter.h"\r
+\r
+namespace OHOS {\r
+\r
+class TargetAdapter : public AbstractAdapter {\r
+public:\r
+ explicit TargetAdapter();\r
+ ~TargetAdapter() override;\r
+\r
+ /* *\r
+ * @brief Sets the UIView adapter data, which is a SettingItem linked list.\r
+ *\r
+ * @param data Indicates the SettingItem linked list data.\r
+ * @since 1.0\r
+ * @version 1.0\r
+ */\r
+ void SetData(const std::list<TargetItem> &data);\r
+\r
+ /* *\r
+ * @brief Obtains the <b>data</b> size of the UILabel adapter.\r
+ *\r
+ * @return Returns the <b>data</b> size of the UILabel adapter.\r
+ * @since 1.0\r
+ * @version 1.0\r
+ */\r
+ uint16_t GetCount(void) override;\r
+\r
+ UIView *GetView(UIView *inView, int16_t index) override;\r
+\r
+ void AddListItem(const TargetItem &item);\r
+\r
+ void SetItemClickListener(UIView::OnClickListener *itemclicklistener)\r
+ {\r
+ itemClickListener = itemclicklistener;\r
+ }\r
+private:\r
+ std::list<TargetItem> listData_;\r
+ UIView::OnClickListener *itemClickListener{nullptr};\r
+};\r
+}\r
+\r
+#endif // TARGET_ADAPTER_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TargetItemView\r
+ * Author:\r
+ * Create: 2025-02-15\r
+ */\r
+\r
+#ifndef TARGET_ITEM_H\r
+#define TARGET_ITEM_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+ uint8_t type;\r
+ const char *icon;\r
+ const char *label;\r
+ const char *viewId;\r
+} TargetItem;\r
+\r
+class TargetItemView : public UIViewGroup {\r
+public:\r
+ TargetItemView();\r
+ ~TargetItemView() override;\r
+\r
+ virtual void SetItemInfo(const TargetItem itemInfo);\r
+\r
+private:\r
+ bool InitView();\r
+ UIImageView sIcon;\r
+ UILabel sLabel;\r
+ UIImageView sNextImage;\r
+ TargetItem sItemInfo = {0, nullptr, nullptr, nullptr};\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TargetSetting View\r
+ * Create: 2025-03-22\r
+ */\r
+\r
+#ifndef TRAINING_TARGET_SETTING_VIEW_H\r
+#define TRAINING_TARGET_SETTING_VIEW_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_picker.h"\r
+\r
+namespace OHOS {\r
+#define TARGET_SETTING_CONFIRM_BUTTON "targetSettingConfirmButton"\r
+\r
+class TargetSettingView {\r
+public:\r
+ TargetSettingView();\r
+ ~TargetSettingView();\r
+ static TargetSettingView *GetInstance();\r
+ UIViewGroup *InitShowUpView(void);\r
+ void UpdateViewByTargetType(uint8_t targetType);\r
+\r
+private:\r
+ void CreateUILabel(void);\r
+ void CreateUIPicker(void);\r
+ void CreateUIButton(void);\r
+ UILabel *titleLabel{nullptr};\r
+ UIPicker *picker{nullptr};\r
+ UILabelButton *confirmButton{nullptr};\r
+ UIViewGroup *group{nullptr};\r
+};\r
+} // namespace OHOS\r
+#endif // TRAINING_TARGET_SETTING_VIEW_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Target View\r
+ * Create: 2025-03-22\r
+ */\r
+\r
+#ifndef TRAINING_TARGET_VIEW_H\r
+#define TRAINING_TARGET_VIEW_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_list.h"\r
+#include "components/ui_view_group.h"\r
+#include "training/TargetItemView.h"\r
+#include "training/TargetAdapter.h"\r
+#include "UiConfig.h"\r
+namespace OHOS {\r
+enum TrainingTargets : uint8_t {\r
+ TRAINING_TARGET_DISTANCE = 0,\r
+ TRAINING_TARGET_TIME,\r
+ TRAINING_TARGET_CALORIE,\r
+ TRAINING_TARGET_MAX,\r
+};\r
+\r
+#define TRAINING_TARGET_ITEM_DISTANCE "trainingTargetItemDistance"\r
+#define TRAINING_TARGET_ITEM_TIME "trainingTargetItemTime"\r
+#define TRAINING_TARGET_ITEM_CALORIE "trainingTargetItemCalorie"\r
+\r
+class TargetView {\r
+public:\r
+ TargetView();\r
+ ~TargetView();\r
+ static TargetView *GetInstance();\r
+ UIViewGroup *InitShowUpView(void);\r
+\r
+private:\r
+ void CreateUILabel(void);\r
+ void CreateUIList(void);\r
+ UILabel *titleLabel{nullptr};\r
+ UIList *targetList{nullptr};\r
+ TargetAdapter *listAdapter_{nullptr};\r
+ UIViewGroup *group{nullptr};\r
+ TargetItem targets[TRAINING_TARGET_MAX] = {\r
+ {TRAINING_TARGET_DISTANCE, PNG_PHONE_IMAGE, "距离", TRAINING_TARGET_ITEM_DISTANCE},\r
+ {TRAINING_TARGET_TIME, PNG_WATCH_IMAGE, "时间", TRAINING_TARGET_ITEM_TIME},\r
+ {TRAINING_TARGET_CALORIE, PNG_BLUETOOTH_IMAGE, "热量", TRAINING_TARGET_ITEM_CALORIE}};\r
+};\r
+} // namespace OHOS\r
+#endif // TRAINING_TARGET_VIEW_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TrainingAdapter.h\r
+ * Author:\r
+ * Create: 2025-11-23\r
+ */\r
+\r
+#ifndef TRAINING_ADAPTER_H\r
+#define TRAINING_ADAPTER_H\r
+\r
+#include <list>\r
+#include "training/TrainingItemView.h"\r
+#include "components/abstract_adapter.h"\r
+\r
+namespace OHOS {\r
+\r
+class TrainingAdapter : public AbstractAdapter {\r
+public:\r
+ explicit TrainingAdapter();\r
+ ~TrainingAdapter() override;\r
+\r
+ /* *\r
+ * @brief Sets the UIView adapter data, which is a SettingItem linked list.\r
+ *\r
+ * @param data Indicates the SettingItem linked list data.\r
+ * @since 1.0\r
+ * @version 1.0\r
+ */\r
+ void SetData(const std::list<TrainingItem> &data);\r
+\r
+ /* *\r
+ * @brief Obtains the <b>data</b> size of the UILabel adapter.\r
+ *\r
+ * @return Returns the <b>data</b> size of the UILabel adapter.\r
+ * @since 1.0\r
+ * @version 1.0\r
+ */\r
+ uint16_t GetCount(void) override;\r
+\r
+ UIView *GetView(UIView *inView, int16_t index) override;\r
+\r
+ void AddListItem(const TrainingItem &item);\r
+\r
+ void SetItemClickListener(UIView::OnClickListener *itemclicklistener)\r
+ {\r
+ itemClickListener = itemclicklistener;\r
+ }\r
+private:\r
+ std::list<TrainingItem> listData_;\r
+ UIView::OnClickListener *itemClickListener{nullptr};\r
+};\r
+}\r
+\r
+#endif // TRAINING_ADAPTER_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TrainingItemView\r
+ * Author:\r
+ * Create: 2025-02-15\r
+ */\r
+\r
+#ifndef TRAINING_ITEM_H\r
+#define TRAINING_ITEM_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+ uint8_t type;\r
+ const char *icon;\r
+ const char *label;\r
+ const char *viewId;\r
+} TrainingItem;\r
+\r
+class TrainingItemView : public UIViewGroup {\r
+public:\r
+ TrainingItemView();\r
+ ~TrainingItemView() override;\r
+\r
+ virtual void SetItemInfo(const TrainingItem itemInfo);\r
+\r
+private:\r
+ bool InitView();\r
+ UIImageView sIcon;\r
+ UILabel sLabel;\r
+ UIImageView sSettingImage;\r
+ TrainingItem sItemInfo = {0, nullptr, nullptr, nullptr};\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TrainingModel.h\r
+ * Author:\r
+ * Create: 2025-11-23\r
+ */\r
+\r
+#ifndef TRAINING_MODEL_H\r
+#define TRAINING_MODEL_H\r
+\r
+#include <inttypes.h>\r
+namespace OHOS {\r
+class TrainingModel {\r
+public:\r
+ static TrainingModel &GetInstance(void);\r
+ void SetCurView(int16_t viewNum);\r
+ int16_t GetCurView(void);\r
+ void SetCurTrainingType(int8_t trainingType);\r
+ int8_t GetCurTrainingType(void);\r
+\r
+private:\r
+ TrainingModel();\r
+ TrainingModel(const TrainingModel &);\r
+ TrainingModel &operator=(const TrainingModel &);\r
+ virtual ~TrainingModel();\r
+ int16_t curView_{0};\r
+ uint8_t trainingType_{0};\r
+};\r
+}\r
+\r
+#endif // TRAINING_MODEL_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TrainingPresenter.h\r
+ * Author:\r
+ * Create: 2025-11-23\r
+ */\r
+\r
+#ifndef TRAINING_PRESENTER_H\r
+#define TRAINING_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+#include "training/TrainingView.h"\r
+#include "training/TrainingModel.h"\r
+#include "components/ui_view.h"\r
+\r
+namespace OHOS {\r
+class TrainingView;\r
+class TrainingPresenter : public Presenter<TrainingView>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ TrainingPresenter();\r
+ ~TrainingPresenter() override;\r
+ static TrainingPresenter *GetInstance();\r
+\r
+ void OnResume() override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ void OnPause() override;\r
+private:\r
+ void ClickStartButton(void);\r
+ void ClickCountineButton(void);\r
+ void ClickFinishButton(void);\r
+ void ClickCancelButton(void);\r
+ void ClickConfirmButton(void);\r
+ void TrainingSetting(uint8_t trainingType);\r
+ void StartTraining(uint8_t trainingType);\r
+ void SettingTarget(uint8_t targetType);\r
+ void EnterTarget(void);\r
+ void ConfirmTargetSetting(void);\r
+ TrainingModel *trainingModel_{nullptr};\r
+};\r
+}\r
+\r
+#endif // TRAINING_PRESENTER_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TrainingSettingAdapter.h\r
+ * Author:\r
+ * Create: 2025-11-23\r
+ */\r
+\r
+#ifndef TRAINING_SETTING_ADAPTER_H\r
+#define TRAINING_SETTING_ADAPTER_H\r
+\r
+#include <list>\r
+#include "training/TrainingSettingItemView.h"\r
+#include "components/abstract_adapter.h"\r
+\r
+namespace OHOS {\r
+\r
+class TrainingSettingAdapter : public AbstractAdapter {\r
+public:\r
+ explicit TrainingSettingAdapter();\r
+ ~TrainingSettingAdapter() override;\r
+\r
+ /* *\r
+ * @brief Sets the UIView adapter data, which is a SettingItem linked list.\r
+ *\r
+ * @param data Indicates the SettingItem linked list data.\r
+ * @since 1.0\r
+ * @version 1.0\r
+ */\r
+ void SetData(const std::list<TrainingSettingItem> &data);\r
+\r
+ /* *\r
+ * @brief Obtains the <b>data</b> size of the UILabel adapter.\r
+ *\r
+ * @return Returns the <b>data</b> size of the UILabel adapter.\r
+ * @since 1.0\r
+ * @version 1.0\r
+ */\r
+ uint16_t GetCount(void) override;\r
+\r
+ UIView *GetView(UIView *inView, int16_t index) override;\r
+\r
+ void AddListItem(const TrainingSettingItem &item);\r
+\r
+ void SetItemClickListener(UIView::OnClickListener *itemclicklistener)\r
+ {\r
+ itemClickListener = itemclicklistener;\r
+ }\r
+private:\r
+ std::list<TrainingSettingItem> listData_;\r
+ UIView::OnClickListener *itemClickListener{nullptr};\r
+};\r
+}\r
+\r
+#endif // TRAINING_SETTING_ADAPTER_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TrainingSettingItemView.h\r
+ * Author:\r
+ * Create: 2025-11-23\r
+ */\r
+\r
+#ifndef TRAINING_SETTING_ITEM_H\r
+#define TRAINING_SETTING_ITEM_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+\r
+namespace OHOS {\r
+typedef struct {\r
+ uint8_t type;\r
+ const char *icon;\r
+ const char *label;\r
+ const char *viewId;\r
+} TrainingSettingItem;\r
+\r
+class TrainingSettingItemView : public UIViewGroup {\r
+public:\r
+ TrainingSettingItemView();\r
+ ~TrainingSettingItemView() override;\r
+\r
+ virtual void SetItemInfo(const TrainingSettingItem itemInfo);\r
+\r
+private:\r
+ bool InitView();\r
+ UIImageView sIcon;\r
+ UILabel sLabel;\r
+ UIImageView sNextImage;\r
+ TrainingSettingItem sItemInfo = {0, nullptr, nullptr, nullptr};\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TrainingSetting View\r
+ * Create: 2025-03-22\r
+ */\r
+\r
+#ifndef TRAINING_SETTING_VIEW_H\r
+#define TRAINING_SETTING_VIEW_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_list.h"\r
+#include "components/ui_view_group.h"\r
+#include "training/TrainingSettingItemView.h"\r
+#include "training/TrainingSettingAdapter.h"\r
+#include "UiConfig.h"\r
+\r
+namespace OHOS {\r
+enum TrainingSettings : uint8_t {\r
+ TRAINING_SETTING_TARGET = 0,\r
+ TRAINING_SETTING_REMIND,\r
+ TRAINING_SETTING_MISTOUCH,\r
+ TRAINING_SETTING_DATA_DISPLAY,\r
+ TRAINING_SETTING_METRONOME,\r
+ TRAINING_SETTING_REMOVE,\r
+ TRAINING_SETTING_MAX,\r
+};\r
+\r
+#define TRAINING_SETTING_ITEM_TARGET "trainingSettingItemTarget"\r
+#define TRAINING_SETTING_ITEM_REMIND "trainingSettingItemTargetRemind"\r
+#define TRAINING_SETTING_ITEM_MISTOUCH "trainingSettingItemTargetMistouch"\r
+#define TRAINING_SETTING_ITEM_DATA_DISPLAY "trainingSettingItemTargetDataDisplay"\r
+#define TRAINING_SETTING_ITEM_METRONOME "trainingSettingItemTargetMetronome"\r
+#define TRAINING_SETTING_ITEM_REMOVE "trainingSettingItemTargetRemove"\r
+\r
+class TrainingSettingView {\r
+public:\r
+ TrainingSettingView();\r
+ ~TrainingSettingView();\r
+ static TrainingSettingView *GetInstance();\r
+ UIViewGroup *InitShowUpView(void);\r
+\r
+private:\r
+ void CreateUILabel(void);\r
+ void CreateUIList(void);\r
+ UILabel *titleLabel{nullptr};\r
+ UIList *settingList{nullptr};\r
+ TrainingSettingAdapter *listAdapter_{nullptr};\r
+ UIViewGroup *group{nullptr};\r
+ TrainingSettingItem settings[TRAINING_SETTING_MAX] = {\r
+ {TRAINING_SETTING_TARGET, PNG_BLUETOOTH_IMAGE, "目标", TRAINING_SETTING_ITEM_TARGET},\r
+ {TRAINING_SETTING_REMIND, PNG_WATCH_IMAGE, "提醒", TRAINING_SETTING_ITEM_REMIND},\r
+ {TRAINING_SETTING_MISTOUCH, PNG_PHONE_IMAGE, "防误触", TRAINING_SETTING_ITEM_MISTOUCH},\r
+ {TRAINING_SETTING_DATA_DISPLAY, PNG_BLUETOOTH_IMAGE, "数据显示", TRAINING_SETTING_ITEM_DATA_DISPLAY},\r
+ {TRAINING_SETTING_METRONOME, PNG_WATCH_IMAGE, "节拍器", TRAINING_SETTING_ITEM_METRONOME},\r
+ {TRAINING_SETTING_REMOVE, PNG_PHONE_IMAGE, "移除此运动", TRAINING_SETTING_ITEM_REMOVE}};\r
+};\r
+} // namespace OHOS\r
+#endif // SETTING_SETTING_VIEW_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TrainingViews View\r
+ * Create: 2025-03-22\r
+ */\r
+\r
+#ifndef TRAINING_VIEW_H\r
+#define TRAINING_VIEW_H\r
+\r
+#include "View.h"\r
+#include "components/ui_view_group.h"\r
+#include "training/MenuView.h"\r
+#include "training/PrepareView.h"\r
+#include "training/DataView.h"\r
+#include "training/PauseView.h"\r
+#include "training/PromptView.h"\r
+#include "training/TrainingSettingView.h"\r
+#include "training/TargetView.h"\r
+#include "training/TargetSettingView.h"\r
+\r
+namespace OHOS {\r
+enum TrainingViews : uint8_t {\r
+ TRAINING_VIEW_MENU,\r
+ TRAINING_VIEW_PREPARE,\r
+ TRAINING_VIEW_DATA,\r
+ TRAINING_VIEW_PAUSE,\r
+ TRAINING_VIEW_PROMPT,\r
+ TRAINING_VIEW_SETTING,\r
+ TRAINING_VIEW_TARGET,\r
+ TRAINING_VIEW_TARGET_SETTING,\r
+ TRAINING_VIEW_MAX,\r
+};\r
+\r
+constexpr const char *MENU_VIEW_ID = "MenuViewID";\r
+constexpr const char *PREPARE_VIEW_ID = "PrepareViewID";\r
+constexpr const char *DATA_VIEW_ID = "DataViewID";\r
+constexpr const char *PAUSE_VIEW_ID = "PauseViewID";\r
+constexpr const char *PROMPT_VIEW_ID = "PromptViewID";\r
+constexpr const char *SETTING_VIEW_ID = "SettingViewID";\r
+constexpr const char *TARGET_VIEW_ID = "TargetViewID";\r
+constexpr const char *TARGET_SETTING_VIEW_ID = "TargetSettingViewID";\r
+\r
+class TrainingPresenter;\r
+class TrainingView : public View<TrainingPresenter> {\r
+public:\r
+ TrainingView();\r
+ ~TrainingView() override;\r
+ static TrainingView *GetInstance();\r
+\r
+ void OnStart() override;\r
+ void OnStop() override;\r
+ void ChangeView(int16_t hideView, int16_t showView);\r
+\r
+private:\r
+ UIViewGroup *container[TRAINING_VIEW_MAX]{nullptr};\r
+ typedef bool (TrainingView::*PreprosssChangeView)(int16_t hideView, int16_t thisView);\r
+ PreprosssChangeView preProcessView[TRAINING_VIEW_MAX];\r
+ bool CheckViewParam(int16_t hideView, int16_t showView);\r
+ MenuView *menuView{nullptr};\r
+ PrepareView *prepareView{nullptr};\r
+ DataView *dataView{nullptr};\r
+ PauseView *pauseView{nullptr};\r
+ PromptView *promptView{nullptr};\r
+ TrainingSettingView *settingView{nullptr};\r
+ TargetView *targetView{nullptr};\r
+ TargetSettingView *targetSettingView{nullptr};\r
+ bool ChangeMenuView(int16_t hideView, int16_t thisView);\r
+ bool ChangePrepareView(int16_t hideView, int16_t thisView);\r
+ bool ChangeDataView(int16_t hideView, int16_t thisView);\r
+ bool ChangePauseView(int16_t hideView, int16_t thisView);\r
+ bool ChangePromptView(int16_t hideView, int16_t thisView);\r
+ bool ChangeSettingView(int16_t hideView, int16_t thisView);\r
+ bool ChangeTargetView(int16_t hideView, int16_t thisView);\r
+ bool ChangeTargetSettingView(int16_t hideView, int16_t thisView);\r
+};\r
+}\r
+#endif // TRAINING_VIEW_H\r
#include <map>
#include "AppViewIDs.h"
#include "UiConfig.h"
-#include "UISamplePresenter.h"
+#include "uisample/UISamplePresenter.h"
namespace OHOS {
class UISampleModel {
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: Breath Ease\r
+ * Author: wangle\r
+ * Create: 2025-4-23\r
+ */\r
+#ifndef UI_MANAGER_H\r
+#define UI_MANAGER_H\r
+#include <cstdint>\r
+#include "main/AppGroupView.h"\r
+\r
+namespace OHOS {\r
+class UILanguage {\r
+public:\r
+ static const char* GetText(uint16_t textId);\r
+ static void SetLanguage(uint8_t id);\r
+ static void UpdateLanguage();\r
+private:\r
+ static bool RegisterGlobalManager();\r
+};\r
+}\r
+#endif
\ No newline at end of file
BT_DISCONNECTED_TO_UI,
UI_ADD_SLEEP_VETO,
UI_RM_SLEEP_VETO,
+ UI_UPDATE_LANGUAGE,
CONNECT_NEW_PHONE,
+ UI_OTA_UPDATE,
} UiServiceMsgId;
#define BUNDLE_NAME_LEN 128
#define VIDEO_CARD_H
#include <string>
-#include "DialDataBase.h"
+#include "main/dial/DialDataBase.h"
#include "components/ui_view_group.h"
-#include "OnDialDataUpdateListener.h"
+#include "main/dial/OnDialDataUpdateListener.h"
#include "components/ui_card_page.h"
#include "components/ui_lite_surface_view.h"
#include "video_play_wrapper.h"
-#include "DialView.h"
+#include "main/dial/DialView.h"
namespace OHOS {
class VideoCard : public UICardPage {
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: weather/WeatherAdapter.h\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef WEATHER_ADAPTER_H\r
+#define WEATHER_ADAPTER_H\r
+\r
+#include <list>\r
+#include <string>\r
+#include "components/ui_list.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/abstract_adapter.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "weather/WeatherModel.h"\r
+#include "weather/WeatherItemView.h"\r
+\r
+namespace OHOS {\r
+class WeatherAdapter : public AbstractAdapter {\r
+public:\r
+ explicit WeatherAdapter();\r
+ ~WeatherAdapter() override;\r
+\r
+ /* *\r
+ * @brief Sets the UIView adapter data, which is a WeatherItem linked list.\r
+ *\r
+ * @param data Indicates the WeatherItem linked list data.\r
+ * @since 1.0\r
+ * @version 1.0\r
+ */\r
+ void SetData(std::list<WeatherItem> &data);\r
+\r
+ /* *\r
+ * @brief Obtains the <b>data</b> size of the UILabel adapter.\r
+ *\r
+ * @return Returns the <b>data</b> size of the UILabel adapter.\r
+ * @since 1.0\r
+ * @version 1.0\r
+ */\r
+ uint16_t GetCount(void) override;\r
+\r
+ UIView *GetView(UIView *inView, int16_t index) override;\r
+\r
+ void AddListItem(const WeatherItem &item);\r
+\r
+ void SetItemClickListener(UIView::OnClickListener *itemclicklistener)\r
+ {\r
+ itemClickListener = itemclicklistener;\r
+ }\r
+private:\r
+ std::list<WeatherItem> listData;\r
+ UIView::OnClickListener *itemClickListener{nullptr};\r
+};\r
+}\r
+\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherItemView\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef WEATHER_ITEM_VIEW_H\r
+#define WEATHER_ITEM_VIEW_H\r
+\r
+#include "components/ui_label.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_canvas.h"\r
+\r
+#include "UiConfig.h"\r
+#include "weather/WeatherModel.h"\r
+\r
+namespace OHOS {\r
+class WeatherItemView : public UIViewGroup {\r
+public:\r
+ explicit WeatherItemView();\r
+ ~WeatherItemView() override;\r
+ virtual void SetItemInfo(const WeatherItem itemInfo);\r
+ virtual void SetUpChild();\r
+\r
+private:\r
+ UILabel sLabel_1;\r
+ UIImageView sIcon;\r
+ UILabel sLabel_2;\r
+ UICanvas chartLine;\r
+ UIImageView sNextImage;\r
+ WeatherItem sItemInfo = {nullptr, nullptr, nullptr, false};\r
+};\r
+}\r
+\r
+#endif\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherMainPage\r
+ * Created: 2025-4\r
+ */\r
+\r
+#ifndef WEATHER_MAIN_PAGE_H\r
+#define WEATHER_MAIN_PAGE_H\r
+\r
+#include <sys/time.h>\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_list.h"\r
+#include "weather/WeatherAdapter.h"\r
+#include "weather/WeatherPresenter.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+#include "weather/WeatherView.h"\r
+namespace OHOS {\r
+static constexpr int16_t LABEL_COUNT = 6;\r
+class WeatherPresenter;\r
+class WeatherMainPage : public SlicePage<WeatherPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener {\r
+public:\r
+ WeatherMainPage();\r
+ ~WeatherMainPage() override;\r
+\r
+ void OnStart(void* data) override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ std::string FormatTime(bool falg, const std::string& inputStr);\r
+ void InitLabel();\r
+ void InitImage();\r
+ void InitWeatherImage();\r
+private:\r
+ bool flag = false;\r
+ int curWeather_code = 0;\r
+ CurWeather cur{nullptr};\r
+ UIViewGroup *group = nullptr;\r
+ WeatherModel *weatherModel = nullptr;\r
+ UILabel *title[LABEL_COUNT]{nullptr};\r
+ UILabel *labelTitle{nullptr};\r
+ UIImageView *mainImg{nullptr};\r
+ UIImageView *addressImg{nullptr};\r
+ UIImageView *aroundImg = nullptr;\r
+ UIImageView *weatherImg{nullptr};\r
+ UIImageView *ImageAir{nullptr};\r
+ UIImageView *ImageHumidity{nullptr};\r
+ UIImageView *ImagePageKey{nullptr};\r
+};\r
+}\r
+#endif // SETTING_MAIN_PAGE_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherModel\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#ifndef WEATHER_MODEL_H\r
+#define WEATHER_MODEL_H\r
+\r
+#include <sys/time.h>\r
+#include <fstream>\r
+#include <sstream>\r
+#include <cstdint>\r
+#include <map>\r
+#include <iostream>\r
+#include <random>\r
+#include <chrono>\r
+#include <ctime>\r
+#include <hal_tick.h>\r
+#include "AppViewIDs.h"\r
+#include "UiConfig.h"\r
+#include "cJSON.h"\r
+#include "components/ui_image_view.h"\r
+#include "common/image_cache_manager.h"\r
+#include "main/LoadImg.h"\r
+#include "ui_resource_weather.h"\r
+#ifndef _WIN32\r
+#include "time64.h"\r
+#endif\r
+namespace OHOS {\r
+static constexpr int16_t MIN_TO_HOUR = 60;\r
+static constexpr int16_t HOURLY_SYSTEM = 24;\r
+static constexpr int16_t WEATHER_COUNT = 24;\r
+static constexpr int16_t WEATHER_HOUR = 12;\r
+static constexpr int16_t SET_ZERO = 0;\r
+static constexpr int16_t SET_ONE = 1;\r
+static constexpr int16_t SET_TWO = 2;\r
+static constexpr int16_t SET_THREE = 3;\r
+static constexpr int16_t SET_FOUR = 4;\r
+static constexpr int16_t SET_FIVE = 5;\r
+static constexpr int16_t SET_SIX = 6;\r
+static constexpr int16_t SET_SEVEN = 7;\r
+static constexpr int16_t SET_EIGHT = 8;\r
+static constexpr int16_t SET_NINE = 9;\r
+static constexpr int16_t SET_TEN = 10;\r
+static constexpr int16_t SET_TWELVE = 12;\r
+static constexpr int16_t SET_FOURTEEN = 14;\r
+static constexpr int16_t SET_HUNDRED = 100;\r
+static constexpr int16_t START_YEAR = 1900;\r
+static constexpr int16_t ARRAY_SIZE = 31;\r
+static const uint16_t WEATHER_ITEM_COUNT = 10;\r
+\r
+const int bigWeatherImage[ARRAY_SIZE] = {\r
+ IMAGE_CONVERTER_TOOL_WEATHER00, // 0\r
+ IMAGE_CONVERTER_TOOL_WEATHER01, // 1\r
+ IMAGE_CONVERTER_TOOL_WEATHER02, // 2\r
+ IMAGE_CONVERTER_TOOL_WEATHER03, // 3\r
+ IMAGE_CONVERTER_TOOL_WEATHER04, // 4\r
+ IMAGE_CONVERTER_TOOL_WEATHER05, // 5\r
+ IMAGE_CONVERTER_TOOL_WEATHER06, // 6\r
+ IMAGE_CONVERTER_TOOL_WEATHER07, // 7\r
+ IMAGE_CONVERTER_TOOL_WEATHER08, // 8\r
+ IMAGE_CONVERTER_TOOL_WEATHER09, // 9\r
+ IMAGE_CONVERTER_TOOL_WEATHER10, // 10\r
+ IMAGE_CONVERTER_TOOL_WEATHER11, // 11\r
+ IMAGE_CONVERTER_TOOL_WEATHER12, // 12\r
+ IMAGE_CONVERTER_TOOL_WEATHER13, // 13\r
+ IMAGE_CONVERTER_TOOL_WEATHER14, // 14\r
+ IMAGE_CONVERTER_TOOL_WEATHER15, // 15\r
+ IMAGE_CONVERTER_TOOL_WEATHER16, // 16\r
+ IMAGE_CONVERTER_TOOL_WEATHER17, // 17\r
+ IMAGE_CONVERTER_TOOL_WEATHER18, // 18\r
+ IMAGE_CONVERTER_TOOL_WEATHER19, // 19\r
+ IMAGE_CONVERTER_TOOL_WEATHER20, // 20\r
+ IMAGE_CONVERTER_TOOL_WEATHER21, // 21\r
+ IMAGE_CONVERTER_TOOL_WEATHER22, // 22\r
+ IMAGE_CONVERTER_TOOL_WEATHER23, // 23\r
+ IMAGE_CONVERTER_TOOL_WEATHER24, // 24\r
+ IMAGE_CONVERTER_TOOL_WEATHER25, // 25\r
+ IMAGE_CONVERTER_TOOL_WEATHER26, // 26\r
+ IMAGE_CONVERTER_TOOL_WEATHER27, // 27\r
+ IMAGE_CONVERTER_TOOL_WEATHER28, // 28\r
+ IMAGE_CONVERTER_TOOL_WEATHER29, // 29\r
+ IMAGE_CONVERTER_TOOL_WEATHER31 // 30\r
+};\r
+\r
+const int smallWeatherImage[ARRAY_SIZE] = {\r
+ IMAGE_CONVERTER_TOOL_WEATHER32, // 32\r
+ IMAGE_CONVERTER_TOOL_WEATHER33, // 33\r
+ IMAGE_CONVERTER_TOOL_WEATHER34, // 34\r
+ IMAGE_CONVERTER_TOOL_WEATHER35, // 35\r
+ IMAGE_CONVERTER_TOOL_WEATHER36, // 36\r
+ IMAGE_CONVERTER_TOOL_WEATHER37, // 37\r
+ IMAGE_CONVERTER_TOOL_WEATHER38, // 38\r
+ IMAGE_CONVERTER_TOOL_WEATHER39, // 39\r
+ IMAGE_CONVERTER_TOOL_WEATHER40, // 40\r
+ IMAGE_CONVERTER_TOOL_WEATHER41, // 41\r
+ IMAGE_CONVERTER_TOOL_WEATHER42, // 42\r
+ IMAGE_CONVERTER_TOOL_WEATHER43, // 43\r
+ IMAGE_CONVERTER_TOOL_WEATHER44, // 44\r
+ IMAGE_CONVERTER_TOOL_WEATHER45, // 45\r
+ IMAGE_CONVERTER_TOOL_WEATHER46, // 46\r
+ IMAGE_CONVERTER_TOOL_WEATHER47, // 47\r
+ IMAGE_CONVERTER_TOOL_WEATHER48, // 48\r
+ IMAGE_CONVERTER_TOOL_WEATHER49, // 49\r
+ IMAGE_CONVERTER_TOOL_WEATHER50, // 50\r
+ IMAGE_CONVERTER_TOOL_WEATHER51, // 51\r
+ IMAGE_CONVERTER_TOOL_WEATHER52, // 52\r
+ IMAGE_CONVERTER_TOOL_WEATHER53, // 53\r
+ IMAGE_CONVERTER_TOOL_WEATHER54, // 54\r
+ IMAGE_CONVERTER_TOOL_WEATHER55, // 55\r
+ IMAGE_CONVERTER_TOOL_WEATHER56, // 56\r
+ IMAGE_CONVERTER_TOOL_WEATHER57, // 57\r
+ IMAGE_CONVERTER_TOOL_WEATHER58, // 58\r
+ IMAGE_CONVERTER_TOOL_WEATHER59, // 59\r
+ IMAGE_CONVERTER_TOOL_WEATHER60, // 60\r
+ IMAGE_CONVERTER_TOOL_WEATHER61, // 61\r
+ IMAGE_CONVERTER_TOOL_WEATHER62 // 62\r
+};\r
+\r
+typedef struct {\r
+ const char *label_1;\r
+ const ImageInfo *icon;\r
+ const char *label_2;\r
+ bool hasSecondMenu;\r
+} WeatherItem;\r
+\r
+typedef struct {\r
+ const char *min_degree;\r
+ const char *max_degree;\r
+ const char *address;\r
+ const char *weather_code;\r
+ const char *degree;\r
+ const char *updateTime;\r
+ const char *humidity;\r
+ std::string sunSet;\r
+ std::string sunRise;\r
+} CurWeather;\r
+\r
+typedef struct {\r
+ const char *hour;\r
+ const char *degree;\r
+ const char *weather;\r
+} HourWeather;\r
+class WeatherModel {\r
+public:\r
+ static WeatherModel &GetInstance(void);\r
+ bool InitWeatherItem();\r
+ WeatherItem *GetWeatherlistItems();\r
+ uint8_t GetWeatherListNum();\r
+ CurWeather GetCurWeather();\r
+ std::vector<HourWeather> GetHourWeather();\r
+ void InitFirstPageData();\r
+ void InitSecondPageData();\r
+ void InitThirdPageData();\r
+ void UpdateTemp();\r
+ bool InitVecForecast(cJSON *root);\r
+ bool InitVecObserve(cJSON *root);\r
+ bool InitVecRise(cJSON *root);\r
+ bool InitVecWeek(cJSON *root);\r
+ bool InitVecAddress(cJSON *root);\r
+ virtual ~WeatherModel();\r
+ void SetDayStatus(const std::string &timeRise, const std::string &timeSet);\r
+ bool GetDayStatus();\r
+\r
+private:\r
+ WeatherModel();\r
+ WeatherModel(const WeatherModel &);\r
+ WeatherModel &operator=(const WeatherModel &);\r
+ int usedLen{0};\r
+ int tempMinArray[WEATHER_ITEM_COUNT] = {0};\r
+ int tempMaxArray[WEATHER_ITEM_COUNT] = {0};\r
+ bool isDay;\r
+ CurWeather curWeather{nullptr};\r
+ std::vector<HourWeather> houWeather;\r
+ WeatherItem weather[WEATHER_ITEM_COUNT] = {nullptr, nullptr, nullptr, false};\r
+ std::vector<std::tuple<std::string, std::string, int>> vec_forecast_1h;\r
+ std::vector<std::tuple<std::string, std::string, int>> vec_forecast_24h;\r
+ std::vector<std::tuple<std::string, std::string, int>> vec_rise;\r
+ std::map<std::string, std::string> map_observe;\r
+ std::map<std::string, std::string> map_address;\r
+};\r
+}\r
+\r
+#endif // Weather_MODEL_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageSecond\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#ifndef WEATHER_PAGESECOND_H\r
+#define WEATHER_PAGESECOND_H\r
+\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_swipe_view.h"\r
+#include "ui_swipe_view.h"\r
+#include "weather/WeatherPresenter.h"\r
+#include "weather/WeatherView.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+namespace OHOS {\r
+class WeatherPresenter;\r
+class WeatherPageSecond : public SlicePage<WeatherPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener,\r
+ public UISwipeView::OnSwipeListener {\r
+public:\r
+ WeatherPageSecond();\r
+ ~WeatherPageSecond() override;\r
+ void OnStart(void* data) override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ void OnSwipe(UISwipeView &view) override;\r
+ void WeatherInit(UIViewGroup *group);\r
+ void InitLabel(UIViewGroup *group, int count);\r
+ void InitImage(UIViewGroup *group, int count);\r
+ bool SetSwipeInter();\r
+ void InitVecWeather();\r
+private:\r
+ WeatherModel *weatherModel = nullptr;\r
+ std::vector<HourWeather> houWeather;\r
+ UISwipeView *weatherSwipeGroup = nullptr;\r
+ UIViewGroup *swipeGroup[SET_THREE]{nullptr};\r
+ UIImageView *imgBack[SET_EIGHT]{nullptr};\r
+ UILabel *labelTime[SET_EIGHT]{nullptr};\r
+ UILabel *labelTemp[SET_EIGHT]{nullptr};\r
+ UIImageView *imgWeather[SET_EIGHT]{nullptr};\r
+ UIImageView *mainImg{nullptr};\r
+ UIImageView *ImagePageKey{nullptr};\r
+ int index = 0; // 记录当前是第几个swipe\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageThird\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#ifndef WEATHER_PAGETHIRD_H\r
+#define WEATHER_PAGETHIRD_H\r
+\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button.h"\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_swipe_view.h"\r
+#include "main/AppGroupView.h"\r
+#include "weather/WeatherPresenter.h"\r
+#include "weather/WeatherAdapter.h"\r
+#include "SlicePage.h"\r
+#include "UiConfig.h"\r
+namespace OHOS {\r
+class WeatherPageThird : public SlicePage<WeatherPresenter>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener,\r
+ public UISwipeView::OnSwipeListener {\r
+public:\r
+ WeatherPageThird();\r
+ ~WeatherPageThird() override;\r
+ void OnStart(void* data) override;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ void OnSwipe(UISwipeView &view) override;\r
+ void InitScrollView();\r
+ bool InitScrollData();\r
+ void RefreshWeathersList(const WeatherItem *item, uint8_t count);\r
+private:\r
+ WeatherModel *weatherModel = nullptr;\r
+ UIViewGroup *group = nullptr;\r
+ UIList *contentList{nullptr};\r
+ UILabel *title{nullptr};\r
+ WeatherAdapter *listAdapter{nullptr};\r
+ UIImageView *mainImg{nullptr};\r
+ UIImageView *ImagePageKey{nullptr};\r
+};\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPresenter\r
+ * Create: 2025-11-23\r
+ */\r
+\r
+#ifndef WEATHER_PRESENTER_H\r
+#define WEATHER_PRESENTER_H\r
+\r
+#include "Presenter.h"\r
+#include "components/ui_view.h"\r
+#include "weather/WeatherModel.h"\r
+namespace OHOS {\r
+class WeatherView;\r
+class WeatherPresenter : public Presenter<WeatherView> {};\r
+}\r
+\r
+#endif // Weather_PRESENTER_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherView\r
+ * Create: 2025-11-23\r
+ */\r
+\r
+#ifndef WEATHER_VIEW_H\r
+#define WEATHER_VIEW_H\r
+\r
+#include "View.h"\r
+namespace OHOS {\r
+enum WEATHER_PAGES {\r
+ WEATHER_MAIN_PAGE = 1, // 0 is invalid\r
+ WEATHER_SECOND_PAGE = 2,\r
+ WEATHER_THIRD_PAGE = 3,\r
+};\r
+\r
+class WeatherPresenter;\r
+class WeatherView : public View<WeatherPresenter> {};\r
+}\r
+#endif // Weather_VIEW_H\r
* Create: 2022-03-02\r
*/\r
\r
-#include "CustomizationView.h"\r
-#include "IndoorWalkPresenter.h"\r
+#include "indoorwalk/CustomizationView.h"\r
+#include "indoorwalk/IndoorWalkPresenter.h"\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
\r
* Create: 2022-03-02\r
*/\r
\r
-#include "IndoorWalkEndView.h"\r
-#include "IndoorWalkPresenter.h"\r
+#include "indoorwalk/IndoorWalkEndView.h"\r
+#include "indoorwalk/IndoorWalkPresenter.h"\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
\r
* Create: 2022-03-02\r
*/\r
\r
-#include "IndoorWalkModel.h"\r
-#include "IndoorWalkPresenter.h"\r
+#include "indoorwalk/IndoorWalkModel.h"\r
+#include "indoorwalk/IndoorWalkPresenter.h"\r
#include "ohos_timer.h"\r
#include "graphic_timer.h"\r
\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "IndoorWalkModel::IndoorWalkTimer already exists!!");\r
return;\r
}\r
- uint32 tick = GetOSTick(MS_ONE_SECONDS);\r
+ uint32_t tick = GetOSTick(MS_ONE_SECONDS);\r
g_startCounting = new GraphicTimer(tick, IndoorWalkTimerCallback, nullptr, true);\r
if (g_startCounting == nullptr) {\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "IndoorWalkModel::IndoorWalkTimer new GraphicTimer failed!!");\r
* Create: 2022-03-02\r
*/\r
\r
-#include "IndoorWalkMotionView.h"\r
-#include "IndoorWalkPresenter.h"\r
+#include "indoorwalk/IndoorWalkMotionView.h"\r
+#include "indoorwalk/IndoorWalkPresenter.h"\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
-#include "ScreenModels.h"\r
-#include "ActivityModel.h"\r
-#include "IndoorWalkModel.h"\r
+#include "screensetting/ScreenModels.h"\r
+#include "activity/ActivityModel.h"\r
+#include "indoorwalk/IndoorWalkModel.h"\r
#include <iomanip>\r
\r
namespace OHOS {\r
* Create: 2022-03-02\r
*/\r
\r
-#include "IndoorWalkPreparedView.h"\r
-#include "IndoorWalkPresenter.h"\r
-#include "ScreenModels.h"\r
+#include "indoorwalk/IndoorWalkPreparedView.h"\r
+#include "indoorwalk/IndoorWalkPresenter.h"\r
+#include "screensetting/ScreenModels.h"\r
#include "ui_resource_image.h"\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
* Create: 2022-03-02\r
*/\r
\r
-#include "IndoorWalkPresenter.h"\r
-#include "IndoorWalkView.h"\r
-#include "IndoorWalkModel.h"\r
+#include "indoorwalk/IndoorWalkPresenter.h"\r
+#include "indoorwalk/IndoorWalkView.h"\r
+#include "indoorwalk/IndoorWalkModel.h"\r
#include "drag_event.h"\r
#include "UiConfig.h"\r
#include "wearable_log.h"\r
#include <sstream>\r
-#include "ActivityModel.h"\r
+#include "activity/ActivityModel.h"\r
#include "NativeRegisterManager.h"\r
\r
namespace OHOS {\r
* Create: 2022-03-02\r
*/\r
\r
-#include "IndoorWalkView.h"\r
-#include "IndoorWalkModel.h"\r
+#include "indoorwalk/IndoorWalkView.h"\r
+#include "indoorwalk/IndoorWalkModel.h"\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
\r
* Description: Motion PageFifth View\r
* Create: 2022-03-02\r
*/\r
-#include "MotionPageFifth.h"\r
+#include "indoorwalk/MotionPageFifth.h"\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
\r
* Create: 2022-03-02\r
*/\r
\r
-#include "MotionPageFirst.h"\r
-#include "IndoorWalkPresenter.h"\r
-#include "IndoorWalkModel.h"\r
+#include "indoorwalk/MotionPageFirst.h"\r
+#include "indoorwalk/IndoorWalkPresenter.h"\r
+#include "indoorwalk/IndoorWalkModel.h"\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
\r
* Description: Motion PageFourth View\r
* Create: 2022-03-02\r
*/\r
-#include "MotionPageFourth.h"\r
-#include "IndoorWalkPresenter.h"\r
-#include "IndoorWalkModel.h"\r
+#include "indoorwalk/MotionPageFourth.h"\r
+#include "indoorwalk/IndoorWalkPresenter.h"\r
+#include "indoorwalk/IndoorWalkModel.h"\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
\r
* Description: Motion PageSecond View\r
* Create: 2022-03-02\r
*/\r
-#include "MotionPageSecond.h"\r
-#include "IndoorWalkPresenter.h"\r
-#include "IndoorWalkModel.h"\r
+#include "indoorwalk/MotionPageSecond.h"\r
+#include "indoorwalk/IndoorWalkPresenter.h"\r
+#include "indoorwalk/IndoorWalkModel.h"\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
\r
* Description: Motion PageThird View\r
* Create: 2022-03-02\r
*/\r
-#include "MotionPageThird.h"\r
-#include "IndoorWalkPresenter.h"\r
-#include "IndoorWalkModel.h"\r
+#include "indoorwalk/MotionPageThird.h"\r
+#include "indoorwalk/IndoorWalkPresenter.h"\r
+#include "indoorwalk/IndoorWalkModel.h"\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
\r
* Create: 2021-09-18
*/
-#include "KeyInputListener.h"
+#include "key/KeyInputListener.h"
#include "common/key_code.h"
#include "AppViewIDs.h"
#include "View.h"
-#include "MainViewSample.h"
+#include "main/MainViewSample.h"
#include "wearable_log.h"
#include "UiConfig.h"
#include "dock/input_device.h"
#include "notification_manager.h"
-#include "AlarmPopUpPresenter.h"
-#include "CallerLogModel.h"
-#include "MainCallingPresenter.h"
-#include "ApplistModel.h"
+#include "alarm/AlarmPopUpPresenter.h"
+#include "callerlog/CallerLogModel.h"
+#include "makephone/MainCallingPresenter.h"
+#include "applist/ApplistModel.h"
namespace OHOS {
static bool IsNotifyCallStatus()
NotificationManager::GetInstance()->GetWatchCallStatus()) { // 音量卡片
// 音量-
CallVolumeDipSwitchControl(VOLUMEDOWN);
- } else {
- // 切换到用户配置的快捷卡片
+ } else if (currentViewId != VIEW_RECENT_APP) {
+ NativeAbility::GetInstance().ChangeSlice(VIEW_RECENT_APP);
}
}
}
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-#include "HealthModel.h"
+#include "main/HealthModel.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: LoadImg\r
+ * Author:\r
+ * Create: 2025-06-05\r
+ */\r
+\r
+#include "main/LoadImg.h"\r
+\r
+namespace OHOS {\r
+namespace LOADIMG {\r
+\r
+// 加载图片资源\r
+void LoadBtnImage(UIButton *btn, std::string file, uint32_t resId1, uint32_t resId2)\r
+{\r
+ ImageInfo *image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId1, file);\r
+ if (image1 == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoadBtnImage resId1 fail");\r
+ return;\r
+ }\r
+ ImageInfo *image2 = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId2, file);\r
+ if (image2 == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoadBtnImage resId2 fail");\r
+ return;\r
+ }\r
+ btn->SetImageSrc(image1, image2);\r
+}\r
+\r
+void LoadImageViewImg(UIImageView *view, std::string file, uint32_t resId)\r
+{\r
+ ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId, file);\r
+ if (image == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoadImageViewImg %x fail", resId);\r
+ return;\r
+ }\r
+ view->SetSrc(image);\r
+ return;\r
+}\r
+}\r
+}\r
*/\r
\r
#include "unistd.h"\r
-#include "MainModel.h"\r
+#include "main/MainModel.h"\r
#include "kv_store.h"\r
#include "securec.h"\r
#include "wearable_log.h"\r
-#include "DialBinTypesV2.h"\r
+#include "main/DialBinTypesV2.h"\r
#include "power_display_service.h"\r
\r
namespace OHOS {\r
return;\r
}\r
\r
+ if (dialSetting.dialFlag == 0) {\r
+ return;\r
+ }\r
setValue = strtok_s(nullptr, ",", &setBuffer);\r
if (setValue != nullptr) {\r
dialSetting.dialFullName = setValue;\r
* Create: 2021-10-18
*/
-#include "MainPresenterSample.h"
+#include "main/MainPresenterSample.h"
#include "common/task_manager.h"
-#include "HeartRateView.h"
-#include "PlayersModel.h"
-#include "PlayersPresenter.h"
-#include "MainCompassPresenter.h"
+#include "heartrate/HeartRateView.h"
+#include "player/PlayersModel.h"
+#include "player/PlayersPresenter.h"
#include "NativeRegisterManager.h"
-#include "CompassModel.h"
-#include "CompassCalibrationView.h"
+#include "compass/CompassModel.h"
#include "drag_event.h"
#include "graphic_service.h"
#include "wearable_log.h"
#include "ui_resource_image.h"
#include <iostream>
#include <map>
-#include "ModelDialDataFactory.h"
-#include "DialModelTime.h"
-#include "DialViewGroup.h"
-#include "ui_service.h"
+#include "main/dial/ModelDialDataFactory.h"
+#include "main/dial/DialModelTime.h"
+#include "main/dial/DialViewGroup.h"
+#include "uiservice/ui_service.h"
#include "PageTransitionMgr.h"
namespace OHOS {
void MainPresenterSample::OnPause()
{
- Presenter<MainViewSample>::OnPause();
// Save watchface content for slide back
UIView* watchFace = view_->GetViewById(WATCH_FACE)->GetParent();
uint8_t opaScale = watchFace->GetOpaScale();
void MainPresenterSample::OnResume(void)
{
- Presenter::OnResume();
mainPresenterState_ = MainPresenterState::RESUME;
// Set current page again to invoke OnActive method.
uint8_t curCardId = view_->GetHorCurrentCard();
}
}
-void MainPresenterSample::SetCompassRotate()
-{
- bool status = CompassModel::GetInstance()->GetCalibrationStatus();
- dynamic_cast<CompassControlView*>(view_->GetViewById(COMPASS))->SetCalibrationView(status);
- if (!status) {
- DetermineToRotate();
- }
-}
-
void MainPresenterSample::Notify(void)
{
CardId cardId = view_->GetHorCurrentCard();
- if (cardId == COMPASS) {
- SetCompassRotate();
- } else if (cardId == MUSIC_PLAYER) {
+ if (cardId == MUSIC_PLAYER) {
SetCircleProgress();
} else if (cardId == WATCH_FACE) {
DialSetting &setting = GetDialSetting();
* Create: 2021-10-18
*/
#include "wearable_log.h"
-#include "MainViewSample.h"
+#include "main/MainViewSample.h"
#include "graphic_service.h"
#include "common/image_cache_manager.h"
+#include "UICardPageFactory.h"
namespace OHOS {
static MainViewSample *g_pMainView = nullptr;
UICardPage *MainViewSample::InitWatchDial(DialSetting &setting)
{
- switch (setting.dialId) {
- case DIAL_CLOCK:
- return new MainClockView();
- default:
- return nullptr;
- }
+ return UICardPageFactory::GetInstance().CreateWatchDial(DIAL_DISPLAY_MODE_MAIN, setting.dialId);
}
UICardPage *MainViewSample::InitWatchFacePage(void)
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ */\r
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: MessageAdapter.cpp\r
+ * Author:\r
+ * Create: 2021-11-23\r
+ */\r
+\r
+#include "main/MessageAdapter.h"\r
+\r
+namespace OHOS {\r
+MessageAdapter::MessageAdapter() {}\r
+\r
+MessageAdapter::~MessageAdapter()\r
+{\r
+ listData.clear();\r
+}\r
+\r
+uint16_t MessageAdapter::GetCount(void)\r
+{\r
+ return listData.size();\r
+}\r
+\r
+void MessageAdapter::SetData(std::list<MessageItem> &data)\r
+{\r
+ if (!listData.empty()) {\r
+ listData.clear();\r
+ }\r
+ std::list<MessageItem>::iterator it;\r
+ for (it = data.begin(); it != data.end(); it++) {\r
+ listData.push_back(*it);\r
+ }\r
+}\r
+\r
+UIView *MessageAdapter::GetView(UIView *inView, int16_t index)\r
+{\r
+ if (listData.empty()) {\r
+ return nullptr;\r
+ }\r
+ if (index < 0) {\r
+ return nullptr;\r
+ }\r
+ size_t uindex = index;\r
+ if (uindex >= listData.size()) {\r
+ return nullptr;\r
+ }\r
+\r
+ std::list<MessageItem>::iterator it = listData.begin();\r
+ for (int i = 0; i < index; i++) {\r
+ it++;\r
+ }\r
+ MessageItem itemData = *it;\r
+ MessageItemView *item = nullptr;\r
+ if (inView == nullptr) {\r
+ item = new MessageItemView();\r
+ } else {\r
+ item = static_cast<MessageItemView *>(inView);\r
+ }\r
+\r
+ item->SetItemInfo(itemData);\r
+ item->SetOnClickListener(itemClickListener);\r
+ return item;\r
+}\r
+\r
+void MessageAdapter::AddListItem(const MessageItem &item)\r
+{\r
+ listData.push_back(item);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "listData == %d-------zsy", listData.size());\r
+ for (const auto& item : listData) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageItem.App == %s-------zsy", item.label_1.c_str());\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageItem.Content == %s-------zsy", item.label_2.c_str());\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageItem.Info == %s-------zsy", item.label_3.c_str());\r
+ }\r
+}\r
+\r
+void MessageAdapter::ClearListItem()\r
+{\r
+ listData.clear();\r
+}\r
+} // namespace OHOS\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ */\r
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: MessageItemView.cpp\r
+ * Author:\r
+ * Create: 2021-11-23\r
+ */\r
+\r
+#include "wearable_log.h"\r
+#include "main/MessageItemView.h"\r
+\r
+namespace OHOS {\r
+ static constexpr int16 SETTING_ICON_X = 20;\r
+ static constexpr int16 NUM_22 = 22;\r
+ static constexpr int16_t SETTING_ITEM_BUTTON_HEIGHT = 80;\r
+ static constexpr int16_t SETTING_ITEM_LABEL_WIDTH = 155;\r
+ static constexpr int16_t SETTING_ITEM_LABEL_HEIGHT = 100;\r
+ static constexpr int16 SETTING_ITEM_FONT_SIZE = 35;\r
+ static constexpr int16_t SETTINGS_RESIZE_SIZE = 100;\r
+ static constexpr int16_t SETTING_SICON_Y = 15;\r
+ static constexpr int16 NUMS_2 = 2;\r
+ static constexpr int16 NUMS_50 = 50;\r
+\r
+ MessageItemView::MessageItemView()\r
+ {\r
+ SetPosition(0, 0, HORIZONTAL_RESOLUTION, 200);\r
+ SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ SetTouchable(true);\r
+ SetUpChild();\r
+\r
+ Add(&sback);\r
+ Add(&sLabel_1);\r
+ Add(&sIcon);\r
+ Add(&sLabel_2);\r
+ Add(&sLabel_3);\r
+ }\r
+\r
+ MessageItemView::~MessageItemView()\r
+ {\r
+ Remove(&sIcon);\r
+ Remove(&sLabel_1);\r
+ Remove(&sLabel_2);\r
+ Remove(&sLabel_3);\r
+ Remove(&sback);\r
+ }\r
+\r
+ void MessageItemView::SetItemInfo(const MessageItem itemInfo)\r
+ {\r
+ sItemInfo = itemInfo;\r
+ sLabel_1.SetText(itemInfo.label_1.c_str());\r
+ sIcon.SetSrc(itemInfo.icon.c_str());\r
+ sLabel_2.SetText(itemInfo.label_2.c_str());\r
+ sLabel_3.SetText(itemInfo.label_3.c_str());\r
+ }\r
+\r
+ void MessageItemView::SetUpChild()\r
+ {\r
+ sLabel_1.SetPosition(50, 10);\r
+ sLabel_1.Resize(SETTING_ITEM_LABEL_WIDTH, 50);\r
+ sLabel_1.SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_ITEM_FONT_SIZE);\r
+ sLabel_1.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ sLabel_1.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ sLabel_1.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ sLabel_1.SetStyle(STYLE_BACKGROUND_COLOR, Color::Blue().full);\r
+ sLabel_1.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+\r
+ sIcon.SetPosition(15, SETTING_SICON_Y);\r
+ sIcon.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
+\r
+ sLabel_2.SetPosition(15, 78);\r
+ sLabel_2.Resize(100, 50);\r
+ sLabel_2.SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_ITEM_FONT_SIZE);\r
+ sLabel_2.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ sLabel_2.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ sLabel_2.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ sLabel_2.SetStyle(STYLE_BACKGROUND_COLOR, Color::Orange().full);\r
+ sLabel_2.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+\r
+ sLabel_3.SetPosition(150, 78, 100, 50);\r
+ sLabel_3.SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_ITEM_FONT_SIZE);\r
+ sLabel_3.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ sLabel_3.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ sLabel_3.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ sLabel_3.SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+ sLabel_3.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+\r
+ sback.SetPosition(0, 0, 450, 180);\r
+ sback.SetStyle(STYLE_BACKGROUND_COLOR, Color::Green().full);\r
+ sback.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+\r
+ }\r
+\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: WeekStep\r
+ * Author:\r
+ * Create: 2021-09-11\r
+ */\r
+\r
+#include "main/MessageMainView.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "common/screen.h"\r
+#include "main/MainPresenterSample.h"\r
+#include "screensetting/ScreenModels.h"\r
+#include "settings/SettingModel.h"\r
+#include "ui_resource_image.h"\r
+\r
+namespace OHOS {\r
+\r
+static MessageMainView *g_pMessageMainView = nullptr;\r
+\r
+constexpr int16_t DISTURB_IMG_X = 117;\r
+constexpr int16_t DISTURB_IMG_Y = 50;\r
+constexpr int16_t SCREEN_IMG_X = 251;\r
+constexpr int16_t SCREEN_IMG_Y = 50;\r
+constexpr int16_t PHONE_IMG_X = 49;\r
+constexpr int16_t PHONE_IMG_Y = 184;\r
+constexpr int16_t ALARM_IMG_X = 184;\r
+constexpr int16_t ALARM_IMG_Y = 184;\r
+constexpr int16_t SETTING_IMG_X = 319;\r
+constexpr int16_t SETTING_IMG_Y = 184;\r
+\r
+constexpr int16_t BLUETOOTH_IMG_X = 145;\r
+constexpr int16_t BLUETOOTH_IMG_Y = 335;\r
+constexpr int16_t BATTERY_IMG_X = 195;\r
+constexpr int16_t BATTERY_IMG_Y = 340;\r
+\r
+constexpr int16_t DISTURB_LABEL_X = 136;\r
+constexpr int16_t DISTURB_LABEL_Y = 145;\r
+constexpr int16_t SCREEN_LABEL_X = 270;\r
+constexpr int16_t SCREEN_LABEL_Y = 145;\r
+constexpr int16_t PHONE_LABEL_X = 68;\r
+constexpr int16_t PHONE_LABEL_Y = 279;\r
+constexpr int16_t ALARM_LABEL_X = 203;\r
+constexpr int16_t ALARM_LABEL_Y = 279;\r
+constexpr int16_t SETTING_LABEL_X = 338;\r
+constexpr int16_t SETTING_LABEL_Y = 279;\r
+\r
+constexpr int16_t BATTERY_LABEL_X = 247;\r
+constexpr int16_t BATTERY_LABEL_Y = 335;\r
+constexpr int16_t DATE_LABEL_X = 173;\r
+constexpr int16_t DATE_LABEL_Y = 374;\r
+\r
+constexpr int16_t FONT_DEFAULT_SIZE = 24;\r
+constexpr int16_t TEXT_WIDTH = 86;\r
+constexpr int16_t TEXT_HEIGHT = 30;\r
+\r
+constexpr int16_t NONOTICE_LABLE_X = 141;\r
+constexpr int16_t NONOTICE_LABLE_Y = 212;\r
+\r
+MessageMainView::MessageMainView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageMainView::MessageMainView");\r
+ g_pMessageMainView = this;\r
+}\r
+\r
+MessageMainView::~MessageMainView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageMainView::~MessageMainView");\r
+ RemoveAll();\r
+ delete messageLables;\r
+ messageLables = nullptr;\r
+ delete messageLable;\r
+ messageLable = nullptr;\r
+ delete deletereminder;\r
+ deletereminder = nullptr;\r
+ delete confirm;\r
+ confirm = nullptr;\r
+ delete cancel;\r
+ cancel = nullptr;\r
+ delete notice;\r
+ notice = nullptr;\r
+ delete contentList;\r
+ contentList = nullptr;\r
+ if (listAdapter != nullptr) {\r
+ delete listAdapter;\r
+ listAdapter = nullptr;\r
+ }\r
+ g_pMessageMainView = nullptr;\r
+ MessageModel::GetInstance().SetViewStatus(false);\r
+}\r
+\r
+MessageMainView *MessageMainView::GetInstance(void)\r
+{\r
+ return g_pMessageMainView;\r
+}\r
+\r
+bool MessageMainView::InitView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageMainView::InitView");\r
+ messageLable = new UILabel();\r
+ if (messageLable == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageLable new fail");\r
+ return false;\r
+ }\r
+ messageLable->SetPosition(175, 20, 100, 30);\r
+ messageLable->SetText("通知");\r
+ messageLable->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ messageLable->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 24);\r
+ messageLable->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+ messageLable->SetViewId("Notify");\r
+ messageLable->SetTouchable(true);\r
+ notifyListener = (UIView::OnClickListener *)OHOS::MainPresenterSample::GetInstance();\r
+ messageLable->SetOnClickListener(notifyListener);\r
+ // 删除图标\r
+ notice = new UIImageView();\r
+ if (notice == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TimerTimingView:: new startButton fail");\r
+ return false;\r
+ }\r
+ notice->SetPosition(175, 330);\r
+ notice->Resize(100, 100);\r
+ notice->SetSrc(ALARM_TRUE_ADD_PATH);\r
+ notice->SetViewId("Delete");\r
+ notice->SetTouchable(true);\r
+ clickListener = (UIView::OnClickListener *)OHOS::MainPresenterSample::GetInstance();\r
+ notice->SetOnClickListener(clickListener);\r
+ ShowMessageList();\r
+ InitScrollData();\r
+ Add(messageLable);\r
+ Add(notice);\r
+ return true;\r
+}\r
+\r
+void MessageMainView::PreLoad(void)\r
+{\r
+ if (! MessageModel::GetInstance().GetViewStatus()) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageMainView::PreLoad,viewiInitStatus == false");\r
+ InitView();\r
+ DeletionView();\r
+ NoNotify();\r
+ const std::vector<MessageItem> itemInfo = MessageModel::GetInstance().GetMessagelistItems();\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageMainView::PreLoad,itemInfo == %d", itemInfo.size());\r
+ if (itemInfo.size() == 0) {\r
+ messageLable->SetVisible(false);\r
+ notice->SetVisible(false);\r
+ contentList->SetVisible(false);\r
+ deletereminder->SetVisible(false);\r
+ confirm->SetVisible(false);\r
+ cancel->SetVisible(false);\r
+ messageLables->SetVisible(true);\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageMainView::PreLoad,itemInfo.size() == 0");\r
+ } else {\r
+ messageLable->SetVisible(true);\r
+ notice->SetVisible(true);\r
+ contentList->SetVisible(true);\r
+ deletereminder->SetVisible(false);\r
+ confirm->SetVisible(false);\r
+ cancel->SetVisible(false);\r
+ messageLables->SetVisible(false);\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageMainView::PreLoad,itemInfo.size() != 0");\r
+ }\r
+ MessageModel::GetInstance().SetViewStatus(true);\r
+ }\r
+}\r
+\r
+void MessageMainView::ShowMessageList(void)\r
+{\r
+ contentList = new UIList();\r
+ if (contentList == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageMainView::ShowMessageList contentList is nullptr");\r
+ return;\r
+ }\r
+ contentList->SetPosition(32, 70);\r
+ contentList->Resize(HORIZONTAL_RESOLUTION, 318); // 364: height\r
+ contentList->SetSelectPosition(120); // middle position\r
+ contentList->SetDraggable(true);\r
+ contentList->SetThrowDrag(true);\r
+ contentList->EnableAutoAlign(true);\r
+ contentList->SetElastic(true);\r
+ Add(contentList);\r
+}\r
+\r
+void MessageMainView::ConfirmDeletion(void)\r
+{\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageMainView::ConfirmDeletion");\r
+ if (notice->IsVisible()) {\r
+ notice->SetVisible(false);\r
+ }\r
+ if (messageLable->IsVisible()) {\r
+ messageLable->SetVisible(false);\r
+ }\r
+ if (contentList->IsVisible()) {\r
+ contentList->SetVisible(false);\r
+ }\r
+ if (! deletereminder->IsVisible()) {\r
+ deletereminder->SetVisible(true);\r
+ }\r
+ if (! confirm->IsVisible()) {\r
+ confirm->SetVisible(true);\r
+ }\r
+ if (! cancel->IsVisible()) {\r
+ cancel->SetVisible(true);\r
+ }\r
+}\r
+\r
+void MessageMainView::NewNotify(void)\r
+{\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageMainView::NewNotify");\r
+ if (messageLables->IsVisible()) {\r
+ messageLables->SetVisible(false);\r
+ }\r
+ if (! notice->IsVisible()) {\r
+ notice->SetVisible(true);\r
+ }\r
+ if (! messageLable->IsVisible()) {\r
+ messageLable->SetVisible(true);\r
+ }\r
+ if (! contentList->IsVisible()) {\r
+ contentList->SetVisible(true);\r
+ }\r
+}\r
+\r
+void MessageMainView::DeletionView(void)\r
+{\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageMainView::DeletionView");\r
+ // 标题\r
+ deletereminder = new UILabel();\r
+ if (deletereminder == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "deletereminder new fail");\r
+ return;\r
+ }\r
+ deletereminder->SetPosition(177, 145); // widget's left position and top position\r
+ deletereminder->Resize(260, 204); // widget's width and height\r
+ deletereminder->SetViewId("deletereminder");// Set style\r
+\r
+ // Set additional property\r
+ deletereminder->SetText("是否删除通知?");\r
+ deletereminder->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ deletereminder->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ deletereminder->SetRollSpeed(0);\r
+\r
+ // 确认按钮\r
+ confirm = new UILabelButton();\r
+ if (confirm == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "confirm new fail");\r
+ return;\r
+ }\r
+ confirm->SetPosition(88, 255); // widget's left position and top position\r
+ confirm->Resize(70, 50); // widget's width and height\r
+ confirm->SetViewId("Confirm");// Set style\r
+\r
+ // Set additional property\r
+ confirm->SetText("确认");\r
+ confirm->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 16);\r
+ confirm->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);\r
+ confirmListener = (UIView::OnClickListener *)OHOS::MainPresenterSample::GetInstance();\r
+ confirm->SetOnClickListener(confirmListener);\r
+\r
+ // 取消按钮\r
+ cancel = new UILabelButton();\r
+ if (cancel == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cancel new fail");\r
+ return;\r
+ // cancel = new UILabelButton();\r
+ }\r
+ cancel->SetPosition(301, 251); // widget's left position and top position\r
+ cancel->Resize(70, 50); // widget's width and height\r
+ cancel->SetViewId("Cancel");// Set style\r
+\r
+ // Set additional property\r
+ cancel->SetText("取消");\r
+ cancel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 16);\r
+ cancel->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);\r
+ cancelListener = (UIView::OnClickListener *)OHOS::MainPresenterSample::GetInstance();\r
+ cancel->SetOnClickListener(cancelListener);\r
+ Add(deletereminder);\r
+ Add(confirm);\r
+ Add(cancel);\r
+}\r
+\r
+void MessageMainView::VerticalViewInits(void)\r
+{\r
+ if (deletereminder->IsVisible()) {\r
+ deletereminder->SetVisible(false);\r
+ }\r
+ if (confirm->IsVisible()) {\r
+ confirm->SetVisible(false);\r
+ }\r
+ if (cancel->IsVisible()) {\r
+ cancel->SetVisible(false);\r
+ }\r
+ if (! messageLables->IsVisible()) {\r
+ messageLables->SetVisible(true);\r
+ }\r
+}\r
+\r
+void MessageMainView::NoNotify(void)\r
+{\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageMainView::NoNotify");\r
+ messageLables = new UILabel();\r
+ if (messageLables == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageLable new fail");\r
+ return;\r
+ }\r
+ messageLables->SetPosition(177, 212, 100, 30);\r
+ messageLables->SetText("无消息");\r
+ messageLables->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ messageLables->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 24);\r
+ messageLables->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+ messageLables->SetViewId("NoNotify");\r
+ messageLables->SetTouchable(true);\r
+ newNotifyListener = (UIView::OnClickListener *)OHOS::MainPresenterSample::GetInstance();\r
+ messageLables->SetOnClickListener(newNotifyListener);\r
+ Add(messageLables);\r
+}\r
+\r
+void MessageMainView::CancelDeletion(void)\r
+{\r
+ if (deletereminder->IsVisible()) {\r
+ deletereminder->SetVisible(false);\r
+ }\r
+ if (confirm->IsVisible()) {\r
+ confirm->SetVisible(false);\r
+ }\r
+ if (cancel->IsVisible()) {\r
+ cancel->SetVisible(false);\r
+ }\r
+ if (! messageLable->IsVisible()) {\r
+ messageLable->SetVisible(true);\r
+ }\r
+ if (! notice->IsVisible()) {\r
+ notice->SetVisible(true);\r
+ }\r
+ if (! contentList->IsVisible()) {\r
+ contentList->SetVisible(true);\r
+ }\r
+}\r
+\r
+void MessageMainView::RefreshMessageList(std::vector<MessageItem> item)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageMainView::RefreshMessageList");\r
+ if (listAdapter == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageMainView::RefreshMessageList listAdapter is nullptr");\r
+ listAdapter = new MessageAdapter();\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageMainView::RefreshMessageList");\r
+ if (item.size() == 0) {\r
+ return;\r
+ } else {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageMainView::RefreshMessageList %d", item.size());\r
+ listAdapter->ClearListItem();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "listAdapter->ClearListItem");\r
+ for (size_t i = 0; i < item.size(); ++i) {\r
+ listAdapter->AddListItem(item[i]);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "listAdapter->AddListItem");\r
+ }\r
+ }\r
+ if (contentList == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageMainView::contentList fail");\r
+ return;\r
+ }\r
+ contentList->ScrollTo(0);\r
+ contentList->SetAdapter(listAdapter);\r
+ contentList->RefreshList();\r
+}\r
+\r
+bool MessageMainView::InitScrollData()\r
+{\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageMainView::InitScrollData");\r
+ const std::vector<MessageItem> itemInfo = MessageModel::GetInstance().GetMessagelistItems();\r
+ RefreshMessageList(itemInfo);\r
+ return true;\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: MainModel.cpp\r
+ * Author:\r
+ * Create: 2021-11-23\r
+ */\r
+\r
+#include "unistd.h"\r
+#include "main/MessageModel.h"\r
+#include "main/MessageMainView.h"\r
+#include "kv_store.h"\r
+#include "securec.h"\r
+#include "wearable_log.h"\r
+#include "main/DialBinTypesV2.h"\r
+#include "power_display_service.h"\r
+#include <hal_tick.h>\r
+#include <cstdint>\r
+#include <random>\r
+namespace OHOS {\r
+ MessageModel::MessageModel() {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::MessageModel");\r
+ }\r
+\r
+ MessageModel::~MessageModel() {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::~MessageModel");\r
+ }\r
+\r
+ MessageModel &MessageModel::GetInstance()\r
+ {\r
+ static MessageModel instance;\r
+ return instance;\r
+ }\r
+\r
+ void MessageModel::GetMessageInfo(std::string app, std::string contact, std::string information)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::GetMessageInfo");\r
+ //保存数据\r
+ mes.label_1 = app; // 应用\r
+ mes.label_2 = contact; // 联系人\r
+ mes.label_3 = information; // 内容\r
+ mes.icon = "默认";\r
+ // if (app == 微信) {\r
+ // mes1.icon = 微信图标;\r
+ // }\r
+ // if (app == 信息) {\r
+ // mes1.icon = 信息图标;\r
+ // }\r
+ InitMessageItem();\r
+ if (GetViewStatus()) {\r
+ if (! MessageMainView::GetInstance()->contentList->IsVisible()) {\r
+ MessageMainView::GetInstance()->NewNotify();\r
+ }\r
+ MessageMainView::GetInstance()->InitScrollData();\r
+ }\r
+ }\r
+\r
+ void MessageModel::InitMessageItem()\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem");\r
+ if (vecMsg.size() != 0) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,vecMsg.size() != 0");\r
+ size_t i = 0;\r
+ for (i; i < vecMsg.size(); ++i) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,for()");\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,vecMsg[i].label_1 = %s", vecMsg[i].label_1.c_str());\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,vecMsg[i].label_2 = %s", vecMsg[i].label_2.c_str());\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,vecMsg[i].label_3 = %s", vecMsg[i].label_3.c_str());\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,mes.label_1 = %s", mes.label_1.c_str());\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,mes.label_2 = %s", mes.label_2.c_str());\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,mes.label_3 = %s", mes.label_3.c_str());\r
+ if (vecMsg[i].label_1 == mes.label_1 && vecMsg[i].label_2 == mes.label_2) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,if()");\r
+ vecMsg[i].label_3 = mes.label_3;\r
+ break;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,else(break)");\r
+ continue;\r
+ }\r
+ if (i == vecMsg.size()) {\r
+ vecMsg.push_back(mes);\r
+ }\r
+ } else {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageModel::InitMessageItem,else()");\r
+ vecMsg.push_back(mes);\r
+ }\r
+ }\r
+\r
+ const std::vector<MessageItem> MessageModel::GetMessagelistItems() const\r
+ { \r
+ return vecMsg;\r
+ }\r
+\r
+ void MessageModel::ClearListItem()\r
+ {\r
+ vecMsg.clear();\r
+ }\r
+\r
+ void MessageModel::SetViewStatus(bool viewStatus)\r
+ {\r
+ viewInitStatus = viewStatus;\r
+ }\r
+\r
+ bool MessageModel::GetViewStatus(void)\r
+ {\r
+ return viewInitStatus;\r
+ }\r
+}\r
* limitations under the License.
*/
-#include "ModelListenerSample.h"
+#include "main/ModelListenerSample.h"
#include "wearable_log.h"
namespace OHOS {
* Create: 2021-09-11
*/
-#include "PullUpDownView.h"
+#include "main/PullUpDownView.h"
#include "wearable_log.h"
#include "UiConfig.h"
#include "common/screen.h"
-#include "MainPresenterSample.h"
-#include "ScreenModels.h"
-#include "SettingModel.h"
+#include "main/MainPresenterSample.h"
+#include "screensetting/ScreenModels.h"
+#include "settings/SettingModel.h"
#include "ui_resource_image.h"
namespace OHOS {
* Description: VolumeSettingView view\r
* Create: 2021-09-5\r
*/\r
-#include "VolumeSettingView.h"\r
-#include "VolumeSettingPresenter.h"\r
-#include "PlayersModel.h"\r
+#include "main/VolumeSettingView.h"\r
+#include "main/VolumeSettingPresenter.h"\r
+#include "player/PlayersModel.h"\r
#include "common/image_cache_manager.h"\r
#include "UiConfig.h"\r
#include "ui_resource_image.h"\r
#include "drag_event.h"\r
-#include "MainCallingView.h"\r
-#include "PhoneService.h"\r
-#include "CallerLogModel.h"\r
+#include "makephone/MainCallingView.h"\r
+#include "phoneservice/PhoneService.h"\r
+#include "callerlog/CallerLogModel.h"\r
#include "bts_avrcp_controller.h"\r
#include "bts_avrcp_target.h"\r
#include "notification_manager.h"\r
-#include "BluetoothHeadsetEvent.h"\r
+#include "bluetooth/BluetoothHeadsetEvent.h"\r
#include "bts_avrcp_controller.h"\r
\r
namespace OHOS {\r
* Description: VolumeSettingView view\r
* Create: 2021-09-5\r
*/\r
-#include "VolumeSettingView.h"\r
-#include "PlayersView.h"\r
+#include "main/VolumeSettingView.h"\r
+#include "player/PlayersView.h"\r
#include "common/image_cache_manager.h"\r
#include "UiConfig.h"\r
#include "ui_resource_image.h"\r
* Copyright (c) @CompanyNameMagicTag. 2023. All rights reserved.
*/
-#include "DialArcLabelView.h"
+#include "main/dial/DialArcLabelView.h"
#include "securec.h"
namespace OHOS {
* Copyright (c) @CompanyNameMagicTag. 2023. All rights reserved.
*/
-#include "DialArcProgressView.h"
+#include "main/dial/DialArcProgressView.h"
namespace OHOS {
DialArcProgressView::DialArcProgressView(void)
value_ = value;
SetValue(value_);
}
+
+void DialArcProgressView::OnDraw(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea)
+{
+ if (foregroundStopCount_ != 0) {
+ Rect rect = GetOrigRect();
+ foregroundGradient_.startX = rect.GetX();
+ foregroundGradient_.startY = rect.GetY();
+ foregroundGradient_.endX = rect.GetRight();
+ foregroundGradient_.endY = rect.GetBottom();
+ }
+ UICircleProgress::OnDraw(gfxDstBuffer, invalidatedArea);
+}
}
\ No newline at end of file
* Copyright (c) @CompanyNameMagicTag. 2023. All rights reserved.
*/
-#include "DialBoxProgressView.h"
+#include "main/dial/DialBoxProgressView.h"
namespace OHOS {
DialBoxProgressView::DialBoxProgressView(void)
value_ = value;
SetValue(value_);
}
+
+void DialBoxProgressView::OnDraw(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea)
+{
+ if (foregroundStopCount_ != 0) {
+ Rect rect = GetOrigRect();
+ foregroundGradient_.startX = rect.GetX();
+ foregroundGradient_.startY = rect.GetY();
+ foregroundGradient_.endX = rect.GetRight();
+ foregroundGradient_.endY = rect.GetBottom();
+ }
+ UIBoxProgress::OnDraw(gfxDstBuffer, invalidatedArea);
+}
}
\ No newline at end of file
*/
#include <unordered_map>
-#include "dial/DialDataBase.h"
+#include "main/dial/DialDataBase.h"
namespace {
struct DataTypeHash {
* Copyright (c) @CompanyNameMagicTag. 2023. All rights reserved.
*/
-#include "DialDigitalImgView.h"
+#include "main/dial/DialDigitalImgView.h"
#include <cmath>
#include "securec.h"
* Copyright (c) @CompanyNameMagicTag. 2023. All rights reserved.
*/
-#include "DialLabelView.h"
+#include "main/dial/DialLabelView.h"
#include "securec.h"
namespace OHOS {
* Create: 2023-12
*/
-#include "RegisterDialModel.h"
-#include "DialModelHeartRate.h"
+#include "main/dial/RegisterDialModel.h"
+#include "main/dial/DialModelHeartRate.h"
REGIST_DIAL_MODULE(OHOS::DialDataType::HEART_RATE, OHOS::DialModelHeartRate::GetInstance());
* Create: 2023-12
*/
-#include "RegisterDialModel.h"
-#include "DialModelPower.h"
+#include "main/dial/RegisterDialModel.h"
+#include "main/dial/DialModelPower.h"
REGIST_DIAL_MODULE(OHOS::DialDataType::BATTERY, OHOS::DialModelPower::GetInstance());
namespace OHOS {
+static RegisterDialModel REGIST_BATTERY_LEVEL(DialDataType::BATTERY_LEVEL, DialModelPower::GetInstance());
+static RegisterDialModel REGIST_BATTERY_ENUM(DialDataType::BATTERY_ENUM, DialModelPower::GetInstance());
bool DialModelPower::GetDialFloatData(DialDataType& type, float& out)
{
- (void)type;
- out = power_;
+ switch (type) {
+ case DialDataType::BATTERY: {
+ out = power_;
+ break;
+ }
+ case DialDataType::BATTERY_LEVEL: {
+ out = static_cast<float>(power_) / 100.0; // 100.0: full power
+ break;
+ }
+ case DialDataType::BATTERY_ENUM: {
+ out = static_cast<float>(power_ / 10); // 10: num
+ break;
+ }
+ default:
+ (void)type;
+ }
return true;
}
}
* Create: 2023-12
*/
-#include "RegisterDialModel.h"
-#include "DialModelSteps.h"
+#include "main/dial/RegisterDialModel.h"
+#include "main/dial/DialModelSteps.h"
REGIST_DIAL_MODULE(OHOS::DialDataType::STEP_COUNT, OHOS::DialModelSteps::GetInstance());
#include <cmath>
#include "sys/time.h"
-#include "RegisterDialModel.h"
-#include "DialModelTime.h"
+#include "main/dial/RegisterDialModel.h"
+#include "main/dial/DialModelTime.h"
#include "components/root_view.h"
#define REGIST_DIAL_MODULE_ANGLE_H(type, func) static OHOS::RegisterDialModel(REGIST_ANGLE_H)(type, func)
REGIST_DIAL_MODULE_GEAR_POSITIVE(OHOS::DialDataType::SWIVEL_GEAR_POSITIVE, OHOS::DialModelTime::GetInstance());
REGIST_DIAL_MODULE_GEAR_NEGATIVE(OHOS::DialDataType::SWIVEL_GEAR_NEGATIVE, OHOS::DialModelTime::GetInstance());
+static OHOS::RegisterDialModel REGIST_MOUNTH_80(OHOS::DialDataType::MONTH_DATA, OHOS::DialModelTime::GetInstance());
+
namespace OHOS {
static constexpr int16_t S_MS_US_TRANS = 1000; // 1000: seconds, milliseconds, microsecond transform value
static constexpr uint8_t ONE_MINUTE_IN_SECOND = 60; // 60: 60 seconds per minute
out = static_cast<float>(accleratedAngle * -1.0 + CIRCLE_IN_DEGREE);
break;
}
+ case DialDataType::MONTH_DATA: {
+ out = static_cast<float>(tblock_->tm_mon) + 1.0;
+ break;
+ }
default:
return false;
}
* Copyright (c) @CompanyNameMagicTag. 2023. All rights reserved.
*/
-#include "DialOptionImgView.h"
+#include "main/dial/DialOptionImgView.h"
#include "securec.h"
namespace OHOS {
* Copyright (c) @CompanyNameMagicTag. 2023. All rights reserved.
*/
-#include "DialRotateImgView.h"
+#include "main/dial/DialRotateImgView.h"
namespace OHOS {
DialRotateImgView::DialRotateImgView(void)
* Copyright (c) @CompanyNameMagicTag. 2023. All rights reserved.
*/
-#include "DialSequenceImgView.h"
+#include "main/dial/DialSequenceImgView.h"
#include "securec.h"
#include "common/graphic_utils.h"
#include "common/image_cache_manager.h"
* Copyright (c) @CompanyNameMagicTag. 2023. All rights reserved.
*/
-#include "DialStaticImgView.h"
+#include "main/dial/DialStaticImgView.h"
namespace OHOS {
DialStaticImgView::DialStaticImgView()
* Copyright (c) @CompanyNameMagicTag. 2023. All rights reserved.
*/
-#include "DialVideoView.h"
+#include "main/dial/DialVideoView.h"
namespace OHOS {
static constexpr int16_t JPEG_HEIGHT_DIVISOR = 2;
* Create: 2025-02-06
*/
-#include "DialViewContainer.h"
-#include "DialDigitalImgView.h"
-#include "ModelDialDataFactory.h"
+#include "main/dial/DialViewContainer.h"
+#include "main/dial/DialDigitalImgView.h"
+#include "main/dial/ModelDialDataFactory.h"
namespace OHOS {
DialViewContainer::~DialViewContainer()
-#include "DialViewGroup.h"
+#include "main/dial/DialViewGroup.h"
#include <cstdio>
#include <iostream>
#include "NativeAbility.h"
#include "msg_center.h"
#include "securec.h"
-#include "DialBinParser.h"
-#include "ModelDialDataFactory.h"
+#include "main/DialBinParser.h"
+#include "main/dial/ModelDialDataFactory.h"
#include "common/low_power_manager.h"
#include "common/image_cache_manager.h"
#ifdef SUPPORT_OHOSFWK
-#include "ui_screennotify.h"
+#include "screennotify/ui_screennotify.h"
#endif
-#include "MainPresenterSample.h"
-#include "DialDigitalImgView.h"
+#include "main/MainPresenterSample.h"
+#include "main/dial/DialDigitalImgView.h"
#include "common/input_device_manager.h"
-#include "DialSequenceImgView.h"
+#include "main/dial/DialSequenceImgView.h"
#include "engines/gfx/lite_m_gfx_engine.h"
namespace OHOS {
* Create: 2023-12
*/
-#include "ModelDialDataFactory.h"
+#include "main/dial/ModelDialDataFactory.h"
namespace OHOS {
bool ModelDialDataFactory::GetDialTextData(DialDataType& type, std::string*& out, int16_t& strNum)
{
*/
#include <string>
+#include <unistd.h>
#include "dirent.h"
-#include "DialBinParser.h"
+#include "main/DialBinParser.h"
#include "UiConfig.h"
-#include "WatchInterface.h"
+#include "main/dial/WatchInterface.h"
#include "gfx_utils/vector.h"
#include "common/screen.h"
-#include "MainModel.h"
-#include "MainViewSample.h"
-#include "SetDialModel.h"
+#include "main/MainModel.h"
+#include "main/MainViewSample.h"
+#include "set_dial/SetDialModel.h"
#include "graphic_service.h"
#include "NativeAbility.h"
+#include "graphic_mutex.h"
+#include "set_dial/SetDialModel.h"
+#include "set_dial/SetDialPresenter.h"
+#include "power_display_service.h"
using namespace OHOS;
namespace {
-struct {
- Graphic::Vector<std::string> fileNames; // only for 3.0
- Graphic::Vector<watch_dial_info> watchInfo; // only for 3.0
-} g_info;
+struct WatchInfoInner {
+ std::string fileName;
+ watch_dial_info watchInfo;
+};
+
+Graphic::Vector<WatchInfoInner> g_info;
+GraphicMutex g_mutex;
+GraphicCond g_cond;
+bool g_eventFinished = true;
+const uint16_t INVALID_INFO_INDEX = 0xFFFF;
bool GetActiveWatchPath(std::string &path)
{
return false;
}
-bool GetPreviewInfo(const std::string &fileName, DialPreviewInfo &preview)
+bool GetPreviewInfo(const std::string &fileName, DialPreviewInfo &preview, bool isNeedVerify = false)
{
const std::string type(".bin");
if (!(fileName.length() > type.length() &&
FILE *file = fopen(fileName.c_str(), "rb");
bool isSuccess = false;
if (file != nullptr) {
- isSuccess = DialBinParserManager::GetInstance()->GetDialPreviewInfo(file, &preview);
+ isSuccess = DialBinParserManager::GetInstance()->GetDialPreviewInfo(fileName, file, &preview, isNeedVerify);
fclose(file);
}
return isSuccess;
return true;
}
-bool GetAllWatchInfo()
+void RefreshAllWatchInfo()
{
- g_info.fileNames.Clear();
- g_info.watchInfo.Clear();
+ g_info.Clear();
struct dirent *direntp = nullptr;
- // ´ò¿ªÄ¿Â¼
+ // 打开目录
DIR *dirp = opendir(APP_DIAL_PATH);
- bool isSuccess = true;
- // ±éÀúÎļþ
+ // 遍历文件
DialPreviewInfo info;
watch_dial_info watchInfo;
std::string activePath;
if (dirp != nullptr) {
while ((direntp = readdir(dirp)) != nullptr) {
std::string fileName = std::string(APP_DIAL_PATH) + std::string("/") + std::string(direntp->d_name);
- isSuccess = GetPreviewInfo(fileName, info);
- if (!isSuccess) {
+ if (!GetPreviewInfo(fileName, info)) {
continue;
}
const std::string lowestVersion("3.0");
std::string curVersion(info.protocolVersion);
if (curVersion >= lowestVersion) {
- isSuccess = ConvertPreview2WatchDialInfo(info, watchInfo);
- if (!isSuccess) {
+ if (!ConvertPreview2WatchDialInfo(info, watchInfo)) {
break;
}
watchInfo.install_state = true;
watchInfo.is_current_watch = isActiveExist ? (activePath == fileName) : false;
- g_info.fileNames.PushBack(fileName);
- g_info.watchInfo.PushBack(watchInfo);
+ g_info.PushBack({fileName, watchInfo});
}
}
}
- // ¹Ø±ÕĿ¼
+ // 关闭目录
closedir(dirp);
- return isSuccess;
}
-} // namespace
-bool GetAllWatchFaceInfo(watch_dial_info *info, uint8_t *num, uint8_t maxCnt)
+inline bool IsFileExists(const std::string &file)
+{
+ return access(file.c_str(), F_OK) == 0;
+}
+
+uint16_t FindMaxVersionIndex(uint16_t indexArray[], uint16_t num)
+{
+ if (num == 0) {
+ return INVALID_INFO_INDEX;
+ }
+
+ if (num == 0) {
+ return indexArray[0];
+ }
+ std::string version = reinterpret_cast<char *>(g_info[indexArray[0]].watchInfo.watch_version);
+ uint16_t index = 0;
+ for (uint16_t i = 1; i < num; ++i) {
+ std::string curVerion = std::string(reinterpret_cast<char *>(g_info[indexArray[i]].watchInfo.watch_version));
+ if (curVerion > version) {
+ version = curVerion;
+ index = i;
+ }
+ }
+ if (num > 1) {
+ GRAPHIC_LOGE("There are watches with the same uuid. %u", g_info[indexArray[index]].watchInfo.uuid);
+ }
+ index = indexArray[index];
+ return index;
+}
+
+void GetWatchInfo(uint32_t uuid, uint16_t &index)
+{
+ index = INVALID_INFO_INDEX;
+ if (g_info.IsEmpty()) {
+ RefreshAllWatchInfo();
+ }
+ const uint16_t MAX_INFO_NUM = 128;
+ static uint16_t indexArray[MAX_INFO_NUM];
+ uint16_t num = 0;
+ std::string activePath;
+ bool isActive = GetActiveWatchPath(activePath);
+ bool isNeedRequery = false;
+ for (uint16_t i = 0; i < g_info.Size(); ++i) {
+ if (uuid == g_info[i].watchInfo.uuid && num < MAX_INFO_NUM) {
+ if (IsFileExists(g_info[i].fileName)) {
+ g_info[i].watchInfo.is_current_watch = isActive ? (g_info[i].fileName == activePath) : false;
+ indexArray[num++] = i;
+ } else {
+ RefreshAllWatchInfo();
+ isNeedRequery = true;
+ break;
+ }
+ }
+ }
+
+ if (!isNeedRequery) {
+ index = FindMaxVersionIndex(indexArray, num);
+ return;
+ }
+ num = 0;
+ for (uint16_t i = 0; i < g_info.Size(); ++i) {
+ if (uuid == g_info[i].watchInfo.uuid && num < MAX_INFO_NUM) {
+ indexArray[num++] = i;
+ }
+ }
+ index = FindMaxVersionIndex(indexArray, num);
+}
+
+void TryToTurnOnScreen()
+{
+ const power_display_svr_api_t *ctx = power_display_svr_get_api();
+ if (ctx == nullptr) {
+ return;
+ }
+ if (ctx->get_screen_state != nullptr && ctx->get_screen_state() != SCREEN_ON) {
+ if (ctx->turn_on_screen != nullptr) {
+ ctx->turn_on_screen();
+ }
+ }
+}
+} // anonymous namespace
+
+bool GetAllWatchFaceInfo(watch_dial_info **info, uint8_t *num)
{
if (info == nullptr || num == nullptr) {
GRAPHIC_LOGE("para error!");
return false;
}
- if (!GetAllWatchInfo()) {
- GRAPHIC_LOGE("failed to get all watch info.");
- return false;
+ GraphicLockGuard guard(g_mutex);
+ while (!g_eventFinished) {
+ g_cond.Wait(g_mutex);
}
- if (g_info.watchInfo.Size() > maxCnt) {
- GRAPHIC_LOGE("mem is not enough.");
- return false;
- }
- *num = g_info.watchInfo.Size();
+ RefreshAllWatchInfo();
+ *num = g_info.Size();
if (*num == 0) {
- return false;
+ *info = nullptr;
+ return true;
}
- if (memcpy_s(info,
- g_info.watchInfo.Size() * sizeof(watch_dial_info),
- &g_info.watchInfo[0],
- g_info.watchInfo.Size() * sizeof(watch_dial_info)) != 0) {
- GRAPHIC_LOGE("copy info error!");
+ watch_dial_info *mem = static_cast<watch_dial_info *>(malloc(*num * sizeof(watch_dial_info)));
+ if (mem == nullptr) {
+ GRAPHIC_LOGE("failed to malloc");
return false;
}
+ for (uint16_t i = 0; i < g_info.Size(); ++i) {
+ memcpy_s(&mem[i], sizeof(watch_dial_info), &g_info[i].watchInfo, sizeof(watch_dial_info));
+ }
+ *info = mem;
return true;
}
GRAPHIC_LOGE("para error!");
return false;
}
- if (!GetAllWatchInfo()) {
- GRAPHIC_LOGE("failed to get all watch info.");
+
+ uint16_t index = INVALID_INFO_INDEX;
+ GraphicLockGuard guard(g_mutex);
+ while (!g_eventFinished) {
+ g_cond.Wait(g_mutex);
+ }
+ GetWatchInfo(uuid, index);
+ if (index == INVALID_INFO_INDEX) {
+ GRAPHIC_LOGE("uuid %u does not exist", uuid);
return false;
}
- for (uint16_t i = 0; i < g_info.watchInfo.Size(); ++i) {
- if (g_info.watchInfo[i].uuid == uuid) {
- *watch = g_info.watchInfo[i];
- return true;
- }
- }
- return false;
+ memcpy_s(watch, sizeof(watch_dial_info), &g_info[index].watchInfo, sizeof(watch_dial_info));
+ return true;
}
bool GetWatchCapability(watch_dev_cap_info *capability)
bool SetCurrentWatchFace(uint32_t uuid)
{
- if (!GetAllWatchInfo()) {
- GRAPHIC_LOGE("failed to get all watch info.");
+ uint16_t index = INVALID_INFO_INDEX;
+ GraphicLockGuard guard(g_mutex);
+ while (!g_eventFinished) {
+ g_cond.Wait(g_mutex);
+ }
+ GetWatchInfo(uuid, index);
+ if (index == INVALID_INFO_INDEX) {
+ GRAPHIC_LOGE("uuid %u does not exist", uuid);
return false;
}
- watch_dial_info info;
- uint16_t index = 0;
- bool isExists = false;
- for (uint16_t i = 0; i < g_info.watchInfo.Size(); ++i) {
- if (uuid == g_info.watchInfo[i].uuid) {
- isExists = true;
- info = g_info.watchInfo[i];
- index = i;
- break;
- }
- }
- if (!isExists) {
- GRAPHIC_LOGE("uuid does not exist!");
- return false;
+ DialSetting setting = MainModel::GetInstance().GetDialSetting();
+ setting.dialFlag = 1;
+ setting.dialFullName = g_info[index].fileName;
+ if (NativeAbility::GetInstance().GetCurSliceId() == VIEW_SET_DIAL) {
+ GraphicService::GetInstance()->PostGraphicEvent([setting]() {
+ if (SetDialPresenter::GetCurrentInstance() != nullptr) {
+ SetDialPresenter::GetCurrentInstance()->SpecifyDialSetting(setting);
+ }
+ });
+ NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);
+ return true;
}
- if (info.is_current_watch) {
+ if (g_info[index].watchInfo.is_current_watch) {
return true;
}
-
- DialSetting setting = MainModel::GetInstance().GetDialSetting();
- setting.dialFlag = 1;
- setting.dialFullName = g_info.fileNames[index];
+ g_eventFinished = false;
GraphicService::GetInstance()->PostGraphicEvent([setting]() {
+ GraphicLockGuard guardGraphic(g_mutex);
MainModel::GetInstance().GetDialSetting() = setting;
MainModel::GetInstance().AddDialSetting(setting);
if (NativeAbility::GetInstance().GetCurSliceId() == VIEW_MAIN_SAMPLE) {
MainViewSample::GetInstance()->ReloadWatchFace();
}
+ g_eventFinished = true;
+ g_cond.Signal();
});
+ TryToTurnOnScreen();
return true;
}
bool UninstallWatch(uint32_t uuid)
{
- if (!GetAllWatchInfo()) {
- GRAPHIC_LOGE("failed to get all watch info.");
- return false;
- }
- watch_dial_info info;
- uint16_t index = 0;
- bool isExists = false;
- for (uint16_t i = 0; i < g_info.watchInfo.Size(); ++i) {
- if (uuid == g_info.watchInfo[i].uuid) {
- isExists = true;
- info = g_info.watchInfo[i];
- index = i;
- break;
- }
- }
- if (!isExists) {
- GRAPHIC_LOGE("uuid does not exist!");
+ uint16_t index = INVALID_INFO_INDEX;
+ GraphicLockGuard guard(g_mutex);
+ while (!g_eventFinished) {
+ g_cond.Wait(g_mutex);
+ }
+ GetWatchInfo(uuid, index);
+ if (index == INVALID_INFO_INDEX) {
+ GRAPHIC_LOGE("uuid %u does not exist", uuid);
return false;
}
- if (info.is_current_watch) {
- DialSetting setting = MainModel::GetInstance().GetDialSetting();
+ DialSetting setting = MainModel::GetInstance().GetDialSetting();
+ if (g_info[index].watchInfo.is_current_watch) {
setting.dialFlag = 0;
setting.dialId = 0;
- std::string fileName = g_info.fileNames[index];
- GraphicService::GetInstance()->PostGraphicEvent([setting, fileName]() {
- MainModel::GetInstance().GetDialSetting() = setting;
- MainModel::GetInstance().AddDialSetting(setting);
- if (NativeAbility::GetInstance().GetCurSliceId() == VIEW_MAIN_SAMPLE) {
- MainViewSample::GetInstance()->ReloadWatchFace();
- }
- if (remove(fileName.c_str()) != 0) {
- GRAPHIC_LOGE("failed to remove file %s", fileName.c_str());
+ }
+ if (NativeAbility::GetInstance().GetCurSliceId() == VIEW_SET_DIAL) {
+ if (g_info[index].watchInfo.is_current_watch) {
+ // If it is the current watch face, set it as the default watch face. Otherwise, the configuration remains
+ // unchanged.
+ GraphicService::GetInstance()->PostGraphicEvent([setting]() {
+ if (SetDialPresenter::GetCurrentInstance() != nullptr) {
+ SetDialPresenter::GetCurrentInstance()->SpecifyDialSetting(setting);
+ }
+ });
+ }
+ NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);
+ g_eventFinished = false;
+ GraphicService::GetInstance()->PostGraphicEvent([index]() {
+ GraphicLockGuard guardGraphic(g_mutex);
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(g_info[index].fileName);
+ if (remove(g_info[index].fileName.c_str()) != 0) {
+ GRAPHIC_LOGE("failed to remove file %s", g_info[index].fileName.c_str());
+ g_eventFinished = true;
+ g_cond.Signal();
+ return;
}
+ g_info.Erase(index);
+ g_eventFinished = true;
+ g_cond.Signal();
});
- } else {
- if (remove(g_info.fileNames[index].c_str()) != 0) {
- GRAPHIC_LOGE("failed to remove file %s", g_info.fileNames[index].c_str());
- return false;
- }
+ return true;
}
+
+ g_eventFinished = false;
+ GraphicService::GetInstance()->PostGraphicEvent([index, setting]() {
+ GraphicLockGuard guardGraphic(g_mutex);
+ if (g_info[index].watchInfo.is_current_watch &&
+ NativeAbility::GetInstance().GetCurSliceId() == VIEW_MAIN_SAMPLE) {
+ MainModel::GetInstance().GetDialSetting() = setting;
+ MainModel::GetInstance().AddDialSetting(setting);
+ MainViewSample::GetInstance()->ReloadWatchFace();
+ }
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(g_info[index].fileName);
+ if (remove(g_info[index].fileName.c_str()) != 0) {
+ GRAPHIC_LOGE("failed to remove file %s", g_info[index].fileName.c_str());
+ g_eventFinished = true;
+ g_cond.Signal();
+ return;
+ }
+ g_info.Erase(index);
+ g_eventFinished = true;
+ g_cond.Signal();
+ });
+ TryToTurnOnScreen();
return true;
}
-bool InstallWatch(const char *path, uint32_t *uuid)
+bool GetUuidByPath(const char *path, uint32_t *uuid)
{
if (path == nullptr || uuid == nullptr) {
GRAPHIC_LOGE("para error!");
}
DialPreviewInfo preview;
- if (!GetPreviewInfo(std::string(path), preview)) {
+ if (!GetPreviewInfo(std::string(path), preview, true)) {
return false;
}
if (std::string(preview.protocolVersion) < std::string("3.0")) {
return false;
}
- *uuid = preview.uuid;
- if (!GetAllWatchInfo()) {
- GRAPHIC_LOGE("failed to get all watchinfo!");
- return false;
- }
- for (uint16_t i = 0; i < g_info.watchInfo.Size(); ++i) {
- const std::string &fileName = g_info.fileNames[i];
- const watch_dial_info &info = g_info.watchInfo[i];
- if (!(info.uuid == *uuid && std::string(path) != fileName)) {
- continue;
- }
-
- if (info.is_current_watch) {
- DialSetting setting = MainModel::GetInstance().GetDialSetting();
- setting.dialFlag = 1;
- setting.dialFullName = std::string(path);
- GraphicService::GetInstance()->PostGraphicEvent([setting, fileName]() {
- MainModel::GetInstance().GetDialSetting() = setting;
- MainModel::GetInstance().AddDialSetting(setting);
- if (NativeAbility::GetInstance().GetCurSliceId() == VIEW_MAIN_SAMPLE) {
- MainViewSample::GetInstance()->ReloadWatchFace();
- }
- if (remove(fileName.c_str()) != 0) {
- GRAPHIC_LOGE("failed to remove file %s", fileName.c_str());
- }
- });
- } else {
- if (remove(fileName.c_str()) != 0) {
- return false;
+ watch_dial_info watchInfo;
+ if (ConvertPreview2WatchDialInfo(preview, watchInfo)) {
+ std::string activePath;
+ std::string appendPath(path);
+ bool isActiveExist = GetActiveWatchPath(activePath);
+ watchInfo.install_state = true;
+ watchInfo.is_current_watch = isActiveExist ? (activePath == appendPath) : false;
+ bool isExist = false;
+ for (uint16_t i = 0; i < g_info.Size(); ++i) {
+ if (g_info[i].fileName == appendPath) {
+ isExist = true;
+ break;
}
}
+ if (!isExist) {
+ g_info.PushBack({appendPath, watchInfo});
+ }
}
-
+ *uuid = preview.uuid;
return true;
}
\ No newline at end of file
* Author:\r
* Create: 2021-10-12\r
*/\r
-#include "CallerDisplayView.h"\r
-#include "MainCallingPresenter.h"\r
+#include "makephone/CallerDisplayView.h"\r
+#include "makephone/MainCallingPresenter.h"\r
#include "UiConfig.h"\r
\r
namespace OHOS {\r
* Author:\r
* Create: 2021-10-12\r
*/\r
-#include "CallingView.h"\r
-#include "MainCallingPresenter.h"\r
+#include "makephone/CallingView.h"\r
+#include "makephone/MainCallingPresenter.h"\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
\r
*/\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
-#include "DialingScreenView.h"\r
-#include "MainCallingPresenter.h"\r
+#include "makephone/DialingScreenView.h"\r
+#include "makephone/MainCallingPresenter.h"\r
\r
namespace OHOS {\r
static constexpr uint16 MATH_ZERO = 0;\r
#include "common/image_cache_manager.h"\r
#include "UiConfig.h"\r
#include "ui_resource_image.h"\r
-#include "MainCallingPresenter.h"\r
-#include "CallingView.h"\r
-#include "CallerDisplayView.h"\r
-#include "DialingScreenView.h"\r
-#include "MainCallingView.h"\r
+#include "makephone/MainCallingPresenter.h"\r
+#include "makephone/CallingView.h"\r
+#include "makephone/CallerDisplayView.h"\r
+#include "makephone/DialingScreenView.h"\r
+#include "makephone/MainCallingView.h"\r
#include "NativeRegisterManager.h"\r
-#include "PhoneService.h"\r
-#include "WaitingHintsView.h"\r
+#include "phoneservice/PhoneService.h"\r
+#include "makephone/WaitingHintsView.h"\r
\r
namespace OHOS {\r
\r
*/\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
-#include "MainCallingView.h"\r
-#include "MainCallingPresenter.h"\r
-#include "CallerLogModel.h"\r
+#include "makephone/MainCallingView.h"\r
+#include "makephone/MainCallingPresenter.h"\r
+#include "callerlog/CallerLogModel.h"\r
\r
namespace OHOS {\r
static MainCallingView *g_pMainView = nullptr;\r
* Author:\r
* Create: 2022-03-14\r
*/\r
-#include "WaitingHintsView.h"\r
+#include "makephone/WaitingHintsView.h"\r
#include "UiConfig.h"\r
-#include "CallerLogModel.h"\r
-#include "MainCallingPresenter.h"\r
+#include "callerlog/CallerLogModel.h"\r
+#include "makephone/MainCallingPresenter.h"\r
\r
namespace OHOS {\r
static constexpr uint16 MATH_ZERO = 0;\r
* Create: 2022-01-18\r
*/\r
\r
-#include "MainVocassistView.h"\r
-#include "VocassistPresenter.h"\r
+#include "offlinevoice/MainVocassistView.h"\r
+#include "offlinevoice/VocassistPresenter.h"\r
\r
namespace OHOS {\r
static MainVocassistView *g_pMainVocassistView = nullptr;\r
* Author: CompanyName
* Create: 2022-01-18
*/
-#include "PhoneService.h"
-#include "MainViewSample.h"
-#include "VocassistView.h"
-#include "VocassistModel.h"
+#include "phoneservice/PhoneService.h"
+#include "main/MainViewSample.h"
+#include "offlinevoice/VocassistView.h"
+#include "offlinevoice/VocassistModel.h"
#include "AppViewIDs.h"
#include "NativeAbility.h"
* Create: 2022-01-18
*/
#include "AppViewIDs.h"
-#include "VocassistPresenter.h"
-#include "PlayersModel.h"
-#include "ui_service.h"
+#include "offlinevoice/VocassistPresenter.h"
+#include "player/PlayersModel.h"
+#include "uiservice/ui_service.h"
#include "NativeRegisterManager.h"
namespace OHOS {
void VocassistPresenter::OnResume(void)
{
- Presenter<MainVocassistView>::OnResume();
ScreenTurnOn(-1);
}
#include "ohos_timer.h"\r
#include "graphic_timer.h"\r
#include "AppViewIDs.h"\r
-#include "PlayersModel.h"\r
-#include "CallerLogModel.h"\r
-#include "VocassistModel.h"\r
-#include "VocassistView.h"\r
-#include "VocassistPresenter.h"\r
+#include "player/PlayersModel.h"\r
+#include "callerlog/CallerLogModel.h"\r
+#include "offlinevoice/VocassistModel.h"\r
+#include "offlinevoice/VocassistView.h"\r
+#include "offlinevoice/VocassistPresenter.h"\r
\r
static constexpr uint16_t SWITCH_MAP_NUM = 16;\r
static constexpr uint16_t ANI_X = 84;\r
* Create: 2021-09-22
*/
-#include "PhoneAudio.h"
-#include "PhoneService.h"
+#include "phoneservice/PhoneAudio.h"
+#include "phoneservice/PhoneService.h"
#include <iostream>
#include <memory>
#include "audio_manager.h"
* Create: 2021-09-22
*/
-#include "PhoneService.h"
-#include "PhoneAudio.h"
+#include "phoneservice/PhoneService.h"
+#include "phoneservice/PhoneAudio.h"
#include "securec.h"
#include <cstdio>
#include <cstdlib>
#include "service_id_define.h"
#include "graphic_mutex.h"
#include "samgr_lite.h"
-#include "ui_service.h"
+#include "uiservice/ui_service.h"
#ifdef __cplusplus
extern "C" {
* Description: bluetooth view 设置页面\r
* Create: 2021-09-5\r
*/\r
-#include "BluetoothView.h"\r
-#include "PlayersView.h"\r
+#include "player/BluetoothView.h"\r
+#include "player/PlayersView.h"\r
#include "UiConfig.h"\r
-#include "BluetoothEarPhoneView.h"\r
-#include "PlayersPresenter.h"\r
+#include "bluetooth/BluetoothEarPhoneView.h"\r
+#include "player/PlayersPresenter.h"\r
\r
namespace OHOS {\r
static BluetoothView *g_bluetoothView{nullptr};\r
* Create: 2021-07-26
*/
#include <string>
-#include "PlayersCaseListAdapter.h"
+#include "player/PlayersCaseListAdapter.h"
#include "gfx_utils/list.h"
-#include "PlayersView.h"
-#include "PlayersPresenter.h"
+#include "player/PlayersView.h"
+#include "player/PlayersPresenter.h"
#include "wearable_log.h"
-#include "PlayersModel.h"
+#include "player/PlayersModel.h"
namespace OHOS {
constexpr uint16_t TESTCASE_BUTTON_HEIGHT = 64;
* Create: 2021-07-26\r
*/\r
\r
-#include "PlayersModel.h"\r
+#include "player/PlayersModel.h"\r
#include "thread_adapter.h"\r
#include "UiConfig.h"\r
#include "bts_avrcp_controller.h"\r
#include "bts_avrcp_target.h"\r
#include "bts_a2dp_source.h"\r
-#include "BluetoothModel.h"\r
+#include "bluetooth/BluetoothModel.h"\r
\r
namespace OHOS {\r
\r
interrupt = {AUDIO_STREAM_MUSIC, sessionId, playerInterruptListener};\r
// 激活音频中断 5s超时\r
if (amIntance.ActivateAudioInterrupt(interrupt) == INTERRUPT_FAILED) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ActivateAudioInterrupt faild");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ActivateAudioInterrupt faild");\r
return OHOS_FAILURE;\r
}\r
isActivateAudioInterrupt = true;\r
}\r
}\r
// 蓝牙连接和本地的音乐播放\r
-void PlayersModel::ConnectBtAndLocalPlay(int32_t connCtState, int32_t connTgState, int32_t playerState)\r
+int32_t PlayersModel::ConnectBtAndLocalPlay(int32_t connCtState, int32_t connTgState, int32_t playerState)\r
{\r
int ret;\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerModel] ConnectBtAndLocalPlay connCtState = %d connTgState = %d", connCtState, connTgState);\r
avrcp_key_operation_t playNotification = AVRCP_KEY_PLAY;\r
if (PlayersModel::GetInstance()->GetPlayerCtr() == nullptr) {\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[PlayersModel::ConnectBtAndLocalPlay] BT GetPlayerCtr is nullptr ");\r
- return;\r
+ return -1;\r
}\r
if (connCtState == HFP_SCO_STATE_CONNECTED || connTgState == HFP_SCO_STATE_CONNECTED) {\r
if (playerState == PlayerStates::PLAYER_PAUSED) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BTPLAYER_PAUSED play, 122.");\r
- PlayersModel::GetInstance()->GetPlayerCtr()->Play(); // 暂停后的播放\r
+ if (playerInterruptListener->IsInterruptedPaused()) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Paused by interrupt, dont resume");\r
+ return -1;\r
+ }\r
+ ret = PlayersModel::GetInstance()->GetPlayerCtr()->Play(); // 暂停后的播放\r
PlayersModel::GetInstance()->SetBTMusicPlay(playNotification);\r
} else {\r
ret = PlayersModel::GetInstance()->PlayerStat(); // 蓝牙连接播放\r
} else {\r
if (playerState == PlayerStates::PLAYER_PAUSED) {\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PLAYER_PAUSED play, 122.");\r
- PlayersModel::GetInstance()->GetPlayerCtr()->Play();\r
+ if (playerInterruptListener->IsInterruptedPaused()) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Paused by interrupt, dont resume");\r
+ return -1;\r
+ }\r
+ ret = PlayersModel::GetInstance()->GetPlayerCtr()->Play();\r
} else {\r
ret = PlayersModel::GetInstance()->PlayerStat(); // 本地播放\r
if (ret != 0) {\r
}\r
}\r
}\r
+ return ret;\r
}\r
\r
// 蓝牙连接和本地音乐的暂停\r
-void PlayersModel::ConnectBtAndLocalPause(int32_t connCtState, int32_t connTgState)\r
+int32_t PlayersModel::ConnectBtAndLocalPause(int32_t connCtState, int32_t connTgState)\r
{\r
- int ret;\r
+ int32_t ret = 0;\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[PlayerModel] ConnectBtAndLocalPause");\r
avrcp_key_operation_t playNotification = AVRCP_KEY_PAUSE;\r
if (connCtState == HFP_SCO_STATE_CONNECTED || connTgState == HFP_SCO_STATE_CONNECTED) {\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "state == BTUNSELECTED, 105.");\r
if (PlayersModel::GetInstance()->GetPlayerCtr() == nullptr) {\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[PlayersModel::ConnectBtAndLocalPause] BT GetPlayerCtr is nullptr");\r
- return;\r
+ return -1;\r
}\r
ret = PlayersModel::GetInstance()->GetPlayerCtr()->Pause(); // 蓝牙连接暂停\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BT Music Pause, ret:%d", ret);\r
ret = PlayersModel::GetInstance()->GetPlayerCtr()->Pause(); // 本地暂停\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Pause, ret:%d", ret);\r
}\r
+ return ret;\r
}\r
\r
void PlayersModel::ClearActivateAudioInterrupt()\r
#include <iostream>
#include <cstdlib>
#include <ctime>
-#include "PlayersPresenter.h"
+#include "player/PlayersPresenter.h"
#include "wearable_log.h"
#include "common/image_cache_manager.h"
#include "UiConfig.h"
#include "ui_resource_image.h"
-#include "PlayersView.h"
-#include "PlayersModel.h"
-#include "BluetoothPresenter.h"
+#include "player/PlayersView.h"
+#include "player/PlayersModel.h"
+#include "bluetooth/BluetoothPresenter.h"
#include "graphic_service.h"
-#include "PhoneService.h"
-#include "MainViewSample.h"
+#include "phoneservice/PhoneService.h"
+#include "main/MainViewSample.h"
#include "bts_avrcp_controller.h"
#include "bts_avrcp_target.h"
return isPaused_;
}
+bool PlayerInterruptListener::IsInterruptedPaused()
+{
+ return isInterruptedPause_;
+}
+
bool PlayerInterruptListener::IsDelayed()
{
return isDelayed_;
WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "[PlayerInterruptListener::] OnInterrupt go in, type %d, hint %d.", type, hint);
if (type == INTERRUPT_TYPE_BEGIN && hint == INTERRUPT_HINT_PAUSE) {
+ isInterruptedPause_ = true;
PausePlayer();
}
if (type == INTERRUPT_TYPE_END && hint == INTERRUPT_HINT_RESUME) {
+ isInterruptedPause_ = false;
ResumePlayer();
}
#include <unistd.h>
#include "common/image_cache_manager.h"
#include "ui_resource_image.h"
-#include "PlayersView.h"
+#include "player/PlayersView.h"
#include "UiConfig.h"
-#include "PlayersModel.h"
-#include "PlayersCaseListAdapter.h"
-#include "MainViewSample.h"
+#include "player/PlayersModel.h"
+#include "player/PlayersCaseListAdapter.h"
+#include "main/MainViewSample.h"
namespace OHOS {
static PlayersView* g_pPlayersView = nullptr;
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: QrcodeConnModel.cpp\r
+ * Author:\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#include "qrcode_conn/QrcodeConnModel.h"\r
+\r
+namespace OHOS {\r
+QrcodeConnModel::QrcodeConnModel() {}\r
+\r
+QrcodeConnModel::~QrcodeConnModel() {}\r
+\r
+QrcodeConnModel &QrcodeConnModel::GetInstance()\r
+{\r
+ static QrcodeConnModel instance;\r
+ return instance;\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: QrcodeConnPresenter.cpp\r
+ * Author:\r
+ * Create: 2025-04-24\r
+ */\r
+#include "qrcode_conn/QrcodeConnPresenter.h"\r
+#include "uiservice/ui_service.h"\r
+#include "NativeRegisterManager.h"\r
+\r
+namespace OHOS {\r
+\r
+REGIST_MENU(VIEW_QRCODE_CONN, QrcodeConnView, QrcodeConnPresenter, PNG_APPLIST_UI_SAMPLE_IMAGE, PNG_APPLIST_DEFAULT_IMG,\r
+ "二维码连接");\r
+\r
+static QrcodeConnPresenter *g_QrcodeConnPresenter = nullptr;\r
+\r
+QrcodeConnPresenter::QrcodeConnPresenter()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "QrcodeConnPresenter::QrcodeConnPresenter");\r
+ g_QrcodeConnPresenter = this;\r
+}\r
+\r
+QrcodeConnPresenter::~QrcodeConnPresenter() {}\r
+\r
+QrcodeConnPresenter *QrcodeConnPresenter::GetInstance()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "QrcodeConnPresenter GetInstance");\r
+ return g_QrcodeConnPresenter;\r
+}\r
+\r
+bool QrcodeConnPresenter::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ std::string id = view.GetViewId();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "QrcodeConnPresenter::OnDrag [%s]", id.c_str());\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+ return false;\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: QrcodeConnView.cpp\r
+ * Author:\r
+ * Create: 2025-04-24\r
+ */\r
+\r
+#include "qrcode_conn/QrcodeConnView.h"\r
+#include "qrcode_conn/QrcodeConnPresenter.h"\r
+#include "qrcode_conn/QrcodeConnModel.h"\r
+#include "bluetooth/BluetoothModel.h"\r
+#include "wearable_log.h"\r
+\r
+namespace OHOS {\r
+static const uint32_t QRCODE_POS_X = 76;\r
+static const uint32_t QRCODE_POS_Y = 76;\r
+static const uint32_t QRCODE_WIDTH = 282;\r
+static const uint32_t QRCODE_HEIGHT = 282;\r
+static const uint32_t PAD_SIZE = 10;\r
+\r
+static QrcodeConnView *g_pQrcodeConnView = nullptr;\r
+\r
+QrcodeConnView::QrcodeConnView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "QrcodeConnView::QrcodeConnView");\r
+ g_pQrcodeConnView = this;\r
+}\r
+\r
+QrcodeConnView::~QrcodeConnView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "QrcodeConnView::~QrcodeConnView");\r
+ g_pQrcodeConnView = nullptr;\r
+}\r
+\r
+QrcodeConnView *QrcodeConnView::GetInstance()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "QrcodeConnView::GetInstance");\r
+ return g_pQrcodeConnView;\r
+}\r
+\r
+void QrcodeConnView::InitView()\r
+{\r
+ if (group_ == nullptr) {\r
+ group_ = new UIScrollView();\r
+ group_->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group_->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+ }\r
+ if (qrcode_ == nullptr) {\r
+ qrcode_ = new UIQrcode();\r
+ }\r
+ qrcode_->SetPosition(QRCODE_POS_X, QRCODE_POS_Y, QRCODE_WIDTH, QRCODE_HEIGHT);\r
+ qrcode_->SetQrcodeInfo(BluetoothModel::GetInstance()->getWatchName());\r
+ qrcode_->SetStyle(STYLE_PADDING_LEFT, PAD_SIZE);\r
+ qrcode_->SetStyle(STYLE_PADDING_RIGHT, PAD_SIZE);\r
+ qrcode_->SetStyle(STYLE_PADDING_TOP, PAD_SIZE);\r
+ qrcode_->SetStyle(STYLE_PADDING_BOTTOM, PAD_SIZE);\r
+ group_->Add(qrcode_);\r
+ UIView::OnDragListener *dragListener = (UIView::OnDragListener *)OHOS::QrcodeConnPresenter::GetInstance();\r
+ group_->SetOnDragListener(dragListener);\r
+ // 更新\r
+ group_->SetVisible(true);\r
+ AddViewToRootContainer(group_);\r
+ GetRootContainer()->Invalidate();\r
+}\r
+\r
+void QrcodeConnView::DeInit()\r
+{\r
+ if (group_ != nullptr) {\r
+ group_->RemoveAll();\r
+ delete group_;\r
+ group_ = nullptr;\r
+ }\r
+ if (qrcode_ != nullptr) {\r
+ delete qrcode_;\r
+ qrcode_ = nullptr;\r
+ }\r
+}\r
+\r
+void QrcodeConnView::OnStart()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "QrcodeConnView::OnStart");\r
+ InitView();\r
+}\r
+\r
+void QrcodeConnView::OnStop()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "QrcodeConnView::OnStop");\r
+ DeInit();\r
+ return;\r
+}\r
+}\r
* Create: 2022-04-28\r
*/\r
\r
-#include "RebootDeviceView.h"\r
+#include "rebootdevice/RebootDeviceView.h"\r
+#include "PageTransitionMgr.h"\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
-#include "RebootPresenter.h"\r
+#include "rebootdevice/RebootPresenter.h"\r
\r
namespace OHOS {\r
static RebootDeviceView *g_pRebootDeviceView{nullptr};\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "rebootDeviceDragListener GetInstance fail");\r
return nullptr;\r
}\r
- if (PageTransitionMgr::GetInstance().GetTopSlideBackImage() == nullptr) { // support default slide back firstly\r
+ if (!PageTransitionMgr::GetInstance().CanSlideBack()) { // support default slide back firstly\r
group->SetOnDragListener(rebootDeviceDragListener);\r
}\r
group->SetViewId(REBOOTDEVICE_VIEW);\r
* Create: 2022-04-28\r
*/\r
\r
-#include "RebootModel.h"\r
+#include "rebootdevice/RebootModel.h"\r
#include "dfx_reboot.h"\r
\r
namespace OHOS {\r
* Create: 2022-04-28
*/
-#include "RebootPresenter.h"
-#include "RebootView.h"
-#include "RebootModel.h"
+#include "rebootdevice/RebootPresenter.h"
+#include "rebootdevice/RebootView.h"
+#include "rebootdevice/RebootModel.h"
#include "drag_event.h"
#include "wearable_log.h"
#include "NativeRegisterManager.h"
* Create: 2022-04-28
*/
-#include "RebootView.h"
-#include "RebootModel.h"
+#include "rebootdevice/RebootView.h"
+#include "PageTransitionMgr.h"
+#include "rebootdevice/RebootModel.h"
#include "wearable_log.h"
#include "UiConfig.h"
-#include "RebootPresenter.h"
+#include "rebootdevice/RebootPresenter.h"
namespace OHOS {
static RebootView *g_pRebootView{nullptr};
void RebootView::OnStart()
{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RebootView::~OnStart");
if (RebootModel::GetInstance()->GetSelectView() == REBOOT) {
ChangeView(REBOOT_MAX, REBOOTVIEW);
} else if (RebootModel::GetInstance()->GetSelectView() == REBOOTDEVICE) {
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "rebootDragListener GetInstance fail");
return nullptr;
}
- if (PageTransitionMgr::GetInstance().GetTopSlideBackImage() == nullptr) { // support default slide back firstly
+ if (!PageTransitionMgr::GetInstance().CanSlideBack()) { // support default slide back firstly
group->SetOnDragListener(rebootDragListener);
}
group->SetViewId(REBOOT_VIEW);
* Create: 2022-04-28\r
*/\r
\r
-#include "ShutdownDeviceView.h"\r
+#include "rebootdevice/ShutdownDeviceView.h"\r
+#include "PageTransitionMgr.h"\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
-#include "RebootPresenter.h"\r
+#include "rebootdevice/RebootPresenter.h"\r
\r
namespace OHOS {\r
static ShutdownDeviceView *g_pShutdownDeviceView{nullptr};\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "rebootDragListener GetInstance fail");\r
return nullptr;\r
}\r
- if (PageTransitionMgr::GetInstance().GetTopSlideBackImage() == nullptr) { // support default slide back firstly\r
+ if (!PageTransitionMgr::GetInstance().CanSlideBack()) { // support default slide back firstly\r
group->SetOnDragListener(rebootDragListener);\r
}\r
group->SetViewId(SHUTDOWNDEVICE_VIEW);\r
--- /dev/null
+/*
+ * Copyright (c) 2025 CompanyNameMagicTag.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "recent_app/RecentAppPresenter.h"
+#include "recent_app/RecentAppView.h"
+#include "RecentManager.h"
+#include "NativeRegisterManager.h"
+#include "msg_center_customer.h"
+
+namespace OHOS {
+
+REGIST_SLICE(VIEW_RECENT_APP, RecentAppView, RecentAppPresenter);
+
+ RecentAppPresenter::RecentAppPresenter()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RecentAppPresenter::RecentAppPresenter()");
+ }
+
+ RecentAppPresenter::~RecentAppPresenter() {}
+
+ void RecentAppPresenter::OnResume()
+ {
+ if (view_ != nullptr) {
+ view_->LoadContent();
+ }
+ }
+
+ bool RecentAppPresenter::OnClick(UIView &view, const ClickEvent &event)
+ {
+ UIRollerView* roller = view_->GetRollerView();
+ if (roller == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "roller is nullptr!");
+ return false;
+ }
+
+ UIViewGroup* currentItemGroup = roller->GetCurrentItem();
+ if (currentItemGroup == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "currentItemGroup is nullptr!");
+ return false;
+ }
+
+ std::string itemName = roller->GetCurrentItemName();
+ std::string prefix(itemName.begin(), itemName.begin() + RECENT_ITEM_PREFIX_LEN);
+ std::string name(itemName.begin() + RECENT_ITEM_PREFIX_LEN, itemName.end());
+
+ uint32_t sliceId = 0;
+ bool isNativeSlice = true;
+ if (prefix == RECENT_ITEM_NATIVE_PREFIX) {
+ sliceId = static_cast<uint32_t>(std::stoul(name));
+ } else {
+ isNativeSlice = false;
+ }
+
+ const char* viewId = view.GetViewId();
+ if (viewId != nullptr && strcmp(viewId, RECENT_APP_DELETE_BTN_ID) == 0) {
+ if (isNativeSlice) {
+ RecentManager::GetInstance()->RemoveRecentApp(sliceId);
+ } else {
+ RecentManager::GetInstance()->RemoveRecentApp(name.c_str());
+ }
+ roller->RemoveItem(itemName);
+ return true;
+ }
+
+ Point clickPoint = event.GetCurrentPos();
+ Rect rect = currentItemGroup->GetChildrenHead()->GetRect();
+ if (rect.IsContains(clickPoint)) {
+ if (isNativeSlice) {
+ NativeAbility::GetInstance().ChangeSlice(sliceId);
+ } else {
+#ifdef JS_ENABLE
+ StartJsApp(const_cast<char*>(name.c_str()));
+#endif
+ }
+ }
+ return true;
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2025 CompanyNameMagicTag.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "recent_app/RecentAppView.h"
+#include "wearable_log.h"
+#include "common/image_cache_manager.h"
+#include "common/screen.h"
+#include "Slice.h"
+#include "RecentManager.h"
+
+namespace OHOS {
+static constexpr uint8_t DEFAULT_TEXT_SIZE = 30;
+RecentAppView::RecentAppView()
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RecentAppView::RecentAppView");
+ loadingAnimCb_.SetRecentAppView(this);
+}
+
+RecentAppView::~RecentAppView()
+{
+ if (roller_ != nullptr) {
+ delete roller_;
+ }
+ if (loadingAnim_ != nullptr) {
+ if (loadingAnim_->GetState() != Animator::STOP) {
+ loadingAnim_->Stop();
+ }
+ delete loadingAnim_;
+ }
+ if (loadingLabel_ != nullptr) {
+ delete loadingLabel_;
+ }
+ if (noRecentAppLabel_ != nullptr) {
+ delete noRecentAppLabel_;
+ }
+ if (delBtn_ != nullptr) {
+ delete delBtn_;
+ }
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RecentAppView::~RecentAppView");
+}
+
+void RecentAppView::OnStart(void)
+{
+ UIViewGroup* container = GetRootContainer();
+
+ loadingLabel_ = new UILabel();
+ if (loadingLabel_ == nullptr) {
+ return;
+ }
+ container->Add(loadingLabel_);
+ loadingLabel_->SetText("Loading...");
+ loadingLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DEFAULT_TEXT_SIZE);
+ loadingLabel_->Resize(300, 100); // 300, 100: size
+ loadingLabel_->LayoutCenterOfParent();
+ loadingLabel_->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER,
+ UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);
+}
+
+void RecentAppView::LoadContent()
+{
+ if (viewiInitStatus_) {
+ return;
+ }
+
+ UIViewGroup* rootContainer = GetRootContainer();
+ if (!RecentManager::GetInstance()->IsUpdateCompleted()) {
+ loadingAnim_ = new Animator(&loadingAnimCb_, roller_, 0, true);
+ if (loadingAnim_ == nullptr) {
+ return;
+ }
+ loadingAnim_->Start();
+ } else {
+ LoadRecentAppContent();
+ }
+ viewiInitStatus_ = true;
+}
+
+void RecentAppView::LoadingAnimCb::Callback(UIView* view)
+{
+ if (RecentManager::GetInstance()->IsUpdateCompleted()) {
+ recentAppView_->LoadRecentAppContent();
+ }
+}
+
+void RecentAppView::AddRecentAppToRoller()
+{
+ const List<RecentAppInfo*>& recent = RecentManager::GetInstance()->GetRecentApps();
+ ListNode<RecentAppInfo*>* node = recent.Begin();
+ std::string alignItemName = "";
+ while (node != recent.End()) {
+ RecentAppInfo* appInfo = node->data_;
+ ImageInfo* imgInfo = appInfo->snapshot;
+ std::string name;
+ if (appInfo->isNativeSlice) {
+ name = RECENT_ITEM_NATIVE_PREFIX + std::to_string(appInfo->targetId & SLICE_MASK);
+ } else {
+ name = RECENT_ITEM_JS_PREFIX + appInfo->bundleName;
+ }
+ if (imgInfo->data != nullptr) {
+ roller_->AddItem(name, imgInfo);
+ } else {
+ std::string path(appInfo->snapshot->file, appInfo->snapshot->fileLen);
+ if (appInfo->snapshot->resId == 0) {
+ imgInfo = ImageCacheManager::GetInstance().LoadSingleRes(path);
+ } else {
+ imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(appInfo->snapshot->resId, path);
+ }
+
+ if (imgInfo == nullptr) {
+ GRAPHIC_LOGE("Load res failed: %s", path.c_str());
+ node = node->next_;
+ continue;
+ }
+ roller_->AddItem(name, imgInfo);
+ }
+ node = node->next_;
+ if (alignItemName == "") {
+ alignItemName = name;
+ }
+ }
+ roller_->SetCurrentItem(alignItemName);
+}
+
+void RecentAppView::InitRecentApps()
+{
+ if (delBtn_ == nullptr) {
+ delBtn_ = new UILabelButton();
+ }
+ if (delBtn_ == nullptr) {
+ GRAPHIC_LOGE("new delBtn_ failed!");
+ return;
+ }
+
+ if (roller_ == nullptr) {
+ roller_ = new UIRollerView(false);
+ }
+ if (roller_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new UIRollerView fail");
+ return;
+ }
+
+ UIView::OnClickListener* onClickListener = dynamic_cast<UIView::OnClickListener*>(presenter_);
+
+ GetRootContainer()->Add(roller_);
+ roller_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
+ roller_->SetItemSize(250, 250); // 250: item size
+ roller_->SetThrowDrag(true);
+ roller_->SetItemPadding(80); // 80: item padding
+ roller_->SetCamDistance(380); // 380: Camera distance
+ roller_->SetCamY(48); // 48: camY
+ roller_->SetOnClickListener(onClickListener);
+
+ GetRootContainer()->Add(delBtn_);
+ delBtn_->Resize(120, 50); // 120,50: width and height
+ delBtn_->LayoutCenterOfParent(0, 180); // 180: y offset
+ delBtn_->SetText("delete");
+ delBtn_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, DEFAULT_TEXT_SIZE);
+ delBtn_->SetViewId(RECENT_APP_DELETE_BTN_ID);
+ delBtn_->SetOnClickListener(onClickListener);
+
+ AddRecentAppToRoller();
+}
+
+void RecentAppView::LoadRecentAppContent()
+{
+ if (loadingAnim_ != nullptr) {
+ loadingAnim_->Stop();
+ }
+
+ if (loadingLabel_ != nullptr) {
+ loadingLabel_->SetVisible(false);
+ }
+
+ uint32_t size = RecentManager::GetInstance()->GetCurrentSize();
+ if (size == 0) {
+ if (noRecentAppLabel_ == nullptr) {
+ noRecentAppLabel_ = new UILabel();
+ }
+ if (noRecentAppLabel_ != nullptr) {
+ GetRootContainer()->Add(noRecentAppLabel_);
+ noRecentAppLabel_->SetText("No Recent App.");
+ noRecentAppLabel_->Resize(300, 100); // 300, 100: size
+ noRecentAppLabel_->LayoutCenterOfParent();
+ noRecentAppLabel_->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER,
+ UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);
+ }
+ return;
+ }
+
+ InitRecentApps();
+}
+}
\ No newline at end of file
* Create: 2024-08-12\r
*/\r
\r
-#include "RestoreDefaultsView.h"\r
+#include "restoredefaults/RestoreDefaultsView.h"\r
#include "components/ui_label.h"\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
* Create: 2024-08-12\r
*/\r
\r
-#include "RestoreDefaultsPresenter.h"\r
-#include "RestoreDefaultsView.h"\r
-#include "BluetoothModel.h"\r
+#include "restoredefaults/RestoreDefaultsPresenter.h"\r
+#include "restoredefaults/RestoreDefaultsView.h"\r
+#include "bluetooth/BluetoothModel.h"\r
#include "bts_br_gap.h"\r
#include "drag_event.h"\r
#include "cmsis_os.h"\r
#ifdef SUPPORT_ALIPAY_SEC\r
#include "alipay_feature.h"\r
#endif\r
+#include "adapter.h"\r
+#include "bundlems_slite_client.h"\r
+#include "abilityms_slite_client.h"\r
+#include "stopwatch/StopwatchModel.h"\r
\r
namespace OHOS {\r
\r
return true;\r
}\r
\r
+static void UninstallCallbackFunc(const uint8_t resultCode, const void *resultMessage)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UninstallCallbackFunc.");\r
+}\r
+\r
void RestoreDefaultsPresenter::ConfirmOnClick()\r
{\r
bool res = bluetooth_factory_reset();\r
(void)uapi_alipay_svr_reset();\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_alipay_svr_reset process.");\r
#endif\r
+\r
+ BundleInfo *bundleInfos = nullptr;\r
+ int32_t count = 0;\r
+ int32_t ret = ERRCODE_FAIL;\r
+\r
+ ret = OHOS::BundleMsClient::GetInstance().GetBundleInfos(0, &bundleInfos, &count);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetBundleInfos count = %d bundleRet = 0x%x", count, ret);\r
+ if (ret != 0) {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Get bundleInfos Failed\n");\r
+ }else {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "\n"\r
+ "----------------- AppList Start --------------------\n");\r
+ for (int32_t i = 0; i < count; i++) {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP,\r
+ "App:%d-----------------\n"\r
+ "label: %s\n"\r
+ "bundleName: %s\n",\r
+ i+1,\r
+ bundleInfos[i].label,\r
+ bundleInfos[i].bundleName\r
+ );\r
+ ElementName* topAbility = OHOS::AbilityMsClient::GetInstance().GetTopAbility();\r
+\r
+ if ((topAbility != nullptr) && (strcmp(topAbility->bundleName, bundleInfos[i].bundleName) == 0)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "js app is active, first need terminate");\r
+ int token = 0;\r
+ OHOS::AbilityMsClient::GetInstance().TerminateAbility(token);\r
+ }\r
+\r
+ InstallParam installParam = { .installLocation = 1, .keepData = false };\r
+ OHOS::BundleMsClient::GetInstance().Uninstall(bundleInfos[i].bundleName, &installParam, UninstallCallbackFunc);\r
+ FreeElement(topAbility);\r
+ }\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "\n"\r
+ "----------------- AppList End -----------------------\n");\r
+ }\r
+ if (bundleInfos != nullptr) {\r
+ for (uint8_t i = 0; i < count; i++) {\r
+ ClearBundleInfo(bundleInfos + i);\r
+ }\r
+\r
+ if (bundleInfos != nullptr) {\r
+ AdapterFree(bundleInfos);\r
+ bundleInfos = nullptr;\r
+ }\r
+ }\r
+ StopwatchModel::GetInstance().ClearData();\r
uapi_system_reboot(SYSTEM_SOFT_REBOOT);\r
return;\r
}\r
* Description: RestoreSelect View\r
* Create: 2024-08-12\r
*/\r
-#include "RestoreSelectView.h"\r
+#include "restoredefaults/RestoreSelectView.h"\r
+#include "PageTransitionMgr.h"\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
-#include "RestoreDefaultsPresenter.h"\r
+#include "restoredefaults/RestoreDefaultsPresenter.h"\r
\r
namespace OHOS {\r
static RestoreSelectView *g_pRestoreSelectView { nullptr };\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "connectDragListener GetInstance fail");\r
return nullptr;\r
}\r
- if (PageTransitionMgr::GetInstance().GetTopSlideBackImage() == nullptr) { // support default slide back firstly\r
+ if (!PageTransitionMgr::GetInstance().CanSlideBack()) { // support default slide back firstly\r
group->SetOnDragListener(connectDragListener);\r
}\r
group->SetViewId(RESTORE_SELECT_VIEW);\r
#include "securec.h"\r
#include "broadcast_service.h"\r
\r
-#include "AlmmgrAlarmClockManage.h"\r
-#include "RtcService.h"\r
+#include "alarmclockmanage/AlmmgrAlarmClockManage.h"\r
+#include "rtcservice/RtcService.h"\r
\r
#ifdef __cplusplus\r
extern "C" {\r
#include "power_display_service.h"
#include "NativeAbility.h"
#include "AppViewIDs.h"
-#include "MainViewSample.h"
-#include "ui_screennotify.h"
+#include "main/MainViewSample.h"
+#include "screennotify/ui_screennotify.h"
#include "components/root_view.h"
#include "notification_manager.h"
-#include "DialBinTypesV2.h"
+#include "main/DialBinTypesV2.h"
+#include "hal_tick.h"
+#include "abilityms_slite_client.h"
#ifdef __cplusplus
extern "C" {
#endif
static uint32_t g_back_to_home_interval = 5;
+static uint32_t g_back_to_pre_slice = 5;
+static uint32_t g_last_aod_on_stamp = 0;
+static std::string g_pre_bundle_name = "com.huawei.launcher";
+static bool g_is_native = true;
// 需要屏蔽掉的slice,ignore_slice_ids数组中的slice灭屏超时后不会调转到默认界面
uint16_t ignore_slice_ids[] = {
}
}
-static void GuiEnterAod(bool entry)
+static void EnterAod()
{
using namespace OHOS;
- DisplayState newState = entry ? DisplayState::AOD : DisplayState::NORMAL;
-
- uint16_t current_slice_id = NativeAbility::GetInstance().GetCurSliceId();
- for (uint16_t i = 0; i < sizeof(ignore_slice_ids) / sizeof(uint16_t); i++) {
- if (ignore_slice_ids[i] == current_slice_id) {
- return;
+ g_last_aod_on_stamp = HALTick::GetInstance().GetTime();
+ if (NativeAbility::GetInstance().GetNativeAbilityState() == STATE_ACTIVE) {
+ g_is_native = true;
+ } else {
+ ElementName *elementName = AbilityMsClient::GetInstance().GetTopAbility();
+ if (elementName != nullptr) {
+ g_pre_bundle_name = elementName->bundleName;
}
+ g_is_native = false;
}
- if (NativeAbility::GetInstance().GetNativeAbilityState() == STATE_ACTIVE) {
- if (newState == DisplayState::AOD) {
- NativeAbility::GetInstance().ChangeSlice(VIEW_AOD);
- } else {
- NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);
+ NativeAbility::GetInstance().ChangeSlice(VIEW_AOD);
+}
+
+static void ExitAod()
+{
+ using namespace OHOS;
+ uint32_t aodDur = HALTick::GetInstance().GetElapseTime(g_last_aod_on_stamp) / 1000; // 1000: 1s = 1000ms
+ if (aodDur > g_back_to_pre_slice) {
+ uint16_t sliceId = NativeAbility::GetInstance().GetPreTargetId() & SLICE_MASK;
+ for (uint16_t i = 0; i < sizeof(ignore_slice_ids) / sizeof(uint16_t); i++) {
+ if (ignore_slice_ids[i] == sliceId) {
+ NativeAbility::GetInstance().ChangeSlice(sliceId);
+ return;
+ }
}
+ NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);
+ } else {
+ if (!g_is_native) {
+ Want *want = new Want();
+ memset_s(want, sizeof(Want), 0, sizeof(Want));
+ ElementName startElement = {};
+ startElement.abilityName = "default";
+ startElement.bundleName = const_cast<char *>(g_pre_bundle_name.c_str());
+ startElement.deviceId = nullptr;
+ SetWantElement(want, startElement);
+ StartAbility(want);
+ ClearWant(want);
+ delete want;
+ return;
+ }
+ uint32_t preId = NativeAbility::GetInstance().GetPreTargetId();
+ NativeAbility::GetInstance().SwitchSlice(preId & SLICE_MASK, preId >> PAGE_OFFSET);
}
-};
+}
void notify_screen_on_event(void)
{
void notify_screen_aod_on_event(void)
{
- GuiEnterAod(true);
+ EnterAod();
}
void notify_screen_aod_off_event(void)
{
- GuiEnterAod(false);
+ ExitAod();
}
void set_back_to_home_interval(uint32_t time_sec)
return g_back_to_home_interval;
}
+void set_back_to_pre_slice_interval(uint32_t time_sec)
+{
+ g_back_to_pre_slice = time_sec;
+}
+
+uint32_t get_back_to_pre_slice_interval(void)
+{
+ return g_back_to_pre_slice;
+}
+
void registerNotifyScreenStatus(ScreenStatusNotifyCallback callback)
{
if (callback != nullptr) {
#include <unistd.h>
#include "kvstore_env.h"
#include "kv_store.h"
-#include "ScreenModels.h"
+#include "screensetting/ScreenModels.h"
#include "common/image_cache_manager.h"
#include "UiConfig.h"
#include "ui_resource_image.h"
{
#if !defined(_WIN32)
#ifndef XTS_SUPPORT
- int ret = UtilsSetEnv("/user/system");
+ int ret = UtilsSetEnv("/user");
WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "UtilsSetEnv /user ret = %d", ret);
#endif
#else
* Create: 2021-09-18
*/
-#include "SetCardAdapter.h"
+#include "set_card/SetCardAdapter.h"
namespace OHOS {
SetCardAdapter::SetCardAdapter() {}
\r
#include "UiConfig.h"\r
#include <string>\r
-#include "SetCardDeleteView.h"\r
+#include "set_card/SetCardDeleteView.h"\r
#include "wearable_log.h"\r
\r
namespace OHOS {\r
-#include "SetCardItem.h"\r
-#include "SetCardPresenter.h"\r
+#include "set_card/SetCardItem.h"\r
+#include "set_card/SetCardPresenter.h"\r
#include "wearable_log.h"\r
\r
namespace OHOS {\r
* Create: 2021-11-23
*/
-#include "SetCardModel.h"
-#include "MainModel.h"
+#include "set_card/SetCardModel.h"
+#include "main/MainModel.h"
#include "kv_store.h"
#include "securec.h"
\r
#include "UiConfig.h"\r
#include <string>\r
-#include "SetCardNoCardView.h"\r
+#include "set_card/SetCardNoCardView.h"\r
#include "wearable_log.h"\r
\r
namespace OHOS {\r
* Create: 2021-11-23
*/
-#include "SetCardView.h"
-#include "SetCardModel.h"
-#include "SetCardPresenter.h"
+#include "set_card/SetCardView.h"
+#include "set_card/SetCardModel.h"
+#include "set_card/SetCardPresenter.h"
#include "hal_tick.h"
#include "NativeRegisterManager.h"
*/
#include <string>
-#include "SetCardView.h"
-#include "SetCardPresenter.h"
+#include "set_card/SetCardView.h"
+#include "set_card/SetCardPresenter.h"
namespace OHOS {
SetCardView::SetCardView():contentList_(UIList::HORIZONTAL)
+++ /dev/null
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SetDesktopPresenter.h
- * Author:
- * Create: 2021-11-23
- */
-
-#ifndef SET_DESKTOP_PRESENTER_H
-#define SET_DESKTOP_PRESENTER_H
-
-#include "Presenter.h"
-#include "components/ui_view.h"
-
-namespace OHOS {
-static const char *SET_DESKTOP_LIST = "setdesktopList";
-static const char *SET_DESKTOP_HEXAGONS = "setdesktopHexagons";
-static const char *SET_DESKTOP_FOOTBALL = "setdesktopFootball";
-static const char *SET_DESKTOP_WATERFALL = "setdesktopWaterfall";
-
-class SetDesktopView;
-class SetDesktopModel;
-class SetDesktopPresenter : public Presenter<SetDesktopView>,
- public UIView::OnClickListener,
- public UIView::OnDragListener {
-public:
- SetDesktopPresenter();
- ~SetDesktopPresenter() override;
- bool OnClick(UIView &view, const ClickEvent &event) override;
- bool OnDrag(UIView& view, const DragEvent& event) override;
- uint8_t GetCurrentStyle(void);
-private:
-};
-}
-
-#endif // SET_DESKTOP_PRESENTER_H
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SetDesktopView.h
- * Author:
- * Create: 2021-11-23
- */
-
-#ifndef SET_DESKTOP_VIEW_H
-#define SET_DESKTOP_VIEW_H
-
-#include "View.h"
-#include "components/ui_scroll_view.h"
-#include "components/ui_view_group.h"
-#include "components/ui_label.h"
-#include "components/ui_image_view.h"
-#include "components/ui_toggle_button.h"
-#include "ChangeSliceListener.h"
-#include "UiConfig.h"
-
-namespace OHOS {
-class SetDesktopPresenter;
-
-class SetDesktopView : public View<SetDesktopPresenter> {
-public:
- SetDesktopView();
- ~SetDesktopView() override;
-
- static SetDesktopView *GetInstance()
- {
- static SetDesktopView instance;
- return &instance;
- }
-
- void OnStart() override;
- void UpdateSelectedStyle(uint8_t selectedStyle);
- uint8_t GetCurrentSelectedStyle(void);
-
-private:
- void InitFootballItem();
- void InitWaterfallItem();
- UIScrollView *scrollview{nullptr};
- UILabel titleText;
- UIToggleButton hexagonsBtn;
- UIToggleButton listBtn;
- UIToggleButton footballBtn_;
- UIToggleButton waterfallBtn_;
- UIImageView hexagonsImage;
- UIImageView listImage;
- UIImageView footballImage_;
- UIImageView waterfallImage_;
- UILabel listText;
- UILabel hexagonsText;
- UILabel footballText_;
- UILabel waterfallText_;
-};
-}
-#endif // SET_DESKTOP_VIEW_H
+++ /dev/null
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SettingPresenter.cpp
- * Author:
- * Create: 2021-11-23
- */
-
-#include "SetDesktopView.h"
-#include "SetDesktopModel.h"
-#include "SetDesktopPresenter.h"
-#include "NativeRegisterManager.h"
-
-namespace OHOS {
-
-REGIST_SLICE(VIEW_SET_DESKTOP, SetDesktopView, SetDesktopPresenter);
-
- SetDesktopPresenter::SetDesktopPresenter()
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDesktopPresenter::SetDesktopPresenter");
- }
-
- SetDesktopPresenter::~SetDesktopPresenter() {}
-
- bool SetDesktopPresenter::OnDrag(UIView& view, const DragEvent& event)
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDesktopPresenter::OnDrag");
- UNUSED(view);
- if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&
- (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingPresenter::OnDrag ChangeSlice");
- uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();
- NativeAbility::GetInstance().ChangeSlice(preSlice);
- }
- return false;
- }
-
- bool SetDesktopPresenter::OnClick(UIView &view, const ClickEvent &event)
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDesktopPresenter::OnClick");
- if (strcmp(view.GetViewId(), SET_DESKTOP_HEXAGONS) == 0) {
- SetDesktopModel::GetInstance().SetDesktopStyle(DesktopStyle::HEXAGONS_STYLE);
- } else if (strcmp(view.GetViewId(), SET_DESKTOP_LIST) == 0) {
- SetDesktopModel::GetInstance().SetDesktopStyle(DesktopStyle::APPLIST_STYLE);
- } else if (strcmp(view.GetViewId(), SET_DESKTOP_FOOTBALL) == 0) {
- SetDesktopModel::GetInstance().SetDesktopStyle(DesktopStyle::FOOTBALL_STYLE);
- } else if (strcmp(view.GetViewId(), SET_DESKTOP_WATERFALL) == 0) {
- SetDesktopModel::GetInstance().SetDesktopStyle(DesktopStyle::WATERFALL_STYLE);
- }
- uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();
- NativeAbility::GetInstance().ChangeSlice(preSlice);
- return true;
- }
-
- uint8_t SetDesktopPresenter::GetCurrentStyle(void)
- {
- DesktopStyle style = SetDesktopModel::GetInstance().GetDesktopStyle();
- if (style == HEXAGONS_STYLE) {
- return 1; // 1: hexagons style enum index
- } else if (style == FOOTBALL_STYLE) {
- return 2; // 2: football style enum index
- } else if (style == WATERFALL_STYLE) {
- return 3; // 3: waterfall style enum index
- }
- return 0;
- }
-}
* Create: 2021-11-23
*/
#include <algorithm>
-#include "MainModel.h"
-#include "SetDialModel.h"
+#include "main/MainModel.h"
+#include "set_dial/SetDialModel.h"
#include "kv_store.h"
#include "securec.h"
#include "dirent.h"
-#include "DialBinParser.h"
+#include "main/DialBinParser.h"
#include "wearable_log.h"
namespace OHOS {
return -1;
}
DialPreviewInfo preInfo{0};
- bool ret = DialBinParserManager::GetInstance()->GetDialPreviewInfo(fp, &preInfo);
+ bool ret = DialBinParserManager::GetInstance()->GetDialPreviewInfo(dialFullName, fp, &preInfo);
if (!ret) {
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetDialPreviewInfo %s fail",
dialFullName.c_str());
* Create: 2021-11-23
*/
-#include "SetDialView.h"
-#include "SetDialModel.h"
-#include "SetDialPresenter.h"
+#include "set_dial/SetDialView.h"
+#include "set_dial/SetDialModel.h"
+#include "set_dial/SetDialPresenter.h"
#include "hal_tick.h"
#include "NativeRegisterManager.h"
namespace OHOS {
+namespace {
+SetDialPresenter *g_presenter = nullptr;
+} // anonymous namespace
REGIST_SLICE(VIEW_SET_DIAL, SetDialView, SetDialPresenter);
model = &SetDialModel::GetInstance();
model->LoadAllDial();
ResetTickTimer();
+ g_presenter = this;
+ specificSetting.dialFlag = 0;
+ specificSetting.dialId = 0;
}
SetDialPresenter::~SetDialPresenter()
{
+ g_presenter = nullptr;
+ }
+
+ SetDialPresenter *SetDialPresenter::GetCurrentInstance()
+ {
+ return g_presenter;
+ }
+
+ void SetDialPresenter::SpecifyDialSetting(const DialSetting &setting)
+ {
+ isSpecific = true;
+ specificSetting = setting;
}
void SetDialPresenter::OnClickAction(void)
void SetDialPresenter::OnStop()
{
model->ClearDialInfo();
+ if (isSpecific) {
+ MainModel::GetInstance().GetDialSetting() = specificSetting;
+ MainModel::GetInstance().AddDialSetting(specificSetting);
+ }
}
void SetDialPresenter::ResetTickTimer(void)
*/
#include <string>
-#include "SetDialView.h"
-#include "SetDialPresenter.h"
-#include "SetDialStyleModel.h"
+#include "set_dial/SetDialView.h"
+#include "set_dial/SetDialPresenter.h"
+#include "set_dial_style/SetDialStyleModel.h"
namespace OHOS {
SetDialView::SetDialView()
* Create: 2024-06-06
*/
-#include "SetDialStyleModel.h"
+#include "set_dial_style/SetDialStyleModel.h"
#include "kv_store.h"
namespace OHOS {
* Create: 2024-06-06
*/
-#include "SetDialStyleView.h"
-#include "SetDialStyleModel.h"
-#include "SetDialStylePresenter.h"
+#include "set_dial_style/SetDialStyleView.h"
+#include "set_dial_style/SetDialStyleModel.h"
+#include "set_dial_style/SetDialStylePresenter.h"
#include "NativeRegisterManager.h"
namespace OHOS {
* Create: 2024-06-06
*/
-#include "SetDialStyleView.h"
-#include "SetDialStyleModel.h"
-#include "SetDialStylePresenter.h"
-#include "MainModel.h"
+#include "set_dial_style/SetDialStyleView.h"
+#include "PageTransitionMgr.h"
+#include "set_dial_style/SetDialStyleModel.h"
+#include "set_dial_style/SetDialStylePresenter.h"
+#include "main/MainModel.h"
namespace OHOS {
SetDialStyleView::SetDialStyleView()
{
GetRootContainer()->SetDraggable(true);
GetRootContainer()->SetTouchable(true);
- if (PageTransitionMgr::GetInstance().GetTopSlideBackImage() == nullptr) { // support default slide back firstly
+ if (!PageTransitionMgr::GetInstance().CanSlideBack()) { // support default slide back firstly
GetRootContainer()->SetOnDragListener(presenter_);
}
const int16_t BTN_HEIGHT = 55;
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: ota local update\r
+ * Author: wangle\r
+ * Create: 2025-5-6\r
+ */\r
+#include "set_ota/OTACommon.h"\r
+#include "set_ota/OTAModel.h"\r
+#include "set_ota/OTAPresenter.h"\r
+#include "tcxo.h"\r
+#include "upg.h"\r
+#include "upg_porting.h"\r
+#include "upg_definitions.h"\r
+#include "upg_common_porting.h"\r
+#include "wearable_log.h"\r
+\r
+\r
+namespace OHOS {\r
+OTAModel::OTAModel()\r
+{\r
+ isIdel = true;\r
+ wait.wait = nullptr;\r
+ if (osal_wait_init(&wait) != 0) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ota osal_wait_init error");\r
+ return;\r
+ }\r
+ task = osal_kthread_create(&OTAModel::OSALKthreadCallback, this, "ota_model", MODLE_THREAD_STACK_SIZE);\r
+ if (task == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ota osal_wait_init error");\r
+ osal_wait_destroy(&wait);\r
+ return;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "model init succ");\r
+}\r
+OTAModel::~OTAModel()\r
+{\r
+ if (task != nullptr) {\r
+ osal_kthread_destroy(task, 0);\r
+ }\r
+ if (wait.wait != nullptr) {\r
+ osal_wait_destroy(&wait);\r
+ }\r
+}\r
+\r
+int OTAModel::WaitCondition(const void *data)\r
+{\r
+ OTAModel *model = (OTAModel *)data;\r
+ return model->isIdel ? 0 : 1; // 不空闲说明有任务\r
+}\r
+\r
+int OTAModel::OSALKthreadCallback(void *data)\r
+{\r
+ OTAModel *model = (OTAModel *)data;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "model thread... callback");\r
+ while (true) { // osal_kthread_destroy规定 线程销毁前必须一直存在\r
+ osal_wait_interruptible(&model->wait, &OTAModel::WaitCondition, data);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "model thread... wait done");\r
+ model->SwitchTask();\r
+ }\r
+ return 0;\r
+}\r
+bool OTAModel::ModelRunTask(TaskType tasktype, void *taskdata)\r
+{\r
+ if (!isIdel)\r
+ return false;\r
+ type = tasktype;\r
+ data = taskdata;\r
+ isIdel = false;\r
+ osal_wait_wakeup(&wait);\r
+ return true;\r
+}\r
+void OTAModel::SwitchTask()\r
+{\r
+ switch (type) {\r
+ case TaskType::UpdateInfo:\r
+ UpdateInfo(data);\r
+ isIdel = true;\r
+ break;\r
+ case TaskType::LocalUpdate:\r
+ LocalUpdate(data);\r
+ isIdel = true;\r
+ break;\r
+ default:\r
+ break; // 不处理\r
+ }\r
+}\r
+\r
+void OTAModel::UpdateInfo(void *data)\r
+{\r
+ uint32_t total_size = 0;\r
+ do {\r
+ FILE *fp = fopen(upg_get_pkg_file_path(), "rb");\r
+ if (fp == nullptr) {\r
+ break;\r
+ }\r
+ fseek(fp, 0L, SEEK_END);\r
+ total_size = ftell(fp);\r
+ fclose(fp);\r
+ } while (false);\r
+ presenter_->SetPackageInfo(upg_get_pkg_file_path(), total_size);\r
+}\r
+void OTAModel::LocalUpdate(void *data)\r
+{\r
+ upg_prepare_info_t info{((LocalUpdateData *)data)->fileSize};\r
+\r
+ // update 准备工作\r
+ presenter_->SetUpdateProgress("upg_prepare", LOCAL_UPDATE_PROGRESS_5);\r
+ errcode_t ret = uapi_upg_prepare(&info);\r
+ if (ret != ERRCODE_SUCC) {\r
+ presenter_->SetErrorMessage("uapi_upg_prepare error");\r
+ return;\r
+ }\r
+\r
+ // update 申请升级\r
+ presenter_->SetUpdateProgress("upg_request_upgrade", LOCAL_UPDATE_PROGRESS_25);\r
+ ret = uapi_upg_request_upgrade(false);\r
+ if (ret != ERRCODE_SUCC) {\r
+ presenter_->SetErrorMessage("uapi_upg_request_upgrade error");\r
+ return;\r
+ }\r
+ // 备份\r
+ presenter_->SetUpdateProgress("upg_image_backups", LOCAL_UPDATE_PROGRESS_40);\r
+ ret = upg_image_backups_update();\r
+ if (ret != ERRCODE_SUCC) {\r
+ presenter_->SetErrorMessage("upg_image_backups_update error");\r
+ return;\r
+ }\r
+\r
+ // update 开始升级\r
+ presenter_->SetUpdateProgress("upg_start", LOCAL_UPDATE_PROGRESS_50);\r
+ ret = uapi_upg_start();\r
+ if (ret != ERRCODE_SUCC) {\r
+ presenter_->SetErrorMessage("uapi_upg_start error");\r
+ return;\r
+ }\r
+ presenter_->SetUpdateProgress("reboot", LOCAL_UPDATE_PROGRESS_100);\r
+ DelayRebootFor5S();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "update");\r
+}\r
+void OTAModel::DelayRebootFor5S()\r
+{\r
+ char temp[60] = "";\r
+ for (int i = 5; i > 0; i--) {\r
+ sprintf_s(temp, sizeof(temp), "%ds后系统将进行重启\r\n完成后续升级操作", i);\r
+ presenter_->SetMessage(temp);\r
+ osal_msleep(SLEEP_TIME_S);\r
+ }\r
+ upg_reboot();\r
+}\r
+} // namespace OHOS\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: ota local update\r
+ * Author: wangle\r
+ * Create: 2025-5-6\r
+ */\r
+#include "AppViewIDs.h"\r
+#include "NativeRegisterManager.h"\r
+#include "gfx_utils/graphic_math.h"\r
+#include "set_ota/OTACommon.h"\r
+#include "set_ota/OTAView.h"\r
+#include "set_ota/OTAPresenter.h"\r
+#include "set_ota/OTAModel.h"\r
+#include "main/HealthModel.h"\r
+#include "uiservice/ui_service.h"\r
+\r
+namespace OHOS {\r
+\r
+REGIST_SLICE(VIEW_SET_OTA, OTAView, OTAPresenter);\r
+\r
+void OTAPresenter::OnStart()\r
+{\r
+ if (model_ == nullptr) {\r
+ Attach(new OTAModel);\r
+ }\r
+ if (model_ != nullptr) {\r
+ model_->Attach(this);\r
+ }\r
+ view_->SetUpdateDisable();\r
+ view_->SetMessage("正在获取升级文件信息...");\r
+ view_->SetProgress(0);\r
+ model_->ModelRunTask(TaskType::UpdateInfo, nullptr);\r
+}\r
+void OTAPresenter::OnStop()\r
+{\r
+ if (model_ != nullptr) {\r
+ delete model_;\r
+ model_ = nullptr;\r
+ }\r
+}\r
+bool OTAPresenter::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ if (strcmp(view.GetViewId(), "update") == 0) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OTA OnClick... update");\r
+ // 调用model升级方法\r
+ model_->ModelRunTask(TaskType::LocalUpdate, nullptr);\r
+ view_->SetMessage("正在升级...");\r
+ view_->SetProgress(0);\r
+ view_->SetUpdateDisable();\r
+ updateEnable = true; // 升级中, 禁止右滑退出\r
+ SaveSystemScreen(); // 升级中, 设置屏幕常亮\r
+ }\r
+ return true;\r
+}\r
+bool OTAPresenter::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OTA OnDrag...");\r
+ if (updateEnable && event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {\r
+ int16_t deltaX = event.GetDeltaX();\r
+ int16_t deltaY = event.GetDeltaY();\r
+ if (MATH_ABS(deltaX) >= MATH_ABS(deltaY) && MATH_ABS(deltaX) > SLIDING_LENGTH) {\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST, TransitionType::TRANSITION_ZOOM);\r
+ }\r
+ }\r
+ return true;\r
+}\r
+\r
+void OTAPresenter::SetPackageInfo(const char *filePath, uint32_t fileSize)\r
+{\r
+ char tempBuffer[60] = "";\r
+ updateFilePath = filePath;\r
+ updateFileSize = fileSize;\r
+ updateEnable = true;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OTA SetPackageInfo");\r
+ if (fileSize != 0) {\r
+ double tempSizeMB = 1.0 * updateFileSize / 1024 / 1024;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "calc");\r
+ sprintf_s(tempBuffer, sizeof(tempBuffer), "升级文件:%s\r\n大小:%.2lfMB", filePath, tempSizeMB);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "sprintf");\r
+ view_->SetUpdateEnable();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "View setEnable");\r
+ view_->SetMessage(tempBuffer);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "view SetMessage");\r
+ } else {\r
+ sprintf_s(tempBuffer, sizeof(tempBuffer), "升级文件:%s\r\n不存在或已损坏", filePath);\r
+ view_->SetUpdateDisable();\r
+ view_->SetMessage(tempBuffer);\r
+ }\r
+}\r
+\r
+void OTAPresenter::SetUpdateProgress(const char *message, uint8_t progress)\r
+{\r
+ char tempBuffer[60] = "";\r
+ sprintf_s(tempBuffer, sizeof(tempBuffer), "正在升级...%u%%...\r\n%s", progress, message);\r
+ view_->SetMessage(tempBuffer);\r
+ view_->SetProgress(progress);\r
+}\r
+void OTAPresenter::SetErrorMessage(const char *message)\r
+{\r
+ char tempBuffer[60] = "";\r
+ sprintf_s(tempBuffer, sizeof(tempBuffer), "升级失败...\r\n%s", message);\r
+ view_->SetMessage(tempBuffer);\r
+ view_->SetUpdateEnable(); // 升级失败后, 允许重新升级\r
+ updateEnable = false; // 升级失败后, 允许右滑退出\r
+ BackSystemScreen(); // 升级失败后, 回滚屏幕亮屏设置\r
+}\r
+void OTAPresenter::SetMessage(const char *message)\r
+{\r
+ view_->SetMessage(message);\r
+}\r
+void OTAPresenter::SaveSystemScreen()\r
+{\r
+ briScrStatus = HealthModel::GetInstance()->GetBriScrStatus();\r
+ if (briScrStatus == 0) { // 若系统常亮未打开则打开系统常亮\r
+ ScreenOffEnable(0);\r
+ HealthModel::GetInstance()->UpdateBriScrStatus(1);\r
+ }\r
+}\r
+void OTAPresenter::BackSystemScreen()\r
+{\r
+ if (briScrStatus == 0) { // 若系统原本未处于常亮则恢复\r
+ ScreenOffEnable(1);\r
+ HealthModel::GetInstance()->UpdateBriScrStatus(0);\r
+ }\r
+}\r
+} // namespace OHOS
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: ota local update\r
+ * Author: wangle\r
+ * Create: 2025-5-6\r
+ */\r
+#include "UiConfig.h"\r
+#include "set_ota/OTACommon.h"\r
+#include "set_ota/OTAView.h"\r
+#include "set_ota/OTAPresenter.h"\r
+#include "wearable_log.h"\r
+\r
+namespace OHOS {\r
+void OTAView::OnStart()\r
+{\r
+ InitMessageCtrl();\r
+ InitProgressCtrl();\r
+ InitUpdateCtrl();\r
+ AddCtrlToView();\r
+}\r
+void OTAView::InitMessageCtrl()\r
+{\r
+ if (message == nullptr) {\r
+ message = new UILabel();\r
+ }\r
+ message->SetPosition(VIEW_MESSAGE_X, VIEW_MESSAGE_Y);\r
+ message->Resize(VIEW_MESSAGE_W, VIEW_MESSAGE_H);\r
+ message->SetViewId("message");\r
+ message->SetStyle(STYLE_BACKGROUND_OPA, 0xff);\r
+ message->SetStyle(STYLE_TEXT_FONT, VIEW_MESSAGE_FONT);\r
+ message->SetStyle(STYLE_LINE_SPACE, 0);\r
+\r
+ message->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);\r
+ message->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ message->SetRollSpeed(0);\r
+ message->SetFont(DEFAULT_VECTOR_FONT_FILENAME, VIEW_MESSAGE_FONT);\r
+}\r
+void OTAView::InitProgressCtrl()\r
+{\r
+ if (progress == nullptr) {\r
+ progress = new UIBoxProgress();\r
+ }\r
+ progress->SetViewId("progress");\r
+ progress->SetDirection(UIBoxProgress::Direction::DIR_LEFT_TO_RIGHT);\r
+ progress->SetPosition(VIEW_PROGRESS_X, VIEW_PROGRESS_Y, VIEW_PROGRESS_W, VIEW_PROGRESS_H);\r
+ progress->SetValue(0);\r
+ progress->SetBackgroundStyle(STYLE_BACKGROUND_COLOR, Color::Red().full);\r
+ progress->SetForegroundStyle(STYLE_BACKGROUND_COLOR, Color::Green().full);\r
+ progress->SetStyle(STYLE_BORDER_COLOR, Color::Yellow().full);\r
+ progress->SetStep(1);\r
+ progress->EnableBackground(true);\r
+}\r
+void OTAView::InitUpdateCtrl()\r
+{\r
+ if (update == nullptr) {\r
+ update = new UILabelButton();\r
+ }\r
+ update->SetPosition(VIEW_UPDATE_X, VIEW_UPDATE_Y);\r
+ update->Resize(VIEW_UPDATE_W, VIEW_UPDATE_H);\r
+ update->SetViewId("update");\r
+ update->SetText("升级");\r
+ update->SetFont(DEFAULT_VECTOR_FONT_FILENAME, VIEW_UPDATE_FONT);\r
+ update->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);\r
+ update->SetOnClickListener(presenter_);\r
+}\r
+void OTAView::AddCtrlToView()\r
+{\r
+ if (GetRootContainer() == nullptr)\r
+ return;\r
+ message->SetVisible(true);\r
+ progress->SetVisible(true);\r
+ update->SetVisible(true);\r
+ GetRootContainer()->Add(message);\r
+ GetRootContainer()->Add(progress);\r
+ GetRootContainer()->Add(update);\r
+ GetRootContainer()->SetTouchable(true); // 添加滑动响应\r
+ GetRootContainer()->SetDraggable(true);\r
+ GetRootContainer()->SetOnDragListener(presenter_);\r
+}\r
+void OTAView::OnStop()\r
+{\r
+ DeInitMessageCtrl();\r
+ DeInitProgressCtrl();\r
+ DeInitUpdateCtrl();\r
+}\r
+void OTAView::DeInitMessageCtrl()\r
+{\r
+ if (message != nullptr) {\r
+ delete message;\r
+ message = nullptr;\r
+ }\r
+}\r
+void OTAView::DeInitProgressCtrl()\r
+{\r
+ if (progress != nullptr) {\r
+ delete progress;\r
+ progress = nullptr;\r
+ }\r
+}\r
+void OTAView::DeInitUpdateCtrl()\r
+{\r
+ if (update != nullptr) {\r
+ delete update;\r
+ update = nullptr;\r
+ }\r
+}\r
+void OTAView::SetUpdateEnable()\r
+{\r
+ if (update == nullptr)\r
+ return;\r
+ update->Enable();\r
+}\r
+void OTAView::SetUpdateDisable()\r
+{\r
+ if (update == nullptr)\r
+ return;\r
+ update->Disable();\r
+}\r
+\r
+void OTAView::SetMessage(const char *msg)\r
+{\r
+ if (message == nullptr)\r
+ return;\r
+ message->SetText(msg);\r
+}\r
+void OTAView::SetProgress(uint8_t progressNum)\r
+{\r
+ if (progress == nullptr)\r
+ return;\r
+ progress->SetValue(progressNum);\r
+}\r
+\r
+} // namespace OHOS\r
+++ /dev/null
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SettingPresenter.h
- * Author:
- * Create: 2021-11-23
- */
-
-#ifndef SETTING_PRESENTER_H
-#define SETTING_PRESENTER_H
-
-#include "Presenter.h"
-#include "components/ui_view.h"
-#include "SettingAdapter.h"
-
-namespace OHOS {
-class SettingView;
-class SettingModel;
-class SettingAdapter;
-class SettingPresenter : public Presenter<SettingView>,
- public UIView::OnClickListener,
- public UIView::OnDragListener {
-public:
- SettingPresenter();
- ~SettingPresenter() override;
-
- void OnStart() override;
- bool OnClick(UIView &view, const ClickEvent &event) override;
- bool OnDrag(UIView& view, const DragEvent& event) override;
-private:
- SettingModel *settingModel;
-};
-}
-
-#endif // SETTING_PRESENTER_H
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SettingView.h
- * Author:
- * Create: 2021-11-23
- */
-
-#ifndef SETTING_VIEW_H
-#define SETTING_VIEW_H
-
-#include "View.h"
-#include "components/root_view.h"
-#include "components/ui_view_group.h"
-#include "components/ui_scroll_view.h"
-#include "components/ui_label.h"
-#include "components/ui_list.h"
-#include "SettingAdapter.h"
-#include "ChangeSliceListener.h"
-namespace OHOS {
-class SettingPresenter;
-class SettingView : public View<SettingPresenter> {
-public:
- SettingView();
- ~SettingView() override;
-
- void OnStart() override;
- void RefreshSettingsList(const SettingItem* item, uint8_t count);
-private:
- SettingAdapter *listAdapter{nullptr};
- UIScrollView *scrollView{nullptr};
- UIList *contentList{nullptr};
- UILabel *title{nullptr};
-};
-}
-#endif // SETTING_VIEW_H
\ No newline at end of file
/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SettingModel.cpp
- * Author:
- * Create: 2021-11-23
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SetDesktopModel
+ * Author: Hisi Graphic Team
+ * Created: 2025-4
*/
-#include "SetDesktopModel.h"
+#include "settings/SetDesktopModel.h"
#include "kv_store.h"
#include "securec.h"
namespace OHOS {
static const int STYLE_VALUE_LEN = 32;
- SetDesktopModel::SetDesktopModel() {}
-
- SetDesktopModel::~SetDesktopModel() {}
SetDesktopModel &SetDesktopModel::GetInstance()
{
* Create: 2021-11-23
*/
-#include "SettingAdapter.h"
+#include "settings/SettingAdapter.h"
namespace OHOS {
SettingAdapter::SettingAdapter() {}
/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SetDesktopView.cpp
- * Author:
- * Create: 2021-11-23
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingDesktopPage
+ * Author: Hisi Graphic Team
+ * Created: 2025-4
*/
+#include "settings/SettingDesktopPage.h"
#include <string>
-#include "SetDesktopView.h"
-#include "SetDesktopPresenter.h"
#include "components/ui_scroll_view_nested.h"
+#include "common/screen.h"
+#include "wearable_log.h"
+#include "NativeAbility.h"
+#include "PageTransitionMgr.h"
+#include "SlicePageFactory.h"
+#include "settings/SettingView.h"
namespace OHOS {
-SetDesktopView::SetDesktopView()
+static const char *SET_DESKTOP_LIST = "setdesktopList";
+static const char *SET_DESKTOP_HEXAGONS = "setdesktopHexagons";
+static const char *SET_DESKTOP_FOOTBALL = "setdesktopFootball";
+static const char *SET_DESKTOP_WATERFALL = "setdesktopWaterfall";
+
+REGIST_SLICE_PAGE(VIEW_SETTING, SETTING_PAGES::SETTING_DESKTOP_PAGE, SettingDesktopPage, false);
+SettingDesktopPage::SettingDesktopPage()
{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDesktopView::SetDesktopView");
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingDesktopPage::SettingDesktopPage");
}
-SetDesktopView::~SetDesktopView()
+SettingDesktopPage::~SettingDesktopPage()
{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDesktopView::~SetDesktopView");
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingDesktopPage::~SettingDesktopPage");
if (scrollview != nullptr) {
scrollview->RemoveAll();
delete scrollview;
}
}
-void SetDesktopView::OnStart()
+void SettingDesktopPage::OnStart(void *data)
{
- GetRootContainer()->SetDraggable(true);
- if (PageTransitionMgr::GetInstance().GetTopSlideBackImage() == nullptr) { // support default slide back firstly
- GetRootContainer()->SetOnDragListener(presenter_);
+ if (GetBackDragListener() == nullptr) { // support default slide back firstly
+ GetSlicePageContainer()->SetOnDragListener(this);
}
- GetRootContainer()->SetTouchable(true);
scrollview = new UIScrollViewNested(UIAbstractScroll::HORIZONTAL);
UIScrollViewNested *nested = dynamic_cast<UIScrollViewNested*>(scrollview);
nested->SetBoundaryIntercept(DragEvent::DIRECTION_LEFT_TO_RIGHT, false);
}
scrollview->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
- AddViewToRootContainer(scrollview);
+ AddViewToPageContainer(scrollview);
titleText.SetPosition(180, 45, 260, 110);
titleText.SetText("桌面");
titleText.SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
titleText.SetFont(DEFAULT_VECTOR_FONT_FILENAME, 40);
titleText.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
- AddViewToRootContainer(&titleText);
+ AddViewToPageContainer(&titleText);
listImage.SetPosition(0, 135, 190, 190);
listImage.SetSrc(PNG_SET_DESKTOP_BG_IMAGE);
InitFootballItem();
InitWaterfallItem();
- listBtn.SetOnClickListener(presenter_);
- hexagonsBtn.SetOnClickListener(presenter_);
- footballBtn_.SetOnClickListener(presenter_);
- waterfallBtn_.SetOnClickListener(presenter_);
- UpdateSelectedStyle(presenter_->GetCurrentStyle());
+ listBtn.SetOnClickListener(this);
+ hexagonsBtn.SetOnClickListener(this);
+ footballBtn_.SetOnClickListener(this);
+ waterfallBtn_.SetOnClickListener(this);
+ UpdateSelectedStyle(SetDesktopModel::GetInstance().GetDesktopStyle());
}
-void SetDesktopView::UpdateSelectedStyle(uint8_t selectedStyle)
+void SettingDesktopPage::UpdateSelectedStyle(DesktopStyle selectedStyle)
{
hexagonsImage.SetVisible(false);
hexagonsBtn.SetState(false);
waterfallImage_.SetVisible(false);
waterfallBtn_.SetState(false);
- if (selectedStyle == 1) { // 1: select hexagons style
+ if (selectedStyle == HEXAGONS_STYLE) { // 1: select hexagons style
hexagonsImage.SetVisible(true);
hexagonsBtn.SetState(true);
- } else if (selectedStyle == 2) { // 2: select football style
+ } else if (selectedStyle == FOOTBALL_STYLE) { // 2: select football style
footballImage_.SetVisible(true);
footballBtn_.SetState(true);
- } else if (selectedStyle == 3) { // 3: select waterfall style
+ } else if (selectedStyle == WATERFALL_STYLE) { // 3: select waterfall style
waterfallImage_.SetVisible(true);
waterfallBtn_.SetState(true);
} else {
}
}
-void SetDesktopView::InitFootballItem()
+void SettingDesktopPage::InitFootballItem()
{
footballImage_.SetPosition(300, 135, 190, 190);
footballImage_.SetSrc(PNG_SET_DESKTOP_BG_IMAGE);
scrollview->Add(&footballText_);
}
-void SetDesktopView::InitWaterfallItem()
+void SettingDesktopPage::InitWaterfallItem()
{
waterfallImage_.SetPosition(450, 135, 190, 190);
waterfallImage_.SetSrc(PNG_SET_DESKTOP_BG_IMAGE);
waterfallText_.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
scrollview->Add(&waterfallText_);
}
-uint8_t SetDesktopView::GetCurrentSelectedStyle()
+
+bool SettingDesktopPage::OnDrag(UIView& view, const DragEvent& event)
{
- return presenter_->GetCurrentStyle();
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingDesktopPage::OnDrag");
+ UNUSED(view);
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&
+ (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingPresenter::OnDrag ChangeSlice");
+ uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();
+ NativeAbility::GetInstance().ChangeSlice(preSlice);
+ }
+ return false;
+}
+
+bool SettingDesktopPage::OnClick(UIView &view, const ClickEvent &event)
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingDesktopPage::OnClick");
+ if (strcmp(view.GetViewId(), SET_DESKTOP_HEXAGONS) == 0) {
+ SetDesktopModel::GetInstance().SetDesktopStyle(DesktopStyle::HEXAGONS_STYLE);
+ } else if (strcmp(view.GetViewId(), SET_DESKTOP_LIST) == 0) {
+ SetDesktopModel::GetInstance().SetDesktopStyle(DesktopStyle::APPLIST_STYLE);
+ } else if (strcmp(view.GetViewId(), SET_DESKTOP_FOOTBALL) == 0) {
+ SetDesktopModel::GetInstance().SetDesktopStyle(DesktopStyle::FOOTBALL_STYLE);
+ } else if (strcmp(view.GetViewId(), SET_DESKTOP_WATERFALL) == 0) {
+ SetDesktopModel::GetInstance().SetDesktopStyle(DesktopStyle::WATERFALL_STYLE);
+ }
+ uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();
+ NativeAbility::GetInstance().ChangeSlice(preSlice);
+ return true;
}
}
*/
#include "wearable_log.h"
-#include "SettingItemView.h"
+#include "settings/SettingItemView.h"
namespace OHOS {
static constexpr int16 SETTING_ICON_X = 20;
void SettingItemView::SetItemInfo(const SettingItem itemInfo)
{
sItemInfo = itemInfo;
- WEARABLE_LOGE("SettingItemView::SetItemInfo: %s", sItemInfo.label);
sIcon.SetSrc(itemInfo.icon);
sLabel.SetText(itemInfo.label);
sNextImage.SetVisible(itemInfo.hasSecondMenu);
sNextImage.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);
}
- AppViewId SettingItemView::GetViewId()
+ uint32_t SettingItemView::GetTargetId()
{
- return sItemInfo.viewId;
+ return sItemInfo.targetId;
}
const char* SettingItemView::GetIconId()
--- /dev/null
+/*
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.
+ * Description: SettingMainPage
+ * Author: Hisi Graphic Team
+ * Created: 2025-4
+ */
+
+#include <string>
+
+#include "settings/SettingMainPage.h"
+#include "components/ui_list_nested.h"
+#include "components/ui_scroll_view_nested.h"
+#include "NativeAbility.h"
+#include "SlicePageFactory.h"
+#include "settings/SettingItem.h"
+#include "settings/SettingPresenter.h"
+#include "settings/SettingView.h"
+#include "PageTransitionMgr.h"
+#include "settings/SetDesktopModel.h"
+#include "rebootdevice/RebootModel.h"
+#include "settings/SettingModel.h"
+
+namespace OHOS {
+REGIST_SLICE_PAGE(VIEW_SETTING, SETTING_PAGES::SETTING_MAIN_PAGE, SettingMainPage, true);
+
+static constexpr uint8_t SETTINGS_ITEM_FONT_SIZE = 40;
+static constexpr int16_t SETTINGS_RESIZE_SIZE_WIDTH = 100;
+static constexpr int16_t SETTINGS_RESIZE_SIZE_HEIGHT = 60;
+static constexpr int16_t SETTING_TITLE_POSITION_X = 187;
+static constexpr int16_t SETTING_LIST_POSITION_X = 32;
+static constexpr int16_t SETTING_LIST_POSITION_Y = 90;
+static constexpr int16_t SETTING_SCROLLBLANKSIZE = 50;
+static constexpr int16 MAX_SCR_DIS = 1000;
+static constexpr int16 LIST_POS = 20;
+static constexpr int16 SNUM_2 = 2;
+
+SettingMainPage::~SettingMainPage()
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingMainPage::~SettingMainPage");
+ if (scrollView != nullptr) {
+ scrollView->RemoveAll();
+ delete scrollView;
+ scrollView = nullptr;
+ }
+
+ if (title != nullptr) {
+ delete title;
+ title = nullptr;
+ }
+
+ if (listAdapter != nullptr) {
+ delete listAdapter;
+ listAdapter = nullptr;
+ }
+
+ if (contentList != nullptr) {
+ delete contentList;
+ contentList = nullptr;
+ }
+}
+
+void SettingMainPage::OnStart(void* data)
+{
+ title = new UILabel();
+ if (title == nullptr) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingMainPage::OnStart::title is nullptr");
+ return;
+ }
+ title->SetPosition(SETTING_TITLE_POSITION_X, 0);
+ title->SetText("设置");
+ title->Resize(SETTINGS_RESIZE_SIZE_WIDTH, SETTINGS_RESIZE_SIZE_HEIGHT);
+ title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTINGS_ITEM_FONT_SIZE);
+ title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ title->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);
+ title->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
+ title->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);
+ title->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);
+
+ contentList = new UIListNested();
+ if (contentList == nullptr) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingMainPage::OnStart::contentList is nullptr");
+ return;
+ }
+ contentList->SetPosition(SETTING_LIST_POSITION_X, SETTING_LIST_POSITION_Y);
+ contentList->Resize(HORIZONTAL_RESOLUTION, 364); // 364: height
+ contentList->SetScrollBlankSize(SETTING_SCROLLBLANKSIZE);
+ contentList->SetSelectPosition(HORIZONTAL_RESOLUTION / SNUM_2); // middle position
+ contentList->SetDraggable(true);
+ contentList->SetThrowDrag(true);
+ contentList->EnableAutoAlign(true);
+ contentList->SetMaxScrollDistance(MAX_SCR_DIS);
+
+ scrollView = new UIScrollViewNested();
+ if (scrollView == nullptr) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingMainPage::OnStart::scrollView is nullptr");
+ return;
+ }
+ scrollView->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+ scrollView->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);
+ scrollView->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);
+ scrollView->SetThrowDrag(true);
+
+ if (PageTransitionMgr::GetInstance().GetTopSlideBackImage() == nullptr) { // support default slide back firstly
+ scrollView->SetOnDragListener(this);
+ }
+ scrollView->Add(title);
+ scrollView->Add(contentList);
+ SettingModel::GetInstance().InitSettingItem();
+ AddViewToPageContainer(scrollView);
+ RefreshSettingsList(SettingModel::GetInstance().GetSettinglistItems(),
+ SettingModel::GetInstance().GetSettingListNum());
+}
+
+void SettingMainPage::RefreshSettingsList(const SettingItem* item, uint8_t count)
+{
+ listAdapter = new SettingAdapter();
+ if (listAdapter == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SettingMainPage::OnStart::listAdapter is nullptr");
+ return;
+ }
+ listAdapter->SetItemClickListener(this);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingMainPage::RefreshSettingsList");
+ for (int i = 0; i < count; i++) {
+ listAdapter->AddListItem(item[i]);
+ }
+ contentList->SetAdapter(listAdapter);
+}
+
+bool SettingMainPage::OnDrag(UIView& view, const DragEvent& event)
+{
+ UNUSED(view);
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&
+ (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingPresenter::OnDrag ChangeSlice(VIEW_APPLIST)");
+ if (SetDesktopModel::GetInstance().GetDesktopStyle() == HEXAGONS_STYLE) {
+ NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST, TransitionType::TRANSITION_BACK_TO_HEXAGONS);
+ } else if (SetDesktopModel::GetInstance().GetDesktopStyle() == WATERFALL_STYLE) {
+ NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST, TransitionType::TRANSITION_BACK_TO_WATERFALL);
+ } else {
+ NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
+ }
+ }
+ return false;
+}
+
+bool SettingMainPage::OnClick(UIView &view, const ClickEvent &event)
+{
+ UNUSED(event);
+ SettingItemView *settingItemView = static_cast<SettingItemView *>(&view);
+ uint32_t targetId = settingItemView->GetTargetId();
+ uint16_t sliceId = static_cast<uint16_t>(targetId & SLICE_MASK);
+ uint16_t pageId = static_cast<uint16_t>(targetId >> PAGE_OFFSET);
+ if (sliceId == VIEW_REBOOT) {
+ if (strstr(settingItemView->GetIconId(), "REBOOT") != nullptr) {
+ RebootModel::GetInstance()->SetSelectViewId(REBOOTDEVICE);
+ RebootModel::GetInstance()->SetExitsView(true);
+ } else {
+ RebootModel::GetInstance()->SetSelectViewId(SHUTDOWNDEVICE);
+ RebootModel::GetInstance()->SetExitsView(true);
+ }
+ }
+ if (sliceId != VIEW_SETTING) {
+ if (settingItemView->SlideBackEnabled()) {
+ NativeAbility::GetInstance().ChangeSlice(sliceId, TransitionType::TRANSITION_INVALID,
+ gSliceDefaultPriority, true);
+ } else {
+ NativeAbility::GetInstance().ChangeSlice(sliceId);
+ }
+ } else {
+ NativeAbility::GetInstance().SwitchPageInSlice(pageId, nullptr, TransitionType::TRANSITION_INVALID, true);
+ }
+ return true;
+}
+}
* Create: 2021-11-23
*/
-#include "SettingModel.h"
-#include "PullUpDownView.h"
+#include "settings/SettingModel.h"
+#include "Slice.h"
+#include "main/PullUpDownView.h"
+#include "settings/SettingView.h"
namespace OHOS {
SettingModel::SettingModel() {}
void SettingModel::InitSettingItem()
{
int index = 0;
- settings[index++] = {VIEW_BLUETOOTH_EARPHONE, PNG_BLUETOOTH_STITLE, "蓝牙耳机", true, false};
- settings[index++] = {VIEW_CONNECT_PHONE, PNG_CONNECT_PHONE_IMAGE, "连接手机", true, true};
- settings[index++] = {VIEW_REBOOT, PNG_SETTTING_REBOOT_IMAGE, "重启", true, true};
- settings[index++] = {VIEW_REBOOT, PNG_SETTTING_SHUTDOWN_IMAGE, "关机", true, true};
- settings[index++] = {VIEW_SET_DESKTOP, PNG_SETTTING_DESKTOP_IMAGE, "桌面", true, true};
- settings[index++] = {VIEW_SET_DIAL, PNG_SETTTING_DESKTOP_IMAGE, "表盘", true, false};
- settings[index++] = {VIEW_SET_CARD, PNG_SETTTING_DESKTOP_IMAGE, "卡片", true, false};
- settings[index++] = {VIEW_SET_DIAL_STYLE, PNG_SETTTING_DESKTOP_IMAGE, "表盘风格", true, true};
- settings[index++] = {VIEW_RESTORE_DEFAULTS, PNG_SETTTING_DESKTOP_IMAGE, "恢复出厂", true, true};
+ settings[index++] = {static_cast<uint32_t>(VIEW_BLUETOOTH_EARPHONE), PNG_BLUETOOTH_STITLE,
+ "蓝牙耳机", true, false};
+ settings[index++] = {static_cast<uint32_t>(VIEW_CONNECT_PHONE), PNG_CONNECT_PHONE_IMAGE, "连接手机", true, true};
+ settings[index++] = {static_cast<uint32_t>(VIEW_REBOOT), PNG_SETTTING_REBOOT_IMAGE, "重启", true, true};
+ settings[index++] = {static_cast<uint32_t>(VIEW_REBOOT), PNG_SETTTING_SHUTDOWN_IMAGE, "关机", true, true};
+ settings[index++] = {static_cast<uint32_t>(VIEW_SET_DIAL), PNG_SETTTING_DESKTOP_IMAGE, "表盘", true, false};
+ settings[index++] = {static_cast<uint32_t>(VIEW_SETTING) | (SETTING_DESKTOP_PAGE << PAGE_OFFSET),
+ PNG_SETTTING_DESKTOP_IMAGE, "桌面", true, true};
+ settings[index++] = {static_cast<uint32_t>(VIEW_SET_CARD), PNG_SETTTING_DESKTOP_IMAGE, "卡片", true, false};
+ settings[index++] = {static_cast<uint32_t>(VIEW_SET_DIAL_STYLE), PNG_SETTTING_DESKTOP_IMAGE,
+ "表盘风格", true, true};
+ settings[index++] = {static_cast<uint32_t>(VIEW_RESTORE_DEFAULTS), PNG_SETTTING_DESKTOP_IMAGE,
+ "恢复出厂", true, true};
+ settings[index++] = {static_cast<uint32_t>(VIEW_SET_OTA), PNG_SETTTING_DESKTOP_IMAGE, "OTA升级", true, true};
usedLen = index;
}
* Create: 2021-11-23
*/
-#include "SettingView.h"
-#include "SettingModel.h"
-#include "SettingPresenter.h"
-#include "RebootModel.h"
-#include "SetDesktopModel.h"
+#include "settings/SettingView.h"
+#include "settings/SettingPresenter.h"
#include "NativeRegisterManager.h"
namespace OHOS {
-
REGIST_MENU(VIEW_SETTING, SettingView, SettingPresenter, PNG_APPLIST_SETTING_IMAGE, PNG_APPLIST_DEFAULT_IMG, "设置");
-
- SettingPresenter::SettingPresenter()
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingPresenter::SettingPresenter()");
- settingModel = &SettingModel::GetInstance();
- }
-
- SettingPresenter::~SettingPresenter() {}
-
- void SettingPresenter::OnStart()
- {
- settingModel->InitSettingItem();
- if (view_ == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "view_ is nullptr!!");
- return;
- }
- const SettingItem *itemInfo = settingModel->GetSettinglistItems();
- view_->RefreshSettingsList(itemInfo, settingModel->GetSettingListNum());
- }
-
- bool SettingPresenter::OnDrag(UIView& view, const DragEvent& event)
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingPresenter::OnDrag");
- UNUSED(view);
- if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&
- (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingPresenter::OnDrag ChangeSlice(VIEW_APPLIST)");
- if (SetDesktopModel::GetInstance().GetDesktopStyle() == HEXAGONS_STYLE) {
- NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST, TransitionType::TRANSITION_BACK_TO_HEXAGONS);
- } else if (SetDesktopModel::GetInstance().GetDesktopStyle() == WATERFALL_STYLE) {
- NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST, TransitionType::TRANSITION_BACK_TO_WATERFALL);
- } else {
- NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
- }
- }
- return false;
- }
-
- bool SettingPresenter::OnClick(UIView &view, const ClickEvent &event)
- {
- UNUSED(event);
- SettingItemView *settingItemView = static_cast<SettingItemView *>(&view);
- AppViewId viewId = settingItemView->GetViewId();
- if (viewId == VIEW_REBOOT) {
- if (strstr(settingItemView->GetIconId(), "REBOOT") != nullptr) {
- RebootModel::GetInstance()->SetSelectViewId(REBOOTDEVICE);
- RebootModel::GetInstance()->SetExitsView(true);
- } else {
- RebootModel::GetInstance()->SetSelectViewId(SHUTDOWNDEVICE);
- RebootModel::GetInstance()->SetExitsView(true);
- }
- }
- if (settingItemView->SlideBackEnabled()) {
- NativeAbility::GetInstance().ChangeSlice(viewId, TransitionType::TRANSITION_INVALID,
- gSliceDefaultPriority, true);
- } else {
- NativeAbility::GetInstance().ChangeSlice(viewId);
- }
- return true;
- }
}
+++ /dev/null
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: SettingView.cpp
- * Author:
- * Create: 2021-11-23
- */
-
-#include <string>
-
-#include "SettingView.h"
-#include "SettingItem.h"
-#include "SettingPresenter.h"
-#include "components/ui_list_nested.h"
-#include "components/ui_scroll_view_nested.h"
-
-namespace OHOS {
-static constexpr uint8_t SETTINGS_ITEM_FONT_SIZE = 40;
-static constexpr int16_t SETTINGS_RESIZE_SIZE_WIDTH = 100;
-static constexpr int16_t SETTINGS_RESIZE_SIZE_HEIGHT = 60;
-static constexpr int16_t SETTING_TITLE_POSITION_X = 187;
-static constexpr int16_t SETTING_LIST_POSITION_X = 32;
-static constexpr int16_t SETTING_LIST_POSITION_Y = 90;
-static constexpr int16_t SETTING_SCROLLBLANKSIZE = 50;
-static constexpr int16 MAX_SCR_DIS = 1000;
-static constexpr int16 LIST_POS = 20;
-static constexpr int16 SNUM_2 = 2;
-
-SettingView::SettingView()
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingView::SettingView");
-}
-
-SettingView::~SettingView()
-{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingView::~SettingView");
- if (scrollView != nullptr) {
- scrollView->RemoveAll();
- delete scrollView;
- scrollView = nullptr;
- }
-
- if (title != nullptr) {
- delete title;
- title = nullptr;
- }
-
- if (listAdapter != nullptr) {
- delete listAdapter;
- listAdapter = nullptr;
- }
-
- if (contentList != nullptr) {
- delete contentList;
- contentList = nullptr;
- }
-}
-
-void SettingView::OnStart()
-{
- title = new UILabel();
- if (title == nullptr) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingView::OnStart::title is nullptr");
- return;
- }
- title->SetPosition(SETTING_TITLE_POSITION_X, 0);
- title->SetText("设置");
- title->Resize(SETTINGS_RESIZE_SIZE_WIDTH, SETTINGS_RESIZE_SIZE_HEIGHT);
- title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTINGS_ITEM_FONT_SIZE);
- title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
- title->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);
- title->SetStyle(STYLE_TEXT_COLOR, Color::White().full);
- title->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);
- title->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);
-
- contentList = new UIListNested();
- if (contentList == nullptr) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingView::OnStart::contentList is nullptr");
- return;
- }
- contentList->SetPosition(SETTING_LIST_POSITION_X, SETTING_LIST_POSITION_Y);
- contentList->Resize(HORIZONTAL_RESOLUTION, 364); // 364: height
- contentList->SetScrollBlankSize(SETTING_SCROLLBLANKSIZE);
- contentList->SetSelectPosition(HORIZONTAL_RESOLUTION / SNUM_2); // middle position
- contentList->SetDraggable(true);
- contentList->SetThrowDrag(true);
- contentList->EnableAutoAlign(true);
- contentList->SetMaxScrollDistance(MAX_SCR_DIS);
-
- scrollView = new UIScrollViewNested();
- if (scrollView == nullptr) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingView::OnStart::scrollView is nullptr");
- return;
- }
- scrollView->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
- scrollView->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);
- scrollView->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);
- scrollView->SetThrowDrag(true);
-
- if (PageTransitionMgr::GetInstance().GetTopSlideBackImage() == nullptr) { // support default slide back firstly
- scrollView->SetOnDragListener(presenter_);
- }
- scrollView->Add(title);
- scrollView->Add(contentList);
- AddViewToRootContainer(scrollView);
-}
-
-void SettingView::RefreshSettingsList(const SettingItem* item, uint8_t count)
-{
- listAdapter = new SettingAdapter();
- if (listAdapter == nullptr) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingView::OnStart::listAdapter is nullptr");
- return;
- }
- listAdapter->SetItemClickListener(presenter_);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingView::RefreshSettingsList");
- for (int i = 0; i < count; i++) {
- listAdapter->AddListItem(item[i]);
- }
- contentList->SetAdapter(listAdapter);
-}
-}
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepingDetailsPage\r
+ * Created: 2025-06-05\r
+ */\r
+#include <sys/time.h>\r
+#include <string>\r
+#include "ohos_timer.h"\r
+#include "wearable_log.h"\r
+#include "SlicePageFactory.h"\r
+#include "common/image_cache_manager.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "sleep/SleepingView.h"\r
+#include "sleep/SleepingModel.h"\r
+#include "sleep/SleepingDetailsPage.h"\r
+\r
+namespace OHOS {\r
+\r
+static constexpr int16_t SLEEPDETAIL_SLEEP_X = 97;\r
+static constexpr int16_t SLEEPDETAIL_SLEEP_Y = 31;\r
+static constexpr int16_t SLEEPDETAIL_SLEEP_WIDTH = 260;\r
+static constexpr int16_t SLEEPDETAIL_SLEEP_HEIGHT = 53;\r
+static constexpr int16_t SLEEPDETAIL_SLEEP_FONT_SIZE = 38;\r
+static constexpr int16_t SLEEPDETAIL_IMAGE1_X = 77;\r
+static constexpr int16_t SLEEPDETAIL_IMAGE1_Y = 215;\r
+static constexpr int16_t SLEEPDETAIL_SOBERINGTIME_X = 103;\r
+static constexpr int16_t SLEEPDETAIL_SOBERINGTIME_Y = 205;\r
+static constexpr int16_t SLEEPDETAIL_SOBERINGTIME_WIDTH = 48;\r
+static constexpr int16_t SLEEPDETAIL_SOBERINGTIME_HEIGHT = 29;\r
+static constexpr int16_t SLEEPDETAIL_SOBERINGTIME_FONT_SIZE = 24;\r
+static constexpr int16_t SLEEPDETAIL_IMAGE2_Y = 254;\r
+static constexpr int16_t SLEEPDETAIL_IMAGE3_Y = 291;\r
+static constexpr int16_t SLEEPDETAIL_IMAGE4_Y = 330;\r
+static constexpr int16_t SLEEPDETAIL_RAPID_Y = 244;\r
+static constexpr int16_t SLEEPDETAIL_RAPID_WIDTH = 100;\r
+static constexpr int16_t SLEEPDETAIL_RAPID_HEIGHT = 38;\r
+static constexpr int16_t SLEEPDETAIL_LIGHT_Y = 283;\r
+static constexpr int16_t SLEEPDETAIL_DEEP_Y = 322;\r
+static constexpr int16_t SLEEPDETAIL_GRAYBG_X = 62;\r
+static constexpr int16_t SLEEPDETAIL_GRAYBG_Y = 185;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEP_X = 180;\r
+static constexpr int16_t SLEEPDETAIL_ACTUAL_NORECODE_X = 96;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEP_Y = 100;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEP_WIDTH = 200;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEP_HEIGHT = 35;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEP_FONT_SIZE = 32;\r
+static constexpr int16_t SLEEPDETAIL_LABEL_WIDTH = 160;\r
+static constexpr int16_t SLEEPDETAIL_PADDING_RIGHT = 30;\r
+static constexpr int16_t SLEEPDETAIL_SOBERINGTEXT_X = 220;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEP_NORECORD_X = 179;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEP_NORECORD_Y = 110;\r
+static constexpr int16_t SLEEPDETAIL_SOBERTIMETEXT_X = 300;\r
+static constexpr int16_t SLEEPDETAIL_SOBERTIMETEXT_Y = 190;\r
+static constexpr int16_t SLEEPDETAIL_RAPIDTIMETEXT_Y = 230;\r
+static constexpr int16_t SLEEPDETAIL_LIGHTIMETEXT_Y = 270;\r
+static constexpr int16_t SLEEPDETAIL_DEEPIMETEXT_Y = 310;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEPTIMEHOURS_FONT_SIZE = 40;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEPTIMINUTES_HEIGHT = 50;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEPTIMINUTES_FONT_SIZE = 40;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALMINUTE_X = 230;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALMINUTE_Y = 116;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALHOUR_X = 135;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALHOUR_Y = 100;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALHOURTEXT_X = 170;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALMINUTETEXT_X = 280;\r
+static constexpr int16_t ACTUALHOURS_X = 140;\r
+static constexpr int16_t ACTUALHOURSTEXT_X = 180;\r
+static constexpr int16_t ACTUALMINUTESTEXT_X = 270;\r
+\r
+REGIST_SLICE_PAGE(VIEW_SLEEPING, SLEEPING_PAGES::SLEEPING_DEATIL_PAGE, SleepingDetailsPage, false);\r
+\r
+SleepingDetailsPage::SleepingDetailsPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SleepingDetailsPage::SleepingDetailsPage");\r
+}\r
+\r
+SleepingDetailsPage::~SleepingDetailsPage()\r
+{\r
+ if (group != nullptr) {\r
+ group->RemoveAll();\r
+ delete group;\r
+ group = nullptr;\r
+ }\r
+\r
+ if (detailsSleepView != nullptr) {\r
+ delete detailsSleepView;\r
+ detailsSleepView = nullptr;\r
+ }\r
+\r
+ if (sleep != nullptr) {\r
+ delete sleep;\r
+ sleep = nullptr;\r
+ }\r
+\r
+ if (actualSleepTime != nullptr) {\r
+ delete actualSleepTime;\r
+ actualSleepTime = nullptr;\r
+ }\r
+\r
+ if (actualSleepTimeHours != nullptr) {\r
+ delete actualSleepTimeHours;\r
+ actualSleepTimeHours = nullptr;\r
+ }\r
+\r
+ if (actualSleepTimeHoursText != nullptr) {\r
+ delete actualSleepTimeHoursText;\r
+ actualSleepTimeHoursText = nullptr;\r
+ }\r
+\r
+ if (actualSleepTimeMinutes != nullptr) {\r
+ delete actualSleepTimeMinutes;\r
+ actualSleepTimeMinutes = nullptr;\r
+ }\r
+\r
+ if (actualSleepTimeMinutesText != nullptr) {\r
+ delete actualSleepTimeMinutesText;\r
+ actualSleepTimeMinutesText = nullptr;\r
+ }\r
+\r
+ if (grayBg != nullptr) {\r
+ delete grayBg;\r
+ grayBg = nullptr;\r
+ }\r
+\r
+ if (image1 != nullptr) {\r
+ delete image1;\r
+ image1 = nullptr;\r
+ }\r
+\r
+ if (soberingTime_ != nullptr) {\r
+ delete soberingTime_;\r
+ soberingTime_ = nullptr;\r
+ }\r
+\r
+ if (soberingTimeText != nullptr) {\r
+ delete soberingTimeText;\r
+ soberingTimeText = nullptr;\r
+ }\r
+\r
+ if (image2 != nullptr) {\r
+ delete image2;\r
+ image2 = nullptr;\r
+ }\r
+\r
+ if (rapidEyeMovement_ != nullptr) {\r
+ delete rapidEyeMovement_;\r
+ rapidEyeMovement_ = nullptr;\r
+ }\r
+\r
+ if (rapidEyeMovementText != nullptr) {\r
+ delete rapidEyeMovementText;\r
+ rapidEyeMovementText = nullptr;\r
+ }\r
+\r
+ if (image3 != nullptr) {\r
+ delete image3;\r
+ image3 = nullptr;\r
+ }\r
+\r
+ if (lightSleepTime_ != nullptr) {\r
+ delete lightSleepTime_;\r
+ lightSleepTime_ = nullptr;\r
+ }\r
+\r
+ if (lightSleepTimeText != nullptr) {\r
+ delete lightSleepTimeText;\r
+ lightSleepTimeText = nullptr;\r
+ }\r
+\r
+ if (image4 != nullptr) {\r
+ delete image4;\r
+ image4 = nullptr;\r
+ }\r
+\r
+ if (deepSleepTime_ != nullptr) {\r
+ delete deepSleepTime_;\r
+ deepSleepTime_ = nullptr;\r
+ }\r
+\r
+ if (deepSleepTimeText != nullptr) {\r
+ delete deepSleepTimeText;\r
+ deepSleepTimeText = nullptr;\r
+ }\r
+\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SleepingDetailsPage::~SleepingDetailsPage");\r
+}\r
+\r
+void SleepingDetailsPage::OnStart(void* data)\r
+{\r
+ group = new UIScrollView();\r
+ if (group == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group is nullptr");\r
+ return;\r
+ }\r
+ group->SetPosition(0, 0);\r
+ group->Resize(RESOLUTION_WIDTH, RESOLUTION_HEIGHT);\r
+ group->SetViewId("sleepDetails");\r
+\r
+ detailsSleepView = new UIImageView();\r
+ if (detailsSleepView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "detailsSleepView is nullptr");\r
+ return;\r
+ }\r
+ LOADIMG::LoadImageViewImg(detailsSleepView, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_BACKGROUND);\r
+ detailsSleepView->SetPosition(0, 0, RESOLUTION_WIDTH, RESOLUTION_HEIGHT);\r
+ group->Add(detailsSleepView);\r
+\r
+ sleep = new UILabel();\r
+ if (sleep == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleep is nullptr");\r
+ return;\r
+ }\r
+ sleep->SetPosition(SLEEPDETAIL_SLEEP_X, SLEEPDETAIL_SLEEP_Y);\r
+ sleep->Resize(SLEEPDETAIL_SLEEP_WIDTH, SLEEPDETAIL_SLEEP_HEIGHT);\r
+ sleep->SetText("睡眠");\r
+ sleep->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ sleep->SetTextColor(Color::White());\r
+ sleep->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SLEEP_FONT_SIZE);\r
+ sleep->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group->Add(sleep);\r
+\r
+ InitPage();\r
+\r
+ if (GetRecord() == true) {\r
+ InitDetailPage();\r
+ } else {\r
+ InitNoDeatilPage();\r
+ };\r
+ group->SetOnDragListener(this);\r
+ group->SetDraggable(true);\r
+ group->SetTouchable(true);\r
+ AddViewToPageContainer(group);\r
+}\r
+\r
+void SleepingDetailsPage::InitSoberingTime()\r
+{\r
+ image1 = new UIImageView();\r
+ if (image1 == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "image1 is nullptr");\r
+ return;\r
+ }\r
+ image1->SetPosition(SLEEPDETAIL_IMAGE1_X, SLEEPDETAIL_IMAGE1_Y);\r
+ LOADIMG::LoadImageViewImg(image1, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_RED_CIR);\r
+ group->Add(image1);\r
+ soberingTime_ = new UILabel();\r
+ if (soberingTime_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "soberingTime_ is nullptr");\r
+ return;\r
+ }\r
+ soberingTime_->SetPosition(SLEEPDETAIL_SOBERINGTIME_X, SLEEPDETAIL_SOBERINGTIME_Y);\r
+ soberingTime_->Resize(SLEEPDETAIL_SOBERINGTIME_WIDTH, SLEEPDETAIL_SOBERINGTIME_HEIGHT);\r
+ soberingTime_->SetText("清醒");\r
+ soberingTime_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ soberingTime_->SetTextColor(Color::White());\r
+ soberingTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+ soberingTime_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ group->Add(soberingTime_);\r
+}\r
+\r
+void SleepingDetailsPage::InitRapidEyeMovement()\r
+{\r
+ image2 = new UIImageView();\r
+ if (image2 == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "image2 is nullptr");\r
+ return;\r
+ }\r
+ image2->SetPosition(SLEEPDETAIL_IMAGE1_X, SLEEPDETAIL_IMAGE2_Y);\r
+ LOADIMG::LoadImageViewImg(image2, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_ORANGE_CIR);\r
+ group->Add(image2);\r
+\r
+ rapidEyeMovement_ = new UILabel();\r
+ if (rapidEyeMovement_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "rapidEyeMovement_ is nullptr");\r
+ return;\r
+ }\r
+ rapidEyeMovement_->SetPosition(SLEEPDETAIL_SOBERINGTIME_X, SLEEPDETAIL_RAPID_Y);\r
+ rapidEyeMovement_->Resize(SLEEPDETAIL_RAPID_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+ rapidEyeMovement_->SetText("快速动眼");\r
+ rapidEyeMovement_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ rapidEyeMovement_->SetTextColor(Color::White());\r
+ rapidEyeMovement_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+ rapidEyeMovement_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ group->Add(rapidEyeMovement_);\r
+}\r
+\r
+void SleepingDetailsPage::InitLightSleepTime()\r
+{\r
+ image3 = new UIImageView();\r
+ if (image3 == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "image3 is nullptr");\r
+ return;\r
+ }\r
+ image3->SetPosition(SLEEPDETAIL_IMAGE1_X, SLEEPDETAIL_IMAGE3_Y);\r
+ LOADIMG::LoadImageViewImg(image3, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_GREEN_CIR);\r
+ group->Add(image3);\r
+\r
+ lightSleepTime_ = new UILabel();\r
+ if (lightSleepTime_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "lightSleepTime_ is nullptr");\r
+ return;\r
+ }\r
+ lightSleepTime_->SetPosition(SLEEPDETAIL_SOBERINGTIME_X, SLEEPDETAIL_LIGHT_Y);\r
+ lightSleepTime_->Resize(SLEEPDETAIL_SOBERINGTIME_WIDTH, SLEEPDETAIL_SOBERINGTIME_HEIGHT);\r
+ lightSleepTime_->SetText("浅睡");\r
+ lightSleepTime_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ lightSleepTime_->SetTextColor(Color::White());\r
+ lightSleepTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+ lightSleepTime_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ group->Add(lightSleepTime_);\r
+}\r
+\r
+void SleepingDetailsPage::InitDeepSleepTime()\r
+{\r
+ image4 = new UIImageView();\r
+ if (image4 == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "image4 is nullptr");\r
+ return;\r
+ }\r
+ image4->SetPosition(SLEEPDETAIL_IMAGE1_X, SLEEPDETAIL_IMAGE4_Y);\r
+ LOADIMG::LoadImageViewImg(image4, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_BLUE_CIR);\r
+ group->Add(image4);\r
+\r
+ deepSleepTime_ = new UILabel();\r
+ if (deepSleepTime_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "deepSleepTime_ is nullptr");\r
+ return;\r
+ }\r
+ deepSleepTime_->SetPosition(SLEEPDETAIL_SOBERINGTIME_X, SLEEPDETAIL_DEEP_Y);\r
+ deepSleepTime_->Resize(SLEEPDETAIL_SOBERINGTIME_WIDTH, SLEEPDETAIL_SOBERINGTIME_HEIGHT);\r
+ deepSleepTime_->SetText("深睡");\r
+ deepSleepTime_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ deepSleepTime_->SetTextColor(Color::White());\r
+ deepSleepTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+ deepSleepTime_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ group->Add(deepSleepTime_);\r
+}\r
+\r
+void SleepingDetailsPage::InitPage()\r
+{\r
+ grayBg = new UIImageView();\r
+ if (grayBg == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "grayBg is nullptr");\r
+ return;\r
+ }\r
+ grayBg->SetPosition(SLEEPDETAIL_GRAYBG_X, SLEEPDETAIL_GRAYBG_Y);\r
+ LOADIMG::LoadImageViewImg(grayBg, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_RECORD_BG);\r
+ group->Add(grayBg);\r
+\r
+ // 加载详情四项\r
+ InitSoberingTime();\r
+ InitRapidEyeMovement();\r
+ InitLightSleepTime();\r
+ InitDeepSleepTime();\r
+}\r
+\r
+void SleepingDetailsPage::IoadDeatilActualSleepTime()\r
+{\r
+ actualSleepTimeHours = new UILabel();\r
+ if (actualSleepTimeHours == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "actualSleepTimeHours is nullptr");\r
+ return;\r
+ }\r
+\r
+ actualSleepTimeHours->SetTextColor(Color::White());\r
+ actualSleepTimeHours->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_ACTUALSLEEPTIMEHOURS_FONT_SIZE);\r
+ actualSleepTimeHours->SetVisible(false);\r
+\r
+ actualSleepTimeHoursText = new UILabel();\r
+ if (actualSleepTimeHoursText == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "actualSleepTimeHoursText is nullptr");\r
+ return;\r
+ }\r
+ actualSleepTimeHoursText->SetText("小时");\r
+ actualSleepTimeHoursText->Resize(SLEEPDETAIL_SOBERINGTIME_WIDTH, SLEEPDETAIL_SOBERINGTIME_HEIGHT);\r
+ actualSleepTimeHoursText->SetTextColor(Color::White());\r
+ actualSleepTimeHoursText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+ actualSleepTimeHoursText->SetVisible(false);\r
+\r
+ actualSleepTimeMinutes = new UILabel();\r
+ if (actualSleepTimeMinutes == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "actualSleepTimeMinutes is nullptr");\r
+ return;\r
+ }\r
+\r
+ actualSleepTimeMinutes->Resize(SLEEPDETAIL_RAPID_WIDTH, SLEEPDETAIL_ACTUALSLEEPTIMINUTES_HEIGHT);\r
+ actualSleepTimeMinutes->SetTextColor(Color::White());\r
+ actualSleepTimeMinutes->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_ACTUALSLEEPTIMINUTES_FONT_SIZE);\r
+ actualSleepTimeMinutes->SetVisible(false);\r
+\r
+ actualSleepTimeMinutesText = new UILabel();\r
+ if (actualSleepTimeMinutesText == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "actualSleepTimeHours is nullptr");\r
+ return;\r
+ }\r
+\r
+ actualSleepTimeMinutesText->SetText("分钟");\r
+ actualSleepTimeMinutesText->Resize(SLEEPDETAIL_SOBERINGTIME_WIDTH, SLEEPDETAIL_SOBERINGTIME_HEIGHT);\r
+ actualSleepTimeMinutesText->SetTextColor(Color::White());\r
+ actualSleepTimeMinutesText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+ actualSleepTimeMinutesText->SetVisible(false);\r
+}\r
+\r
+void SleepingDetailsPage::InitActualSleepTime(std::tuple<uint32_t, uint32_t> timeTuple)\r
+{\r
+ IoadDeatilActualSleepTime();\r
+ uint32_t hours = std::get<0>(timeTuple);\r
+ uint32_t minutes = std::get<1>(timeTuple);\r
+\r
+ if ((hours == 0) && (minutes != 0)) {\r
+ actualSleepTimeMinutes->SetPosition(SLEEPDETAIL_ACTUALSLEEP_X, SLEEPDETAIL_ACTUALSLEEP_Y);\r
+ actualSleepTimeMinutes->SetVisible(true);\r
+ actualSleepTimeMinutes->SetText(std::to_string(minutes).c_str());\r
+ group->Add(actualSleepTimeMinutes);\r
+\r
+ actualSleepTimeMinutesText->SetPosition(SLEEPDETAIL_ACTUALMINUTE_X, SLEEPDETAIL_ACTUALMINUTE_Y);\r
+ actualSleepTimeMinutesText->SetVisible(true);\r
+ group->Add(actualSleepTimeMinutesText);\r
+ } else if ((hours != 0) && (minutes == 0)) {\r
+ actualSleepTimeHours->SetPosition(SLEEPDETAIL_ACTUALSLEEP_X, SLEEPDETAIL_ACTUALSLEEP_Y);\r
+ actualSleepTimeHours->Resize(SLEEPDETAIL_ACTUALSLEEPTIMINUTES_HEIGHT, SLEEPDETAIL_ACTUALSLEEPTIMINUTES_HEIGHT);\r
+ actualSleepTimeHours->SetVisible(true);\r
+ actualSleepTimeHours->SetText(std::to_string(hours).c_str());\r
+ group->Add(actualSleepTimeHours);\r
+\r
+ actualSleepTimeHoursText->SetPosition(SLEEPDETAIL_ACTUALMINUTE_X, SLEEPDETAIL_ACTUALMINUTE_Y);\r
+ actualSleepTimeHoursText->SetVisible(true);\r
+ group->Add(actualSleepTimeHoursText);\r
+ } else if ((hours != 0) && (minutes != 0)) {\r
+ actualSleepTimeHours->SetPosition(SLEEPDETAIL_ACTUALHOUR_X, SLEEPDETAIL_ACTUALHOUR_Y);\r
+ actualSleepTimeHours->Resize(SLEEPDETAIL_ACTUALSLEEPTIMINUTES_HEIGHT, SLEEPDETAIL_ACTUALSLEEPTIMINUTES_HEIGHT);\r
+\r
+ actualSleepTimeHours->SetVisible(true);\r
+ actualSleepTimeHours->SetText(std::to_string(hours).c_str());\r
+ group->Add(actualSleepTimeHours);\r
+\r
+ actualSleepTimeHoursText->SetPosition(SLEEPDETAIL_ACTUALHOURTEXT_X, SLEEPDETAIL_ACTUALMINUTE_Y);\r
+ actualSleepTimeHoursText->SetVisible(true);\r
+ group->Add(actualSleepTimeHoursText);\r
+\r
+ actualSleepTimeMinutes->SetPosition(SLEEPDETAIL_ACTUALMINUTE_X, SLEEPDETAIL_ACTUALHOUR_Y);\r
+ actualSleepTimeMinutes->SetVisible(true);\r
+ actualSleepTimeMinutes->SetText(std::to_string(minutes).c_str());\r
+ group->Add(actualSleepTimeMinutes);\r
+\r
+ actualSleepTimeMinutesText->SetPosition(SLEEPDETAIL_ACTUALMINUTETEXT_X, SLEEPDETAIL_ACTUALMINUTE_Y);\r
+ actualSleepTimeMinutesText->SetVisible(true);\r
+ group->Add(actualSleepTimeMinutesText);\r
+ } else if ((hours == 0) && (minutes == 0)) {\r
+ actualSleepTimeHours->SetPosition(ACTUALHOURS_X, SLEEPDETAIL_ACTUALHOUR_Y);\r
+ actualSleepTimeHours->Resize(SLEEPDETAIL_ACTUALSLEEPTIMINUTES_HEIGHT, SLEEPDETAIL_ACTUALSLEEPTIMINUTES_HEIGHT);\r
+ actualSleepTimeHours->SetVisible(true);\r
+ actualSleepTimeHours->SetText("--");\r
+ group->Add(actualSleepTimeHours);\r
+\r
+ actualSleepTimeHoursText->SetPosition(ACTUALHOURSTEXT_X, SLEEPDETAIL_ACTUALMINUTE_Y);\r
+ actualSleepTimeHoursText->SetVisible(true);\r
+ group->Add(actualSleepTimeHoursText);\r
+\r
+ actualSleepTimeMinutes->SetPosition(SLEEPDETAIL_ACTUALMINUTE_X, SLEEPDETAIL_ACTUALHOUR_Y);\r
+ actualSleepTimeMinutes->SetVisible(true);\r
+ actualSleepTimeMinutes->SetText("--");\r
+ group->Add(actualSleepTimeMinutes);\r
+\r
+ actualSleepTimeMinutesText->SetPosition(ACTUALMINUTESTEXT_X, SLEEPDETAIL_ACTUALMINUTE_Y);\r
+ actualSleepTimeMinutesText->SetVisible(true);\r
+ group->Add(actualSleepTimeMinutesText);\r
+ }\r
+}\r
+\r
+void SleepingDetailsPage::InitDetailPage()\r
+{\r
+ InitActualSleepTime(SleepingModel::GetInstance().GetSleepTime());\r
+\r
+ soberingTimeText = new UILabel();\r
+ if (soberingTimeText == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "soberingTimeText is nullptr");\r
+ return;\r
+ }\r
+ soberingTimeText->SetText((SetTimeText(SleepingModel::GetInstance().GetSoberingTime())).c_str());\r
+ soberingTimeText->SetPosition(SLEEPDETAIL_SOBERINGTEXT_X, SLEEPDETAIL_SOBERINGTIME_Y);\r
+\r
+ soberingTimeText->Resize(SLEEPDETAIL_LABEL_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+ soberingTimeText->SetTextColor(Color::White());\r
+ soberingTimeText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+ soberingTimeText->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+ soberingTimeText->SetStyle(STYLE_PADDING_RIGHT, SLEEPDETAIL_PADDING_RIGHT);\r
+ group->Add(soberingTimeText);\r
+\r
+ rapidEyeMovementText = new UILabel();\r
+ if (rapidEyeMovementText == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "rapidEyeMovementText is nullptr");\r
+ return;\r
+ }\r
+ rapidEyeMovementText->SetText((SetTimeText(SleepingModel::GetInstance().GetRapidEyeMovementTime())).c_str());\r
+ rapidEyeMovementText->SetPosition(SLEEPDETAIL_SOBERINGTEXT_X, SLEEPDETAIL_RAPID_Y);\r
+\r
+ rapidEyeMovementText->Resize(SLEEPDETAIL_LABEL_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+ rapidEyeMovementText->SetTextColor(Color::White());\r
+ rapidEyeMovementText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+ rapidEyeMovementText->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+ rapidEyeMovementText->SetStyle(STYLE_PADDING_RIGHT, SLEEPDETAIL_PADDING_RIGHT);\r
+ group->Add(rapidEyeMovementText);\r
+\r
+ lightSleepTimeText = new UILabel();\r
+ if (lightSleepTimeText == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "lightSleepTimeText is nullptr");\r
+ return;\r
+ }\r
+ lightSleepTimeText->SetText((SetTimeText(SleepingModel::GetInstance().GetLightSleepTime())).c_str());\r
+ lightSleepTimeText->SetPosition(SLEEPDETAIL_SOBERINGTEXT_X, SLEEPDETAIL_LIGHT_Y);\r
+ lightSleepTimeText->Resize(SLEEPDETAIL_LABEL_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+ lightSleepTimeText->SetTextColor(Color::White());\r
+ lightSleepTimeText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+ lightSleepTimeText->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+ lightSleepTimeText->SetStyle(STYLE_PADDING_RIGHT, SLEEPDETAIL_PADDING_RIGHT);\r
+ group->Add(lightSleepTimeText);\r
+\r
+ deepSleepTimeText = new UILabel();\r
+ if (deepSleepTimeText == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "deepSleepTimeText is nullptr");\r
+ return;\r
+ }\r
+ deepSleepTimeText->SetText((SetTimeText(SleepingModel::GetInstance().GetDeepSleepTime())).c_str());\r
+ deepSleepTimeText->SetPosition(SLEEPDETAIL_SOBERINGTEXT_X, SLEEPDETAIL_DEEP_Y);\r
+ deepSleepTimeText->Resize(SLEEPDETAIL_LABEL_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+ deepSleepTimeText->SetTextColor(Color::White());\r
+ deepSleepTimeText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+ deepSleepTimeText->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+ deepSleepTimeText->SetStyle(STYLE_PADDING_RIGHT, SLEEPDETAIL_PADDING_RIGHT);\r
+ group->Add(deepSleepTimeText);\r
+}\r
+\r
+void SleepingDetailsPage::InitNoDeatilPage()\r
+{\r
+ actualSleepTime = new UILabel();\r
+ if (actualSleepTime == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "actualSleepTime is nullptr");\r
+ return;\r
+ }\r
+ actualSleepTime->SetText("无记录");\r
+ actualSleepTime->SetPosition(SLEEPDETAIL_ACTUALSLEEP_NORECORD_X, SLEEPDETAIL_ACTUALSLEEP_NORECORD_Y);\r
+ actualSleepTime->Resize(SLEEPDETAIL_ACTUAL_NORECODE_X, SLEEPDETAIL_SOBERINGTIME_WIDTH);\r
+ actualSleepTime->SetTextColor(Color::White());\r
+ actualSleepTime->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_ACTUALSLEEP_FONT_SIZE);\r
+ group->Add(actualSleepTime);\r
+\r
+ soberingTimeText = new UILabel();\r
+ if (soberingTimeText == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "soberingTimeText is nullptr");\r
+ return;\r
+ }\r
+ soberingTimeText->SetText("--");\r
+ soberingTimeText->SetPosition(SLEEPDETAIL_SOBERTIMETEXT_X, SLEEPDETAIL_SOBERTIMETEXT_Y);\r
+ soberingTimeText->Resize(SLEEPDETAIL_RAPID_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+ soberingTimeText->SetTextColor(Color::White());\r
+ soberingTimeText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+ soberingTimeText->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+ group->Add(soberingTimeText);\r
+\r
+ rapidEyeMovementText = new UILabel();\r
+ if (rapidEyeMovementText == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "rapidEyeMovementText is nullptr");\r
+ return;\r
+ }\r
+ rapidEyeMovementText->SetText("--");\r
+ rapidEyeMovementText->SetPosition(SLEEPDETAIL_SOBERTIMETEXT_X, SLEEPDETAIL_RAPIDTIMETEXT_Y);\r
+ rapidEyeMovementText->Resize(SLEEPDETAIL_RAPID_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+ rapidEyeMovementText->SetTextColor(Color::White());\r
+ rapidEyeMovementText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+ rapidEyeMovementText->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+ group->Add(rapidEyeMovementText);\r
+\r
+ lightSleepTimeText = new UILabel();\r
+ if (lightSleepTimeText == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "lightSleepTimeText is nullptr");\r
+ return;\r
+ }\r
+ lightSleepTimeText->SetText("--");\r
+ lightSleepTimeText->SetPosition(SLEEPDETAIL_SOBERTIMETEXT_X, SLEEPDETAIL_LIGHTIMETEXT_Y);\r
+ lightSleepTimeText->Resize(SLEEPDETAIL_RAPID_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+ lightSleepTimeText->SetTextColor(Color::White());\r
+ lightSleepTimeText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+ lightSleepTimeText->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+ group->Add(lightSleepTimeText);\r
+\r
+ deepSleepTimeText = new UILabel();\r
+ if (deepSleepTimeText == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "deepSleepTimeText is nullptr");\r
+ return;\r
+ }\r
+ deepSleepTimeText->SetText("--");\r
+ deepSleepTimeText->SetPosition(SLEEPDETAIL_SOBERTIMETEXT_X, SLEEPDETAIL_DEEPIMETEXT_Y);\r
+ deepSleepTimeText->Resize(SLEEPDETAIL_RAPID_WIDTH, SLEEPDETAIL_RAPID_HEIGHT);\r
+ deepSleepTimeText->SetTextColor(Color::White());\r
+ deepSleepTimeText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_SOBERINGTIME_FONT_SIZE);\r
+ deepSleepTimeText->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+ group->Add(deepSleepTimeText);\r
+}\r
+\r
+std::string SleepingDetailsPage::SetTimeText(std::tuple<uint32_t, uint32_t> timeTuple)\r
+{\r
+ uint32_t hours = std::get<0>(timeTuple);\r
+ uint32_t minutes = std::get<1>(timeTuple);\r
+\r
+ std::string str = "";\r
+ if ((hours == 0) && (minutes != 0)) {\r
+ str = std::to_string(minutes) + "分钟";\r
+ } else if ((hours != 0) && (minutes == 0)) {\r
+ str = std::to_string(hours) + "小时";\r
+ } else if ((hours != 0) && (minutes != 0)) {\r
+ str = std::to_string(hours) + "小时" + std::to_string(minutes) + "分钟";\r
+ } else if ((hours == 0) && (minutes == 0)) {\r
+ str = "---";\r
+ }\r
+ return str;\r
+}\r
+\r
+bool SleepingDetailsPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if (event.GetDragDirection() == DragEvent::DIRECTION_TOP_TO_BOTTOM) {\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_SLEEPING, SLEEPING_PAGES::SLEEPING_MAIN_PAGE);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool SleepingDetailsPage::GetRecord()\r
+{\r
+ if (SleepingModel::GetInstance().GetRecord()) {\r
+ return true;\r
+ }\r
+ return false;\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepingMainPage\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#include <string>\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "settings/SetDesktopModel.h"\r
+#include "rebootdevice/RebootModel.h"\r
+#include "common/image_cache_manager.h"\r
+#include "diag_service.h"\r
+#include "msg_center_device.h"\r
+#include "diag_common.h"\r
+#include "sleep/TargetSleepTime.h"\r
+#include "sleep/SleepingMainPage.h"\r
+#include "sleep/SleepingPresenter.h"\r
+#include "sleep/SleepingView.h"\r
+\r
+namespace OHOS {\r
+\r
+REGIST_SLICE_PAGE(VIEW_SLEEPING, SLEEPING_PAGES::SLEEPING_MAIN_PAGE, SleepingMainPage, true);\r
+\r
+static constexpr int16_t SLEEPMAIN_SLEEP_X = 190;\r
+static constexpr int16_t SLEEPMAIN_SLEEP_Y = 50;\r
+static constexpr int16_t SLEEPMAIN_SLEEP_WIDTH = 64;\r
+static constexpr int16_t SLEEPMAIN_SLEEP_HEIGHT = 38;\r
+static constexpr int16_t SLEEPMAIN_SLEEP_FONT_SIZE = 38;\r
+static constexpr int16_t SLEEPMAIN_NORECORD_X = 179;\r
+static constexpr int16_t SLEEPMAIN_NORECORD_Y = 179;\r
+static constexpr int16_t SLEEPMAIN_NORECORD_WIDTH = 96;\r
+static constexpr int16_t SLEEPMAIN_NORECORD_HEIGHT = 48;\r
+static constexpr int16_t SLEEPMAIN_NORECORD_FONT_SIZE = 38;\r
+static constexpr int16_t SLEEPMAIN_TIPS_X = 93;\r
+static constexpr int16_t SLEEPMAIN_TIPS_Y = 321;\r
+static constexpr int16_t SLEEPMAIN_TIPS_WIDTH = 188;\r
+static constexpr int16_t SLEEPMAIN_TIPS_HEIGHT = 87;\r
+static constexpr int16_t SLEEPMAIN_TIPS_FONT_SIZE = 24;\r
+static constexpr int16_t SLEEPMAIN_SCORE_X = 164;\r
+static constexpr int16_t SLEEPMAIN_SCORE_Y = 129;\r
+static constexpr int16_t SLEEPMAIN_SCORE_WIDTH = 95;\r
+static constexpr int16_t SLEEPMAIN_SCORE_HEIGHT = 65;\r
+static constexpr int16_t SLEEPMAIN_SCORE_FONT_SIZE = 56;\r
+static constexpr int16_t SLEEPMAIN_MOONNORECORD_X = 154;\r
+static constexpr int16_t SLEEPMAIN_MOONNORECORD_Y = 154;\r
+static constexpr int16_t SLEEPMAIN_SCORETEXT_FONT_SIZE = 21;\r
+static constexpr int16_t SLEEP_SCORE_THRESHOLD_1 = 20;\r
+static constexpr int16_t SLEEP_SCORE_THRESHOLD_2 = 40;\r
+static constexpr int16_t SLEEP_SCORE_THRESHOLD_3 = 60;\r
+static constexpr int16_t SLEEP_SCORE_THRESHOLD_4 = 80;\r
+static constexpr int16_t SLEEP_SCORE_THRESHOLD_5 = 100;\r
+static constexpr int16_t SLEEP_FONT_SIZE_LARGE = 40;\r
+static constexpr int16_t SLEEPMAIN_SCORETEXT_X = 265;\r
+static constexpr int16_t SLEEPMAIN_SCORETEXT_Y = 161;\r
+static constexpr int16_t SLEEP_LABEL_WIDTH = 48;\r
+static constexpr int16_t SLEEP_LABEL_HEIGHT = 29;\r
+static constexpr int16_t SLEEP_TIME_LABEL_WIDTH = 100;\r
+static constexpr int16_t SLEEP_TIME_LABEL_HEIGHT = 50;\r
+static constexpr int16_t SLEEPMAIN_SETTING_X = 280;\r
+static constexpr int16_t SLEEPMAIN_SETTING_Y = 374;\r
+static constexpr int16_t SLEEPMAIN_ACTUALMINUTE_X = 230;\r
+static constexpr int16_t SLEEPMAIN_ACTUALMINUTE_Y = 319;\r
+static constexpr int16_t SLEEPMAIN_ACTUALHOUR_X = 135;\r
+static constexpr int16_t ACTUALHOURS_X = 140;\r
+static constexpr int16_t ACTUALMINUTES_X = 180;\r
+static constexpr int16_t ACTUALMINUTES_Y = 303;\r
+static constexpr int16_t SLEEPMAIN_ACTUALHOURTEXT_X = 170;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEPTIMEHOURS_FONT_SIZE = 32;\r
+static constexpr int16_t SLEEPMAIN_HEIGHT = 50;\r
+static constexpr int16_t SLEEPDETAIL_ACTUALSLEEPTIMINUTES_FONT_SIZE = 40;\r
+static constexpr int16_t SLEEPMAIN_ACTUALMINUTETEXT_X = 280;\r
+static constexpr int16_t SLEEPMAIN_ACTUALH_X = 170;\r
+static constexpr int16_t SLEEPMAIN_ACTUALMINUTETEXT2_X = 270;\r
+static constexpr int16_t SLEEPMAIN_CIR_HIGHT = 444;\r
+static constexpr int16_t SLEEPMAIN_CIR_X = 228;\r
+static constexpr int16_t SLEEPMAIN_CIR_Y = 228;\r
+static constexpr int16_t SLEEPMAIN_CIR_RADIUS = 215;\r
+static constexpr int16_t SLEEPMAIN_CIR_ANGLE = 360;\r
+static constexpr int16_t SLEEPMAIN_CIR_RANGE = 100;\r
+static constexpr int16_t SLEEPMAIN_CIR_LINE_WIDTH = 10;\r
+static constexpr int16_t SLEEPMAIN_SCORE = 100;\r
+static constexpr int16_t SLEEPMAIN_RATE = 100;\r
+static constexpr float MINUTE_HOUR = 60.0f;\r
+static constexpr int16_t TARGETTIMETEXT_Y = 363;\r
+static constexpr int16_t TARGETTIMEBUTTON_X = 137;\r
+static constexpr int16_t TARGETTIMETEXT_WIDTH = 184;\r
+static constexpr int16_t TARGETTIMETEXT_HIGHT = 46;\r
+static constexpr int16_t MAIN_SLEEP_COLOR_R = 181;\r
+static constexpr int16_t MAIN_SLEEP_COLOR_G = 402;\r
+static constexpr int16_t MAIN_SLEEP_COLOR_B = 255;\r
+static constexpr int16_t MAIN_SLEEP_OPT = 110;\r
+static constexpr int16_t MAIN_SLEEP_RANGE = 10;\r
+static constexpr int16_t MAIN_SLEEP_POSX_2 = 2;\r
+static constexpr int16_t MAIN_SLEEP_POSX_3 = 3;\r
+static constexpr int16_t MAIN_SLEEP_POSX_4 = 4;\r
+static constexpr int16_t MAIN_SLEEP_MOON_POSX = 198;\r
+static constexpr int16_t MAIN_SLEEP_SCORE_HEIGHT = 192;\r
+static constexpr int16_t MAIN_SLEEP_SCORE_X = 131;\r
+static constexpr int16_t MAIN_SLEEP_SCORE_Y = 200;\r
+static constexpr int16_t MAIN_SLEEP_STAR1_X = 145;\r
+static constexpr int16_t MAIN_SLEEP_STAR2_X = 180;\r
+static constexpr int16_t MAIN_SLEEP_STAR3_X = 215;\r
+static constexpr int16_t MAIN_SLEEP_STAR4_X = 250;\r
+static constexpr int16_t MAIN_SLEEP_STAR5_X = 285;\r
+static constexpr int16_t MAIN_SLEEP_STAR_Y = 255;\r
+static constexpr int16_t MAIN_SLEEP_SCORE_TEXT_FONT_SIZE = 55;\r
+static constexpr int16_t MAIN_SLEEP_STAR_NUM = 5;\r
+\r
+int posX[MAIN_SLEEP_STAR_NUM] = {MAIN_SLEEP_STAR1_X, MAIN_SLEEP_STAR2_X, MAIN_SLEEP_STAR3_X, MAIN_SLEEP_STAR4_X, MAIN_SLEEP_STAR5_X};\r
+int posY = MAIN_SLEEP_STAR_Y;\r
+\r
+SleepingMainPage::SleepingMainPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SleepingMainPage::SleepingMainPage");\r
+}\r
+\r
+SleepingMainPage::~SleepingMainPage()\r
+{\r
+ if (group != nullptr) {\r
+ group->RemoveAll();\r
+ delete group;\r
+ group = nullptr;\r
+ }\r
+\r
+ if (imageViewMain != nullptr) {\r
+ delete imageViewMain;\r
+ imageViewMain = nullptr;\r
+ }\r
+\r
+ if (sleep != nullptr) {\r
+ delete sleep;\r
+ sleep = nullptr;\r
+ }\r
+\r
+ if (moonNoRecord != nullptr) {\r
+ delete moonNoRecord;\r
+ moonNoRecord = nullptr;\r
+ }\r
+\r
+ if (moon != nullptr) {\r
+ delete moon;\r
+ moon = nullptr;\r
+ }\r
+\r
+ if (noRecord != nullptr) {\r
+ delete noRecord;\r
+ noRecord = nullptr;\r
+ }\r
+\r
+ if (tips != nullptr) {\r
+ delete tips;\r
+ tips = nullptr;\r
+ }\r
+\r
+ if (sleepScores_ != nullptr) {\r
+ delete sleepScores_;\r
+ sleepScores_ = nullptr;\r
+ }\r
+\r
+ if (scoreText != nullptr) {\r
+ delete scoreText;\r
+ scoreText = nullptr;\r
+ }\r
+\r
+ if (sleepScore != nullptr) {\r
+ delete sleepScore;\r
+ sleepScore = nullptr;\r
+ }\r
+\r
+ if (scoreDisplayPicture1 != nullptr) {\r
+ delete scoreDisplayPicture1;\r
+ scoreDisplayPicture1 = nullptr;\r
+ }\r
+\r
+ if (scoreDisplayPicture2 != nullptr) {\r
+ delete scoreDisplayPicture2;\r
+ scoreDisplayPicture2 = nullptr;\r
+ }\r
+\r
+ if (scoreDisplayPicture3 != nullptr) {\r
+ delete scoreDisplayPicture3;\r
+ scoreDisplayPicture3 = nullptr;\r
+ }\r
+ if (scoreDisplayPicture4 != nullptr) {\r
+ delete scoreDisplayPicture4;\r
+ scoreDisplayPicture4 = nullptr;\r
+ }\r
+\r
+ if (scoreDisplayPicture5 != nullptr) {\r
+ delete scoreDisplayPicture5;\r
+ scoreDisplayPicture5 = nullptr;\r
+ }\r
+\r
+ if (setting != nullptr) {\r
+ delete setting;\r
+ setting = nullptr;\r
+ }\r
+\r
+ if (targetTimeText != nullptr) {\r
+ delete targetTimeText;\r
+ targetTimeText = nullptr;\r
+ }\r
+\r
+ if (actualSleepTimeHours != nullptr) {\r
+ delete actualSleepTimeHours;\r
+ actualSleepTimeHours = nullptr;\r
+ }\r
+\r
+ if (actualSleepTimeHoursText != nullptr) {\r
+ delete actualSleepTimeHoursText;\r
+ actualSleepTimeHoursText = nullptr;\r
+ }\r
+\r
+ if (actualSleepTimeMinutes != nullptr) {\r
+ delete actualSleepTimeMinutes;\r
+ actualSleepTimeMinutes = nullptr;\r
+ }\r
+\r
+ if (actualSleepTimeMinutesText != nullptr) {\r
+ delete actualSleepTimeMinutesText;\r
+ actualSleepTimeMinutesText = nullptr;\r
+ }\r
+\r
+ if (targetTimeButton != nullptr) {\r
+ delete targetTimeButton;\r
+ targetTimeButton = nullptr;\r
+ }\r
+\r
+ if (circleProgress != nullptr) {\r
+ delete circleProgress;\r
+ circleProgress = nullptr;\r
+ }\r
+\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SleepingMainPage::~SleepingMainPage");\r
+}\r
+\r
+void SleepingMainPage::OnStart(void* data)\r
+{\r
+ group = new UIScrollView();\r
+ if (group == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group is nullptr");\r
+ return;\r
+ }\r
+ group->SetPosition(0, 0);\r
+ group->Resize(RESOLUTION_WIDTH, RESOLUTION_HEIGHT);\r
+ group->SetViewId("sleepMain");\r
+\r
+ imageViewMain = new UIImageView();\r
+ if (imageViewMain == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "imageViewMain is nullptr");\r
+ return;\r
+ }\r
+ LOADIMG::LoadImageViewImg(imageViewMain, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_BACKGROUND);\r
+ imageViewMain->SetPosition(0, 0, RESOLUTION_WIDTH, RESOLUTION_HEIGHT);\r
+ group->Add(imageViewMain);\r
+\r
+ if (GetRecord() == false) {\r
+ InitNoRecordPage();\r
+ } else {\r
+ InitRecordPage();\r
+ }\r
+\r
+ group->SetOnDragListener(this);\r
+ group->SetDraggable(true);\r
+ group->SetTouchable(true);\r
+ AddViewToPageContainer(group);\r
+}\r
+\r
+void SleepingMainPage::InitNoRecordPage()\r
+{\r
+ sleep = new UILabel();\r
+ if (sleep == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleep is nullptr");\r
+ return;\r
+ }\r
+ sleep->SetPosition(SLEEPMAIN_SLEEP_X, SLEEPMAIN_SLEEP_Y);\r
+ sleep->Resize(SLEEPMAIN_SLEEP_WIDTH, SLEEPMAIN_SLEEP_HEIGHT);\r
+ sleep->SetText("睡眠");\r
+ sleep->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ sleep->SetTextColor(Color::White());\r
+ sleep->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_SLEEP_FONT_SIZE);\r
+ sleep->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group->Add(sleep);\r
+\r
+ moonNoRecord = new UIImageView();\r
+ if (moonNoRecord == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "moonNoRecord is nullptr");\r
+ return;\r
+ }\r
+ LOADIMG::LoadImageViewImg(moonNoRecord, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_NORECORD_SLEEP);\r
+ moonNoRecord->SetPosition(SLEEPMAIN_MOONNORECORD_X, SLEEPMAIN_MOONNORECORD_Y);\r
+ group->Add(moonNoRecord);\r
+\r
+ noRecord = new UILabel();\r
+ if (noRecord == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "noRecord is nullptr");\r
+ return;\r
+ }\r
+ noRecord->SetPosition(SLEEPMAIN_NORECORD_X, SLEEPMAIN_NORECORD_Y);\r
+ noRecord->Resize(SLEEPMAIN_NORECORD_WIDTH, SLEEPMAIN_NORECORD_HEIGHT);\r
+ noRecord->SetText("无记录");\r
+ noRecord->SetTextColor(Color::White());\r
+ noRecord->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_NORECORD_FONT_SIZE);\r
+ noRecord->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group->Add(noRecord);\r
+\r
+ tips = new UILabel();\r
+ if (tips == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "tips is nullptr");\r
+ return;\r
+ }\r
+ tips->SetPosition(SLEEPMAIN_TIPS_X, SLEEPMAIN_TIPS_Y);\r
+ tips->Resize(SLEEPMAIN_TIPS_WIDTH, SLEEPMAIN_TIPS_HEIGHT);\r
+ tips->SetText("睡眠时间过短或睡眠中动作幅度大,手表可能检测不到睡眠");\r
+ tips->SetTextColor(Color::White());\r
+ tips->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_TIPS_FONT_SIZE);\r
+ tips->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group->Add(tips);\r
+}\r
+\r
+void SleepingMainPage::InitRecordPage()\r
+{\r
+ SleepingModel::GetInstance().SendData();\r
+ CircleProgress();\r
+ moon = new UIImageView();\r
+ if (moon == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "moon is nullptr");\r
+ return;\r
+ }\r
+\r
+ moon->SetPosition(MAIN_SLEEP_MOON_POSX, TARGETTIMETEXT_HIGHT);\r
+ LOADIMG::LoadImageViewImg(moon, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_RECORD_SLEEP);\r
+ group->Add(moon);\r
+\r
+ sleepScores_ = new UILabel();\r
+ if (sleepScores_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleepScores_ is nullptr");\r
+ return;\r
+ }\r
+\r
+ sleepScores_->SetText(std::to_string(GetSleepingScores()).c_str());\r
+ sleepScores_->SetPosition(SLEEPMAIN_SCORE_X, SLEEPMAIN_SCORE_Y);\r
+ sleepScores_->Resize(SLEEPMAIN_SCORE_WIDTH, SLEEPMAIN_SCORE_HEIGHT);\r
+ sleepScores_->SetTextColor(Color::White());\r
+ sleepScores_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ sleepScores_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_SCORE_FONT_SIZE);\r
+ sleepScores_->SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+ group->Add(sleepScores_);\r
+\r
+ scoreText = new UILabel();\r
+ if (scoreText == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "scoreText is nullptr");\r
+ return;\r
+ }\r
+ scoreText->SetText("分");\r
+ scoreText->SetPosition(SLEEPMAIN_SCORETEXT_X, SLEEPMAIN_SCORETEXT_Y);\r
+ scoreText->Resize(MAIN_SLEEP_SCORE_TEXT_FONT_SIZE, SLEEPMAIN_TIPS_FONT_SIZE);\r
+ scoreText->SetTextColor(Color::White());\r
+ scoreText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_SCORETEXT_FONT_SIZE);\r
+ group->Add(scoreText);\r
+ ScoreDisplay();\r
+ sleepScore = new UILabel();\r
+ if (sleepScore == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleepScore is nullptr");\r
+ return;\r
+ }\r
+ sleepScore->SetText("夜间睡眠得分");\r
+ sleepScore->Resize(MAIN_SLEEP_SCORE_HEIGHT, SLEEPMAIN_NORECORD_HEIGHT);\r
+ sleepScore->SetPosition(MAIN_SLEEP_SCORE_X, MAIN_SLEEP_SCORE_Y);\r
+ sleepScore->SetTextColor(Color::White());\r
+ sleepScore->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPDETAIL_ACTUALSLEEPTIMEHOURS_FONT_SIZE);\r
+ group->Add(sleepScore);\r
+\r
+ // 显示具体睡觉时间\r
+ IoadActualSleepTime(SleepingModel::GetInstance().GetSleepTime());\r
+\r
+ // 加载目标按钮\r
+ IoadTargetTimeButton(SleepingModel::GetInstance().GetTime());\r
+}\r
+void SleepingMainPage::InitScoreDisplayPicture()\r
+{\r
+ if (scoreDisplayPicture1 == nullptr) {\r
+ scoreDisplayPicture1 = new UIImageView();\r
+ }\r
+ scoreDisplayPicture1->SetPosition(posX[0], posY);\r
+ group->Add(scoreDisplayPicture1);\r
+\r
+ if (scoreDisplayPicture2 == nullptr) {\r
+ scoreDisplayPicture2 = new UIImageView();\r
+ }\r
+ scoreDisplayPicture2->SetPosition(posX[1], posY);\r
+ group->Add(scoreDisplayPicture2);\r
+\r
+ if (scoreDisplayPicture3 == nullptr) {\r
+ scoreDisplayPicture3 = new UIImageView();\r
+ }\r
+ scoreDisplayPicture3->SetPosition(posX[MAIN_SLEEP_POSX_2], posY);\r
+ group->Add(scoreDisplayPicture3);\r
+\r
+ if (scoreDisplayPicture4 == nullptr) {\r
+ scoreDisplayPicture4 = new UIImageView();\r
+ }\r
+ scoreDisplayPicture4->SetPosition(posX[MAIN_SLEEP_POSX_3], posY);\r
+ group->Add(scoreDisplayPicture4);\r
+\r
+ if (scoreDisplayPicture5 == nullptr) {\r
+ scoreDisplayPicture5 = new UIImageView();\r
+ }\r
+\r
+ scoreDisplayPicture5->SetPosition(posX[MAIN_SLEEP_POSX_4], posY);\r
+ group->Add(scoreDisplayPicture5);\r
+}\r
+\r
+void SleepingMainPage::ScoreDisplay()\r
+{\r
+ InitScoreDisplayPicture();\r
+ if (GetSleepingScores() < SLEEP_SCORE_THRESHOLD_1) {\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture1, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture2, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture3, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture4, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture5, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+ } else if (GetSleepingScores() >= SLEEP_SCORE_THRESHOLD_1 && GetSleepingScores() < SLEEP_SCORE_THRESHOLD_2) {\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture1, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture2, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture3, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture4, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture5, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+ } else if (GetSleepingScores() >= SLEEP_SCORE_THRESHOLD_2 && GetSleepingScores() < SLEEP_SCORE_THRESHOLD_3) {\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture1, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture2, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture3, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture4, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture5, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+ } else if (GetSleepingScores() >= SLEEP_SCORE_THRESHOLD_3 && GetSleepingScores() < SLEEP_SCORE_THRESHOLD_4) {\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture1, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture2, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture3, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture4, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture5, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+ } else if (GetSleepingScores() >= SLEEP_SCORE_THRESHOLD_4 && GetSleepingScores() < SLEEP_SCORE_THRESHOLD_5) {\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture1, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture2, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture3, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture4, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture5, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_GRAY);\r
+ } else if (GetSleepingScores() == SLEEP_SCORE_THRESHOLD_5) {\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture1, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture2, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture3, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture4, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+ LOADIMG::LoadImageViewImg(scoreDisplayPicture5, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_STAR_YELLOW);\r
+ }\r
+}\r
+\r
+void SleepingMainPage::InitSleepTimeLabel()\r
+{\r
+ actualSleepTimeHours = new UILabel();\r
+ if (actualSleepTimeHours == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "actualSleepTimeHours is nullptr");\r
+ return;\r
+ }\r
+\r
+ actualSleepTimeHours->SetTextColor(Color::White());\r
+ actualSleepTimeHours->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEP_FONT_SIZE_LARGE);\r
+ actualSleepTimeHours->SetVisible(false);\r
+\r
+ actualSleepTimeHoursText = new UILabel();\r
+ if (actualSleepTimeHoursText == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "actualSleepTimeHoursText is nullptr");\r
+ return;\r
+ }\r
+ actualSleepTimeHoursText->SetText("小时");\r
+ actualSleepTimeHoursText->Resize(SLEEP_LABEL_WIDTH, SLEEP_LABEL_HEIGHT);\r
+ actualSleepTimeHoursText->SetTextColor(Color::White());\r
+ actualSleepTimeHoursText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_TIPS_FONT_SIZE);\r
+ actualSleepTimeHoursText->SetVisible(false);\r
+\r
+ actualSleepTimeMinutes = new UILabel();\r
+ if (actualSleepTimeMinutes == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "actualSleepTimeMinutes is nullptr");\r
+ return;\r
+ }\r
+\r
+ actualSleepTimeMinutes->Resize(SLEEP_TIME_LABEL_WIDTH, SLEEP_TIME_LABEL_HEIGHT);\r
+ actualSleepTimeMinutes->SetTextColor(Color::White());\r
+ actualSleepTimeMinutes->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEP_FONT_SIZE_LARGE);\r
+ actualSleepTimeMinutes->SetVisible(false);\r
+\r
+ actualSleepTimeMinutesText = new UILabel();\r
+ if (actualSleepTimeMinutesText == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "actualSleepTimeMinutesText is nullptr");\r
+ return;\r
+ }\r
+\r
+ actualSleepTimeMinutesText->SetText("分钟");\r
+ actualSleepTimeMinutesText->Resize(SLEEP_LABEL_WIDTH, SLEEP_LABEL_HEIGHT);\r
+ actualSleepTimeMinutesText->SetTextColor(Color::White());\r
+ actualSleepTimeMinutesText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_TIPS_FONT_SIZE);\r
+ actualSleepTimeMinutesText->SetVisible(false);\r
+}\r
+\r
+void SleepingMainPage::IoadTargetTimeButton(std::tuple<uint32_t, uint32_t> timeTuple)\r
+{\r
+ uint32_t hours = std::get<0>(timeTuple);\r
+ uint32_t minutes = std::get<1>(timeTuple);\r
+\r
+ std::string str = "";\r
+ if ((hours == 0) && (minutes != 0)) {\r
+ str = std::to_string(minutes) + "分钟";\r
+ } else if ((hours != 0) && (minutes == 0)) {\r
+ str = std::to_string(hours) + "小时";\r
+ } else if ((hours != 0) && (minutes != 0)) {\r
+ if (minutes < MAIN_SLEEP_RANGE && hours >= MAIN_SLEEP_RANGE) {\r
+ str = " " + std::to_string(hours) + ":0" + std::to_string(minutes);\r
+ } else if (hours < MAIN_SLEEP_RANGE && minutes >= MAIN_SLEEP_RANGE) {\r
+ str = " 0"+ std::to_string(hours) + ":" + std::to_string(minutes);\r
+ } else if (minutes < MAIN_SLEEP_RANGE && hours < MAIN_SLEEP_RANGE) {\r
+ str = " 0" + std::to_string(hours) + ":0" + std::to_string(minutes);\r
+ } else if (minutes >= MAIN_SLEEP_RANGE && hours >= MAIN_SLEEP_RANGE) {\r
+ str = " " + std::to_string(hours) + ":" + std::to_string(minutes);\r
+ }\r
+ }\r
+ targetTimeButton = new UILabelButton();\r
+ if (targetTimeButton == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "targetTimeButton is nullptr");\r
+ return;\r
+ }\r
+ targetTimeButton->SetPosition(TARGETTIMEBUTTON_X, TARGETTIMETEXT_Y);\r
+ targetTimeButton->SetViewId("targetTime");\r
+ targetTimeButton->SetOnClickListener(this);\r
+ targetTimeButton->SetStyle(STYLE_BACKGROUND_COLOR,\r
+ Color::GetColorFromRGBA(MAIN_SLEEP_COLOR_R, MAIN_SLEEP_COLOR_G,\r
+ MAIN_SLEEP_COLOR_B, MAIN_SLEEP_OPT).full);\r
+ targetTimeButton->SetStyleForState (\r
+ STYLE_BACKGROUND_COLOR, Color::GetColorFromRGBA(\r
+ MAIN_SLEEP_COLOR_R, MAIN_SLEEP_COLOR_G, MAIN_SLEEP_COLOR_B, MAIN_SLEEP_OPT).full, UIButton::PRESSED);\r
+ targetTimeButton->Resize(TARGETTIMETEXT_WIDTH, TARGETTIMETEXT_HIGHT);\r
+ targetTimeButton->SetTextColor(Color::White());\r
+ targetTimeButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_TIPS_FONT_SIZE);\r
+ group->Add(targetTimeButton);\r
+\r
+ targetTimeText = new UILabel();\r
+ if (targetTimeText == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "targetTimeText is nullptr");\r
+ return;\r
+ }\r
+ std::string targetText = "目标" + str;\r
+ targetTimeText->SetText(targetText.c_str());\r
+ targetTimeText->SetPosition(SLEEPMAIN_MOONNORECORD_X, TARGETTIMETEXT_Y);\r
+ targetTimeText->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ targetTimeText->Resize(TARGETTIMETEXT_WIDTH, TARGETTIMETEXT_HIGHT);\r
+ targetTimeText->SetTextColor(Color::White());\r
+ targetTimeText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SLEEPMAIN_TIPS_FONT_SIZE);\r
+ targetTimeText->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ group->Add(targetTimeText);\r
+\r
+ if (setting == nullptr) {\r
+ setting = new UIImageView();\r
+ }\r
+ setting->SetPosition(SLEEPMAIN_SETTING_X, SLEEPMAIN_SETTING_Y);\r
+ LOADIMG::LoadImageViewImg(setting, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_SETTING);\r
+ group->Add(setting);\r
+}\r
+\r
+void SleepingMainPage::IoadActualSleepTime(std::tuple<uint32_t, uint32_t> timeTuple)\r
+{\r
+ InitSleepTimeLabel();\r
+ uint32_t hours = std::get<0>(timeTuple);\r
+ uint32_t minutes = std::get<1>(timeTuple);\r
+\r
+ if ((hours == 0) && (minutes != 0)) {\r
+ actualSleepTimeMinutes->SetPosition(ACTUALMINUTES_X, ACTUALMINUTES_Y);\r
+ actualSleepTimeMinutes->SetVisible(true);\r
+ actualSleepTimeMinutes->SetText(std::to_string(minutes).c_str());\r
+ group->Add(actualSleepTimeMinutes);\r
+\r
+ actualSleepTimeMinutesText->SetPosition(SLEEPMAIN_ACTUALMINUTE_X, SLEEPMAIN_ACTUALMINUTE_Y);\r
+ actualSleepTimeMinutesText->SetVisible(true);\r
+ group->Add(actualSleepTimeMinutesText);\r
+ } else if ((hours != 0) && (minutes == 0)) {\r
+ actualSleepTimeHours->SetPosition(ACTUALMINUTES_X, ACTUALMINUTES_Y);\r
+ actualSleepTimeHours->Resize(SLEEPMAIN_HEIGHT, SLEEPMAIN_HEIGHT);\r
+\r
+ actualSleepTimeHours->SetVisible(true);\r
+ actualSleepTimeHours->SetText(std::to_string(hours).c_str());\r
+ group->Add(actualSleepTimeHours);\r
+\r
+ actualSleepTimeHoursText->SetPosition(SLEEPMAIN_ACTUALMINUTE_X, SLEEPMAIN_ACTUALMINUTE_Y);\r
+ actualSleepTimeHoursText->SetVisible(true);\r
+ group->Add(actualSleepTimeHoursText);\r
+ } else if ((hours != 0) && (minutes != 0)) {\r
+ actualSleepTimeHours->SetPosition(SLEEPMAIN_ACTUALHOUR_X, ACTUALMINUTES_Y);\r
+ actualSleepTimeHours->Resize(SLEEPMAIN_HEIGHT, SLEEPMAIN_HEIGHT);\r
+\r
+ actualSleepTimeHours->SetVisible(true);\r
+ actualSleepTimeHours->SetText(std::to_string(hours).c_str());\r
+ group->Add(actualSleepTimeHours);\r
+\r
+ actualSleepTimeHoursText->SetPosition(SLEEPMAIN_ACTUALHOURTEXT_X, SLEEPMAIN_ACTUALMINUTE_Y);\r
+ actualSleepTimeHoursText->SetVisible(true);\r
+ group->Add(actualSleepTimeHoursText);\r
+\r
+ actualSleepTimeMinutes->SetPosition(SLEEPMAIN_ACTUALMINUTE_X, ACTUALMINUTES_Y);\r
+ actualSleepTimeMinutes->SetVisible(true);\r
+ actualSleepTimeMinutes->SetText(std::to_string(minutes).c_str());\r
+ group->Add(actualSleepTimeMinutes);\r
+\r
+ actualSleepTimeMinutesText->SetPosition(SLEEPMAIN_ACTUALMINUTETEXT_X, SLEEPMAIN_ACTUALMINUTE_Y);\r
+ actualSleepTimeMinutesText->SetVisible(true);\r
+ group->Add(actualSleepTimeMinutesText);\r
+ } else if ((hours == 0) && (minutes == 0)) {\r
+ actualSleepTimeHours->SetPosition(ACTUALHOURS_X, ACTUALMINUTES_Y);\r
+ actualSleepTimeHours->Resize(SLEEPMAIN_HEIGHT, SLEEPMAIN_HEIGHT);\r
+ actualSleepTimeHours->SetVisible(true);\r
+ actualSleepTimeHours->SetText("--");\r
+ group->Add(actualSleepTimeHours);\r
+\r
+ actualSleepTimeHoursText->SetPosition(ACTUALMINUTES_X, SLEEPMAIN_ACTUALMINUTE_Y);\r
+ actualSleepTimeHoursText->SetVisible(true);\r
+ group->Add(actualSleepTimeHoursText);\r
+\r
+ actualSleepTimeMinutes->SetPosition(SLEEPMAIN_ACTUALMINUTE_X, ACTUALMINUTES_Y);\r
+ actualSleepTimeMinutes->SetVisible(true);\r
+ actualSleepTimeMinutes->SetText("--");\r
+ group->Add(actualSleepTimeMinutes);\r
+\r
+ actualSleepTimeMinutesText->SetPosition(SLEEPMAIN_ACTUALMINUTETEXT2_X, SLEEPMAIN_ACTUALMINUTE_Y);\r
+ actualSleepTimeMinutesText->SetVisible(true);\r
+ group->Add(actualSleepTimeMinutesText);\r
+ }\r
+}\r
+\r
+void SleepingMainPage::CircleProgress()\r
+{\r
+ if (circleProgress == nullptr) {\r
+ circleProgress = new UICircleProgress();\r
+ }\r
+ circleProgress->SetPosition(0, 0);\r
+ circleProgress->Resize(SLEEPMAIN_CIR_HIGHT, SLEEPMAIN_CIR_HIGHT);\r
+\r
+ circleProgress->SetCenterPosition(SLEEPMAIN_CIR_X, SLEEPMAIN_CIR_Y);\r
+ circleProgress->SetRadius(SLEEPMAIN_CIR_RADIUS);\r
+ circleProgress->SetStartAngle(0);\r
+ circleProgress->SetEndAngle(SLEEPMAIN_CIR_ANGLE);\r
+ circleProgress->SetRange(0, SLEEPMAIN_CIR_RANGE);\r
+ circleProgress->SetBackgroundStyle(STYLE_LINE_COLOR, 0xFF6f29a0);\r
+ circleProgress->SetForegroundStyle(STYLE_LINE_COLOR, 0xFFB566FF);\r
+ circleProgress->SetBackgroundStyle(STYLE_LINE_WIDTH, SLEEPMAIN_CIR_LINE_WIDTH);\r
+ circleProgress->SetForegroundStyle(STYLE_LINE_WIDTH, SLEEPMAIN_CIR_LINE_WIDTH);\r
+\r
+ group->Add(circleProgress);\r
+ circleProgress->SetValue(GetSleepingScores());\r
+ circleProgress->Invalidate();\r
+}\r
+\r
+uint32_t SleepingMainPage::GetSleepingScores()\r
+{\r
+ uint32_t hours = SleepingModel::GetInstance().GetSleepTimeHours();\r
+ uint32_t minutes = SleepingModel::GetInstance().GetSleepTimeMinutes();\r
+ std::tuple<uint32_t, uint32_t> timeTuple = SleepingModel::GetInstance().GetTime();\r
+ uint32_t timeHours = std::get<0>(timeTuple);\r
+ uint32_t timeMinutes = std::get<1>(timeTuple);\r
+ if (((hours * MINUTE_HOUR) + minutes) > ((timeHours * MINUTE_HOUR) + timeMinutes)) {\r
+ return SLEEPMAIN_SCORE;\r
+ } else {\r
+ float score = ((hours * MINUTE_HOUR) + minutes) / ((timeHours * MINUTE_HOUR) + timeMinutes);\r
+ return uint32_t(score * SLEEPMAIN_RATE);\r
+ }\r
+}\r
+\r
+bool SleepingMainPage::GetRecord()\r
+{\r
+ if (SleepingModel::GetInstance().GetRecord()) {\r
+ return true;\r
+ }\r
+ return false;\r
+}\r
+\r
+bool SleepingMainPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if (strcmp(view.GetViewId(), "targetTime") == 0) {\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_SLEEPING, SLEEPING_PAGES::SLEEPING_TARGET_PAGE);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool SleepingMainPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&\r
+ (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SleepingMainPage::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+ } else if (event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP) {\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_SLEEPING, SLEEPING_PAGES::SLEEPING_DEATIL_PAGE);\r
+ }\r
+ return true;\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepingModel\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#include <sys/time.h>\r
+#include <time.h>\r
+#include <string>\r
+#include <cstring>\r
+#include "main/HealthModel.h"\r
+#include "uiservice/ui_service.h"\r
+#include "wearable_log.h"\r
+#include "NativeAbility.h"\r
+#include "ui_test_group.h"\r
+#include "graphic_timer.h"\r
+#include "ohos_timer.h"\r
+#include "wearable_onlinelog.h"\r
+#include "sleep/SleepingModel.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint64_t SLEEPMODEL_MINUTE_HOUR = 60;\r
+static constexpr uint64_t SLEEPMODEL_HOUR = 23;\r
+static constexpr uint64_t SLEEPMODEL_MINUTE = 59;\r
+static constexpr uint64_t SLEEPMODEL_ERROR = 100;\r
+static constexpr uint64_t SLEEPMODEL_DEEP = 4;\r
+static constexpr uint64_t SLEEPMODEL_LIGHT = 3;\r
+static constexpr uint64_t SLEEPMODEL_EYEMOVE = 2;\r
+static constexpr uint64_t SLEEPMODEL_EIGHT_HOUR = 480;\r
+\r
+SleepingModel::SleepingModel()\r
+{\r
+ SetSleepData();\r
+ SetSoberingTime();\r
+ SetRapidEyeMovementTime();\r
+ SetLightSleepTime();\r
+ SetDeepSleepTime();\r
+ SetTime(SLEEPMODEL_EIGHT_HOUR);\r
+}\r
+\r
+SleepingModel::~SleepingModel()\r
+{\r
+}\r
+\r
+bool SleepingModel::GetRecord()\r
+{\r
+ if (sleepDataVector.empty() == true) {\r
+ return false;\r
+ }\r
+ return true;\r
+}\r
+\r
+uint8_t* SleepingModel::SerializeSleepData(const SleepData* sleepData, size_t* outSize)\r
+{\r
+ if (sleepData == nullptr) {\r
+ return nullptr;\r
+ }\r
+ size_t dataSize = sizeof(SleepData);\r
+ *outSize = dataSize;\r
+ uint8_t* buffer = new uint8_t[dataSize];\r
+ uint8_t isSendValue = sleepData->isSend ? 1 : 0;\r
+ memcpy_s(buffer, sizeof(isSendValue), &isSendValue, sizeof(isSendValue));\r
+ memcpy_s(buffer + offsetof(SleepData, date), sizeof(sleepData->date),\r
+ sleepData->date, sizeof(sleepData->date));\r
+ memcpy_s(buffer + offsetof(SleepData, type), sizeof(sleepData->type),\r
+ &sleepData->type, sizeof(sleepData->type));\r
+ memcpy_s(buffer + offsetof(SleepData, start), sizeof(sleepData->start),\r
+ sleepData->start, sizeof(sleepData->start));\r
+ memcpy_s(buffer + offsetof(SleepData, end), sizeof(sleepData->end),\r
+ sleepData->end, sizeof(sleepData->end));\r
+ memcpy_s(buffer + offsetof(SleepData, sleepStart), sizeof(sleepData->sleepStart),\r
+ sleepData->sleepStart, sizeof(sleepData->sleepStart));\r
+ memcpy_s(buffer + offsetof(SleepData, sleepEnd), sizeof(sleepData->sleepEnd),\r
+ sleepData->sleepEnd, sizeof(sleepData->sleepEnd));\r
+ return buffer;\r
+}\r
+\r
+void SleepingModel::SendData()\r
+{\r
+#ifndef _WIN32\r
+ // 发送数据\r
+ size_t dataSize;\r
+ for (int i = 0; i < sleepDataVector.size(); i++) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "send Date number: %d\n", i+1);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "send front isSend: %s\n\n",\r
+ sleepDataVector[i].isSend ? "true" : "false");\r
+ if (sleepDataVector[i].isSend == true) {\r
+ continue;\r
+ }\r
+ PrintSleepData(&sleepDataVector[i]);\r
+ uint8_t* serializedData = SerializeSleepData(&sleepDataVector[i], &dataSize);\r
+ errcode_t ret = uapi_diag_service_send_log(msg_center_get_trans_channel(),\r
+ MSGCENTER_TYPE_ID_SLEEP_DATA, serializedData, dataSize);\r
+ delete[] serializedData;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MSGCENTER_TYPE_ID_SLEEP_DATA ret = %d", ret);\r
+ if (ret == 0) {\r
+ sleepDataVector[i].isSend = true;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "isSend after: %s\n\n", sleepDataVector[i].isSend ? "true" : "false");\r
+ }\r
+#endif\r
+}\r
+\r
+void SleepingModel::SetSleepData()\r
+{\r
+#ifndef _WIN32\r
+ sleepDataVector.push_back({\r
+ false, "2025-06-03", 4, "2025-06-03 00:00:00", "2025-06-03 00:30:00",\r
+ "2025-06-03 00:00:00", "2025-06-03 07:50:00"\r
+ });\r
+ sleepDataVector.push_back({\r
+ false, "2025-06-03", 2, "2025-06-03 00:30:00", "2025-06-03 03:00:00",\r
+ "2025-06-03 00:00:00", "2025-06-03 07:50:00"\r
+ });\r
+ sleepDataVector.push_back({\r
+ false, "2025-06-03", 3, "2025-06-03 03:00:00", "2025-06-03 03:30:00",\r
+ "2025-06-03 00:00:00", "2025-06-03 07:50:00"\r
+ });\r
+ sleepDataVector.push_back({\r
+ false, "2025-06-03", 1, "2025-06-03 03:30:00", "2025-06-03 05:30:00",\r
+ "2025-06-03 00:00:00", "2025-06-03 07:50:00"\r
+ });\r
+ sleepDataVector.push_back({\r
+ false, "2025-06-03", 3, "2025-06-03 05:30:00", "2025-06-03 06:00:00",\r
+ "2025-06-03 00:00:00", "2025-06-03 07:50:00"\r
+ });\r
+ sleepDataVector.push_back({\r
+ false, "2025-06-03", 2, "2025-06-03 06:00:00", "2025-06-03 07:30:00",\r
+ "2025-06-03 00:00:00", "2025-06-03 07:50:00"\r
+ });\r
+ sleepDataVector.push_back({\r
+ false, "2025-06-03", 4, "2025-06-03 07:30:00", "2025-06-03 07:50:00",\r
+ "2025-06-03 00:00:00", "2025-06-03 07:50:00"\r
+ });\r
+#endif\r
+}\r
+\r
+void SleepingModel::PrintSleepData(const SleepData *data)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "isSend: %s\n\n", data->isSend ? "true" : "false");\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PrintSleepData Date: %s\n", data->date);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Sleep type: %u\n", data->type);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Start: %s\n", data->start);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "End: %s\n", data->end);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Sleep Start: %s\n", data->sleepStart);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Sleep End: %s\n", data->sleepEnd);\r
+}\r
+\r
+SleepingModel &SleepingModel::GetInstance()\r
+{\r
+ static SleepingModel instance;\r
+ return instance;\r
+}\r
+\r
+std::tuple<uint32_t, uint32_t> SleepingModel::GetSoberingTime()\r
+{\r
+ return MinutesToHours(soberingTime);\r
+}\r
+\r
+std::tuple<uint32_t, uint32_t> SleepingModel::GetRapidEyeMovementTime()\r
+{\r
+ return MinutesToHours(eyeMoveTime);\r
+}\r
+\r
+std::tuple<uint32_t, uint32_t> SleepingModel::GetLightSleepTime()\r
+{\r
+ return MinutesToHours(lightTime);\r
+}\r
+\r
+std::tuple<uint32_t, uint32_t> SleepingModel::GetDeepSleepTime()\r
+{\r
+ return MinutesToHours(deepTime);\r
+}\r
+\r
+std::tuple<uint32_t, uint32_t> SleepingModel::GetSleepTime()\r
+{\r
+ return MinutesToHours(GetTotalSleepTime());\r
+}\r
+\r
+std::tuple<uint32_t, uint32_t> SleepingModel::MinutesToHours(uint32_t minutes)\r
+{\r
+ if (minutes == 0) {\r
+ return std::make_tuple(0, 0);\r
+ }\r
+ int hours = minutes / SLEEPMODEL_MINUTE_HOUR;\r
+ int remainingMinutes = minutes % SLEEPMODEL_MINUTE_HOUR;\r
+\r
+ if (hours > SLEEPMODEL_HOUR || remainingMinutes > SLEEPMODEL_MINUTE) {\r
+ return std::make_tuple(SLEEPMODEL_ERROR, 0);\r
+ }\r
+\r
+ return std::make_tuple(hours, remainingMinutes);\r
+}\r
+\r
+uint32_t SleepingModel::GetSleepTimeHours()\r
+{\r
+ std::tuple<uint32_t, uint32_t> timeTuple = GetSleepTime();\r
+ return std::get<0>(timeTuple);\r
+}\r
+\r
+uint32_t SleepingModel::GetSleepTimeMinutes()\r
+{\r
+ std::tuple<uint32_t, uint32_t> timeTuple = GetSleepTime();\r
+ return std::get<1>(timeTuple);\r
+}\r
+\r
+void SleepingModel::SetTime(uint32_t minute)\r
+{\r
+ sleepTarget = minute;\r
+}\r
+\r
+std::tuple<uint32_t, uint32_t> SleepingModel::GetTime()\r
+{\r
+ return MinutesToHours(sleepTarget);\r
+}\r
+\r
+uint32_t SleepingModel::TimeDiffInMinutes(const std::string& timeStr1, const std::string& timeStr2)\r
+{\r
+ std::tm tm1 = {};\r
+ std::tm tm2 = {};\r
+\r
+ std::istringstream iss1(timeStr1);\r
+ std::istringstream iss2(timeStr2);\r
+\r
+ iss1 >> std::get_time(&tm1, "%Y-%m-%d %H:%M:%S");\r
+ if (iss1.fail()) {\r
+ return -1;\r
+ }\r
+\r
+ iss2 >> std::get_time(&tm2, "%Y-%m-%d %H:%M:%S");\r
+ if (iss2.fail()) {\r
+ return -1;\r
+ }\r
+\r
+ std::time_t t1 = std::mktime(&tm1);\r
+ std::time_t t2 = std::mktime(&tm2);\r
+ if (t1 == -1 || t2 == -1) {\r
+ return -1;\r
+ }\r
+\r
+ double diff_seconds = std::difftime(t2, t1);\r
+ return static_cast<uint32_t>(diff_seconds / SLEEPMODEL_MINUTE_HOUR);\r
+}\r
+\r
+// 遍历vector中的结构体 获取对应类型的时间差\r
+uint32_t SleepingModel::GetDetailData(int type)\r
+{\r
+ uint32_t min = 0;\r
+ for (size_t i = 0; i < sleepDataVector.size(); ++i) {\r
+ if (sleepDataVector[i].type == type) {\r
+ min += TimeDiffInMinutes(sleepDataVector[i].start, sleepDataVector[i].end);\r
+ }\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetDetailData type: %d\n", type);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetDetailData min: %d\n", min);\r
+ return min;\r
+}\r
+\r
+// 获取总睡觉时间的时间差\r
+uint32_t SleepingModel::GetTotalSleepTime()\r
+{\r
+ uint32_t time = TimeDiffInMinutes(sleepDataVector[0].sleepStart, sleepDataVector[0].sleepEnd);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetTotalSleepTime time: %d\n", time);\r
+ return time;\r
+}\r
+\r
+void SleepingModel::SetSoberingTime()\r
+{\r
+ soberingTime = GetDetailData(SLEEPMODEL_DEEP);\r
+}\r
+void SleepingModel::SetRapidEyeMovementTime()\r
+{\r
+ eyeMoveTime=GetDetailData(SLEEPMODEL_LIGHT);\r
+}\r
+void SleepingModel::SetLightSleepTime()\r
+{\r
+ lightTime = GetDetailData(SLEEPMODEL_EYEMOVE);\r
+}\r
+void SleepingModel::SetDeepSleepTime()\r
+{\r
+ deepTime = GetDetailData(1);\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SleepingPresenter\r
+ * Created: 2025-06-05\r
+ */\r
+\r
+#include "NativeRegisterManager.h"\r
+#include "sleep/SleepingView.h"\r
+#include "sleep/SleepingPresenter.h"\r
+\r
+namespace OHOS {\r
+REGIST_MENU(VIEW_SLEEPING, SleepingView, SleepingPresenter, SLEEP_ICON, PNG_APPLIST_DEFAULT_IMG, "睡眠");\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TargetSleepTime\r
+ * Created: 2025-06-05\r
+ */\r
+#include <string>\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "PageTransitionMgr.h"\r
+#include "settings/SetDesktopModel.h"\r
+#include "rebootdevice/RebootModel.h"\r
+#include "common/image_cache_manager.h"\r
+#include "sleep/TargetSleepTime.h"\r
+#include "sleep/SleepingMainPage.h"\r
+#include "sleep/SleepingPresenter.h"\r
+#include "sleep/SleepingView.h"\r
+\r
+namespace OHOS {\r
+constexpr uint8_t BACKGROUND_FONT = 40;\r
+constexpr uint8_t HIGHTLIGHT_FONT = 50;\r
+static constexpr int16_t TARGET_SLEEP_SETTARGET_X = 120;\r
+static constexpr int16_t TARGET_SLEEP_SETTARGET_Y = 40;\r
+static constexpr int16_t TARGET_SLEEP_SETTARGET_WIDTH = 200;\r
+static constexpr int16_t TARGET_SLEEP_SETTARGET_HIGHT = 38;\r
+static constexpr int16_t TARGET_SLEEP_SETTARGET_FONT_SIZE = 32;\r
+static constexpr int16_t TARGET_SLEEP_START_X = 112;\r
+static constexpr int16_t TARGET_SLEEP_START_Y = 347;\r
+static constexpr int16_t TARGET_SLEEP_START_WIDTH = 232;\r
+static constexpr int16_t TARGET_SLEEP_START_HIGHT = 76;\r
+static constexpr int16_t TARGET_SLEEP_PICKER2_X = 270;\r
+static constexpr int16_t TARGET_SLEEP_PICKER_Y = 132;\r
+static constexpr int16_t TARGET_SLEEP_PICKER_WIDTH = 80;\r
+static constexpr int16_t TARGET_SLEEP_PICKER_HIGHT = 188;\r
+static constexpr int16_t TARGET_SLEEP_PICKER_BORDER = 3;\r
+static constexpr int16_t TARGET_SLEEP_PICKER_RADIUS = 11;\r
+static constexpr int16_t TARGET_SLEEP_PICKER_ITEM = 63;\r
+static constexpr int16_t TARGET_SLEEP_PICKER_HOUR = 24;\r
+static constexpr int16_t TARGET_SLEEP_PICKER_MINUTE = 60;\r
+static constexpr int16_t TARGET_SLEEP_PICKER_HOUR_RANGE = 23;\r
+static constexpr int16_t TARGET_SLEEP_PICKER_MINUTE_RANGE = 59;\r
+static constexpr int16_t TARGET_SLEEP_TIMERLABEL_X = 131;\r
+static constexpr int16_t TARGET_SLEEP_TIMERLABEL2_X = 273;\r
+static constexpr int16_t TARGET_SLEEP_TIMERLABEL_Y = 99;\r
+static constexpr int16_t TARGET_SLEEP_TIMERLABEL2_Y = 90;\r
+static constexpr int16_t TARGET_SLEEP_TIMERLABEL_WIDTH = 55;\r
+static constexpr int16_t TARGET_SLEEP_TIMERLABEL_HEIGHT = 30;\r
+static constexpr uint8_t TIMERLABEL_FONT = 24;\r
+static constexpr int16_t TARGET_SLEEP_COLOR_R = 181;\r
+static constexpr int16_t TARGET_SLEEP_COLOR_G = 402;\r
+static constexpr int16_t TARGET_SLEEP_COLOR_B = 255;\r
+static constexpr int16_t NUM_PICKER = 2;\r
+static constexpr int16_t TARGET_SLEEP_PICKER1_X = 115;\r
+static constexpr int16_t TARGET_SLEEP_PICKER2_Y = 255;\r
+\r
+// 时间选择器分钟列\r
+const char *uiPickerMinute[] = {"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10",\r
+ "11", "12", "13", "14", "15", "16", "17", "18", "19", "20",\r
+ "21", "22", "23", "24", "25", "26", "27", "28", "29", "30",\r
+ "31", "32", "33", "34", "35", "36", "37", "38", "39", "40",\r
+ "41", "42", "43", "44", "45", "46", "47", "48", "49", "50",\r
+ "51", "52", "53", "54", "55", "56", "57", "58", "59"};\r
+\r
+// 时间选择器小时列\r
+const char *uiPickerHour[] = {"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14",\r
+ "15", "16", "17", "18", "19", "20", "21", "22", "23"};\r
+\r
+REGIST_SLICE_PAGE(VIEW_SLEEPING, SLEEPING_PAGES::SLEEPING_TARGET_PAGE, TargetSleepTime, false);\r
+\r
+TargetSleepTime::~TargetSleepTime()\r
+{\r
+ if (group != nullptr) {\r
+ group->RemoveAll();\r
+ delete group;\r
+ group = nullptr;\r
+ }\r
+\r
+ if (setTraget != nullptr) {\r
+ delete setTraget;\r
+ setTraget = nullptr;\r
+ }\r
+\r
+ if (timerLabel != nullptr) {\r
+ delete timerLabel;\r
+ timerLabel = nullptr;\r
+ }\r
+\r
+ if (startButton != nullptr) {\r
+ delete startButton;\r
+ startButton = nullptr;\r
+ }\r
+\r
+ if (backgroundImage != nullptr) {\r
+ delete backgroundImage;\r
+ backgroundImage = nullptr;\r
+ }\r
+\r
+ for (int i = 0; i < NUM_PICKER; i++) {\r
+ if (timerPicker[i] != nullptr) {\r
+ delete timerPicker[i];\r
+ timerPicker[i] = nullptr;\r
+ }\r
+ }\r
+\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TargetSleepTime::~TargetSleepTime");\r
+}\r
+\r
+void TargetSleepTime::OnStart(void* data)\r
+{\r
+ group = new UIScrollView();\r
+ if (group == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group is nullptr");\r
+ return;\r
+ }\r
+ group->SetPosition(0, 0);\r
+ group->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);\r
+\r
+ backgroundImage = new UIImageView();\r
+ if (backgroundImage == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "backgroundImage is nullptr");\r
+ return;\r
+ }\r
+ backgroundImage->SetPosition(0, 0);\r
+ LOADIMG::LoadImageViewImg(backgroundImage, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_BLACK_BG);\r
+ group->Add(backgroundImage);\r
+\r
+ setTraget = new UILabel();\r
+ if (setTraget == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "setTraget is nullptr");\r
+ return;\r
+ }\r
+ setTraget->SetPosition(TARGET_SLEEP_SETTARGET_X, TARGET_SLEEP_SETTARGET_Y);\r
+ setTraget->Resize(TARGET_SLEEP_SETTARGET_WIDTH, TARGET_SLEEP_SETTARGET_HIGHT);\r
+ setTraget->SetText("设置目标");\r
+ setTraget->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ setTraget->SetTextColor(Color::White());\r
+ setTraget->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TARGET_SLEEP_SETTARGET_FONT_SIZE);\r
+ setTraget->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group->Add(setTraget);\r
+\r
+ TargetTimeButton();\r
+ CreateLabel();\r
+ CreatePicker();\r
+\r
+ group->SetOnDragListener(this);\r
+ group->SetDraggable(true);\r
+ group->SetTouchable(true);\r
+ AddViewToPageContainer(group);\r
+}\r
+\r
+void TargetSleepTime::TargetTimeButton()\r
+{\r
+ startButton = new UILabelButton();\r
+ if (startButton == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "startButton is nullptr");\r
+ return;\r
+ }\r
+ startButton->SetPosition(TARGET_SLEEP_START_X, TARGET_SLEEP_START_Y);\r
+ startButton->Resize(TARGET_SLEEP_START_WIDTH, TARGET_SLEEP_START_HIGHT);\r
+ startButton->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ startButton->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ startButton->SetViewId("start");\r
+\r
+ startButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TARGET_SLEEP_SETTARGET_FONT_SIZE);\r
+ startButton->SetStyle(STYLE_BACKGROUND_COLOR, Color::Purple().full);\r
+ startButton->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::White().full, UIButton::PRESSED);\r
+ startButton->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::White().full, UIButton::RELEASED);\r
+ startButton->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::Black().full, UIButton::INACTIVE);\r
+ LOADIMG::LoadBtnImage(startButton, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_SETTIMEBTN, IMAGE_CONVERTER_TOOL_SETTIMEBTN);\r
+ startButton->SetText("开始");\r
+ startButton->SetTextColor(Color::White());\r
+ startButton->Enable();\r
+ startButton->SetOnClickListener(this);\r
+ group->Add(startButton);\r
+}\r
+\r
+void TargetSleepTime::SetPickerTime()\r
+{\r
+ std::tuple<uint32_t, uint32_t> time = SleepingModel::GetInstance().GetTime();\r
+ uint32_t timeHours = std::get<0>(time);\r
+ uint32_t timeMinutes = std::get<1>(time);\r
+ timerPicker[0] -> SetSelected(timeHours);\r
+ timerPicker[1] -> SetSelected(timeMinutes);\r
+}\r
+\r
+void TargetSleepTime::CreatePicker()\r
+{\r
+ int posX[NUM_PICKER] = {TARGET_SLEEP_PICKER1_X, TARGET_SLEEP_PICKER2_Y};\r
+ int posY = TARGET_SLEEP_PICKER_Y;\r
+ for (int i = 0; i < NUM_PICKER; i++) {\r
+ if (timerPicker[i] == nullptr) {\r
+ timerPicker[i] = new UIPicker();\r
+ }\r
+ timerPicker[i]->SetPosition(posX[i], posY);\r
+ timerPicker[i]->Resize(TARGET_SLEEP_PICKER_WIDTH, TARGET_SLEEP_PICKER_HIGHT);\r
+ timerPicker[i]->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ timerPicker[i]->SetStyle(STYLE_BORDER_WIDTH, TARGET_SLEEP_PICKER_BORDER);\r
+ timerPicker[i]->SetStyle(STYLE_BORDER_RADIUS, TARGET_SLEEP_PICKER_RADIUS);\r
+ timerPicker[i]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker[i]->SetItemHeight(TARGET_SLEEP_PICKER_ITEM);\r
+ timerPicker[i]->SetLoopState(true);\r
+ timerPicker[i]->SetBackgroundFont(DEFAULT_VECTOR_FONT_FILENAME, BACKGROUND_FONT);\r
+ timerPicker[i]->SetHighlightFont(DEFAULT_VECTOR_FONT_FILENAME, HIGHTLIGHT_FONT);\r
+ timerPicker[i]->SetTextColor(Color::Gray(), Color::White());\r
+ if (i == 0) {\r
+ timerPicker[i]->SetValues(uiPickerHour, TARGET_SLEEP_PICKER_HOUR);\r
+ timerPicker[i]->SetSelected(TARGET_SLEEP_PICKER_HOUR_RANGE);\r
+ } else {\r
+ timerPicker[i]->SetValues(uiPickerMinute, TARGET_SLEEP_PICKER_MINUTE);\r
+ timerPicker[i]->SetSelected(TARGET_SLEEP_PICKER_MINUTE_RANGE);\r
+ }\r
+ timerPicker[i]->SetOnClickListener(this);\r
+ timerPicker[i]->SetOnDragListener(this);\r
+ timerPicker[i]->RegisterSelectedListener(this);\r
+ timerPicker[i]->SetDraggable(true);\r
+ group->Add(timerPicker[i]);\r
+ }\r
+\r
+ timerPicker[0]->SetViewId("hourPicker");\r
+ timerPicker[1]->SetViewId("minPicker");\r
+ SetPickerTime();\r
+}\r
+\r
+bool TargetSleepTime::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UNUSED(event);\r
+ std::string viewId = view.GetViewId();\r
+ if (viewId == "start") {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TimerMainPage::OnClick viewId == ONE_MIN");\r
+ int hour = std::stoi(uiPickerHour[timerPicker[0]->GetSelected()]);\r
+ uint8_t minute = std::stoi(uiPickerMinute[timerPicker[1]->GetSelected()]);\r
+ SleepingModel::GetInstance().SetTime((hour * TARGET_SLEEP_PICKER_MINUTE) + minute);\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_SLEEPING, SLEEPING_PAGES::SLEEPING_MAIN_PAGE);\r
+ }\r
+ return false;\r
+}\r
+\r
+void TargetSleepTime::CreateLabel()\r
+{\r
+ if (timerLabel == nullptr) {\r
+ timerLabel = new UILabel();\r
+ }\r
+ timerLabel->SetPosition(TARGET_SLEEP_TIMERLABEL_X, TARGET_SLEEP_TIMERLABEL_Y);\r
+ timerLabel->Resize(TARGET_SLEEP_TIMERLABEL_WIDTH, TARGET_SLEEP_TIMERLABEL_HEIGHT);\r
+ timerLabel->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ timerLabel->SetText("小时");\r
+ timerLabel->SetStyle(STYLE_BACKGROUND_COLOR, 0xFFB566FF);\r
+ timerLabel->SetTextColor(Color::Black());\r
+ timerLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ timerLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TIMERLABEL_FONT);\r
+ timerLabel->SetVisible(false);\r
+\r
+ group->Add(timerLabel);\r
+}\r
+\r
+bool TargetSleepTime::OnDrag(UIView& view, const DragEvent& event)\r
+{\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&\r
+ (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TargetSleepTime::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_SLEEPING, SLEEPING_PAGES::SLEEPING_MAIN_PAGE);\r
+ }\r
+ if (view.GetViewId() == "hourPicker") {\r
+ timerPicker[0]->SetStyle(STYLE_BORDER_COLOR,\r
+ Color::GetColorFromRGB(TARGET_SLEEP_COLOR_R, TARGET_SLEEP_COLOR_G, TARGET_SLEEP_COLOR_B).full);\r
+ timerPicker[1]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker[0]->Invalidate();\r
+ timerPicker[1]->Invalidate();\r
+ timerLabel->SetVisible(true);\r
+ timerLabel->SetPosition(TARGET_SLEEP_TIMERLABEL_X, TARGET_SLEEP_TIMERLABEL2_Y);\r
+ timerLabel->SetText("小时");\r
+ timerLabel->Invalidate();\r
+ } else if (view.GetViewId() == "minPicker") {\r
+ timerPicker[1]->SetStyle(STYLE_BORDER_COLOR,\r
+ Color::GetColorFromRGB(TARGET_SLEEP_COLOR_R, TARGET_SLEEP_COLOR_G, TARGET_SLEEP_COLOR_B).full);\r
+ timerPicker[0]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker[0]->Invalidate();\r
+ timerPicker[1]->Invalidate();\r
+ timerLabel->SetVisible(true);\r
+ timerLabel->SetPosition(TARGET_SLEEP_TIMERLABEL2_X, TARGET_SLEEP_TIMERLABEL2_Y);\r
+ timerLabel->SetText("分钟");\r
+ timerLabel->Invalidate();\r
+ }\r
+ return true;\r
+}\r
+\r
+void TargetSleepTime::OnPickerStoped(UIPicker& picker)\r
+{\r
+ if (picker.GetViewId() == "hourPicker") {\r
+ uint16_t hour = picker.GetSelected();\r
+ picker.SetStyle(STYLE_BORDER_COLOR,\r
+ Color::GetColorFromRGB(TARGET_SLEEP_COLOR_R, TARGET_SLEEP_COLOR_G, TARGET_SLEEP_COLOR_B).full);\r
+ picker.Invalidate();\r
+ if ((hour == 0) && (timerPicker[1]->GetSelected() == 0)) {\r
+ startButton->SetText("");\r
+ startButton->Disable();\r
+ LOADIMG::LoadBtnImage(startButton, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_START_GRAY,\r
+ IMAGE_CONVERTER_TOOL_START_GRAY);\r
+ } else {\r
+ startButton->SetText("开始");\r
+ startButton->SetTextColor(Color::White());\r
+ startButton->Enable();\r
+ LOADIMG::LoadBtnImage(startButton, SLEEP_IMAGE,\r
+ IMAGE_CONVERTER_TOOL_SETTIMEBTN, IMAGE_CONVERTER_TOOL_SETTIMEBTN);\r
+ }\r
+ timerLabel->SetVisible(true);\r
+ timerLabel->SetPosition(TARGET_SLEEP_TIMERLABEL_X, TARGET_SLEEP_TIMERLABEL2_Y);\r
+ timerLabel->SetText("小时");\r
+ timerLabel->Invalidate();\r
+ } else {\r
+ uint16_t minute = picker.GetSelected();\r
+ picker.SetStyle(STYLE_BORDER_COLOR,\r
+ Color::GetColorFromRGB(TARGET_SLEEP_COLOR_R, TARGET_SLEEP_COLOR_G, TARGET_SLEEP_COLOR_B).full);\r
+ picker.Invalidate();\r
+ if ((minute == 0) && (timerPicker[0]->GetSelected() == 0)) {\r
+ startButton->SetText("");\r
+ startButton->Disable();\r
+ LOADIMG::LoadBtnImage(startButton, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_START_GRAY,\r
+ IMAGE_CONVERTER_TOOL_START_GRAY);\r
+ } else {\r
+ startButton->SetText("开始");\r
+ startButton->SetTextColor(Color::White());\r
+ startButton->Enable();\r
+ LOADIMG::LoadBtnImage(startButton, SLEEP_IMAGE, IMAGE_CONVERTER_TOOL_SETTIMEBTN,\r
+ IMAGE_CONVERTER_TOOL_SETTIMEBTN);\r
+ }\r
+ timerLabel->SetVisible(true);\r
+ timerLabel->SetPosition(TARGET_SLEEP_TIMERLABEL2_X, TARGET_SLEEP_TIMERLABEL2_Y);\r
+ timerLabel->SetText("分钟");\r
+ timerLabel->Invalidate();\r
+ }\r
+}\r
+}\r
+\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Sports Model\r
+ * Create: 2025-04-28\r
+ */\r
+\r
+#include "sports/SportsView.h"\r
+#include "sports/SportsModel.h"\r
+#include "samgr_lite.h"\r
+#include "broadcast_feature.h"\r
+#include "broadcast_service.h"\r
+#include "wearable_log.h"\r
+#include "heartrate/HeartModel.h"\r
+#include "device_location.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+using namespace OHOS;\r
+static sport_data_t g_sportData = {0};\r
+static void Notify(void *args, const Topic topic, Request *request);\r
+\r
+Subscriber sportsSubscirber = {\r
+ .identity = nullptr,\r
+ .args = nullptr,\r
+ .Notify = Notify,\r
+};\r
+\r
+void SportsSubscribeTopic(Topic topic)\r
+{\r
+#if !defined(_WIN32)\r
+ BroadcastApi *broadcastApi = nullptr;\r
+ IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME);\r
+ if (api == nullptr) {\r
+ return;\r
+ }\r
+ int result = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi);\r
+ if (result != 0 || broadcastApi == nullptr) {\r
+ return;\r
+ }\r
+ int ret = broadcastApi->SubscribeTopic((IUnknown *)broadcastApi, topic, &sportsSubscirber);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportsSubscribeTopic ret = %d, topic = %u", ret, topic);\r
+ broadcastApi->Release((IUnknown *)broadcastApi);\r
+#endif\r
+}\r
+\r
+void SportsUnsubscribeTopic(Topic topic)\r
+{\r
+#if !defined(_WIN32)\r
+ BroadcastApi *broadcastApi = nullptr;\r
+ IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME);\r
+ if (api == nullptr) {\r
+ return;\r
+ }\r
+ int result = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi);\r
+ if (result != 0 || broadcastApi == nullptr) {\r
+ return;\r
+ }\r
+ broadcastApi->UnsubscribeTopic((IUnknown *)broadcastApi, topic, &sportsSubscirber);\r
+ broadcastApi->Release((IUnknown *)broadcastApi);\r
+#endif\r
+}\r
+\r
+static void Notify(void *args, const Topic topic, Request *request)\r
+{\r
+ UNUSED(args);\r
+ UNUSED(topic);\r
+ if (request == nullptr) {\r
+ return;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "topic=[%d,%d]\n", topic, request->msgId);\r
+ SportsView *sportView = SportsView::GetInstance();\r
+ bool active = OHOS::SportsModel::GetInstance()->IsActive();\r
+ if (sportView != nullptr && active) {\r
+ if (request->msgId == TOPIC_EVENT_HEARTRATE_UPDATA) {\r
+ HeartDatas *sportsInfo = (HeartDatas *)request->data;\r
+ g_sportData.heartrate = sportsInfo->perSec;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heartrate=[%d]\n", g_sportData.heartrate);\r
+ sportView->SetHeartRate(g_sportData.heartrate);\r
+ }\r
+ if (request->msgId == TOPIC_EVENT_STEPDATA_UPDATE) {\r
+ g_sportData.step += *(uint32_t *)request->data;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "step=[%d]\n", g_sportData.step);\r
+ sportView->SetStep(g_sportData.step);\r
+ }\r
+ if (request->msgId == TOPIC_EVENT_SPORT_DISTANCE) {\r
+ g_sportData.distance += *(uint32_t *)request->data;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "distance=[%d]\n", g_sportData.distance);\r
+ sportView->SetDistance(g_sportData.distance);\r
+ uint32_t speed = OHOS::SportsModel::GetInstance()->CalculateSpeed(g_sportData.distance);\r
+ g_sportData.speed = speed;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "speed=[%d]\n", g_sportData.speed);\r
+ sportView->SetSpeed(speed);\r
+ }\r
+ if (request->msgId == TOPIC_EVENT_LOCATION) {\r
+ LocationInfo_t *locationData = (LocationInfo_t *)request->data;\r
+ g_sportData.lat = locationData->latitude_;\r
+ g_sportData.lng = locationData->longitude_;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "location=[%d,%d]\n", g_sportData.lat, g_sportData.lng);\r
+ }\r
+ }\r
+}\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+namespace OHOS {\r
+\r
+static constexpr uint16_t MS_ONE_SECONDS = 1000;\r
+static constexpr uint16_t NUM_TEN = 10;\r
+static constexpr uint16_t NUM_TIME_MIN = 60;\r
+static constexpr uint16_t NUM_TIME_HOUR = 3600;\r
+static constexpr uint32_t NUM_TIME_DAY = 86400;\r
+\r
+SportsModel::SportsModel()\r
+{\r
+ InitSportsTimer();\r
+}\r
+\r
+SportsModel::~SportsModel()\r
+{\r
+ StopSportsTimer(true);\r
+ SportsUnsubscribeTopic(TOPIC_EVENT_HEARTRATE_UPDATA);\r
+ SportsUnsubscribeTopic(TOPIC_EVENT_STEPDATA_UPDATE);\r
+ SportsUnsubscribeTopic(TOPIC_EVENT_SPORT_DISTANCE);\r
+ SportsUnsubscribeTopic(TOPIC_EVENT_LOCATION);\r
+}\r
+\r
+SportsModel *SportsModel::GetInstance(void)\r
+{\r
+ static SportsModel instance;\r
+ return &instance;\r
+}\r
+\r
+void SportsModel::Init()\r
+{\r
+ SportsSubscribeTopic(TOPIC_EVENT_HEARTRATE_UPDATA);\r
+ SportsSubscribeTopic(TOPIC_EVENT_STEPDATA_UPDATE);\r
+ SportsSubscribeTopic(TOPIC_EVENT_SPORT_DISTANCE);\r
+ SportsSubscribeTopic(TOPIC_EVENT_LOCATION);\r
+}\r
+\r
+std::string SportsModel::CountingSportsTime()\r
+{\r
+ std::string strSportTime;\r
+ std::string hours;\r
+ std::string minute;\r
+ std::string seconds;\r
+ if (uiSportTime_ >= NUM_TIME_DAY) {\r
+ uiSportTime_ = 0;\r
+ }\r
+ int hour = uiSportTime_ / NUM_TIME_HOUR;\r
+ int min = (uiSportTime_ % NUM_TIME_HOUR) / NUM_TIME_MIN;\r
+ int sec = (uiSportTime_ % NUM_TIME_HOUR) % NUM_TIME_MIN;\r
+ if (hour >= 0 && hour < NUM_TEN) {\r
+ hours = "0" + std::to_string(hour);\r
+ } else {\r
+ hours = std::to_string(hour);\r
+ }\r
+ if (min >= 0 && min < NUM_TEN) {\r
+ minute = "0" + std::to_string(min);\r
+ } else {\r
+ minute = std::to_string(min);\r
+ }\r
+ if (sec >= 0 && sec < NUM_TEN) {\r
+ seconds = "0" + std::to_string(sec);\r
+ } else {\r
+ seconds = std::to_string(sec);\r
+ }\r
+\r
+ strSportTime = hours + ":" + minute + ":" + seconds;\r
+ return strSportTime;\r
+}\r
+\r
+void SportsModel::IncrSportsTime()\r
+{\r
+ uiSportTime_++;\r
+}\r
+\r
+/* 定时器回调函数 */\r
+static void SportsTimerCallback(void *data)\r
+{\r
+ (void)data;\r
+ SportsModel::GetInstance()->IncrSportsTime();\r
+ SportsView *view = SportsView::GetInstance();\r
+ if (view != nullptr) {\r
+ std::string sportTime = SportsModel::GetInstance()->CountingSportsTime();\r
+ view->SetTime(sportTime.c_str());\r
+ }\r
+}\r
+\r
+/* 创建定时器 */\r
+void SportsModel::InitSportsTimer()\r
+{\r
+ if (pGraphicTimer_ != nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportsModel::InitSportsTimer GraphicTimer already exists!!");\r
+ return;\r
+ }\r
+ uint32_t tick = GetOSTick(MS_ONE_SECONDS);\r
+ pGraphicTimer_ = new GraphicTimer(tick, SportsTimerCallback, nullptr, true);\r
+ if (pGraphicTimer_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportsModel::InitSportsTimer new GraphicTimer failed!!");\r
+ return;\r
+ }\r
+}\r
+\r
+/* 开启定时器 */\r
+bool SportsModel::StartSportsTimer()\r
+{\r
+ if (pGraphicTimer_ != nullptr) {\r
+ bool retTimer = pGraphicTimer_->Start();\r
+ if (!retTimer) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StartSportsTimer GraphicTimer Start failed!!");\r
+ if (pGraphicTimer_ != nullptr) {\r
+ delete pGraphicTimer_;\r
+ pGraphicTimer_ = nullptr;\r
+ }\r
+ return false;\r
+ }\r
+ isActive_ = true;\r
+ return true;\r
+ }\r
+ return false;\r
+}\r
+\r
+/* 关闭定时器 */\r
+void SportsModel::StopSportsTimer(bool isDelete)\r
+{\r
+ if (pGraphicTimer_ != nullptr) {\r
+ pGraphicTimer_->Stop();\r
+ isActive_ = false;\r
+ if (isDelete) {\r
+ delete pGraphicTimer_;\r
+ pGraphicTimer_ = nullptr;\r
+ uiSportTime_ = 0;\r
+ }\r
+ }\r
+}\r
+\r
+bool SportsModel::IsActive()\r
+{\r
+ return isActive_;\r
+}\r
+\r
+sport_data_t *SportsModel::GetSportsData()\r
+{\r
+ return &g_sportData;\r
+}\r
+\r
+void SportsModel::ResetSportsData()\r
+{\r
+ uiSportTime_ = 0;\r
+ memset_s(&g_sportData, sizeof(sport_data_t), 0, sizeof(sport_data_t));\r
+}\r
+\r
+uint32_t SportsModel::CalculateSpeed(uint32_t distance)\r
+{\r
+ uint32_t speed_multiply100 = 0;\r
+ if (uiSportTime_ != 0) {\r
+ speed_multiply100 = (distance * NUM_TIME_HOUR) / (uiSportTime_ * NUM_TEN);\r
+ }\r
+ return speed_multiply100;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SPorts Presenter\r
+ * Create: 2025-04-28\r
+ */\r
+\r
+#include "sports/SportsPresenter.h"\r
+#include "sports/SportsView.h"\r
+#include "sports/SportsModel.h"\r
+#include "wearable_log.h"\r
+#include "NativeRegisterManager.h"\r
+\r
+namespace OHOS {\r
+\r
+REGIST_SLICE(VIEW_SPORTS, SportsView, SportsPresenter);\r
+\r
+static SportsPresenter *g_pSportsPresenter = nullptr;\r
+\r
+SportsPresenter::SportsPresenter()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportsPresenter::SportsPresenter");\r
+ g_pSportsPresenter = this;\r
+}\r
+\r
+SportsPresenter::~SportsPresenter()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportsPresenter::~SportsPresenter");\r
+ g_pSportsPresenter = nullptr;\r
+}\r
+\r
+SportsPresenter *SportsPresenter::GetInstance()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportsPresenter GetInstance");\r
+ return g_pSportsPresenter;\r
+}\r
+\r
+bool SportsPresenter::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportsPresenter::OnDrag");\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportsPresenter::OnDrag ChangeSlice");\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);\r
+ }\r
+ return true;\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Sports View\r
+ * Create: 2025-04-28\r
+ */\r
+\r
+#include "sports/SportsView.h"\r
+#include "sports/SportsModel.h"\r
+#include "sports/SportsPresenter.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "uiservice/ui_service.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t NUM_TEN = 10;\r
+static constexpr uint16_t NUM_HUNDRED = 100;\r
+static constexpr uint16_t NUM_THOUSAND = 1000;\r
+static constexpr uint16_t LEFT1_X = 47;\r
+static constexpr uint16_t LEFT1_Y = 100;\r
+static constexpr uint16_t LEFT1_W = 180;\r
+static constexpr uint16_t RIGHT1_X = 227;\r
+static constexpr uint16_t RIGHT1_Y = 100;\r
+static constexpr uint16_t RIGHT1_W = 180;\r
+static constexpr uint16_t LEFT2_X = 47;\r
+static constexpr uint16_t LEFT2_Y = 210;\r
+static constexpr uint16_t LEFT2_W = 180;\r
+static constexpr uint16_t RIGHT2_X = 227;\r
+static constexpr uint16_t RIGHT2_Y = 210;\r
+static constexpr uint16_t RIGHT2_W = 180;\r
+static constexpr uint16_t BOTTOM_X = 92;\r
+static constexpr uint16_t BOTTOM_Y = 320;\r
+static constexpr uint16_t BOTTOM_W = 270;\r
+static constexpr uint16_t LABLE_H = 70;\r
+static constexpr uint16_t UNIT_LEFT1_Y = 150;\r
+static constexpr uint16_t UNIT_RIGHT1_Y = 150;\r
+static constexpr uint16_t UNIT_LEFT2_Y = 260;\r
+static constexpr uint16_t UNIT_RIGHT2_Y = 260;\r
+static constexpr uint16_t UNIT_BOTTOM_Y = 370;\r
+static constexpr uint16_t UNIT_H = 50;\r
+static constexpr uint16_t CONTENT_FONT = 40;\r
+static constexpr uint16_t TITLE_FONT = 30;\r
+\r
+static SportsView *g_pSportsView{nullptr};\r
+SportsView::SportsView()\r
+{\r
+ ScreenTurnOn(-1);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportsView::SportsView");\r
+ g_pSportsView = this;\r
+}\r
+\r
+SportsView::~SportsView()\r
+{\r
+ ScreenTurnOff();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SportsView::~SportsView");\r
+ if (group != nullptr) {\r
+ group->RemoveAll();\r
+ }\r
+ if (backGround != nullptr) {\r
+ delete backGround;\r
+ backGround = nullptr;\r
+ }\r
+ delete group;\r
+ group = nullptr;\r
+ g_pSportsView = nullptr;\r
+}\r
+\r
+SportsView *SportsView::GetInstance()\r
+{\r
+ return g_pSportsView;\r
+}\r
+\r
+bool SportsView::InitLableView(int index, const char *text, uint16_t x, uint16_t y1, uint16_t w, uint16_t y2)\r
+{\r
+ if (index < SPORT_TIME || index >= SPORT_MAX) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportsView::InitLableView index param error");\r
+ return false;\r
+ }\r
+\r
+ ContentLabel[index].SetPosition(x, y1, w, LABLE_H);\r
+ ContentLabel[index].SetFont(DEFAULT_VECTOR_FONT_FILENAME, CONTENT_FONT);\r
+ ContentLabel[index].SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+ ContentLabel[index].SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER,\r
+ UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);\r
+ group->Add(&ContentLabel[index]);\r
+\r
+ TitleLabel[index].SetPosition(x, y2, w, UNIT_H);\r
+ TitleLabel[index].SetText(text);\r
+ TitleLabel[index].SetFont(DEFAULT_VECTOR_FONT_FILENAME, TITLE_FONT);\r
+ TitleLabel[index].SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+ TitleLabel[index].SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER,\r
+ UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);\r
+ group->Add(&TitleLabel[index]);\r
+ return true;\r
+}\r
+\r
+void SportsView::InitSportDataLabel()\r
+{\r
+ ContentLabel[SPORT_TIME].SetText("00:00:00");\r
+ ContentLabel[SPORT_SETP].SetText("0");\r
+ ContentLabel[SPORT_DISTANCE].SetText("0.00");\r
+ ContentLabel[SPORT_HEARTRATE].SetText("0");\r
+ ContentLabel[SPORT_SPEED].SetText("0.00");\r
+}\r
+\r
+bool SportsView::InitView()\r
+{\r
+ bool ret = false;\r
+ group = new UIViewGroup();\r
+ if (group == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group new fail");\r
+ return false;\r
+ }\r
+ group->SetPosition(0, 0); // 0:x; 0:y\r
+ group->SetWidth(HORIZONTAL_RESOLUTION);\r
+ group->SetHeight(VERTICAL_RESOLUTION);\r
+ group->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+ group->SetDraggable(true);\r
+ group->SetTouchable(true);\r
+\r
+ backGround = new UIImageView();\r
+ if (backGround == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "backGroundFirst new fail");\r
+ return false;\r
+ }\r
+ backGround->SetPosition(0, 0); // 0 : X; 0 : Y\r
+ backGround->SetSrc(PNG_WALK_BACK_GROUND);\r
+ group->Add(backGround);\r
+\r
+ InitSportDataLabel();\r
+ ret = InitLableView(SPORT_SETP, "步数", LEFT1_X, LEFT1_Y, LEFT1_W, UNIT_LEFT1_Y);\r
+ if (!ret) {\r
+ return false;\r
+ }\r
+ ret = InitLableView(SPORT_DISTANCE, "距离(km)", RIGHT1_X, RIGHT1_Y, RIGHT1_W, UNIT_RIGHT1_Y);\r
+ if (!ret) {\r
+ return false;\r
+ }\r
+ ret = InitLableView(SPORT_HEARTRATE, "心率(bpm)", LEFT2_X, LEFT2_Y, LEFT2_W, UNIT_LEFT2_Y);\r
+ if (!ret) {\r
+ return false;\r
+ }\r
+ ret = InitLableView(SPORT_SPEED, "速度(km/h)", RIGHT2_X, RIGHT2_Y, RIGHT2_W, UNIT_RIGHT2_Y);\r
+ if (!ret) {\r
+ return false;\r
+ }\r
+ ret = InitLableView(SPORT_TIME, "时间", BOTTOM_X, BOTTOM_Y, BOTTOM_W, UNIT_BOTTOM_Y);\r
+ if (!ret) {\r
+ return false;\r
+ }\r
+ UIView::OnDragListener *dragListener = static_cast<UIView::OnDragListener *>(SportsPresenter::GetInstance());\r
+ group->SetOnDragListener(dragListener);\r
+\r
+ AddViewToRootContainer(group);\r
+ return true;\r
+}\r
+\r
+void SportsView::OnStart()\r
+{\r
+ if (!InitView()) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SportsView::OnStart InitView fail");\r
+ }\r
+ return;\r
+}\r
+\r
+void SportsView::SetStep(uint32_t step)\r
+{\r
+ ContentLabel[SPORT_SETP].SetText(std::to_string(step).c_str());\r
+ ContentLabel[SPORT_SETP].Invalidate();\r
+}\r
+\r
+void SportsView::SetHeartRate(uint16_t heartrate)\r
+{\r
+ ContentLabel[SPORT_HEARTRATE].SetText(std::to_string(heartrate).c_str());\r
+ ContentLabel[SPORT_HEARTRATE].Invalidate();\r
+}\r
+\r
+void SportsView::SetDistance(uint32_t distance)\r
+{\r
+ std::string distance_str;\r
+ uint32_t distance_int_part = distance / NUM_THOUSAND;\r
+ uint32_t distance_fractional_part = (distance % NUM_THOUSAND) / NUM_TEN;\r
+ if (distance_fractional_part < NUM_TEN) {\r
+ distance_str = std::to_string(distance_int_part) + ".0" + std::to_string(distance_fractional_part);\r
+ } else {\r
+ distance_str = std::to_string(distance_int_part) + "." + std::to_string(distance_fractional_part);\r
+ }\r
+ ContentLabel[SPORT_DISTANCE].SetText(distance_str.c_str());\r
+ ContentLabel[SPORT_DISTANCE].Invalidate();\r
+}\r
+\r
+void SportsView::SetSpeed(uint32_t speed)\r
+{\r
+ std::string speed_str;\r
+ uint32_t speed_int_part = speed / NUM_HUNDRED;\r
+ uint32_t speed_fractional_part = speed % NUM_HUNDRED;\r
+\r
+ if (speed_fractional_part < NUM_TEN) {\r
+ speed_str = std::to_string(speed_int_part) + ".0" + std::to_string(speed_fractional_part);\r
+ } else {\r
+ speed_str = std::to_string(speed_int_part) + "." + std::to_string(speed_fractional_part);\r
+ }\r
+\r
+ ContentLabel[SPORT_SPEED].SetText(speed_str.c_str());\r
+ ContentLabel[SPORT_SPEED].Invalidate();\r
+}\r
+\r
+void SportsView::SetTime(const char *time)\r
+{\r
+ ContentLabel[SPORT_TIME].SetText(time);\r
+ ContentLabel[SPORT_TIME].Invalidate();\r
+}\r
+\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: StopwatchAdapter\r
+ * Create: 2025-06-06\r
+ */\r
+#include "stopwatch/StopwatchAdapter.h"\r
+#include "stopwatch/StopwatchItemView.h"\r
+\r
+namespace OHOS {\r
+StopwatchAdapter::StopwatchAdapter() {}\r
+\r
+StopwatchAdapter::~StopwatchAdapter()\r
+{\r
+ listData_.Clear();\r
+}\r
+\r
+uint16_t StopwatchAdapter::GetCount(void)\r
+{\r
+ return listData_.Size();\r
+}\r
+\r
+void StopwatchAdapter::SetData(const List<StopwatchItem> &data)\r
+{\r
+ if (!listData_.IsEmpty()) {\r
+ listData_.Clear();\r
+ }\r
+ ListNode<StopwatchItem> *node = data.Head();\r
+ while (node != data.End()) {\r
+ listData_.PushBack(node->data_);\r
+ node = node->next_;\r
+ }\r
+}\r
+\r
+UIView *StopwatchAdapter::GetView(UIView *inView, int16_t index)\r
+{\r
+ if (listData_.IsEmpty()) {\r
+ return nullptr;\r
+ }\r
+ if (index < 0) {\r
+ return nullptr;\r
+ }\r
+ size_t uindex = index;\r
+ if (uindex >= listData_.Size()) {\r
+ return nullptr;\r
+ }\r
+\r
+ ListNode<StopwatchItem> *node = listData_.Head();\r
+ for (int i = 0; i < index; i++) {\r
+ node = node->next_;\r
+ }\r
+ StopwatchItem itemData = node->data_;\r
+ StopwatchItemView *item = nullptr;\r
+ if (inView == nullptr) {\r
+ item = new StopwatchItemView();\r
+ } else {\r
+ item = static_cast<StopwatchItemView *>(inView);\r
+ }\r
+ size_t rindex = listData_.Size() - index;\r
+ item->SetItemInfo(rindex, itemData);\r
+ return item;\r
+}\r
+\r
+} // namespace OHOS\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: StopwatchItemView\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include "UiConfig.h"\r
+#include "stopwatch/StopwatchItemView.h"\r
+#include "common/image_cache_manager.h"\r
+#include "ui_stopwatch_resource.h"\r
+#include "wearable_log.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t STOPWATCH_ITEM_WIDTH = 312;\r
+static constexpr uint16_t STOPWATCH_ITEM_HEIGHT = 60;\r
+static constexpr uint16_t STOPWATCH_ITEM_BG_XPOS = 6;\r
+static constexpr uint16_t STOPWATCH_ITEM_BG_YPOS = 8;\r
+static constexpr uint16_t STOPWATCH_ITEM_BG_WIDTH = 300;\r
+static constexpr uint16_t STOPWATCH_ITEM_BG_HEIGHT = 44;\r
+static constexpr uint16_t STOPWATCH_ITEM_BG_OPA = 100;\r
+static constexpr uint16_t STOPWATCH_ITEM_NAME_LABEL_XPOS = 33;\r
+static constexpr uint16_t STOPWATCH_ITEM_RECORD_LABEL_XPOS = 154;\r
+static constexpr uint16_t STOPWATCH_ITEM_LABEL_YPOS = 12;\r
+static constexpr uint16_t STOPWATCH_ITEM_NAME_LABEL_WIDTH = 100;\r
+static constexpr uint16_t STOPWATCH_ITEM_RECORD_LABEL_WIDTH = 126;\r
+static constexpr uint16_t STOPWATCH_ITEM_LABEL_HEIGHT = 36;\r
+static constexpr uint16_t STOPWATCH_ITEM_FONT_SIZE = 32;\r
+static constexpr uint32_t STOPWATCH_ITEM_FONT_COLOR = 0xffff8530;\r
+\r
+StopwatchItemView::StopwatchItemView()\r
+{\r
+ SetPosition(0, 0, STOPWATCH_ITEM_WIDTH, STOPWATCH_ITEM_HEIGHT);\r
+ SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ SetTouchable(true);\r
+\r
+ itemBg_.SetPosition(STOPWATCH_ITEM_BG_XPOS, STOPWATCH_ITEM_BG_YPOS);\r
+ itemBg_.Resize(STOPWATCH_ITEM_BG_WIDTH, STOPWATCH_ITEM_BG_HEIGHT);\r
+ itemBg_.SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+ itemBg_.SetStyle(STYLE_BACKGROUND_OPA, STOPWATCH_ITEM_BG_OPA);\r
+ itemBg_.SetTouchable(false);\r
+\r
+ nameLabel_.SetPosition(STOPWATCH_ITEM_NAME_LABEL_XPOS, STOPWATCH_ITEM_LABEL_YPOS);\r
+ nameLabel_.Resize(STOPWATCH_ITEM_NAME_LABEL_WIDTH, STOPWATCH_ITEM_LABEL_HEIGHT);\r
+ nameLabel_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, STOPWATCH_ITEM_FONT_SIZE);\r
+ nameLabel_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ nameLabel_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ nameLabel_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ recordLabel_.SetPosition(STOPWATCH_ITEM_RECORD_LABEL_XPOS, STOPWATCH_ITEM_LABEL_YPOS);\r
+ recordLabel_.Resize(STOPWATCH_ITEM_RECORD_LABEL_WIDTH, STOPWATCH_ITEM_LABEL_HEIGHT);\r
+ recordLabel_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, STOPWATCH_ITEM_FONT_SIZE);\r
+ recordLabel_.SetAlign(TEXT_ALIGNMENT_RIGHT, TEXT_ALIGNMENT_CENTER);\r
+ recordLabel_.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ recordLabel_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ Add(&itemBg_);\r
+ Add(&nameLabel_);\r
+ Add(&recordLabel_);\r
+}\r
+\r
+StopwatchItemView::~StopwatchItemView()\r
+{\r
+ Remove(&nameLabel_);\r
+ Remove(&recordLabel_);\r
+ Remove(&itemBg_);\r
+}\r
+\r
+void StopwatchItemView::SetItemInfo(int16_t index, const StopwatchItem &itemInfo)\r
+{\r
+ nameLabel_.SetText(("分段" + std::to_string(index)).c_str());\r
+ recordLabel_.SetText(itemInfo.record.c_str());\r
+ if (itemInfo.isLatest) {\r
+ nameLabel_.SetStyle(STYLE_TEXT_COLOR, STOPWATCH_ITEM_FONT_COLOR);\r
+ recordLabel_.SetStyle(STYLE_TEXT_COLOR, STOPWATCH_ITEM_FONT_COLOR);\r
+ } else {\r
+ nameLabel_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ recordLabel_.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ }\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: StopwatchModel\r
+ * Create: 2025-06-06\r
+ */\r
+#include <sys/time.h>\r
+#include "stopwatch/StopwatchModel.h"\r
+#include "wearable_log.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t UNIT_SEC_TO_MSEC = 1000;\r
+StopwatchModel::StopwatchModel()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchModel::StopwatchModel");\r
+}\r
+\r
+StopwatchModel::~StopwatchModel()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchModel::~StopwatchModel");\r
+}\r
+\r
+StopwatchModel &StopwatchModel::GetInstance()\r
+{\r
+ static StopwatchModel instance;\r
+ return instance;\r
+}\r
+\r
+void StopwatchModel::SetStartTime()\r
+{\r
+#ifdef _WIN32\r
+ gettimeofday(&startTime_, NULL);\r
+#else\r
+ gettimeofday64(&startTime_, NULL);\r
+#endif\r
+}\r
+\r
+void StopwatchModel::SaveElapsedTime()\r
+{\r
+ uiSavedElapsedTime_ += uiElapsedTime_;\r
+ uiElapsedTime_ = 0;\r
+}\r
+\r
+uint64_t StopwatchModel::GetElapsedTime()\r
+{\r
+ return uiSavedElapsedTime_ + uiElapsedTime_;\r
+}\r
+\r
+uint64_t StopwatchModel::UpdateElapsedTime()\r
+{\r
+#ifdef _WIN32\r
+ struct timeval currTime = {0};\r
+ gettimeofday(&currTime, NULL);\r
+#else\r
+ struct timeval64 currTime = {0};\r
+ gettimeofday64(&currTime, NULL);\r
+#endif\r
+ uiElapsedTime_ = (currTime.tv_sec * UNIT_SEC_TO_MSEC + currTime.tv_usec / UNIT_SEC_TO_MSEC) -\r
+ (startTime_.tv_sec * UNIT_SEC_TO_MSEC + startTime_.tv_usec / UNIT_SEC_TO_MSEC);\r
+ return uiSavedElapsedTime_ + uiElapsedTime_;\r
+}\r
+\r
+void StopwatchModel::ResetCounter()\r
+{\r
+ uiElapsedTime_ = 0;\r
+ uiSavedElapsedTime_ = 0;\r
+ records_.Clear();\r
+}\r
+\r
+bool StopwatchModel::GetActiveState()\r
+{\r
+ return bIsActive_;\r
+}\r
+\r
+void StopwatchModel::SetActiveState()\r
+{\r
+ bIsActive_ = true;\r
+}\r
+\r
+void StopwatchModel::SetInactiveState()\r
+{\r
+ bIsActive_ = false;\r
+}\r
+\r
+List<StopwatchItem> &StopwatchModel::GetRecordsList()\r
+{\r
+ return records_;\r
+}\r
+\r
+void StopwatchModel::AddRecordToList(const StopwatchItem &record)\r
+{\r
+ ListNode<StopwatchItem> *node = records_.Head();\r
+ while (node != records_.End()) {\r
+ StopwatchItem &itemData = node->data_;\r
+ itemData.isLatest = false;\r
+ node = node->next_;\r
+ }\r
+ records_.PushFront(record);\r
+}\r
+\r
+bool StopwatchModel::IsInRecordView()\r
+{\r
+ return bIsRecordView_;\r
+}\r
+\r
+void StopwatchModel::SetRecordViewState(bool state)\r
+{\r
+ bIsRecordView_ = state;\r
+}\r
+\r
+void StopwatchModel::ClearData()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchModel::ClearData start");\r
+ uiElapsedTime_ = 0;\r
+ uiSavedElapsedTime_ = 0;\r
+ bIsActive_ = false;\r
+ bIsRecordView_ = false;\r
+ startTime_ = {0};\r
+ records_.Clear();\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: StopwatchPage\r
+ * Create: 2025-06-06\r
+ */\r
+\r
+#include <string>\r
+#include <sys/time.h>\r
+#include "stopwatch/StopwatchPage.h"\r
+#include "stopwatch/StopwatchView.h"\r
+#include "stopwatch/StopwatchPresenter.h"\r
+#include "stopwatch/StopwatchModel.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "NativeRegisterManager.h"\r
+#include "UiConfig.h"\r
+#include "common/image_cache_manager.h"\r
+#include "ui_stopwatch_resource.h"\r
+#include "main/LoadImg.h"\r
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\r
+\r
+namespace OHOS {\r
+static constexpr char *STOPWATCH_START = "stopwatch_start";\r
+static constexpr char *STOPWATCH_RESET = "stopwatch_reset";\r
+static constexpr uint16_t OFFSET = 4;\r
+static constexpr uint16_t NUM_TEN = 10;\r
+static constexpr uint16_t UNIT_SEC_TO_MSEC = 1000;\r
+static constexpr uint16_t UNIT_SECS_PER_MIN = 60;\r
+static constexpr uint16_t UNIT_SECS_PER_HOUR = 3600;\r
+static constexpr uint16_t MAX_RECORD_SIZE = 20;\r
+static constexpr uint16_t STOPWATCH_CONTAINER_XPOS = 0;\r
+static constexpr uint16_t STOPWATCH_CONTAINER_YPOS = 0;\r
+static constexpr uint16_t STOPWATCH_HAND_POSITION_XPOS = 224;\r
+static constexpr uint16_t STOPWATCH_HAND_POSITION_YPOS = 4;\r
+static constexpr uint16_t STOPWATCH_HAND_CENTER_XPOS = 3;\r
+static constexpr uint16_t STOPWATCH_HAND_CENTER_YPOS = 223;\r
+static constexpr uint16_t STOPWATCH_HAND_WIDTH = 2;\r
+static constexpr uint16_t STOPWATCH_HAND_HEIGHT = 5;\r
+static constexpr uint16_t STOPWATCH_LABEL_CURTIME_XPOS = 199;\r
+static constexpr uint16_t STOPWATCH_LABEL_CURTIME_YPOS = 54;\r
+static constexpr uint16_t STOPWATCH_LABEL_CURTIME_WIDTH = 67;\r
+static constexpr uint16_t STOPWATCH_LABEL_CURTIME_HEIGHT = 24;\r
+static constexpr uint16_t STOPWATCH_LABEL_CURTIME_FONT_SIZE = 24;\r
+static constexpr uint16_t STOPWATCH_LABEL_APPNAME_XPOS = 197;\r
+static constexpr uint16_t STOPWATCH_LABEL_APPNAME_YPOS = 82;\r
+static constexpr uint16_t STOPWATCH_LABEL_APPNAME_WIDTH = 64;\r
+static constexpr uint16_t STOPWATCH_LABEL_APPNAME_HEIGHT = 38;\r
+static constexpr uint16_t STOPWATCH_LABEL_APPNAME_FONT_SIZE = 32;\r
+static constexpr uint16_t STOPWATCH_LABEL_ELSTIME_XPOS = 87;\r
+static constexpr uint16_t STOPWATCH_LABEL_ELSTIME_YPOS1 = 176;\r
+static constexpr uint16_t STOPWATCH_LABEL_ELSTIME_YPOS2 = 82;\r
+static constexpr uint16_t STOPWATCH_LABEL_ELSTIME_WIDTH = 302;\r
+static constexpr uint16_t STOPWATCH_LABEL_ELSTIME_HEIGHT = 90;\r
+static constexpr uint16_t STOPWATCH_LABEL_ELSTIME_FONT_SIZE = 72;\r
+static constexpr uint16_t STOPWATCH_BUTTON_SRART_XPOS = 250;\r
+static constexpr uint16_t STOPWATCH_BUTTON_SRART_YPOS = 302;\r
+static constexpr uint16_t STOPWATCH_BUTTON_PAUSE_XPOS = 110;\r
+static constexpr uint16_t STOPWATCH_BUTTON_PAUSE_YPOS = 302;\r
+static constexpr uint16_t STOPWATCH_BUTTON_WIDTH = 96;\r
+static constexpr uint16_t STOPWATCH_BUTTON_HEIGHT = 96;\r
+static constexpr uint16_t STOPWATCH_LIST_RECORD_XPOS = 73;\r
+static constexpr uint16_t STOPWATCH_LIST_RECORD_YPOS = 170;\r
+static constexpr uint16_t STOPWATCH_LIST_RECORD_WIDTH = 312;\r
+static constexpr uint16_t STOPWATCH_LIST_RECORD_HEIGHT = 122;\r
+static constexpr uint16_t STOPWATCH_LABEL_REBOUND_SIZE = 60;\r
+\r
+REGIST_SLICE_PAGE(VIEW_STOPWATCH, STOPWATCH_PAGES::STOPWATCH_MAIN_PAGE, StopwatchPage, true);\r
+\r
+static std::string GetCurrentTimeStr()\r
+{\r
+ struct tm localTime;\r
+ time_t seconds = time(nullptr);\r
+ localtime_r(&seconds, &localTime);\r
+ std::string currTime;\r
+ if (localTime.tm_hour < NUM_TEN) {\r
+ currTime += "0";\r
+ }\r
+ currTime += std::to_string(localTime.tm_hour) + ":";\r
+ if (localTime.tm_min < NUM_TEN) {\r
+ currTime += "0";\r
+ }\r
+ currTime += std::to_string(localTime.tm_min);\r
+ return currTime;\r
+}\r
+\r
+static uint64_t GetMilliSeconds(uint64_t uiElapsedTime)\r
+{\r
+ return (uiElapsedTime % (UNIT_SECS_PER_HOUR * UNIT_SEC_TO_MSEC)) % (UNIT_SECS_PER_MIN * UNIT_SEC_TO_MSEC);\r
+}\r
+\r
+static std::string FormatElapsedTime(uint64_t uiElapsedTime)\r
+{\r
+ std::string strElapsedTime;\r
+ std::string hours;\r
+ std::string minute;\r
+ std::string seconds;\r
+ std::string centisecs;\r
+ uint64_t hour = uiElapsedTime / (UNIT_SECS_PER_HOUR * UNIT_SEC_TO_MSEC);\r
+ uiElapsedTime %= (UNIT_SECS_PER_HOUR * UNIT_SEC_TO_MSEC);\r
+ uint64_t min = uiElapsedTime / (UNIT_SECS_PER_MIN * UNIT_SEC_TO_MSEC);\r
+ uiElapsedTime %= (UNIT_SECS_PER_MIN * UNIT_SEC_TO_MSEC);\r
+ uint64_t sec = uiElapsedTime / UNIT_SEC_TO_MSEC;\r
+ uiElapsedTime %= UNIT_SEC_TO_MSEC;\r
+ uint64_t csec = uiElapsedTime / NUM_TEN;\r
+ if (hour >= 0 && hour < NUM_TEN) {\r
+ hours = "0" + std::to_string(hour);\r
+ } else {\r
+ hours = std::to_string(hour);\r
+ }\r
+ if (min >= 0 && min < NUM_TEN) {\r
+ minute = "0" + std::to_string(min);\r
+ } else {\r
+ minute = std::to_string(min);\r
+ }\r
+ if (sec >= 0 && sec < NUM_TEN) {\r
+ seconds = "0" + std::to_string(sec);\r
+ } else {\r
+ seconds = std::to_string(sec);\r
+ }\r
+ if (csec >= 0 && csec < NUM_TEN) {\r
+ centisecs = "0" + std::to_string(csec);\r
+ } else {\r
+ centisecs = std::to_string(csec);\r
+ }\r
+ strElapsedTime = minute + ":" + seconds + "." + centisecs;\r
+ return strElapsedTime;\r
+}\r
+\r
+void StopwatchPage::StopwatchAnimatorCallback::Callback(UIView *view)\r
+{\r
+ UNUSED(view);\r
+ uint64_t uiElapsedTime = StopwatchModel::GetInstance().UpdateElapsedTime();\r
+ uint64_t millisecs = GetMilliSeconds(uiElapsedTime);\r
+ stopwatchPage->GetSweepClock()->SetSweepTime24Hour(0, 0, millisecs);\r
+ stopwatchPage->GetSweepClock()->Invalidate();\r
+ std::string strElapsedTime = FormatElapsedTime(uiElapsedTime);\r
+ stopwatchPage->GetElapsedTimeLabel()->SetText(strElapsedTime.c_str());\r
+ if (uiElapsedTime >= UNIT_SECS_PER_HOUR * UNIT_SEC_TO_MSEC) {\r
+ stopwatchPage->Overflowing();\r
+ }\r
+}\r
+\r
+void StopwatchPage::TimeAnimatorCallback::Callback(UIView *view)\r
+{\r
+ UILabel *timeLabel = dynamic_cast<UILabel *>(view);\r
+ if (timeLabel == nullptr) {\r
+ return;\r
+ }\r
+ std::string currTime = GetCurrentTimeStr();\r
+ timeLabel->SetText(currTime.c_str());\r
+ timeLabel->Invalidate();\r
+}\r
+\r
+StopwatchPage::StopwatchPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchPage::StopwatchPage");\r
+}\r
+\r
+StopwatchPage::~StopwatchPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchPage::~StopwatchPage");\r
+ bool ret = ImageCacheManager::GetInstance().UnloadAllInMultiRes(PNG_APPLIST_STOPWATCH_IMAGE);\r
+ if (ret == false) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnloadStopwatchImage fail");\r
+ }\r
+ if (sweepClock_ != nullptr) {\r
+ sweepClock_->RemoveAll();\r
+ delete sweepClock_;\r
+ sweepClock_ = nullptr;\r
+ }\r
+ if (currentTime_ != nullptr) {\r
+ delete currentTime_;\r
+ currentTime_ = nullptr;\r
+ }\r
+ if (appName_ != nullptr) {\r
+ delete appName_;\r
+ appName_ = nullptr;\r
+ }\r
+ if (elapsedTime_ != nullptr) {\r
+ delete elapsedTime_;\r
+ elapsedTime_ = nullptr;\r
+ }\r
+ if (startButton_ != nullptr) {\r
+ delete startButton_;\r
+ startButton_ = nullptr;\r
+ }\r
+ if (resetButton_ != nullptr) {\r
+ delete resetButton_;\r
+ resetButton_ = nullptr;\r
+ }\r
+ if (recordsList_ != nullptr) {\r
+ delete recordsList_;\r
+ recordsList_ = nullptr;\r
+ }\r
+ if (listAdapter_ != nullptr) {\r
+ delete listAdapter_;\r
+ listAdapter_ = nullptr;\r
+ }\r
+ if (backGround_ != nullptr) {\r
+ delete backGround_;\r
+ backGround_ = nullptr;\r
+ }\r
+ if (imgScale_ != nullptr) {\r
+ delete imgScale_;\r
+ imgScale_ = nullptr;\r
+ }\r
+ if (secondHand_ != nullptr) {\r
+ delete secondHand_;\r
+ secondHand_ = nullptr;\r
+ }\r
+ if (animator_ != nullptr) {\r
+ delete animator_;\r
+ animator_ = nullptr;\r
+ }\r
+ if (animatorCallback_ != nullptr) {\r
+ delete animatorCallback_;\r
+ animatorCallback_ = nullptr;\r
+ }\r
+ if (timeAnimator_ != nullptr) {\r
+ delete timeAnimator_;\r
+ timeAnimator_ = nullptr;\r
+ }\r
+ if (timeCallback_ != nullptr) {\r
+ delete timeCallback_;\r
+ timeCallback_ = nullptr;\r
+ }\r
+}\r
+\r
+void StopwatchPage::OnStart(void *data)\r
+{\r
+ bool ret = ImageCacheManager::GetInstance().LoadAllInMultiRes(PNG_APPLIST_STOPWATCH_IMAGE);\r
+ if (ret == false) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadStopwatchImage fail");\r
+ return;\r
+ }\r
+\r
+ sweepClock_ = new UISweepClock();\r
+ if (sweepClock_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UISweepClock new fail");\r
+ return;\r
+ }\r
+ sweepClock_->SetPosition(STOPWATCH_CONTAINER_XPOS, STOPWATCH_CONTAINER_YPOS);\r
+ sweepClock_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ sweepClock_->SetDraggable(true);\r
+ sweepClock_->SetTouchable(true);\r
+\r
+ secondHand_ = new Image();\r
+ if (secondHand_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "secondHand new fail");\r
+ return;\r
+ }\r
+ ImageInfo *second =\r
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_STOPWATCH_STOPWATCH02, PNG_APPLIST_STOPWATCH_IMAGE);\r
+\r
+ if (second == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::OnStart source fail");\r
+ return;\r
+ }\r
+ secondHand_->SetSrc(second);\r
+ sweepClock_->SetHandImage(UISweepClock::HandType::SECOND_HAND, *secondHand_,\r
+ {STOPWATCH_HAND_POSITION_XPOS, STOPWATCH_HAND_POSITION_YPOS},\r
+ {STOPWATCH_HAND_CENTER_XPOS, STOPWATCH_HAND_CENTER_YPOS});\r
+ sweepClock_->SetHandLine(UISweepClock::HandType::HOUR_HAND,\r
+ {STOPWATCH_HAND_POSITION_XPOS, STOPWATCH_HAND_POSITION_YPOS},\r
+ {STOPWATCH_HAND_CENTER_XPOS, STOPWATCH_HAND_CENTER_YPOS}, Color::White(),\r
+ STOPWATCH_HAND_WIDTH, STOPWATCH_HAND_HEIGHT, OPA_TRANSPARENT);\r
+ sweepClock_->SetHandLine(UISweepClock::HandType::MINUTE_HAND,\r
+ {STOPWATCH_HAND_POSITION_XPOS, STOPWATCH_HAND_POSITION_YPOS},\r
+ {STOPWATCH_HAND_CENTER_XPOS, STOPWATCH_HAND_CENTER_YPOS}, Color::White(),\r
+ STOPWATCH_HAND_WIDTH, STOPWATCH_HAND_HEIGHT, OPA_TRANSPARENT);\r
+\r
+ sweepClock_->SetWorkMode(UISweepClock::WorkMode::NORMAL);\r
+ uint64_t uiElapsedTime = StopwatchModel::GetInstance().GetElapsedTime();\r
+ uint64_t millisecs = GetMilliSeconds(uiElapsedTime);\r
+ sweepClock_->SetSweepTime24Hour(0, 0, millisecs);\r
+\r
+ backGround_ = new UIImageView();\r
+ if (backGround_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "backGroundFirst new fail");\r
+ return;\r
+ }\r
+ backGround_->SetPosition(0, 0);\r
+ LOADIMG::LoadImageViewImg(backGround_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH06);\r
+ sweepClock_->Add(backGround_);\r
+\r
+ imgScale_ = new UIImageView();\r
+ if (imgScale_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "backGroundFirst new fail");\r
+ return;\r
+ }\r
+ imgScale_->SetPosition(OFFSET, OFFSET);\r
+ LOADIMG::LoadImageViewImg(imgScale_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH04);\r
+ sweepClock_->Add(imgScale_);\r
+\r
+ currentTime_ = new UILabel();\r
+ if (currentTime_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::SetupCurrentTime new Label currentTime_ fail");\r
+ return;\r
+ }\r
+ currentTime_->SetPosition(STOPWATCH_LABEL_CURTIME_XPOS, STOPWATCH_LABEL_CURTIME_YPOS);\r
+ currentTime_->Resize(STOPWATCH_LABEL_CURTIME_WIDTH, STOPWATCH_LABEL_CURTIME_HEIGHT);\r
+ currentTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, STOPWATCH_LABEL_CURTIME_FONT_SIZE);\r
+ currentTime_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ currentTime_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ currentTime_->SetVisible(true);\r
+ sweepClock_->Add(currentTime_);\r
+\r
+ appName_ = new UILabel();\r
+ if (appName_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::SetupAppName new Label appName_ fail");\r
+ return;\r
+ }\r
+ appName_->SetPosition(STOPWATCH_LABEL_APPNAME_XPOS, STOPWATCH_LABEL_APPNAME_YPOS);\r
+ appName_->Resize(STOPWATCH_LABEL_APPNAME_WIDTH, STOPWATCH_LABEL_APPNAME_HEIGHT);\r
+ appName_->SetText(STOPWATCH_APP_NAME);\r
+ appName_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ appName_->SetTextColor(Color::White());\r
+ appName_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, STOPWATCH_LABEL_APPNAME_FONT_SIZE);\r
+ appName_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ appName_->SetVisible(true);\r
+ sweepClock_->Add(appName_);\r
+\r
+ elapsedTime_ = new UILabel();\r
+ if (elapsedTime_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::SetupElapsedTime new Label elapsedTime_ fail");\r
+ return;\r
+ }\r
+ elapsedTime_->SetPosition(STOPWATCH_LABEL_ELSTIME_XPOS, STOPWATCH_LABEL_ELSTIME_YPOS1);\r
+ elapsedTime_->Resize(STOPWATCH_LABEL_ELSTIME_WIDTH, STOPWATCH_LABEL_ELSTIME_HEIGHT);\r
+ elapsedTime_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ elapsedTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, STOPWATCH_LABEL_ELSTIME_FONT_SIZE);\r
+ elapsedTime_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ elapsedTime_->SetVisible(true);\r
+ std::string strElapsedTime = FormatElapsedTime(uiElapsedTime);\r
+ elapsedTime_->SetText(strElapsedTime.c_str());\r
+ sweepClock_->Add(elapsedTime_);\r
+\r
+ startButton_ = new UILabelButton();\r
+ if (startButton_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::SetupButton new UILabelButton startButton_ fail");\r
+ return;\r
+ }\r
+ startButton_->SetPosition(STOPWATCH_BUTTON_SRART_XPOS, STOPWATCH_BUTTON_SRART_YPOS);\r
+ startButton_->Resize(STOPWATCH_BUTTON_WIDTH, STOPWATCH_BUTTON_HEIGHT);\r
+ startButton_->SetViewId(STOPWATCH_START);\r
+ startButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+ startButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ startButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+ startButton_->SetOnClickListener(this);\r
+ sweepClock_->Add(startButton_);\r
+\r
+ resetButton_ = new UILabelButton();\r
+ if (resetButton_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::SetupButton new UILabelButton resetButton_ fail");\r
+ return;\r
+ }\r
+ resetButton_->SetPosition(STOPWATCH_BUTTON_PAUSE_XPOS, STOPWATCH_BUTTON_PAUSE_YPOS);\r
+ resetButton_->Resize(STOPWATCH_BUTTON_WIDTH, STOPWATCH_BUTTON_HEIGHT);\r
+ resetButton_->SetViewId(STOPWATCH_RESET);\r
+ resetButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::RELEASED);\r
+ resetButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::PRESSED);\r
+ resetButton_->SetStyleForState(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT, UIButton::INACTIVE);\r
+ resetButton_->SetOnClickListener(this);\r
+ sweepClock_->Add(resetButton_);\r
+\r
+ listAdapter_ = new StopwatchAdapter();\r
+ if (listAdapter_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+ "StopwatchPage::SetupRecordsList new StopwatchAdapter listAdapter_ fail");\r
+ return;\r
+ }\r
+ recordsList_ = new UIList();\r
+ if (recordsList_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::SetupRecordsList new UIList recordsList_ fail");\r
+ return;\r
+ }\r
+ recordsList_->SetPosition(STOPWATCH_LIST_RECORD_XPOS, STOPWATCH_LIST_RECORD_YPOS);\r
+ recordsList_->Resize(STOPWATCH_LIST_RECORD_WIDTH, STOPWATCH_LIST_RECORD_HEIGHT);\r
+ recordsList_->SetThrowDrag(true);\r
+ recordsList_->SetDraggable(true);\r
+ recordsList_->SetReboundSize(STOPWATCH_LABEL_REBOUND_SIZE);\r
+ recordsList_->EnableAutoAlign(true);\r
+ recordsList_->SetElastic(true);\r
+ recordsList_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ recordsList_->SetAdapter(listAdapter_);\r
+ recordsList_->SetVisible(false);\r
+ sweepClock_->Add(recordsList_);\r
+\r
+ animatorCallback_ = new StopwatchAnimatorCallback(this);\r
+ if (animatorCallback_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "callBack new fail\n");\r
+ return;\r
+ }\r
+\r
+ animator_ = new Animator(animatorCallback_, nullptr, 0, true);\r
+ if (animator_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::InitView new Animator animator_ fail");\r
+ return;\r
+ }\r
+\r
+ timeCallback_ = new TimeAnimatorCallback();\r
+ if (timeCallback_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "callBack new fail\n");\r
+ return;\r
+ }\r
+\r
+ timeAnimator_ = new Animator(timeCallback_, currentTime_, 0, true);\r
+ if (timeAnimator_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopwatchPage::InitView new Animator timeAnimator_ fail");\r
+ return;\r
+ }\r
+ timeAnimator_->Start();\r
+\r
+ sweepClock_->SetOnDragListener(this);\r
+ AddViewToPageContainer(sweepClock_);\r
+\r
+ bool isActive = StopwatchModel::GetInstance().GetActiveState();\r
+ DrawButtonStatusView(isActive);\r
+ bool state = StopwatchModel::GetInstance().IsInRecordView();\r
+ if (StopwatchModel::GetInstance().GetOverflowState()) {\r
+ state = false;\r
+ }\r
+ DrawContainRecordListView(state);\r
+}\r
+\r
+void StopwatchPage::OnStop() {}\r
+\r
+void StopwatchPage::OnPause()\r
+{\r
+ if (animator_ != nullptr) {\r
+ if (animator_->GetState() != Animator::STOP) {\r
+ animator_->Stop();\r
+ }\r
+ }\r
+ if (timeAnimator_ != nullptr) {\r
+ if (timeAnimator_->GetState() != Animator::STOP) {\r
+ timeAnimator_->Stop();\r
+ }\r
+ }\r
+}\r
+\r
+void StopwatchPage::OnResume()\r
+{\r
+ if (animator_ != nullptr) {\r
+ bool isActive = StopwatchModel::GetInstance().GetActiveState();\r
+ if (isActive && animator_->GetState() == Animator::STOP) {\r
+ animator_->Start();\r
+ }\r
+ }\r
+ if (timeAnimator_ != nullptr) {\r
+ if (timeAnimator_->GetState() == Animator::STOP) {\r
+ timeAnimator_->Start();\r
+ }\r
+ }\r
+}\r
+\r
+void StopwatchPage::DrawButtonStatusView(bool isActive)\r
+{\r
+ if (isActive) {\r
+ LOADIMG::LoadBtnImage(startButton_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH08,\r
+ IMAGE_STOPWATCH_STOPWATCH08);\r
+ startButton_->Invalidate();\r
+\r
+ resetButton_->Enable();\r
+ LOADIMG::LoadBtnImage(resetButton_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH14,\r
+ IMAGE_STOPWATCH_STOPWATCH14);\r
+ auto &recordList = StopwatchModel::GetInstance().GetRecordsList();\r
+ if (recordList.Size() >= MAX_RECORD_SIZE) {\r
+ resetButton_->Disable();\r
+ LOADIMG::LoadBtnImage(resetButton_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH20,\r
+ IMAGE_STOPWATCH_STOPWATCH20);\r
+ }\r
+ resetButton_->Invalidate();\r
+ } else {\r
+ LOADIMG::LoadBtnImage(startButton_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH12,\r
+ IMAGE_STOPWATCH_STOPWATCH12);\r
+ startButton_->Invalidate();\r
+\r
+ resetButton_->Enable();\r
+ // 复位\r
+ LOADIMG::LoadBtnImage(resetButton_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH19,\r
+ IMAGE_STOPWATCH_STOPWATCH19);\r
+ uint64_t elapsedTime = StopwatchModel::GetInstance().GetElapsedTime();\r
+ if (elapsedTime == 0) {\r
+ resetButton_->Disable();\r
+ LOADIMG::LoadBtnImage(resetButton_, PNG_APPLIST_STOPWATCH_IMAGE, IMAGE_STOPWATCH_STOPWATCH10,\r
+ IMAGE_STOPWATCH_STOPWATCH10);\r
+ }\r
+ resetButton_->Invalidate();\r
+ }\r
+}\r
+\r
+void StopwatchPage::DrawContainRecordListView(bool isContainRecordList)\r
+{\r
+ if (isContainRecordList) {\r
+ appName_->SetVisible(false);\r
+ recordsList_->SetVisible(true);\r
+ elapsedTime_->SetPosition(STOPWATCH_LABEL_ELSTIME_XPOS, STOPWATCH_LABEL_ELSTIME_YPOS2);\r
+ } else {\r
+ appName_->SetVisible(true);\r
+ recordsList_->SetVisible(false);\r
+ elapsedTime_->SetPosition(STOPWATCH_LABEL_ELSTIME_XPOS, STOPWATCH_LABEL_ELSTIME_YPOS1);\r
+ }\r
+ RefreshRecordsList();\r
+}\r
+\r
+void StopwatchPage::RefreshRecordsList()\r
+{\r
+ auto &records = StopwatchModel::GetInstance().GetRecordsList();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchPage::RefreshRecordsList");\r
+ listAdapter_->SetData(records);\r
+ recordsList_->RefreshList();\r
+}\r
+\r
+bool StopwatchPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UNUSED(event);\r
+ bool isActive = StopwatchModel::GetInstance().GetActiveState();\r
+ if (strcmp(view.GetViewId(), STOPWATCH_START) == 0) {\r
+ if (isActive) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchPresenter::OnClick activeState = %d, pause counting click",\r
+ isActive);\r
+ StopwatchModel::GetInstance().SetInactiveState();\r
+ DrawButtonStatusView(false);\r
+ animator_->Stop();\r
+ StopwatchModel::GetInstance().SaveElapsedTime();\r
+ } else {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchPresenter::OnClick activeState = %d, start counting click",\r
+ isActive);\r
+ StopwatchModel::GetInstance().SetActiveState();\r
+ if (StopwatchModel::GetInstance().GetOverflowState()) {\r
+ DrawContainRecordListView(false);\r
+ StopwatchModel::GetInstance().SetOverflowState(false);\r
+ }\r
+ DrawButtonStatusView(true);\r
+ StopwatchModel::GetInstance().SetStartTime();\r
+ animator_->Start();\r
+ }\r
+ } else if (strcmp(view.GetViewId(), STOPWATCH_RESET) == 0) {\r
+ if (isActive) {\r
+ StopwatchModel::GetInstance().SetRecordViewState(true);\r
+ uint64_t uiElapsedTime = StopwatchModel::GetInstance().GetElapsedTime();\r
+ std::string strElapsedTime = FormatElapsedTime(uiElapsedTime);\r
+ StopwatchItem item = {strElapsedTime, true};\r
+ StopwatchModel::GetInstance().AddRecordToList(item);\r
+ DrawContainRecordListView(true);\r
+ DrawButtonStatusView(true);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchPresenter::OnClick save a record");\r
+ } else {\r
+ StopwatchModel::GetInstance().SetRecordViewState(false);\r
+ StopwatchModel::GetInstance().ResetCounter();\r
+ elapsedTime_->SetText("00:00.00");\r
+ sweepClock_->SetInitTime24Hour(0, 0, 0);\r
+ sweepClock_->Invalidate();\r
+ DrawContainRecordListView(false);\r
+ DrawButtonStatusView(false);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchPresenter::OnClick reset a record");\r
+ }\r
+ }\r
+ return true;\r
+}\r
+\r
+bool StopwatchPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchOnDragListener::OnDrag");\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopwatchOnDragListener::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+ }\r
+ return true;\r
+}\r
+\r
+void StopwatchPage::Overflowing()\r
+{\r
+ animator_->Stop();\r
+ elapsedTime_->SetText("59:59.99");\r
+ sweepClock_->SetSweepTime24Hour(0, 0, 0);\r
+ sweepClock_->Invalidate();\r
+ StopwatchModel::GetInstance().SetInactiveState();\r
+ DrawButtonStatusView(false);\r
+ StopwatchModel::GetInstance().ResetCounter();\r
+ StopwatchModel::GetInstance().SetOverflowState(true);\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: StopwatchPresenter\r
+ * Create: 2025-06-06\r
+ */\r
+#include "stopwatch/StopwatchView.h"\r
+#include "stopwatch/StopwatchPresenter.h"\r
+#include "NativeRegisterManager.h"\r
+\r
+namespace OHOS {\r
+\r
+REGIST_MENU(VIEW_STOPWATCH, StopwatchView, StopwatchPresenter, PNG_APPLIST_STOPWATCH_LOGO, PNG_APPLIST_DEFAULT_IMG,\r
+ "秒表");\r
+}
\ No newline at end of file
#include "UiConfig.h"\r
#include <string>\r
#include "font/ui_font.h"\r
-#include "TempClickMea.h"\r
+#include "temperature/TempClickMea.h"\r
\r
namespace OHOS {\r
static TempClickMea *g_tempClickMea = nullptr;\r
\r
#include "UiConfig.h"\r
#include <string>\r
-#include "TempContinueWarn.h"\r
+#include "temperature/TempContinueWarn.h"\r
\r
namespace OHOS {\r
static TempContinueWarn *g_tempContinueWarn = nullptr;\r
#include "layout/grid_layout.h"\r
#include "font/ui_font.h"\r
#include <string>\r
-#include "TempExitInter.h"\r
+#include "temperature/TempExitInter.h"\r
\r
namespace OHOS {\r
static TempExitInter *g_tempExitInter = nullptr;\r
#include "UiConfig.h"\r
#include "layout/grid_layout.h"\r
#include <string>\r
-#include "TempExitPrompt.h"\r
+#include "temperature/TempExitPrompt.h"\r
\r
namespace OHOS {\r
static TempExitPrompt *g_tempExitPrompt = nullptr;\r
\r
#include "UiConfig.h"\r
#include <string>\r
-#include "TempInitInter.h"\r
+#include "temperature/TempInitInter.h"\r
\r
namespace OHOS {\r
static TempInitInter *g_tempInitInter = nullptr;\r
#include "UiConfig.h"\r
#include "layout/grid_layout.h"\r
#include <string>\r
-#include "TempJoinStudy.h"\r
+#include "temperature/TempJoinStudy.h"\r
\r
namespace OHOS {\r
static TempJoinStudy *g_tempJoinStudy = nullptr;\r
\r
#include "UiConfig.h"\r
#include <string>\r
-#include "TempLittleTip.h"\r
+#include "temperature/TempLittleTip.h"\r
\r
namespace OHOS {\r
static TempLittleTip *g_tempJoinStudy = nullptr;\r
* Create: 2022-02-15\r
*/\r
\r
-#include "TempMainView.h"\r
+#include "temperature/TempMainView.h"\r
#include "UiConfig.h"\r
-#include "TempMeaProcess.h"\r
-#include "TempWarn.h"\r
+#include "temperature/TempMeaProcess.h"\r
+#include "temperature/TempWarn.h"\r
\r
namespace OHOS {\r
static TempMainView *g_tempMainView = nullptr;\r
\r
#include "UiConfig.h"\r
#include <string>\r
-#include "TempMeaProcess.h"\r
-#include "TempMainView.h"\r
+#include "temperature/TempMeaProcess.h"\r
+#include "temperature/TempMainView.h"\r
\r
namespace OHOS {\r
static TempMeaProcess *g_tempMeaProcess = nullptr;\r
\r
#include "UiConfig.h"\r
#include <string>\r
-#include "TempMeasure.h"\r
+#include "temperature/TempMeasure.h"\r
\r
namespace OHOS {\r
static TempMeasure *g_tempMeasure = nullptr;\r
* Create: 2022-02-15\r
*/\r
\r
-#include "TempModel.h"\r
+#include "temperature/TempModel.h"\r
#include "UiConfig.h"\r
-#include "TempModel.h"\r
+#include "temperature/TempModel.h"\r
\r
namespace OHOS {\r
TempModel::TempModel()\r
* Create: 2022-02-15\r
*/\r
\r
-#include "TempPresenter.h"\r
-#include "TempMainView.h"\r
+#include "temperature/TempPresenter.h"\r
+#include "temperature/TempMainView.h"\r
#include "ChangeSliceListener.h"\r
#include "graphic_service.h"\r
-#include "ui_service.h"\r
+#include "uiservice/ui_service.h"\r
#include "string"\r
#include "iostream"\r
#include "sstream"\r
\r
void TempPresenter::OnResume(void) \r
{\r
- Presenter<TempMainView>::OnResume();\r
SendMsgToUIService(UI_ADD_SLEEP_VETO, 0, nullptr, 0);\r
}\r
\r
\r
#include "UiConfig.h"\r
#include <string>\r
-#include "TempPromptWear.h"\r
+#include "temperature/TempPromptWear.h"\r
\r
namespace OHOS {\r
static TempPromptWear *g_tempPromptWear = nullptr;\r
\r
#include "UiConfig.h"\r
#include <string>\r
-#include "TempRemindWear.h"\r
+#include "temperature/TempRemindWear.h"\r
\r
namespace OHOS {\r
static TempRemindWear *g_tempRemindWear = nullptr;\r
#include "layout/grid_layout.h"\r
#include "font/ui_font.h"\r
#include <string>\r
-#include "TempReport.h"\r
+#include "temperature/TempReport.h"\r
\r
namespace OHOS {\r
static TempReport *g_tempReport = nullptr;\r
#include "UiConfig.h"
#include <string>
-#include "TempStudyAbout.h"
+#include "temperature/TempStudyAbout.h"
namespace OHOS {
static TempStudyAbout *g_tempStudyAbout = nullptr;
\r
#include "UiConfig.h"\r
#include <string>\r
-#include "TempWarn.h"\r
+#include "temperature/TempWarn.h"\r
\r
namespace OHOS {\r
static TempWarn *g_tempWarn = nullptr;\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TimerMainPage\r
+ * Create: 2025-06-09\r
+ */\r
+\r
+#include <string>\r
+#include "timers/TimerMainPage.h"\r
+#include "timers/TimerSettingPage.h"\r
+#include "timers/TimerTimingPage.h"\r
+#include "timers/TimerPresenter.h"\r
+#include "SlicePageFactory.h"\r
+#include "timers/TimerView.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "components/ui_arc_label.h"\r
+#include "graphic_timer.h"\r
+#include "ohos_timer.h"\r
+#include "wearable_log.h"\r
+#include "main/LoadImg.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t ADDBUTTON_MAX = 4;\r
+static constexpr uint8_t MAIN_TITLE_FONT_SIZE = 40;\r
+static constexpr int16_t MAIN_TITLE_SIZE_WIDTH = 160;\r
+static constexpr int16_t MAIN_TITLE_SIZE_HEIGHT = 50;\r
+static constexpr int16_t MAIN_TITLE_POSITION_X = 150;\r
+static constexpr int16_t MAIN_TITLE_POSITION_Y = 20;\r
+static constexpr int16_t MAIN_ADDBUTTON_POSITION_X = 111;\r
+static constexpr int16_t MAIN_ADDBUTTON_POSITION_Y = 347;\r
+static constexpr int16_t MAIN_ADDBUTTON_SIZE_WIDTH = 232;\r
+static constexpr int16_t MAIN_ADDBUTTON_SIZE_HEIGHT = 76;\r
+static constexpr int16_t SELECTMIN_POX = 86;\r
+static constexpr int16_t SELECTMIN_POXS = 252;\r
+static constexpr int16_t SELECTMIN_POY = 89;\r
+static constexpr int16_t SELECTMIN_POYS = 220;\r
+static constexpr int16_t SELECTMIN_SIZE = 100;\r
+static constexpr int16_t MAX_SCR_DIS = 1000;\r
+static constexpr uint8_t MIN = 60;\r
+\r
+REGIST_SLICE_PAGE(VIEW_TIMER, TIMER_PAGES::TIMER_MAIN_PAGE, TimerMainPage, true);\r
+\r
+TimerMainPage::~TimerMainPage()\r
+{\r
+ bool ret = ImageCacheManager::GetInstance().UnloadAllInMultiRes(TIMER_IMAGE);\r
+ if (ret == false) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnloadTimerImage fail");\r
+ }\r
+\r
+ if (group != nullptr) {\r
+ group->RemoveAll();\r
+ delete group;\r
+ group = nullptr;\r
+ }\r
+\r
+ if (title != nullptr) {\r
+ delete title;\r
+ title = nullptr;\r
+ }\r
+\r
+ if (addButton != nullptr) {\r
+ delete addButton;\r
+ addButton = nullptr;\r
+ }\r
+\r
+ for (int i = 0; i < ADDBUTTON_MAX; i++) {\r
+ if (selectMin[i] != nullptr) {\r
+ delete selectMin[i];\r
+ selectMin[i] = nullptr;\r
+ }\r
+ }\r
+\r
+ if (backround != nullptr) {\r
+ delete backround;\r
+ backround = nullptr;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerMainPage::~TimerMainPage()");\r
+}\r
+\r
+void TimerMainPage::OnStart(void* data)\r
+{\r
+ bool ret = ImageCacheManager::GetInstance().LoadAllInMultiRes(TIMER_IMAGE);\r
+ if (ret == false) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadTimerImage fail");\r
+ return;\r
+ }\r
+ // 主界面\r
+ if (group == nullptr) {\r
+ group = new UIScrollView();\r
+ group->SetPosition(0, 0, VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);\r
+ group->SetViewId("mainview");\r
+ }\r
+ if (backround == nullptr) {\r
+ backround = new UIImageView();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerMainPage::OnStart new backround");\r
+ }\r
+ LOADIMG::LoadImageViewImg(backround, TIMER_IMAGE, IMAGE_CONVERTER_TOOL_TIMER_BG);\r
+ backround->SetPosition(0, 0, RESOLUTION_WIDTH, RESOLUTION_WIDTH);\r
+ group->Add(backround);\r
+ InitView();\r
+ LabelTitle();\r
+ group->SetOnDragListener(this);\r
+ group->SetVisible(false);\r
+ AddViewToPageContainer(group);\r
+ if (TimerModel::GetInstance().GetExistTimer()) {\r
+ // 定时器存在,进入计时页面\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_TIMER, TIMER_PAGES::TIMER_TIMING_PAGE);\r
+ } else {\r
+ group->SetVisible(true);\r
+ }\r
+}\r
+\r
+void TimerMainPage::LabelTitle()\r
+{\r
+ // 标题\r
+ if (title == nullptr) {\r
+ title = new UILabel();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerMainPage::LabelTitle new title");\r
+ }\r
+ title->SetPosition(MAIN_TITLE_POSITION_X, MAIN_TITLE_POSITION_Y);\r
+ title->SetText("计时器");\r
+ title->Resize(MAIN_TITLE_SIZE_WIDTH, MAIN_TITLE_SIZE_HEIGHT);\r
+ title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MAIN_TITLE_FONT_SIZE);\r
+ title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ title->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ title->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ title->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ title->SetVisible(true);\r
+ group->Add(title);\r
+}\r
+\r
+void TimerMainPage::InitView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerMainPage::InitView() Start!");\r
+ if (addButton == nullptr) {\r
+ addButton = new UIImageView();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerMainPage::InitView new addButton");\r
+ }\r
+ LOADIMG::LoadImageViewImg(addButton, TIMER_IMAGE, IMAGE_CONVERTER_TOOL_TIMER_USER);\r
+ addButton->SetPosition(MAIN_ADDBUTTON_POSITION_X, MAIN_ADDBUTTON_POSITION_Y);\r
+ addButton->Resize(MAIN_ADDBUTTON_SIZE_WIDTH, MAIN_ADDBUTTON_SIZE_HEIGHT);\r
+ addButton->SetViewId(SETTING_TIMER);\r
+ addButton->SetTouchable(true);\r
+ addButton->SetOnClickListener(this);\r
+ group->Add(addButton);\r
+\r
+ int posX[ADDBUTTON_MAX] = {SELECTMIN_POX, SELECTMIN_POXS, SELECTMIN_POX, SELECTMIN_POXS};\r
+ int posY[ADDBUTTON_MAX] = {SELECTMIN_POY, SELECTMIN_POY, SELECTMIN_POYS, SELECTMIN_POYS};\r
+ const char* buttonViewId[ADDBUTTON_MAX] = {"1", "3", "15", "30"};\r
+ ImageInfo *image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_TIMER_1, TIMER_IMAGE);\r
+ ImageInfo *image3 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_TIMER_3, TIMER_IMAGE);\r
+ ImageInfo *image15 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_TIMER_15, TIMER_IMAGE);\r
+ ImageInfo *image30 = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_TIMER_30, TIMER_IMAGE);\r
+ ImageInfo* buttonSrc[ADDBUTTON_MAX] = {image1, image3, image15, image30};\r
+ // 一分钟按钮\r
+ for (int i = 0;i < ADDBUTTON_MAX;i++) {\r
+ if (selectMin[i] == nullptr) {\r
+ selectMin[i] = new UIImageView();\r
+ }\r
+ selectMin[i]->SetPosition(posX[i], posY[i]);\r
+ selectMin[i]->Resize(SELECTMIN_SIZE, SELECTMIN_SIZE);\r
+ selectMin[i]->SetTouchable(true);\r
+ selectMin[i]->SetOnClickListener(this);\r
+ selectMin[i]->SetViewId(buttonViewId[i]);\r
+ selectMin[i]->SetSrc(buttonSrc[i]);\r
+ group->Add(selectMin[i]);\r
+ }\r
+}\r
+\r
+bool TimerMainPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UNUSED(event);\r
+ std::string viewId = view.GetViewId();\r
+ if (viewId == SETTING_TIMER) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerMainPage::OnClick viewId == SETTING_TIMER");\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_TIMER, TIMER_PAGES::TIMER_SETTING_PAGE);\r
+ } else if (viewId == "1"|| viewId == "3" || viewId == "15" || viewId == "30") {\r
+ int num = std::stoi(viewId);\r
+ struct timeval start_time;\r
+ gettimeofday(&start_time, nullptr);\r
+ uint32_t s_time = start_time.tv_sec * MAX_SCR_DIS + start_time.tv_usec / MAX_SCR_DIS; // 转换成ms\r
+ TimerModel::GetInstance().SetStartTime(s_time);\r
+ TimerModel::GetInstance().SetSaveTime(true, 0);\r
+ TimerModel::GetInstance().SetDurationTime(num * MIN);\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_TIMER, TIMER_PAGES::TIMER_TIMING_PAGE);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool TimerMainPage::OnDrag(UIView& view, const DragEvent& event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&\r
+ (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerMainPage::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+ }\r
+ return true;\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TimerModel\r
+ * Create: 2025-06-09\r
+ */\r
+\r
+#include "timers/TimerModel.h"\r
+#include "main/HealthModel.h"\r
+#include "uiservice/ui_service.h"\r
+#include "wearable_log.h"\r
+\r
+namespace OHOS {\r
+static int g_motionTimes{0};\r
+static constexpr uint64_t MS_ONE_SECONDS = 1000;\r
+TimerModel::TimerModel()\r
+{\r
+}\r
+\r
+TimerModel::~TimerModel()\r
+{\r
+}\r
+\r
+TimerModel &TimerModel::GetInstance()\r
+{\r
+ static TimerModel instance;\r
+ return instance;\r
+}\r
+\r
+uint32_t TimerModel::GetSaveTime()\r
+{\r
+ return save_time;\r
+}\r
+\r
+void TimerModel::SetSaveTime(bool falg, uint32_t value)\r
+{\r
+ if (falg) {\r
+ save_time = 0;\r
+ } else {\r
+ save_time += value;\r
+ }\r
+}\r
+\r
+void TimerModel::SetDurationTime(uint32_t time)\r
+{\r
+ durationTime = time;\r
+}\r
+\r
+uint32_t TimerModel::GetDurationTime()\r
+{\r
+ return durationTime;\r
+}\r
+\r
+/* 定时器回调函数 */\r
+void TimerTimerCallback(void *data)\r
+{\r
+ (void)data;\r
+ uint32_t dura_time = TimerModel::GetInstance().GetDurationTime();\r
+ uint32_t start_time = TimerModel::GetInstance().GetStartTime();\r
+ uint32_t save_time = TimerModel::GetInstance().GetSaveTime();\r
+ struct timeval current_time;\r
+ gettimeofday(¤t_time, nullptr);\r
+ uint32_t remTime = dura_time * 1000 - (current_time.tv_usec - start_time) - save_time;\r
+ if (remTime == 0) {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "TimerTimerCallback: end :%d", time);\r
+ TimerModel::GetInstance().SetExistTimer(false);\r
+ TimerModel::GetInstance().DisableTimer();\r
+ }\r
+}\r
+\r
+/* 开启定时器 */\r
+void TimerModel::InitTimer()\r
+{\r
+ if (g_startCounting != nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TimerModel::InitTimer g_startCounting != nullptr!!");\r
+ return;\r
+ }\r
+ uint32_t tick = GetOSTick(MS_ONE_SECONDS);\r
+ g_startCounting = new GraphicTimer(tick, TimerTimerCallback, nullptr, true);\r
+ if (g_startCounting == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TimerModel::InitTimer new GraphicTimer failed!!");\r
+ return;\r
+ }\r
+ bool retTimer = g_startCounting->Start();\r
+ if (!retTimer) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TimerModel::InitTimer Start failed!!");\r
+ if (g_startCounting != nullptr) {\r
+ delete g_startCounting;\r
+ g_startCounting = nullptr;\r
+ }\r
+ return;\r
+ }\r
+}\r
+\r
+/* 关闭定时器 */\r
+void TimerModel::DisableTimer()\r
+{\r
+ if (g_startCounting != nullptr) {\r
+ delete g_startCounting;\r
+ g_startCounting = nullptr;\r
+ g_motionTimes = 0;\r
+ }\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TimerPresenter\r
+ * Create: 2025-06-09\r
+ */\r
+\r
+#include "timers/TimerView.h"\r
+#include "timers/TimerModel.h"\r
+#include "timers/TimerPresenter.h"\r
+#include "NativeRegisterManager.h"\r
+#include "ohos_timer.h"\r
+\r
+namespace OHOS {\r
+ REGIST_MENU(VIEW_TIMER, TimerView, TimerPresenter, TIMER_MAIN_ICON, PNG_APPLIST_DEFAULT_IMG, "计时器");\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TimerSettingPage\r
+ * Create: 2025-06-09\r
+ */\r
+\r
+#include <unistd.h>\r
+#include <string>\r
+#include "timers/TimerSettingPage.h"\r
+#include "timers/TimerPresenter.h"\r
+#include "components/ui_arc_label.h"\r
+#include "wearable_log.h"\r
+#include "timers/TimerView.h"\r
+#include "SlicePageFactory.h"\r
+#include "common/image_cache_manager.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint8_t BACKGROUND_FONT = 40;\r
+static constexpr uint8_t HIGHTLIGHT_FONT = 50;\r
+static constexpr uint8_t TIMERPICKER_MAX = 3;\r
+static constexpr uint16_t PADDING = 3;\r
+static constexpr uint16_t BORDER_RADIUS = 5;\r
+static constexpr uint16_t TEXT_FONT = 24;\r
+static constexpr uint16_t SETTING_TITLE_POSITION_X = 100;\r
+static constexpr uint16_t SETTING_TITLE_POSITION_Y = 31;\r
+static constexpr uint16_t SETTING_TITLE_SIZE_WIDTH = 253;\r
+static constexpr uint16_t SETTING_TITLE_SIZE_HEIGHT = 53;\r
+static constexpr uint16_t SETTING_TITLE_TEXT_SIZE = 38;\r
+static constexpr uint16_t SETTING_TIMERLABEL_POSITION_X = 86;\r
+static constexpr uint16_t SETTING_TIMERLABEL_POSITION_Y = 88;\r
+static constexpr uint16_t SETTING_TIMERLABEL_SIZE_WIDTH = 48;\r
+static constexpr uint16_t SETTING_TIMERLABEL_SIZE_HEIGHT = 42;\r
+static constexpr uint16_t SETTING_TIMERLABEL_FONT = 18;\r
+static constexpr uint16_t SETTING_START_POSITION_X = 112;\r
+static constexpr uint16_t SETTING_START_POSITION_Y = 347;\r
+static constexpr uint16_t SETTING_START_SIZE_WIDTH = 232;\r
+static constexpr uint16_t SETTING_START_SIZE_HEIGHT = 76;\r
+static constexpr uint16_t SETTING_START_FONT = 40;\r
+static constexpr uint16_t TIMERPICKER_POSX1 = 61;\r
+static constexpr uint16_t TIMERPICKER_POSX2 = 183;\r
+static constexpr uint16_t TIMERPICKER_POSX3 = 305;\r
+static constexpr uint16_t TIMERPICKER_POSY = 119;\r
+static constexpr uint16_t SETTING_TIMERPICKER_SIZE_WIDTH = 88;\r
+static constexpr uint16_t SETTING_TIMERPICKER_SIZE_HEIGHT = 189;\r
+static constexpr uint16_t TIMERPICKER_RADIUS = 11;\r
+static constexpr uint16_t SETTING_TIMERPICKER_ITEM_HEIGHT = 70;\r
+static constexpr uint16_t SETTING_TIMERPICKER_HOUR = 24;\r
+static constexpr uint16_t SETTING_TIMERPICKER_HOURS = 23;\r
+static constexpr uint16_t SETTING_TIMERPICKER_MIN = 60;\r
+static constexpr uint16_t SETTING_TIMERPICKER_MINS = 59;\r
+static constexpr uint16_t SETTING_PICKERGROUP_POSX = 70;\r
+static constexpr uint16_t SETTING_PICKERGROUP_POSY = 132;\r
+static constexpr uint16_t SETTING_PICKERGROUP_SIZE_WIDTH = 80;\r
+static constexpr uint16_t SETTING_PICKERGROUP_SIZE_HEIGHT = 208;\r
+static constexpr uint16_t HOUR_TIME = 3600;\r
+static constexpr uint16_t MIN_TIME = 60;\r
+static constexpr uint16_t POX1_MIN = 86;\r
+static constexpr uint16_t POX1_MAX = 174;\r
+static constexpr uint16_t POX2_MIN = 206;\r
+static constexpr uint16_t POX2_MAX = 294;\r
+static constexpr uint16_t POX3_MIN = 332;\r
+static constexpr uint16_t POX3_MAX = 420;\r
+static constexpr uint16_t POY_MIN = 119;\r
+static constexpr uint16_t POY_MAX = 308;\r
+static constexpr uint16_t SLEEP = 500;\r
+static constexpr uint16_t SUM_2 = 2;\r
+\r
+REGIST_SLICE_PAGE(VIEW_TIMER, TIMER_PAGES::TIMER_SETTING_PAGE, TimerSettingPage, false);\r
+\r
+TimerSettingPage::~TimerSettingPage()\r
+{\r
+ bool ret = ImageCacheManager::GetInstance().UnloadAllInMultiRes(TIMER_IMAGE);\r
+ if (ret == false) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnloadTimerImage fail");\r
+ }\r
+\r
+ if (group != nullptr) {\r
+ group->RemoveAll();\r
+ delete group;\r
+ group = nullptr;\r
+ }\r
+\r
+ if (title != nullptr) {\r
+ delete title;\r
+ title = nullptr;\r
+ }\r
+\r
+ if (back != nullptr) {\r
+ delete back;\r
+ back = nullptr;\r
+ }\r
+\r
+ for (int i = 0; i < TIMERPICKER_MAX; i++) {\r
+ if (timerPicker[i] != nullptr) {\r
+ delete timerPicker[i];\r
+ timerPicker[i] = nullptr;\r
+ }\r
+ }\r
+\r
+ if (start != nullptr) {\r
+ delete start;\r
+ start = nullptr;\r
+ }\r
+\r
+ if (timerLabel != nullptr) {\r
+ delete timerLabel;\r
+ timerLabel = nullptr;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerSettingPage::~TimerSettingPage");\r
+}\r
+\r
+void TimerSettingPage::OnStart(void *data)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerSettingPage::OnStart() Start");\r
+ bool ret = ImageCacheManager::GetInstance().LoadAllInMultiRes(TIMER_IMAGE);\r
+ if (ret == false) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadTimerImage fail");\r
+ return;\r
+ }\r
+ image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+ IMAGE_CONVERTER_TOOL_TIMER_BEGIN_GRAY, TIMER_IMAGE);\r
+ if (image1 == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadTimerImage image1 fail");\r
+ return;\r
+ }\r
+ image2 = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+ IMAGE_CONVERTER_TOOL_TIMER_BEGIN_ORANGE, TIMER_IMAGE);\r
+ if (image2 == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadTimerImage image2 fail");\r
+ return;\r
+ }\r
+ // 标题\r
+ if (title == nullptr) {\r
+ title = new UILabel();\r
+ }\r
+ title->SetPosition(SETTING_TITLE_POSITION_X, SETTING_TITLE_POSITION_Y);\r
+ title->Resize(SETTING_TITLE_SIZE_WIDTH, SETTING_TITLE_SIZE_HEIGHT);\r
+ title->SetText("设置时间");\r
+ title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_TITLE_TEXT_SIZE);\r
+ title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ title->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ title->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ title->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ title->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+\r
+ if (group == nullptr) {\r
+ group = new UIScrollView();\r
+ }\r
+ group->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ group->SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ group->SetThrowDrag(true);\r
+ CreateLabel();\r
+ CreateStartButton();\r
+ CreatePicker();\r
+ group->Add(title);\r
+ group->SetOnDragListener(this);\r
+ AddViewToPageContainer(group);\r
+}\r
+\r
+void TimerSettingPage::CreateLabel(void)\r
+{\r
+ // Add Label to App\r
+ if (timerLabel == nullptr) {\r
+ timerLabel = new UILabel();\r
+ }\r
+ timerLabel->SetPosition(SETTING_TIMERLABEL_POSITION_X,\r
+ SETTING_TIMERLABEL_POSITION_Y); // widget's left position and top position\r
+ timerLabel->Resize(SETTING_TIMERLABEL_SIZE_WIDTH,\r
+ SETTING_TIMERLABEL_SIZE_HEIGHT); // widget's width and height\r
+ timerLabel->SetStyle(STYLE_BACKGROUND_COLOR, 0xFFFFBF00);\r
+ timerLabel->SetStyle(STYLE_BACKGROUND_OPA, 0xef);\r
+ timerLabel->SetStyle(STYLE_BORDER_RADIUS, BORDER_RADIUS);\r
+ timerLabel->SetStyle(STYLE_PADDING_TOP, PADDING);\r
+ timerLabel->SetStyle(STYLE_PADDING_BOTTOM, PADDING);\r
+ timerLabel->SetStyle(STYLE_TEXT_FONT, TEXT_FONT);\r
+\r
+ // Set additional property\r
+ timerLabel->SetText("小时");\r
+ timerLabel->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);\r
+ timerLabel->SetTextColor(Color::GetColorFromRGBA(0x00, 0x00, 0x00, 0xff));\r
+ timerLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ timerLabel->SetDirect(TEXT_DIRECT_MIXED);\r
+ timerLabel->SetRollSpeed(0);\r
+ timerLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, SETTING_TIMERLABEL_FONT);\r
+ timerLabel->SetVisible(false);\r
+ // Add to rootView\r
+ group->Add(timerLabel);\r
+}\r
+\r
+void TimerSettingPage::CreateStartButton(void)\r
+{\r
+ // 开始按钮\r
+ if (start == nullptr) {\r
+ start = new UIImageView();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage:: new start UIImageView");\r
+ }\r
+ start->SetPosition(SETTING_START_POSITION_X, SETTING_START_POSITION_Y);\r
+ start->Resize(SETTING_START_SIZE_WIDTH, SETTING_START_SIZE_HEIGHT);\r
+ start->SetViewId(START_TIMING);\r
+ start->SetTouchable(false);\r
+ start->SetOnClickListener(this);\r
+ start->SetSrc(image1);\r
+ group->Add(start);\r
+}\r
+\r
+// 时间选择器分钟与秒钟列\r
+const char *uiPickerData[] = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10",\r
+ "11", "12", "13", "14", "15", "16", "17", "18", "19", "20",\r
+ "21", "22", "23", "24", "25", "26", "27", "28", "29", "30",\r
+ "31", "32", "33", "34", "35", "36", "37", "38", "39", "40",\r
+ "41", "42", "43", "44", "45", "46", "47", "48", "49", "50",\r
+ "51", "52", "53", "54", "55", "56", "57", "58", "59", "00"};\r
+\r
+// 时间选择器小时列\r
+const char *uiPicker5Data[] = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14",\r
+ "15", "16", "17", "18", "19", "20", "21", "22", "23", "00"};\r
+\r
+void TimerSettingPage::CreatePicker()\r
+{\r
+ // Add Picker to App\r
+ int posX[TIMERPICKER_MAX] = {TIMERPICKER_POSX1, TIMERPICKER_POSX2, TIMERPICKER_POSX3};\r
+ int posY = TIMERPICKER_POSY;\r
+ for (int i = 0; i < TIMERPICKER_MAX; i++) {\r
+ if (timerPicker[i] == nullptr) {\r
+ timerPicker[i] = new UIPicker();\r
+ }\r
+ timerPicker[i]->SetPosition(posX[i], posY); // widget's left position and top position\r
+ timerPicker[i]->Resize(SETTING_TIMERPICKER_SIZE_WIDTH, SETTING_TIMERPICKER_SIZE_HEIGHT);\r
+ timerPicker[i]->SetViewId("hourPicker"); // Set style\r
+ timerPicker[i]->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ timerPicker[i]->SetStyle(STYLE_BORDER_WIDTH, TIMERPICKER_MAX);\r
+ timerPicker[i]->SetStyle(STYLE_BORDER_RADIUS, TIMERPICKER_RADIUS);\r
+ timerPicker[i]->SetStyle(STYLE_BORDER_COLOR, 0xffb9b9b9);\r
+ timerPicker[i]->SetItemHeight(SETTING_TIMERPICKER_ITEM_HEIGHT);\r
+ timerPicker[i]->SetLoopState(true);\r
+ timerPicker[i]->SetBackgroundFont(DEFAULT_VECTOR_FONT_FILENAME, BACKGROUND_FONT);\r
+ timerPicker[i]->SetHighlightFont(DEFAULT_VECTOR_FONT_FILENAME, HIGHTLIGHT_FONT);\r
+ timerPicker[i]->SetTextColor(Color::GetColorFromRGBA(0x64, 0x69, 0x6e, 0xff),\r
+ Color::GetColorFromRGBA(0xff, 0xff, 0xff, 0xff));\r
+ if (i == 0) {\r
+ timerPicker[i]->SetValues(uiPicker5Data, SETTING_TIMERPICKER_HOUR);\r
+ timerPicker[i]->SetSelected(SETTING_TIMERPICKER_HOURS);\r
+ } else {\r
+ timerPicker[i]->SetValues(uiPickerData, SETTING_TIMERPICKER_MIN);\r
+ timerPicker[i]->SetSelected(SETTING_TIMERPICKER_MINS);\r
+ }\r
+ timerPicker[i]->SetOnClickListener(this);\r
+ timerPicker[i]->SetDraggable(true);\r
+ timerPicker[i]->SetOnDragListener(this);\r
+ timerPicker[i]->RegisterSelectedListener(this);\r
+ group->Add(timerPicker[i]);\r
+ }\r
+\r
+ timerPicker[0]->SetViewId("hourPicker"); // Set style\r
+ timerPicker[1]->SetViewId("minPicker"); // Set style\r
+ timerPicker[SUM_2]->SetViewId("secPicker"); // Set style\r
+}\r
+\r
+bool TimerSettingPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UNUSED(event);\r
+ std::string viewId = view.GetViewId();\r
+ if (viewId == START_TIMING) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerSettingPage::OnClick viewId == START_TIMING");\r
+ TimerModel::GetInstance().SetSaveTime(true, 0);\r
+ uint8_t hour = std::stoi(uiPicker5Data[timerPicker[0]->GetSelected()]);\r
+ uint8_t minute = std::stoi(uiPickerData[timerPicker[1]->GetSelected()]);\r
+ uint8_t second = std::stoi(uiPickerData[timerPicker[SUM_2]->GetSelected()]);\r
+ uint32_t durationTime = (hour * HOUR_TIME) + (minute * MIN_TIME) + (second);\r
+ TimerModel::GetInstance().SetDurationTime(durationTime);\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_TIMER, TIMER_PAGES::TIMER_TIMING_PAGE);\r
+ }\r
+ timerLabel->Invalidate();\r
+ return true;\r
+}\r
+\r
+bool TimerSettingPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&\r
+ (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_TIMER, TIMER_PAGES::TIMER_MAIN_PAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerSettingPage::OnDrag SwitchSlice(TIMER_MAIN_PAGE)");\r
+ }\r
+ if (view.GetViewId() == "hourPicker") {\r
+ timerPicker[0]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
+ timerPicker[1]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker[SUM_2]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker[0]->Invalidate();\r
+ timerPicker[1]->Invalidate();\r
+ timerPicker[SUM_2]->Invalidate();\r
+ timerLabel->SetVisible(true);\r
+ timerLabel->SetPosition(POX1_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
+ timerLabel->SetText("小时");\r
+ timerLabel->Invalidate();\r
+ } else if (view.GetViewId() == "minPicker") {\r
+ timerPicker[0]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker[1]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
+ timerPicker[SUM_2]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker[0]->Invalidate();\r
+ timerPicker[1]->Invalidate();\r
+ timerPicker[SUM_2]->Invalidate();\r
+ timerLabel->SetVisible(true);\r
+ timerLabel->SetPosition(POX2_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
+ timerLabel->SetText("分钟");\r
+ timerLabel->Invalidate();\r
+ } else if (view.GetViewId() == "secPicker") {\r
+ timerPicker[1]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker[0]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker[SUM_2]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
+ timerPicker[0]->Invalidate();\r
+ timerPicker[1]->Invalidate();\r
+ timerPicker[SUM_2]->Invalidate();\r
+ timerLabel->SetVisible(true);\r
+ timerLabel->SetPosition(POX3_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
+ timerLabel->SetText("秒");\r
+ timerLabel->Invalidate();\r
+ }\r
+ return true;\r
+}\r
+\r
+void TimerSettingPage::OnPickerStoped(UIPicker& picker)\r
+{\r
+ if (picker.GetViewId() == "hourPicker") {\r
+ uint16_t hour = picker.GetSelected();\r
+ timerPicker[0]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
+ timerPicker[1]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker[SUM_2]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker[0]->Invalidate();\r
+ timerPicker[1]->Invalidate();\r
+ timerPicker[SUM_2]->Invalidate();\r
+ if ((hour == SETTING_TIMERPICKER_HOURS) && (timerPicker[1]->GetSelected() == SETTING_TIMERPICKER_MINS) &&\r
+ (timerPicker[SUM_2]->GetSelected() == SETTING_TIMERPICKER_MINS)) {\r
+ start->SetTouchable(false);\r
+ start->SetSrc(image1);\r
+ } else {\r
+ start->SetTouchable(true);\r
+ start->SetSrc(image2);\r
+ }\r
+ timerLabel->SetVisible(true);\r
+ timerLabel->SetPosition(POX1_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
+ timerLabel->SetText("小时");\r
+ timerLabel->Invalidate();\r
+ } else if (picker.GetViewId() == "minPicker") {\r
+ uint16_t minute = picker.GetSelected();\r
+ timerPicker[0]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker[1]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
+ timerPicker[SUM_2]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker[0]->Invalidate();\r
+ timerPicker[1]->Invalidate();\r
+ timerPicker[SUM_2]->Invalidate();\r
+ if ((timerPicker[0]->GetSelected() == SETTING_TIMERPICKER_HOURS) && (minute == SETTING_TIMERPICKER_MINS) &&\r
+ (timerPicker[SUM_2]->GetSelected() == SETTING_TIMERPICKER_MINS)) {\r
+ start->SetTouchable(false);\r
+ start->SetSrc(image1);\r
+ } else {\r
+ start->SetTouchable(true);\r
+ start->SetSrc(image2);\r
+ }\r
+ timerLabel->SetVisible(true);\r
+ timerLabel->SetPosition(POX2_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
+ timerLabel->SetText("分钟");\r
+ timerLabel->Invalidate();\r
+ } else {\r
+ uint16_t sec = picker.GetSelected();\r
+ timerPicker[0]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker[1]->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
+ timerPicker[SUM_2]->SetStyle(STYLE_BORDER_COLOR, Color::Orange().full);\r
+ timerPicker[0]->Invalidate();\r
+ timerPicker[1]->Invalidate();\r
+ timerPicker[SUM_2]->Invalidate();\r
+ if ((timerPicker[0]->GetSelected() == SETTING_TIMERPICKER_HOURS) &&\r
+ (timerPicker[1]->GetSelected() == SETTING_TIMERPICKER_MINS) && (sec == SETTING_TIMERPICKER_MINS)) {\r
+ start->SetTouchable(false);\r
+ start->SetSrc(image1);\r
+ } else {\r
+ start->SetTouchable(true);\r
+ start->SetSrc(image2);\r
+ }\r
+ timerLabel->SetVisible(true);\r
+ timerLabel->SetPosition(POX3_MIN, SETTING_TIMERLABEL_POSITION_Y);\r
+ timerLabel->SetText("秒");\r
+ timerLabel->Invalidate();\r
+ }\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TimerTimingPage\r
+ * Create: 2025-06-09\r
+ */\r
+\r
+#include <cmath>\r
+#include <string>\r
+#include "timers/TimerTimingPage.h"\r
+#include "ui_test_group.h"\r
+#include "timers/TimerPresenter.h"\r
+#include "wearable_log.h"\r
+#include "timers/TimerView.h"\r
+#include "SlicePageFactory.h"\r
+#include "common/image_cache_manager.h"\r
+#include "pwm.h"\r
+#include "main/LoadImg.h"\r
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t NUM_TEN = 10;\r
+static constexpr uint16_t TIMING_TITLE_POSITION_X = 170;\r
+static constexpr uint16_t TIMING_TITLE_POSITION_Y = 110;\r
+static constexpr uint16_t TIMING_TITLE_SIZE_WIDTH = 114;\r
+static constexpr uint16_t TIMING_TITLE_SIZE_HEIGHT = 38;\r
+static constexpr uint16_t TIMING_TITLE_FONT = 38;\r
+static constexpr uint16_t TIMING_LABEL_CURTIME_XPOS = 199;\r
+static constexpr uint16_t TIMING_LABEL_CURTIME_YPOS = 54;\r
+static constexpr uint16_t TIMING_LABEL_CURTIME_WIDTH = 67;\r
+static constexpr uint16_t TIMING_LABEL_CURTIME_HEIGHT = 24;\r
+static constexpr uint16_t TIMING_LABEL_CURTIME_FONT_SIZE = 24;\r
+static constexpr uint16_t TIMING_START_IMAGE_XPOS = 251;\r
+static constexpr uint16_t TIMING_START_IMAGE_YPOS = 306;\r
+static constexpr uint16_t TIMING_START_IMAGE_SIZE = 96;\r
+static constexpr uint16_t TIMING_RESET_IMAGE_XPOS = 107;\r
+static constexpr uint16_t TIMING_RESET_IMAGE_YPOS = 306;\r
+static constexpr uint16_t TIMING_RESET_IMAGE_SIZE = 96;\r
+static constexpr uint16_t TIMING_TIMER_TIME_XPOS = 85;\r
+static constexpr uint16_t TIMING_TIMER_TIME_YPOS = 182;\r
+static constexpr uint16_t TIMING_TIMER_TIME_WIDTH = 322;\r
+static constexpr uint16_t TIMING_TIMER_TIME_HEIGHT = 90;\r
+static constexpr uint16_t TIMING_TIMER_TIME_FONT_SIZE = 72;\r
+static constexpr uint16_t HOUR_TIME = 3600;\r
+static constexpr uint16_t MIN_TIME = 60;\r
+static constexpr uint16_t TIMING_CIRCLE_LINE_WIDTH = 10;\r
+static constexpr uint16_t TIMING_CIRCLE = 227;\r
+static constexpr uint16_t CIRCLE_RADIUS = 222;\r
+static constexpr uint16_t TIMING_CIRCLE_END = 360;\r
+static constexpr uint32_t TIMING_CIRCLE_RANGE = 100000;\r
+static constexpr uint16_t MAX_SCR_DIS = 1000;\r
+static constexpr uint32_t HOUR_RANGE = 60000;\r
+static constexpr uint16_t TIMING_HAND_POSITION_XPOS = 224;\r
+static constexpr uint16_t TIMING_HAND_POSITION_YPOS = 4;\r
+static constexpr uint16_t TIMING_HAND_CENTER_XPOS = 3;\r
+static constexpr uint16_t TIMING_HAND_CENTER_YPOS = 223;\r
+static constexpr uint16_t TIMING_HAND_WIDTH = 2;\r
+static constexpr uint16_t TIMING_HAND_HEIGHT = 5;\r
+\r
+REGIST_SLICE_PAGE(VIEW_TIMER, TIMER_PAGES::TIMER_TIMING_PAGE, TimerTimingPage, false);\r
+\r
+static std::string GetCurrentTimeStr()\r
+{\r
+ struct tm localTime;\r
+ time_t seconds = time(nullptr);\r
+ localtime_r(&seconds, &localTime);\r
+ std::string currTime;\r
+ if (localTime.tm_hour < NUM_TEN) {\r
+ currTime += "0";\r
+ }\r
+ currTime += std::to_string(localTime.tm_hour) + ":";\r
+ if (localTime.tm_min < NUM_TEN) {\r
+ currTime += "0";\r
+ }\r
+ currTime += std::to_string(localTime.tm_min);\r
+ return currTime;\r
+}\r
+\r
+TimerTimingPage::~TimerTimingPage()\r
+{\r
+ bool ret = ImageCacheManager::GetInstance().UnloadAllInMultiRes(TIMER_IMAGE);\r
+ if (ret == false) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnloadTimerImage fail");\r
+ }\r
+\r
+ if (group != nullptr) {\r
+ group->RemoveAll();\r
+ delete group;\r
+ group = nullptr;\r
+ }\r
+\r
+ if (sweepClock_ != nullptr) {\r
+ sweepClock_->RemoveAll();\r
+ delete sweepClock_;\r
+ sweepClock_ = nullptr;\r
+ }\r
+\r
+ if (dClock != nullptr) {\r
+ delete dClock;\r
+ dClock = nullptr;\r
+ }\r
+\r
+ if (title != nullptr) {\r
+ delete title;\r
+ title = nullptr;\r
+ }\r
+\r
+ if (timerTime != nullptr) {\r
+ delete timerTime;\r
+ timerTime = nullptr;\r
+ }\r
+\r
+ if (reset != nullptr) {\r
+ delete reset;\r
+ reset = nullptr;\r
+ }\r
+\r
+ if (start != nullptr) {\r
+ delete start;\r
+ start = nullptr;\r
+ }\r
+\r
+ if (circleProgress != nullptr) {\r
+ delete circleProgress;\r
+ circleProgress = nullptr;\r
+ }\r
+\r
+ if (currentTime_ != nullptr) {\r
+ delete currentTime_;\r
+ currentTime_ = nullptr;\r
+ }\r
+\r
+ if (timeCallback_ != nullptr) {\r
+ delete timeCallback_;\r
+ timeCallback_ = nullptr;\r
+ }\r
+\r
+ if (timeAnimator_ != nullptr) {\r
+ delete timeAnimator_;\r
+ timeAnimator_ = nullptr;\r
+ }\r
+\r
+ if (callBack_ != nullptr) {\r
+ delete callBack_;\r
+ callBack_ = nullptr;\r
+ }\r
+\r
+ if (animator_ != nullptr) {\r
+ delete animator_;\r
+ animator_ = nullptr;\r
+ }\r
+\r
+ if (secondHand_ != nullptr) {\r
+ delete secondHand_;\r
+ secondHand_ = nullptr;\r
+ }\r
+\r
+ if (backround != nullptr) {\r
+ delete backround;\r
+ backround = nullptr;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::~TimerTimingPage");\r
+}\r
+\r
+void TimerTimingPage::OnStart(void *data)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::OnStart() Start!");\r
+ bool ret = ImageCacheManager::GetInstance().LoadAllInMultiRes(TIMER_IMAGE);\r
+ if (ret == false) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadTimerImage fail");\r
+ return;\r
+ }\r
+ if (group == nullptr) {\r
+ group = new UIScrollView();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::OnStart new group");\r
+ }\r
+ group->SetPosition(0, 0, VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);\r
+ group->SetThrowDrag(true);\r
+\r
+ if (backround == nullptr) {\r
+ backround = new UIImageView();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::OnStart new backround");\r
+ }\r
+ ImageInfo *image =\r
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_TIMER_BG, TIMER_IMAGE);\r
+ if (image == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::OnStart backround source fail");\r
+ return;\r
+ }\r
+ backround->SetSrc(image);\r
+ backround->SetPosition(0, 0, VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);\r
+\r
+ if (sweepClock_ == nullptr) {\r
+ sweepClock_ = new UISweepClock();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::OnStart new sweepClock_");\r
+ }\r
+ sweepClock_->SetPosition(0, 0);\r
+ sweepClock_->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ sweepClock_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ if (secondHand_ == nullptr) {\r
+ secondHand_ = new Image();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::OnStart new secondHand_");\r
+ }\r
+ ImageInfo *second =\r
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_TIMER_POINTER, TIMER_IMAGE);\r
+ if (second == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::OnStart second source fail");\r
+ return;\r
+ }\r
+ secondHand_->SetSrc(second);\r
+ sweepClock_->SetHandImage(UISweepClock::HandType::SECOND_HAND, *secondHand_,\r
+ {TIMING_HAND_POSITION_XPOS, TIMING_HAND_POSITION_YPOS}, {TIMING_HAND_CENTER_XPOS, TIMING_HAND_CENTER_YPOS});\r
+ sweepClock_->SetHandLine(UISweepClock::HandType::HOUR_HAND, {TIMING_HAND_POSITION_XPOS, TIMING_HAND_POSITION_YPOS},\r
+ {TIMING_HAND_CENTER_XPOS, TIMING_HAND_CENTER_YPOS}, Color::White(), TIMING_HAND_WIDTH, TIMING_HAND_HEIGHT,\r
+ OPA_TRANSPARENT);\r
+ sweepClock_->SetHandLine(UISweepClock::HandType::MINUTE_HAND,\r
+ {TIMING_HAND_POSITION_XPOS, TIMING_HAND_POSITION_YPOS}, {TIMING_HAND_CENTER_XPOS, TIMING_HAND_CENTER_YPOS},\r
+ Color::White(), TIMING_HAND_WIDTH, TIMING_HAND_HEIGHT, OPA_TRANSPARENT);\r
+\r
+ // 标题\r
+ if (title == nullptr) {\r
+ title = new UILabel();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::OnStart new title");\r
+ }\r
+ title->SetPosition(TIMING_TITLE_POSITION_X, TIMING_TITLE_POSITION_Y);\r
+ title->Resize(TIMING_TITLE_SIZE_WIDTH, TIMING_TITLE_SIZE_HEIGHT);\r
+ title->SetText("计时器");\r
+ title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TIMING_TITLE_FONT);\r
+ title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ title->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ title->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ title->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ if (currentTime_ == nullptr) {\r
+ currentTime_ = new UILabel();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::OnStart new currentTime_");\r
+ }\r
+ currentTime_->SetPosition(TIMING_LABEL_CURTIME_XPOS, TIMING_LABEL_CURTIME_YPOS);\r
+ currentTime_->Resize(TIMING_LABEL_CURTIME_WIDTH, TIMING_LABEL_CURTIME_HEIGHT);\r
+ currentTime_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TIMING_LABEL_CURTIME_FONT_SIZE);\r
+ currentTime_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ currentTime_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ currentTime_->SetVisible(true);\r
+\r
+ group->Add(backround);\r
+ CircleProgress();\r
+ group->Add(sweepClock_);\r
+ CreateButton();\r
+ CreateTimerTime();\r
+ group->Add(title);\r
+ group->Add(currentTime_);\r
+ group->SetOnDragListener(this);\r
+ AddViewToPageContainer(group);\r
+\r
+ if (timeCallback_ == nullptr) {\r
+ timeCallback_ = new TimeAnimatorCallback();\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::OnStart new timeCallback_");\r
+ }\r
+\r
+ if (timeAnimator_ == nullptr) {\r
+ timeAnimator_ = new Animator(timeCallback_, currentTime_, 0, true);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::OnStart new Animator timeAnimator_");\r
+ }\r
+ timeAnimator_->Start();\r
+}\r
+\r
+void TimerTimingPage::OnResume()\r
+{\r
+ if (TimerModel::GetInstance().GetExistTimer()) {\r
+ SetAnimatorStatus(true);\r
+ TimerModel::GetInstance().SetExistTimer(false);\r
+ }\r
+ if (timeAnimator_ != nullptr) {\r
+ if (timeAnimator_->GetState() == Animator::STOP) {\r
+ timeAnimator_->Start();\r
+ }\r
+ }\r
+ if (!start->IsTouchable()) {\r
+ LOADIMG::LoadImageViewImg(start, TIMER_IMAGE, IMAGE_CONVERTER_TOOL_TIMER_PAUSE);\r
+ }\r
+}\r
+\r
+void TimerTimingPage::OnPause()\r
+{\r
+ if (TimerModel::GetInstance().GetIsTiming()) {\r
+ TimerModel::GetInstance().SetExistTimer(true);\r
+ }\r
+ if (timeAnimator_ != nullptr) {\r
+ if (timeAnimator_->GetState() != Animator::STOP) {\r
+ timeAnimator_->Stop();\r
+ }\r
+ }\r
+ SetAnimatorStatus(false);\r
+}\r
+\r
+void TimerTimingPage::CreateButton()\r
+{\r
+ ImageInfo *image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+ IMAGE_CONVERTER_TOOL_TIMER_PLAY, TIMER_IMAGE);\r
+ ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+ IMAGE_CONVERTER_TOOL_TIMER_EXIT, TIMER_IMAGE);\r
+ // 开始/暂停按钮\r
+ if (start == nullptr) {\r
+ start = new UIImageView();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::CreateButton new start");\r
+ }\r
+ start->SetPosition(TIMING_START_IMAGE_XPOS, TIMING_START_IMAGE_YPOS);\r
+ start->Resize(TIMING_START_IMAGE_SIZE, TIMING_START_IMAGE_SIZE);\r
+ start->SetViewId(START_PAUSE);\r
+ start->SetTouchable(true);\r
+ start->SetOnClickListener(this);\r
+ start->SetSrc(image1);\r
+ group->Add(start);\r
+\r
+ // 复位按钮\r
+ ImageInfo *image2 = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+ IMAGE_CONVERTER_TOOL_TIMER_EXIT, TIMER_IMAGE);\r
+ if (reset == nullptr) {\r
+ reset = new UIImageView();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::CreateButton new reset");\r
+ }\r
+ reset->SetPosition(TIMING_RESET_IMAGE_XPOS, TIMING_RESET_IMAGE_YPOS);\r
+ reset->Resize(TIMING_RESET_IMAGE_SIZE, TIMING_RESET_IMAGE_SIZE);\r
+ reset->SetViewId(RESET);\r
+ reset->SetTouchable(true);\r
+ reset->SetOnClickListener(this);\r
+ reset->SetSrc(image2);\r
+ group->Add(reset);\r
+}\r
+\r
+void TimerTimingPage::CreateTimerTime()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::CreateTimerTime() Start!");\r
+ if (timerTime == nullptr) {\r
+ timerTime = new UIDigitalClock();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::CreateTimerTime() new timerTime!");\r
+ }\r
+ timerTime->SetPosition(TIMING_TIMER_TIME_XPOS, TIMING_TIMER_TIME_YPOS);\r
+ timerTime->Resize(TIMING_TIMER_TIME_WIDTH, TIMING_TIMER_TIME_HEIGHT);\r
+ timerTime->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TIMING_TIMER_TIME_FONT_SIZE);\r
+ timerTime->SetDisplayMode(UIDigitalClock::DISPLAY_24_HOUR);\r
+ timerTime->SetStyle(STYLE_BACKGROUND_COLOR, Color::Blue().full);\r
+ uint32_t durationTime = TimerModel::GetInstance().GetDurationTime();\r
+ uint8_t hour = durationTime / HOUR_TIME;\r
+ uint8_t minute = durationTime % HOUR_TIME / MIN_TIME;\r
+ uint8_t second = durationTime % MIN_TIME;\r
+ timerTime->SetTime24Hour(hour, minute, second);\r
+ group->Add(timerTime);\r
+}\r
+\r
+void TimerTimingPage::CircleProgress()\r
+{\r
+ // 动态计时圈\r
+ if (circleProgress == nullptr) {\r
+ circleProgress = new UICircleProgress();\r
+ }\r
+ circleProgress->SetPosition(0, 0); // widget's left position and top position\r
+ circleProgress->Resize(RESOLUTION_WIDTH, RESOLUTION_HEIGHT); // widget's width and height\r
+ ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+ IMAGE_CONVERTER_TOOL_BG_CIR, TIMER_IMAGE);\r
+ ImageInfo *image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+ IMAGE_CONVERTER_TOOL_TIMER_PBG, TIMER_IMAGE);\r
+ circleProgress->SetImage(image1, image);\r
+ circleProgress->EnableBackground(true);\r
+ circleProgress->SetBackgroundStyle(STYLE_LINE_WIDTH, TIMING_CIRCLE_LINE_WIDTH);\r
+ circleProgress->SetForegroundStyle(STYLE_LINE_WIDTH, TIMING_CIRCLE_LINE_WIDTH);\r
+ circleProgress->EnableBackground(true);\r
+ circleProgress->SetCenterPosition(TIMING_CIRCLE, TIMING_CIRCLE);\r
+ circleProgress->SetRadius(CIRCLE_RADIUS);\r
+ circleProgress->SetStartAngle(0);\r
+ circleProgress->SetEndAngle(TIMING_CIRCLE_END);\r
+ circleProgress->SetRange(TIMING_CIRCLE_RANGE, 0);\r
+ circleProgress->SetValue(TIMING_CIRCLE_RANGE);\r
+ // Add to rootView\r
+ SetupAnimator();\r
+ group->Add(circleProgress);\r
+}\r
+\r
+// 单位为毫秒计算\r
+void TimerTimingPage::SetTimerTime(uint32_t onTime)\r
+{\r
+ uint64_t time = onTime / MAX_SCR_DIS;\r
+ uint8_t hour = time / HOUR_TIME;\r
+ uint8_t minute = time % HOUR_TIME / MIN_TIME;\r
+ uint8_t second = time % MIN_TIME;\r
+ timerTime->SetTime24Hour(hour, minute, second);\r
+ uint32_t totalTime = TimerModel::GetInstance().GetDurationTime();\r
+ double percentage = static_cast<double>(onTime) / (totalTime * MAX_SCR_DIS);\r
+ double value = round(percentage * TIMING_CIRCLE_RANGE);\r
+ circleProgress->SetValue(value);\r
+ sweepClock_->SetSweepTime24Hour(0, 0, percentage * HOUR_RANGE);\r
+\r
+ if (onTime <= 0) {\r
+ ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+ IMAGE_CONVERTER_TOOL_TIMER_PAUSE, TIMER_IMAGE);\r
+ ImageInfo *image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+ IMAGE_CONVERTER_TOOL_TIMER_EXIT, TIMER_IMAGE);\r
+ start->SetSrc(image);\r
+ start->SetTouchable(false);\r
+ reset->SetSrc(image1);\r
+ TimerModel::GetInstance().SetIsPause(false);\r
+ TimerModel::GetInstance().SetIsTiming(false);\r
+ start->Invalidate();\r
+ reset->Invalidate();\r
+ }\r
+ circleProgress->Invalidate();\r
+ timerTime->Invalidate();\r
+}\r
+\r
+void TimerTimingPage::SetupAnimator()\r
+{\r
+ callBack_ = new TimerTimingCallback(this);\r
+ animator_ = new Animator(callBack_, nullptr, 0, true);\r
+}\r
+\r
+void TimerTimingPage::TimerTimingCallback::Callback(UIView *view)\r
+{\r
+ (void)view;\r
+ static int count = 0;\r
+ struct timeval current_time;\r
+ gettimeofday(¤t_time, nullptr);\r
+\r
+ uint32_t overTime = TimerModel::GetInstance().GetDurationTime();\r
+ uint32_t s_time = TimerModel::GetInstance().GetStartTime();\r
+ uint32_t saveTime = TimerModel::GetInstance().GetSaveTime();\r
+ uint64_t c_time = current_time.tv_sec * MAX_SCR_DIS + current_time.tv_usec / MAX_SCR_DIS;\r
+ int32_t remTime = overTime * MAX_SCR_DIS - (c_time - s_time) - saveTime;\r
+\r
+ page_->SetTimerTime(remTime);\r
+ if (remTime <= 0) {\r
+ page_->animator_->Stop();\r
+ page_->SetTimerTime(0);\r
+ // 调用pwm接口实现马达震动,客户自实现\r
+ }\r
+}\r
+\r
+void TimerTimingPage::SetAnimatorStatus(bool status)\r
+{\r
+ ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+ IMAGE_CONVERTER_TOOL_TIMER_PAUSE_ORANGE, TIMER_IMAGE);\r
+ ImageInfo *image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+ IMAGE_CONVERTER_TOOL_TIMER_PLAY, TIMER_IMAGE);\r
+ ImageInfo *image2 = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+ IMAGE_CONVERTER_TOOL_TIMER_RESTART, TIMER_IMAGE);\r
+ if (status) {\r
+ start->SetSrc(image);\r
+ reset->SetSrc(image2);\r
+ animator_->Start();\r
+ TimerModel::GetInstance().InitTimer();\r
+ } else {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::SetAnimatorStatus status == false");\r
+ animator_->Stop();\r
+ start->SetSrc(image1);\r
+ TimerModel::GetInstance().DisableTimer();\r
+ }\r
+}\r
+\r
+bool TimerTimingPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&\r
+ (event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ if (TimerModel::GetInstance().GetIsTiming()) {\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+ } else {\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_TIMER, TIMER_PAGES::TIMER_MAIN_PAGE);\r
+ }\r
+ }\r
+ return true;\r
+}\r
+\r
+bool TimerTimingPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UNUSED(event);\r
+ std::string viewId = view.GetViewId();\r
+ if (viewId == RESET) {\r
+ if (TimerModel::GetInstance().GetIsTiming()) {\r
+ // 停止计时器 修改复位图标 重新将时间复原\r
+ SetAnimatorStatus(false);\r
+ TimerModel::GetInstance().SetIsTiming(false);\r
+ uint32_t durationTime = TimerModel::GetInstance().GetDurationTime();\r
+ uint8_t hour = durationTime / HOUR_TIME;\r
+ uint8_t minute = durationTime % HOUR_TIME / MIN_TIME;\r
+ uint8_t second = durationTime % MIN_TIME;\r
+ timerTime->SetTime24Hour(hour, minute, second);\r
+ TimerModel::GetInstance().SetSaveTime(true, 0);\r
+ ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+ IMAGE_CONVERTER_TOOL_TIMER_EXIT, TIMER_IMAGE);\r
+ reset->SetSrc(image);\r
+ circleProgress->SetValue(TIMING_CIRCLE_RANGE);\r
+ sweepClock_->SetSweepTime24Hour(0, 0, 0);\r
+ } else if (! TimerModel::GetInstance().GetIsTiming() && TimerModel::GetInstance().GetIsPause()) {\r
+ TimerModel::GetInstance().SetIsTiming(false);\r
+ uint32_t durationTime = TimerModel::GetInstance().GetDurationTime();\r
+ uint8_t hour = durationTime / HOUR_TIME;\r
+ uint8_t minute = durationTime % HOUR_TIME / MIN_TIME;\r
+ uint8_t second = durationTime % MIN_TIME;\r
+ timerTime->SetTime24Hour(hour, minute, second);\r
+ TimerModel::GetInstance().SetSaveTime(true, 0);\r
+ ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(\r
+ IMAGE_CONVERTER_TOOL_TIMER_EXIT, TIMER_IMAGE);\r
+ reset->SetSrc(image);\r
+ circleProgress->SetValue(TIMING_CIRCLE_RANGE);\r
+ sweepClock_->SetSweepTime24Hour(0, 0, 0);\r
+ TimerModel::GetInstance().SetIsPause(false);\r
+ } else {\r
+ NativeAbility::GetInstance().SwitchSlice(VIEW_TIMER, TIMER_PAGES::TIMER_MAIN_PAGE);\r
+ }\r
+ } else if (viewId == START_PAUSE) {\r
+ if (TimerModel::GetInstance().GetIsTiming()) {\r
+ SetAnimatorStatus(false);\r
+ TimerModel::GetInstance().SetIsTiming(false);\r
+ struct timeval current_time;\r
+ gettimeofday(¤t_time, nullptr);\r
+ uint32_t time = (current_time.tv_sec * MAX_SCR_DIS + current_time.tv_usec / MAX_SCR_DIS) -\r
+ TimerModel::GetInstance().GetStartTime();\r
+ TimerModel::GetInstance().SetSaveTime(false, time);\r
+ TimerModel::GetInstance().SetIsPause(true);\r
+ } else {\r
+ SetAnimatorStatus(true);\r
+ TimerModel::GetInstance().SetIsTiming(true);\r
+ struct timeval current_time;\r
+ gettimeofday(¤t_time, nullptr);\r
+ uint32_t s_time = current_time.tv_sec * MAX_SCR_DIS + current_time.tv_usec / MAX_SCR_DIS; // 转换成ms\r
+ TimerModel::GetInstance().SetStartTime(s_time);\r
+ TimerModel::GetInstance().SetIsPause(false);\r
+ }\r
+ } else {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TimerTimingPage::OnClick");\r
+ return false;\r
+ }\r
+ return true;\r
+}\r
+\r
+void TimerTimingPage::TimeAnimatorCallback::Callback(UIView *view)\r
+{\r
+ UILabel *timeLabel = dynamic_cast<UILabel *>(view);\r
+ if (timeLabel == nullptr) {\r
+ return;\r
+ }\r
+ std::string currTime = GetCurrentTimeStr();\r
+ timeLabel->SetText(currTime.c_str());\r
+ timeLabel->Invalidate();\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Data View\r
+ * Create: 2025-03-22\r
+ */\r
+#include "training/DataView.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "training/TrainingPresenter.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t TOP_VALUE_LABEL_FONT = 80;\r
+static constexpr uint16_t VALUE_LABEL_FONT = 60;\r
+static constexpr uint16_t UNIT_LABEL_FONT = 30;\r
+static constexpr uint16_t TOP_VALUE_LABEL_X = 164;\r
+static constexpr uint16_t TOP_VALUE_LABEL_Y = 45;\r
+static constexpr uint16_t TOP_VALUE_LABEL_W = 200;\r
+static constexpr uint16_t TOP_VALUE_LABEL_H = 60;\r
+static constexpr uint16_t TOP_UNIT_LABEL_X = 184;\r
+static constexpr uint16_t TOP_UNIT_LABEL_Y = 135;\r
+static constexpr uint16_t TOP_UNIT_LABEL_W = 200;\r
+static constexpr uint16_t TOP_UNIT_LABEL_H = 60;\r
+static constexpr uint16_t LEFT_VALUE_LABEL_X = 52;\r
+static constexpr uint16_t LEFT_VALUE_LABEL_Y = 176;\r
+static constexpr uint16_t LEFT_VALUE_LABEL_W = 200;\r
+static constexpr uint16_t LEFT_VALUE_LABEL_H = 60;\r
+static constexpr uint16_t LEFT_UNIT_LABEL_X = 71;\r
+static constexpr uint16_t LEFT_UNIT_LABEL_Y = 247;\r
+static constexpr uint16_t LEFT_UNIT_LABEL_W = 200;\r
+static constexpr uint16_t LEFT_UNIT_LABEL_H = 60;\r
+static constexpr uint16_t RIGHT_VALUE_LABEL_X = 310;\r
+static constexpr uint16_t RIGHT_VALUE_LABEL_Y = 181;\r
+static constexpr uint16_t RIGHT_VALUE_LABEL_W = 200;\r
+static constexpr uint16_t RIGHT_VALUE_LABEL_H = 60;\r
+static constexpr uint16_t RIGHT_UNIT_LABEL_X = 323;\r
+static constexpr uint16_t RIGHT_UNIT_LABEL_Y = 253;\r
+static constexpr uint16_t RIGHT_UNIT_LABEL_W = 200;\r
+static constexpr uint16_t RIGHT_UNIT_LABEL_H = 60;\r
+static constexpr uint16_t BOTTOM_VALUE_LABEL_X = 113;\r
+static constexpr uint16_t BOTTOM_VALUE_LABEL_Y = 297;\r
+static constexpr uint16_t BOTTOM_VALUE_LABEL_W = 200;\r
+static constexpr uint16_t BOTTOM_VALUE_LABEL_H = 60;\r
+static constexpr uint16_t BOTTOM_UNIT_LABEL_X = 217;\r
+static constexpr uint16_t BOTTOM_UNIT_LABEL_Y = 374;\r
+static constexpr uint16_t BOTTOM_UNIT_LABEL_W = 200;\r
+static constexpr uint16_t BOTTOM_UNIT_LABEL_H = 60;\r
+static constexpr uint16_t SEP_LINE_X = 234;\r
+static constexpr uint16_t SEP_LINE_Y = 181;\r
+static constexpr uint16_t SEP_LINE_W = 4;\r
+static constexpr uint16_t SEP_LINE_H = 85;\r
+\r
+static DataView *g_pDataView{nullptr};\r
+\r
+DataView::DataView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DataView::DataView");\r
+ g_pDataView = this;\r
+}\r
+\r
+DataView::~DataView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DataView::~DataView");\r
+ if (group != nullptr) {\r
+ group->RemoveAll();\r
+ delete group;\r
+ group = nullptr;\r
+ }\r
+ if (backGround != nullptr) {\r
+ delete backGround;\r
+ backGround = nullptr;\r
+ }\r
+ if (heartrate != nullptr) {\r
+ delete heartrate;\r
+ heartrate = nullptr;\r
+ }\r
+ if (sepLine != nullptr) {\r
+ delete sepLine;\r
+ sepLine = nullptr;\r
+ }\r
+ if (topValueLabel != nullptr) {\r
+ delete topValueLabel;\r
+ topValueLabel = nullptr;\r
+ }\r
+ if (topUnitLabel != nullptr) {\r
+ delete topUnitLabel;\r
+ topUnitLabel = nullptr;\r
+ }\r
+ if (leftValueLabel != nullptr) {\r
+ delete leftValueLabel;\r
+ leftValueLabel = nullptr;\r
+ }\r
+ if (leftUnitLabel != nullptr) {\r
+ delete leftUnitLabel;\r
+ leftUnitLabel = nullptr;\r
+ }\r
+ if (rightValueLabel != nullptr) {\r
+ delete rightValueLabel;\r
+ rightValueLabel = nullptr;\r
+ }\r
+ if (rightUnitLabel != nullptr) {\r
+ delete rightUnitLabel;\r
+ rightUnitLabel = nullptr;\r
+ }\r
+ if (bottomValueLabel != nullptr) {\r
+ delete bottomValueLabel;\r
+ bottomValueLabel = nullptr;\r
+ }\r
+ if (bottomUnitLabel != nullptr) {\r
+ delete bottomUnitLabel;\r
+ bottomUnitLabel = nullptr;\r
+ }\r
+ g_pDataView = nullptr;\r
+}\r
+\r
+DataView *DataView::GetInstance()\r
+{\r
+ return g_pDataView;\r
+}\r
+\r
+void DataView::ShowupBackgroup()\r
+{\r
+ backGround = new UIImageView();\r
+ if (backGround == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "backGroundFirst new fail");\r
+ return;\r
+ }\r
+ backGround->SetPosition(0, 0);\r
+ backGround->SetSrc(PNG_WALK_BACK_GROUND);\r
+ group->Add(backGround);\r
+}\r
+\r
+void DataView::ShowupTopView()\r
+{\r
+ // Add Label to App\r
+ if (topValueLabel == nullptr) {\r
+ topValueLabel = new UILabel();\r
+ }\r
+ topValueLabel->SetPosition(TOP_VALUE_LABEL_X, TOP_VALUE_LABEL_Y);\r
+ topValueLabel->Resize(TOP_VALUE_LABEL_W, TOP_VALUE_LABEL_H);\r
+\r
+ // Set additional property\r
+ topValueLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ topValueLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ topValueLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, VALUE_LABEL_FONT);\r
+\r
+ // Add to rootView\r
+ group->Add(topValueLabel);\r
+\r
+ // Add Label to App\r
+ if (topUnitLabel == nullptr) {\r
+ topUnitLabel = new UILabel();\r
+ }\r
+ topUnitLabel->SetPosition(TOP_UNIT_LABEL_X, TOP_UNIT_LABEL_Y);\r
+ topUnitLabel->Resize(TOP_UNIT_LABEL_W, TOP_UNIT_LABEL_H);\r
+\r
+ // Set additional property\r
+ topUnitLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ topUnitLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ topUnitLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, UNIT_LABEL_FONT);\r
+\r
+ // Add to rootView\r
+ group->Add(topUnitLabel);\r
+}\r
+\r
+void DataView::ShowupLeftView()\r
+{\r
+ // Add Label to App\r
+ if (leftValueLabel == nullptr) {\r
+ leftValueLabel = new UILabel();\r
+ }\r
+ leftValueLabel->SetPosition(LEFT_VALUE_LABEL_X, LEFT_VALUE_LABEL_Y);\r
+ leftValueLabel->Resize(LEFT_VALUE_LABEL_W, LEFT_VALUE_LABEL_H);\r
+\r
+ // Set additional property\r
+ leftValueLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ leftValueLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ leftValueLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, VALUE_LABEL_FONT);\r
+\r
+ // Add to rootView\r
+ group->Add(leftValueLabel);\r
+\r
+ // Add Label to App\r
+ if (leftUnitLabel == nullptr) {\r
+ leftUnitLabel = new UILabel();\r
+ }\r
+ leftUnitLabel->SetPosition(LEFT_UNIT_LABEL_X, LEFT_UNIT_LABEL_Y);\r
+ leftUnitLabel->Resize(LEFT_UNIT_LABEL_W, LEFT_UNIT_LABEL_H);\r
+\r
+ // Set additional property\r
+ leftUnitLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ leftUnitLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ leftUnitLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, UNIT_LABEL_FONT);\r
+\r
+ // Add to rootView\r
+ group->Add(leftUnitLabel);\r
+}\r
+\r
+void DataView::ShowupRightView()\r
+{\r
+ // Add Label to App\r
+ if (rightValueLabel == nullptr) {\r
+ rightValueLabel = new UILabel();\r
+ }\r
+ rightValueLabel->SetPosition(RIGHT_VALUE_LABEL_X, RIGHT_VALUE_LABEL_Y);\r
+ rightValueLabel->Resize(RIGHT_VALUE_LABEL_W, RIGHT_VALUE_LABEL_H);\r
+\r
+ // Set additional property\r
+ rightValueLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ rightValueLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ rightValueLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, VALUE_LABEL_FONT);\r
+\r
+ // Add to rootView\r
+ group->Add(rightValueLabel);\r
+\r
+ // Add Label to App\r
+ if (rightUnitLabel == nullptr) {\r
+ rightUnitLabel = new UILabel();\r
+ }\r
+ rightUnitLabel->SetPosition(RIGHT_UNIT_LABEL_X, RIGHT_UNIT_LABEL_Y);\r
+ rightUnitLabel->Resize(RIGHT_UNIT_LABEL_W, RIGHT_UNIT_LABEL_H);\r
+\r
+ // Set additional property\r
+ rightUnitLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ rightUnitLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ rightUnitLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, UNIT_LABEL_FONT);\r
+\r
+ // Add to rootView\r
+ group->Add(rightUnitLabel);\r
+}\r
+\r
+void DataView::ShowupBottomView()\r
+{\r
+ // Add Label to App\r
+ if (bottomValueLabel == nullptr) {\r
+ bottomValueLabel = new UILabel();\r
+ }\r
+ bottomValueLabel->SetPosition(BOTTOM_VALUE_LABEL_X, BOTTOM_VALUE_LABEL_Y);\r
+ bottomValueLabel->Resize(BOTTOM_VALUE_LABEL_W, BOTTOM_VALUE_LABEL_H);\r
+\r
+ // Set additional property\r
+ bottomValueLabel->SetText("00:12:15");\r
+ bottomValueLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ bottomValueLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ bottomValueLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, VALUE_LABEL_FONT);\r
+\r
+ // Add to rootView\r
+ group->Add(bottomValueLabel);\r
+\r
+ // Add Label to App\r
+ if (bottomUnitLabel == nullptr) {\r
+ bottomUnitLabel = new UILabel();\r
+ }\r
+ bottomUnitLabel->SetPosition(BOTTOM_UNIT_LABEL_X, BOTTOM_UNIT_LABEL_Y);\r
+ bottomUnitLabel->Resize(BOTTOM_UNIT_LABEL_W, BOTTOM_UNIT_LABEL_H);\r
+\r
+ // Set additional property\r
+ bottomUnitLabel->SetText("时间");\r
+ bottomUnitLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ bottomUnitLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ bottomUnitLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, UNIT_LABEL_FONT);\r
+\r
+ // Add to rootView\r
+ group->Add(bottomUnitLabel);\r
+}\r
+\r
+void DataView::ShowupSepLine()\r
+{\r
+ sepLine = new UICanvas();\r
+ if (sepLine == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ShowupSepLine new fail");\r
+ return;\r
+ }\r
+ sepLine->SetPosition(SEP_LINE_X, SEP_LINE_Y, SEP_LINE_W, SEP_LINE_H);\r
+ sepLine->SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);\r
+ sepLine->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ group->Add(sepLine);\r
+}\r
+\r
+UIViewGroup *DataView::InitShowUpView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DataView init");\r
+ if (group == nullptr) {\r
+ group = new UIViewGroup();\r
+ if (group == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group new fail");\r
+ return nullptr;\r
+ }\r
+ group->SetPosition(0, 0);\r
+ group->SetWidth(HORIZONTAL_RESOLUTION);\r
+ group->SetHeight(VERTICAL_RESOLUTION);\r
+ }\r
+ ShowupBackgroup();\r
+ ShowupTopView();\r
+ ShowupLeftView();\r
+ ShowupRightView();\r
+ ShowupBottomView();\r
+ ShowupSepLine();\r
+ UIView::OnDragListener *trainingDragListener = (UIView::OnDragListener *)OHOS::TrainingPresenter::GetInstance();\r
+ if (trainingDragListener == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "trainingDragListener GetInstance fail");\r
+ return nullptr;\r
+ }\r
+ group->SetOnDragListener(trainingDragListener);\r
+ group->SetViewId(DATA_VIEW_ID);\r
+ group->SetDraggable(true);\r
+ group->SetTouchable(true);\r
+ return group;\r
+}\r
+\r
+void DataView::UpdateDataViewByType()\r
+{\r
+ uint8_t trainingType = TrainingModel::GetInstance().GetCurTrainingType();\r
+ if (trainingType == TRAINING_TYPE_OUTDOOR_RUNNING) {\r
+ topValueLabel->SetText("105");\r
+ topUnitLabel->SetText("心率(次/分钟)");\r
+ leftValueLabel->SetText("00'35\"");\r
+ leftUnitLabel->SetText("配速(/km)");\r
+ rightValueLabel->SetText("3.25");\r
+ rightUnitLabel->SetText("距离(km)");\r
+ } else if (trainingType == TRAINING_TYPE_INDOOR_RUNNING) {\r
+ topValueLabel->SetText("105");\r
+ topUnitLabel->SetText("心率(次/分钟)");\r
+ leftValueLabel->SetText("00'35\"");\r
+ leftUnitLabel->SetText("配速(/km)");\r
+ rightValueLabel->SetText("3.25");\r
+ rightUnitLabel->SetText("距离(km)");\r
+ } else if (trainingType == TRAINING_TYPE_CYCLING) {\r
+ topValueLabel->SetText("105");\r
+ topUnitLabel->SetText("心率(次/分钟)");\r
+ leftValueLabel->SetText("00'35\"");\r
+ leftUnitLabel->SetText("配速(/km)");\r
+ rightValueLabel->SetText("3.25");\r
+ rightUnitLabel->SetText("距离(km)");\r
+ } else if (trainingType == TRAINING_TYPE_CLIMBING) {\r
+ topValueLabel->SetText("198");\r
+ topUnitLabel->SetText("海拔(m)");\r
+ leftValueLabel->SetText("535");\r
+ leftUnitLabel->SetText("累计上升(m)");\r
+ rightValueLabel->SetText("180");\r
+ rightUnitLabel->SetText("累计下降(m)");\r
+ } else if (trainingType == TRAINING_TYPE_INDOOR_SWIMMING) {\r
+ topValueLabel->SetText("105");\r
+ topUnitLabel->SetText("心率(次/分钟)");\r
+ leftValueLabel->SetText("235");\r
+ leftUnitLabel->SetText("热量(kcal)");\r
+ rightValueLabel->SetText("125");\r
+ rightUnitLabel->SetText("距离(km)");\r
+ } else if (trainingType == TRAINING_TYPE_OUTDOOR_SWIMMING) {\r
+ topValueLabel->SetText("105");\r
+ topUnitLabel->SetText("心率(次/分钟)");\r
+ leftValueLabel->SetText("235");\r
+ leftUnitLabel->SetText("热量(kcal)");\r
+ rightValueLabel->SetText("125");\r
+ rightUnitLabel->SetText("距离(km)");\r
+ }\r
+ topValueLabel->Invalidate();\r
+ topUnitLabel->Invalidate();\r
+ leftValueLabel->Invalidate();\r
+ leftUnitLabel->Invalidate();\r
+ rightValueLabel->Invalidate();\r
+ rightUnitLabel->Invalidate();\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Menu View\r
+ * Create: 2025-03-22\r
+ */\r
+#include "training/MenuView.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "training/TrainingPresenter.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t TITLI_LABEL_FONT = 50;\r
+static constexpr uint16_t TITLI_LABEL_X = 133;\r
+static constexpr uint16_t TITLI_LABEL_Y = 36;\r
+static constexpr uint16_t TITLI_LABEL_W = 200;\r
+static constexpr uint16_t TITLI_LABEL_H = 60;\r
+static constexpr uint16_t LIST_X = 42;\r
+static constexpr uint16_t LIST_Y = 95;\r
+static constexpr uint16_t LIST_W = 420;\r
+static constexpr uint16_t LIST_H = 305;\r
+\r
+static MenuView *g_pMenuView{nullptr};\r
+\r
+MenuView::MenuView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MenuView::MenuView");\r
+ g_pMenuView = this;\r
+}\r
+\r
+MenuView::~MenuView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MenuView::~MenuView");\r
+ if (group != nullptr) {\r
+ group->RemoveAll();\r
+ delete group;\r
+ group = nullptr;\r
+ }\r
+ if (titleLabel != nullptr) {\r
+ delete titleLabel;\r
+ titleLabel = nullptr;\r
+ }\r
+ if (trainingList != nullptr) {\r
+ delete trainingList;\r
+ trainingList = nullptr;\r
+ }\r
+ if (listAdapter_ != nullptr) {\r
+ delete listAdapter_;\r
+ listAdapter_ = nullptr;\r
+ }\r
+ g_pMenuView = nullptr;\r
+}\r
+\r
+MenuView *MenuView::GetInstance()\r
+{\r
+ return g_pMenuView;\r
+}\r
+\r
+void MenuView::CreateUILabel()\r
+{\r
+ // Add Label to App\r
+ if (titleLabel == nullptr) {\r
+ titleLabel = new UILabel();\r
+ }\r
+ titleLabel->SetPosition(TITLI_LABEL_X, TITLI_LABEL_Y);\r
+ titleLabel->Resize(TITLI_LABEL_W, TITLI_LABEL_H);\r
+\r
+ // Set additional property\r
+ titleLabel->SetText("体能训练");\r
+ titleLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ titleLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ titleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TITLI_LABEL_FONT);\r
+\r
+ // Add to rootView\r
+ group->Add(titleLabel);\r
+}\r
+\r
+void MenuView::CreateUIList()\r
+{\r
+ UIView::OnClickListener *clickListener = (UIView::OnClickListener *)OHOS::TrainingPresenter::GetInstance();\r
+ if (clickListener == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "clickListener nullptr");\r
+ return;\r
+ }\r
+\r
+ // Add List to App\r
+ if (trainingList == nullptr) {\r
+ trainingList = new UIList();\r
+ }\r
+ trainingList->SetPosition(LIST_X, LIST_Y);\r
+ trainingList->Resize(LIST_W, LIST_H);\r
+\r
+ // Set additional property\r
+ if (listAdapter_ == nullptr) {\r
+ listAdapter_ = new TrainingAdapter();\r
+ }\r
+ listAdapter_->SetItemClickListener(clickListener);\r
+ std::list<TrainingItem> trainingItemList(trainings, trainings + TRAINING_TYPE_MAX);\r
+ listAdapter_->SetData(trainingItemList);\r
+\r
+ trainingList->SetAdapter(listAdapter_);\r
+ trainingList->RefreshList();\r
+\r
+ // Add to rootView\r
+ group->Add(trainingList);\r
+}\r
+\r
+UIViewGroup *MenuView::InitShowUpView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MenuView init");\r
+ if (group == nullptr) {\r
+ group = new UIViewGroup();\r
+ if (group == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group new fail");\r
+ return nullptr;\r
+ }\r
+ group->SetPosition(0, 0);\r
+ group->SetWidth(HORIZONTAL_RESOLUTION);\r
+ group->SetHeight(VERTICAL_RESOLUTION);\r
+ }\r
+ CreateUILabel();\r
+ CreateUIList();\r
+ UIView::OnDragListener *trainingDragListener = (UIView::OnDragListener *)OHOS::TrainingPresenter::GetInstance();\r
+ if (trainingDragListener == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "trainingDragListener GetInstance fail");\r
+ return nullptr;\r
+ }\r
+ group->SetOnDragListener(trainingDragListener);\r
+ group->SetViewId(MENU_VIEW_ID);\r
+ group->SetDraggable(true);\r
+ group->SetTouchable(true);\r
+ return group;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ */\r
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2022-2022. All rights reserved.\r
+ * Description: Pause View\r
+ * Create: 2025-03-22\r
+ */\r
+#include "training/PauseView.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "training/TrainingPresenter.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t TIME_LABEL_FONT = 30;\r
+static constexpr uint16_t TIME_LABEL_X = 194;\r
+static constexpr uint16_t TIME_LABEL_Y = 42;\r
+static constexpr uint16_t TIME_LABEL_W = 200;\r
+static constexpr uint16_t TIME_LABEL_H = 60;\r
+static constexpr uint16_t TEXT_LABEL_FONT = 70;\r
+static constexpr uint16_t TEXT_LABEL_X = 128;\r
+static constexpr uint16_t TEXT_LABEL_Y = 133;\r
+static constexpr uint16_t TEXT_LABEL_W = 337;\r
+static constexpr uint16_t TEXT_LABEL_H = 152;\r
+static constexpr uint16_t BUTTON_FONT = 40;\r
+static constexpr uint16_t BUTTON_X = 136;\r
+static constexpr uint16_t BUTTON_Y1 = 236;\r
+static constexpr uint16_t BUTTON_Y2 = 329;\r
+static constexpr uint16_t BUTTON_W = 193;\r
+static constexpr uint16_t BUTTON_H = 75;\r
+\r
+#define BUTTON_TEXT_CONTINUE "继续"\r
+#define BUTTON_TEXT_FINISH "结束"\r
+\r
+static PauseView *g_pPauseView{nullptr};\r
+\r
+PauseView::PauseView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PauseView::PauseView");\r
+ g_pPauseView = this;\r
+}\r
+\r
+PauseView::~PauseView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PauseView::~PauseView");\r
+ if (group != nullptr) {\r
+ group->RemoveAll();\r
+ delete group;\r
+ group = nullptr;\r
+ }\r
+ if (timeLabel != nullptr) {\r
+ delete timeLabel;\r
+ timeLabel = nullptr;\r
+ }\r
+ if (textLabel != nullptr) {\r
+ delete textLabel;\r
+ textLabel = nullptr;\r
+ }\r
+ if (continueButton != nullptr) {\r
+ delete continueButton;\r
+ continueButton = nullptr;\r
+ }\r
+ if (finishButton != nullptr) {\r
+ delete finishButton;\r
+ finishButton = nullptr;\r
+ }\r
+ g_pPauseView = nullptr;\r
+}\r
+\r
+PauseView *PauseView::GetInstance()\r
+{\r
+ return g_pPauseView;\r
+}\r
+\r
+void PauseView::CreateUILabel()\r
+{\r
+ // Add Label to App\r
+ if (timeLabel == nullptr) {\r
+ timeLabel = new UILabel();\r
+ }\r
+ timeLabel->SetPosition(TIME_LABEL_X, TIME_LABEL_Y);\r
+ timeLabel->Resize(TIME_LABEL_W, TIME_LABEL_H);\r
+\r
+ // Set additional property\r
+ timeLabel->SetText("11:59");\r
+ timeLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ timeLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ timeLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TIME_LABEL_FONT);\r
+\r
+ // Add to rootView\r
+ group->Add(timeLabel);\r
+\r
+ // Add Label to App\r
+ if (textLabel == nullptr) {\r
+ textLabel = new UILabel();\r
+ }\r
+ textLabel->SetPosition(TEXT_LABEL_X, TEXT_LABEL_Y);\r
+ textLabel->Resize(TEXT_LABEL_W, TEXT_LABEL_H);\r
+\r
+ // Set additional property\r
+ textLabel->SetText("已暂停");\r
+ textLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ textLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ textLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TEXT_LABEL_FONT);\r
+\r
+ // Add to rootView\r
+ group->Add(textLabel);\r
+}\r
+\r
+void PauseView::CreateUIButton()\r
+{\r
+ UIView::OnClickListener *clickListener = (UIView::OnClickListener *)OHOS::TrainingPresenter::GetInstance();\r
+ if (clickListener == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "clickListener nullptr");\r
+ return;\r
+ }\r
+ // Add LabelButtonExt to App\r
+ if (continueButton == nullptr) {\r
+ continueButton = new UILabelButton();\r
+ }\r
+ continueButton->SetPosition(BUTTON_X, BUTTON_Y1);\r
+ continueButton->Resize(BUTTON_W, BUTTON_H);\r
+ continueButton->SetViewId(TRAINING_PAUSE_CONTINUE_BUTTON);\r
+\r
+ // Set additional property\r
+ continueButton->SetText(BUTTON_TEXT_CONTINUE);\r
+ continueButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BUTTON_FONT);\r
+ continueButton->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);\r
+ continueButton->SetOnClickListener(clickListener);\r
+\r
+ // Add to rootView\r
+ group->Add(continueButton);\r
+\r
+ // Add LabelButtonExt to App\r
+ if (finishButton == nullptr) {\r
+ finishButton = new UILabelButton();\r
+ }\r
+ finishButton->SetPosition(BUTTON_X, BUTTON_Y2);\r
+ finishButton->Resize(BUTTON_W, BUTTON_H);\r
+ finishButton->SetViewId(TRAINING_PAUSE_FINISH_BUTTON);\r
+ finishButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xffbc321e);\r
+\r
+ // Set additional property\r
+ finishButton->SetText(BUTTON_TEXT_FINISH);\r
+ finishButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BUTTON_FONT);\r
+ finishButton->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);\r
+ finishButton->SetOnClickListener(clickListener);\r
+\r
+ // Add to rootView\r
+ group->Add(finishButton);\r
+}\r
+\r
+UIViewGroup *PauseView::InitShowUpView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PauseView init");\r
+ if (group == nullptr) {\r
+ group = new UIViewGroup();\r
+ if (group == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group new fail");\r
+ return nullptr;\r
+ }\r
+ group->SetPosition(0, 0);\r
+ group->SetWidth(HORIZONTAL_RESOLUTION);\r
+ group->SetHeight(VERTICAL_RESOLUTION);\r
+ }\r
+ CreateUILabel();\r
+ CreateUIButton();\r
+ UIView::OnDragListener *trainingDragListener = (UIView::OnDragListener *)OHOS::TrainingPresenter::GetInstance();\r
+ if (trainingDragListener == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "trainingDragListener GetInstance fail");\r
+ return nullptr;\r
+ }\r
+ group->SetOnDragListener(trainingDragListener);\r
+ group->SetViewId(PAUSE_VIEW_ID);\r
+ group->SetDraggable(true);\r
+ group->SetTouchable(true);\r
+ return group;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Prepare View\r
+ * Create: 2025-03-22\r
+ */\r
+#include "training/PrepareView.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "training/TrainingPresenter.h"\r
+#include "screensetting/ScreenModels.h"\r
+#include "ui_resource_image.h"\r
+\r
+namespace OHOS {\r
+\r
+static constexpr uint16_t HEARTBEAT_IMAGE_X = 366;\r
+static constexpr uint16_t HEARTBEAT_IMAGE_Y = 165;\r
+static constexpr uint16_t HEARTBEAT_IMAGE_W = 56;\r
+static constexpr uint16_t HEARTBEAT_IMAGE_H = 56;\r
+static constexpr uint16_t HEARTBEAT_IMAGE_NUM = 19;\r
+static constexpr uint16_t HEARTBEAT_DELAY = 50;\r
+static constexpr uint16_t HEARTBEAT_LABEL_X = 363;\r
+static constexpr uint16_t HEARTBEAT_LABEL_Y = 241;\r
+static constexpr uint16_t HEARTBEAT_LABEL_W = 86;\r
+static constexpr uint16_t HEARTBEAT_LABEL_H = 30;\r
+static constexpr uint16_t HEARTBEAT_LABEL_FONT = 30;\r
+static constexpr uint16_t BATTERY_X = 175;\r
+static constexpr uint16_t BATTERY_Y = 84;\r
+static constexpr uint16_t BATTERY_LABEL_FONT = 30;\r
+static constexpr uint16_t BATTERY_LABEL_X = 232;\r
+static constexpr uint16_t BATTERY_LABEL_Y = 75;\r
+static constexpr uint16_t BATTERY_LABEL_W = 86;\r
+static constexpr uint16_t BATTERY_LABEL_H = 30;\r
+static constexpr uint16_t GPS_X = 30;\r
+static constexpr uint16_t GPS_Y = 167;\r
+static constexpr uint16_t GPS_W = 56;\r
+static constexpr uint16_t GPS_H = 56;\r
+static constexpr uint16_t GPS_LABEL_FONT = 30;\r
+static constexpr uint16_t GPS_LABEL_X = 29;\r
+static constexpr uint16_t GPS_LABEL_Y = 227;\r
+static constexpr uint16_t GPS_LABEL_W = 200;\r
+static constexpr uint16_t GPS_LABEL_H = 60;\r
+static constexpr uint16_t TIME_LABEL_FONT = 30;\r
+static constexpr uint16_t TIME_LABEL_X = 177;\r
+static constexpr uint16_t TIME_LABEL_Y = 36;\r
+static constexpr uint16_t TIME_LABEL_W = 100;\r
+static constexpr uint16_t TIME_LABEL_H = 30;\r
+static constexpr uint16_t LOCATING_LABEL_FONT = 25;\r
+static constexpr uint16_t LOCATING_LABEL_X = 127;\r
+static constexpr uint16_t LOCATING_LABEL_Y = 348;\r
+static constexpr uint16_t LOCATING_LABEL_W = 200;\r
+static constexpr uint16_t LOCATING_LABEL_H = 80;\r
+static constexpr uint16_t WALK_BUTTON_X = 138;\r
+static constexpr uint16_t WALK_BUTTON_Y = 136;\r
+static constexpr uint16_t WALK_BUTTON_W = 180;\r
+static constexpr uint16_t WALK_BUTTON_H = 180;\r
+static constexpr uint16_t START_BUTTON_X = 196;\r
+static constexpr uint16_t START_BUTTON_Y = 373;\r
+static constexpr uint16_t START_BUTTON_W = 73;\r
+static constexpr uint16_t START_BUTTON_H = 73;\r
+static constexpr uint16_t START_BUTTON_FONT = 30;\r
+\r
+static PrepareView *g_pPrepareView{nullptr};\r
+\r
+PrepareView::PrepareView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PrepareView::PrepareView");\r
+ g_pPrepareView = this;\r
+}\r
+\r
+PrepareView::~PrepareView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PrepareView::~PrepareView");\r
+ if (group != nullptr) {\r
+ group->RemoveAll();\r
+ delete group;\r
+ group = nullptr;\r
+ }\r
+ if (timeLabel != nullptr) {\r
+ delete timeLabel;\r
+ timeLabel = nullptr;\r
+ }\r
+ if (battery != nullptr) {\r
+ delete battery;\r
+ battery = nullptr;\r
+ }\r
+ if (batteryLabel != nullptr) {\r
+ delete batteryLabel;\r
+ batteryLabel = nullptr;\r
+ }\r
+ if (gpsImageView != nullptr) {\r
+ delete gpsImageView;\r
+ gpsImageView = nullptr;\r
+ }\r
+ if (gpsLabel != nullptr) {\r
+ delete gpsLabel;\r
+ gpsLabel = nullptr;\r
+ }\r
+ if (heartRateImageView != nullptr) {\r
+ delete heartRateImageView;\r
+ heartRateImageView = nullptr;\r
+ }\r
+ if (heartRateLabel != nullptr) {\r
+ delete heartRateLabel;\r
+ heartRateLabel = nullptr;\r
+ }\r
+ if (locatingLabel != nullptr) {\r
+ delete locatingLabel;\r
+ locatingLabel = nullptr;\r
+ }\r
+ if (startButton != nullptr) {\r
+ delete startButton;\r
+ startButton = nullptr;\r
+ }\r
+ if (iconImageView != nullptr) {\r
+ delete iconImageView;\r
+ iconImageView = nullptr;\r
+ }\r
+ g_pPrepareView = nullptr;\r
+}\r
+\r
+PrepareView *PrepareView::GetInstance()\r
+{\r
+ return g_pPrepareView;\r
+}\r
+\r
+bool PrepareView::InitTimeLableVIew()\r
+{\r
+ timeLabel = new UILabel();\r
+ if (timeLabel == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "timeLabel new fail");\r
+ return false;\r
+ }\r
+ timeLabel->SetPosition(TIME_LABEL_X, TIME_LABEL_Y, TIME_LABEL_W, TIME_LABEL_H);\r
+ timeLabel->SetText("11:59");\r
+ timeLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TIME_LABEL_FONT);\r
+ timeLabel->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+ timeLabel->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER, UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);\r
+ group->Add(timeLabel);\r
+ return true;\r
+}\r
+\r
+bool PrepareView::InitLocatingLableVIew()\r
+{\r
+ locatingLabel = new UILabel();\r
+ if (locatingLabel == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locatingLabel new fail");\r
+ return false;\r
+ }\r
+ locatingLabel->SetPosition(LOCATING_LABEL_X, LOCATING_LABEL_Y, LOCATING_LABEL_W, LOCATING_LABEL_H);\r
+ locatingLabel->SetText("定位中\n请在空旷处等待");\r
+ locatingLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, LOCATING_LABEL_FONT);\r
+ locatingLabel->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+ locatingLabel->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER,\r
+ UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);\r
+ group->Add(locatingLabel);\r
+ return true;\r
+}\r
+\r
+bool PrepareView::InitBatteryView() // 加载电量\r
+{\r
+ battery = new UIImageView(); // 电量状态显示\r
+ if (battery == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "battery new fail");\r
+ return false;\r
+ }\r
+ battery->SetPosition(BATTERY_X, BATTERY_Y);\r
+ ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, battery, DROPDOWN_DROPDOWN_BATTERY);\r
+ group->Add(battery);\r
+\r
+ batteryLabel = new UILabel();\r
+ if (batteryLabel == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "batteryLabel new fail");\r
+ return false;\r
+ }\r
+ batteryLabel->SetPosition(BATTERY_LABEL_X, BATTERY_LABEL_Y, BATTERY_LABEL_W, BATTERY_LABEL_H);\r
+ batteryLabel->SetText("30%");\r
+ batteryLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BATTERY_LABEL_FONT);\r
+ batteryLabel->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+ group->Add(batteryLabel);\r
+ return true;\r
+}\r
+\r
+bool PrepareView::InitCenterView()\r
+{\r
+ iconImageView = new UIButton(); // 步行状态显示\r
+ if (iconImageView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "iconImageView new fail");\r
+ return false;\r
+ }\r
+\r
+ iconImageView->SetPosition(WALK_BUTTON_X, WALK_BUTTON_Y, WALK_BUTTON_W, WALK_BUTTON_H);\r
+\r
+ group->Add(iconImageView);\r
+ return true;\r
+}\r
+\r
+bool PrepareView::InitGPSView()\r
+{\r
+ // Add ImageView to App\r
+ if (gpsImageView == nullptr) {\r
+ gpsImageView = new UIImageView();\r
+ }\r
+ gpsImageView->SetPosition(GPS_X, GPS_Y);\r
+ gpsImageView->Resize(GPS_W, GPS_H);\r
+\r
+ // Set additional property\r
+\r
+ // Add to rootView\r
+ group->Add(gpsImageView);\r
+\r
+ // Add Label to App\r
+ if (gpsLabel == nullptr) {\r
+ gpsLabel = new UILabel();\r
+ }\r
+ gpsLabel->SetPosition(GPS_LABEL_X, GPS_LABEL_Y);\r
+ gpsLabel->Resize(GPS_LABEL_W, GPS_LABEL_H);\r
+\r
+ // Set additional property\r
+ gpsLabel->SetText("GPS");\r
+ gpsLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ gpsLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ gpsLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, GPS_LABEL_FONT);\r
+\r
+ // Add to rootView\r
+ group->Add(gpsLabel);\r
+ return true;\r
+}\r
+\r
+bool PrepareView::InitHeartrateView()\r
+{\r
+ // Add ImageView to App\r
+ if (heartRateImageView == nullptr) {\r
+ heartRateImageView = new UIImageView();\r
+ }\r
+ heartRateImageView->SetPosition(HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y);\r
+ heartRateImageView->Resize(HEARTBEAT_IMAGE_W, HEARTBEAT_IMAGE_H);\r
+\r
+ // Add to rootView\r
+ group->Add(heartRateImageView);\r
+\r
+ heartRateLabel = new UILabel();\r
+ if (heartRateLabel == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "heartRateLabel new fail");\r
+ return false;\r
+ }\r
+ heartRateLabel->SetPosition(HEARTBEAT_LABEL_X, HEARTBEAT_LABEL_Y, HEARTBEAT_LABEL_W, HEARTBEAT_LABEL_H);\r
+ heartRateLabel->SetText("95");\r
+ heartRateLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, HEARTBEAT_LABEL_FONT);\r
+ heartRateLabel->SetStyle(STYLE_BACKGROUND_COLOR, OPA_OPAQUE);\r
+ group->Add(heartRateLabel);\r
+ return true;\r
+}\r
+\r
+bool PrepareView::InitStartButtonView()\r
+{\r
+ UIView::OnClickListener *clickListener = (UIView::OnClickListener *)OHOS::TrainingPresenter::GetInstance();\r
+ if (clickListener == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "clickListener nullptr");\r
+ return false;\r
+ }\r
+\r
+ // Add LabelButtonExt to App\r
+ if (startButton == nullptr) {\r
+ startButton = new UILabelButton();\r
+ }\r
+ startButton->SetPosition(START_BUTTON_X, START_BUTTON_Y); // widget's left position and top position\r
+ startButton->Resize(START_BUTTON_W, START_BUTTON_H); // widget's width and height\r
+ startButton->SetViewId(TRAINING_PREPARE_START_BUTTON); // Set style\r
+ startButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xffff1500);\r
+\r
+ // Set additional property\r
+ startButton->SetText("开始");\r
+ startButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, START_BUTTON_FONT);\r
+ startButton->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);\r
+ startButton->SetOnClickListener(clickListener);\r
+\r
+ // Add to rootView\r
+ group->Add(startButton);\r
+ return true;\r
+}\r
+\r
+UIViewGroup *PrepareView::InitShowUpView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PrepareView init");\r
+ if (group == nullptr) {\r
+ group = new UIViewGroup();\r
+ if (group == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group new fail");\r
+ return nullptr;\r
+ }\r
+ group->SetPosition(0, 0);\r
+ group->SetWidth(HORIZONTAL_RESOLUTION);\r
+ group->SetHeight(VERTICAL_RESOLUTION);\r
+ }\r
+ InitTimeLableVIew();\r
+ InitBatteryView();\r
+ // InitLocatingLableVIew();\r
+ InitCenterView();\r
+ InitGPSView();\r
+ InitHeartrateView();\r
+ InitStartButtonView();\r
+ UIView::OnDragListener *trainingDragListener = (UIView::OnDragListener *)OHOS::TrainingPresenter::GetInstance();\r
+ if (trainingDragListener == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "trainingDragListener GetInstance fail");\r
+ return nullptr;\r
+ }\r
+ group->SetOnDragListener(trainingDragListener);\r
+ group->SetViewId(PREPARE_VIEW_ID);\r
+ group->SetDraggable(true);\r
+ group->SetTouchable(true);\r
+ return group;\r
+}\r
+\r
+void PrepareView::UpdateViewByTrainingType(uint8_t trainingType)\r
+{\r
+ if (trainingType == TRAINING_TYPE_OUTDOOR_RUNNING) {\r
+ gpsImageView->SetVisible(true);\r
+ gpsLabel->SetVisible(true);\r
+ iconImageView->SetImageSrc(PNG_WALK_IMAGE, PNG_WALK_IMAGE);\r
+ } else if (trainingType == TRAINING_TYPE_INDOOR_RUNNING) {\r
+ gpsImageView->SetVisible(false);\r
+ gpsLabel->SetVisible(false);\r
+ iconImageView->SetImageSrc(PNG_WALK_IMAGE, PNG_WALK_IMAGE);\r
+ } else if (trainingType == TRAINING_TYPE_CYCLING) {\r
+ gpsImageView->SetVisible(true);\r
+ gpsLabel->SetVisible(true);\r
+ iconImageView->SetImageSrc(PNG_WALK_IMAGE, PNG_WALK_IMAGE);\r
+ } else if (trainingType == TRAINING_TYPE_CLIMBING) {\r
+ gpsImageView->SetVisible(true);\r
+ gpsLabel->SetVisible(true);\r
+ iconImageView->SetImageSrc(PNG_WALK_IMAGE, PNG_WALK_IMAGE);\r
+ } else if (trainingType == TRAINING_TYPE_INDOOR_SWIMMING) {\r
+ gpsImageView->SetVisible(false);\r
+ gpsLabel->SetVisible(false);\r
+ iconImageView->SetImageSrc(PNG_WALK_IMAGE, PNG_WALK_IMAGE);\r
+ } else if (trainingType == TRAINING_TYPE_OUTDOOR_SWIMMING) {\r
+ gpsImageView->SetVisible(true);\r
+ gpsLabel->SetVisible(true);\r
+ iconImageView->SetImageSrc(PNG_WALK_IMAGE, PNG_WALK_IMAGE);\r
+ }\r
+ iconImageView->Invalidate();\r
+ gpsImageView->Invalidate();\r
+ gpsLabel->Invalidate();\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Prompt View\r
+ * Create: 2025-03-22\r
+ */\r
+#include "training/PromptView.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "training/TrainingPresenter.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABELS_X = 65;\r
+static constexpr uint16_t LABELS_Y = 100;\r
+static constexpr uint16_t LABELS_W = 324;\r
+static constexpr uint16_t LABELS_H = 160;\r
+static constexpr uint16_t LABELS_FONT = 35;\r
+static constexpr uint16_t BUTTON_X1 = 85;\r
+static constexpr uint16_t BUTTON_X2 = 279;\r
+static constexpr uint16_t BUTTON_Y = 320;\r
+static constexpr uint16_t BUTTON_W = 90;\r
+static constexpr uint16_t BUTTON_H = 90;\r
+static const char *PROMPT_CONTENT = "本次运动距离过短,不会记录数据。是否结束?";\r
+static PromptView *g_pPromptView{nullptr};\r
+\r
+PromptView::PromptView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PromptView::PromptView");\r
+ g_pPromptView = this;\r
+}\r
+\r
+PromptView::~PromptView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PromptView::~PromptView");\r
+ if (group != nullptr) {\r
+ group->RemoveAll();\r
+ delete group;\r
+ group = nullptr;\r
+ }\r
+ if (titleLabel != nullptr) {\r
+ delete titleLabel;\r
+ titleLabel = nullptr;\r
+ }\r
+ if (cancelButton != nullptr) {\r
+ delete cancelButton;\r
+ cancelButton = nullptr;\r
+ }\r
+ if (confirmButton != nullptr) {\r
+ delete confirmButton;\r
+ confirmButton = nullptr;\r
+ }\r
+ g_pPromptView = nullptr;\r
+}\r
+\r
+PromptView *PromptView::GetInstance()\r
+{\r
+ return g_pPromptView;\r
+}\r
+\r
+void PromptView::CreateUILabel()\r
+{\r
+ if (titleLabel == nullptr) {\r
+ titleLabel = new UILabel();\r
+ if (titleLabel == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PromptView titleLabel new fail");\r
+ return;\r
+ }\r
+ titleLabel->SetPosition(LABELS_X, LABELS_Y, LABELS_W, LABELS_H);\r
+ titleLabel->SetText(PROMPT_CONTENT);\r
+ titleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABELS_FONT);\r
+ titleLabel->SetStyle(STYLE_BACKGROUND_COLOR, OPA_OPAQUE);\r
+ titleLabel->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER,\r
+ UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);\r
+ titleLabel->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);\r
+ group->Add(titleLabel);\r
+ }\r
+}\r
+\r
+void PromptView::CreateUIButton()\r
+{\r
+ UIView::OnClickListener *clickListener = (UIView::OnClickListener *)OHOS::TrainingPresenter::GetInstance();\r
+ if (clickListener == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "clickListener nullptr");\r
+ return;\r
+ }\r
+\r
+ if (cancelButton == nullptr) {\r
+ cancelButton = new UIButton();\r
+ if (cancelButton == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PromptView cancelButton new fail");\r
+ return;\r
+ }\r
+ cancelButton->SetPosition(BUTTON_X1, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+ cancelButton->SetViewId(TRAINING_PROMPT_CANCEL_BUTTON);\r
+ cancelButton->SetImageSrc(ALARM_DELETE_ADD_PATH, ALARM_DELETE_ADD_PATH);\r
+ cancelButton->SetOnClickListener(clickListener);\r
+ group->Add(cancelButton);\r
+ }\r
+ if (confirmButton == nullptr) {\r
+ confirmButton = new UIButton();\r
+ if (confirmButton == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PromptView confirmButton new fail");\r
+ return;\r
+ }\r
+ confirmButton->SetPosition(BUTTON_X2, BUTTON_Y, BUTTON_W, BUTTON_H);\r
+ confirmButton->SetViewId(TRAINING_PROMPT_CONFIRM_BUTTON);\r
+ confirmButton->SetImageSrc(ALARM_TRUE_ADD_PATH, ALARM_TRUE_ADD_PATH);\r
+ confirmButton->SetOnClickListener(clickListener);\r
+ group->Add(confirmButton);\r
+ }\r
+}\r
+\r
+UIViewGroup *PromptView::InitShowUpView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PromptView InitShowUpView");\r
+ if (group == nullptr) {\r
+ group = new UIViewGroup();\r
+ if (group == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group new fail");\r
+ return nullptr;\r
+ }\r
+ group->SetPosition(0, 0);\r
+ group->SetWidth(HORIZONTAL_RESOLUTION);\r
+ group->SetHeight(VERTICAL_RESOLUTION);\r
+ }\r
+ CreateUILabel();\r
+ CreateUIButton();\r
+ UIView::OnDragListener *trainingDragListener = (UIView::OnDragListener *)OHOS::TrainingPresenter::GetInstance();\r
+ if (trainingDragListener == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "trainingDragListener GetInstance fail");\r
+ return nullptr;\r
+ }\r
+ group->SetOnDragListener(trainingDragListener);\r
+ group->SetViewId(PROMPT_VIEW_ID);\r
+ group->SetDraggable(true);\r
+ group->SetTouchable(true);\r
+ return group;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TargetAdapter\r
+ * Author:\r
+ * Create: 2025-11-23\r
+ */\r
+#include "training/TargetAdapter.h"\r
+#include "training/TargetItemView.h"\r
+\r
+namespace OHOS {\r
+TargetAdapter::TargetAdapter() {}\r
+\r
+TargetAdapter::~TargetAdapter()\r
+{\r
+ listData_.clear();\r
+}\r
+\r
+uint16_t TargetAdapter::GetCount(void)\r
+{\r
+ return listData_.size();\r
+}\r
+\r
+void TargetAdapter::SetData(const std::list<TargetItem> &data)\r
+{\r
+ if (!listData_.empty()) {\r
+ listData_.clear();\r
+ }\r
+ listData_ = data;\r
+}\r
+\r
+UIView *TargetAdapter::GetView(UIView *inView, int16_t index)\r
+{\r
+ if (listData_.empty()) {\r
+ return nullptr;\r
+ }\r
+ if (index < 0) {\r
+ return nullptr;\r
+ }\r
+ size_t uindex = index;\r
+ if (uindex >= listData_.size()) {\r
+ return nullptr;\r
+ }\r
+\r
+ std::list<TargetItem>::iterator it = listData_.begin();\r
+ for (int i = 0; i < index; i++) {\r
+ it++;\r
+ }\r
+ TargetItem itemData = *it;\r
+ TargetItemView *item = nullptr;\r
+ if (inView == nullptr) {\r
+ item = new TargetItemView();\r
+ } else {\r
+ item = static_cast<TargetItemView *>(inView);\r
+ }\r
+ item->SetItemInfo(itemData);\r
+ item->SetOnClickListener(itemClickListener);\r
+ return item;\r
+}\r
+\r
+void TargetAdapter::AddListItem(const TargetItem &item)\r
+{\r
+ listData_.push_back(item);\r
+}\r
+} // namespace OHOS\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TargetItemView\r
+ * Author:\r
+ * Create: 2025-02-15\r
+ */\r
+\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "training/TargetItemView.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t ITEM_X = 0;\r
+static constexpr uint16_t ITEM_Y = 0;\r
+static constexpr uint16_t ITEM_W = 382;\r
+static constexpr uint16_t ITEM_H = 100;\r
+static constexpr uint16_t ICON_X = 0;\r
+static constexpr uint16_t ICON_Y = 0;\r
+static constexpr uint16_t LABEL_X = 100;\r
+static constexpr uint16_t LABEL_Y = 0;\r
+static constexpr uint16_t LABEL_W = 200;\r
+static constexpr uint16_t LABEL_H = 100;\r
+static constexpr uint16_t LABEL_FONT = 35;\r
+static constexpr uint16_t IMAGE_W = 300;\r
+static constexpr uint16_t IMAGE_H = 0;\r
+\r
+TargetItemView::TargetItemView()\r
+{\r
+ InitView();\r
+}\r
+\r
+TargetItemView::~TargetItemView()\r
+{\r
+ Remove(&sIcon);\r
+ Remove(&sLabel);\r
+ Remove(&sNextImage);\r
+}\r
+\r
+bool TargetItemView::InitView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TargetItemView::InitView");\r
+ SetPosition(ITEM_X, ITEM_Y, ITEM_W, ITEM_H);\r
+ SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ SetTouchable(true);\r
+\r
+ sIcon.SetPosition(ICON_X, ICON_Y);\r
+ sIcon.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
+\r
+ sLabel.SetPosition(LABEL_X, LABEL_Y);\r
+ sLabel.Resize(LABEL_W, LABEL_H);\r
+ sLabel.SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+ sLabel.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ sLabel.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ sLabel.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ sLabel.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ sLabel.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+\r
+ sNextImage.SetSrc(PNG_SETTING_NEXT_IMAGE);\r
+ sNextImage.SetPosition(IMAGE_W, IMAGE_H);\r
+ sNextImage.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
+\r
+ Add(&sIcon);\r
+ Add(&sLabel);\r
+ Add(&sNextImage);\r
+ return true;\r
+}\r
+\r
+void TargetItemView::SetItemInfo(const TargetItem itemInfo)\r
+{\r
+ sItemInfo = itemInfo;\r
+ sIcon.SetSrc(itemInfo.icon);\r
+ sLabel.SetText(itemInfo.label);\r
+ SetViewId(itemInfo.viewId);\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TargetSetting View\r
+ * Create: 2025-03-22\r
+ */\r
+#include "training/TargetSettingView.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "training/TrainingPresenter.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABELS_X = 153;\r
+static constexpr uint16_t LABELS_Y = 30;\r
+static constexpr uint16_t LABELS_W = 200;\r
+static constexpr uint16_t LABELS_H = 50;\r
+static constexpr uint16_t LABELS_FONT = 40;\r
+static constexpr uint16_t PICKER_X = 160;\r
+static constexpr uint16_t PICKER_Y = 85;\r
+static constexpr uint16_t PICKER_W = 199;\r
+static constexpr uint16_t PICKER_H = 241;\r
+static constexpr uint16_t PICKER_ITEM_H = 50;\r
+static constexpr uint16_t BUTTON_X = 87;\r
+static constexpr uint16_t BUTTON_Y = 351;\r
+static constexpr uint16_t BUTTON_W = 279;\r
+static constexpr uint16_t BUTTON_H = 116;\r
+static constexpr uint16_t BUTTON_FONT = 40;\r
+static constexpr uint8_t BACKGROUND_FONT = 40;\r
+static constexpr uint8_t HIGHTLIGHT_FONT = 50;\r
+\r
+static TargetSettingView *g_pTargetSettingView{nullptr};\r
+\r
+TargetSettingView::TargetSettingView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TargetSettingView::TargetSettingView");\r
+ g_pTargetSettingView = this;\r
+}\r
+\r
+TargetSettingView::~TargetSettingView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TargetSettingView::~TargetSettingView");\r
+ if (group != nullptr) {\r
+ group->RemoveAll();\r
+ delete group;\r
+ group = nullptr;\r
+ }\r
+ if (titleLabel != nullptr) {\r
+ delete titleLabel;\r
+ titleLabel = nullptr;\r
+ }\r
+ if (picker != nullptr) {\r
+ delete picker;\r
+ picker = nullptr;\r
+ }\r
+ if (confirmButton != nullptr) {\r
+ delete confirmButton;\r
+ confirmButton = nullptr;\r
+ }\r
+ g_pTargetSettingView = nullptr;\r
+}\r
+\r
+TargetSettingView *TargetSettingView::GetInstance()\r
+{\r
+ return g_pTargetSettingView;\r
+}\r
+\r
+void TargetSettingView::CreateUILabel()\r
+{\r
+ // Add Label to App\r
+ if (titleLabel == nullptr) {\r
+ titleLabel = new UILabel();\r
+ }\r
+ titleLabel->SetPosition(LABELS_X, LABELS_Y);\r
+ titleLabel->Resize(LABELS_W, LABELS_H);\r
+ titleLabel->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+\r
+ // Set additional property\r
+ titleLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ titleLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ titleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABELS_FONT);\r
+\r
+ // Add to rootView\r
+ group->Add(titleLabel);\r
+}\r
+\r
+void TargetSettingView::CreateUIPicker()\r
+{\r
+ // Add Picker to App\r
+ if (picker == nullptr) {\r
+ picker = new UIPicker();\r
+ }\r
+ picker->SetPosition(PICKER_X, PICKER_Y);\r
+ picker->Resize(PICKER_W, PICKER_H);\r
+ picker->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+\r
+ // Set additional property\r
+ picker->SetItemHeight(PICKER_ITEM_H);\r
+\r
+ picker->SetBackgroundFont(DEFAULT_VECTOR_FONT_FILENAME, BACKGROUND_FONT);\r
+ picker->SetHighlightFont(DEFAULT_VECTOR_FONT_FILENAME, HIGHTLIGHT_FONT);\r
+\r
+ // Add to rootView\r
+ group->Add(picker);\r
+}\r
+\r
+void TargetSettingView::CreateUIButton()\r
+{\r
+ UIView::OnClickListener *clickListener = (UIView::OnClickListener *)OHOS::TrainingPresenter::GetInstance();\r
+ if (clickListener == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "clickListener nullptr");\r
+ return;\r
+ }\r
+\r
+ // Add LabelButtonExt to App\r
+ if (confirmButton == nullptr) {\r
+ confirmButton = new UILabelButton();\r
+ }\r
+ confirmButton->SetPosition(BUTTON_X, BUTTON_Y);\r
+ confirmButton->Resize(BUTTON_W, BUTTON_H);\r
+ confirmButton->SetViewId(TARGET_SETTING_CONFIRM_BUTTON);\r
+ confirmButton->SetTouchable(true);\r
+\r
+ // Set additional property\r
+ confirmButton->SetText("确定");\r
+ confirmButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BUTTON_FONT);\r
+\r
+ confirmButton->SetOnClickListener(clickListener);\r
+\r
+ // Add to rootView\r
+ group->Add(confirmButton);\r
+}\r
+\r
+UIViewGroup *TargetSettingView::InitShowUpView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TargetSettingView InitShowUpView");\r
+ if (group == nullptr) {\r
+ group = new UIViewGroup();\r
+ if (group == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group new fail");\r
+ return nullptr;\r
+ }\r
+ group->SetPosition(0, 0);\r
+ group->SetWidth(HORIZONTAL_RESOLUTION);\r
+ group->SetHeight(VERTICAL_RESOLUTION);\r
+ }\r
+ CreateUILabel();\r
+ CreateUIPicker();\r
+ CreateUIButton();\r
+ UIView::OnDragListener *trainingDragListener = (UIView::OnDragListener *)OHOS::TrainingPresenter::GetInstance();\r
+ if (trainingDragListener == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "trainingDragListener GetInstance fail");\r
+ return nullptr;\r
+ }\r
+ group->SetOnDragListener(trainingDragListener);\r
+ group->SetViewId(TARGET_SETTING_VIEW_ID);\r
+ group->SetDraggable(true);\r
+ group->SetTouchable(true);\r
+ return group;\r
+}\r
+\r
+void TargetSettingView::UpdateViewByTargetType(uint8_t targetType)\r
+{\r
+ if (targetType == TRAINING_TARGET_DISTANCE) {\r
+ titleLabel->SetText("距离");\r
+ const char *uiDistanceData[] = {"1km", "3km", "5km", "10km"};\r
+ picker->SetValues(uiDistanceData, sizeof(uiDistanceData) / sizeof(uiDistanceData[0]));\r
+ picker->SetTextColor(Color::Gray(), Color::Teal());\r
+ confirmButton->SetStyle(STYLE_BACKGROUND_COLOR, Color::Teal().full);\r
+ } else if (targetType == TRAINING_TARGET_TIME) {\r
+ titleLabel->SetText("时间");\r
+ const char *uiTimeData[] = {"10分钟", "20分钟", "30分钟", "60分钟"};\r
+ picker->SetValues(uiTimeData, sizeof(uiTimeData) / sizeof(uiTimeData[0]));\r
+ picker->SetTextColor(Color::Gray(), Color::Orange());\r
+ confirmButton->SetStyle(STYLE_BACKGROUND_COLOR, Color::Orange().full);\r
+ } else if (targetType == TRAINING_TARGET_CALORIE) {\r
+ titleLabel->SetText("热量");\r
+ const char *uiCalorieData[] = {"100千卡", "200千卡", "300千卡", "500千卡", "1000千卡"};\r
+ picker->SetValues(uiCalorieData, sizeof(uiCalorieData) / sizeof(uiCalorieData[0]));\r
+ picker->SetTextColor(Color::Gray(), Color::Magenta());\r
+ confirmButton->SetStyle(STYLE_BACKGROUND_COLOR, Color::Magenta().full);\r
+ }\r
+ titleLabel->Invalidate();\r
+ picker->Invalidate();\r
+ confirmButton->Invalidate();\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: Target View\r
+ * Create: 2025-03-22\r
+ */\r
+#include "training/TargetView.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "training/TrainingPresenter.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABELS_X = 133;\r
+static constexpr uint16_t LABELS_Y = 36;\r
+static constexpr uint16_t LABELS_W = 200;\r
+static constexpr uint16_t LABELS_H = 60;\r
+static constexpr uint16_t LABELS_FONT = 50;\r
+static constexpr uint16_t LIST_X = 42;\r
+static constexpr uint16_t LIST_Y = 95;\r
+static constexpr uint16_t LIST_W = 382;\r
+static constexpr uint16_t LIST_H = 305;\r
+\r
+static TargetView *g_pTargetView{nullptr};\r
+\r
+TargetView::TargetView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TargetView::TargetView");\r
+ g_pTargetView = this;\r
+}\r
+\r
+TargetView::~TargetView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TargetView::~TargetView");\r
+ if (group != nullptr) {\r
+ group->RemoveAll();\r
+ delete group;\r
+ group = nullptr;\r
+ }\r
+ if (titleLabel != nullptr) {\r
+ delete titleLabel;\r
+ titleLabel = nullptr;\r
+ }\r
+ if (targetList != nullptr) {\r
+ delete targetList;\r
+ targetList = nullptr;\r
+ }\r
+ if (listAdapter_ != nullptr) {\r
+ delete listAdapter_;\r
+ listAdapter_ = nullptr;\r
+ }\r
+ g_pTargetView = nullptr;\r
+}\r
+\r
+TargetView *TargetView::GetInstance()\r
+{\r
+ return g_pTargetView;\r
+}\r
+\r
+void TargetView::CreateUILabel()\r
+{\r
+ // Add Label to App\r
+ if (titleLabel == nullptr) {\r
+ titleLabel = new UILabel();\r
+ }\r
+ titleLabel->SetPosition(LABELS_X, LABELS_Y);\r
+ titleLabel->Resize(LABELS_W, LABELS_H);\r
+\r
+ // Set additional property\r
+ titleLabel->SetText("目标");\r
+ titleLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ titleLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ titleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABELS_FONT);\r
+\r
+ // Add to rootView\r
+ group->Add(titleLabel);\r
+}\r
+\r
+void TargetView::CreateUIList()\r
+{\r
+ UIView::OnClickListener *clickListener = (UIView::OnClickListener *)OHOS::TrainingPresenter::GetInstance();\r
+ if (clickListener == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "clickListener nullptr");\r
+ return;\r
+ }\r
+\r
+ // Add List to App\r
+ if (targetList == nullptr) {\r
+ targetList = new UIList();\r
+ }\r
+ targetList->SetPosition(LIST_X, LIST_Y);\r
+ targetList->Resize(LIST_W, LIST_H);\r
+ targetList->SetStyle(STYLE_BACKGROUND_COLOR, 0xff000000);\r
+\r
+ // Set additional property\r
+ if (listAdapter_ == nullptr) {\r
+ listAdapter_ = new TargetAdapter();\r
+ }\r
+ listAdapter_->SetItemClickListener(clickListener);\r
+ std::list<TargetItem> targetItemList(targets, targets + TRAINING_TARGET_MAX);\r
+ listAdapter_->SetData(targetItemList);\r
+\r
+ targetList->SetAdapter(listAdapter_);\r
+ targetList->RefreshList();\r
+\r
+ // Add to rootView\r
+ group->Add(targetList);\r
+}\r
+\r
+UIViewGroup *TargetView::InitShowUpView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TargetView InitShowUpView");\r
+ if (group == nullptr) {\r
+ group = new UIViewGroup();\r
+ if (group == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group new fail");\r
+ return nullptr;\r
+ }\r
+ group->SetPosition(0, 0);\r
+ group->SetWidth(HORIZONTAL_RESOLUTION);\r
+ group->SetHeight(VERTICAL_RESOLUTION);\r
+ }\r
+ CreateUILabel();\r
+ CreateUIList();\r
+ UIView::OnDragListener *trainingDragListener = (UIView::OnDragListener *)OHOS::TrainingPresenter::GetInstance();\r
+ if (trainingDragListener == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "trainingDragListener GetInstance fail");\r
+ return nullptr;\r
+ }\r
+ group->SetOnDragListener(trainingDragListener);\r
+ group->SetViewId(TARGET_VIEW_ID);\r
+ group->SetDraggable(true);\r
+ group->SetTouchable(true);\r
+ return group;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TrainingAdapter.cpp\r
+ * Author:\r
+ * Create: 2025-11-23\r
+ */\r
+#include "training/TrainingAdapter.h"\r
+#include "training/TrainingItemView.h"\r
+\r
+namespace OHOS {\r
+TrainingAdapter::TrainingAdapter() {}\r
+\r
+TrainingAdapter::~TrainingAdapter()\r
+{\r
+ listData_.clear();\r
+}\r
+\r
+uint16_t TrainingAdapter::GetCount(void)\r
+{\r
+ return listData_.size();\r
+}\r
+\r
+void TrainingAdapter::SetData(const std::list<TrainingItem> &data)\r
+{\r
+ if (!listData_.empty()) {\r
+ listData_.clear();\r
+ }\r
+ listData_ = data;\r
+}\r
+\r
+UIView *TrainingAdapter::GetView(UIView *inView, int16_t index)\r
+{\r
+ if (listData_.empty()) {\r
+ return nullptr;\r
+ }\r
+ if (index < 0) {\r
+ return nullptr;\r
+ }\r
+ size_t uindex = index;\r
+ if (uindex >= listData_.size()) {\r
+ return nullptr;\r
+ }\r
+\r
+ std::list<TrainingItem>::iterator it = listData_.begin();\r
+ for (int i = 0; i < index; i++) {\r
+ it++;\r
+ }\r
+ TrainingItem itemData = *it;\r
+ TrainingItemView *item = nullptr;\r
+ if (inView == nullptr) {\r
+ item = new TrainingItemView();\r
+ } else {\r
+ item = static_cast<TrainingItemView *>(inView);\r
+ }\r
+ item->SetItemInfo(itemData);\r
+ item->SetOnClickListener(itemClickListener);\r
+ return item;\r
+}\r
+\r
+void TrainingAdapter::AddListItem(const TrainingItem &item)\r
+{\r
+ listData_.push_back(item);\r
+}\r
+} // namespace OHOS\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: temperature\r
+ * Author:\r
+ * Create: 2025-02-15\r
+ */\r
+\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "ui_resource_image.h"\r
+#include "training/TrainingItemView.h"\r
+#include "screensetting/ScreenModels.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t ITEM_X = 0;\r
+static constexpr uint16_t ITEM_Y = 0;\r
+static constexpr uint16_t ITEM_W = 382;\r
+static constexpr uint16_t ITEM_H = 100;\r
+static constexpr uint16_t ICON_X = 0;\r
+static constexpr uint16_t ICON_Y = 0;\r
+static constexpr uint16_t LABEL_X = 100;\r
+static constexpr uint16_t LABEL_Y = 0;\r
+static constexpr uint16_t LABEL_W = 200;\r
+static constexpr uint16_t LABEL_H = 100;\r
+static constexpr uint16_t LABEL_FONT = 35;\r
+static constexpr uint16_t IMAGE_W = 300;\r
+static constexpr uint16_t IMAGE_H = 0;\r
+\r
+TrainingItemView::TrainingItemView()\r
+{\r
+ InitView();\r
+}\r
+\r
+TrainingItemView::~TrainingItemView()\r
+{\r
+ Remove(&sIcon);\r
+ Remove(&sLabel);\r
+ Remove(&sSettingImage);\r
+}\r
+\r
+bool TrainingItemView::InitView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingItemView::InitView");\r
+ SetPosition(ITEM_X, ITEM_Y, ITEM_W, ITEM_H);\r
+ SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ SetTouchable(true);\r
+\r
+ sIcon.SetPosition(ICON_X, ICON_Y);\r
+ sIcon.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
+\r
+ sLabel.SetPosition(LABEL_X, LABEL_Y);\r
+ sLabel.Resize(LABEL_W, LABEL_H);\r
+ sLabel.SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+ sLabel.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ sLabel.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ sLabel.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ sLabel.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ sLabel.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+\r
+ ScreenModels::GetInstance()->LoadAppImages(DROPDOWN_IAMGES, &sSettingImage, DROPDOWN_DROPDOWN_SETTING);\r
+ sSettingImage.SetPosition(IMAGE_W, IMAGE_H);\r
+ sSettingImage.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
+\r
+ Add(&sIcon);\r
+ Add(&sLabel);\r
+ Add(&sSettingImage);\r
+ return true;\r
+}\r
+\r
+void TrainingItemView::SetItemInfo(const TrainingItem itemInfo)\r
+{\r
+ sItemInfo = itemInfo;\r
+ sIcon.SetSrc(itemInfo.icon);\r
+ sLabel.SetText(itemInfo.label);\r
+ SetViewId(itemInfo.viewId);\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TrainingModel.cpp\r
+ * Author:\r
+ * Create: 2025-11-23\r
+ */\r
+\r
+#include "training/TrainingModel.h"\r
+\r
+namespace OHOS {\r
+TrainingModel::TrainingModel() {}\r
+\r
+TrainingModel::~TrainingModel() {}\r
+\r
+TrainingModel &TrainingModel::GetInstance()\r
+{\r
+ static TrainingModel instance;\r
+ return instance;\r
+}\r
+\r
+void TrainingModel::SetCurView(int16_t viewNum)\r
+{\r
+ curView_ = viewNum;\r
+}\r
+\r
+int16_t TrainingModel::GetCurView(void)\r
+{\r
+ return curView_;\r
+}\r
+\r
+void TrainingModel::SetCurTrainingType(int8_t trainingType)\r
+{\r
+ trainingType_ = trainingType;\r
+}\r
+\r
+int8_t TrainingModel::GetCurTrainingType(void)\r
+{\r
+ return trainingType_;\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: SettingPresenter.cpp\r
+ * Author:\r
+ * Create: 2025-11-23\r
+ */\r
+\r
+#include "training/TrainingModel.h"\r
+#include "training/TrainingPresenter.h"\r
+#include "NativeRegisterManager.h"\r
+namespace OHOS {\r
+\r
+REGIST_MENU(VIEW_TRAINING, TrainingView, TrainingPresenter, PNG_APPLIST_WALK_IMAGE, PNG_APPLIST_DEFAULT_IMG,\r
+ "体能训练");\r
+\r
+static TrainingPresenter *g_trainingPresenter = nullptr;\r
+TrainingPresenter::TrainingPresenter()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingPresenter::TrainingPresenter");\r
+ trainingModel_ = &TrainingModel::GetInstance();\r
+ g_trainingPresenter = this;\r
+}\r
+\r
+TrainingPresenter::~TrainingPresenter()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingPresenter::~TrainingPresenter");\r
+ g_trainingPresenter = nullptr;\r
+}\r
+\r
+TrainingPresenter *TrainingPresenter::GetInstance(void)\r
+{\r
+ return g_trainingPresenter;\r
+}\r
+\r
+void TrainingPresenter::OnResume(void)\r
+{\r
+ Presenter<TrainingView>::OnResume();\r
+}\r
+\r
+void TrainingPresenter::OnPause(void)\r
+{\r
+ Presenter<TrainingView>::OnPause();\r
+ return;\r
+}\r
+\r
+void TrainingPresenter::ClickStartButton(void)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingPresenter::OnClick ClickStartButton");\r
+ view_->ChangeView(TRAINING_VIEW_PREPARE, TRAINING_VIEW_DATA);\r
+ DataView::GetInstance()->UpdateDataViewByType();\r
+}\r
+\r
+void TrainingPresenter::ClickCountineButton(void)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingPresenter::OnClick ClickCountineButton");\r
+ view_->ChangeView(TRAINING_VIEW_PAUSE, TRAINING_VIEW_DATA);\r
+ DataView::GetInstance()->UpdateDataViewByType();\r
+}\r
+\r
+void TrainingPresenter::ClickFinishButton(void)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingPresenter::OnClick ClickFinishButton");\r
+ view_->ChangeView(TRAINING_VIEW_PAUSE, TRAINING_VIEW_PROMPT);\r
+}\r
+\r
+void TrainingPresenter::ClickCancelButton(void)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingPresenter::OnClick ClickCancelButton");\r
+ view_->ChangeView(TRAINING_VIEW_PROMPT, TRAINING_VIEW_PAUSE);\r
+}\r
+\r
+void TrainingPresenter::ClickConfirmButton(void)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingPresenter::OnClick ClickConfirmButton");\r
+ view_->ChangeView(TRAINING_VIEW_PROMPT, TRAINING_VIEW_MENU);\r
+}\r
+\r
+void TrainingPresenter::TrainingSetting(uint8_t trainingType)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingPresenter::OnClick TrainingSetting, type = %d", trainingType);\r
+ view_->ChangeView(TRAINING_VIEW_MENU, TRAINING_VIEW_SETTING);\r
+}\r
+\r
+void TrainingPresenter::StartTraining(uint8_t trainingType)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingPresenter::OnClick TrainingSetting, type = %d", trainingType);\r
+ view_->ChangeView(TRAINING_VIEW_MENU, TRAINING_VIEW_PREPARE);\r
+ trainingModel_->SetCurTrainingType(trainingType);\r
+ PrepareView::GetInstance()->UpdateViewByTrainingType(trainingType);\r
+}\r
+\r
+void TrainingPresenter::EnterTarget(void)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingPresenter::OnClick EnterTarget");\r
+ view_->ChangeView(TRAINING_VIEW_SETTING, TRAINING_VIEW_TARGET);\r
+}\r
+\r
+void TrainingPresenter::SettingTarget(uint8_t targetType)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingPresenter::OnClick SettingTarget, type = %d", targetType);\r
+ view_->ChangeView(TRAINING_VIEW_TARGET, TRAINING_VIEW_TARGET_SETTING);\r
+ TargetSettingView::GetInstance()->UpdateViewByTargetType(targetType);\r
+}\r
+\r
+void TrainingPresenter::ConfirmTargetSetting(void)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingPresenter::OnClick ConfirmTargetSetting");\r
+ view_->ChangeView(TRAINING_VIEW_TARGET_SETTING, TRAINING_VIEW_SETTING);\r
+}\r
+\r
+bool TrainingPresenter::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingPresent::OnClick view:%s", view.GetViewId());\r
+ bool isSettingClicked = event.GetCurrentPos().x > 350 ? true : false;\r
+ if (strcmp(view.GetViewId(), TRAINING_PREPARE_START_BUTTON) == 0) {\r
+ ClickStartButton();\r
+ } else if (strcmp(view.GetViewId(), TRAINING_PAUSE_CONTINUE_BUTTON) == 0) {\r
+ ClickCountineButton();\r
+ } else if (strcmp(view.GetViewId(), TRAINING_PAUSE_FINISH_BUTTON) == 0) {\r
+ ClickFinishButton();\r
+ } else if (strcmp(view.GetViewId(), TRAINING_PROMPT_CANCEL_BUTTON) == 0) {\r
+ ClickCancelButton();\r
+ } else if (strcmp(view.GetViewId(), TRAINING_PROMPT_CONFIRM_BUTTON) == 0) {\r
+ ClickConfirmButton();\r
+ } else if (strcmp(view.GetViewId(), TRAINING_SETTING_ITEM_TARGET) == 0) {\r
+ EnterTarget();\r
+ } else if (strcmp(view.GetViewId(), TRAINING_TARGET_ITEM_DISTANCE) == 0) {\r
+ SettingTarget(TRAINING_TARGET_DISTANCE);\r
+ } else if (strcmp(view.GetViewId(), TRAINING_TARGET_ITEM_TIME) == 0) {\r
+ SettingTarget(TRAINING_TARGET_TIME);\r
+ } else if (strcmp(view.GetViewId(), TRAINING_TARGET_ITEM_CALORIE) == 0) {\r
+ SettingTarget(TRAINING_TARGET_CALORIE);\r
+ } else if (strcmp(view.GetViewId(), TARGET_SETTING_CONFIRM_BUTTON) == 0) {\r
+ ConfirmTargetSetting();\r
+ } else if (strcmp(view.GetViewId(), TRAINING_ITEM_OUTDOOR_RUNNING) == 0) {\r
+ if (isSettingClicked) {\r
+ TrainingSetting(TRAINING_TYPE_OUTDOOR_RUNNING);\r
+ } else {\r
+ StartTraining(TRAINING_TYPE_OUTDOOR_RUNNING);\r
+ }\r
+ } else if (strcmp(view.GetViewId(), TRAINING_ITEM_INDOOR_RUNNING) == 0) {\r
+ if (isSettingClicked) {\r
+ TrainingSetting(TRAINING_TYPE_INDOOR_RUNNING);\r
+ } else {\r
+ StartTraining(TRAINING_TYPE_INDOOR_RUNNING);\r
+ }\r
+ } else if (strcmp(view.GetViewId(), TRAINING_ITEM_CYCLING) == 0) {\r
+ if (isSettingClicked) {\r
+ TrainingSetting(TRAINING_TYPE_CYCLING);\r
+ } else {\r
+ StartTraining(TRAINING_TYPE_CYCLING);\r
+ }\r
+ } else if (strcmp(view.GetViewId(), TRAINING_ITEM_CLIMBING) == 0) {\r
+ if (isSettingClicked) {\r
+ TrainingSetting(TRAINING_TYPE_CLIMBING);\r
+ } else {\r
+ StartTraining(TRAINING_TYPE_CLIMBING);\r
+ }\r
+ } else if (strcmp(view.GetViewId(), TRAINING_ITEM_INDOOR_SWIMMING) == 0) {\r
+ if (isSettingClicked) {\r
+ TrainingSetting(TRAINING_TYPE_INDOOR_SWIMMING);\r
+ } else {\r
+ StartTraining(TRAINING_TYPE_INDOOR_SWIMMING);\r
+ }\r
+ } else if (strcmp(view.GetViewId(), TRAINING_ITEM_OUTDOOR_SWIMMING) == 0) {\r
+ if (isSettingClicked) {\r
+ TrainingSetting(TRAINING_TYPE_OUTDOOR_SWIMMING);\r
+ } else {\r
+ StartTraining(TRAINING_TYPE_OUTDOOR_SWIMMING);\r
+ }\r
+ }\r
+ return true;\r
+}\r
+\r
+bool TrainingPresenter::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrainingOnDragListener::OnDrag");\r
+ if (event.GetDragDirection() == DragEvent::DIRECTION_RIGHT_TO_LEFT) {\r
+ if (strcmp(view.GetViewId(), MENU_VIEW_ID) == 0) {\r
+ // view_->ChangeView(TRAINING_VIEW_MENU, TRAINING_VIEW_PREPARE);\r
+ } else if (strcmp(view.GetViewId(), PREPARE_VIEW_ID) == 0) {\r
+ // view_->ChangeView(TRAINING_VIEW_PREPARE, TRAINING_VIEW_DATA);\r
+ // DataView::GetInstance()->UpdateDataViewByType();\r
+ } else if (strcmp(view.GetViewId(), DATA_VIEW_ID) == 0) {\r
+ view_->ChangeView(TRAINING_VIEW_DATA, TRAINING_VIEW_PAUSE);\r
+ } else if (strcmp(view.GetViewId(), PAUSE_VIEW_ID) == 0) {\r
+ // view_->ChangeView(TRAINING_VIEW_PAUSE, TRAINING_VIEW_PROMPT);\r
+ } else if (strcmp(view.GetViewId(), PROMPT_VIEW_ID) == 0) {\r
+ // view_->ChangeView(TRAINING_VIEW_PROMPT, TRAINING_VIEW_MENU);\r
+ }\r
+ } else if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {\r
+ if (strcmp(view.GetViewId(), MENU_VIEW_ID) == 0) {\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+ } else if (strcmp(view.GetViewId(), PREPARE_VIEW_ID) == 0) {\r
+ view_->ChangeView(TRAINING_VIEW_PREPARE, TRAINING_VIEW_MENU);\r
+ } else if (strcmp(view.GetViewId(), DATA_VIEW_ID) == 0) {\r
+ view_->ChangeView(TRAINING_VIEW_DATA, TRAINING_VIEW_PREPARE);\r
+ } else if (strcmp(view.GetViewId(), PAUSE_VIEW_ID) == 0) {\r
+ view_->ChangeView(TRAINING_VIEW_PAUSE, TRAINING_VIEW_DATA);\r
+ } else if (strcmp(view.GetViewId(), PROMPT_VIEW_ID) == 0) {\r
+ view_->ChangeView(TRAINING_VIEW_PROMPT, TRAINING_VIEW_PAUSE);\r
+ } else if (strcmp(view.GetViewId(), SETTING_VIEW_ID) == 0) {\r
+ view_->ChangeView(TRAINING_VIEW_SETTING, TRAINING_VIEW_MENU);\r
+ } else if (strcmp(view.GetViewId(), TARGET_VIEW_ID) == 0) {\r
+ view_->ChangeView(TRAINING_VIEW_TARGET, TRAINING_VIEW_SETTING);\r
+ } else if (strcmp(view.GetViewId(), TARGET_SETTING_VIEW_ID) == 0) {\r
+ view_->ChangeView(TRAINING_VIEW_TARGET_SETTING, TRAINING_VIEW_TARGET);\r
+ }\r
+ }\r
+ return false;\r
+}\r
+\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TrainingSettingAdapter.cpp\r
+ * Author:\r
+ * Create: 2025-11-23\r
+ */\r
+#include "training/TrainingSettingAdapter.h"\r
+#include "training/TrainingSettingItemView.h"\r
+\r
+namespace OHOS {\r
+TrainingSettingAdapter::TrainingSettingAdapter() {}\r
+\r
+TrainingSettingAdapter::~TrainingSettingAdapter()\r
+{\r
+ listData_.clear();\r
+}\r
+\r
+uint16_t TrainingSettingAdapter::GetCount(void)\r
+{\r
+ return listData_.size();\r
+}\r
+\r
+void TrainingSettingAdapter::SetData(const std::list<TrainingSettingItem> &data)\r
+{\r
+ if (!listData_.empty()) {\r
+ listData_.clear();\r
+ }\r
+ listData_ = data;\r
+}\r
+\r
+UIView *TrainingSettingAdapter::GetView(UIView *inView, int16_t index)\r
+{\r
+ if (listData_.empty()) {\r
+ return nullptr;\r
+ }\r
+ if (index < 0) {\r
+ return nullptr;\r
+ }\r
+ size_t uindex = index;\r
+ if (uindex >= listData_.size()) {\r
+ return nullptr;\r
+ }\r
+\r
+ std::list<TrainingSettingItem>::iterator it = listData_.begin();\r
+ for (int i = 0; i < index; i++) {\r
+ it++;\r
+ }\r
+ TrainingSettingItem itemData = *it;\r
+ TrainingSettingItemView *item = nullptr;\r
+ if (inView == nullptr) {\r
+ item = new TrainingSettingItemView();\r
+ } else {\r
+ item = static_cast<TrainingSettingItemView *>(inView);\r
+ }\r
+ item->SetItemInfo(itemData);\r
+ item->SetOnClickListener(itemClickListener);\r
+ return item;\r
+}\r
+\r
+void TrainingSettingAdapter::AddListItem(const TrainingSettingItem &item)\r
+{\r
+ listData_.push_back(item);\r
+}\r
+} // namespace OHOS\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TrainingSettingItemView.cpp\r
+ * Author:\r
+ * Create: 2025-02-15\r
+ */\r
+\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "training/TrainingSettingItemView.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t ITEM_X = 0;\r
+static constexpr uint16_t ITEM_Y = 0;\r
+static constexpr uint16_t ITEM_W = 382;\r
+static constexpr uint16_t ITEM_H = 100;\r
+static constexpr uint16_t ICON_X = 0;\r
+static constexpr uint16_t ICON_Y = 0;\r
+static constexpr uint16_t LABEL_X = 100;\r
+static constexpr uint16_t LABEL_Y = 0;\r
+static constexpr uint16_t LABEL_W = 200;\r
+static constexpr uint16_t LABEL_H = 100;\r
+static constexpr uint16_t LABEL_FONT = 35;\r
+static constexpr uint16_t IMAGE_W = 300;\r
+static constexpr uint16_t IMAGE_H = 0;\r
+\r
+TrainingSettingItemView::TrainingSettingItemView()\r
+{\r
+ InitView();\r
+}\r
+\r
+TrainingSettingItemView::~TrainingSettingItemView()\r
+{\r
+ Remove(&sIcon);\r
+ Remove(&sLabel);\r
+ Remove(&sNextImage);\r
+}\r
+\r
+bool TrainingSettingItemView::InitView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingSettingItemView::InitView");\r
+ SetPosition(ITEM_X, ITEM_Y, ITEM_W, ITEM_H);\r
+ SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ SetStyle(STYLE_BACKGROUND_OPA, UN_OPACITY);\r
+ SetTouchable(true);\r
+\r
+ sIcon.SetPosition(ICON_X, ICON_Y);\r
+ sIcon.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
+\r
+ sLabel.SetPosition(LABEL_X, LABEL_Y);\r
+ sLabel.Resize(LABEL_W, LABEL_H);\r
+ sLabel.SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT);\r
+ sLabel.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);\r
+ sLabel.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ sLabel.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ sLabel.SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ sLabel.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+\r
+ sNextImage.SetSrc(PNG_SETTING_NEXT_IMAGE);\r
+ sNextImage.SetPosition(IMAGE_W, IMAGE_H);\r
+ sNextImage.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);\r
+ Add(&sIcon);\r
+ Add(&sLabel);\r
+ Add(&sNextImage);\r
+ return true;\r
+}\r
+\r
+void TrainingSettingItemView::SetItemInfo(const TrainingSettingItem itemInfo)\r
+{\r
+ sItemInfo = itemInfo;\r
+ sIcon.SetSrc(itemInfo.icon);\r
+ sLabel.SetText(itemInfo.label);\r
+ SetViewId(itemInfo.viewId);\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TrainingSettingView\r
+ * Create: 2025-03-22\r
+ */\r
+#include "training/TrainingSettingView.h"\r
+#include "wearable_log.h"\r
+#include "UiConfig.h"\r
+#include "training/TrainingPresenter.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t LABELS_X = 133;\r
+static constexpr uint16_t LABELS_Y = 36;\r
+static constexpr uint16_t LABELS_W = 200;\r
+static constexpr uint16_t LABELS_H = 60;\r
+static constexpr uint16_t LABELS_FONT = 50;\r
+static constexpr uint16_t LIST_X = 42;\r
+static constexpr uint16_t LIST_Y = 95;\r
+static constexpr uint16_t LIST_W = 382;\r
+static constexpr uint16_t LIST_H = 305;\r
+\r
+static TrainingSettingView *g_pSettingView{nullptr};\r
+\r
+TrainingSettingView::TrainingSettingView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingSettingView::TrainingSettingView");\r
+ g_pSettingView = this;\r
+}\r
+\r
+TrainingSettingView::~TrainingSettingView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingSettingView::~TrainingSettingView");\r
+ if (group != nullptr) {\r
+ group->RemoveAll();\r
+ delete group;\r
+ group = nullptr;\r
+ }\r
+ if (titleLabel != nullptr) {\r
+ delete titleLabel;\r
+ titleLabel = nullptr;\r
+ }\r
+ if (settingList != nullptr) {\r
+ delete settingList;\r
+ settingList = nullptr;\r
+ }\r
+ if (listAdapter_ != nullptr) {\r
+ delete listAdapter_;\r
+ listAdapter_ = nullptr;\r
+ }\r
+ g_pSettingView = nullptr;\r
+}\r
+\r
+TrainingSettingView *TrainingSettingView::GetInstance()\r
+{\r
+ return g_pSettingView;\r
+}\r
+\r
+void TrainingSettingView::CreateUILabel()\r
+{\r
+ // Add Label to App\r
+ if (titleLabel == nullptr) {\r
+ titleLabel = new UILabel();\r
+ }\r
+ titleLabel->SetPosition(LABELS_X, LABELS_Y);\r
+ titleLabel->Resize(LABELS_W, LABELS_H);\r
+\r
+ // Set additional property\r
+ titleLabel->SetText("设置");\r
+ titleLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ titleLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ titleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABELS_FONT);\r
+\r
+ // Add to rootView\r
+ group->Add(titleLabel);\r
+}\r
+\r
+void TrainingSettingView::CreateUIList()\r
+{\r
+ UIView::OnClickListener *clickListener = (UIView::OnClickListener *)OHOS::TrainingPresenter::GetInstance();\r
+ if (clickListener == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "clickListener nullptr");\r
+ return;\r
+ }\r
+\r
+ // Add List to App\r
+ if (settingList == nullptr) {\r
+ settingList = new UIList();\r
+ }\r
+ settingList->SetPosition(LIST_X, LIST_Y);\r
+ settingList->Resize(LIST_W, LIST_H);\r
+ settingList->SetStyle(STYLE_BACKGROUND_COLOR, 0xff000000);\r
+\r
+ // Set additional property\r
+ if (listAdapter_ == nullptr) {\r
+ listAdapter_ = new TrainingSettingAdapter();\r
+ }\r
+ listAdapter_->SetItemClickListener(clickListener);\r
+ std::list<TrainingSettingItem> trainingSettingItemList(settings, settings + TRAINING_SETTING_MAX);\r
+ listAdapter_->SetData(trainingSettingItemList);\r
+\r
+ settingList->SetAdapter(listAdapter_);\r
+ settingList->RefreshList();\r
+\r
+ // Add to rootView\r
+ group->Add(settingList);\r
+}\r
+\r
+UIViewGroup *TrainingSettingView::InitShowUpView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingSettingView InitShowUpView");\r
+ if (group == nullptr) {\r
+ group = new UIViewGroup();\r
+ if (group == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group new fail");\r
+ return nullptr;\r
+ }\r
+ group->SetPosition(0, 0);\r
+ group->SetWidth(HORIZONTAL_RESOLUTION);\r
+ group->SetHeight(VERTICAL_RESOLUTION);\r
+ }\r
+ CreateUILabel();\r
+ CreateUIList();\r
+ UIView::OnDragListener *trainingDragListener = (UIView::OnDragListener *)OHOS::TrainingPresenter::GetInstance();\r
+ if (trainingDragListener == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "trainingDragListener GetInstance fail");\r
+ return nullptr;\r
+ }\r
+ group->SetOnDragListener(trainingDragListener);\r
+ group->SetViewId(SETTING_VIEW_ID);\r
+ group->SetDraggable(true);\r
+ group->SetTouchable(true);\r
+ return group;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TrainingView.cpp\r
+ * Author:\r
+ * Create: 2025-11-23\r
+ */\r
+\r
+#include "training/TrainingView.h"\r
+#include "training/TrainingPresenter.h"\r
+#include "wearable_log.h"\r
+\r
+namespace OHOS {\r
+static TrainingView *g_pTrainingView = nullptr;\r
+\r
+TrainingView::TrainingView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingView::TrainingView");\r
+ preProcessView[TRAINING_VIEW_MENU] = &TrainingView::ChangeMenuView;\r
+ preProcessView[TRAINING_VIEW_PREPARE] = &TrainingView::ChangePrepareView;\r
+ preProcessView[TRAINING_VIEW_DATA] = &TrainingView::ChangeDataView;\r
+ preProcessView[TRAINING_VIEW_PAUSE] = &TrainingView::ChangePauseView;\r
+ preProcessView[TRAINING_VIEW_PROMPT] = &TrainingView::ChangePromptView;\r
+ preProcessView[TRAINING_VIEW_SETTING] = &TrainingView::ChangeSettingView;\r
+ preProcessView[TRAINING_VIEW_TARGET] = &TrainingView::ChangeTargetView;\r
+ preProcessView[TRAINING_VIEW_TARGET_SETTING] = &TrainingView::ChangeTargetSettingView;\r
+ g_pTrainingView = this;\r
+}\r
+\r
+TrainingView::~TrainingView()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingView::~TrainingView");\r
+ g_pTrainingView = nullptr;\r
+}\r
+\r
+TrainingView *TrainingView::GetInstance()\r
+{\r
+ return g_pTrainingView;\r
+}\r
+\r
+void TrainingView::OnStart()\r
+{\r
+ ChangeView(TRAINING_VIEW_MAX, TRAINING_VIEW_MENU);\r
+}\r
+\r
+void TrainingView::OnStop()\r
+{\r
+ if (menuView != nullptr) {\r
+ delete menuView;\r
+ menuView = nullptr;\r
+ }\r
+ if (prepareView != nullptr) {\r
+ delete prepareView;\r
+ prepareView = nullptr;\r
+ }\r
+ if (dataView != nullptr) {\r
+ delete dataView;\r
+ dataView = nullptr;\r
+ }\r
+ if (pauseView != nullptr) {\r
+ delete pauseView;\r
+ pauseView = nullptr;\r
+ }\r
+ if (promptView != nullptr) {\r
+ delete promptView;\r
+ promptView = nullptr;\r
+ }\r
+ if (settingView != nullptr) {\r
+ delete settingView;\r
+ settingView = nullptr;\r
+ }\r
+ if (targetView != nullptr) {\r
+ delete targetView;\r
+ targetView = nullptr;\r
+ }\r
+ if (targetSettingView != nullptr) {\r
+ delete targetSettingView;\r
+ targetSettingView = nullptr;\r
+ }\r
+}\r
+\r
+bool TrainingView::ChangeMenuView(int16_t hideView, int16_t thisView)\r
+{\r
+ UNUSED(hideView);\r
+ if (container[thisView] == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeMenuView");\r
+ menuView = new MenuView();\r
+ if (menuView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrainingView new fail");\r
+ return false;\r
+ }\r
+ // init view\r
+ UIViewGroup *group = menuView->InitShowUpView();\r
+ if (group == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");\r
+ return false;\r
+ }\r
+ container[thisView] = group;\r
+ AddViewToRootContainer(container[thisView]);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool TrainingView::ChangePrepareView(int16_t hideView, int16_t thisView)\r
+{\r
+ UNUSED(hideView);\r
+ if (container[thisView] == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangePrepareView");\r
+ prepareView = new PrepareView();\r
+ if (prepareView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrainingView new fail");\r
+ return false;\r
+ }\r
+ // init view\r
+ UIViewGroup *group = prepareView->InitShowUpView();\r
+ if (group == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");\r
+ return false;\r
+ }\r
+ container[thisView] = group;\r
+ AddViewToRootContainer(container[thisView]);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool TrainingView::ChangeDataView(int16_t hideView, int16_t thisView)\r
+{\r
+ UNUSED(hideView);\r
+ if (container[thisView] == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeDataView");\r
+ dataView = new DataView();\r
+ if (dataView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrainingView new fail");\r
+ return false;\r
+ }\r
+ // init view\r
+ UIViewGroup *group = dataView->InitShowUpView();\r
+ if (group == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");\r
+ return false;\r
+ }\r
+ container[thisView] = group;\r
+ AddViewToRootContainer(container[thisView]);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool TrainingView::ChangePauseView(int16_t hideView, int16_t thisView)\r
+{\r
+ UNUSED(hideView);\r
+ if (container[thisView] == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangePauseView");\r
+ pauseView = new PauseView();\r
+ if (pauseView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrainingView new fail");\r
+ return false;\r
+ }\r
+ // init view\r
+ UIViewGroup *group = pauseView->InitShowUpView();\r
+ if (group == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");\r
+ return false;\r
+ }\r
+ container[thisView] = group;\r
+ AddViewToRootContainer(container[thisView]);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool TrainingView::ChangePromptView(int16_t hideView, int16_t thisView)\r
+{\r
+ UNUSED(hideView);\r
+ if (container[thisView] == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangePromptView");\r
+ promptView = new PromptView();\r
+ if (promptView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrainingView new fail");\r
+ return false;\r
+ }\r
+ // init view\r
+ UIViewGroup *group = promptView->InitShowUpView();\r
+ if (group == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");\r
+ return false;\r
+ }\r
+ container[thisView] = group;\r
+ AddViewToRootContainer(container[thisView]);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool TrainingView::ChangeSettingView(int16_t hideView, int16_t thisView)\r
+{\r
+ UNUSED(hideView);\r
+ if (container[thisView] == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeSettingView");\r
+ settingView = new TrainingSettingView();\r
+ if (settingView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrainingView new fail");\r
+ return false;\r
+ }\r
+ // init view\r
+ UIViewGroup *group = settingView->InitShowUpView();\r
+ if (group == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");\r
+ return false;\r
+ }\r
+ container[thisView] = group;\r
+ AddViewToRootContainer(container[thisView]);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool TrainingView::ChangeTargetView(int16_t hideView, int16_t thisView)\r
+{\r
+ UNUSED(hideView);\r
+ if (container[thisView] == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeTargetView");\r
+ targetView = new TargetView();\r
+ if (targetView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrainingView new fail");\r
+ return false;\r
+ }\r
+ // init view\r
+ UIViewGroup *group = targetView->InitShowUpView();\r
+ if (group == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");\r
+ return false;\r
+ }\r
+ container[thisView] = group;\r
+ AddViewToRootContainer(container[thisView]);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool TrainingView::ChangeTargetSettingView(int16_t hideView, int16_t thisView)\r
+{\r
+ UNUSED(hideView);\r
+ if (container[thisView] == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChangeTargetSettingView");\r
+ targetSettingView = new TargetSettingView();\r
+ if (targetSettingView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrainingView new fail");\r
+ return false;\r
+ }\r
+ // init view\r
+ UIViewGroup *group = targetSettingView->InitShowUpView();\r
+ if (group == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "group nullptr fail");\r
+ return false;\r
+ }\r
+ container[thisView] = group;\r
+ AddViewToRootContainer(container[thisView]);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool TrainingView::CheckViewParam(int16_t hideView, int16_t showView)\r
+{\r
+ if (showView < 0 || showView >= TRAINING_VIEW_MAX) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrainingView::CheckViewParam showView err.");\r
+ return false;\r
+ }\r
+\r
+ if (hideView < 0 || hideView > TRAINING_VIEW_MAX) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrainingView::CheckViewParam hideView err.");\r
+ return false;\r
+ }\r
+\r
+ return true;\r
+}\r
+\r
+void TrainingView::ChangeView(int16_t hideView, int16_t showView)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingView::ChangeView %d, %d", hideView, showView);\r
+\r
+ if (!CheckViewParam(hideView, showView)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrainingView::CheckViewParam failed.");\r
+ return;\r
+ }\r
+\r
+ PreprosssChangeView tmpPreProcessView = preProcessView[showView];\r
+\r
+ if (!(this->*tmpPreProcessView)(hideView, showView)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrainingView::ChangeView %d %dfailed", showView, hideView);\r
+ return;\r
+ }\r
+ if (hideView != TRAINING_VIEW_MAX) {\r
+ if (container[hideView] == nullptr) {\r
+ return;\r
+ }\r
+ container[hideView]->SetVisible(false);\r
+ }\r
+ container[showView]->SetVisible(true);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TrainingView:: ChangeView end!!!%d", showView);\r
+ Draw();\r
+}\r
+}\r
* Create: 2021-11-23
*/
-#include "UISampleModel.h"
+#include "uisample/UISampleModel.h"
namespace OHOS {
UISampleModel::UISampleModel() {}
* Create: 2021-11-23
*/
-#include "UISampleView.h"
-#include "UISampleModel.h"
-#include "UISamplePresenter.h"
-#include "ui_service.h"
+#include "uisample/UISampleView.h"
+#include "uisample/UISampleModel.h"
+#include "uisample/UISamplePresenter.h"
+#include "uiservice/ui_service.h"
#include "NativeRegisterManager.h"
namespace OHOS {
void UISamplePresenter::OnResume(void)
{
- Presenter<UISampleView>::OnResume();
SendMsgToUIService(UI_ADD_SLEEP_VETO, 0, nullptr, 0);
}
void UISamplePresenter::OnPause(void)
{
- Presenter<UISampleView>::OnPause();
SendMsgToUIService(UI_RM_SLEEP_VETO, 0, nullptr, 0);
return;
}
#include <string>
-#include "UISampleView.h"
-#include "UISamplePresenter.h"
+#include "uisample/UISampleView.h"
+#include "uisample/UISamplePresenter.h"
#include "ui_test_group.h"
namespace OHOS {
#include "components/ui_label_button.h"
#include "gfx_utils/list.h"
#include "ui_test.h"
-#include "UISampleView.h"
+#include "uisample/UISampleView.h"
#include "ui_test_group.h"
#include "wearable_log.h"
#include "ui_test_sphere_view/ui_test_sphere_view.h"
#include "ui_test_nested/ui_test_nested.h"
#include "ui_test_particle/ui_test_particle.h"
+#include "ui_test_lottie/ui_test_lottie.h"
namespace OHOS {
void UITestGroup::AddTestCase(TestCaseInfo testCaseInfo)
{
testCaseList_->PushBack(TestCaseInfo{"足球效果", new UITestIcosahedron()});
testCaseList_->PushBack(TestCaseInfo{"滑动冲突", new UITestNested()});
testCaseList_->PushBack(TestCaseInfo{"粒子效果", new UITestParticle()});
+ testCaseList_->PushBack(TestCaseInfo{"Lottie", new UITestLottie()});
}
List<TestCaseInfo>& UITestGroup::GetTestCase()
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: Breath Ease\r
+ * Author: wangle\r
+ * Create: 2025-4-23\r
+ */\r
+#include "uiservice/ui_language.h"\r
+#include "ui_resource_string.h"\r
+#include "font/font_global_manager.h"\r
+#include "nv.h"\r
+#include "wearable_log.h"\r
+\r
+#include "nv_config/include/key_id.h"\r
+#include "nv_config/include/common.h"\r
+#include "nv.h"\r
+\r
+namespace OHOS {\r
+static constexpr const char *BIN_LANG_EN = "/music/font/en.lang";\r
+static constexpr const char *BIN_LANG_ZH = "/music/font/zh.lang";\r
+\r
+const char* UILanguage::GetText(uint16_t textId)\r
+{\r
+ if (RegisterGlobalManager()) {\r
+ return FontGlobalManager::GetInstance()->GetText(textId);\r
+ }\r
+ return nullptr;\r
+}\r
+void UILanguage::SetLanguage(uint8_t id)\r
+{\r
+ sys_language_id_t lang_id = {.language_id = id};\r
+\r
+ errcode_t ret = uapi_nv_write(NV_ID_SYS_LANGUAGE_ID, (uint8_t*)&lang_id, sizeof(sys_language_id_t));\r
+ if (ret != ERRCODE_SUCC) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "nv set language id error, ret=%u", ret);\r
+ return;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "set language id = %u", lang_id.language_id);\r
+ UpdateLanguage();\r
+}\r
+void UILanguage::UpdateLanguage()\r
+{\r
+ sys_language_id_t lang_id = {0};\r
+ uint16_t nvsize = 0;\r
+\r
+ errcode_t ret = uapi_nv_read(NV_ID_SYS_LANGUAGE_ID, sizeof(sys_language_id_t), &nvsize, (uint8_t*)&lang_id);\r
+ if (ret != ERRCODE_SUCC) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "nv get language id error, ret=%u", ret);\r
+ return;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "language nvsize=%u id = %u", nvsize, lang_id.language_id);\r
+ if (RegisterGlobalManager()) {\r
+ if (lang_id.language_id<0 || lang_id.language_id > OHOS::LANGUAGE_ID_MAX) {\r
+ lang_id.language_id = OHOS::LANGUAGE_ID_ZH;\r
+ }\r
+ FontGlobalManager::GetInstance()->SetCurrentLangId(lang_id.language_id);\r
+ }\r
+}\r
+bool UILanguage::RegisterGlobalManager()\r
+{\r
+ static bool isRegister = false;\r
+ if (!isRegister) {\r
+ const char *resFiles[] = {BIN_LANG_ZH, BIN_LANG_EN};\r
+ if (!FontGlobalManager::GetInstance()->RegisterLanguageInfo(\r
+ resFiles, OHOS::LANGUAGE_ID_MAX, OHOS::LANGUAGE_ID_ZH)) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "register global manager error");\r
+ return isRegister;\r
+ }\r
+ isRegister = true;\r
+ }\r
+ return isRegister;\r
+}\r
+}
\ No newline at end of file
* limitations under the License.
*/
-#include "ui_service.h"
+#include "uiservice/ui_service.h"
#include "wearable_log.h"
#include "samgr_lite.h"
-#include "SettingModel.h"
-#include "UiServersMsg.h"
+#include "settings/SettingModel.h"
+#include "main/UiServersMsg.h"
#include "ohos_init.h"
#include "memory_adapter.h"
#include <cstdio>
#include "service_id_define.h"
#include "bundle_install_msg.h"
#include "graphic_service.h"
-#include "ApplistModel.h"
+#include "applist/ApplistModel.h"
#if defined(SUPPORT_POWER_MANAGER)
#include "power_display_service.h"
#endif
-#include "ui_screennotify.h"
-#include "HealthModel.h"
+#include "screennotify/ui_screennotify.h"
+#include "main/HealthModel.h"
#include "bts_br_gap.h"
#include "bts_le_gap.h"
+#include "uiservice/ui_language.h"
+
#include "errcode.h"
#include "pm_definition.h"
+#include "NativeAbility.h"
+#include "TransitionType.h"
+
extern "C" errcode_t uapi_pm_add_sleep_veto(pm_id_t veto_id);
extern "C" errcode_t uapi_pm_remove_sleep_veto(pm_id_t veto_id);
case CONNECT_NEW_PHONE:
ConnectNewPhone();
break;
+ case UI_UPDATE_LANGUAGE:
+ OHOS::UILanguage::UpdateLanguage();
+ break;
+ case UI_OTA_UPDATE:
+ power_display_svr_get_api()->turn_on_screen();
+ OHOS::NativeAbility::GetInstance().ChangeSlice(VIEW_SET_OTA,
+ OHOS::TransitionType::TRANSITION_INVALID, OHOS::gSliceDefaultPriority, true);
+ break;
}
}
#include <cstdio>
#include <iostream>
-#include "VideoCard.h"
+#include "videocard/VideoCard.h"
#include "NativeAbility.h"
#include "msg_center.h"
#include "securec.h"
-#include "DialBinParser.h"
-#include "ModelDialDataFactory.h"
+#include "main/DialBinParser.h"
+#include "main/dial/ModelDialDataFactory.h"
#include "common/low_power_manager.h"
#include "common/image_cache_manager.h"
#ifdef SUPPORT_OHOSFWK
-#include "ui_screennotify.h"
+#include "screennotify/ui_screennotify.h"
#endif
-#include "MainPresenterSample.h"
+#include "main/MainPresenterSample.h"
#include "common/graphic_utils.h"
namespace OHOS {
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherAdapter\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include "weather/WeatherAdapter.h"\r
+\r
+namespace OHOS {\r
+WeatherAdapter::WeatherAdapter() {}\r
+\r
+WeatherAdapter::~WeatherAdapter()\r
+{\r
+ listData.clear();\r
+}\r
+\r
+uint16_t WeatherAdapter::GetCount(void)\r
+{\r
+ return listData.size();\r
+}\r
+\r
+void WeatherAdapter::SetData(std::list<WeatherItem> &data)\r
+{\r
+ if (!listData.empty()) {\r
+ listData.clear();\r
+ }\r
+ std::list<WeatherItem>::iterator it;\r
+ for (it = data.begin(); it != data.end(); it++) {\r
+ listData.push_back(*it);\r
+ }\r
+}\r
+\r
+UIView *WeatherAdapter::GetView(UIView *inView, int16_t index)\r
+{\r
+ if (listData.empty()) {\r
+ return nullptr;\r
+ }\r
+ if (index < 0) {\r
+ return nullptr;\r
+ }\r
+ size_t uindex = index;\r
+ if (uindex >= listData.size()) {\r
+ return nullptr;\r
+ }\r
+\r
+ std::list<WeatherItem>::iterator it = listData.begin();\r
+ for (int i = 0; i < index; i++) {\r
+ it++;\r
+ }\r
+ WeatherItem itemData = *it;\r
+ WeatherItemView *item = nullptr;\r
+ if (inView == nullptr) {\r
+ item = new WeatherItemView();\r
+ } else {\r
+ item = static_cast<WeatherItemView *>(inView);\r
+ }\r
+\r
+ item->SetItemInfo(itemData);\r
+ item->SetOnClickListener(itemClickListener);\r
+ return item;\r
+}\r
+\r
+void WeatherAdapter::AddListItem(const WeatherItem &item)\r
+{\r
+ listData.push_back(item);\r
+}\r
+} // namespace OHOS\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherItemView\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include "wearable_log.h"\r
+#include "weather/WeatherItemView.h"\r
+#include "weather/WeatherModel.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t WEATHER_ICON_X = 155;\r
+static constexpr int16_t WEATHER_LABEL_X = 10;\r
+static constexpr int16_t WEATHER_LABEL2_X = 220;\r
+static constexpr int16_t WEATHER_CHARTLINE_X = 20;\r
+static constexpr int16_t WEATHER_CHARTLINE_Y = 78;\r
+static constexpr int16_t WEATHER_CHARTLINE_WIDTH = 450;\r
+static constexpr int16_t WEATHER_CHARTLINE_HEIGHT = 2;\r
+static constexpr int16_t WEATHER_ITEM_BUTTON_WIDTH = 390;\r
+static constexpr int16_t WEATHER_ITEM_BUTTON_HEIGHT = 83;\r
+static constexpr int16_t WEATHER_ITEM_LABEL_WIDTH = 155;\r
+static constexpr int16_t WEATHER_ITEM_LABEL_HEIGHT = 80;\r
+static constexpr int16_t WEATHER_ITEM_FONT_SIZE = 35;\r
+static constexpr int16_t WEATHER_IMAGE_SIZE = 300;\r
+static constexpr int16_t WEATHER_ICON_Y = 15;\r
+static constexpr int16_t NUMS_50 = 50;\r
+\r
+WeatherItemView::WeatherItemView()\r
+{\r
+ SetPosition(0, 0, WEATHER_ITEM_BUTTON_WIDTH, WEATHER_ITEM_BUTTON_HEIGHT);\r
+ SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ SetTouchable(true);\r
+ SetUpChild();\r
+\r
+ Add(&sNextImage);\r
+ Add(&sLabel_1);\r
+ Add(&sIcon);\r
+ Add(&sLabel_2);\r
+ Add(&chartLine);\r
+}\r
+\r
+WeatherItemView::~WeatherItemView()\r
+{\r
+ Remove(&sIcon);\r
+ Remove(&sLabel_1);\r
+ Remove(&sLabel_2);\r
+ Remove(&chartLine);\r
+}\r
+\r
+void WeatherItemView::SetItemInfo(const WeatherItem itemInfo)\r
+{\r
+ sItemInfo = itemInfo;\r
+ sLabel_1.SetText(itemInfo.label_1);\r
+ sIcon.SetSrc(itemInfo.icon);\r
+ sLabel_2.SetText(itemInfo.label_2);\r
+ chartLine.SetVisible(itemInfo.hasSecondMenu);\r
+}\r
+\r
+void WeatherItemView::SetUpChild()\r
+{\r
+ sNextImage.SetPosition(0, 0);\r
+ sNextImage.Resize(WEATHER_IMAGE_SIZE, WEATHER_IMAGE_SIZE);\r
+ bool index = WeatherModel::GetInstance().GetDayStatus();\r
+ ImageInfo *img = nullptr;\r
+ if (index) {\r
+ img = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_WEATHER71, WEATHER_IMAGE);\r
+ } else {\r
+ img = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_WEATHER72, WEATHER_IMAGE);\r
+ }\r
+ if (img == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::LoadOneInMultiRes fail");\r
+ }\r
+ sNextImage.SetSrc(img);\r
+\r
+ sLabel_1.SetPosition(WEATHER_LABEL_X, 0);\r
+ sLabel_1.Resize(WEATHER_ITEM_LABEL_WIDTH, WEATHER_ITEM_LABEL_HEIGHT);\r
+ sLabel_1.SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE);\r
+ sLabel_1.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ sLabel_1.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ sLabel_1.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ sLabel_1.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+\r
+ sIcon.SetPosition(WEATHER_ICON_X, WEATHER_ICON_Y);\r
+ sIcon.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ sLabel_2.SetPosition(WEATHER_LABEL2_X, 0);\r
+ sLabel_2.Resize(WEATHER_ITEM_LABEL_WIDTH, WEATHER_ITEM_LABEL_HEIGHT);\r
+ sLabel_2.SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE);\r
+ sLabel_2.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ sLabel_2.SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ sLabel_2.SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ sLabel_2.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ chartLine.SetPosition(WEATHER_CHARTLINE_X, WEATHER_CHARTLINE_Y, WEATHER_CHARTLINE_WIDTH, WEATHER_CHARTLINE_HEIGHT);\r
+ chartLine.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+}\r
+\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherMainPage\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include <string>\r
+#include "weather/WeatherMainPage.h"\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "weather/WeatherPresenter.h"\r
+#include "weather/WeatherModel.h"\r
+#include "ui_resource_weather.h"\r
+#include "common/image_cache_manager.h"\r
+#include "wearable_log.h"\r
+#include <sstream>\r
+#include <iomanip>\r
+\r
+static constexpr int16_t WEATHER_LABEL_SIZE_WIDTH_ONE = 250;\r
+static constexpr int16_t WEATHER_LABEL_SIZE_HEIGHT_ONE = 60;\r
+static constexpr int16_t WEATHER_LABEL_SIZE_WIDTH_FOUR = 210;\r
+static constexpr int16_t WEATHER_LABEL_SIZE_HEIGHT_FOUR = 40;\r
+static constexpr int16_t WEATHER_LABEL_SIZE_WIDTH_FIVE = 223;\r
+static constexpr int16_t WEATHER_LABEL_SIZE_HEIGHT_FIVE = 46;\r
+static constexpr int16_t WEATHER_LABEL_SIZE_WIDTH_SIX = 149;\r
+static constexpr int16_t WEATHER_LABEL_SIZE_HEIGHT_SIX = 20;\r
+static constexpr int16_t WEATHER_LABEL_FRONT_ONE = 40;\r
+static constexpr int16_t WEATHER_LABEL_FRONT_TWO = 24;\r
+static constexpr int16_t WEATHER_LABEL_FRONT_THREE = 36;\r
+static constexpr int16_t WEATHER_LABEL_FRONT_FOUR = 120;\r
+static constexpr int16_t WEATHER_LABEL_FRONT = 22;\r
+static constexpr int16_t WEATHER_AROUND_X = 74;\r
+static constexpr int16_t WEATHER_AROUND_Y = 323;\r
+static constexpr int16_t WEATHER_AROUND_WIDTH = 198;\r
+static constexpr int16_t WEATHER_AROUND_HEIGHT = 40;\r
+static constexpr int16_t WEATHER_CODE_POSITION_X = 267;\r
+static constexpr int16_t WEATHER_CODE_POSITION_Y = 268;\r
+static constexpr int16_t WEATHER_CODE_POSITION_WIDTH = 72;\r
+static constexpr int16_t WEATHER_CODE_POSITION_HEIGHT = 46;\r
+static constexpr int16_t WEATHER_TEMP_POSITION_X = 210;\r
+static constexpr int16_t WEATHER_TEMP_POSITION_Y = 130;\r
+static constexpr int16_t WEATHER_TEMP_WIDTH = 190;\r
+static constexpr int16_t WEATHER_TEMP_HEIGHT = 120;\r
+static constexpr int16_t WEATHER_IMAGE_WIDTH = 78;\r
+static constexpr int16_t WEATHER_IMAGE_HEIGHT = 115;\r
+static constexpr int16_t WEATHER_IMAGEAIR_X = 78;\r
+static constexpr int16_t WEATHER_IMAGEAIR_Y = 327;\r
+static constexpr int16_t WEATHER_IMAGEAIR_DATA = 40;\r
+static constexpr int16_t WEATHER_IMAGEHUMIDITY_X = 336;\r
+static constexpr int16_t WEATHER_IMAGEHUMIDITY_Y = 327;\r
+static constexpr int16_t WEATHER_LABLEAIR_DATA = 79;\r
+static constexpr int16_t WEATHER_LABLEAIR_HEIGHT = 30;\r
+static constexpr int16_t WEATHER_IMAGEHUMIDITY_DATA = 120;\r
+static constexpr int16_t WEATHER_IMG_X = 71;\r
+static constexpr int16_t WEATHER_IMAGEPAGEKEY_X = 199;\r
+static constexpr int16_t WEATHER_IMAGEPAGEKEY_Y = 429;\r
+static constexpr int16_t WEATHER_IMAGEPAGEKEY_WIDTH = 56;\r
+static constexpr int16_t WEATHER_IMAGEPAGEKEY_HEIGHT = 10;\r
+static constexpr int16_t WEATHER_LABELTITLE_POSITION_X = 63;\r
+static constexpr int16_t WEATHER_LABELTITLE_POSITION_Y = 100;\r
+static constexpr int16_t WEATHER_LABELTITLE_WIDTH = 400;\r
+static constexpr int16_t WEATHER_ADDRESS_X = 143;\r
+static constexpr int16_t WEATHER_ADDRESS_Y = 49;\r
+\r
+const char *weatherNames[] = {"晴", "多云", "阴", "阵雨", "雷阵雨", "雷阵雨伴有冰雹", "雨夹雪",\r
+ "小雨", "中雨", "大雨", "暴雨", "大暴雨", "特大暴雨", "阵雪",\r
+ "小雪", "中雪", "大雪", "暴雪", "雾", "冻雨", "沙尘暴",\r
+ "小到中雨", "中到大雨", "大到暴雨", "小到中雪", "中到大雪", "大到暴雪", "浮尘",\r
+ "扬沙", "强沙尘暴", "霾", "无天气数据"};\r
+\r
+namespace OHOS {\r
+REGIST_SLICE_PAGE(VIEW_WEATHER, WEATHER_PAGES::WEATHER_MAIN_PAGE, WeatherMainPage, true);\r
+\r
+WeatherMainPage::WeatherMainPage()\r
+{\r
+ weatherModel = &WeatherModel::GetInstance();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::WeatherMainPage");\r
+}\r
+\r
+WeatherMainPage::~WeatherMainPage()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::~WeatherMainPage");\r
+ if (group != nullptr) {\r
+ group->RemoveAll();\r
+ delete group;\r
+ group = nullptr;\r
+ }\r
+\r
+ if (weatherImg != nullptr) {\r
+ delete weatherImg;\r
+ weatherImg = nullptr;\r
+ }\r
+\r
+ if (mainImg != nullptr) {\r
+ delete mainImg;\r
+ mainImg = nullptr;\r
+ }\r
+\r
+ if (aroundImg != nullptr) {\r
+ delete aroundImg;\r
+ aroundImg = nullptr;\r
+ }\r
+\r
+ if (ImageAir != nullptr) {\r
+ delete ImageAir;\r
+ ImageAir = nullptr;\r
+ }\r
+\r
+ if (ImageHumidity != nullptr) {\r
+ delete ImageHumidity;\r
+ ImageHumidity = nullptr;\r
+ }\r
+\r
+ if (ImagePageKey != nullptr) {\r
+ delete ImagePageKey;\r
+ ImagePageKey = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(WEATHER_IMAGE);\r
+}\r
+\r
+void WeatherMainPage::OnStart(void *data)\r
+{\r
+ group = new UIViewGroup();\r
+ if (group == nullptr) {\r
+ return;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::InitPageFirst successful");\r
+ group->SetPosition(0, 0);\r
+ group->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);\r
+ group->SetOnDragListener(this);\r
+ group->SetViewId("weather");\r
+ group->SetDraggable(true);\r
+ group->SetTouchable(true);\r
+ flag = weatherModel->InitWeatherItem();\r
+ cur = weatherModel->GetCurWeather();\r
+ mainImg = new UIImageView();\r
+ if (mainImg == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::mainImg new image fail");\r
+ return;\r
+ }\r
+ mainImg->SetPosition(0, 0);\r
+ mainImg->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ group->Add(mainImg);\r
+ InitWeatherImage();\r
+ InitImage();\r
+ InitLabel();\r
+ if (!flag) {\r
+ labelTitle = new UILabel();\r
+ if (labelTitle == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::labelTitle new label fail");\r
+ return;\r
+ }\r
+ labelTitle->SetText("天气未更新,请连接手机更新数据");\r
+ labelTitle->SetPosition(WEATHER_LABELTITLE_POSITION_X, WEATHER_LABELTITLE_POSITION_Y, WEATHER_LABELTITLE_WIDTH,\r
+ WEATHER_LABEL_SIZE_HEIGHT_ONE);\r
+ labelTitle->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT);\r
+ group->Add(labelTitle);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::InitWeatherItem fail");\r
+ }\r
+ AddViewToPageContainer(group);\r
+}\r
+\r
+void WeatherMainPage::InitImage()\r
+{\r
+ aroundImg = new UIImageView();\r
+ if (aroundImg == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::aroundImage new image fail");\r
+ return;\r
+ }\r
+ aroundImg->SetPosition(WEATHER_AROUND_X, WEATHER_AROUND_Y);\r
+ if (weatherModel->GetDayStatus()) {\r
+ LOADIMG::LoadImageViewImg(mainImg, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER64);\r
+ LOADIMG::LoadImageViewImg(aroundImg, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER75);\r
+ } else {\r
+ LOADIMG::LoadImageViewImg(mainImg, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER65);\r
+ LOADIMG::LoadImageViewImg(aroundImg, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER76);\r
+ }\r
+ ImageAir = new UIImageView();\r
+ if (ImageAir == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::ImageAir new image fail");\r
+ return;\r
+ }\r
+ ImageAir->SetPosition(WEATHER_IMAGEAIR_X, WEATHER_IMAGEAIR_Y);\r
+ ImageAir->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ LOADIMG::LoadImageViewImg(ImageAir, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER69);\r
+ ImageHumidity = new UIImageView();\r
+ if (ImageHumidity == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::ImageHumidity new image fail");\r
+ return;\r
+ }\r
+ ImageHumidity->SetPosition(WEATHER_IMAGEHUMIDITY_X, WEATHER_IMAGEHUMIDITY_Y);\r
+ ImageHumidity->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ LOADIMG::LoadImageViewImg(ImageHumidity, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER70);\r
+ ImagePageKey = new UIImageView();\r
+ if (ImagePageKey == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::ImagePageKey new image fail");\r
+ return;\r
+ }\r
+ ImagePageKey->SetPosition(WEATHER_IMAGEPAGEKEY_X, WEATHER_IMAGEPAGEKEY_Y);\r
+ ImagePageKey->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ LOADIMG::LoadImageViewImg(ImagePageKey, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER66);\r
+ group->Add(aroundImg);\r
+ group->Add(ImageAir);\r
+ group->Add(ImageHumidity);\r
+ group->Add(ImagePageKey);\r
+}\r
+\r
+void WeatherMainPage::InitWeatherImage()\r
+{\r
+ addressImg = new UIImageView();\r
+ if (addressImg == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::img new image fail");\r
+ return;\r
+ }\r
+ addressImg->SetPosition(WEATHER_ADDRESS_X, WEATHER_ADDRESS_Y);\r
+ addressImg->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ curWeather_code = std::atoi(cur.weather_code);\r
+ LOADIMG::LoadImageViewImg(addressImg, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER77);\r
+\r
+ weatherImg = new UIImageView();\r
+ if (weatherImg == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::img new image fail");\r
+ return;\r
+ }\r
+ weatherImg->SetPosition(WEATHER_IMG_X, WEATHER_TEMP_POSITION_Y);\r
+ weatherImg->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ curWeather_code = std::atoi(cur.weather_code);\r
+ LOADIMG::LoadImageViewImg(weatherImg, WEATHER_IMAGE, bigWeatherImage[curWeather_code]);\r
+ group->Add(addressImg);\r
+ group->Add(weatherImg);\r
+}\r
+\r
+\r
+void WeatherMainPage::InitLabel()\r
+{\r
+ int posX[LABEL_COUNT] = {140, 113, 120, 222, 100, 210};\r
+ int posY[LABEL_COUNT] = {34, 274, 332, 332, 376, 130};\r
+ for (int i = 0; i < LABEL_COUNT; i++) {\r
+ title[i] = new UILabel();\r
+ if (title[i] == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::InitPageFirst new label:%d fail", i);\r
+ return;\r
+ }\r
+ if (i == SET_ZERO) {\r
+ title[i]->SetText(cur.address);\r
+ title[i]->SetPosition(posX[i], posY[i], WEATHER_LABEL_SIZE_WIDTH_ONE, WEATHER_LABEL_SIZE_HEIGHT_ONE);\r
+ title[i]->SetAlign(TEXT_ALIGNMENT_LEFT);\r
+ title[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_ONE);\r
+ } else if (i == SET_ONE) {\r
+ std::ostringstream oss;\r
+ oss << cur.max_degree << "° / " << cur.min_degree << "° " << weatherNames[curWeather_code];\r
+ std::string weatherTemp = oss.str();\r
+ title[i]->SetText(weatherTemp.c_str());\r
+ title[i]->SetPosition(posX[i], posY[i], WEATHER_LABEL_SIZE_WIDTH_FIVE, WEATHER_LABEL_SIZE_HEIGHT_FIVE);\r
+ title[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_THREE);\r
+ } else if (i == SET_TWO) {\r
+ std::ostringstream oss;\r
+ oss << "空气 -";\r
+ std::string weatherHumidity = oss.str();\r
+ title[i]->SetText(weatherHumidity.c_str());\r
+ title[i]->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ title[i]->SetPosition(posX[i], posY[i], WEATHER_LABLEAIR_DATA, WEATHER_LABLEAIR_HEIGHT);\r
+ title[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_TWO);\r
+ } else if (i == SET_THREE) {\r
+ std::ostringstream oss;\r
+ oss << "湿度" << cur.humidity <<"%";\r
+ std::string weatherHumidity = oss.str();\r
+ title[i]->SetText(weatherHumidity.c_str());\r
+ title[i]->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ title[i]->SetPosition(posX[i], posY[i], WEATHER_IMAGEHUMIDITY_DATA, WEATHER_LABLEAIR_HEIGHT);\r
+ title[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_TWO);\r
+ } else if (i == SET_FOUR) {\r
+ std::ostringstream oss;\r
+ std::string updateTime = FormatTime(flag, cur.updateTime);\r
+ oss << "上次更新时间 " << updateTime;\r
+ updateTime = oss.str();\r
+ title[i]->SetText(updateTime.c_str());\r
+ title[i]->SetPosition(posX[i], posY[i], WEATHER_LABEL_SIZE_WIDTH_ONE, WEATHER_LABEL_SIZE_HEIGHT_FOUR);\r
+ title[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_TWO);\r
+ } else if (i == SET_FIVE) {\r
+ std::ostringstream oss;\r
+ oss << cur.degree << "°";\r
+ std::string weatherTemp = oss.str();\r
+ title[i]->SetText(weatherTemp.c_str());\r
+ title[i]->SetPosition(posX[i], posY[i], WEATHER_TEMP_WIDTH, WEATHER_TEMP_HEIGHT);\r
+ title[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABEL_FRONT_FOUR);\r
+ }\r
+ title[i]->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ group->Add(title[i]);\r
+ }\r
+}\r
+\r
+std::string WeatherMainPage::FormatTime(bool falg, const std::string &inputStr)\r
+{\r
+ if (!flag) {\r
+ return "--";\r
+ }\r
+ tm inputTm = {};\r
+ std::istringstream iss(inputStr);\r
+ iss >> std::get_time(&inputTm, "%Y%m%d%H%M");\r
+ time_t inputTime = mktime(&inputTm);\r
+ time_t now = time(nullptr);\r
+ tm *nowTm = localtime(&now);\r
+ if (inputTm.tm_year == nowTm->tm_year && inputTm.tm_mon == nowTm->tm_mon && inputTm.tm_mday == nowTm->tm_mday) {\r
+ char buffer[6];\r
+ strftime(buffer, sizeof(buffer), "%H:%M", &inputTm);\r
+ return std::string(buffer);\r
+ } else {\r
+ char buffer[6];\r
+ strftime(buffer, sizeof(buffer), "%m/%d", &inputTm);\r
+ return std::string(buffer);\r
+ }\r
+}\r
+\r
+bool WeatherMainPage::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPresenter::OnDrag ChangeSlice(VIEW_APPLIST)");\r
+ } else if (event.GetDragDirection() == DragEvent::DIRECTION_RIGHT_TO_LEFT) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_SECOND_PAGE, nullptr,\r
+ TransitionType::TRANSITION_INVALID, true);\r
+ }\r
+ return false;\r
+}\r
+\r
+bool WeatherMainPage::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UNUSED(event);\r
+ return true;\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherModel\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include "weather/WeatherModel.h"\r
+#include "weather/WeatherPresenter.h"\r
+#include "wearable_log.h"\r
+#include "ui_resource_weather.h"\r
+#ifdef BUILD_IN_LINUX\r
+#include "localtime.h"\r
+#endif\r
+\r
+namespace OHOS {\r
+\r
+WeatherModel::WeatherModel() {}\r
+\r
+WeatherModel::~WeatherModel() {}\r
+\r
+WeatherModel &WeatherModel::GetInstance()\r
+{\r
+ static WeatherModel instance;\r
+ return instance;\r
+}\r
+\r
+uint8_t WeatherModel::GetWeatherListNum()\r
+{\r
+ return usedLen;\r
+}\r
+\r
+WeatherItem *WeatherModel::GetWeatherlistItems()\r
+{\r
+ if (weather[0].label_1 == nullptr) {\r
+ ImageInfo *imgSrc =\r
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_WEATHER47, WEATHER_IMAGE);\r
+ weather[SET_ZERO] = {"今天", imgSrc, "16°/26°", true};\r
+ weather[SET_ONE] = {"明天", imgSrc, "18°/28°", false};\r
+ weather[SET_TWO] = {"后天", imgSrc, "17°/27°", false};\r
+ weather[SET_THREE] = {"周四", imgSrc, "15°/24°", false};\r
+ weather[SET_FOUR] = {"周五", imgSrc, "14°/22°", false};\r
+ weather[SET_FIVE] = {"周六", imgSrc, "16°/25°", false};\r
+ weather[SET_SIX] = {"周日", imgSrc, "19°/29°", false};\r
+ usedLen = SET_SEVEN;\r
+ }\r
+ return weather;\r
+}\r
+\r
+CurWeather WeatherModel::GetCurWeather()\r
+{\r
+ if (curWeather.min_degree == nullptr) {\r
+ curWeather.min_degree = "10";\r
+ curWeather.max_degree = "25";\r
+ curWeather.address = "北京市";\r
+ curWeather.weather_code = "02";\r
+ curWeather.degree = "18";\r
+ curWeather.updateTime = "2023-11-15 14:30:00 20";\r
+ curWeather.humidity = "90";\r
+ curWeather.sunSet = "17:30";\r
+ curWeather.sunRise = "06:45";\r
+ }\r
+ return curWeather;\r
+}\r
+\r
+std::vector<HourWeather> WeatherModel::GetHourWeather()\r
+{\r
+ if (houWeather.size() < WEATHER_COUNT) {\r
+ HourWeather weatherData[] = {\r
+ {"00:00", "18", "04"}, {"01:00", "17", "06"}, {"02:00", "17", "06"}, {"03:00", "16", "06"},\r
+ {"04:00", "16", "07"}, {"05:00", "15", "07"}, {"06:00", "16", "08"}, {"07:00", "17", "08"},\r
+ {"08:00", "18", "04"}, {"09:00", "20", "04"}, {"10:00", "22", "04"}, {"11:00", "24", "04"},\r
+ {"12:00", "25", "04"}, {"13:00", "26", "04"}, {"14:00", "26", "04"}, {"15:00", "25", "06"},\r
+ {"16:00", "24", "06"}, {"17:00", "23", "06"}, {"18:00", "22", "06"}, {"19:00", "21", "07"},\r
+ {"20:00", "20", "07"}, {"21:00", "19", "10"}, {"22:00", "18", "10"}, {"23:00", "18", "10"}};\r
+ for (const auto &item : weatherData) {\r
+ houWeather.push_back(item);\r
+ }\r
+ }\r
+ return houWeather;\r
+}\r
+\r
+bool WeatherModel::InitWeatherItem()\r
+{\r
+ std::ifstream file("/user/app/user/ace/data/com.vendor.Weather/weather.json");\r
+ if (!file.is_open()) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "no file");\r
+ return false;\r
+ }\r
+ std::stringstream buffer;\r
+ buffer << file.rdbuf();\r
+ std::string content = buffer.str();\r
+ int intsize = sizeof(content);\r
+ cJSON *root = nullptr;\r
+ // 解析JSON字符串\r
+ if (intsize != 0) {\r
+ root = cJSON_Parse(content.c_str());\r
+ }\r
+ if (root == NULL) {\r
+ // 如果解析失败,输出错误信息\r
+ const char *error_ptr;\r
+ return false;\r
+ }\r
+ // 访问JSON数据\r
+ bool updateMsg = InitVecObserve(root);\r
+ if (updateMsg) {\r
+ InitVecForecast(root);\r
+ InitVecRise(root);\r
+ InitVecWeek(root);\r
+ InitVecAddress(root);\r
+ InitFirstPageData();\r
+ InitSecondPageData();\r
+ InitThirdPageData();\r
+ } else {\r
+ cJSON_Delete(root);\r
+ return false;\r
+ }\r
+ cJSON_Delete(root);\r
+ return true;\r
+}\r
+\r
+void WeatherModel::InitFirstPageData()\r
+{\r
+ curWeather = {0};\r
+ static std::string sunset;\r
+ static std::string sunrise;\r
+ if (map_observe.find("min_degree") != map_observe.end()) {\r
+ curWeather.min_degree = map_observe["min_degree"].c_str();\r
+ }\r
+ if (map_observe.find("max_degree") != map_observe.end()) {\r
+ curWeather.max_degree = map_observe["max_degree"].c_str();\r
+ }\r
+ if (map_observe.find("degree") != map_observe.end()) {\r
+ curWeather.degree = map_observe["degree"].c_str();\r
+ }\r
+ if (map_observe.find("weather_code") != map_observe.end()) {\r
+ curWeather.weather_code = map_observe["weather_code"].c_str();\r
+ }\r
+ if (map_observe.find("update_time") != map_observe.end()) {\r
+ curWeather.updateTime = map_observe["update_time"].c_str();\r
+ }\r
+ if (map_observe.find("humidity") != map_observe.end()) {\r
+ curWeather.humidity = map_observe["humidity"].c_str();\r
+ }\r
+ if (map_address.find("city") != map_address.end()) {\r
+ curWeather.address = map_address["city"].c_str();\r
+ }\r
+ if (map_address.find("address") != map_address.end()) {\r
+ curWeather.address = map_address["address"].c_str();\r
+ }\r
+}\r
+\r
+void WeatherModel::InitSecondPageData()\r
+{\r
+ houWeather.clear();\r
+ static std::string dayTime[WEATHER_COUNT];\r
+ static std::string dayTemp[WEATHER_COUNT];\r
+ static std::string dayWeather[WEATHER_COUNT];\r
+\r
+ for (const auto &item : vec_forecast_1h) {\r
+ const std::string name = std::get<0>(item);\r
+ const std::string category = std::get<1>(item);\r
+ const int id = std::get<SET_TWO>(item);\r
+ HourWeather sample = {nullptr};\r
+ if (name == "update_time") {\r
+ dayTime[id] = category;\r
+ } else if (name == "degree") {\r
+ dayTemp[id] = category;\r
+ } else if (name == "weather_code") {\r
+ dayWeather[id] = category;\r
+ }\r
+ }\r
+ for (int i = 0; i < WEATHER_COUNT; i++) {\r
+ HourWeather sample = {nullptr};\r
+ sample.hour = dayTime[i].c_str();\r
+ sample.degree = dayTemp[i].c_str();\r
+ sample.weather = dayWeather[i].c_str();\r
+ houWeather.push_back(sample);\r
+ }\r
+}\r
+\r
+void WeatherModel::InitThirdPageData()\r
+{\r
+ static std::string strTmp[SET_EIGHT];\r
+ static std::string minTemp[SET_EIGHT];\r
+ static std::string maxTemp[SET_EIGHT];\r
+ static std::string currentWeek[SET_EIGHT];\r
+ static int weatherValue[SET_EIGHT];\r
+ for (const auto &item : vec_forecast_24h) {\r
+ const std::string name = std::get<0>(item);\r
+ const std::string category = std::get<1>(item);\r
+ const int id = std::get<SET_TWO>(item);\r
+ if (name == "current_week") {\r
+ if (id == SET_ZERO) {\r
+ currentWeek[id] = "今天";\r
+ } else if (id == SET_ONE) {\r
+ currentWeek[id] = "明天";\r
+ } else if (id == SET_TWO) {\r
+ currentWeek[id] = "后天";\r
+ } else {\r
+ currentWeek[id] = category;\r
+ }\r
+ } else if (name == "min_degree") {\r
+ minTemp[id] = category;\r
+ } else if (name == "max_degree") {\r
+ maxTemp[id] = category;\r
+ } else if (name == "day_weather_code") {\r
+ weatherValue[id] = std::atoi(category.c_str());\r
+ }\r
+ }\r
+ for (int i = 0; i < SET_SEVEN; i++) {\r
+ strTmp[i] = maxTemp[i] + "°/" + minTemp[i] + "°";\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherModel::InitWeatherItem:%s", strTmp[i].c_str());\r
+ }\r
+ // 只显示七天的天气\r
+ for (int i = 0; i < SET_SEVEN; i++) {\r
+ int weatherIndex = weatherValue[i];\r
+ ImageInfo *imgSrc =\r
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(smallWeatherImage[weatherIndex], WEATHER_IMAGE);\r
+ weather[i] = {currentWeek[i].c_str(), imgSrc, strTmp[i].c_str(), true};\r
+ }\r
+ usedLen = SET_SEVEN;\r
+}\r
+\r
+bool WeatherModel::InitVecForecast(cJSON *root)\r
+{\r
+ vec_forecast_1h.clear();\r
+ // 获取 forecast_1h 对象\r
+ cJSON *forecast_1h = cJSON_GetObjectItemCaseSensitive(root, "forecast_1h");\r
+ if (!cJSON_IsObject(forecast_1h)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error forecast_1h:");\r
+ cJSON_Delete(root);\r
+ return false;\r
+ }\r
+ for (int i = 0; i < WEATHER_COUNT; i++) {\r
+ cJSON *forecast_1h_num = cJSON_GetObjectItemCaseSensitive(forecast_1h, std::to_string(i).c_str());\r
+ if (!cJSON_IsObject(forecast_1h_num)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error forecast_1h_num:%d", i);\r
+ continue; // 跳过当前循环,继续处理下一个\r
+ }\r
+ std::string str = cJSON_GetObjectItemCaseSensitive(forecast_1h_num, "update_time")->valuestring;\r
+ std::string hour = str.substr(SET_TWELVE, SET_TWO);\r
+ // 确保字符串长度至少为12\r
+ if (str.length() >= WEATHER_HOUR) {\r
+ // 提取小时部分\r
+ hour = str.substr(SET_EIGHT, SET_TWO) + ":00";\r
+ } else {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error forecast_1h:");\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error forecast_1h hour size error");\r
+ hour = "00:00";\r
+ }\r
+ vec_forecast_1h.push_back(std::make_tuple("update_time", hour, i));\r
+ vec_forecast_1h.push_back(\r
+ std::make_tuple("degree", cJSON_GetObjectItemCaseSensitive(forecast_1h_num, "degree")->valuestring, i));\r
+ vec_forecast_1h.push_back(std::make_tuple(\r
+ "weather_code", cJSON_GetObjectItemCaseSensitive(forecast_1h_num, "weather_code")->valuestring, i));\r
+ }\r
+ return true;\r
+}\r
+\r
+bool WeatherModel::InitVecObserve(cJSON *root)\r
+{\r
+ map_observe.clear();\r
+ // 获取 observe 对象\r
+ cJSON *observe = cJSON_GetObjectItemCaseSensitive(root, "observe");\r
+ if (!cJSON_IsObject(observe)) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error observe:");\r
+ cJSON_Delete(root);\r
+ return false;\r
+ }\r
+ map_observe.insert(std::make_pair("weather", cJSON_GetObjectItemCaseSensitive(observe, "weather")->valuestring));\r
+ map_observe.insert(std::make_pair("degree", cJSON_GetObjectItemCaseSensitive(observe, "degree")->valuestring));\r
+ map_observe.insert(std::make_pair("humidity", cJSON_GetObjectItemCaseSensitive(observe, "humidity")->valuestring));\r
+ map_observe.insert(\r
+ std::make_pair("min_degree", cJSON_GetObjectItemCaseSensitive(observe, "min_degree")->valuestring));\r
+ map_observe.insert(\r
+ std::make_pair("max_degree", cJSON_GetObjectItemCaseSensitive(observe, "max_degree")->valuestring));\r
+ map_observe.insert(\r
+ std::make_pair("update_time", cJSON_GetObjectItemCaseSensitive(observe, "update_time")->valuestring));\r
+ map_observe.insert(\r
+ std::make_pair("weather_code", cJSON_GetObjectItemCaseSensitive(observe, "weather_code")->valuestring));\r
+ return true;\r
+}\r
+\r
+bool WeatherModel::InitVecRise(cJSON *root)\r
+{\r
+ // 获取 rise 对象\r
+ vec_rise.clear();\r
+ cJSON *rise = cJSON_GetObjectItemCaseSensitive(root, "rise");\r
+ if (!cJSON_IsObject(rise)) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error rise:");\r
+ cJSON_Delete(root);\r
+ return false;\r
+ }\r
+ for (int i = 0; i < SET_FOURTEEN; i++) {\r
+ cJSON *rise_num = cJSON_GetObjectItemCaseSensitive(rise, std::to_string(i).c_str());\r
+ if (!cJSON_IsObject(rise_num)) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error rise:%d", i);\r
+ continue; // 跳过当前循环,继续处理下一个\r
+ }\r
+ std::string sunSet = cJSON_GetObjectItemCaseSensitive(rise_num, "sunset")->valuestring;\r
+ std::string sunRise = cJSON_GetObjectItemCaseSensitive(rise_num, "sunrise")->valuestring;\r
+ SetDayStatus(sunRise, sunSet);\r
+ }\r
+ return true;\r
+}\r
+\r
+bool WeatherModel::InitVecWeek(cJSON *root)\r
+{\r
+ vec_forecast_24h.clear();\r
+ cJSON *forecast_24h = cJSON_GetObjectItemCaseSensitive(root, "forecast_24h");\r
+ if (!cJSON_IsObject(forecast_24h)) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error forecast_24h:");\r
+ cJSON_Delete(root);\r
+ return false;\r
+ }\r
+ for (int i = 0; i < SET_TEN; i++) {\r
+ cJSON *forecast_24h_num = cJSON_GetObjectItemCaseSensitive(forecast_24h, std::to_string(i).c_str());\r
+ if (!cJSON_IsObject(forecast_24h_num)) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error forecast_24h_num:%d", i);\r
+ continue;\r
+ }\r
+ std::istringstream iss(cJSON_GetObjectItemCaseSensitive(forecast_24h_num, "time")->valuestring);\r
+ char dash1;\r
+ char dash2;\r
+ int year = 0;\r
+ int month = 0;\r
+ int day = 0;\r
+ const int start_year = START_YEAR;\r
+ if ((iss >> year >> dash1 >> month >> dash2 >> day) && (dash1 == '-') && (dash2 == '-')) {\r
+ std::tm timeinfo = {};\r
+ timeinfo.tm_year = year - start_year;\r
+ timeinfo.tm_mon = month - 1;\r
+ timeinfo.tm_mday = day;\r
+ timeinfo.tm_hour = 0;\r
+ timeinfo.tm_min = 0;\r
+ timeinfo.tm_sec = 0;\r
+ timeinfo.tm_isdst = -1;\r
+ std::time_t timestamp = mktime(&timeinfo);\r
+ if (timestamp == -1) {\r
+ return false;\r
+ }\r
+ std::tm localTimeInfo;\r
+#ifdef _WIN32\r
+ if (localtime_s(&localTimeInfo, ×tamp) != 0) {\r
+#else\r
+ if (localtime_r(×tamp, &localTimeInfo) == nullptr) {\r
+#endif\r
+ return false;\r
+ }\r
+ const char *current_weeks[] = {"周日", "周一", "周二", "周三", "周四", "周五", "周六"};\r
+ vec_forecast_24h.push_back(std::make_tuple("current_week", current_weeks[localTimeInfo.tm_wday], i));\r
+ vec_forecast_24h.push_back(std::make_tuple(\r
+ "min_degree", cJSON_GetObjectItemCaseSensitive(forecast_24h_num, "min_degree")->valuestring, i));\r
+ vec_forecast_24h.push_back(std::make_tuple(\r
+ "max_degree", cJSON_GetObjectItemCaseSensitive(forecast_24h_num, "max_degree")->valuestring, i));\r
+ vec_forecast_24h.push_back(std::make_tuple(\r
+ "day_weather_code", cJSON_GetObjectItemCaseSensitive(forecast_24h_num, "day_weather_code")->valuestring,\r
+ i));\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "day_weather_code:%s ",\r
+ cJSON_GetObjectItemCaseSensitive(forecast_24h_num, "day_weather_code")->valuestring);\r
+ } else {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error Date");\r
+ }\r
+ }\r
+ return true;\r
+}\r
+\r
+bool WeatherModel::InitVecAddress(cJSON *root)\r
+{\r
+ map_address.clear();\r
+ cJSON *address = cJSON_GetObjectItemCaseSensitive(root, "address");\r
+ if (!cJSON_IsObject(address)) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error address:");\r
+ cJSON_Delete(root);\r
+ return false;\r
+ }\r
+ map_address.insert(std::make_pair("province", cJSON_GetObjectItemCaseSensitive(address, "province")->valuestring));\r
+ map_address.insert(std::make_pair("city", cJSON_GetObjectItemCaseSensitive(address, "city")->valuestring));\r
+ map_address.insert(std::make_pair("county", cJSON_GetObjectItemCaseSensitive(address, "county")->valuestring));\r
+ return true;\r
+}\r
+\r
+void WeatherModel::SetDayStatus(const std::string &timeRise, const std::string &timeSet)\r
+{\r
+#ifdef _WIN32\r
+ struct timeval tv;\r
+ gettimeofday(&tv, NULL);\r
+#else\r
+ struct timeval64 tv;\r
+ gettimeofday64(&tv, NULL);\r
+#endif\r
+ uint64_t second = tv.tv_sec;\r
+ uint64_t minute = second / MIN_TO_HOUR;\r
+ uint64_t hour = minute / MIN_TO_HOUR;\r
+ uint8_t realHour = static_cast<uint8_t>(hour % HOURLY_SYSTEM);\r
+ uint8_t realMinute = static_cast<uint8_t>(minute % MIN_TO_HOUR);\r
+ int currentTime = realHour * MIN_TO_HOUR + realMinute;\r
+ int hours = (timeRise[SET_ZERO] - '0') * SET_TEN + (timeRise[SET_ONE] - '0');\r
+ int minutes = (timeRise[SET_THREE] - '0') * SET_TEN + (timeRise[SET_FOUR] - '0');\r
+ int rise = hours * MIN_TO_HOUR + minutes;\r
+ hours = (timeSet[SET_ZERO] - '0') * SET_TEN + (timeSet[SET_ONE] - '0');\r
+ minutes = (timeSet[SET_THREE] - '0') * SET_TEN + (timeSet[SET_FOUR] - '0');\r
+ int set = hours * MIN_TO_HOUR + minutes;\r
+ isDay = (currentTime >= rise && currentTime < set) ? true : false;\r
+}\r
+\r
+bool WeatherModel::GetDayStatus()\r
+{\r
+ return isDay;\r
+}\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageSecond\r
+ * Create: 2025-03-15\r
+ */\r
+\r
+#include "weather/WeatherPageSecond.h"\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "weather/WeatherPresenter.h"\r
+#include "weather/WeatherView.h"\r
+#include "weather/WeatherModel.h"\r
+#include "ui_resource_weather.h"\r
+#include "common/image_cache_manager.h"\r
+#include "wearable_log.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t WEATHER_TITLE_WIDTH = 51;\r
+static constexpr uint16_t WEATHER_TITLE_HEIGHT = 26;\r
+static constexpr uint16_t WEATHER_TOPLABEL_X = 156;\r
+static constexpr uint16_t WEATHER_TOPLABEL_Y = 22;\r
+static constexpr uint16_t WEATHER_TOPLABEL_WIDTH = 150;\r
+static constexpr uint16_t WEATHER_TOPLABEL_HEIGHT = 60;\r
+static constexpr uint16_t WEATHER_TOPLABEL_FRONT = 26;\r
+static constexpr uint16_t WEATHER_LABELTIME_FRONT = 20;\r
+static constexpr uint16_t WEATHER_LABELTIME_FRONT_TWO = 24;\r
+static constexpr int16_t WEATHER_IMAGEPAGEKEY_X = 199;\r
+static constexpr int16_t WEATHER_IMAGEPAGEKEY_Y = 429;\r
+static constexpr int16_t WEATHER_IMAGEPAGEKEY_WIDTH = 56;\r
+static constexpr int16_t WEATHER_IMAGEPAGEKEY_HEIGHT = 10;\r
+static constexpr uint16_t ANIMATOR_TIME = 50;\r
+\r
+REGIST_SLICE_PAGE(VIEW_WEATHER, WEATHER_PAGES::WEATHER_SECOND_PAGE, WeatherPageSecond, false);\r
+\r
+WeatherPageSecond::WeatherPageSecond()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageSecond::WeatherPageSecond");\r
+ weatherModel = &WeatherModel::GetInstance();\r
+}\r
+\r
+WeatherPageSecond::~WeatherPageSecond()\r
+{\r
+ if (weatherSwipeGroup != nullptr) {\r
+ weatherSwipeGroup->RemoveAll();\r
+ delete weatherSwipeGroup;\r
+ weatherSwipeGroup = nullptr;\r
+ }\r
+\r
+ for (int i = 0; i < SET_THREE; ++i) {\r
+ if (swipeGroup[i] != nullptr) {\r
+ swipeGroup[i]->RemoveAll();\r
+ delete swipeGroup[i];\r
+ swipeGroup[i] = nullptr;\r
+ }\r
+ }\r
+\r
+ for (int i = 0; i < SET_EIGHT; ++i) {\r
+ if (imgBack[i] != nullptr) {\r
+ delete imgBack[i];\r
+ imgBack[i] = nullptr;\r
+ }\r
+ }\r
+\r
+ for (int i = 0; i < SET_EIGHT; ++i) {\r
+ if (labelTime[i] != nullptr) {\r
+ delete labelTime[i];\r
+ labelTime[i] = nullptr;\r
+ }\r
+ }\r
+\r
+ for (int i = 0; i < SET_EIGHT; ++i) {\r
+ if (labelTemp[i] != nullptr) {\r
+ delete labelTemp[i];\r
+ labelTemp[i] = nullptr;\r
+ }\r
+ }\r
+\r
+ for (int i = 0; i < SET_EIGHT; ++i) {\r
+ if (imgWeather[i] != nullptr) {\r
+ delete imgWeather[i];\r
+ imgWeather[i] = nullptr;\r
+ }\r
+ }\r
+ if (mainImg != nullptr) {\r
+ delete mainImg;\r
+ mainImg = nullptr;\r
+ }\r
+ if (ImagePageKey != nullptr) {\r
+ delete ImagePageKey;\r
+ ImagePageKey = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(WEATHER_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageSecond::~WeatherPageSecond");\r
+}\r
+\r
+void WeatherPageSecond::OnStart(void *data)\r
+{\r
+ weatherSwipeGroup = new UISwipeView(UISwipeView::VERTICAL);\r
+ if (weatherSwipeGroup == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "weatherSwipeGroup new fail");\r
+ return;\r
+ }\r
+ weatherSwipeGroup->SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ weatherSwipeGroup->SetViewId("weatherSwipeGroup");\r
+ weatherSwipeGroup->SetOnDragListener(this);\r
+ weatherSwipeGroup->SetOnSwipeListener(this);\r
+ weatherSwipeGroup->SetDraggable(true);\r
+ weatherSwipeGroup->SetTouchable(true);\r
+ weatherSwipeGroup->SetAnimatorTime(ANIMATOR_TIME);\r
+ for (int i = 0; i < SET_THREE; i++) {\r
+ swipeGroup[i] = new UIViewGroup();\r
+ if (swipeGroup[i] == nullptr) {\r
+ return;\r
+ }\r
+ WeatherInit(swipeGroup[i]);\r
+ weatherSwipeGroup->Add(swipeGroup[i]);\r
+ }\r
+\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::InitPageFirst successful");\r
+ AddViewToPageContainer(weatherSwipeGroup);\r
+}\r
+\r
+void WeatherPageSecond::WeatherInit(UIViewGroup *group)\r
+{\r
+ group->SetPosition(0, 0);\r
+ group->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);\r
+ group->SetOnDragListener(this);\r
+ group->SetViewId("weather");\r
+ group->SetDraggable(true);\r
+ group->SetTouchable(true);\r
+ mainImg = new UIImageView();\r
+ mainImg->SetPosition(0, 0);\r
+ mainImg->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ ImageInfo *imgSrc =\r
+ ImageCacheManager::GetInstance().LoadOneInMultiRes(IMAGE_CONVERTER_TOOL_WEATHER65, WEATHER_IMAGE);\r
+ if (imgSrc == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherMainPage::LoadOneInMultiRes fail");\r
+ }\r
+ if (weatherModel->GetDayStatus()) {\r
+ LOADIMG::LoadImageViewImg(mainImg, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER64);\r
+ } else {\r
+ LOADIMG::LoadImageViewImg(mainImg, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER65);\r
+ }\r
+ group->Add(mainImg);\r
+ houWeather = weatherModel->GetHourWeather();\r
+ ImagePageKey = new UIImageView();\r
+ if (ImagePageKey == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::ImagePageKey new image fail");\r
+ return;\r
+ }\r
+ ImagePageKey->SetPosition(WEATHER_IMAGEPAGEKEY_X, WEATHER_IMAGEPAGEKEY_Y, WEATHER_IMAGEPAGEKEY_WIDTH,\r
+ WEATHER_IMAGEPAGEKEY_HEIGHT);\r
+ ImagePageKey->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ LOADIMG::LoadImageViewImg(ImagePageKey, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER67);\r
+ group->Add(ImagePageKey);\r
+ int count = index * SET_EIGHT;\r
+ index++;\r
+ InitImage(group, count);\r
+ InitLabel(group, count);\r
+ return;\r
+}\r
+\r
+void WeatherPageSecond::InitImage(UIViewGroup *group, int count)\r
+{\r
+ int weatherPosX[SET_EIGHT] = {67, 161, 257, 351, 67, 161, 257, 351};\r
+ int weatherPosY[SET_EIGHT] = {125, 125, 125, 125, 289, 289, 289, 289};\r
+ int backPosX[SET_EIGHT] = {47, 141, 235, 329, 47, 141, 235, 329};\r
+ int backPosY[SET_EIGHT] = {71, 71, 71, 71, 235, 235, 235, 235};\r
+ for (int i = 0; i < SET_EIGHT; i++) {\r
+ imgBack[i] = new UIImageView();\r
+ if (imgBack[i] == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageSecond::InitPageSecond new UIImageView fail");\r
+ return;\r
+ }\r
+ imgBack[i]->SetPosition(backPosX[i], backPosY[i]);\r
+ if (weatherModel->GetDayStatus()) {\r
+ LOADIMG::LoadImageViewImg(imgBack[i], WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER73);\r
+ } else {\r
+ LOADIMG::LoadImageViewImg(imgBack[i], WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER74);\r
+ }\r
+\r
+ imgWeather[i] = new UIImageView();\r
+ if (imgWeather[i] == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageSecond::InitPageSecond new labelTime fail");\r
+ return;\r
+ }\r
+ imgWeather[i]->SetPosition(weatherPosX[i], weatherPosY[i]);\r
+ int curWeather_code = std::atoi(houWeather[count + i].weather);\r
+ LOADIMG::LoadImageViewImg(imgWeather[i], WEATHER_IMAGE, smallWeatherImage[curWeather_code]);\r
+ group->Add(imgBack[i]);\r
+ group->Add(imgWeather[i]);\r
+ }\r
+}\r
+\r
+void WeatherPageSecond::InitLabel(UIViewGroup *group, int count)\r
+{\r
+ int timePosX[SET_EIGHT] = {67, 161, 255, 349, 67, 161, 255, 349};\r
+ int timePosY[SET_EIGHT] = {91, 91, 91, 91, 255, 255, 255, 255};\r
+ int tempPosX[SET_EIGHT] = {75, 169, 263, 356, 75, 169, 263, 356};\r
+ int tempPosY[SET_EIGHT] = {175, 175, 175, 175, 339, 339, 339, 339};\r
+ UILabel *topLabel = new UILabel();\r
+ if (topLabel == nullptr) {\r
+ return;\r
+ }\r
+ topLabel->SetText("24小时预报");\r
+ topLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_TOPLABEL_FRONT);\r
+ topLabel->SetPosition(WEATHER_TOPLABEL_X, WEATHER_TOPLABEL_Y, WEATHER_TOPLABEL_WIDTH, WEATHER_TOPLABEL_HEIGHT);\r
+ group->Add(topLabel);\r
+ for (int i = 0; i < SET_EIGHT; i++) {\r
+ labelTemp[i] = new UILabel();\r
+ if (labelTemp[i] == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageSecond::InitPageSecond new labelTemp fail");\r
+ return;\r
+ }\r
+ std::ostringstream oss;\r
+ oss << houWeather[count + i].degree << "°";\r
+ std::string temp = oss.str();\r
+ labelTemp[i]->SetText(temp.c_str());\r
+ labelTemp[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABELTIME_FRONT_TWO);\r
+ labelTemp[i]->SetPosition(tempPosX[i], tempPosY[i], WEATHER_TITLE_WIDTH, WEATHER_TITLE_HEIGHT);\r
+\r
+ labelTime[i] = new UILabel();\r
+ if (labelTime[i] == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageSecond::InitPageSecond new labelTime fail");\r
+ return;\r
+ }\r
+ std::string strHour = houWeather[count + i].hour;\r
+ labelTime[i]->SetText(strHour.c_str());\r
+ labelTime[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_LABELTIME_FRONT);\r
+ labelTime[i]->SetPosition(timePosX[i], timePosY[i], WEATHER_TITLE_WIDTH, WEATHER_TITLE_HEIGHT);\r
+ group->Add(labelTemp[i]);\r
+ group->Add(labelTime[i]);\r
+ }\r
+}\r
+\r
+bool WeatherPageSecond::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_MAIN_PAGE, nullptr,\r
+ TransitionType::TRANSITION_INVALID, true);\r
+ } else if (event.GetDragDirection() == DragEvent::DIRECTION_RIGHT_TO_LEFT) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_THIRD_PAGE, nullptr,\r
+ TransitionType::TRANSITION_INVALID, true);\r
+ }\r
+ return false;\r
+}\r
+\r
+void WeatherPageSecond::OnSwipe(UISwipeView &view)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TempPresenter::OnSwipe ");\r
+ UNUSED(view);\r
+ return;\r
+}\r
+\r
+bool WeatherPageSecond::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UNUSED(event);\r
+ return true;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPageThird\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include "weather/WeatherPageThird.h"\r
+#include "components/ui_list_nested.h"\r
+#include "components/ui_scroll_view_nested.h"\r
+#include "NativeAbility.h"\r
+#include "SlicePageFactory.h"\r
+#include "weather/WeatherPresenter.h"\r
+#include "weather/WeatherView.h"\r
+#include "weather/WeatherModel.h"\r
+#include "ui_resource_weather.h"\r
+#include "common/image_cache_manager.h"\r
+#include "wearable_log.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint8_t WEATHER_ITEM_FONT_SIZE = 25;\r
+static constexpr int16_t WEATHER_RESIZE_SIZE_WIDTH = 200;\r
+static constexpr int16_t WEATHER_RESIZE_SIZE_HEIGHT = 50;\r
+static constexpr int16_t WEATHER_TITLE_POSITION_X = 130;\r
+static constexpr int16_t WEATHER_LIST_POSITION_X = 32;\r
+static constexpr int16_t WEATHER_LIST_POSITION_Y = 70;\r
+static constexpr int16_t WEATHER_LIST_WIDTH = 390;\r
+static constexpr int16_t WEATHER_LIST_HEIGHT = 318;\r
+static constexpr int16_t WEATHER_LIST_SELECT_POSITION = 80;\r
+static constexpr int16_t LIST_POS = 20;\r
+static constexpr int16_t WEATHER_LABEL_FRONT_ONE = 20;\r
+static constexpr int16_t WEATHER_LABEL_FRONT = 40;\r
+static constexpr int16_t WEATHER_IMAGEPAGEKEY_X = 199;\r
+static constexpr int16_t WEATHER_IMAGEPAGEKEY_Y = 429;\r
+static constexpr int16_t WEATHER_IMAGEPAGEKEY_WIDTH = 56;\r
+static constexpr int16_t WEATHER_IMAGEPAGEKEY_HEIGHT = 10;\r
+\r
+REGIST_SLICE_PAGE(VIEW_WEATHER, WEATHER_PAGES::WEATHER_THIRD_PAGE, WeatherPageThird, false);\r
+\r
+WeatherPageThird::WeatherPageThird()\r
+{\r
+ weatherModel = &WeatherModel::GetInstance();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageThird::WeatherPageThird");\r
+}\r
+\r
+WeatherPageThird::~WeatherPageThird()\r
+{\r
+ if (group != nullptr) {\r
+ group->RemoveAll();\r
+ delete group;\r
+ group = nullptr;\r
+ }\r
+\r
+ if (contentList != nullptr) {\r
+ delete contentList;\r
+ contentList = nullptr;\r
+ }\r
+\r
+ if (title != nullptr) {\r
+ delete title;\r
+ title = nullptr;\r
+ }\r
+\r
+ if (listAdapter != nullptr) {\r
+ delete listAdapter;\r
+ listAdapter = nullptr;\r
+ }\r
+\r
+ if (mainImg != nullptr) {\r
+ delete mainImg;\r
+ mainImg = nullptr;\r
+ }\r
+\r
+ if (ImagePageKey != nullptr) {\r
+ delete ImagePageKey;\r
+ ImagePageKey = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(WEATHER_IMAGE);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageThird::~WeatherPageThird");\r
+}\r
+\r
+void WeatherPageThird::OnStart(void *data)\r
+{\r
+ group = new UIViewGroup();\r
+ if (group == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherView::OnStart::group is nullptr");\r
+ return;\r
+ }\r
+ group->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+ group->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ group->SetOnDragListener(this);\r
+\r
+ title = new UILabel();\r
+ if (title == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherView::OnStart::title is nullptr");\r
+ return;\r
+ }\r
+ title->SetPosition(WEATHER_TITLE_POSITION_X, WEATHER_LABEL_FRONT_ONE);\r
+ title->SetText("7日天气预报");\r
+ title->Resize(WEATHER_RESIZE_SIZE_WIDTH, WEATHER_RESIZE_SIZE_HEIGHT);\r
+ title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, WEATHER_ITEM_FONT_SIZE);\r
+ title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ title->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE);\r
+ title->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ title->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+\r
+ mainImg = new UIImageView();\r
+ mainImg->SetPosition(0, 0);\r
+ mainImg->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ if (weatherModel->GetDayStatus()) {\r
+ LOADIMG::LoadImageViewImg(mainImg, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER64);\r
+ } else {\r
+ LOADIMG::LoadImageViewImg(mainImg, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER65);\r
+ }\r
+ InitScrollView();\r
+ InitScrollData();\r
+ AddViewToPageContainer(group);\r
+}\r
+\r
+void WeatherPageThird::InitScrollView()\r
+{\r
+ contentList = new UIList();\r
+ if (contentList == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherView::OnStart::contentList is nullptr");\r
+ return;\r
+ }\r
+\r
+ contentList->SetPosition(WEATHER_LIST_POSITION_X, WEATHER_LIST_POSITION_Y);\r
+ contentList->Resize(WEATHER_LIST_WIDTH, WEATHER_LIST_HEIGHT);\r
+ contentList->SetSelectPosition(WEATHER_LIST_SELECT_POSITION);\r
+ contentList->SetDraggable(true);\r
+ contentList->SetThrowDrag(true);\r
+ contentList->EnableAutoAlign(true);\r
+ contentList->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ contentList->SetElastic(true);\r
+ ImagePageKey = new UIImageView();\r
+ if (ImagePageKey == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherPageFirst::ImagePageKey new image fail");\r
+ return;\r
+ }\r
+ ImagePageKey->SetPosition(WEATHER_IMAGEPAGEKEY_X, WEATHER_IMAGEPAGEKEY_Y, WEATHER_IMAGEPAGEKEY_WIDTH,\r
+ WEATHER_IMAGEPAGEKEY_HEIGHT);\r
+ ImagePageKey->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ LOADIMG::LoadImageViewImg(ImagePageKey, WEATHER_IMAGE, IMAGE_CONVERTER_TOOL_WEATHER68);\r
+ group->Add(mainImg);\r
+ group->Add(title);\r
+ group->Add(contentList);\r
+ group->Add(ImagePageKey);\r
+}\r
+\r
+bool WeatherPageThird::InitScrollData()\r
+{\r
+ const WeatherItem *itemInfo = weatherModel->GetWeatherlistItems();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherView::InitWeatherItem %s", itemInfo);\r
+ RefreshWeathersList(itemInfo, weatherModel->GetWeatherListNum());\r
+ return true;\r
+}\r
+\r
+void WeatherPageThird::RefreshWeathersList(const WeatherItem *item, uint8_t count)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherView::OnStart::listAdapter");\r
+ listAdapter = new WeatherAdapter();\r
+ if (listAdapter == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherView::OnStart::listAdapter is nullptr");\r
+ return;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherView::RefreshWeathersList");\r
+ if (item == nullptr) {\r
+ return;\r
+ } else {\r
+ for (int i = 0; i < count; i++) {\r
+ listAdapter->AddListItem(item[i]);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherView::RefreshWeathersList %d", i);\r
+ }\r
+ }\r
+ if (contentList == nullptr) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherView::contentList fail");\r
+ return;\r
+ }\r
+ contentList->ScrollTo(0);\r
+ contentList->SetAdapter(listAdapter);\r
+}\r
+\r
+bool WeatherPageThird::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ UNUSED(view);\r
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&\r
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {\r
+ NativeAbility::GetInstance().SwitchPageInSlice(WEATHER_PAGES::WEATHER_SECOND_PAGE, nullptr,\r
+ TransitionType::TRANSITION_INVALID, true);\r
+ }\r
+ return false;\r
+}\r
+\r
+void WeatherPageThird::OnSwipe(UISwipeView &view)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TempPresenter::OnSwipe ");\r
+ UNUSED(view);\r
+ return;\r
+}\r
+\r
+bool WeatherPageThird::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UNUSED(event);\r
+ return true;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: WeatherPresenter\r
+ * Create: 2025-03-23\r
+ */\r
+\r
+#include "weather/WeatherView.h"\r
+#include "weather/WeatherModel.h"\r
+#include "weather/WeatherPresenter.h"\r
+#include "uiservice/ui_service.h"\r
+#include "NativeRegisterManager.h"\r
+#include "wearable_log.h"\r
+\r
+namespace OHOS {\r
+ REGIST_MENU(VIEW_WEATHER, WeatherView, WeatherPresenter, WEATHER_MAIN_ICON, WEATHER_MAIN_ICON, "天气");\r
+}\r
)
set(PRIVATE_HEADER
+ ${ROOT_DIR}/application/wearable/service/device_msg
)
set(SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/phony_timer.c
${CMAKE_CURRENT_SOURCE_DIR}/ohos_timer.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/wearable_onlinelog.c
)
set(COMPONENT_PUBLIC_CCFLAGS
\r
#ifndef WEARABLE_LOG_H\r
#define WEARABLE_LOG_H\r
-#ifdef __cplusplus\r
-#if __cplusplus\r
-extern "C" {\r
-#endif\r
-#endif\r
\r
#if !defined(SW_UART_DEBUG) && !defined(SW_RTT_DEBUG)\r
#include "soc_diag_util.h"\r
#else\r
#include "debug_print.h"\r
#endif\r
+#include "wearable_onlinelog.h"\r
+\r
+#ifdef __cplusplus\r
+#if __cplusplus\r
+extern "C" {\r
+#endif\r
+#endif\r
\r
/**\r
* @brief Enumerates logging module types.\r
WEARABLE_LOG_MODULE_SMART_VOICE,\r
/* UI SERVICE */\r
WEARABLE_LOG_MODULE_UI_SERVICE,\r
+ /* msg_center */\r
+ WEARABLE_LOG_MODULE_MSG_CENTER,\r
\r
WEARABLE_LOG_MODULE_MAX\r
} WearableLogModuleType;\r
\r
-#if !defined(SW_UART_DEBUG) && !defined(SW_RTT_DEBUG)\r
+#if !defined(SW_UART_DEBUG) && !defined(SW_RTT_DEBUG) && !defined(CONFIG_ONLINE_LOG)\r
#define WEARABLE_LOGE(mod, fmt, arg...) uapi_diag_error_log(0, fmt, ##arg)\r
#define WEARABLE_LOGW(mod, fmt, arg...) uapi_diag_warning_log(0, fmt, ##arg)\r
#define WEARABLE_LOGI(mod, fmt, arg...) uapi_diag_info_log(0, fmt, ##arg)\r
#else\r
#define WEARABLE_LOGD(mod, fmt, arg...)\r
#endif\r
+#elif (CONFIG_ONLINE_LOG == 1) && !defined(_WIN32)\r
+#define WEARABLE_LOGE(mod, fmt, arg...) ONLINE_PRINT(ONLINE_ERROR, fmt "\n", ##arg)\r
+#define WEARABLE_LOGW(mod, fmt, arg...) ONLINE_PRINT(ONLINE_WARN, fmt "\n", ##arg)\r
+#define WEARABLE_LOGI(mod, fmt, arg...) ONLINE_PRINT(ONLINE_INFO, fmt "\n", ##arg)\r
+#ifdef WEARABLE_LOG_DEBUG\r
+#define WEARABLE_LOGD(mod, fmt, arg...) ONLINE_PRINT(ONLINE_INFO, fmt "\n", ##arg)\r
+#else\r
+#define WEARABLE_LOGD(mod, fmt, arg...)\r
+#endif\r
#else\r
#define WEARABLE_LOGE(mod, fmt, arg...) PRINT("[WEARABLE E/] " fmt "\n", ##arg)\r
#define WEARABLE_LOGW(mod, fmt, arg...) PRINT("[WEARABLE W/] " fmt "\n", ##arg)\r
#endif\r
#endif\r
\r
-#define CHECK_NULL_AND_RETURN(pointer, mod, fmt) \\r
- do { \\r
- if ((pointer) == nullptr) { \\r
- WEARABLE_LOGE((mod), (fmt)); \\r
- return; \\r
- } \\r
+#define CHECK_NULL_AND_RETURN(pointer, mod, fmt) \\r
+ do { \\r
+ if ((pointer) == nullptr) { \\r
+ WEARABLE_LOGE((mod), (fmt)); \\r
+ return; \\r
+ } \\r
} while (0)\r
\r
-#define CHECK_NULL_AND_RETURN_NULL(pointer, mod, fmt) \\r
- do { \\r
- if ((pointer) == nullptr) { \\r
- WEARABLE_LOGE((mod), (fmt)); \\r
- return nullptr; \\r
- } \\r
+#define CHECK_NULL_AND_RETURN_NULL(pointer, mod, fmt) \\r
+ do { \\r
+ if ((pointer) == nullptr) { \\r
+ WEARABLE_LOGE((mod), (fmt)); \\r
+ return nullptr; \\r
+ } \\r
} while (0)\r
\r
#define CHECK_NULL_AND_RETURN_CODE(pointer, mod, fmt, code) \\r
- do { \\r
- if ((pointer) == nullptr) { \\r
- WEARABLE_LOGE((mod), (fmt)); \\r
+ do { \\r
+ if ((pointer) == nullptr) { \\r
+ WEARABLE_LOGE((mod), (fmt)); \\r
return (code); \\r
- } \\r
+ } \\r
} while (0)\r
\r
-#define DELETE_IF_NOT_NULL(pointer) \\r
- do { \\r
- if ((pointer) != nullptr) { \\r
- delete (pointer); \\r
- (pointer) = nullptr; \\r
- } \\r
+#define DELETE_IF_NOT_NULL(pointer) \\r
+ do { \\r
+ if ((pointer) != nullptr) { \\r
+ delete (pointer); \\r
+ (pointer) = nullptr; \\r
+ } \\r
} while (0)\r
\r
#ifdef __cplusplus\r
--- /dev/null
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved.\r
+ * Description: wearable_onlinelog src fie.\r
+ * Author: CompanyName\r
+ * Create:\r
+ */\r
+#include "wearable_log.h"\r
+#include "securec.h"\r
+#include "diag_ind_src.h"\r
+#include "diag_service.h"\r
+#include "diag_common.h"\r
+#include "msg_center_protocol.h"\r
+#include "msg_center_device.h"\r
+#if defined(SW_UART_DEBUG)\r
+#include "uart.h"\r
+#endif\r
+\r
+#if (CONFIG_ONLINE_LOG == 1) && !defined(_WIN32)\r
+#define TL_BYTE1 1\r
+#define TL_BYTE2 2\r
+#define SHIFT_8_BIT 8\r
+\r
+#define SET_UART_CHANNEL_CMD 1\r
+#define SET_BR_CHANNEL_CMD 2\r
+#define SET_BLE_CHANNEL_CMD 3\r
+\r
+static uint8_t g_log_diag_channel = DIAG_FRAME_FID_PC;\r
+\r
+// 在线日志级别对应的字符串\r
+static const char *gLevelStrings[] = {"[WEARABLE D/] ", "[WEARABLE I/] ", "[WEARABLE W/] ", "[WEARABLE E/] "};\r
+// 在线日志过滤器;\r
+static uint8_t gOnlineLevelFilter = 0xf;\r
+\r
+errcode_t uapi_diag_service_send_log(uint8_t channel, uint8_t type, uint8_t *payload, uint32_t pay_len);\r
+\r
+static uint8_t calculate_tl_byte(uint32_t payloadLen)\r
+{\r
+ uint8_t tl_byte = 0;\r
+ if (payloadLen <= 0x7f) {\r
+ tl_byte = 0;\r
+ } else if (payloadLen > 0xff) {\r
+ tl_byte = TL_BYTE2;\r
+ } else {\r
+ tl_byte = TL_BYTE1;\r
+ }\r
+ return tl_byte;\r
+}\r
+\r
+void set_online_log_level(uint8_t filter)\r
+{\r
+ gOnlineLevelFilter = filter;\r
+}\r
+\r
+static void send_uart_str(const char *s, uint32_t str_len)\r
+{\r
+#if defined(SW_UART_DEBUG)\r
+ if (hal_uart_get_funcs(SW_DEBUG_UART_BUS) == NULL) {\r
+ return;\r
+ }\r
+ uapi_uart_write(SW_DEBUG_UART_BUS, (const void *)s, str_len, 0);\r
+#endif\r
+}\r
+\r
+void change_log_diag_channel(uint8_t channel)\r
+{\r
+ if (channel == SET_UART_CHANNEL_CMD) {\r
+ g_log_diag_channel = DIAG_FRAME_FID_PC;\r
+ } else if (channel == SET_BR_CHANNEL_CMD) {\r
+ g_log_diag_channel = DIAG_FRAME_FID_PHONE;\r
+ } else if (channel == SET_BLE_CHANNEL_CMD) {\r
+ g_log_diag_channel = DIAG_FRAME_FID_BT;\r
+ } else {\r
+ g_log_diag_channel = DIAG_FRAME_FID_PC;\r
+ }\r
+}\r
+\r
+uint8_t get_log_diag_channel()\r
+{\r
+ return g_log_diag_channel;\r
+}\r
+\r
+void online_print_str(uint16_t level, const char *str, ...)\r
+{\r
+ static uint8_t buffer[1024];\r
+ uint8_t filter = (1 << level) & gOnlineLevelFilter;\r
+ if (!filter) {\r
+ return;\r
+ }\r
+ int offset = sprintf_s((char *)buffer, sizeof(buffer), "%s", gLevelStrings[level]);\r
+ if (offset < 0 || (size_t)offset >= sizeof(buffer)) {\r
+ return;\r
+ }\r
+ va_list args;\r
+ va_start(args, str);\r
+ offset += vsprintf_s((char *)(buffer + offset), sizeof(buffer) - offset, str, args);\r
+ if (offset < 0 || (size_t)offset >= sizeof(buffer)) {\r
+ va_end(args);\r
+ return;\r
+ }\r
+ va_end(args);\r
+ uint8_t channel = get_log_diag_channel();\r
+ if (channel == DIAG_FRAME_FID_PC) {\r
+ send_uart_str((const char *)buffer, offset);\r
+ } else {\r
+ uapi_diag_service_send_log(channel, MSGCENTER_TYPE_ID_ONLINELOG_REPORT, buffer, offset);\r
+ }\r
+}\r
+\r
+errcode_t uapi_diag_service_send_log(uint8_t channel, uint8_t type, uint8_t *payload, uint32_t pay_len)\r
+{\r
+ uint8_t size;\r
+ diag_ser_data_t *diag_data;\r
+ diag_ser_frame_t *frame;\r
+ uint32_t result = ERRCODE_FAIL;\r
+ // 计算tl的长度及填充tl数据;\r
+ uint8_t tl_byte = calculate_tl_byte(pay_len);\r
+ uint32_t tl_len = sizeof(msg_center_pkt_tlv_t) + tl_byte;\r
+ uint8_t tl_data[4];\r
+ msg_center_pkt_tlv_t *tl = (msg_center_pkt_tlv_t *)tl_data;\r
+ tl->type = 0x80 | type;\r
+ if (tl_byte == TL_BYTE1) {\r
+ tl->len = tl_byte;\r
+ tl->data[0] = (uint8_t)pay_len;\r
+ } else if (tl_byte == TL_BYTE2) {\r
+ tl->len = tl_byte;\r
+ tl->data[0] = (uint16_t)pay_len & 0xff;\r
+ tl->data[1] = (uint16_t)pay_len >> SHIFT_8_BIT;\r
+ } else {\r
+ tl->len = 0x80 | (uint8_t)pay_len;\r
+ }\r
+\r
+ size = sizeof(diag_ser_data_t) + sizeof(diag_ser_frame_t) + pay_len + tl_len;\r
+ diag_data = (diag_ser_data_t *)malloc(size);\r
+ if (diag_data == NULL) {\r
+ return ERRCODE_FAIL;\r
+ }\r
+\r
+ diag_data->header.ser_id = DIAG_SER_MSG_CENTER;\r
+ diag_data->header.cmd_id = MSGCENTER_CMD_DEVICE;\r
+ diag_data->header.ack_en = false;\r
+ diag_data->header.src = DIAG_FRAME_FID_MCU;\r
+ diag_data->header.dst = channel;\r
+ diag_data->header.crc_en = 1;\r
+ diag_data->header.length = size - sizeof(diag_ser_data_t); // size = modeleId + cmdId + tlv\r
+\r
+ frame = (diag_ser_frame_t *)&(diag_data->payload);\r
+ frame->module_id = DIAG_SER_MSG_CENTER;\r
+ frame->cmd_id = MSGCENTER_CMD_DEVICE;\r
+ (void)memcpy_s(&(frame->tlv), tl_len, tl, tl_len);\r
+ (void)memcpy_s(&(frame->tlv[tl_len]), pay_len, payload, pay_len);\r
+ result = uapi_diag_service_send_data(diag_data);\r
+ free(diag_data);\r
+ return result;\r
+}\r
+#endif\r
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2025-2025. All rights reserved.
+ * Description: Wearable onlinelog header file.
+ * Author:
+ * Create:
+ */
+
+#ifndef WEARABLE_ONLINELOG_H
+#define WEARABLE_ONLINELOG_H
+
+#include "stdint.h"
+#include "errcode.h"
+
+#ifdef __cplusplus
+#if __cplusplus
+extern "C" {
+#endif
+#endif
+
+/* 特性: 在线日志 */
+#ifndef CONFIG_ONLINE_LOG
+#define CONFIG_ONLINE_LOG 1
+#endif
+
+enum OnLineLogLevel {
+ ONLINE_DEBUG = 0,
+ ONLINE_INFO,
+ ONLINE_WARN,
+ ONLINE_ERROR
+};
+
+void online_print_str(uint16_t level, const char *str, ...);
+void change_log_diag_channel(uint8_t channel);
+uint8_t get_log_diag_channel(void);
+void set_online_log_level(uint8_t filter);
+errcode_t uapi_diag_service_send_log(uint8_t channel, uint8_t type, uint8_t *payload, uint32_t pay_len);
+
+#ifndef ONLINE_PRINT
+#define ONLINE_PRINT(level, fmt, arg...) online_print_str(level, fmt, ##arg)
+#endif
+
+#ifdef __cplusplus
+#if __cplusplus
+}
+#endif
+#endif
+
+#endif // WEARABLE_ONLINELOG_H
\ No newline at end of file
set(PRIVATE_HEADER
${ROOT_DIR}/open_source/mbedtls/mbedtls_v3.6.0/
+ ${ROOT_DIR}/application/wearable/service/device_msg/
)
set(PRIVATE_DEFINES
if (upg_check_upgrade_need_upgrade()) return ;\r
#endif\r
OHOS_SystemInit();\r
+\r
+#ifdef PUBLISH_TEST_DATA\r
+ PublishTestData();\r
+#endif\r
\r
#ifdef SUPPORT_POWER_MANAGER\r
const power_display_svr_api_t *display_api = power_display_svr_get_api();\r
add_subdirectory_if_exist(xiaodu_voice)
add_subdirectory_if_exist(xiaodu_navi_vector)
add_subdirectory_if_exist(hc_demo_msg)
+add_subdirectory_if_exist(device_msg)
+add_subdirectory_if_exist(remote_msg)
add_subdirectory_if_exist(auto_ota_msg)
add_subdirectory_if_exist(alipay_msg)
add_subdirectory_if_exist(app_store)
${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/innerkits
${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits
${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits/gfx_utils
- ${ROOT_DIR}/application/wearable/nativeapp/nativeui/uiservice/include
)
set(SOURCES
#include "bundle_install_msg.h"
#include "bundlems_slite_client.h"
#include "appexecfwk_errors.h"
-#include "ui_service.h"
+#include "uiservice/ui_service.h"
void AppStoreReplyAck(uint8_t cmd_id, uint8_t type, uint32_t ack)
{
for (int32_t i = 0; i < count; i++) {
(void)strncpy_s((char*)unitInfo[i].pkgName, PKG_NAME_MAX_LENGTH,
bundleInfos[i].bundleName, strlen(bundleInfos[i].bundleName));
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AppStoreGetPkgList pkgName[%d] = %s", i, unitInfo[i].pkgName);
+ (void)strncpy_s((char*)unitInfo[i].versionName, VERSION_NAME_MAX_LENGTH,
+ bundleInfos[i].versionName, strlen(bundleInfos[i].versionName));
+ (void)strncpy_s((char*)unitInfo[i].labelName, LABEL_NAME_MAX_LENGTH,
+ bundleInfos[i].label, strlen(bundleInfos[i].label));
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AppStoreGetPkgList pkgName[%d] = %s, versionName[%d] = %s,\
+ labeName[%d] = %s", i, unitInfo[i].pkgName, i, unitInfo[i].versionName, i,
+ unitInfo[i].labelName);
unitInfo[i].versionCode = bundleInfos[i].versionCode;
}
ret = msg_center_send_data(MSGCENTER_CMD_APP_STORE, type, infoList, len);
}
return ret;
}
+
+errcode_t AppStoreGetBundleInfo(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+ BundleInfo bundleInfo;
+ int32_t ret = ERRCODE_FAIL;
+
+ uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);
+ uint16_t payload_len = usr_len - tl_len;
+ uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);
+ char *bundleName = (char *)malloc(payload_len + 1);
+ (void)memcpy_s(bundleName, payload_len, tlv_payload, payload_len);
+ bundleName[payload_len] = '\0';
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bundleName = %s", bundleName);
+
+ uint8_t bundleRet = OHOS::BundleMsClient::GetInstance().GetBundleInfo(bundleName, 0, &bundleInfo);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "get bundleInfo, ret = %d", bundleRet);
+
+ int32_t len = sizeof(PkgUnitInfo);
+ PkgUnitInfo *info = (PkgUnitInfo *)malloc(len);
+ if (info != nullptr) {
+ memset_s(info, len, 0, len);
+ (void)strncpy_s((char*)info->pkgName, PKG_NAME_MAX_LENGTH, bundleInfo.bundleName,
+ strlen(bundleInfo.bundleName));
+ (void)strncpy_s((char*)info->versionName, VERSION_NAME_MAX_LENGTH, bundleInfo.versionName,
+ strlen(bundleInfo.versionName));
+ (void)strncpy_s((char*)info->labelName, LABEL_NAME_MAX_LENGTH, bundleInfo.label, strlen(bundleInfo.label));
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AppStoreGetBundleInfo pkgName = %s, versionName = %s, labeName = %s",
+ info->pkgName, info->versionName, info->labelName);
+ info->versionCode = bundleInfo.versionCode;
+ ret = msg_center_send_data(cmd_id, type, info, len);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "AppStoreGetBundleInfo send data ret = 0x%x", ret);
+ free(info);
+ free(bundleName);
+ }
+
+ return ret;
+}
\ No newline at end of file
#endif
#define PKG_NAME_MAX_LENGTH 128
+#define VERSION_NAME_MAX_LENGTH 128
+#define LABEL_NAME_MAX_LENGTH 256
#define FS_DIR_APP_STORE "/user/app_store/"
typedef enum {
APP_STORE_OPERATION = 0x01,
APP_STORE_NOTIFY_PROGRESS = 0x02,
APP_STORE_GET_PKG_LIST = 0x03,
+ APP_STORE_GET_BUNDLEINFO = 0x04,
} AppStoreType;
typedef enum {
typedef struct {
uint8_t pkgName[PKG_NAME_MAX_LENGTH];
int32_t versionCode;
+ uint8_t versionName[VERSION_NAME_MAX_LENGTH];
+ uint8_t labelName[LABEL_NAME_MAX_LENGTH];
} PkgUnitInfo;
errcode_t AppStorePkgOperation(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);
errcode_t AppStoreGetPkgList(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);
+errcode_t AppStoreGetBundleInfo(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);
#ifdef __cplusplus
#if __cplusplus
static const msg_center_cmd_map_t g_appStoreTbl[] = {
{ MSGCENTER_CMD_APP_STORE, APP_STORE_OPERATION, AppStorePkgOperation },
{ MSGCENTER_CMD_APP_STORE, APP_STORE_GET_PKG_LIST, AppStoreGetPkgList },
+ { MSGCENTER_CMD_APP_STORE, APP_STORE_GET_BUNDLEINFO, AppStoreGetBundleInfo },
};
errcode_t AppStoreTypeDispatch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
TOPIC_EVENT_HFP_FINISHED,\r
TOPIC_EVENT_HFP_PHONE_TO_WATCH,\r
TOPIC_EVENT_HFP_WATCH_TO_PHONE,\r
- \r
+ TOPIC_EVENT_BLOODOXYGEN_UPDATA,\r
+ TOPIC_EVENT_SPORT_DISTANCE,\r
+ TOPIC_EVENT_LOCATION,\r
TOPIC_END_NUM = 20000,\r
} TopicNum;\r
\r
{TOPIC_EVENT_HFP_FINISHED, A_CORE_MASK, 1},
{TOPIC_EVENT_HFP_PHONE_TO_WATCH, A_CORE_MASK, 1},
{TOPIC_EVENT_HFP_WATCH_TO_PHONE, A_CORE_MASK, 1},
+ {TOPIC_EVENT_BLOODOXYGEN_UPDATA, A_CORE_MASK, 1},
+ {TOPIC_EVENT_SPORT_DISTANCE, A_CORE_MASK, 1},
+ {TOPIC_EVENT_LOCATION, A_CORE_MASK, 1},
};
/* 所有的topic,其对应的位图 */
--- /dev/null
+set(COMPONENT_NAME "device_msg")\r
+\r
+set(PUBLIC_HEADER\r
+)\r
+\r
+set(PRIVATE_HEADER\r
+ ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/innerkits\r
+ ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits\r
+ ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/include\r
+ ${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/innerkits\r
+ ${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/innerkits\r
+ ${ROOT_DIR}/middleware/services/media/foundation/audiomanager/interfaces/kits/audiomanager\r
+ ${ROOT_DIR}/middleware/services/gui/uikit/ui/frameworks\r
+ ${ROOT_DIR}/middleware/services/gui/uikit/surface/interfaces/kits\r
+ ${ROOT_DIR}/middleware/chips/brandy/nv/include\r
+ ${ROOT_DIR}/middleware/chips/brandy/nv/nv_config\r
+ ${ROOT_DIR}/open_source/openharmony/drivers/peripheral/display/interfaces/include\r
+ ${ROOT_DIR}/open_source/openharmony/base/sensors/location/interfaces/kits/include\r
+ ${ROOT_DIR}/middleware/utils/dfx/diag/\r
+)\r
+\r
+set(SOURCES\r
+ ${CMAKE_CURRENT_SOURCE_DIR}/device_msg.cpp\r
+ ${CMAKE_CURRENT_SOURCE_DIR}/device_proxy.cpp\r
+ ${CMAKE_CURRENT_SOURCE_DIR}/msg_center_device.cpp\r
+ ${CMAKE_CURRENT_SOURCE_DIR}/device_location.cpp\r
+)\r
+\r
+set(COMPONENT_PUBLIC_CCFLAGS\r
+)\r
+\r
+set(COMPONENT_CCFLAGS\r
+ -std=c++11\r
+ -Wno-missing-field-initializers\r
+)\r
+\r
+set(WHOLE_LINK\r
+ true\r
+)\r
+\r
+set(PUBLIC_DEFINES\r
+)\r
+\r
+set(PRIVATE_DEFINES\r
+ APP_PLATFORM_WATCHGT\r
+ CONFIG_ACELITE_ENABLE\r
+)\r
+\r
+build_component()\r
+\r
+\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ */\r
+#include "device_location.h"\r
+#include "wearable_log.h"\r
+#include "locator.h"\r
+\r
+using namespace OHOS::Location;\r
+\r
+LocationInfo_t g_locationInfo = {0};\r
+\r
+class GnssStatusCallback : public IGnssStatusCallback {\r
+public:\r
+ GnssStatusCallback() {}\r
+ ~GnssStatusCallback() {}\r
+\r
+ void OnStatusChange(const std::shared_ptr<SatelliteStatus> &statusInfo) override\r
+ {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "OnStatusChange, num:%d\n", statusInfo->GetSatellitesNumber());\r
+ for (int32_t satIdx = 0; satIdx < statusInfo->GetSatellitesNumber(); satIdx++) {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "sat index:%d svid:%d ele:%.3f az:%.3f cnr:%.3f \n", satIdx,\r
+ statusInfo->GetSatelliteIds()[satIdx], statusInfo->GetAltitudes()[satIdx],\r
+ statusInfo->GetAzimuths()[satIdx], statusInfo->GetCarrierToNoiseDensitys()[satIdx]);\r
+ }\r
+ }\r
+\r
+private:\r
+};\r
+\r
+class NmeaMessageCallback : public INmeaMessageCallback {\r
+public:\r
+ NmeaMessageCallback() {}\r
+ ~NmeaMessageCallback() {}\r
+\r
+ void OnMessageChange(int64_t timestamp, const std::string msg) override\r
+ {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "OnMessageChange timestamp :%lld msg:%s\n", timestamp, msg.c_str());\r
+ }\r
+\r
+private:\r
+};\r
+\r
+class LocatorCallback : public ILocatorCallback {\r
+public:\r
+ LocatorCallback() {}\r
+\r
+ ~LocatorCallback() {}\r
+\r
+ void OnLocationReport(const std::shared_ptr<Location> &location) override\r
+ {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "OnLocationReport Lat:%.3f Long:%.3f Alt:%.3f Speed:%.3f dir:%.3f\n",\r
+ location->GetLatitude(), location->GetLongitude(), location->GetAltitude(), location->GetSpeed(),\r
+ location->GetDirection());\r
+ }\r
+\r
+ void OnErrorReport(const int errorCode) override\r
+ {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "error code:%d\n", errorCode);\r
+ }\r
+\r
+ void OnLocatingStatusChange(const int status) override\r
+ {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "OnLocatingStatusChange status:%d\n", status);\r
+ }\r
+\r
+private:\r
+};\r
+\r
+typedef struct {\r
+ Locator *locator;\r
+ bool isStarted;\r
+ LocatorCallback locatorCallback;\r
+ GnssStatusCallback gnssStatusCallback;\r
+ NmeaMessageCallback nmeaMessageCallback;\r
+} LocationSampleContext;\r
+\r
+static LocationSampleContext g_locationContext = {\r
+ .locator = nullptr,\r
+ .isStarted = false,\r
+};\r
+\r
+int32_t deviceLocationStartLocating()\r
+{\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "LocationStartLocating\n");\r
+ if (g_locationContext.locator == nullptr) {\r
+ g_locationContext.locator = &Locator::GetInstance();\r
+ }\r
+ if (g_locationContext.locator == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator is nullptr\n");\r
+ return ERRCODE_FAILURE;\r
+ }\r
+\r
+ bool isEnabled = false;\r
+ LocationErrCode errCode = g_locationContext.locator->IsLocationEnabled(isEnabled);\r
+ if (errCode != ERRCODE_SUCCESS) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator IsLocationEnabled failed:%d\n", errCode);\r
+ return errCode;\r
+ }\r
+\r
+ if (!isEnabled) {\r
+ errCode = g_locationContext.locator->EnableAbility(true);\r
+ if (errCode != ERRCODE_SUCCESS) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator EnableAbility failed:%d\n", errCode);\r
+ return errCode;\r
+ }\r
+ }\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "RegisterGnssStatusCallback\n");\r
+ errCode = g_locationContext.locator->RegisterGnssStatusCallback(&g_locationContext.gnssStatusCallback);\r
+ if (errCode != ERRCODE_SUCCESS) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator RegisterGnssStatusCallback failed:%d\n", errCode);\r
+ return errCode;\r
+ }\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "RegisterNmeaMessageCallback\n");\r
+ errCode = g_locationContext.locator->RegisterNmeaMessageCallback(&g_locationContext.nmeaMessageCallback);\r
+ if (errCode != ERRCODE_SUCCESS) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator RegisterNmeaMessageCallback failed:%d\n", errCode);\r
+ return errCode;\r
+ }\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "StartLocating\n");\r
+ RequestConfig requestConfig;\r
+ requestConfig.SetPriority(PRIORITY_ACCURACY);\r
+ errCode = g_locationContext.locator->StartLocating(&requestConfig, &g_locationContext.locatorCallback);\r
+ if (errCode != ERRCODE_SUCCESS) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator StartLocating failed:%d\n", errCode);\r
+ return errCode;\r
+ }\r
+ g_locationContext.isStarted = true;\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "StartLocating end\n");\r
+ return ERRCODE_SUCCESS;\r
+}\r
+\r
+int32_t deviceLocationStopLocating()\r
+{\r
+ if (!g_locationContext.isStarted) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator is not started\n");\r
+ return ERRCODE_FAILURE;\r
+ }\r
+ LocationErrCode errCode =\r
+ g_locationContext.locator->UnregisterNmeaMessageCallback(&g_locationContext.nmeaMessageCallback);\r
+ if (errCode != ERRCODE_SUCCESS) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator UnregisterNmeaMessageCallback failed:%d\n", errCode);\r
+ return errCode;\r
+ }\r
+ errCode = g_locationContext.locator->UnregisterGnssStatusCallback(&g_locationContext.gnssStatusCallback);\r
+ if (errCode != ERRCODE_SUCCESS) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator RegisterGnssStatusCallback failed:%d\n", errCode);\r
+ return errCode;\r
+ }\r
+ errCode = g_locationContext.locator->StopLocating(&g_locationContext.locatorCallback);\r
+ if (errCode != ERRCODE_SUCCESS) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator StopLocating failed:%d\n", errCode);\r
+ return errCode;\r
+ }\r
+ g_locationContext.isStarted = false;\r
+\r
+ bool isEnabled = false;\r
+ errCode = g_locationContext.locator->IsLocationEnabled(isEnabled);\r
+ if (errCode != ERRCODE_SUCCESS) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator IsLocationEnabled failed:%d\n", errCode);\r
+ return errCode;\r
+ }\r
+ if (!isEnabled) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator Is not Enabled\n");\r
+ return ERRCODE_FAILURE;\r
+ }\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "EnableAbility false\n");\r
+ errCode = g_locationContext.locator->EnableAbility(false);\r
+ if (errCode != ERRCODE_SUCCESS) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "locator EnableAbility failed:%d\n", errCode);\r
+ return errCode;\r
+ }\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Disable end\n");\r
+ return ERRCODE_SUCCESS;\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ */\r
+#ifndef DEVICE_LOCATION_H\r
+#define DEVICE_LOCATION_H\r
+#include <cinttypes>\r
+\r
+typedef struct LocationInfo {\r
+ int32_t latitude_;\r
+ int32_t longitude_;\r
+ uint16_t altitude_;\r
+ uint16_t accuracy_;\r
+ uint16_t speed_;\r
+ uint16_t direction_;\r
+ int64_t timeStamp_;\r
+} LocationInfo_t;\r
+\r
+int32_t deviceLocationStartLocating();\r
+int32_t deviceLocationStopLocating();\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: Breath Ease\r
+ * Author: wangle\r
+ * Create: 2025-4-23\r
+ */\r
+#include "msg_center_protocol.h"\r
+#include "msg_center_cmd.h"\r
+#include "ohos_init.h"\r
+#include "msg_center_device.h"\r
+#ifdef PUBLISH_TEST_DATA\r
+#include <cstdlib>\r
+#include <ctime>\r
+#include "graphic_timer.h"\r
+#include "broadcast_feature.h"\r
+#include "ohos_timer.h"\r
+#include "heartrate/HeartModel.h"\r
+#include "device_location.h"\r
+#endif\r
+namespace OHOS {\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+#ifdef PUBLISH_TEST_DATA\r
+#define BLOODOXYGEN_LOWER 90\r
+#define BLOODOXYGEN_RANGE 10\r
+#define STEP_RANGE 5\r
+#define DISTANCE_RANGE 10\r
+#define HEARTRATE_LOWER 60\r
+#define HEARTRATE_RANGE 60\r
+static uint8_t g_rotation_publish = 0;\r
+static GraphicTimer *g_publishTestDataHandle = nullptr;\r
+enum publishDataType {\r
+ PUBLISH_SETP = 0,\r
+ PUBLISH_DISTANCE,\r
+ PUBLISH_HEARTRATE,\r
+ PUBLISH_BLOODOXYGEN,\r
+ PUBLISH_TYPE_MAX\r
+};\r
+\r
+static void PublishTopicTestDataEvent(uint16_t topic, const void *data, size_t len)\r
+{\r
+ int32_t ret;\r
+ uint16_t size = len;\r
+ BroadcastApi *broadcastApi = nullptr;\r
+ IUnknown *api = nullptr;\r
+\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PublishTopicTestDataEvent topic=%u!!", topic);\r
+\r
+ void *publishData = malloc(size);\r
+ if (publishData == nullptr) {\r
+ return;\r
+ }\r
+ ret = memcpy_s(publishData, size, data, size);\r
+ if (ret != EOK) {\r
+ free(publishData);\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PublishTopicTestDataEvent memcpy_s fail! ret = %d", ret);\r
+ return;\r
+ }\r
+\r
+ Request request = {\r
+ .msgId = topic,\r
+ .len = size,\r
+ .msgValue = 0,\r
+ .data = publishData,\r
+ };\r
+\r
+ /* public request */\r
+ api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME);\r
+ if (api == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetFeatureApi failed");\r
+ free(publishData);\r
+ return;\r
+ }\r
+ ret = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi);\r
+ if (ret != 0 || broadcastApi == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "QueryInterface failed");\r
+ free(publishData);\r
+ return;\r
+ }\r
+ broadcastApi->PublishTopic((IUnknown *)broadcastApi, &request);\r
+ broadcastApi->Release((IUnknown *)broadcastApi);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PublishTopicTestDataEvent end!!");\r
+\r
+ return;\r
+}\r
+\r
+static void PublishTestDataCallback(void *)\r
+{\r
+ switch (g_rotation_publish++ % PUBLISH_TYPE_MAX) {\r
+ case PUBLISH_BLOODOXYGEN: {\r
+ uint8_t blood_oxygen = BLOODOXYGEN_LOWER + rand() % BLOODOXYGEN_RANGE;\r
+ PublishTopicTestDataEvent(TOPIC_EVENT_BLOODOXYGEN_UPDATA, &blood_oxygen, sizeof(uint8_t));\r
+ break;\r
+ }\r
+ case PUBLISH_SETP: {\r
+ uint32_t step = rand() % STEP_RANGE;\r
+ PublishTopicTestDataEvent(TOPIC_EVENT_STEPDATA_UPDATE, &step, sizeof(uint32_t));\r
+ break;\r
+ }\r
+ case PUBLISH_HEARTRATE: {\r
+ HeartDatas heart_data = {0};\r
+ heart_data.perSec = HEARTRATE_LOWER + rand() % HEARTRATE_RANGE;\r
+ PublishTopicTestDataEvent(TOPIC_EVENT_HEARTRATE_UPDATA, &heart_data, sizeof(HeartDatas));\r
+ break;\r
+ }\r
+ case PUBLISH_DISTANCE: {\r
+ uint32_t distance = rand() % DISTANCE_RANGE;\r
+ PublishTopicTestDataEvent(TOPIC_EVENT_SPORT_DISTANCE, &distance, sizeof(uint32_t));\r
+ break;\r
+ }\r
+ default:\r
+ break;\r
+ }\r
+}\r
+\r
+void PublishTestData()\r
+{\r
+ uint32 tick = GetOSTick(5000); // 5秒发布一次测试数据\r
+ if (g_publishTestDataHandle == nullptr) {\r
+ g_publishTestDataHandle = new GraphicTimer(tick, PublishTestDataCallback, nullptr, true);\r
+ }\r
+ if (g_publishTestDataHandle == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PublishTestData new GraphicTimer failed!!");\r
+ return;\r
+ }\r
+ bool retTimer = g_publishTestDataHandle->Start();\r
+ if (!retTimer) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PublishTestData Start failed!!");\r
+ if (g_publishTestDataHandle != nullptr) {\r
+ delete g_publishTestDataHandle;\r
+ g_publishTestDataHandle = nullptr;\r
+ }\r
+ return;\r
+ }\r
+}\r
+#endif\r
+static const msg_center_cmd_map_t g_msg_center_device_tbl[] = {\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_GET_BATTERY_LEVEL, msg_center_get_battery_level},\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_GET_STORAGE_INFO, msg_center_get_storage_info},\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_GET_PRODUCT_INFO, msg_center_get_product_info},\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_GET_LANGUAGE_ID, msg_center_get_language_id},\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_GET_VOLUME_INFO, msg_center_get_volume_info},\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SET_LANGUAGE_ID, msg_center_set_language_id},\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SET_VOLUME_INFO, msg_center_set_volume_info},\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_DEVICE_HEARTRATE, msg_center_device_heartrate},\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_DEVICE_STEPDATA, msg_center_device_stepdata},\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_DEVICE_BLOODOXYGEN, msg_center_device_bloodoxygen},\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_OFFLINE_LOG_SWITCH, msg_center_offline_log_switch},\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_LOCATION_GET_INFO, msg_center_location_get_info},\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_LOCATION_START, msg_center_location_start},\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_LOCATION_STOP, msg_center_location_stop},\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SPORT_ACTION, msg_center_sport_action},\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SPORT_GET_DATA, msg_center_sport_get_data},\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SPORT_REPORT_DATA, msg_center_sport_report_data},\r
+#if (CONFIG_ONLINE_LOG == 1)\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SET_ONLINELOG_CHANNEL, msg_center_set_online_log_channel},\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_SET_ONLINELOG_LEVEL, msg_center_set_online_log_level},\r
+#endif\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_OTA_INIT, msg_center_ota_init},\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_OTA_UPDATE, msg_center_ota_update},\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_OFF_FIND_PHONE, msg_center_device_findphone},\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_CAMERA_WATCH_EXIT, msg_center_camera_exit},\r
+ {MSGCENTER_CMD_DEVICE, MSGCENTER_TYPE_ID_CAMERA_CONNECT_PHONE_SUCCESS, msg_center_camera_online},\r
+};\r
+\r
+errcode_t msg_center_device_type_dispatch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ uint8_t tbl_size = sizeof(g_msg_center_device_tbl) / sizeof(g_msg_center_device_tbl[0]);\r
+ uint8_t i;\r
+ for (i = 0; i < tbl_size; i++) {\r
+ msg_center_cmd_map_t *item = (msg_center_cmd_map_t *)&g_msg_center_device_tbl[i];\r
+ if ((item->type == type) && (item->handler != NULL)) {\r
+ item->handler(cmd_id, type, usr_data, usr_len);\r
+ return ERRCODE_SUCC;\r
+ }\r
+ }\r
+ return ERRCODE_NOT_SUPPORT;\r
+}\r
+\r
+void device_init(void)\r
+{\r
+ msg_center_register_cmd(MSGCENTER_CMD_DEVICE, msg_center_device_type_dispatch);\r
+}\r
+\r
+APP_FEATURE_INIT_PRI(device_init, LAYER_INIT_LEVEL_4);\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+} // namespace OHOS
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: Breath Ease\r
+ * Author: wangle\r
+ * Create: 2025-4-23\r
+ */\r
+#include <cstdio>\r
+#include "device_proxy.h"\r
+#include "wearable_log.h"\r
+#include "common_def.h"\r
+#include "cpp/audio_manager.h"\r
+#include "uiservice/ui_service.h"\r
+#include "ui_resource_string.h"\r
+#include <sys/statfs.h>\r
+#include <algorithm>\r
+#include "key_id.h"\r
+#include "common.h"\r
+#include "nv.h"\r
+#include "upg.h"\r
+#include "upg_porting.h"\r
+\r
+namespace OHOS {\r
+static constexpr const char *MOUNT_POINT[] = {"/system", "/user", "/update", "/music"};\r
+static constexpr const uint16_t language_protocol[] = {(uint8_t)(0x0u << 8) | LANGUAGE_ID_ZH,\r
+ (uint8_t)(0x1u << 8) | LANGUAGE_ID_ZH,\r
+ (uint8_t)(0x2u << 8) | LANGUAGE_ID_EN};\r
+static constexpr const uint8_t language_mask_bits = 8;\r
+static constexpr const uint16_t language_key_mask = 0xFF00;\r
+static constexpr const uint16_t language_val_mask = 0x00FF;\r
+\r
+static constexpr const uint8_t percentage_scale = 100; // 百分比换算基数\r
+static constexpr const uint8_t percentage_max = 100;\r
+static constexpr const uint8_t percentage_min = 0;\r
+\r
+static constexpr const uint32_t adc_reference_ratio_numerator = 450U; // 18 * 1000\r
+static constexpr const uint32_t adc_reference_ratio_denominator = 1024U / 2U; // 40960 / (1000/18)/2U\r
+static constexpr const uint32_t millivolt_per_volt = 1000U;\r
+\r
+static constexpr const uint32_t def_samples_to_keep = 10;\r
+static constexpr const uint32_t def_samples_to_discard = 5;\r
+static constexpr const uint32_t def_adc_max_range_mv = 380;\r
+static constexpr const uint32_t def_adc_min_range_mv = 0;\r
+\r
+template <typename T>\r
+T clamp(const T &value, const T &min_val, const T &max_val)\r
+{\r
+ return (value < min_val) ? (min_val) : (value > max_val ? max_val : value);\r
+}\r
+\r
+void device_proxy::get_storage_info(storage_info &info)\r
+{\r
+ memset_s(&info, sizeof(storage_info), 0, sizeof(storage_info));\r
+ for (size_t i = 0; i < sizeof(MOUNT_POINT) / sizeof(MOUNT_POINT[0]); i++) {\r
+ struct statfs tmpStat = {0};\r
+ if (statfs(MOUNT_POINT[i], &tmpStat) != 0) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "无法获取%s的挂载点信息,%s", MOUNT_POINT[i], strerror(errno));\r
+ continue;\r
+ }\r
+\r
+ uint32_t total = static_cast<uint32_t>(tmpStat.f_blocks * tmpStat.f_bsize);\r
+ uint32_t used = static_cast<uint32_t>((tmpStat.f_blocks - tmpStat.f_bfree) * tmpStat.f_bsize);\r
+ uint32_t free = static_cast<uint32_t>(tmpStat.f_bfree * tmpStat.f_bsize);\r
+\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "挂载点%s信息, 总:%d(byte), 用:%d(byte), 剩:%d(byte)",\r
+ MOUNT_POINT[i], total, used, free);\r
+ info.total_size += total;\r
+ info.used_size += used;\r
+ info.free_size += free;\r
+ }\r
+}\r
+void device_proxy::get_language_id(uint8_t &id)\r
+{\r
+ sys_language_id_t lang_id = {0};\r
+ uint16_t nvsize = 0;\r
+\r
+ errcode_t ret = uapi_nv_read(NV_ID_SYS_LANGUAGE_ID, sizeof(sys_language_id_t), &nvsize, (uint8_t *)&lang_id);\r
+ if (ret != ERRCODE_SUCC) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "nv get language id error, ret=%u", ret);\r
+ return;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "language nvsize=%u id = %u", nvsize, lang_id.language_id);\r
+\r
+ for (auto key : language_protocol) {\r
+ if (lang_id.language_id == (uint8_t)(key & language_val_mask)) {\r
+ id = (uint8_t)((key & language_key_mask) >> language_mask_bits);\r
+ return;\r
+ }\r
+ }\r
+ id = LANGUAGE_ID_ZH;\r
+}\r
+void device_proxy::set_language_id(uint8_t id)\r
+{\r
+ sys_language_id_t lang_id = {.language_id = LANGUAGE_ID_ZH};\r
+\r
+ for (auto key : language_protocol) {\r
+ if (id == (uint8_t)((key & language_key_mask) >> language_mask_bits)) {\r
+ lang_id.language_id = (uint8_t)(key & 0xFF);\r
+ }\r
+ }\r
+\r
+ errcode_t ret = uapi_nv_write(NV_ID_SYS_LANGUAGE_ID, (uint8_t *)&lang_id, sizeof(sys_language_id_t));\r
+ if (ret != ERRCODE_SUCC) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "nv set language id error, ret=%u", ret);\r
+ return;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "set language id = %u", lang_id.language_id);\r
+ // 发送更新消息到uiservice\r
+ SendMsgToUIService(UI_UPDATE_LANGUAGE, 0, nullptr, 0);\r
+}\r
+void device_proxy::get_product_info(std::string &info_string)\r
+{\r
+ sys_product_info_t info = {0};\r
+ uint16_t nvsize = 0;\r
+ info_string.clear();\r
+\r
+ errcode_t ret = uapi_nv_read(NV_ID_SYS_PRODUCT_INFO, sizeof(sys_product_info_t), &nvsize, (uint8_t *)&info);\r
+ if (ret != ERRCODE_SUCC) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "nv get product info error, ret=%u", ret);\r
+ return;\r
+ }\r
+\r
+ if (nvsize < sizeof(sys_product_info_t) || info.size == 0) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "invalid product info size: nvsize=%u, info.size=%u", nvsize, info.size);\r
+ return;\r
+ }\r
+\r
+ info_string.assign((const char *)info.name, info.size);\r
+\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "product info: nvsize=%u, strlen=%zu, data=%.*s", nvsize, info_string.size(),\r
+ static_cast<int>(info_string.size()), info_string.c_str());\r
+}\r
+void device_proxy::get_volume_info(uint8_t vol_type, std::vector<volume_info> &vol_info)\r
+{\r
+ std::vector<AudioStreamType> audio_types;\r
+\r
+ if (vol_type == vol_type_all_idx || vol_type > vol_type_max_idx) {\r
+ for (uint8_t i = 0; i < vol_type_max_idx; i++) {\r
+ uint8_t max_perc = 0;\r
+ trans_type_to_audio_stream_type(i, audio_types);\r
+ for (auto types : audio_types) { // 每个类型也由多个音频类型组成, 取声音最大的\r
+ int32_t vol = Audio::AudioManager::GetInstance().GetVolume(types);\r
+ int32_t max_vol = Audio::AudioManager::GetInstance().GetMaxVolume(types);\r
+ int32_t min_vol = Audio::AudioManager::GetInstance().GetMinVolume(types);\r
+ uint8_t perc = calc_vol_percentage(min_vol, max_vol, vol);\r
+ max_perc = max_perc > perc ? max_perc : perc;\r
+ }\r
+ volume_info info;\r
+ info.type = i;\r
+ info.perc = max_perc;\r
+\r
+ vol_info.push_back(info);\r
+ }\r
+ } else {\r
+ uint8_t max_perc = 0;\r
+ trans_type_to_audio_stream_type(vol_type, audio_types);\r
+ for (auto types : audio_types) { // 每个类型也由多个音频类型组成, 取声音最大的\r
+ int32_t vol = Audio::AudioManager::GetInstance().GetVolume(types);\r
+ int32_t max_vol = Audio::AudioManager::GetInstance().GetMaxVolume(types);\r
+ int32_t min_vol = Audio::AudioManager::GetInstance().GetMinVolume(types);\r
+ uint8_t perc = calc_vol_percentage(min_vol, max_vol, vol);\r
+ max_perc = max_perc > perc ? max_perc : perc;\r
+ }\r
+ volume_info info;\r
+ info.type = vol_type;\r
+ info.perc = max_perc;\r
+\r
+ vol_info.push_back(info);\r
+ }\r
+}\r
+void device_proxy::set_volume_info(volume_info &vol_info)\r
+{\r
+ std::vector<AudioStreamType> audio_types;\r
+ trans_type_to_audio_stream_type(vol_info.type, audio_types);\r
+ for (auto types : audio_types) {\r
+ int32_t max_vol = Audio::AudioManager::GetInstance().GetMaxVolume(types);\r
+ int32_t min_vol = Audio::AudioManager::GetInstance().GetMinVolume(types);\r
+\r
+ int32_t vol = calc_vol_volume(min_vol, max_vol, vol_info.perc);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetVolume %08X, %d", types, vol);\r
+ Audio::AudioManager::GetInstance().SetVolume(types, vol);\r
+ }\r
+}\r
+OTA_ERR device_proxy::ota_init(ota_info &info)\r
+{\r
+ // 检查OTA的当前状态\r
+ upg_status status = uapi_upg_get_status();\r
+ if (status == UPG_STATUS_UPDATING) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OTAInit:The update module is being upgraded.");\r
+ return OTA_ERR::OTA_ERR_STATUS_UPDATING;\r
+ }\r
+ // 清理并检查升级区空间大小\r
+ delete_file_with_cleanup(upg_get_pkg_file_dir(), upg_get_pkg_file_path());\r
+ uint32_t total_size = uapi_upg_get_storage_size();\r
+ if (total_size == 0) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OTAInit:OTA check storage size error, total_size is 0");\r
+ return OTA_ERR::OTA_ERR_INVAILD_STORAGE;\r
+ }\r
+ if (info.package_size >= total_size) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OTAInit:check size error, total size:%u, need size:%u", total_size,\r
+ info.package_size);\r
+ return OTA_ERR::OTA_ERR_INSUFFICIENT_STORAGE_SPACE;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OTAInit:check succ");\r
+ return OTA_ERR::OTA_SUCC;\r
+}\r
+OTA_ERR device_proxy::ota_update(ota_info &info)\r
+{\r
+ uint32_t total_size = 0;\r
+ do {\r
+ FILE *fp = fopen(upg_get_pkg_file_path(), "rb");\r
+ if (fp == nullptr) {\r
+ break;\r
+ }\r
+ fseek(fp, 0L, SEEK_END);\r
+ total_size = ftell(fp);\r
+ fclose(fp);\r
+ } while (false);\r
+ if (total_size == 0) {\r
+ return OTA_ERR::OTA_ERR_INVAILD_STORAGE;\r
+ }\r
+ if (total_size != info.package_size) {\r
+ return OTA_ERR::OTA_ERR_PACKAGE_SIZE_ERROR;\r
+ } \r
+ return OTA_ERR::OTA_SUCC;\r
+}\r
+\r
+void device_proxy::call_ui_ota_update()\r
+{\r
+ // 发送升级请求到uiservice\r
+ SendMsgToUIService(UI_OTA_UPDATE, 0, nullptr, 0);\r
+}\r
+\r
+int device_proxy::delete_file_with_cleanup(const char *ppath, const char *path)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "path:%s, ppath:%s", path, ppath);\r
+ // 1. 删除文件\r
+ if (unlink(path) == -1) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "unlink failed:%d", errno);\r
+ return 1;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "unlink succ");\r
+ // 2. 打开父目录文件描述符\r
+ int dir_fd = open(ppath, O_RDONLY);\r
+ if (dir_fd == -1) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "open parent dir failed:%d", errno);\r
+ return 1;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "open parent dir succ");\r
+ // 3. 同步父目录元数据到磁盘\r
+ if (fsync(dir_fd) == -1) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "fsync dir failed:%d", errno);\r
+ close(dir_fd);\r
+ return 1;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "fsync dir succ");\r
+ close(dir_fd);\r
+ return 0;\r
+}\r
+\r
+uint8_t device_proxy::calc_vol_percentage(int32_t min, int32_t max, int32_t curr)\r
+{\r
+ if (min >= max) {\r
+ return 0;\r
+ }\r
+ const int32_t clamped_curr = clamp(curr, min, max);\r
+ const int64_t range = static_cast<int64_t>(max) - min;\r
+\r
+ const int64_t scaled_value = (static_cast<int64_t>(clamped_curr - min) * percentage_scale);\r
+ return static_cast<uint8_t>(scaled_value / range);\r
+}\r
+int32_t device_proxy::calc_vol_volume(int32_t min, int32_t max, uint8_t percentage)\r
+{\r
+ if (min >= max) {\r
+ return min;\r
+ }\r
+ uint8_t clamped_percentage = clamp(percentage, percentage_min, percentage_max);\r
+\r
+ double range = static_cast<double>(max - min);\r
+ double percentage_ratio = static_cast<double>(clamped_percentage) / 100.0;\r
+ int32_t curr = static_cast<int32_t>(min + range * percentage_ratio);\r
+\r
+ return static_cast<int32_t>(clamp(curr, min, max));\r
+}\r
+void device_proxy::trans_type_to_audio_stream_type(uint8_t type, std::vector<AudioStreamType> &audio_types)\r
+{\r
+ audio_types.clear();\r
+ switch (type) {\r
+ case vol_type_alarm:\r
+ audio_types.push_back(AUDIO_STREAM_ALARM); // 通用报警音\r
+ audio_types.push_back(AUDIO_STREAM_ALARM_SYSTEM); // 设备报警\r
+ audio_types.push_back(AUDIO_STREAM_ALARM_CLOCK); // 闹钟报警\r
+ break;\r
+ case vol_type_ring:\r
+ audio_types.push_back(AUDIO_STREAM_RING); // 来电铃声\r
+ break;\r
+ case vol_type_call:\r
+ audio_types.push_back(AUDIO_STREAM_VOICE_CALL); // 普通语音通话\r
+ audio_types.push_back(AUDIO_STREAM_VOICE_CALL_VOIP); // 网络语音通话(如微信通话)\r
+ audio_types.push_back(AUDIO_STREAM_VOICE_CALL_BT_SCO); // 蓝牙语音通话\r
+ audio_types.push_back(AUDIO_STREAM_VOICE_CALL_VOLTE); // 4G VOLTE 高清语音通话\r
+ break;\r
+ case vol_type_assistant:\r
+ audio_types.push_back(AUDIO_STREAM_VOICE_ASSISTANT); // 语音助手(如 Siri、Google Assistant)\r
+ audio_types.push_back(AUDIO_STREAM_TTS); // 语音合成(如文本转语音)\r
+ break;\r
+ case vol_type_notification:\r
+ audio_types.push_back(AUDIO_STREAM_NOTIFICATION); // 通用提示音\r
+ audio_types.push_back(AUDIO_STREAM_NOTIFICATION_SYSTEM); // 设备提示音(如蓝牙连接/断开、低电量提示)\r
+ audio_types.push_back(AUDIO_STREAM_NOTIFICATION_PROMPT); // 运动健康提示音(如运动完成提醒)\r
+ break;\r
+ case vol_type_music:\r
+ audio_types.push_back(AUDIO_STREAM_MUSIC); // 本地音乐播放。\r
+ audio_types.push_back(AUDIO_STREAM_A2DP_MUSIC); // 蓝牙传输的媒体音(如从手机传输到蓝牙耳机的音乐)。\r
+ break;\r
+ case vol_type_video:\r
+ audio_types.push_back(AUDIO_STREAM_FITNESS_VIDEO); // 健身视频的指导音频。\r
+ break;\r
+ }\r
+}\r
+\r
+uint8_t battery_power::get_battery_percentage()\r
+{\r
+ battery_power *inst = get_instance();\r
+ if (inst == nullptr) {\r
+ return 0;\r
+ }\r
+ uint32_t voltage = 0;\r
+ // 从adc获取电压值\r
+ if (inst->adc_context_startup()) {\r
+ voltage = inst->calc_voltage();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "calc_voltage:%u", voltage);\r
+ }\r
+ inst->adc_context_shutdown();\r
+ // 根据电压值计算电量百分比\r
+ return inst->calc_percentage(voltage);\r
+}\r
+\r
+battery_power *battery_power::get_instance()\r
+{\r
+ static battery_power *instance = nullptr;\r
+ if (instance == nullptr) {\r
+ battery_power *temp = new battery_power();\r
+ if (!temp->adc_context_init()) {\r
+ delete temp;\r
+ return nullptr;\r
+ }\r
+ instance = temp;\r
+ }\r
+ return instance;\r
+}\r
+\r
+battery_power::battery_power()\r
+{\r
+ // 数据由海思提供\r
+ channel = ADC_CHANNEL_3;\r
+ analog_pin = S_AGPIO_L27;\r
+ mode = PIN_MODE_0;\r
+ samples_to_keep = def_samples_to_keep;\r
+ samples_to_discard = def_samples_to_discard;\r
+ // 由测试检测而来, 测试中得到的数据应该是0.3744V(没有标注单位,猜测得到,未必准确)\r
+ // 因为要算百分比, 换算成毫伏更容易计算\r
+ adc_max_range_mv = def_adc_max_range_mv;\r
+ adc_min_range_mv = def_adc_min_range_mv;\r
+}\r
+\r
+battery_power::~battery_power()\r
+{\r
+ adc_context_shutdown();\r
+}\r
+\r
+bool battery_power::adc_context_init()\r
+{\r
+ // 初始化pin模块\r
+ uapi_pin_init();\r
+ // 初始化高精度计数器\r
+ errcode_t err = uapi_tcxo_init();\r
+ if (err != ERRCODE_SUCC) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_tcxo_init error %u", err);\r
+ return false;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_tcxo_init succ");\r
+ // 设置pin脚模式\r
+ err = uapi_pin_set_mode(analog_pin, mode);\r
+ if (err != ERRCODE_SUCC) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_pin_set_mode error %u", err);\r
+ return false;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_pin_set_mode succ");\r
+ return true;\r
+}\r
+\r
+bool battery_power::adc_context_startup()\r
+{\r
+ errcode_t err = uapi_adc_init(ADC_CLOCK_500KHZ); // 初始化adc\r
+ if (err != ERRCODE_SUCC) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_adc_init error %u", err);\r
+ return false;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_adc_init succ");\r
+ uapi_adc_power_en(AFE_SCAN_MODE_MAX_NUM, true);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_adc_power_en true");\r
+ err = uapi_adc_open_channel(channel);\r
+ if (err != ERRCODE_SUCC) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_adc_open_channel error %u", err);\r
+ return false;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_adc_open_channel succ");\r
+ return true;\r
+}\r
+void battery_power::adc_context_shutdown()\r
+{\r
+ errcode_t err = uapi_adc_close_channel(channel);\r
+ if (err != ERRCODE_SUCC) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_adc_close_channel error %u", err);\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_adc_close_channel succ");\r
+ uapi_adc_power_en(AFE_SCAN_MODE_MAX_NUM, false);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_adc_power_en false");\r
+ uapi_adc_deinit();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_adc_deinit");\r
+}\r
+\r
+uint8_t battery_power::calc_percentage(uint32_t voltage)\r
+{\r
+ if (voltage >= adc_max_range_mv) {\r
+ return percentage_max;\r
+ }\r
+ if (voltage <= adc_min_range_mv) {\r
+ return percentage_min;\r
+ }\r
+\r
+ uint32_t voltage_range = adc_max_range_mv - adc_min_range_mv;\r
+ uint32_t rounding_term = voltage_range / 2;\r
+ uint32_t voltage_offset = voltage - adc_min_range_mv;\r
+ return static_cast<uint8_t>((voltage_offset * percentage_scale + rounding_term) / voltage_range);\r
+}\r
+\r
+uint32_t battery_power::calc_voltage()\r
+{\r
+ // 丢弃初始帧数据\r
+ for (uint32_t i = 0; i < samples_to_discard; i++) {\r
+ uapi_adc_manual_sample(ADC_CHANNEL_NONE);\r
+ uapi_tcxo_delay_ms((uint64_t)3); // 延迟3ms\r
+ }\r
+\r
+ uint32_t stick = 0;\r
+ uint32_t stick_count = 0;\r
+ // 采集样本数\r
+ for (uint32_t i = 0; i < samples_to_keep; i++) {\r
+ uint32_t irq_sts = osal_irq_lock();\r
+ uint32_t sample_result =\r
+ (uint32_t)uapi_adc_manual_sample(ADC_CHANNEL_NONE); // 每次读取CHANNEL_NONE? testsuit中是这样写的\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "sample result = %u", sample_result);\r
+ if (sample_result != 0) {\r
+ stick += sample_result;\r
+ stick_count++;\r
+ }\r
+ osal_irq_restore(irq_sts);\r
+ }\r
+\r
+ if (stick_count == 0) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "error, no result");\r
+ return 0;\r
+ }\r
+\r
+ uint32_t voltage = adc_trans_sytick_to_voltages(stick / stick_count);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "adc trans voltages:%u", voltage);\r
+ return voltage;\r
+}\r
+\r
+uint32_t battery_power::adc_trans_sytick_to_voltages(uint32_t sytick)\r
+{\r
+ // 整数运算公式:(sytick * numerator + denominator/2) / denominator\r
+ return (sytick * adc_reference_ratio_numerator + adc_reference_ratio_denominator) / adc_reference_ratio_denominator;\r
+}\r
+} // namespace OHOS
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: Breath Ease\r
+ * Author: wangle\r
+ * Create: 2025-4-23\r
+ */\r
+#ifndef WATCH_SETTING_PROXY_H\r
+#define WATCH_SETTING_PROXY_H\r
+\r
+#include <vector>\r
+#include <string>\r
+#include "msg_center_protocol.h"\r
+#include "cpp/audio_manager.h"\r
+#include "adc.h"\r
+#include "tcxo.h"\r
+#include "pinctrl.h"\r
+#include "hal_adc.h"\r
+\r
+namespace OHOS {\r
+\r
+typedef struct storage_info {\r
+ uint32_t total_size; // 总大小\r
+ uint32_t used_size; // 已使用\r
+ uint32_t free_size; // 未使用\r
+} storage_info_t;\r
+\r
+typedef struct volume_info {\r
+ uint8_t type; // 类型\r
+ uint8_t perc; // 百分比\r
+} volume_info_t;\r
+\r
+typedef struct ota_info {\r
+ uint32_t package_size;\r
+} ota_info_t;\r
+\r
+enum class OTA_ERR : uint32_t {\r
+ OTA_SUCC = 0x00000000u, //"成功"\r
+ OTA_ERR_INVALID_PARAM = 0x00000001u, //"参数错误"\r
+ OTA_ERR_INITIALIZE_ERR = 0x00000002u, //"OTA初始化错误"\r
+ OTA_ERR_STATUS_UPDATING = 0x00000003u, //"OTA正在升级中"\r
+ OTA_ERR_INVAILD_STORAGE = 0x00000004u, //"获取升级区信息错误"\r
+ OTA_ERR_INSUFFICIENT_STORAGE_SPACE = 0x00000005u, //"升级区没有足够的空间"\r
+ OTA_ERR_PACKAGE_SIZE_ERROR = 0x00000006u, //"升级包大小不匹配"\r
+};\r
+\r
+static constexpr const uint8_t vol_type_all_idx = 0;\r
+static constexpr const uint8_t vol_type_max_idx = 7;\r
+static constexpr const uint8_t vol_type_alarm = 1; // 报警类\r
+static constexpr const uint8_t vol_type_ring = 2; // 来电铃声\r
+static constexpr const uint8_t vol_type_call = 3; // 语音通话\r
+static constexpr const uint8_t vol_type_assistant = 4; // 语音助手\r
+static constexpr const uint8_t vol_type_notification = 5; // 通用提示音\r
+static constexpr const uint8_t vol_type_music = 6; // 音乐\r
+static constexpr const uint8_t vol_type_video = 7; // 视频\r
+\r
+\r
+class device_proxy {\r
+public:\r
+ static void get_storage_info(storage_info &info);\r
+ static void get_language_id(uint8_t &lang_id);\r
+ static void set_language_id(uint8_t lang_id);\r
+ static void get_product_info(std::string &info_string);\r
+ static void get_volume_info(uint8_t vol_type, std::vector<volume_info> &vol_info);\r
+ static void set_volume_info(volume_info &vol_info);\r
+ static OTA_ERR ota_init(ota_info &info);\r
+ static OTA_ERR ota_update(ota_info &info);\r
+ static void call_ui_ota_update();\r
+public:\r
+ static uint32_t calc_stat_size(uint64_t size);\r
+ static uint8_t calc_vol_percentage(int32_t min, int32_t max, int32_t curr);\r
+ static int32_t calc_vol_volume(int32_t min, int32_t max, uint8_t percentage);\r
+ static void trans_type_to_audio_stream_type(uint8_t type, std::vector<AudioStreamType> &audio_types);\r
+ static int delete_file_with_cleanup(const char *ppath, const char *path);\r
+};\r
+\r
+class battery_power {\r
+public:\r
+ static uint8_t get_battery_percentage();\r
+\r
+protected:\r
+ static battery_power *get_instance();\r
+\r
+private:\r
+ battery_power();\r
+ ~battery_power();\r
+ bool adc_context_init();\r
+ bool adc_context_startup();\r
+ void adc_context_shutdown();\r
+ uint8_t calc_percentage(uint32_t voltage);\r
+ uint32_t calc_voltage();\r
+ uint32_t adc_trans_sytick_to_voltages(uint32_t sytick);\r
+\r
+private:\r
+ adc_channel_t channel; // ADC信道\r
+ pin_t analog_pin; // ADC输入引脚\r
+ pin_mode_t mode; // ADC管脚工作模式\r
+ uint32_t samples_to_keep; // 总采样次数\r
+ uint32_t samples_to_discard; // 丢弃的初始样本数\r
+ uint32_t adc_max_range_mv; // ADC原始值上限(单位:毫伏)\r
+ uint32_t adc_min_range_mv; // ADC原始值下限(单位:毫伏)\r
+};\r
+\r
+} // namespace OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: Breath Ease\r
+ * Author: wangle\r
+ * Create: 2025-4-23\r
+ */\r
+#include "msg_center_protocol.h"\r
+#include "msg_center_device.h"\r
+#include "device_proxy.h"\r
+#include "wearable_log.h"\r
+#include "device_location.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "sports/SportsModel.h"\r
+#include "findphone/FindPhoneMainPage.h"\r
+#include "camera/CameraMainPage.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+#include "diag_msg.h"\r
+#include "diag_ind_src.h"\r
+\r
+uint8_t g_bloodoxygen = 0;\r
+uint16_t g_heartrate = 0;\r
+uint32_t g_stepdata = 0;\r
+uint32_t g_distance = 0;\r
+extern LocationInfo_t g_locationInfo;\r
+// 获取电量\r
+errcode_t msg_center_get_battery_level(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "get_battery_level");\r
+ uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+ void *v_data = msg_center_get_tlv_payload(usr_data);\r
+ uint8_t v_len = usr_len - tl_len;\r
+\r
+ uint8_t battery_level = OHOS::battery_power::get_battery_percentage();\r
+\r
+ errcode_t ret = msg_center_send_data(cmd_id, type, &battery_level, sizeof(battery_level));\r
+ if (ret != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send get_battery_level_ack fail, ret = %d", ret);\r
+ return ERRCODE_FAIL;\r
+ }\r
+ return ERRCODE_SUCC;\r
+}\r
+// 获取存储空间\r
+errcode_t msg_center_get_storage_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "get_storage_info");\r
+ uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+ void *v_data = msg_center_get_tlv_payload(usr_data);\r
+ uint8_t v_len = usr_len - tl_len;\r
+ uint8_t battery_level = 0;\r
+\r
+ OHOS::storage_info info;\r
+ OHOS::device_proxy::get_storage_info(info);\r
+\r
+ errcode_t ret = msg_center_send_data(cmd_id, type, &info, sizeof(OHOS::storage_info));\r
+ if (ret != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send get_storage_info_ack fail, ret = %d", ret);\r
+ return ERRCODE_FAIL;\r
+ }\r
+ return ERRCODE_SUCC;\r
+}\r
+// 获取手表类型\r
+errcode_t msg_center_get_product_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "get_product_info");\r
+ uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+ void *v_data = msg_center_get_tlv_payload(usr_data);\r
+ uint8_t v_len = usr_len - tl_len;\r
+ uint8_t battery_level = 0;\r
+\r
+ std::string product_info;\r
+ OHOS::device_proxy::get_product_info(product_info);\r
+\r
+ errcode_t ret = msg_center_send_data(cmd_id, type, (void *)product_info.c_str(), product_info.length());\r
+ if (ret != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send get_product_info_ack fail, ret = %d", ret);\r
+ return ERRCODE_FAIL;\r
+ }\r
+ return ERRCODE_SUCC;\r
+}\r
+// 获取语言\r
+errcode_t msg_center_get_language_id(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "get_language_id");\r
+ uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+ void *v_data = msg_center_get_tlv_payload(usr_data);\r
+ uint8_t v_len = usr_len - tl_len;\r
+ uint8_t battery_level = 0;\r
+\r
+ uint8_t language_id = 0;\r
+ OHOS::device_proxy::get_language_id(language_id);\r
+\r
+ errcode_t ret = msg_center_send_data(cmd_id, type, &language_id, sizeof(uint8_t));\r
+ if (ret != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send get_language_id_ack fail, ret = %d", ret);\r
+ return ERRCODE_FAIL;\r
+ }\r
+ return ERRCODE_SUCC;\r
+}\r
+// 获取音量\r
+errcode_t msg_center_get_volume_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "get_volume_info");\r
+ uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+ void *v_data = msg_center_get_tlv_payload(usr_data);\r
+ uint8_t v_len = usr_len - tl_len;\r
+\r
+ uint8_t vol_type = 0;\r
+ if (v_len == sizeof(uint8_t)) {\r
+ vol_type = *(uint8_t *)v_data;\r
+ }\r
+\r
+ std::vector<OHOS::volume_info> vol_info;\r
+ OHOS::device_proxy::get_volume_info(vol_type, vol_info);\r
+\r
+ errcode_t ret = msg_center_send_data(cmd_id, type, &vol_info[0], vol_info.size() * sizeof(OHOS::volume_info));\r
+ if (ret != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send get_volume_info_ack fail, ret = %d", ret);\r
+ return ERRCODE_FAIL;\r
+ }\r
+ return ERRCODE_SUCC;\r
+}\r
+// 设置语言\r
+errcode_t msg_center_set_language_id(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "set_language_id");\r
+ uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+ void *v_data = msg_center_get_tlv_payload(usr_data);\r
+ uint8_t v_len = usr_len - tl_len;\r
+\r
+ uint8_t language_id = 0;\r
+ if (v_len != sizeof(uint8_t)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "v_len check error, v_len=%u, need=%u", v_len, sizeof(uint8_t));\r
+ return ERRCODE_FAIL;\r
+ }\r
+\r
+ language_id = *(uint8_t *)v_data;\r
+ OHOS::device_proxy::set_language_id(language_id);\r
+\r
+ errcode_t ret = msg_center_send_data(cmd_id, type, &language_id, sizeof(uint8_t));\r
+ if (ret != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send set_language_id_ack fail, ret = %d", ret);\r
+ return ERRCODE_FAIL;\r
+ }\r
+ return ERRCODE_SUCC;\r
+}\r
+// 设置音量\r
+errcode_t msg_center_set_volume_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "set_volume_info");\r
+ uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+ void *v_data = msg_center_get_tlv_payload(usr_data);\r
+ uint8_t v_len = usr_len - tl_len;\r
+\r
+ OHOS::volume_info info;\r
+ if (v_len != sizeof(OHOS::volume_info)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "v_len check error, v_len=%u, need=%u", v_len, sizeof(uint8_t));\r
+ return ERRCODE_FAIL;\r
+ }\r
+\r
+ memcpy_s(&info, sizeof(OHOS::volume_info), v_data, v_len);\r
+ OHOS::device_proxy::set_volume_info(info);\r
+\r
+ errcode_t ret = msg_center_send_data(cmd_id, type, &info, sizeof(OHOS::volume_info));\r
+ if (ret != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send set_volume_info_ack fail, ret = %d", ret);\r
+ return ERRCODE_FAIL;\r
+ }\r
+ return ERRCODE_SUCC;\r
+}\r
+// ota初始化\r
+errcode_t msg_center_ota_init(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ota_init");\r
+ uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+ void *v_data = msg_center_get_tlv_payload(usr_data);\r
+ uint8_t v_len = usr_len - tl_len;\r
+\r
+ OHOS::ota_info info;\r
+ if (v_len != sizeof(OHOS::ota_info)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "v_len check error, v_len=%u, need=%u", v_len, sizeof(uint8_t));\r
+ return ERRCODE_FAIL;\r
+ }\r
+\r
+ memcpy_s(&info, sizeof(OHOS::ota_info), v_data, v_len);\r
+ OHOS::OTA_ERR err = OHOS::device_proxy::ota_init(info);\r
+\r
+ errcode_t ret = msg_center_send_data(cmd_id, type, &err, sizeof(OHOS::OTA_ERR));\r
+ if (ret != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send set_volume_info_ack fail, ret = %d", ret);\r
+ return ERRCODE_FAIL;\r
+ }\r
+ return ERRCODE_SUCC;\r
+}\r
+// ota检测和本地升级\r
+errcode_t msg_center_ota_update(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ota_update");\r
+ uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+ void *v_data = msg_center_get_tlv_payload(usr_data);\r
+ uint8_t v_len = usr_len - tl_len;\r
+\r
+ OHOS::ota_info info;\r
+ if (v_len != sizeof(OHOS::ota_info)) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "v_len check error, v_len=%u, need=%u", v_len, sizeof(uint8_t));\r
+ return ERRCODE_FAIL;\r
+ }\r
+\r
+ memcpy_s(&info, sizeof(OHOS::ota_info), v_data, v_len);\r
+ OHOS::OTA_ERR err = OHOS::device_proxy::ota_update(info);\r
+\r
+ errcode_t ret = msg_center_send_data(cmd_id, type, &err, sizeof(OHOS::OTA_ERR));\r
+ if (ret != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send set_volume_info_ack fail, ret = %d", ret);\r
+ return ERRCODE_FAIL;\r
+ }\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send ret = %d", ret);\r
+ OHOS::device_proxy::call_ui_ota_update(); \r
+\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send ui over");\r
+ return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_device_heartrate(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+ uint16_t payload_len = usr_len - tl_len;\r
+ uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+ errcode_t ret = ERRCODE_SUCC;\r
+\r
+ ret = msg_center_send_data(cmd_id, type, &g_heartrate, sizeof(g_heartrate));\r
+ if (ret != ERRCODE_SUCC) {\r
+ return ERRCODE_FAIL;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_device_heartrate:%d\r\n", g_heartrate);\r
+ /* notify UI or call UI load */\r
+\r
+ return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_device_stepdata(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+ uint16_t payload_len = usr_len - tl_len;\r
+ uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+ errcode_t ret = ERRCODE_SUCC;\r
+\r
+ ret = msg_center_send_data(cmd_id, type, &g_stepdata, sizeof(g_stepdata));\r
+ if (ret != ERRCODE_SUCC) {\r
+ return ERRCODE_FAIL;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_device_stepdata:%d\r\n", g_stepdata);\r
+ /* notify UI or call UI load */\r
+\r
+ return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_device_bloodoxygen(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+ uint16_t payload_len = usr_len - tl_len;\r
+ uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+ errcode_t ret = ERRCODE_SUCC;\r
+\r
+ ret = msg_center_send_data(cmd_id, type, &g_bloodoxygen, sizeof(g_bloodoxygen));\r
+ if (ret != ERRCODE_SUCC) {\r
+ return ERRCODE_FAIL;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_device_bloodoxygen:%d\r\n", g_bloodoxygen);\r
+ /* notify UI or call UI load */\r
+\r
+ return ERRCODE_SUCC;\r
+}\r
+\r
+/* LOCATION */\r
+errcode_t msg_center_location_get_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+ uint16_t payload_len = usr_len - tl_len;\r
+ uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+ errcode_t ret = ERRCODE_SUCC;\r
+\r
+ ret = msg_center_send_data(cmd_id, type, &g_locationInfo, sizeof(g_locationInfo));\r
+ if (ret != ERRCODE_SUCC) {\r
+ return ERRCODE_FAIL;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_get_info latitude_:%d,longitude_:%d\n",\r
+ g_locationInfo.latitude_, g_locationInfo.longitude_);\r
+ /* notify UI or call UI load */\r
+\r
+ return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_location_start(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+ uint16_t payload_len = usr_len - tl_len;\r
+ uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+ errcode_t ret = ERRCODE_SUCC;\r
+ uint8_t ack = 1;\r
+\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_start finish\r\n");\r
+ ret = deviceLocationStartLocating();\r
+ if (ret != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_start fail\r\n");\r
+ ret = msg_center_send_data(cmd_id, type, &ack, sizeof(ack));\r
+ if (ret != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_start send msg fail\r\n");\r
+ return ERRCODE_FAIL;\r
+ }\r
+ } else {\r
+ ret = msg_center_send_data(cmd_id, type, &ack, sizeof(ack));\r
+ if (ret != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_start send msg fail\r\n");\r
+ return ERRCODE_FAIL;\r
+ }\r
+ }\r
+\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_start finish\r\n");\r
+ /* notify UI or call UI load */\r
+\r
+ return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_location_stop(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+ uint16_t payload_len = usr_len - tl_len;\r
+ uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+ errcode_t ret = ERRCODE_SUCC;\r
+ uint8_t ack = 1;\r
+\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_stop\r\n");\r
+ ret = deviceLocationStopLocating();\r
+ ret = msg_center_send_data(cmd_id, type, &ack, sizeof(ack));\r
+ if (ret != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_stop fail\r\n");\r
+ ret = msg_center_send_data(cmd_id, type, &ack, sizeof(ack));\r
+ if (ret != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_stop send msg fail\r\n");\r
+ return ERRCODE_FAIL;\r
+ }\r
+ } else {\r
+ ret = msg_center_send_data(cmd_id, type, &ack, sizeof(ack));\r
+ if (ret != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_stop send msg fail\r\n");\r
+ return ERRCODE_FAIL;\r
+ }\r
+ }\r
+\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_location_stop\r\n");\r
+ /* notify UI or call UI load */\r
+\r
+ return ERRCODE_SUCC;\r
+}\r
+\r
+/* SPORT */\r
+errcode_t msg_center_sport_action(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+ uint16_t payload_len = usr_len - tl_len;\r
+ uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+ errcode_t ret = ERRCODE_SUCC;\r
+ uint8_t ack = 1;\r
+ sport_action_t action = (sport_action_t)*tlv_payload;\r
+\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_action : %d\r\n", action);\r
+\r
+ switch (action) {\r
+ case SPORT_ACTION_START:\r
+ OHOS::NativeAbility::GetInstance().ChangeSlice(VIEW_SPORTS);\r
+ OHOS::SportsModel::GetInstance()->ResetSportsData();\r
+ if (!OHOS::SportsModel::GetInstance()->StartSportsTimer()) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_start StartSportsTimer failed\r\n");\r
+ ret = ERRCODE_FAIL;\r
+ }\r
+ break;\r
+ case SPORT_ACTION_PAUSE:\r
+ OHOS::SportsModel::GetInstance()->StopSportsTimer(false);\r
+ break;\r
+ case SPORT_ACTION_RESUME:\r
+ if (!OHOS::SportsModel::GetInstance()->StartSportsTimer()) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_resume StartSportsTimer failed\r\n");\r
+ ret = ERRCODE_FAIL;\r
+ }\r
+ break;\r
+ case SPORT_ACTION_STOP:\r
+ OHOS::SportsModel::GetInstance()->StopSportsTimer(false);\r
+ OHOS::NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);\r
+ break;\r
+ default:\r
+ ret = ERRCODE_FAIL;\r
+ break;\r
+ }\r
+\r
+ ret = msg_center_send_data(cmd_id, type, &ack, sizeof(ack));\r
+ if (ret != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_resume send data failed\r\n");\r
+ return ERRCODE_FAIL;\r
+ }\r
+ return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_sport_get_data(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+ uint16_t payload_len = usr_len - tl_len;\r
+ uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+ errcode_t ret = ERRCODE_SUCC;\r
+\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_get_data\r\n");\r
+ OHOS::sport_data_t *sportData = OHOS::SportsModel::GetInstance()->GetSportsData();\r
+ ret = msg_center_send_data(cmd_id, type, sportData, sizeof(OHOS::sport_data_t));\r
+ if (ret != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_sport_get_data end data failed\r\n");\r
+ return ERRCODE_FAIL;\r
+ }\r
+ return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_sport_report_data(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_camera_exit(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "recv exit camera from phone");\r
+ OHOS::NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+ return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_camera_online(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "recv connect success from phone");\r
+ if (OHOS::CameraMainPage::GetInstance() != nullptr) {\r
+ OHOS::CameraMainPage::GetInstance()->Refresh_page();\r
+ return ERRCODE_SUCC;\r
+ } else {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "CameraMainPage not exist\r\n");\r
+ return ERRCODE_FAIL;\r
+ }\r
+}\r
+\r
+errcode_t msg_center_offline_log_switch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+ uint16_t payload_len = usr_len - tl_len;\r
+ uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+ uint8_t data = *tlv_payload;\r
+ errcode_t ret = ERRCODE_SUCC;\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_offline_log_switch, data = %d\r\n", data);\r
+ if (data) {\r
+ uapi_zdiag_set_offline_log_enable(true); /*open offline log*/\r
+ } else {\r
+ uapi_zdiag_set_offline_log_enable(false); /*close offline log*/\r
+ }\r
+ ret = msg_center_send_data(cmd_id, type, &data, sizeof(data));\r
+ if (ret != ERRCODE_SUCC) {\r
+ return ERRCODE_FAIL;\r
+ }\r
+ return ERRCODE_SUCC;\r
+}\r
+\r
+#if (CONFIG_ONLINE_LOG == 1)\r
+errcode_t msg_center_set_online_log_channel(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+ uint16_t payload_len = usr_len - tl_len;\r
+ uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+ uint8_t data = *tlv_payload;\r
+ errcode_t ret = ERRCODE_SUCC;\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_set_online_log_channel, data = %d\r\n", data);\r
+ change_log_diag_channel(data);\r
+ ret = msg_center_send_data(cmd_id, type, &data, sizeof(data));\r
+ if (ret != ERRCODE_SUCC) {\r
+ return ERRCODE_FAIL;\r
+ }\r
+ return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_set_online_log_level(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+ uint16_t payload_len = usr_len - tl_len;\r
+ uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+ uint8_t data = *tlv_payload;\r
+ errcode_t ret = ERRCODE_SUCC;\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_set_online_log_level, data = %d\r\n", data);\r
+ set_online_log_level(data);\r
+ ret = msg_center_send_data(cmd_id, type, &data, sizeof(data));\r
+ if (ret != ERRCODE_SUCC) {\r
+ return ERRCODE_FAIL;\r
+ }\r
+ return ERRCODE_SUCC;\r
+}\r
+#endif\r
+\r
+errcode_t msg_center_device_findphone(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+ uint16_t payload_len = usr_len - tl_len;\r
+ uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+ bool ret = true;\r
+ if ( OHOS::FindPhoneMainPage::GetInstance() != nullptr) {\r
+ ret = OHOS::FindPhoneMainPage::GetInstance()->StopFindPhone();\r
+ } else {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_MSG_CENTER, "FindphonePage not exist\r\n");\r
+ }\r
+ if (!ret) {\r
+ return ERRCODE_FAIL;\r
+ }\r
+ return ERRCODE_SUCC;\r
+}\r
+#ifdef __cplusplus\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.\r
+ * Description: Breath Ease\r
+ * Author: wangle\r
+ * Create: 2025-4-23\r
+ */\r
+#ifndef MSG_CENTER_DEVICE_H\r
+#define MSG_CENTER_DEVICE_H\r
+\r
+#include "msg_center_protocol.h"\r
+#include "wearable_log.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+typedef enum sport_action {\r
+ SPORT_ACTION_START = 1,\r
+ SPORT_ACTION_PAUSE = 2,\r
+ SPORT_ACTION_RESUME = 3,\r
+ SPORT_ACTION_STOP = 4,\r
+} sport_action_t;\r
+\r
+typedef enum msg_center_device_type_id {\r
+ MSGCENTER_TYPE_ID_GET_BATTERY_LEVEL = 0x1,\r
+ MSGCENTER_TYPE_ID_GET_STORAGE_INFO = 0x2,\r
+ MSGCENTER_TYPE_ID_GET_PRODUCT_INFO = 0x3,\r
+ MSGCENTER_TYPE_ID_GET_LANGUAGE_ID = 0x4,\r
+ MSGCENTER_TYPE_ID_GET_VOLUME_INFO = 0x5,\r
+ MSGCENTER_TYPE_ID_SET_LANGUAGE_ID = 0x6,\r
+ MSGCENTER_TYPE_ID_SET_VOLUME_INFO = 0x7,\r
+ MSGCENTER_TYPE_ID_DEVICE_HEARTRATE = 0x8,\r
+ MSGCENTER_TYPE_ID_DEVICE_STEPDATA = 0x9,\r
+ MSGCENTER_TYPE_ID_DEVICE_BLOODOXYGEN = 0xa,\r
+ MSGCENTER_TYPE_ID_OFFLINE_LOG_SWITCH = 0xb,\r
+ MSGCENTER_TYPE_ID_LOCATION_GET_INFO = 0x20,\r
+ MSGCENTER_TYPE_ID_LOCATION_START = 0x21,\r
+ MSGCENTER_TYPE_ID_LOCATION_STOP = 0x22,\r
+ MSGCENTER_TYPE_ID_LOCATION_REPORT = 0x23,\r
+ MSGCENTER_TYPE_ID_SPORT_ACTION = 0x27,\r
+ MSGCENTER_TYPE_ID_SPORT_GET_DATA = 0x28,\r
+ MSGCENTER_TYPE_ID_SPORT_REPORT_DATA = 0x29,\r
+ MSGCENTER_TYPE_ID_SET_ONLINELOG_CHANNEL = 0x30,\r
+ MSGCENTER_TYPE_ID_SET_ONLINELOG_LEVEL = 0x31,\r
+ MSGCENTER_TYPE_ID_ONLINELOG_REPORT = 0x33,\r
+ MSGCENTER_TYPE_ID_OTA_INIT = 0x34,\r
+ MSGCENTER_TYPE_ID_OTA_UPDATE = 0x35,\r
+ MSGCENTER_TYPE_ID_ON_FIND_PHONE = 0x36,\r
+ MSGCENTER_TYPE_ID_OFF_FIND_PHONE = 0x37,\r
+ MSGCENTER_TYPE_ID_SLEEP_DATA = 0x38,\r
+ MSGCENTER_TYPE_ID_ON_CAMERA = 0x39,\r
+ MSGCENTER_TYPE_ID_CAMERA_WATCH_EXIT = 0x40,\r
+ MSGCENTER_TYPE_ID_CAMERA_PHONE_EXIT = 0x41,\r
+ MSGCENTER_TYPE_ID_CAMERA_CONNECT_PHONE = 0x42,\r
+ MSGCENTER_TYPE_ID_CAMERA_CONNECT_PHONE_SUCCESS = 0x43,\r
+} msg_center_device_type_id_t;\r
+\r
+// 获取电量\r
+errcode_t msg_center_get_battery_level(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+// 获取存储空间\r
+errcode_t msg_center_get_storage_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+// 获取手表类型\r
+errcode_t msg_center_get_product_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+// 获取语言\r
+errcode_t msg_center_get_language_id(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+// 获取音量\r
+errcode_t msg_center_get_volume_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+// 设置语言\r
+errcode_t msg_center_set_language_id(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+// 设置音量\r
+errcode_t msg_center_set_volume_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+// ota初始化\r
+errcode_t msg_center_ota_init(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+// ota检测和本地升级\r
+errcode_t msg_center_ota_update(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+\r
+errcode_t msg_center_device_heartrate(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+errcode_t msg_center_device_stepdata(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+errcode_t msg_center_device_bloodoxygen(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+\r
+/* LOCATION */\r
+errcode_t msg_center_location_get_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+errcode_t msg_center_location_start(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+errcode_t msg_center_location_stop(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+\r
+/* SPORT */\r
+errcode_t msg_center_sport_action(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+errcode_t msg_center_sport_get_data(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+errcode_t msg_center_sport_report_data(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+\r
+/* 离线日志开关 */\r
+errcode_t msg_center_offline_log_switch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+\r
+/* 查找手机 */\r
+errcode_t msg_center_device_findphone(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+\r
+/* CAMERA */\r
+errcode_t msg_center_camera_exit(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+errcode_t msg_center_camera_online(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+\r
+#if (CONFIG_ONLINE_LOG == 1)\r
+/* 在线日志通道 */\r
+errcode_t msg_center_set_online_log_channel(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+/* 在线日志级数 */\r
+errcode_t msg_center_set_online_log_level(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+#endif\r
+\r
+#ifdef PUBLISH_TEST_DATA\r
+void PublishTestData();\r
+#endif\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+#endif /* MSG_CENTER_DEVICE_H */\r
${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits/gfx_utils
${ROOT_DIR}/open_source/openharmony/base/startup/syspara_lite/include
${ROOT_DIR}/open_source/openharmony/drivers/peripheral/format/interfaces/include
- ${ROOT_DIR}/application/wearable/nativeapp/nativeui/main/include/dial
)
set(SOURCES
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved.
+ * Description: ota upgrade handle.
+ * This file should be changed only infrequently and with great care.
+ */
+#include <stdio.h>
+#include "securec.h"
+#include "msg_center.h"
+#include "msg_center_protocol.h"
+#include "msg_center_cmd.h"
+#include "wearable_log.h"
+#include "common_def.h"
+#include "dial_market.h"
+#include "parameter.h"
+#include "main/dial/WatchInterface.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+errcode_t msg_center_dial_market_get_sys_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+ errcode_t ret = ERRCODE_SUCC;
+ watch_sys_info sys;
+ bool op_ret = false;
+
+ /* 组装信息 */
+ strcpy_s(sys.chip_platform, MAX_CHIP_PLAT_LEN, "hisi");
+ strcpy_s(sys.chip_model, MAX_CHIP_MODEL_LEN, "3321");
+ char *os_version = GetOsName();
+ if (os_version == NULL) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "os_version is NULL\r\n");
+ return ERRCODE_FAIL;
+ }
+ strcpy_s(sys.os_version, MAX_OS_LEN, os_version); // "OpenHarmony-5.0.1.115"
+
+ char *api_level = GetSdkApiLevel();
+ if (api_level == NULL) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "api_level is NULL\r\n");
+ free(os_version);
+ return ERRCODE_FAIL;
+ }
+ strcpy_s(sys.api_level, MAX_API_LEVEL_LEN, api_level); // "13"
+
+ op_ret = GetWatchSystemInfo(&sys);
+ if (op_ret == false) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "GetWatchSystemInfo fail\r\n");
+ free(os_version);
+ free(api_level);
+ return ERRCODE_FAIL;
+ }
+
+ ret = msg_center_send_data(cmd_id, type, &sys, sizeof(watch_sys_info));
+ if (ret != ERRCODE_SUCC) {
+ free(os_version);
+ free(api_level);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send data fail, ret = %d\r\n", ret);
+ return ERRCODE_FAIL;
+ }
+
+ free(os_version);
+ free(api_level);
+ return ERRCODE_SUCC;
+}
+
+errcode_t msg_center_dial_market_get_dev_cap(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+ errcode_t ret = ERRCODE_SUCC;
+ watch_dev_cap_info cap;
+ bool op_ret = false;
+
+ op_ret = GetWatchCapability(&cap);
+ if (op_ret == false) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "GetWatchCapability fail\r\n");
+ return ERRCODE_FAIL;
+ }
+
+ ret = msg_center_send_data(cmd_id, type, &cap, sizeof(watch_dev_cap_info));
+ if (ret != ERRCODE_SUCC) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send data fail, ret = %d\r\n", ret);
+ return ERRCODE_FAIL;
+ }
+
+ return ERRCODE_SUCC;
+}
+
+errcode_t msg_center_dial_market_get_one_watch_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+ errcode_t ret = ERRCODE_SUCC;
+ uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);
+ uint32_t uuid = *(uint32_t *)tlv_payload;
+ bool op_ret = false;
+ watch_dial_info info;
+
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "uuid = %d\r\n", uuid);
+ op_ret = GetWatchFaceInfo(uuid, &info);
+ if (op_ret == false) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "GetWatchFaceInfo fail\r\n");
+ (void)memset_s(&info, sizeof(watch_dial_info), 0, sizeof(watch_dial_info));
+ info.uuid = uuid;
+ (void)msg_center_send_data(cmd_id, type, &info, sizeof(watch_dial_info));
+ return ERRCODE_FAIL;
+ }
+
+ ret = msg_center_send_data(cmd_id, type, &info, sizeof(watch_dial_info));
+ if (ret != ERRCODE_SUCC) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send data fail, ret = %d\r\n", ret);
+ return ERRCODE_FAIL;
+ }
+
+ return ERRCODE_SUCC;
+}
+
+errcode_t msg_center_dial_market_install_watch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+ errcode_t ret = ERRCODE_SUCC;
+ uint32_t uuid = 0;
+ bool op_ret = false;
+ uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);
+ uint16_t payload_len = usr_len - tl_len;
+ uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);
+
+ char *path = (char *)malloc(payload_len + 1);
+ if (path == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "malloc failed.\r\n");
+ return ERRCODE_FAIL;
+ }
+
+ (void)memcpy_s(path, payload_len, tlv_payload, payload_len);
+ path[payload_len] = '\0';
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "path = %s\r\n", path);
+
+ op_ret = GetUuidByPath(path, &uuid);
+ if (op_ret == false) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "install fail.\r\n");
+ free(path);
+ return ERRCODE_FAIL;
+ }
+
+ ret = msg_center_send_data(cmd_id, type, &uuid, sizeof(uint32_t));
+ if (ret != ERRCODE_SUCC) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send data fail, ret = %d\r\n", ret);
+ free(path);
+ return ERRCODE_FAIL;
+ }
+
+ free(path);
+ return ERRCODE_SUCC;
+}
+
+errcode_t msg_center_dial_market_uninstall_watch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+ errcode_t ret = ERRCODE_SUCC;
+ bool op_ret = false;
+ uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);
+ uint32_t uuid = *(uint32_t *)tlv_payload;
+
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "uuid = %d\r\n", uuid);
+ op_ret = UninstallWatch(uuid);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "uninstall ret : %d\r\n", op_ret);
+
+ ret = msg_center_send_data(cmd_id, type, &op_ret, sizeof(uint8_t));
+ if (ret != ERRCODE_SUCC) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send data fail, ret = %d\r\n", ret);
+ return ERRCODE_FAIL;
+ }
+
+ return ERRCODE_SUCC;
+}
+
+errcode_t msg_center_dial_market_set_watch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+ errcode_t ret = ERRCODE_SUCC;
+ bool op_ret = false;
+ uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);
+ uint32_t uuid = *(uint32_t *)tlv_payload;
+
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "uuid = %d\r\n", uuid);
+ op_ret = SetCurrentWatchFace(uuid);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "set_current_watch_face ret : %d\r\n", op_ret);
+
+ ret = msg_center_send_data(cmd_id, type, &op_ret, sizeof(uint8_t));
+ if (ret != ERRCODE_SUCC) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send data fail, ret = %d\r\n", ret);
+ return ERRCODE_FAIL;
+ }
+
+ return ERRCODE_SUCC;
+}
+
+errcode_t msg_center_dial_market_get_all_watch_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+ errcode_t ret = ERRCODE_SUCC;
+ watch_dial_info *info = nullptr;
+ uint8_t watch_num = 0;
+ bool op_ret = false;
+
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "get_all_watch_info\r\n");
+ op_ret = GetAllWatchFaceInfo(&info, &watch_num);
+ if (op_ret == false) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "GetAllWatchFaceInfo fail\r\n");
+ watch_num = 0;
+ (void)msg_center_send_data(cmd_id, type, info, sizeof(watch_dial_info) * watch_num);
+ return ERRCODE_FAIL;
+ }
+
+ ret = msg_center_send_data(cmd_id, type, info, sizeof(watch_dial_info) * watch_num);
+ if (ret != ERRCODE_SUCC) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send data fail, ret = %d\r\n", ret);
+ free(info);
+ return ERRCODE_FAIL;
+ }
+
+ free(info);
+ return ERRCODE_SUCC;
+}
+
+errcode_t msg_center_dial_market_get_cur_watch_info(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+ errcode_t ret = ERRCODE_SUCC;
+ bool op_ret = false;
+ watch_dial_info info;
+
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "get_cur_watch_info\r\n");
+ op_ret = GetCurrentWatchFaceInfo(&info);
+ if (op_ret == false) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "GetCurrentWatchFaceInfo fail\r\n");
+ (void)memset_s(&info, sizeof(watch_dial_info), 0, sizeof(watch_dial_info));
+ info.uuid = 0xFFFFFFFF; // 异常时用全F的uuid表示
+ (void)msg_center_send_data(cmd_id, type, &info, sizeof(watch_dial_info));
+ return ERRCODE_FAIL;
+ }
+
+ ret = msg_center_send_data(cmd_id, type, &info, sizeof(watch_dial_info));
+ if (ret != ERRCODE_SUCC) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send data fail, ret = %d\r\n", ret);
+ return ERRCODE_FAIL;
+ }
+
+ return ERRCODE_SUCC;
+}
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
--- /dev/null
+
+#include "msg_center_protocol.h"
+#include "msg_center_cmd.h"
+#include "ohos_init.h"
+#include "dial_market.h"
+
+namespace OHOS {
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static const msg_center_cmd_map_t g_msg_center_dial_market_tbl[] = {
+ { MSGCENTER_CMD_DIAL_MARKET, MSGCENTER_TYPE_ID_DM_GET_SYS_INFO, msg_center_dial_market_get_sys_info},
+ { MSGCENTER_CMD_DIAL_MARKET, MSGCENTER_TYPE_ID_DM_GET_DEV_CAP, msg_center_dial_market_get_dev_cap},
+ { MSGCENTER_CMD_DIAL_MARKET, MSGCENTER_TYPE_ID_DM_GET_ONE_WATCH_INFO, msg_center_dial_market_get_one_watch_info},
+ { MSGCENTER_CMD_DIAL_MARKET, MSGCENTER_TYPE_ID_DM_INSTALL_WATCH, msg_center_dial_market_install_watch},
+ { MSGCENTER_CMD_DIAL_MARKET, MSGCENTER_TYPE_ID_DM_UNINSTALL_WATCH, msg_center_dial_market_uninstall_watch},
+ { MSGCENTER_CMD_DIAL_MARKET, MSGCENTER_TYPE_ID_DM_SET_WATCH, msg_center_dial_market_set_watch},
+ { MSGCENTER_CMD_DIAL_MARKET, MSGCENTER_TYPE_ID_DM_GET_ALL_WATCH_INFO, msg_center_dial_market_get_all_watch_info},
+ { MSGCENTER_CMD_DIAL_MARKET, MSGCENTER_TYPE_ID_DM_GET_CUR_WATCH_INFO, msg_center_dial_market_get_cur_watch_info},
+};
+
+errcode_t msg_center_dial_market_dispatch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+ uint8_t tbl_size = sizeof(g_msg_center_dial_market_tbl) / sizeof(g_msg_center_dial_market_tbl[0]);
+ uint8_t i;
+ for (i = 0; i < tbl_size; i++) {
+ msg_center_cmd_map_t *item = (msg_center_cmd_map_t *)&g_msg_center_dial_market_tbl[i];
+ if ((item->type == type) && (item->handler != NULL)) {
+ item->handler(cmd_id, type, usr_data, usr_len);
+ return ERRCODE_SUCC;
+ }
+ }
+ return ERRCODE_NOT_SUPPORT;
+}
+
+void dial_market_init(void)
+{
+ msg_center_register_cmd(MSGCENTER_CMD_DIAL_MARKET, msg_center_dial_market_dispatch);
+}
+
+APP_FEATURE_INIT_PRI(dial_market_init, LAYER_INIT_LEVEL_4);
+#ifdef __cplusplus
+}
+#endif
+} // namespace OHOS
\ No newline at end of file
${ROOT_DIR}/middleware/services/gui/uikit/proprietary/src/ui/frameworks/components_ext
${ROOT_DIR}/open_source/openharmony/drivers/peripheral/display/interfaces/include
${ROOT_DIR}/application/wearable/service/xiaodu_voice
+ ${ROOT_DIR}/application/wearable/service/watch_setting_msg/include
${ROOT_DIR}/application/wearable/service/xiaodu_navi_vector
${ROOT_DIR}/application/wearable/service/xiaodu_navi_vector/libs
${ROOT_DIR}/application/wearable/service/msg_center/src/notify/ketinput/include
+ ${ROOT_DIR}/application/wearable/nativeapp/nativelauncher/include
+ ${ROOT_DIR}/application/wearable/nativeabilityfwk/include
+ ${ROOT_DIR}/open_source/openharmony/foundation/multimedia/player/interfaces/kits
)
set(SOURCES
)
set(PRIVATE_HEADER
- ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/alarmclockmanage/include
- ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/alarmclocktimerconfig/include
- ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/alarm/include
- ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/callerlog/include
- ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/phoneservice/include
- ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/main/include
- ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/player/include
- ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/bluetooth/include
- ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/key/include
${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativelauncher/include
${CMAKE_CURRENT_SOURCE_DIR}/../../ohos_deps
${ROOT_DIR}/middleware/services/gui/uikit/proprietary/include
${ROOT_DIR}/include/middleware/services/bts/common
${ROOT_DIR}/application/auto_ota
${ROOT_DIR}/application/wearable/service/xiaodu_navi_vector
+ ${ROOT_DIR}/open_source/openharmony/third_party/cJSON
+ ${ROOT_DIR}/application/wearable/service/device_msg
${ROOT_DIR}/application/wearable/service/msg_center/src/notify/ketinput/include
${ROOT_DIR}/application/wearable/nativeapp/nativelauncher/include
${ROOT_DIR}/application/wearable/nativeabilityfwk/include
- ${ROOT_DIR}/application/wearable/nativeapp/nativeui/alarm/include
- ${ROOT_DIR}/application/wearable/nativeapp/nativeui/key/include
- ${ROOT_DIR}/application/wearable/nativeapp/nativeui/alarmclockmanage/include
- ${ROOT_DIR}/application/wearable/nativeapp/nativeui/alarmclocktimerconfig/include
- ${ROOT_DIR}/application/wearable/nativeapp/nativeui/main/include
- ${ROOT_DIR}/application/wearable/nativeapp/nativeui/callerlog/include
- ${ROOT_DIR}/application/wearable/nativeapp/nativeui/phoneservice/include
- ${ROOT_DIR}/application/wearable/nativeapp/nativeui/makephone/include
- ${ROOT_DIR}/application/wearable/nativeapp/nativeui/player/include
- ${ROOT_DIR}/application/wearable/nativeapp/nativeui/applist/include
${ROOT_DIR}/open_source/openharmony/foundation/multimedia/player/interfaces/kits
+
)
if("JS_ENABLE" IN_LIST DEFINES)
${CMAKE_CURRENT_SOURCE_DIR}/src/notify/makephone_notification.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/common/msg_center_common.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/common/msg_center_utils.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/common/msg_center_self_cmd.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/notify/ketinput/src/NotifyOnKeyListener.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/pairing_notification.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/phone_msg_notification.cpp
)
else()
set(SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/src/msg_center_customer.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/msg_center_cmd.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/src/msg_center_self_cmd.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/notify/alarm_notification.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/notify/makephone_notification.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/notify/ketinput/src/NotifyOnKeyListener.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/pairing_notification.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/phone_msg_notification.cpp
)
endif()
MSGCENTER_CMD_WATCH_CONNECT = 0x8,\r
MSGCENTER_CMD_APP_STORE = 0x9,\r
MSGCENTER_CMD_DIAL_MARKET = 0xa,\r
+ MSGCENTER_CMD_PHONE_MSG = 0xb, // 增加消息通知;\r
+ MSGCENTER_CMD_DEVICE = 0xc,\r
MSGCENTER_CMD_MAX\r
} msg_center_cmd_id_t;\r
\r
#include "components/ui_view_group.h"
#include "alarm_notification.h"
#include "makephone_notification.h"
+#include "phone_msg_notification.h"
constexpr uint16_t HALF_SCREEN = 2;
constexpr int16_t NOTIFY_PRIORITY_DEFAULT = 4;
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: phone message notification \r
+ * Author: \r
+ * Create: 2025-04-25\r
+ */\r
+\r
+#ifndef PHONE_MSG_NOTIFICATION_H\r
+#define PHONE_MSG_NOTIFICATION_H\r
+\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_label_button_ext.h"\r
+#include "graphic_timer.h"\r
+#include <unordered_map>\r
+\r
+struct PhoneMsg {\r
+ std::string appName;\r
+ std::string msgTitle;\r
+ std::string msgContent;\r
+};\r
+\r
+namespace OHOS {\r
+class PhoneMsgView {\r
+public:\r
+ static UIViewGroup *CreatePhoneMsgView();\r
+ static void FreePhoneMsgView(void);\r
+ static void UpDatePhoneMsg(std::string appName, std::string titile, std::string content);\r
+ static void StartPhoneMsgTimer(int32_t interval);\r
+ static void DisablePhoneMsgTimer();\r
+ static const uint32_t notifyTime = 5000;\r
+\r
+private:\r
+ static UIViewGroup *phoneMsgView_;\r
+ static UILabel *appNameLabel_;\r
+ static UILabel *titleLabel_;\r
+ static UILabel *contentLabel_;\r
+ static GraphicTimer *phoneMsgNotifyStop_;\r
+ static PhoneMsg phoneMsg_;\r
+ static UILabelButtonExt *cancelButton_;\r
+};\r
+\r
+class PhoneMsgViewEventListener : public OHOS::UIView::OnClickListener,\r
+ public OHOS::UIView::OnLongPressListener,\r
+ public OHOS::UIView::OnTouchListener,\r
+ public OHOS::UIView::OnDragListener {\r
+public:\r
+ PhoneMsgViewEventListener();\r
+ virtual ~PhoneMsgViewEventListener();\r
+ static PhoneMsgViewEventListener *GetInstance(void);\r
+ bool OnDrag(UIView& view, const DragEvent& event) override;\r
+ bool OnDragEnd(OHOS::UIView& view, const OHOS::DragEvent& event) override;\r
+ bool OnClick(OHOS::UIView& view, const OHOS::ClickEvent& event) override;\r
+ bool OnPress(OHOS::UIView& view, const OHOS::PressEvent& event) override\r
+ {\r
+ return true;\r
+ }\r
+ bool OnLongPress(OHOS::UIView& view, const OHOS::LongPressEvent& event) override\r
+ {\r
+ return true;\r
+ }\r
+ bool OnRelease(OHOS::UIView& view, const OHOS::ReleaseEvent& event) override\r
+ {\r
+ return true;\r
+ }\r
+\r
+ bool OnDragStart(OHOS::UIView& view, const OHOS::DragEvent& event) override\r
+ {\r
+ return true;\r
+ }\r
+};\r
+}; // namespace OHOS\r
+\r
+#endif /* PHONE_MSG_NOTIFICATION_H */\r
--- /dev/null
+#include "msg_center_protocol.h"
+#include "msg_center_cmd.h"
+#include "ohos_init.h"
+#include "msg_center_common.h"
+namespace OHOS {
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static const msg_center_cmd_map_t g_msg_center_self_cmd_tbl[] = {
+#ifdef JS_ENABLE
+ { MSGCENTER_CMD_PING, MSGCENTER_TYPE_ID_PING_REC, msg_center_ping_rec},
+ { MSGCENTER_CMD_PING, MSGCENTER_TYPE_ID_PING_RSP, NULL},
+#endif
+};
+
+errcode_t msg_center_self_cmd_type(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)
+{
+ uint8_t tbl_size = sizeof(g_msg_center_self_cmd_tbl) / sizeof(g_msg_center_self_cmd_tbl[0]);
+ uint8_t i;
+ for (i = 0; i < tbl_size; i++) {
+ msg_center_cmd_map_t *item = (msg_center_cmd_map_t *)&g_msg_center_self_cmd_tbl[i];
+ if ((item->type == type) && (item->handler != NULL)) {
+ item->handler(cmd_id, type, usr_data, usr_len);
+ return ERRCODE_SUCC;
+ }
+ }
+ return ERRCODE_NOT_SUPPORT;
+}
+
+void xiaodu_self_cmd_init(void)
+{
+ msg_center_register_cmd(MSGCENTER_CMD_PING, msg_center_self_cmd_type);
+}
+
+#ifdef JS_ENABLE
+APP_FEATURE_INIT_PRI(xiaodu_self_cmd_init, LAYER_INIT_LEVEL_4);
+#endif
+#ifdef __cplusplus
+}
+#endif
+} // namespace OHOS
\ No newline at end of file
#include "wearable_log.h"
#include "service_id_define.h"
#include "broadcast_service.h"
-#include "AlarmClockModel.h"
-#include "AlarmPopUpPresenter.h"
-#include "CallerLogModel.h"
+#include "alarm/AlarmClockModel.h"
+#include "alarm/AlarmPopUpPresenter.h"
+#include "callerlog/CallerLogModel.h"
#include "notification_manager.h"
#include "NativeAbility.h"
#include "abilityms_slite_client.h"
#include "baidumap.h"
#include "common_def.h"
#include "keyinput.h"
-#include "KeyInputListener.h"
-#include "VolumeSettingView.h"
-#include "VolumeSettingPresenter.h"
-#include "VolumeSettingView.h"
+#include "key/KeyInputListener.h"
+#include "main/VolumeSettingView.h"
+#include "main/VolumeSettingPresenter.h"
+#include "main/VolumeSettingView.h"
+#include "cJSON.h"
+#include "heartrate/HeartModel.h"
+#include "device_location.h"
namespace OHOS {
#ifdef __cplusplus
extern "C" {
#endif
+extern uint8_t g_bloodoxygen;
+extern uint16_t g_heartrate;
+extern uint32_t g_stepdata;
+extern uint32_t g_distance;
+extern LocationInfo_t g_locationInfo;
+
/* 订阅事件设定优先级 */
const PriorityMapper PRI_MAPPER[] = {
{TOPIC_EVENT_ALARM_RING, PRIORITY_TWO},
{TOPIC_EVENT_NEXTDAY_UPDATE, PRIORITY_TWO},
- {TOPIC_EVENT_BLE_TRANSMIT,PRIORITY_ONE},
{TOPIC_EVENT_HFP_INCOMMING, PRIORITY_ONE},
{TOPIC_EVENT_HFP_FINISHED, PRIORITY_ONE},
{TOPIC_EVENT_HFP_PHONE_ACTIVE, PRIORITY_ONE},
{TOPIC_EVENT_HFP_WATCH_ACTIVE, PRIORITY_ONE},
{TOPIC_EVENT_HFP_WATCH_TO_PHONE, PRIORITY_ONE},
{TOPIC_EVENT_HFP_PHONE_TO_WATCH, PRIORITY_ONE},
- {TOPIC_EVENT_DEVICE_BIND, PRIORITY_ONE},
- // {TOPIC_EVENT_DEVICE_UNBIND, PRIORITY_TWO},
- // {TOPIC_EVENT_DEVICE_UNBINDING_REQUEST, PRIORITY_TWO},
-
- };
+ {TOPIC_DEMO_ALL_MSG, PRIORITY_TWO},
+ {TOPIC_EVENT_STEPDATA_UPDATE, PRIORITY_TWO},
+ {TOPIC_EVENT_HEARTRATE_UPDATA, PRIORITY_TWO},
+ {TOPIC_EVENT_BLOODOXYGEN_UPDATA, PRIORITY_TWO},
+ {TOPIC_EVENT_SPORT_DISTANCE, PRIORITY_TWO},
+ {TOPIC_EVENT_LOCATION, PRIORITY_TWO},
+};
bool g_pressFlag = false;
bool g_longPressFlag = false;
MsgCenterSubscribeTopic(TOPIC_EVENT_HFP_FINISHED);
MsgCenterSubscribeTopic(TOPIC_EVENT_HFP_PHONE_TO_WATCH);
MsgCenterSubscribeTopic(TOPIC_EVENT_HFP_WATCH_TO_PHONE);
- MsgCenterSubscribeTopic(TOPIC_EVENT_DEVICE_BIND);
+ MsgCenterSubscribeTopic(TOPIC_EVENT_STEPDATA_UPDATE);
+ MsgCenterSubscribeTopic(TOPIC_EVENT_HEARTRATE_UPDATA);
+ MsgCenterSubscribeTopic(TOPIC_EVENT_BLOODOXYGEN_UPDATA);
+ MsgCenterSubscribeTopic(TOPIC_EVENT_SPORT_DISTANCE);
+ MsgCenterSubscribeTopic(TOPIC_EVENT_LOCATION);
}
static OHOS::UIViewGroup* ShowAlarmNotify(void)
return OHOS::CreateMultiplePhoneView();
}
-
-/*显示绑定通知*/
-static OHOS::UIViewGroup* showDeviceBindingNotify(void)
+static OHOS::UIViewGroup* ShowMsgNotify(void)
{
- return OHOS::CreateDeviceBindingView();
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ShowMsgNotify");
+ return OHOS::PhoneMsgView::CreatePhoneMsgView();
}
-/*显示解绑通知*/
-static OHOS::UIViewGroup* showDeviceUnBindingNotify(void)
-{
- return OHOS::CreateDeviceUnBindingView();
-}
-
-/*显示解除绑定请求(与新设备连接)通知*/
-static OHOS::UIViewGroup* showDeviceUnbindingRequestNotify(void)
-{
- return OHOS::CreateDeviceUnbindingRequestGroupView();
-}
-static OHOS::UIViewGroup* showtransmitNotify(void)
-{
- return OHOS::transmittingShow();
-}
void MsgCenterNotifyAlarmProc(const Topic topic, Request* req)
{
unused(req);
}
}
-void MsgCenterNotifyDeviceBindProc(const Topic topic, Request* req)
+void MsgCenterNotifyMsgWatchProc(const Topic topic, Request* req)
{
- //unused(req);
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyBindProc Bind!");
- const power_display_svr_api_t *display_api = power_display_svr_get_api();
- if (display_api->get_screen_state() != SCREEN_ON)
- {
- display_api->turn_on_screen();
+ std::string msgContent((char *)(req->data), req->len);
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyMsgWatchProc msgContent %s\r\n", msgContent.c_str());
+ cJSON *msgJson = cJSON_Parse(msgContent.c_str());
+ if (msgJson == NULL) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "phone msg_result cJSON_Parse, fail = %p\r\n", msgJson);
}
- uint8_t* data=(uint8_t*)req->data;
- uint8_t len_name = req->len;
- char devname[len_name];
- if(data!=NULL && req->len>=2)
- {
- switch(data[0])
- {
- case DEVICEBIND:
- NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
- len_name = req->len-2;
- memset(devname,0,len_name);
- if(len_name > 0)
- {
- memcpy(devname,(char *)req->data+2,len_name);
- PairingViewEventListener::GetInstance().SetDeviceName(devname);
- }else{
- PairingViewEventListener::GetInstance().SetDeviceName(NULL);
- }
- NotificationManager::GetInstance()->ShowNotify(showDeviceBindingNotify, (uint16_t)topic, true);
- break;
- case DEVICEUNBIND:
-
- NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
- len_name = req->len-2;
- memset(devname,0,len_name);
- if(len_name > 0)
- {
- memcpy(devname,(char *)req->data+2,len_name);
- // printf("devname:%s\r\n",devname);
- PairingViewEventListener::GetInstance().SetDeviceName(devname);
- }else{
- PairingViewEventListener::GetInstance().SetDeviceName(NULL);
- }
- NotificationManager::GetInstance()->ShowNotify(showDeviceUnBindingNotify, (uint16_t)topic, true);
- break;
- case DeviceUnBindingRequest:
- NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
- NotificationManager::GetInstance()->ShowNotify(showDeviceUnbindingRequestNotify, (uint16_t)topic, true);
- break;
- case SHUTDOWN:
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, " SHUTDOWN");
- set_lowpower_falg(3);
- if (NotificationManager::GetInstance()->HasNotifyShowing())
- NotificationManager::GetInstance()->StopNotify();
-
- NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
-
- NotificationManager::GetInstance()->ShowNotify(showlowpowerNotify, (uint16_t)topic, true);
- //low_power_play(true);
- break;
- case REBOOT:
- set_lowpower_falg(4);
- if (NotificationManager::GetInstance()->HasNotifyShowing())
- NotificationManager::GetInstance()->StopNotify();
-
- NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
- NotificationManager::GetInstance()->ShowNotify(showlowpowerNotify, (uint16_t)topic, true);
- //low_power_play(false);
- break;
-
- default:
- break;
- }
-
+ cJSON *appNameJson = cJSON_GetObjectItem(msgJson, "appName");
+ cJSON *packageNameJson = cJSON_GetObjectItem(msgJson, "packageName");
+ cJSON *titleJson = cJSON_GetObjectItem(msgJson, "title");
+ cJSON *contentJson = cJSON_GetObjectItem(msgJson, "content");
+ char *appName = appNameJson->valuestring;
+ char *packageName = packageNameJson->valuestring;
+ char *title = titleJson->valuestring;
+ char *content = contentJson->valuestring;
+ if (msgJson) {
+ cJSON_Delete(msgJson);
+ }
+ PhoneMsgView::UpDatePhoneMsg(appName, title, content);
+ if (CheckPriority(topic)) {
+ NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
+ NotificationManager::GetInstance()->ShowNotify(ShowMsgNotify, static_cast<uint16_t>(topic), true);
}
-
}
-void MsgCenterNotifybleTransmit(const Topic topic, Request* req)
+
+void MsgCenterNotifyHeartRateProc(const Topic topic, Request* req)
{
unused(topic);
- uint8_t* data=(uint8_t*)req->data;
-
-
- if(data[0]==TRANS_FREE)
- {
- if(transmittingISShow())
- NotificationManager::GetInstance()->StopNotify();
+ if(req && req->data){
+ HeartDatas* heart_data = (HeartDatas*)req->data;
+ g_heartrate = heart_data->perSec;
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyHeartRateProc per heartrate: %d\n", g_heartrate);
}
- else if (data[0]==IS_NEED_CAT1_OTA)
- {
-
- NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
+}
- NotificationManager::GetInstance()->ShowNotify(showCat1UpdataNotify, (uint16_t)topic, true);
+void MsgCenterNotifyStepDataProc(const Topic topic, Request* req)
+{
+ unused(topic);
+ uint32_t step = 0;
+ if(req && req->data){
+ step = *(uint32_t*)req->data;
+ g_stepdata += step;
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyStepDataProc step:%d, totalStep:%d\n", step, g_stepdata);
}
- else if (data[0]==FILE_IS_DONE)
- {
- set_transmittingShow_falg(data[0]);
+}
+
+void MsgCenterNotifyBloodOxygenProc(const Topic topic, Request* req)
+{
+ unused(topic);
+ if(req && req->data){
+ g_bloodoxygen = *(uint8_t*)req->data;
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyBloodOxygenProc bloodoxygen:%d\n", g_bloodoxygen);
}
- else
- {
- set_transmittingShow_falg(data[0]);
-
- NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
+}
- NotificationManager::GetInstance()->ShowNotify(showtransmitNotify, (uint16_t)topic, true);
+void MsgCenterNotifyDistanceProc(const Topic topic, Request* req)
+{
+ unused(topic);
+ uint32_t distance = 0;
+ if(req && req->data){
+ distance = *(uint32_t*)req->data;
+ g_distance += distance;
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyDistanceProc distance:%d\n", g_distance);
}
- // unused(req);
+}
+void MsgCenterNotifyLocationProc(const Topic topic, Request* req)
+{
+ unused(topic);
+ if(req && req->data){
+ LocationInfo_t* location = (LocationInfo_t*)req->data;
+ g_locationInfo.latitude_ = location->latitude_;
+ g_locationInfo.longitude_ = location->longitude_;
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "latitude_:%d,longitude_:%d\n", g_locationInfo.latitude_, g_locationInfo.longitude_);
+ }
}
+
/* 订阅事件通知逻辑可定制 */
static MsgCenterNotifyTable g_msgCenterNotifyTable[] = {
{TOPIC_EVENT_ALARM_RING, MsgCenterNotifyAlarmProc},
{TOPIC_EVENT_HFP_WATCH_TO_PHONE, MsgCenterNotifyHfpPhoneProc},
{TOPIC_EVENT_HFP_WATCH_ACTIVE, MsgCenterNotifyHfpWatchProc},
{TOPIC_EVENT_HFP_PHONE_TO_WATCH, MsgCenterNotifyHfpWatchProc},
-{TOPIC_EVENT_BLE_TRANSMIT, MsgCenterNotifybleTransmit},
-
- {TOPIC_EVENT_DEVICE_BIND, MsgCenterNotifyDeviceBindProc},
- // {TOPIC_EVENT_DEVICE_UNBIND, MsgCenterNotifyDeviceUnBindProc},
- // {TOPIC_EVENT_DEVICE_UNBINDING_REQUEST, MsgCenterNotifyDeviceUnBindingRequestProc},
-
- };
+ {TOPIC_DEMO_ALL_MSG, MsgCenterNotifyMsgWatchProc},
+ {TOPIC_EVENT_HEARTRATE_UPDATA, MsgCenterNotifyHeartRateProc},
+ {TOPIC_EVENT_STEPDATA_UPDATE, MsgCenterNotifyStepDataProc},
+ {TOPIC_EVENT_BLOODOXYGEN_UPDATA, MsgCenterNotifyBloodOxygenProc},
+ {TOPIC_EVENT_SPORT_DISTANCE, MsgCenterNotifyDistanceProc},
+ {TOPIC_EVENT_LOCATION, MsgCenterNotifyLocationProc},
+};
static MsgCenterNotifyTable *MsgCenterGetNotifyTblCb(uint8_t idx)
{
{
ElementName* topAbility = OHOS::AbilityMsClient::GetInstance().GetTopAbility();
if (topAbility == nullptr) {
- WEARABLE_LOGE(HILOG_MODULE_AAFWK, "topAbility is null");
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "topAbility is null");
return;
}
if (strcmp(topAbility->bundleName, bundleName) != 0) {
- WEARABLE_LOGE(HILOG_MODULE_AAFWK, "%s is not top active", bundleName);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "%s is not top active", bundleName);
FreeElement(topAbility);
return;
}
#include "notification_manager.h"\r
#include "wearable_log.h"\r
#include "UiConfig.h"\r
-#include "AlarmPopUpPresenter.h"\r
+#include "alarm/AlarmPopUpPresenter.h"\r
#include "components/ui_image_view.h"\r
#include "components/ui_label.h"\r
\r
{\r
(void)data;\r
NotificationManager::GetInstance()->StopNotify();\r
+ AlarmPopUpPresenter::GetInstance()->DelayAlarmRing();\r
}\r
\r
void StartAlarmTimer(AlarmTimerType type, int32_t interval)\r
#include "common/key_code.h"
#include "AppViewIDs.h"
#include "View.h"
-#include "KeyInputListener.h"
-#include "VolumeSettingView.h"
-#include "VolumeSettingPresenter.h"
-#include "VolumeSettingView.h"
+#include "key/KeyInputListener.h"
+#include "main/VolumeSettingView.h"
+#include "main/VolumeSettingPresenter.h"
+#include "main/VolumeSettingView.h"
#include "wearable_log.h"
#include "UiConfig.h"
#include "dock/input_device.h"
#include "notification_manager.h"
-#include "AlarmPopUpPresenter.h"
-#include "CallerLogModel.h"
-#include "MainCallingPresenter.h"
-#include "ApplistModel.h"
+#include "alarm/AlarmPopUpPresenter.h"
+#include "callerlog/CallerLogModel.h"
+#include "makephone/MainCallingPresenter.h"
+#include "applist/ApplistModel.h"
namespace OHOS {
static bool IsNotifyCallStatus()
{
\r
#include "notification_manager.h"\r
#include "wearable_log.h"\r
-#include "CallerLogModel.h"\r
-#include "PhoneService.h"\r
+#include "callerlog/CallerLogModel.h"\r
+#include "phoneservice/PhoneService.h"\r
#include "cmsis_os.h"\r
#include "UiConfig.h"\r
#include "components/ui_image_view.h"\r
#include "components/ui_label.h"\r
#include "common/image_cache_manager.h"\r
-#include "VolumeSettingView.h"\r
-#include "VolumeSettingPresenter.h"\r
+#include "main/VolumeSettingView.h"\r
+#include "main/VolumeSettingPresenter.h"\r
#include "ui_resource_image.h"\r
\r
namespace OHOS {\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: phone message notification\r
+ * Create: 2025-04-25\r
+ */\r
+\r
+#include "notification_manager.h"\r
+#include "ohos_timer.h"\r
+#include "wearable_log.h"\r
+#include <string>\r
+#include "main/MessageModel.h"\r
+\r
+namespace OHOS {\r
+// 三方应用名\r
+static const uint32_t APP_NAME_POS_X = 180;\r
+static const uint32_t APP_NAME_POS_Y = 82;\r
+static const uint32_t APP_NAME_WIDTH = 200;\r
+static const uint32_t APP_NAME_HEIGHT = 60;\r
+// 三方消息主题\r
+static const uint32_t MSG_TITLE_POS_X = 81;\r
+static const uint32_t MSG_TITLE_POS_Y = 122;\r
+static const uint32_t MSG_TITLE_WIDTH = 409;\r
+static const uint32_t MSG_TITLE_HEIGHT = 83;\r
+// 三方消息内容\r
+static const uint32_t MSG_CONTENT_POS_X = 78;\r
+static const uint32_t MSG_CONTENT_POS_Y = 176;\r
+static const uint32_t MSG_CONTENT_WIDTH = 457;\r
+static const uint32_t MSG_CONTENT_HEIGHT = 269;\r
+// 取消通知\r
+static const uint32_t CANCEL_BUTTON_POS_X = 150;\r
+static const uint32_t CANCEL_BUTTON_POS_Y = 323;\r
+static const uint32_t CANCEL_BUTTON_WIDTH = 165;\r
+static const uint32_t CANCEL_BUTTON_HEIGHT = 44;\r
+\r
+// 设置字体大小\r
+static const uint32_t APP_NAME_FONT_SIZE = 20;\r
+static const uint32_t MSG_TITLE_FONT_SIZE = 20;\r
+static const uint32_t MSG_CONTENT_FONT_SIZE = 40;\r
+\r
+UIViewGroup *PhoneMsgView::phoneMsgView_ = nullptr;\r
+UILabel *PhoneMsgView::appNameLabel_ = nullptr;\r
+UILabel *PhoneMsgView::titleLabel_ = nullptr;\r
+UILabel *PhoneMsgView::contentLabel_ = nullptr;\r
+GraphicTimer *PhoneMsgView::phoneMsgNotifyStop_ = nullptr;\r
+PhoneMsg PhoneMsgView::phoneMsg_;\r
+UILabelButtonExt *PhoneMsgView::cancelButton_ = nullptr;\r
+\r
+void PhoneMsgStopNotifyCallback(void *data)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMsgStopNotifyCallback");\r
+ (void)data;\r
+ NotificationManager::GetInstance()->StopNotify();\r
+}\r
+\r
+void PhoneMsgView::StartPhoneMsgTimer(int32_t interval)\r
+{\r
+ uint32_t tick = GetOSTick(interval);\r
+ phoneMsgNotifyStop_ = new GraphicTimer(tick, PhoneMsgStopNotifyCallback, nullptr, true);\r
+ phoneMsgNotifyStop_->Start();\r
+}\r
+\r
+void PhoneMsgView::DisablePhoneMsgTimer()\r
+{\r
+ if (phoneMsgNotifyStop_ != nullptr) {\r
+ phoneMsgNotifyStop_->Stop();\r
+ delete phoneMsgNotifyStop_;\r
+ phoneMsgNotifyStop_ = nullptr;\r
+ }\r
+}\r
+\r
+UIViewGroup *PhoneMsgView::CreatePhoneMsgView()\r
+{\r
+ if (phoneMsgView_ == nullptr) {\r
+ phoneMsgView_ = new UIViewGroup();\r
+ phoneMsgView_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());\r
+ phoneMsgView_->SetViewId("phoneMsgView");\r
+ }\r
+\r
+ if (appNameLabel_ == nullptr) {\r
+ appNameLabel_ = new UILabel();\r
+ }\r
+ appNameLabel_->SetPosition(APP_NAME_POS_X, APP_NAME_POS_Y, APP_NAME_WIDTH, APP_NAME_HEIGHT);\r
+ appNameLabel_->SetText(phoneMsg_.appName.c_str());\r
+ appNameLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, APP_NAME_FONT_SIZE);\r
+ appNameLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ // Add to rootView\r
+ phoneMsgView_->Add(appNameLabel_);\r
+ appNameLabel_->SetVisible(true);\r
+\r
+ if (titleLabel_ == nullptr) {\r
+ titleLabel_ = new UILabel();\r
+ }\r
+ titleLabel_->SetPosition(MSG_TITLE_POS_X, MSG_TITLE_POS_Y, MSG_TITLE_WIDTH, MSG_TITLE_HEIGHT);\r
+ titleLabel_->SetText(phoneMsg_.msgTitle.c_str());\r
+ titleLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MSG_TITLE_FONT_SIZE);\r
+ titleLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ // Add to rootView\r
+ phoneMsgView_->Add(titleLabel_);\r
+ titleLabel_->SetVisible(true);\r
+\r
+ if (contentLabel_ == nullptr) {\r
+ contentLabel_ = new UILabel();\r
+ }\r
+ contentLabel_->SetPosition(MSG_CONTENT_POS_X, MSG_CONTENT_POS_Y, MSG_CONTENT_WIDTH, MSG_CONTENT_HEIGHT);\r
+ contentLabel_->SetText(phoneMsg_.msgContent.c_str());\r
+ contentLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, MSG_CONTENT_FONT_SIZE);\r
+ contentLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ // Add to rootView\r
+ phoneMsgView_->Add(contentLabel_);\r
+ contentLabel_->SetVisible(true);\r
+\r
+ if (cancelButton_ == nullptr) {\r
+ cancelButton_ = new UILabelButtonExt();\r
+ }\r
+ cancelButton_->SetPosition(CANCEL_BUTTON_POS_X, CANCEL_BUTTON_POS_Y, CANCEL_BUTTON_WIDTH, CANCEL_BUTTON_HEIGHT);\r
+ cancelButton_->SetViewId("cancelButton");\r
+ cancelButton_->SetText("取消通知");\r
+ cancelButton_->SetTouchable(true);\r
+ cancelButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, APP_NAME_FONT_SIZE);\r
+ // Add to rootView\r
+ phoneMsgView_->Add(cancelButton_);\r
+\r
+ phoneMsgView_->SetDraggable(true);\r
+ phoneMsgView_->SetTouchable(true);\r
+ UIView::OnDragListener *dragListener =\r
+ static_cast<UIView::OnDragListener *>(PhoneMsgViewEventListener::GetInstance());\r
+ UIView::OnClickListener *clickListener =\r
+ static_cast<UIView::OnClickListener *>(PhoneMsgViewEventListener::GetInstance());\r
+ phoneMsgView_->SetOnDragListener(dragListener);\r
+ phoneMsgView_->SetOnClickListener(clickListener);\r
+ cancelButton_->SetOnClickListener(clickListener);\r
+ StartPhoneMsgTimer(PhoneMsgView::notifyTime);\r
+ NotificationManager::GetInstance()->RegisterNotifyCleanupFunction(FreePhoneMsgView);\r
+ return phoneMsgView_;\r
+}\r
+\r
+void PhoneMsgView::FreePhoneMsgView(void)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FreePhoneMsgView");\r
+ if (phoneMsgView_ != nullptr) {\r
+ DisablePhoneMsgTimer();\r
+ phoneMsgView_->RemoveAll();\r
+ delete appNameLabel_;\r
+ appNameLabel_ = nullptr;\r
+ delete titleLabel_;\r
+ titleLabel_ = nullptr;\r
+ delete contentLabel_;\r
+ contentLabel_ = nullptr;\r
+ delete cancelButton_;\r
+ cancelButton_ = nullptr;\r
+ RootView::GetInstance()->Remove(phoneMsgView_);\r
+ delete phoneMsgView_;\r
+ phoneMsgView_ = nullptr;\r
+ }\r
+}\r
+\r
+void PhoneMsgView::UpDatePhoneMsg(std::string appName, std::string titile, std::string content)\r
+{\r
+ phoneMsg_.appName = appName;\r
+ phoneMsg_.msgTitle = titile;\r
+ phoneMsg_.msgContent = content;\r
+ MessageModel::GetInstance().GetMessageInfo(appName, titile, content);\r
+}\r
+\r
+PhoneMsgViewEventListener::PhoneMsgViewEventListener()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMsgViewEventListener :%p", this);\r
+}\r
+\r
+PhoneMsgViewEventListener::~PhoneMsgViewEventListener()\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "~PhoneMsgViewEventListener");\r
+}\r
+\r
+PhoneMsgViewEventListener *PhoneMsgViewEventListener::GetInstance(void)\r
+{\r
+ static PhoneMsgViewEventListener phoneMsgViewEventListener;\r
+ return &phoneMsgViewEventListener;\r
+}\r
+\r
+bool PhoneMsgViewEventListener::OnDrag(UIView &view, const DragEvent &event)\r
+{\r
+ return true;\r
+}\r
+\r
+bool PhoneMsgViewEventListener::OnDragEnd(UIView &view, const DragEvent &event)\r
+{\r
+ std::string viewId = view.GetViewId();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMsgViewEventListener OnDragEnd %s", viewId.c_str());\r
+ if (viewId == "phoneMsgView") {\r
+ NotificationManager::GetInstance()->StopNotify();\r
+ }\r
+ return true;\r
+}\r
+\r
+bool PhoneMsgViewEventListener::OnClick(UIView &view, const ClickEvent &event)\r
+{\r
+ UNUSED(event);\r
+ std::string viewId = view.GetViewId();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PhoneMsgViewEventListener ClickListener %s", viewId.c_str());\r
+ if (viewId == "phoneMsgView") {\r
+ NotificationManager::GetInstance()->StopNotify();\r
+ }\r
+ return true;\r
+}\r
+} // namespace OHOS
\ No newline at end of file
#include "nandflash_to_os.h"\r
#endif\r
#ifdef SUPPORT_OHOSFWK\r
-#include "ui_screennotify.h"\r
+#include "screennotify/ui_screennotify.h"\r
#endif\r
#include "sys/time.h"\r
#include "touch_screen_def.h"\r
--- /dev/null
+set(COMPONENT_NAME "remote_msg")\r
+\r
+set(PUBLIC_HEADER\r
+)\r
+\r
+set(PRIVATE_HEADER\r
+ ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/innerkits\r
+ ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits\r
+)\r
+\r
+set(SOURCES\r
+ ${CMAKE_CURRENT_SOURCE_DIR}/remote_msg.cpp\r
+)\r
+\r
+set(COMPONENT_PUBLIC_CCFLAGS\r
+)\r
+\r
+set(COMPONENT_CCFLAGS\r
+ -std=c++11\r
+ -Wno-missing-field-initializers\r
+)\r
+\r
+set(WHOLE_LINK\r
+ true\r
+)\r
+\r
+set(PUBLIC_DEFINES\r
+)\r
+\r
+set(PRIVATE_DEFINES\r
+ APP_PLATFORM_WATCHGT\r
+ CONFIG_ACELITE_ENABLE\r
+)\r
+\r
+build_component()\r
+\r
+\r
--- /dev/null
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved.\r
+ * Description: ota upgrade handle.\r
+ * This file should be changed only infrequently and with great care.\r
+ */\r
+#include <stdio.h>\r
+#include "securec.h"\r
+#include "msg_center.h"\r
+#include "msg_center_protocol.h"\r
+#include "msg_center_cmd.h"\r
+#include "wearable_log.h"\r
+#include "securec.h"\r
+#include "msg_center.h"\r
+#include "msg_center_common.h"\r
+#include "ohos_init.h"\r
+#include "remote_msg.h"\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+static const msg_center_cmd_map_t g_msg_center_phone_msg_tbl[] = {\r
+ {MSGCENTER_CMD_PHONE_MSG, MSGCENTER_TYPE_ID_MSG_THIRD_APP, msg_center_phone_msg_rec},\r
+ {MSGCENTER_CMD_PHONE_MSG, MSGCENTER_TYPE_ID_MSG_SMS, msg_center_phone_msg_rec},\r
+ {MSGCENTER_CMD_PHONE_MSG, MSGCENTER_TYPE_ID_MSG_PHONE, msg_center_phone_msg_rec},\r
+};\r
+\r
+errcode_t msg_center_phone_msg_rec(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+ uint16_t payload_len = usr_len - tl_len;\r
+ uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+ errcode_t ret = ERRCODE_SUCC;\r
+ uint8_t msg_result = 0;\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_phone_msg_rec, cmd_id = %d, type = %d\r\n", cmd_id, type);\r
+ Request request;\r
+ request.msgId = type;\r
+ request.len = payload_len;\r
+ request.data = tlv_payload;\r
+ MsgCenterNotifyProc(TOPIC_DEMO_ALL_MSG, &request);\r
+ ret = msg_center_send_data(cmd_id, type, &msg_result, sizeof(msg_result));\r
+ if (ret != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "phone msg_result fail, ret = %d\r\n", ret);\r
+ return ERRCODE_FAIL;\r
+ }\r
+ return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_phone_msg_type_dispatch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "msg_center_phone_msg_type_dispatch, cmd_id = %d, type = %d\r\n",\r
+ cmd_id, type);\r
+ uint8_t tbl_size = sizeof(g_msg_center_phone_msg_tbl) / sizeof(g_msg_center_phone_msg_tbl[0]);\r
+ uint8_t i;\r
+ for (i = 0; i < tbl_size; i++) {\r
+ msg_center_cmd_map_t *item = (msg_center_cmd_map_t *)&g_msg_center_phone_msg_tbl[i];\r
+ if ((item->type == type) && (item->handler != NULL)) {\r
+ item->handler(cmd_id, type, usr_data, usr_len);\r
+ return ERRCODE_SUCC;\r
+ }\r
+ }\r
+ return ERRCODE_NOT_SUPPORT;\r
+}\r
+\r
+void phone_msg_init(void)\r
+{\r
+ msg_center_register_cmd(MSGCENTER_CMD_PHONE_MSG, msg_center_phone_msg_type_dispatch);\r
+}\r
+\r
+APP_FEATURE_INIT_PRI(phone_msg_init, LAYER_INIT_LEVEL_4);\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: third application message\r
+ * Author: CompanyName\r
+ * Create: 2021-11-11\r
+ */\r
+\r
+#ifndef REMOTE_MSG_H\r
+#define REMOTE_MSG_H\r
+\r
+#include "msg_center_protocol.h"\r
+\r
+#ifdef __cplusplus\r
+#if __cplusplus\r
+extern "C" {\r
+#endif\r
+#endif\r
+\r
+typedef enum msg_center_phone_msg_type_id {\r
+ MSGCENTER_TYPE_ID_MSG_THIRD_APP = 0x1, // 三方应用消息\r
+ MSGCENTER_TYPE_ID_MSG_SMS, // 短信\r
+ MSGCENTER_TYPE_ID_MSG_PHONE, // 电话\r
+ MSGCENTER_TYPE_ID_MSG_MAX,\r
+} msg_center_msg_notify_type_id_t;\r
+\r
+errcode_t msg_center_phone_msg_rec(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+\r
+#ifdef __cplusplus\r
+#if __cplusplus\r
+}\r
+#endif\r
+#endif\r
+#endif /* REMOTE_MSG_H */
\ No newline at end of file
#include "watchdog.h"\r
#include "js_ability.h"\r
#include "recording_module.h"\r
+#ifdef CONFIG_BRANDY_BLE_TRANS_OPTIMIZE\r
+#include "bluetooth/BluetoothChangeBle.h"\r
+#endif\r
\r
#ifdef __cplusplus\r
extern "C" {\r
return;\r
}\r
\r
+static errcode_t send_pcm_stream_data(pcm_stream_queue_msg msg)\r
+{\r
+ uint8_t retry_cnt = 100;\r
+ uint8_t msg_send_delay = 10;\r
+ errcode_t res;\r
+\r
+ while (retry_cnt--) {\r
+ if (msg.msg_id == MSGCENTER_TYPE_ID_XIAODU_SEND_PCM_STREAM) {\r
+ res = msg_center_xiaodu_send_pcm_stream(MSGCENTER_CMD_XIAODU, MSGCENTER_TYPE_ID_XIAODU_SEND_PCM_STREAM,\r
+ msg.data, msg.len);\r
+ } else if (msg.msg_id == MSGCENTER_TYPE_ID_XIAODU_END_RECORD) {\r
+ res = msg_center_xiaodu_send_end_record(MSGCENTER_CMD_XIAODU, MSGCENTER_TYPE_ID_XIAODU_END_RECORD, msg.data,\r
+ msg.len);\r
+#ifdef CONFIG_BRANDY_BLE_TRANS_OPTIMIZE\r
+ ChangeBleConnectToDefault();\r
+#endif\r
+ }\r
+\r
+ if (res != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send stream fail, retry_cnt: %d, type = %d\n", retry_cnt,\r
+ msg.msg_id);\r
+ osDelay(msg_send_delay);\r
+ } else {\r
+ break;\r
+ }\r
+ }\r
+ free(msg.data);\r
+ msg.data = nullptr;\r
+ if (res != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "after retry, send stream still fail, retry_cnt: %d, type = %d\n",\r
+ retry_cnt, msg.msg_id);\r
+ pcm_stream_del_queue();\r
+ return ERRCODE_FAIL;\r
+ }\r
+ return ERRCODE_SUCC;\r
+}\r
+\r
static errcode_t pcm_stream_task_body(void *data)\r
{\r
UNUSED(data);\r
}\r
\r
g_pcm_stream_end_record_sended_flag = false;\r
+#ifdef CONFIG_BRANDY_BLE_TRANS_OPTIMIZE\r
+ ChangeBleConnectToMax();\r
+#endif\r
\r
for (;;) {\r
osStatus_t ret = osMessageQueueGet(g_pcm_stream_msg_queue_id, &msg, nullptr, osWaitForever);\r
if (ret != osOK) {\r
- msg.msg_id = MSGCENTER_TYPE_ID_XIAODU_END_RECORD;\r
- msg.data = nullptr;\r
+ continue;\r
}\r
- if (msg.msg_id == MSGCENTER_TYPE_ID_XIAODU_SEND_PCM_STREAM) {\r
- res = msg_center_xiaodu_send_pcm_stream(MSGCENTER_CMD_XIAODU, MSGCENTER_TYPE_ID_XIAODU_SEND_PCM_STREAM,\r
- msg.data, msg.len);\r
- free(msg.data);\r
- msg.data = nullptr;\r
- if (res != ERRCODE_SUCC) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send pcm stream failed");\r
- pcm_stream_del_queue();\r
- return ERRCODE_FAIL;\r
- }\r
- } else if (msg.msg_id == MSGCENTER_TYPE_ID_XIAODU_END_RECORD) {\r
- res = msg_center_xiaodu_send_end_record(MSGCENTER_CMD_XIAODU, MSGCENTER_TYPE_ID_XIAODU_END_RECORD, msg.data,\r
- msg.len);\r
- free(msg.data);\r
- msg.data = nullptr;\r
- if (res != ERRCODE_SUCC) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send pcm end failed");\r
- pcm_stream_del_queue();\r
- return ERRCODE_FAIL;\r
- }\r
- g_pcm_stream_end_record_sended_flag = true;\r
- return ERRCODE_SUCC;\r
+\r
+ /* pcm帧、end帧合并处理 */\r
+ res = send_pcm_stream_data(msg);\r
+ if (res == ERRCODE_FAIL || (res == ERRCODE_SUCC && msg.msg_id == MSGCENTER_TYPE_ID_XIAODU_END_RECORD)) {\r
+ return res;\r
}\r
}\r
-\r
- return ERRCODE_SUCC;\r
}\r
\r
/*\r
\r
errcode_t msg_center_xiaodu_start(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
{\r
- unused(usr_data);\r
uint8_t ack = 1;\r
errcode_t ret = ERRCODE_SUCC;\r
\r
}\r
display_api->set_screen_set_keepon_timeout(30000); // 30000ms\r
#endif\r
-#ifdef JS_ENABLE\r
- StartJsApp("com.vendor.voiceassistant");\r
-#endif\r
\r
/* ack */\r
ret = msg_center_send_data(cmd_id, type, &ack, sizeof(ack));\r
if (ret != ERRCODE_SUCC) {\r
return ERRCODE_FAIL;\r
}\r
+ uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+#ifdef JS_ENABLE\r
+ if(tlv_payload[0] == 1) {\r
+ StartJsApp("com.vendor.Aidialogue");\r
+ } else {\r
+ StartJsApp("com.vendor.Aidial");\r
+ }\r
\r
+#endif\r
return ERRCODE_SUCC;\r
}\r
\r
WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "send pcm stream end, usr_data = %d, usr_len = %d\r\n",\r
*(uint8_t *)usr_data, usr_len); /* usr_data参考协议msg_center_pcm_end_flag_t */\r
pcm_stream_del_queue();\r
+ g_pcm_stream_end_record_sended_flag = true;\r
return ERRCODE_SUCC;\r
}\r
\r
#include "msg_center_protocol.h"
#include "msg_center_cmd.h"
#include "ohos_init.h"
+#include "msg_center_common.h"
+#include "wearable_log.h"
+
namespace OHOS {
#ifdef __cplusplus