| 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);
|
| +}
|
| +
|
|
|