2 * Copyright (c) 2022 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include "app-core-ui-cpp/app_core_task_base.hh"
20 #include <vconf-internal-keys.h>
27 #include "common/glib_private.hh"
31 class SystemEvent : public AppCoreBase::EventBase {
35 virtual ~IEvent() = default;
36 virtual void OnSystemEvent(Type type) = 0;
39 SystemEvent(IAppCore::IEvent::Type type, IEvent* listener);
41 void OnEvent(const std::string& value) override;
42 void OnEvent(int value) override;
48 class AppCoreTaskBase::Impl : public SystemEvent::IEvent {
50 Impl(AppCoreTaskBase* parent);
52 void LoopInit(int argc, char** argv);
56 void SetSystemEvents();
57 void UnsetSystemEvents();
58 void Post(UiState state);
59 std::recursive_mutex& GetMutex() const;
62 void OnSystemEvent(IAppCore::IEvent::Type type) override;
63 DeviceOrientationState ConvertRotationState(int value);
64 LowMemoryState ConvertLowMemoryState(int value);
65 LowBatteryState ConvertLowBatteryState(int value);
68 friend class AppCoreTaskBase;
69 AppCoreTaskBase* parent_;
70 std::shared_ptr<SystemEvent> low_memory_;
71 std::shared_ptr<SystemEvent> low_battery_;
72 std::shared_ptr<SystemEvent> lang_change_;
73 std::shared_ptr<SystemEvent> device_orientation_changed_;
74 std::shared_ptr<SystemEvent> region_change_;
75 GMainLoop* loop_ = nullptr;
76 std::queue<UiState> queue_;
77 mutable std::recursive_mutex mutex_;
80 SystemEvent::SystemEvent(Type type, SystemEvent::IEvent* listener)
81 : EventBase(type), listener_(listener) {
84 void SystemEvent::OnEvent(const std::string& value) {
85 listener_->OnSystemEvent(GetType());
88 void SystemEvent::OnEvent(int value) {
89 listener_->OnSystemEvent(GetType());
92 AppCoreTaskBase::Impl::Impl(AppCoreTaskBase* parent) : parent_(parent) {
93 low_memory_ = std::make_shared<SystemEvent>(
94 IAppCore::IEvent::Type::LOW_MEMORY, this);
95 low_battery_ = std::make_shared<SystemEvent>(
96 IAppCore::IEvent::Type::LOW_BATTERY, this);
97 lang_change_ = std::make_shared<SystemEvent>(
98 IAppCore::IEvent::Type::LANG_CHANGE, this);
99 device_orientation_changed_ = std::make_shared<SystemEvent>(
100 IAppCore::IEvent::Type::DEVICE_ORIENTATION_CHANGED, this);
101 region_change_ = std::make_shared<SystemEvent>(
102 IAppCore::IEvent::Type::REGION_CHANGE, this);
105 void AppCoreTaskBase::Impl::LoopInit(int argc, char** argv) {
106 loop_ = g_main_loop_new(nullptr, FALSE);
109 void AppCoreTaskBase::Impl::LoopRun() {
110 g_main_loop_run(loop_);
113 void AppCoreTaskBase::Impl::LoopExit() {
114 g_main_loop_quit(loop_);
117 void AppCoreTaskBase::Impl::LoopFinish() {
118 g_main_loop_unref(loop_);
121 void AppCoreTaskBase::Impl::SetSystemEvents() {
122 parent_->AddEvent(low_memory_);
123 parent_->AddEvent(low_battery_);
124 parent_->AddEvent(lang_change_);
125 parent_->AddEvent(device_orientation_changed_);
126 parent_->AddEvent(region_change_);
129 void AppCoreTaskBase::Impl::UnsetSystemEvents() {
130 parent_->RemoveEvent(region_change_);
131 parent_->RemoveEvent(device_orientation_changed_);
132 parent_->RemoveEvent(lang_change_);
133 parent_->RemoveEvent(low_battery_);
134 parent_->RemoveEvent(low_memory_);
137 void AppCoreTaskBase::Impl::OnSystemEvent(IAppCore::IEvent::Type type) {
138 if (type == IAppCore::IEvent::Type::LOW_MEMORY) {
139 parent_->OnLowMemory(ConvertLowMemoryState(low_memory_->GetVal(0)));
140 } else if (type == IAppCore::IEvent::Type::LOW_BATTERY) {
141 parent_->OnLowBattery(ConvertLowBatteryState(low_battery_->GetVal(0)));
142 } else if (type == IAppCore::IEvent::Type::LANG_CHANGE) {
143 parent_->OnLangChanged(lang_change_->GetVal(""));
144 } else if (type == IAppCore::IEvent::Type::DEVICE_ORIENTATION_CHANGED) {
145 parent_->OnDeviceOrientationChanged(
146 ConvertRotationState(device_orientation_changed_->GetVal(0)));
147 } else if (type == IAppCore::IEvent::Type::REGION_CHANGE) {
148 parent_->OnRegionChanged(region_change_->GetVal(""));
152 void AppCoreTaskBase::Impl::Post(UiState state) {
153 std::lock_guard<std::recursive_mutex> lock(mutex_);
156 GLib::IdleAdd(g_main_context_default(), [](gpointer user_data) {
157 auto* impl = static_cast<AppCoreTaskBase::Impl*>(user_data);
160 std::lock_guard<std::recursive_mutex> lock(impl->GetMutex());
161 state = impl->queue_.front();
164 impl->parent_->OnUiEvent(state);
165 return G_SOURCE_REMOVE;
169 std::recursive_mutex& AppCoreTaskBase::Impl::GetMutex() const {
173 AppCoreTaskBase::DeviceOrientationState
174 AppCoreTaskBase::Impl::ConvertRotationState(int value) {
175 AppCoreTaskBase::DeviceOrientationState state;
178 case AppCoreBase::ROTATION_PORTRAIT_NORMAL:
179 state = AppCoreTaskBase::DEVICE_ORIENTATION_STATE_0;
181 case AppCoreBase::ROTATION_PORTRAIT_REVERSE:
182 state = AppCoreTaskBase::DEVICE_ORIENTATION_STATE_180;
184 case AppCoreBase::ROTATION_LANDSCAPE_NORMAL:
185 state = AppCoreTaskBase::DEVICE_ORIENTATION_STATE_270;
187 case AppCoreBase::ROTATION_LANDSCAPE_REVERSE:
188 state = AppCoreTaskBase::DEVICE_ORIENTATION_STATE_90;
191 state = AppCoreTaskBase::DEVICE_ORIENTATION_STATE_UNKNOWN;
198 AppCoreTaskBase::LowMemoryState AppCoreTaskBase::Impl::ConvertLowMemoryState(
200 AppCoreTaskBase::LowMemoryState state;
203 case VCONFKEY_SYSMAN_LOW_MEMORY_NORMAL:
204 state = AppCoreTaskBase::LOW_MEMORY_STATE_NORMAL;
206 case VCONFKEY_SYSMAN_LOW_MEMORY_SOFT_WARNING:
207 state = AppCoreTaskBase::LOW_MEMORY_STATE_SOFT_WARNING;
209 case VCONFKEY_SYSMAN_LOW_MEMORY_HARD_WARNING:
210 state = AppCoreTaskBase::LOW_MEMORY_STATE_HARD_WARNING;
213 state = AppCoreTaskBase::LOW_MEMORY_STATE_UNKNOWN;
220 AppCoreTaskBase::LowBatteryState AppCoreTaskBase::Impl::ConvertLowBatteryState(
222 AppCoreTaskBase::LowBatteryState state;
225 case VCONFKEY_SYSMAN_BAT_POWER_OFF:
226 state = AppCoreTaskBase::LOW_BATTERY_STATE_POWER_OFF;
228 case VCONFKEY_SYSMAN_BAT_CRITICAL_LOW:
229 state = AppCoreTaskBase::LOW_BATTERY_STATE_CRITICAL_LOW;
232 state = AppCoreTaskBase::LOW_BATTERY_STATE_UNKNOWN;
239 AppCoreTaskBase::AppCoreTaskBase() : impl_(new Impl(this)) {}
241 AppCoreTaskBase::~AppCoreTaskBase() = default;
243 int AppCoreTaskBase::OnReceive(aul_type type, tizen_base::Bundle b) {
244 return AppCoreBase::OnReceive(type, std::move(b));
247 int AppCoreTaskBase::OnCreate() {
251 int AppCoreTaskBase::OnTerminate() {
252 return AppCoreBase::OnTerminate();
255 int AppCoreTaskBase::OnControl(tizen_base::Bundle b) {
256 return AppCoreBase::OnControl(std::move(b));
259 int AppCoreTaskBase::OnTrimMemory() {
260 return AppCoreBase::OnTrimMemory();
263 void AppCoreTaskBase::OnLoopInit(int argc, char** argv) {
264 impl_->LoopInit(argc, argv);
267 void AppCoreTaskBase::OnLoopRun() {
271 void AppCoreTaskBase::OnLoopExit() {
275 void AppCoreTaskBase::OnLoopFinish() {
279 void AppCoreTaskBase::OnLowMemory(LowMemoryState state) {}
281 void AppCoreTaskBase::OnLowBattery(LowBatteryState state) {}
283 void AppCoreTaskBase::OnLangChanged(const std::string& lang) {}
285 void AppCoreTaskBase::OnDeviceOrientationChanged(DeviceOrientationState state) {}
287 void AppCoreTaskBase::OnRegionChanged(const std::string& region) {}
289 void AppCoreTaskBase::Run(int argc, char** argv) {
290 impl_->SetSystemEvents();
291 AppCoreBase::Run(argc, argv);
292 impl_->UnsetSystemEvents();
295 void AppCoreTaskBase::OnUiEvent(UiState state) {}
297 void AppCoreTaskBase::Post(UiState state) {
301 } // namespace tizen_cpp