#ifndef NATIVEABILITYFWK_ABILITY_H
#define NATIVEABILITYFWK_ABILITY_H
+#include "utils/utils_list.h"
+#include "gfx_utils/vector.h"
#include <cstdint>
+#include <vector>
+
#include "SliceProxy.h"
#include "Slice.h"
+
#include "wearable_log.h"
#include "TransitionType.h"
#include "soc_osal.h"
-#include "gfx_utils/vector.h"
+#include "stack"
+#include "wearable_log.h"
+#include "AppViewIDs.h"
#include "graphic_mutex.h"
-
+#include "gfx_utils/vector.h"
namespace OHOS {
-const static uint16_t gSliceInvalid = 0;
+const static uint16_t gSliceInvalid = 0;
const static uint16_t gSliceDefaultPriority = 4; // 页面默认是最低优先级
+const static uint16_t gMaxHistorySlices = 10; // 默认最多保存三个历史记录
+
class Ability {
public:
void AddSliceProxy(const uint16_t sliceId, SliceProxy* proxy);
void StopPrevSlice();
void StopSliceTransition();
void BackToPreSlice();
+
+ /* -------------------------------------------------------------------------- */
+
+ /// @brief 当从一个切片(Slice)进入另一个切片时被调用。
+ /// @param sliceId sliceId
+ /// @param transitionId 切换的动画类型
+ /// @param priority 切换优先级
+ void EnterSlice(uint16_t sliceId,const TransitionType transitionId = TransitionType::TRANSITION_INVALID,
+ const uint16_t priority = gSliceDefaultPriority) {
+ // 获取当前SliceID
+ uint16_t curSliceId = GetCurSliceId();
+ if (curSliceId != defaultSliceId_) { // 假定defaultSliceId_是“主页”或启动Slice的ID
+ backStack_.push(curSliceId);
+ }
+ ChangeSlice(sliceId,transitionId,priority); // 切换到新的Slice
+ }
+
+ uint16_t GettopSliceId(void) {
+ if (!backStack_.empty() ) {
+ return backStack_.top();
+ }
+ return 0;
+ }
+
+
+ // 处理后退操作
+
+ /// @brief 处理后退操作。
+ /// @param transitionId 切换的动画类型
+ /// @param priority 切换优先级
+ bool Back(const TransitionType transitionId = TransitionType::TRANSITION_INVALID,
+ const uint16_t priority = gSliceDefaultPriority) {
+
+ if (!backStack_.empty()) {
+ uint16_t preSlice = backStack_.top();
+ backStack_.pop();
+ ChangeSlice(preSlice,transitionId,priority);
+ return true;
+ }
+ else
+ {
+ backStack_.push(defaultSliceId_); // 将默认主界面的 ID 推入栈中
+ // 退回到defaultSliceId_
+ ChangeSlice(defaultSliceId_, transitionId, priority);
+ return false; // 返回false表示无前一个slice,退回到默认slice
+ }
+ }
+
+ /// @brief 处理后退多级切片的操作。
+ /// @param count 指定的后退级数
+ /// @param transitionId 切换的动画类型
+ /// @param priority 切换优先级
+ bool BackCountSlice(int count,const TransitionType transitionId = TransitionType::TRANSITION_INVALID,
+ const uint16_t priority = gSliceDefaultPriority) {
+ //如果指定的后退级数 count 为 0 ,直接返回 false 。
+ // if(count == 0) {
+ // return false;
+ // }
+ while(!backStack_.empty() && count != 0) //当 count 不为 0 且 backStack_ 栈不为空时,弹出栈顶元素 count 次。
+ {
+ backStack_.pop();
+ count--;
+ }
+ if(!backStack_.empty())
+ {
+ // 如果此时 backStack_ 栈不为空,取出栈顶的切片 ID ,并调用 ChangeSlice 切换到该切片,返回 true 。
+ uint16_t preSlice = backStack_.top();
+ ChangeSlice(preSlice,transitionId,priority);
+ backStack_.pop();
+ return true;
+ }
+ else
+ {
+ //如果 backStack_ 栈为空,切换到默认切片,返回 false 。
+ ChangeSlice(defaultSliceId_, transitionId, priority);
+ return false; // 返回false表示无前一个slice,退回到默认slice
+ }
+ }
+ //仅用于打电话结束恢复时使用
+ bool Back_CountSlice_make_phone(const TransitionType transitionId = TransitionType::TRANSITION_INVALID,
+ const uint16_t priority = gSliceDefaultPriority);
+
+
+ bool make_phone_push(uint16_t preSlice) {
+ if(backStack_.empty())
+ {
+ backStack_.push(preSlice);
+ }
+ else
+ {
+ uint8_t top_id= backStack_.top();
+ if(top_id!=preSlice)
+ backStack_.push(preSlice);
+ }
+
+ return false;
+ }
+
+ /*清空后退栈*/
+ void ClearSliceIdStack(void)
+ {
+ while(!backStack_.empty())
+ {
+ backStack_.pop();
+ }
+ if (backStack_.empty()) {
+ backStack_.push(defaultSliceId_); // 将默认主界面的 ID 推入栈中
+ }
+ }
+
+ /*打印栈中元素*/
+ void showsStackSliceId()
+ {
+ printf("\n%d\n",backStack_.size());
+ std::stack<uint16_t> tempStack = backStack_;
+ printf("\n[");
+ while(!tempStack.empty())
+ {
+ printf("%d,",tempStack.top());
+ tempStack.pop();
+ }
+ printf("]\n");
+ printf("\n%d\n",backStack_.size());
+ }
+ /* -------------------------------------------------------------------------- */
protected:
Ability() = default;
void PostChangeSlice(const uint16_t targetSliceId, TransitionType type,
const uint16_t priority, bool enableSlideBack);
Ability::ProxyStruct* Find(const uint16_t sliceId);
+private:
+ std::stack<uint16_t> backStack_;//这个栈会在每次进入一个新的Slice时将其ID压入栈顶,当用户请求后退时,栈顶的Slice ID会被弹出,以此来访问前一个Slice。
};
}
#endif // NATIVEABILITYFWK_ABILITY_H
#endif
} TransitionTarget;
}
-#endif
\ No newline at end of file
+#endif
* @brief Scheduled by slice after funtion SetupView and before transition animator starts if exits.
*
* You should override it to prepare your own views and add them into root container
- * A simple examle is as follow:
+ * A simple examle is as follow:
* void OnStart() override
* {
* label_ = new UILabel();
* @brief Scheduled by slice after function TearDownView.
*
* You can override it or override function of Destructor function to destroy ui views
- * A simple examle is as follow:
+ * A simple examle is as follow:
* void OnStop() override
* {
* DELETE_IF_NOT_NULL(label_);
-/*\r
- * Copyright (c) CompanyNameMagicTag.\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-#ifndef NATIVEABILITYFWK_UTILS_LIST_H\r
-#define NATIVEABILITYFWK_UTILS_LIST_H\r
-\r
-#include <cstdint>\r
-\r
-namespace OHOS {\r
-template<typename T>\r
-class ListsNode {\r
-public:\r
- ListsNode() = default;\r
- ListsNode(T value) : value_(value), next_(nullptr), prev_(nullptr) {}\r
-\r
- T value_;\r
- ListsNode<T> *next_;\r
- ListsNode<T> *prev_;\r
-};\r
-\r
-template<typename T>\r
-class Lists {\r
-public:\r
- Lists() : count_(0)\r
- {\r
- head_ = new ListsNode<T>();\r
- head_->next_ = head_;\r
- head_->prev_ = head_;\r
- }\r
-\r
- ~Lists()\r
- {\r
- RemoveAll();\r
- delete head_;\r
- head_ = nullptr;\r
- }\r
-\r
- const T Front() const\r
- {\r
- if (count_ == 0) {\r
- return head_->value_;\r
- }\r
-\r
- return head_->next_->value_;\r
- }\r
-\r
- void PushFront(T value)\r
- {\r
- auto node = new ListsNode<T>(value);\r
- if (node == nullptr) {\r
- return;\r
- }\r
-\r
- node->prev_ = head_;\r
- node->next_ = head_->next_;\r
- head_->next_->prev_ = node;\r
- head_->next_ = node;\r
- count_++;\r
- }\r
-\r
- void PopFront()\r
- {\r
- if (count_ == 0) {\r
- return;\r
- }\r
-\r
- ListsNode<T> *node = head_->next_;\r
- node->next_->prev_ = head_;\r
- head_->next_ = node->next_;\r
- delete node;\r
- count_--;\r
- }\r
-\r
- const T Back() const\r
- {\r
- if (count_ == 0) {\r
- return head_->value_;\r
- }\r
-\r
- return head_->prev_->value_;\r
- }\r
-\r
- void PushBack(T value)\r
- {\r
- auto node = new ListsNode<T>(value);\r
-\r
- node->next_ = head_;\r
- node->prev_ = head_->prev_;\r
- head_->prev_->next_ = node;\r
- head_->prev_ = node;\r
- count_++;\r
- }\r
-\r
- void PopBack()\r
- {\r
- if (count_ == 0) {\r
- return;\r
- }\r
-\r
- ListsNode<T> *node = head_->prev_;\r
- node->prev_->next_ = head_;\r
- head_->prev_ = node->prev_;\r
- delete node;\r
- count_--;\r
- }\r
-\r
- void Remove(ListsNode<T> *node)\r
- {\r
- if ((count_ == 0) || (node == nullptr)) {\r
- return;\r
- }\r
-\r
- node->prev_->next_ = node->next_;\r
- node->next_->prev_ = node->prev_;\r
-\r
- delete node;\r
- count_--;\r
- }\r
-\r
- void RemoveAll()\r
- {\r
- ListsNode<T> *node = head_->next_;\r
- while (node != head_) {\r
- ListsNode<T> *temp = node;\r
- node = node->next_;\r
- delete temp;\r
- }\r
- head_->next_ = head_;\r
- head_->prev_ = head_;\r
- count_ = 0;\r
- }\r
-\r
- ListsNode<T> *Begin() const\r
- {\r
- return head_->next_;\r
- }\r
-\r
- const ListsNode<T> *End() const\r
- {\r
- return head_;\r
- }\r
-\r
- uint16_t Size() const\r
- {\r
- return count_;\r
- }\r
-\r
- bool IsEmpty() const\r
- {\r
- return count_ == 0;\r
- }\r
-\r
-private:\r
- ListsNode<T> *head_;\r
- uint16_t count_;\r
-};\r
-} // namespace OHOS\r
-#endif // NATIVEABILITYFWK_UTILS_LIST_H\r
+/*
+ * 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 NATIVEABILITYFWK_UTILS_LIST_H
+#define NATIVEABILITYFWK_UTILS_LIST_H
+
+#include <cstdint>
+
+namespace OHOS {
+template<typename T>
+class ListsNode {
+public:
+ ListsNode() = default;
+ ListsNode(T value) : value_(value), next_(nullptr), prev_(nullptr) {}
+
+ T value_;
+ ListsNode<T> *next_;
+ ListsNode<T> *prev_;
+};
+
+template<typename T>
+class Lists {
+public:
+ Lists() : count_(0)
+ {
+ head_ = new ListsNode<T>();
+ head_->next_ = head_;
+ head_->prev_ = head_;
+ }
+
+ ~Lists()
+ {
+ RemoveAll();
+ delete head_;
+ head_ = nullptr;
+ }
+
+ const T Front() const
+ {
+ if (count_ == 0) {
+ return head_->value_;
+ }
+
+ return head_->next_->value_;
+ }
+
+ void PushFront(T value)
+ {
+ auto node = new ListsNode<T>(value);
+ if (node == nullptr) {
+ return;
+ }
+
+ node->prev_ = head_;
+ node->next_ = head_->next_;
+ head_->next_->prev_ = node;
+ head_->next_ = node;
+ count_++;
+ }
+
+ void PopFront()
+ {
+ if (count_ == 0) {
+ return;
+ }
+
+ ListsNode<T> *node = head_->next_;
+ node->next_->prev_ = head_;
+ head_->next_ = node->next_;
+ delete node;
+ count_--;
+ }
+
+ const T Back() const
+ {
+ if (count_ == 0) {
+ return head_->value_;
+ }
+
+ return head_->prev_->value_;
+ }
+
+ void PushBack(T value)
+ {
+ auto node = new ListsNode<T>(value);
+
+ node->next_ = head_;
+ node->prev_ = head_->prev_;
+ head_->prev_->next_ = node;
+ head_->prev_ = node;
+ count_++;
+ }
+
+ void PopBack()
+ {
+ if (count_ == 0) {
+ return;
+ }
+
+ ListsNode<T> *node = head_->prev_;
+ node->prev_->next_ = head_;
+ head_->prev_ = node->prev_;
+ delete node;
+ count_--;
+ }
+
+ void Remove(ListsNode<T> *node)
+ {
+ if ((count_ == 0) || (node == nullptr)) {
+ return;
+ }
+
+ node->prev_->next_ = node->next_;
+ node->next_->prev_ = node->prev_;
+
+ delete node;
+ count_--;
+ }
+
+ void RemoveAll()
+ {
+ ListsNode<T> *node = head_->next_;
+ while (node != head_) {
+ ListsNode<T> *temp = node;
+ node = node->next_;
+ delete temp;
+ }
+ head_->next_ = head_;
+ head_->prev_ = head_;
+ count_ = 0;
+ }
+
+ ListsNode<T> *Begin() const
+ {
+ return head_->next_;
+ }
+
+ const ListsNode<T> *End() const
+ {
+ return head_;
+ }
+
+ uint16_t Size() const
+ {
+ return count_;
+ }
+
+ bool IsEmpty() const
+ {
+ return count_ == 0;
+ }
+
+private:
+ ListsNode<T> *head_;
+ uint16_t count_;
+};
+} // namespace OHOS
+#endif // NATIVEABILITYFWK_UTILS_LIST_H
}
FreeElement(elementName);
#endif
+ if (targetSliceId == VIEW_MAIN)
+ {
+ ClearSliceIdStack(); /*凡是回到主界面都要清空栈*/
+ }
+
+ if (targetSliceId == VIEW_INCOMING_CALL)
+ {
+ uint16_t id=GetCurSliceId();
+ if(id==VIEW_REBOOTANDSHUTDOWN && VIEW_INCOMING_CALL==GettopSliceId() )
+ {
+ ClearSliceIdStack();
+ }
+
+ if(id!=VIEW_INCOMING_CALL && id!=VIEW_BLUETOOTH_EARPHONE)
+ make_phone_push(id);
+ }
TransitionTarget target;
target.sliceInfo = targetSliceId | (priority << 16);
bool runImmed = PageTransitionMgr::GetInstance().BeginTransition(TransitionCaller::CHANGE_SLICE, target,
#include "notification_manager.h"
#include "PageTransitionMgr.h"
#include "hal_tick.h"
-
+#include "custom_runtime.h"
#ifdef __cplusplus
extern "C"
{
InstallNativeAbility(nullptr, this);
// 初始化Launcher
- NativeLauncher::GetInstance().InitNativeLauncher();
+ if(uapi_dev_runtime_get_safemode_flag())
+ {
+ NativeLauncher::GetInstance().InitNativeLauncher(LaunchMode::SAFE_MODE);
+ }
+ else
+ {
+ NativeLauncher::GetInstance().InitNativeLauncher(LaunchMode::NORMAL_MODE);
+ }
+
HideGraphicLogo();
return;
}
#include "graphic_service_wrapper.h"
#include "adapter.h"
-void StartNative() {
- OHOS::NativeLauncher::GetInstance().InitNativeLauncher();
+void StartNative()
+{
+ OHOS::NativeLauncher::GetInstance().InitNativeLauncher(OHOS::LaunchMode::NORMAL_MODE);
HideGraphicLogo();
+ HideGraphicOtaLogo();
Want *info = static_cast<Want *>(AdapterMalloc(sizeof(Want)));
memset_s(info, sizeof(Want), 0, sizeof(Want));
OHOS::NativeAbility::GetInstance().OnActive(*info);