]> git.tdb.fi Git - libs/core.git/blob - source/core/android/mainthread.cpp
Expose the asset manager from Android::MainThread
[libs/core.git] / source / core / android / mainthread.cpp
1 #include <cstring>
2 #include <msp/fs/path.h>
3 #include "application.h"
4 #include "errorlogger.h"
5 #include "mainthread.h"
6
7 using namespace std;
8
9 namespace Msp {
10 namespace Android {
11
12 MainThread::MainThread(ANativeActivity *a):
13         asset_manager(a->assetManager),
14         starting_up(true)
15 {
16         attach_to_activity(a);
17         startup_mutex.lock();
18         launch();
19 }
20
21 void MainThread::attach_to_activity(ANativeActivity *a)
22 {
23         activity = a;
24         activity->callbacks->onDestroy = &activity_destroyed;
25         activity->callbacks->onNativeWindowCreated = &native_window_created;
26         activity->callbacks->onNativeWindowResized = &native_window_resized;
27         activity->callbacks->onNativeWindowDestroyed = &native_window_destroyed;
28         activity->callbacks->onInputQueueCreated = &input_queue_created;
29         activity->callbacks->onInputQueueDestroyed = &input_queue_destroyed;
30         activity->instance = this;
31 }
32
33 void MainThread::wait_for_app_created()
34 {
35         MutexLock lock(startup_mutex);
36 }
37
38 void MainThread::resume_startup()
39 {
40         if(starting_up)
41         {
42                 starting_up = false;
43                 startup_mutex.unlock();
44         }
45 }
46
47 void MainThread::main()
48 {
49         /* I have no idea how dependable this is, but it seems to be the only way
50         to get the package name aside from making a Java call through JNI */
51         char *appname = strdup(FS::Path(activity->internalDataPath)[-2].c_str());
52         char *argv[] = { appname, 0 };
53         Msp::Android::ErrorLogger err_logger;
54         Msp::Application::run(1, argv, this, &app_created);
55         free(appname);
56         if(activity)
57                 ANativeActivity_finish(activity);
58 }
59
60 void MainThread::app_created(void *data)
61 {
62         reinterpret_cast<MainThread *>(data)->resume_startup();
63 }
64
65 void MainThread::activity_destroyed(ANativeActivity *activity)
66 {
67         reinterpret_cast<MainThread *>(activity->instance)->activity = 0;
68 }
69
70 void MainThread::native_window_created(ANativeActivity *activity, ANativeWindow *window)
71 {
72         reinterpret_cast<MainThread *>(activity->instance)->signal_native_window_created.emit(window);
73 }
74
75 void MainThread::native_window_resized(ANativeActivity *activity, ANativeWindow *window)
76 {
77         reinterpret_cast<MainThread *>(activity->instance)->signal_native_window_resized.emit(window);
78 }
79
80 void MainThread::native_window_destroyed(ANativeActivity *activity, ANativeWindow *window)
81 {
82         reinterpret_cast<MainThread *>(activity->instance)->signal_native_window_destroyed.emit(window);
83 }
84
85 void MainThread::input_queue_created(ANativeActivity *activity, AInputQueue *queue)
86 {
87         reinterpret_cast<MainThread *>(activity->instance)->signal_input_queue_created.emit(queue);
88 }
89
90 void MainThread::input_queue_destroyed(ANativeActivity *activity, AInputQueue *queue)
91 {
92         reinterpret_cast<MainThread *>(activity->instance)->signal_input_queue_destroyed.emit(queue);
93 }
94
95 } // namespace Android
96 } // namespace Msp