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