1 // Copyright 2013 The Flutter Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "flutter/lib/ui/ui_dart_state.h" 6 7 #include "flutter/runtime/window_manager.h" 8 9 namespace flutter { 10 11 static std::unique_ptr<UIDartState> g_ui_state; 12 UIDartState()13UIDartState::UIDartState() { 14 } 15 ~UIDartState()16UIDartState::~UIDartState() { 17 } 18 Current()19UIDartState* UIDartState::Current() { 20 if (!g_ui_state) { 21 FML_LOG(ERROR) << "UIDartState not initialize!"; 22 return nullptr; 23 } 24 return g_ui_state.get(); 25 } 26 Init(int32_t instanceId,fml::WeakPtr<IOManager> io_manager,TaskRunners task_runners)27void UIDartState::Init(int32_t instanceId, 28 fml::WeakPtr<IOManager> io_manager, 29 TaskRunners task_runners) { 30 if (!g_ui_state) { 31 g_ui_state.reset(new UIDartState()); 32 } 33 auto item = std::make_unique<UIDartState::UIStateItem>(std::move(io_manager), std::move(task_runners)); 34 g_ui_state->SetCurInstance(instanceId); 35 g_ui_state->SetCurStateItem(instanceId, std::move(item)); 36 } 37 DeInit(int32_t instanceId)38void UIDartState::DeInit(int32_t instanceId) { 39 g_ui_state->RemoveStateItem(instanceId); 40 } 41 SetCurStateItem(int32_t id,std::unique_ptr<UIDartState::UIStateItem> item)42void UIDartState::SetCurStateItem(int32_t id, std::unique_ptr<UIDartState::UIStateItem> item) { 43 FML_LOG(INFO) << "SetCurStateItem id:" << id; 44 std::lock_guard<std::mutex> lock(mutex_); 45 auto iter = state_map_.find(id); 46 if (iter == state_map_.end()) { 47 state_map_.emplace(id, std::move(item)); 48 } else { 49 FML_LOG(WARNING) << "already have item of this instance id:" << id; 50 } 51 } 52 RemoveStateItem(int32_t id)53void UIDartState::RemoveStateItem(int32_t id) { 54 std::lock_guard<std::mutex> lock(mutex_); 55 state_map_.erase(id); 56 } 57 GetStateById(int32_t id) const58UIDartState::UIStateItem* UIDartState::GetStateById(int32_t id) const { 59 std::lock_guard<std::mutex> lock(mutex_); 60 auto iter = state_map_.find(id); 61 if (iter != state_map_.end()) { 62 return iter->second.get(); 63 } else { 64 return nullptr; 65 } 66 } 67 GetSkiaUnrefQueue() const68fml::RefPtr<SkiaUnrefQueue> UIDartState::GetSkiaUnrefQueue() const { 69 int32_t *ptr = cur_instance_id_.get(); 70 if (ptr == nullptr) { 71 FML_LOG(FATAL) << "UIDartState cur id is null"; 72 } 73 int32_t id = *ptr; 74 auto item = GetStateById(id); 75 if (item == nullptr) { 76 FML_LOG(FATAL) << "UIDartState cur item is null"; 77 } 78 return item->GetSkiaUnrefQueue(); 79 } 80 GetIOManager() const81fml::WeakPtr<IOManager> UIDartState::GetIOManager() const { 82 int32_t *ptr = cur_instance_id_.get(); 83 if (ptr == nullptr) { 84 FML_LOG(FATAL) << "UIDartState cur id is null"; 85 } 86 int32_t id = *ptr; 87 auto item = GetStateById(id); 88 if (item == nullptr) { 89 FML_LOG(FATAL) << "UIDartState cur item is null"; 90 } 91 return item->GetIOManager(); 92 } 93 GetTaskRunners() const94const TaskRunners& UIDartState::GetTaskRunners() const { 95 int32_t *ptr = cur_instance_id_.get(); 96 if (ptr == nullptr) { 97 FML_LOG(FATAL) << "UIDartState cur id is null"; 98 } 99 int32_t id = *ptr; 100 auto item = GetStateById(id); 101 if (item == nullptr) { 102 FML_LOG(FATAL) << "UIDartState cur item is null"; 103 } 104 return item->GetTaskRunners(); 105 } 106 window() const107Window* UIDartState::window() const { 108 int32_t *ptr = cur_instance_id_.get(); 109 if (ptr == nullptr) { 110 FML_LOG(ERROR) << "UIDartState cur id is null"; 111 return nullptr; 112 } 113 int32_t id = *ptr; 114 return WindowManager::GetWindow(id); 115 } 116 117 } // namespcae blink 118 119