• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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()13 UIDartState::UIDartState() {
14 }
15 
~UIDartState()16 UIDartState::~UIDartState() {
17 }
18 
Current()19 UIDartState* 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)27 void 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)38 void UIDartState::DeInit(int32_t instanceId) {
39   g_ui_state->RemoveStateItem(instanceId);
40 }
41 
SetCurStateItem(int32_t id,std::unique_ptr<UIDartState::UIStateItem> item)42 void 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)53 void UIDartState::RemoveStateItem(int32_t id) {
54   std::lock_guard<std::mutex> lock(mutex_);
55   state_map_.erase(id);
56 }
57 
GetStateById(int32_t id) const58 UIDartState::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() const68 fml::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() const81 fml::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() const94 const 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() const107 Window* 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