Covellite++  Version: 2.3.0 Revision: ??? Platform: x64 Build: 23:13 04.01.2025
Кроссплатформенный фреймворк для разработки приложений на С++
Загрузка...
Поиск...
Не найдено
Application.android.cpp
1
2#include "stdafx.h"
3#include <Covellite/App/Application.hpp>
4#include <Covellite/Events.hpp>
5#include <Covellite/App/Events.hpp>
6
7using AppInfo_t = ::alicorn::system::platform::AppInfo;
8
9using namespace covellite::app;
10
11class Logcat
12{
13public:
14 inline static void Error(const char * _Format, ...)
15 {
16 va_list Args;
17 va_start(Args, _Format);
18 (void)__android_log_print(ANDROID_LOG_ERROR, "Covellite++", _Format, Args);
19 va_end(Args);
20 }
21
22 inline static void Info(const char * _Format, ...)
23 {
24 va_list Args;
25 va_start(Args, _Format);
26 (void)__android_log_print(ANDROID_LOG_INFO, "Covellite++", _Format, Args);
27 va_end(Args);
28 }
29};
30
35Application::Application(const Run_t & _Run) :
36 Run(_Run)
37{
38 auto & App = AppInfo_t::Get<android_app>();
39
40 App.userData = this;
41 App.onAppCmd = [](android_app * _pApp, int32_t _Message)
42 {
43 if (_pApp == nullptr || _pApp->userData == nullptr) return;
44
45 // cppcheck-suppress constVariable
46 auto & Events = *(reinterpret_cast<Application *>(_pApp->userData));
47
48 Events.m_Events[_Message]();
49 };
50
51 App.onInputEvent = [](android_app * _pApp, AInputEvent * _pEvent) -> int32_t
52 {
53 if (_pApp == nullptr || _pApp->userData == nullptr) return 0;
54
55 // cppcheck-suppress constVariable
56 auto & Events = *(reinterpret_cast<Application *>(_pApp->userData));
57
58 const auto EventType = AInputEvent_getType(_pEvent);
59 const auto ActionType = AMotionEvent_getAction(_pEvent);
60
61 const auto IsSuccess = Events.m_Events[(EventType << 8) | ActionType](_pEvent);
62 return (IsSuccess) ? 1 : 0;
63 };
64
65 m_Events[(int32_t)APP_CMD_INIT_WINDOW]
66 .Connect([=]() { m_Events[events::Application.Start](); });
67 m_Events[(int32_t)APP_CMD_STOP]
68 .Connect([=]() { m_Events[events::Application.Exit](); });
69 m_Events[(int32_t)APP_CMD_TERM_WINDOW]
70 .Connect([=]()
71 {
72 // Простую очистку стека здесь делать нельзя, т.к. реализация std::stack
73 // в CrystaX удаляет объекты стека в порядке их создания (в отличие от
74 // реализации от Microsoft, которая удаляет их в обратном порядке).
75 //m_Windows = Windows_t{};
76
77 while(!m_Windows.empty()) m_Windows.pop();
78 });
79 m_Events[events::Application.Exit]
80 .Connect([=]() { ANativeActivity_finish(App.activity); });
81}
82
89 Application([=](void)
90 {
91 auto & DestroyRequested = AppInfo_t::Get<android_app>().destroyRequested;
92
93 m_IsFocused = true;
94
95 while (DestroyRequested == 0)
96 {
97 if (m_IsFocused)
98 {
99 // Выбирает все события, которые есть в очереди событий, не ожидая
100 // появлений новых.
101 while (PostCommand(false)) {}
102 }
103 else
104 {
105 // Ждем появления события (использовать while здесь нельзя, т.к.
106 // эта функция, вызванная с параметром true, не может вернуть false
107 // ни при каких условиях! Это не проблема во время работы, но при
108 // завершении работы программы это приводит к бесконечному циклу.)
109 PostCommand(true);
110 }
111
112 m_Events[events::Application.Update]();
113 }
114 })
115{
116 // Обслуживание отключения непрерывной отрисовки экрана при потере фокуса
117 // программой.
118 m_Events[(int32_t)APP_CMD_LOST_FOCUS]
119 .Connect([=]() { m_IsFocused = false; });
120 m_Events[(int32_t)APP_CMD_GAINED_FOCUS]
121 .Connect([=]() { m_IsFocused = true; });
122}
123
130 Application([=](void)
131 {
132 auto & DestroyRequested = AppInfo_t::Get<android_app>().destroyRequested;
133
134 Logcat::Info("Application::Run(): event based circle started.");
135
136 while (DestroyRequested == 0)
137 {
138 PostCommand(true);
139 m_Events[events::Application.Update]();
140 }
141 })
142{
143}
144
145/*virtual*/ Application::~Application(void) noexcept
146{
147 auto & App = AppInfo_t::Get<android_app>();
148
149 App.onAppCmd = nullptr;
150 App.onInputEvent = nullptr;
151 App.userData = nullptr;
152}
153
165/*static*/ void Application::Main(CreateApp_t _fnCreateApp, void * _pParams) noexcept
166{
167 // Использование логгера Android напрямую, т.к. логгер Alicorn здесь еще
168 // не инициализирован.
169 Logcat::Info("Application::Main(): start program.");
170
171 try
172 {
173 auto * pApp = reinterpret_cast<android_app *>(_pParams);
174
175 Logcat::Info("Application::Main(): init.");
176
177 // При переходе на Clang:
178 // - Для pApp->window код не компилируется.
179 // - Для &pApp->window вызов AppInfo_t::Get<ANativeWindow *>() бросает
180 // исключение для несуществующего значения.
181 const AppInfo_t Info
182 {
183 pApp,
184 pApp->activity,
185 pApp->activity->vm,
186 };
187
188 Logcat::Info("Application::Main(): create app object.");
189
190 const auto pApplication = _fnCreateApp();
191
192 Logcat::Info("Application::Main(): run program.");
193
194 pApplication->Run();
195 }
196 catch (const ::std::exception & _Ex)
197 {
198 Logcat::Error("Application::Main(): error [%s].", _Ex.what());
199 }
200 catch (...)
201 {
202 Logcat::Error("Application::Main(): error [unknown].");
203 }
204
205 Logcat::Info("Application::Main(): finish program.");
206}
207
212::std::string Application::GetCommandLine(void) const
213{
214 return "";
215}
216
233bool Application::PostCommand(bool _IsWaitMessage)
234{
235 android_poll_source * pSource = nullptr;
236
237 const auto Result = ALooper_pollAll((_IsWaitMessage) ? -1 : 0,
238 nullptr, nullptr, (void **)&pSource);
239 if (Result < 0 || pSource == nullptr) return false;
240
241 pSource->process(&AppInfo_t::Get<android_app>(), pSource);
242
243 return true;
244}
Definition android_native_app_glue.h:90
Definition android_native_app_glue.h:111
Класс входит в проект Covellite.App Базовый класс приложения для Android.
Definition Application.hpp:51
Application(const Run_t &)
Инициализирующий конструктор класса.
Definition Application.android.cpp:35
static void Main(void *) noexcept
Функция точки входа в программу.
Definition Application.inl:58
VIRTUAL_MOCK bool PostCommand(bool)
Функция вызова сигнала произошедшего события..
Definition Application.android.cpp:233
::std::string GetCommandLine(void) const
Функция получения параметров командной строки, которые были переданы программе ее при запуске.
Definition Application.android.cpp:212
Непрерывная отрисовка экрана (режим работы игры).
Definition Application.hpp:57
Definition Application.hpp:58