Index: samples/android_sample/jni/eventloop.cc |
=================================================================== |
--- samples/android_sample/jni/eventloop.cc (revision 0) |
+++ samples/android_sample/jni/eventloop.cc (revision 0) |
@@ -0,0 +1,144 @@ |
+#include "eventloop.h" |
+#include "bin/log.h" |
+ |
+EventLoop::EventLoop(android_app* pApplication) : |
+ mEnabled(false), |
+ mQuit(false), |
+ mApplication(pApplication), |
+ mActivityHandler(NULL), |
+ mInputHandler(NULL) { |
+ mApplication->onAppCmd = activityCallback; |
+ mApplication->onInputEvent = inputCallback; |
+ mApplication->userData = this; |
+} |
+ |
+void EventLoop::run(ActivityHandler* pActivityHandler, |
+ Context* pContext) { |
+ int32_t lResult; |
+ int32_t lEvents; |
+ android_poll_source* lSource; |
+ |
+ app_dummy(); |
+ mActivityHandler = pActivityHandler; |
+ mInputHandler = pContext->mInputHandler; |
+ Log::Print("Starting event loop"); |
+ while (true) { |
+ // If not enabled, block on events. If enabled, don't block |
+ // so we can do useful work in onStep. |
+ while ((lResult = ALooper_pollAll(mEnabled ? 0 : -1, |
+ NULL, |
+ &lEvents, |
+ (void**)&lSource)) >= 0) { |
+ if (lSource != NULL) { |
+ lSource->process(mApplication, lSource); |
+ } |
+ if (mApplication->destroyRequested) { |
+ return; |
+ } |
+ } |
+ if (mEnabled && !mQuit) { |
+ Log::Print("step"); |
+ if (mActivityHandler->onStep() != 0) { |
+ mQuit = true; |
+ ANativeActivity_finish(mApplication->activity); |
+ } |
+ } |
+ } |
+} |
+ |
+// Called when we gain focus. |
+void EventLoop::activate() { |
+ Log::Print("activate"); |
+ if (!mEnabled && mApplication->window != NULL) { |
+ mQuit = false; |
+ mEnabled = true; |
+ if (mActivityHandler->onActivate() != 0) { |
+ mQuit = true; |
+ ANativeActivity_finish(mApplication->activity); |
+ } |
+ } |
+} |
+ |
+// Called when we lose focus. |
+void EventLoop::deactivate() { |
+ Log::Print("deactivate"); |
+ if (mEnabled) { |
+ mActivityHandler->onDeactivate(); |
+ mEnabled = false; |
+ } |
+} |
+ |
+void EventLoop::processActivityEvent(int32_t pCommand) { |
+ switch (pCommand) { |
+ case APP_CMD_CONFIG_CHANGED: |
+ mActivityHandler->onConfigurationChanged(); |
+ break; |
+ case APP_CMD_INIT_WINDOW: |
+ mActivityHandler->onCreateWindow(); |
+ break; |
+ case APP_CMD_DESTROY: |
+ mActivityHandler->onDestroy(); |
+ break; |
+ case APP_CMD_GAINED_FOCUS: |
+ activate(); |
+ mActivityHandler->onGainedFocus(); |
+ break; |
+ case APP_CMD_LOST_FOCUS: |
+ mActivityHandler->onLostFocus(); |
+ deactivate(); |
+ break; |
+ case APP_CMD_LOW_MEMORY: |
+ mActivityHandler->onLowMemory(); |
+ break; |
+ case APP_CMD_PAUSE: |
+ mActivityHandler->onPause(); |
+ deactivate(); |
+ break; |
+ case APP_CMD_RESUME: |
+ mActivityHandler->onResume(); |
+ break; |
+ case APP_CMD_SAVE_STATE: |
+ mActivityHandler->onSaveState(&mApplication->savedState, |
+ &mApplication->savedStateSize); |
+ break; |
+ case APP_CMD_START: |
+ mActivityHandler->onStart(); |
+ break; |
+ case APP_CMD_STOP: |
+ mActivityHandler->onStop(); |
+ break; |
+ case APP_CMD_TERM_WINDOW: |
+ mActivityHandler->onDestroyWindow(); |
+ deactivate(); |
+ break; |
+ default: |
+ break; |
+ } |
+} |
+ |
+void EventLoop::activityCallback(android_app* pApplication, int32_t pCommand) { |
+ EventLoop* pEventLoop = (EventLoop*)pApplication->userData; |
+ pEventLoop->processActivityEvent(pCommand); |
+} |
+ |
+int32_t EventLoop::processInputEvent(AInputEvent* pEvent) { |
+ int32_t lEventType = AInputEvent_getType(pEvent); |
+ Log::Print("Got input event type %d", lEventType); |
+ switch (lEventType) { |
+ case AINPUT_EVENT_TYPE_MOTION: |
+ if (AInputEvent_getSource(pEvent) == AINPUT_SOURCE_TOUCHSCREEN) { |
+ return mInputHandler->onTouchEvent(pEvent); |
+ } |
+ break; |
+ case AINPUT_EVENT_TYPE_KEY: |
+ return mInputHandler->onKeyEvent(pEvent); |
+ } |
+ return 0; |
+} |
+ |
+int32_t EventLoop::inputCallback(android_app* pApplication, |
+ AInputEvent* pEvent) { |
+ EventLoop& lEventLoop = *(EventLoop*) pApplication->userData; |
+ return lEventLoop.processInputEvent(pEvent); |
+} |
+ |