/*-------------------------------------------------------------------------
 * drawElements Quality Program Tester Core
 * ----------------------------------------
 *
 * Copyright 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *//*!
 * \file
 * \brief Android Native Activity.
 *//*--------------------------------------------------------------------*/

#include "tcuAndroidNativeActivity.hpp"
#include "deMemory.h"

DE_BEGIN_EXTERN_C

static void onStartCallback(ANativeActivity *activity)
{
    static_cast<tcu::Android::NativeActivity *>(activity->instance)->onStart();
}

static void onResumeCallback(ANativeActivity *activity)
{
    static_cast<tcu::Android::NativeActivity *>(activity->instance)->onResume();
}

static void *onSaveInstanceStateCallback(ANativeActivity *activity, size_t *outSize)
{
    return static_cast<tcu::Android::NativeActivity *>(activity->instance)->onSaveInstanceState(outSize);
}

static void onPauseCallback(ANativeActivity *activity)
{
    return static_cast<tcu::Android::NativeActivity *>(activity->instance)->onPause();
}

static void onStopCallback(ANativeActivity *activity)
{
    static_cast<tcu::Android::NativeActivity *>(activity->instance)->onStop();
}

static void onDestroyCallback(ANativeActivity *activity)
{
    static_cast<tcu::Android::NativeActivity *>(activity->instance)->onDestroy();
}

static void onWindowFocusChangedCallback(ANativeActivity *activity, int hasFocus)
{
    static_cast<tcu::Android::NativeActivity *>(activity->instance)->onWindowFocusChanged(hasFocus);
}

static void onNativeWindowCreatedCallback(ANativeActivity *activity, ANativeWindow *window)
{
    static_cast<tcu::Android::NativeActivity *>(activity->instance)->onNativeWindowCreated(window);
}

static void onNativeWindowResizedCallback(ANativeActivity *activity, ANativeWindow *window)
{
    static_cast<tcu::Android::NativeActivity *>(activity->instance)->onNativeWindowResized(window);
}

static void onNativeWindowRedrawNeededCallback(ANativeActivity *activity, ANativeWindow *window)
{
    static_cast<tcu::Android::NativeActivity *>(activity->instance)->onNativeWindowRedrawNeeded(window);
}

static void onNativeWindowDestroyedCallback(ANativeActivity *activity, ANativeWindow *window)
{
    static_cast<tcu::Android::NativeActivity *>(activity->instance)->onNativeWindowDestroyed(window);
}

static void onInputQueueCreatedCallback(ANativeActivity *activity, AInputQueue *queue)
{
    static_cast<tcu::Android::NativeActivity *>(activity->instance)->onInputQueueCreated(queue);
}

static void onInputQueueDestroyedCallback(ANativeActivity *activity, AInputQueue *queue)
{
    static_cast<tcu::Android::NativeActivity *>(activity->instance)->onInputQueueDestroyed(queue);
}

static void onContentRectChangedCallback(ANativeActivity *activity, const ARect *rect)
{
    static_cast<tcu::Android::NativeActivity *>(activity->instance)->onContentRectChanged(rect);
}

static void onConfigurationChangedCallback(ANativeActivity *activity)
{
    static_cast<tcu::Android::NativeActivity *>(activity->instance)->onConfigurationChanged();
}

static void onLowMemoryCallback(ANativeActivity *activity)
{
    static_cast<tcu::Android::NativeActivity *>(activity->instance)->onLowMemory();
}

DE_END_EXTERN_C

namespace tcu
{
namespace Android
{

NativeActivity::NativeActivity(ANativeActivity *activity) : m_activity(activity)
{
    activity->instance                              = (void *)this;
    activity->callbacks->onStart                    = onStartCallback;
    activity->callbacks->onResume                   = onResumeCallback;
    activity->callbacks->onSaveInstanceState        = onSaveInstanceStateCallback;
    activity->callbacks->onPause                    = onPauseCallback;
    activity->callbacks->onStop                     = onStopCallback;
    activity->callbacks->onDestroy                  = onDestroyCallback;
    activity->callbacks->onWindowFocusChanged       = onWindowFocusChangedCallback;
    activity->callbacks->onNativeWindowCreated      = onNativeWindowCreatedCallback;
    activity->callbacks->onNativeWindowResized      = onNativeWindowResizedCallback;
    activity->callbacks->onNativeWindowRedrawNeeded = onNativeWindowRedrawNeededCallback;
    activity->callbacks->onNativeWindowDestroyed    = onNativeWindowDestroyedCallback;
    activity->callbacks->onInputQueueCreated        = onInputQueueCreatedCallback;
    activity->callbacks->onInputQueueDestroyed      = onInputQueueDestroyedCallback;
    activity->callbacks->onContentRectChanged       = onContentRectChangedCallback;
    activity->callbacks->onConfigurationChanged     = onConfigurationChangedCallback;
    activity->callbacks->onLowMemory                = onLowMemoryCallback;
}

NativeActivity::~NativeActivity(void)
{
}

void NativeActivity::onStart(void)
{
}

void NativeActivity::onResume(void)
{
}

void *NativeActivity::onSaveInstanceState(size_t *outSize)
{
    *outSize = 0;
    return DE_NULL;
}

void NativeActivity::onPause(void)
{
}

void NativeActivity::onStop(void)
{
}

void NativeActivity::onDestroy(void)
{
}

void NativeActivity::onWindowFocusChanged(int hasFocus)
{
    DE_UNREF(hasFocus);
}

void NativeActivity::onNativeWindowCreated(ANativeWindow *window)
{
    DE_UNREF(window);
}

void NativeActivity::onNativeWindowResized(ANativeWindow *window)
{
    DE_UNREF(window);
}

void NativeActivity::onNativeWindowRedrawNeeded(ANativeWindow *window)
{
    DE_UNREF(window);
}

void NativeActivity::onNativeWindowDestroyed(ANativeWindow *window)
{
    DE_UNREF(window);
}

void NativeActivity::onInputQueueCreated(AInputQueue *queue)
{
    DE_UNREF(queue);
}

void NativeActivity::onInputQueueDestroyed(AInputQueue *queue)
{
    DE_UNREF(queue);
}

void NativeActivity::onContentRectChanged(const ARect *rect)
{
    DE_UNREF(rect);
}

void NativeActivity::onConfigurationChanged(void)
{
}

void NativeActivity::onLowMemory(void)
{
}

void NativeActivity::finish(void)
{
    ANativeActivity_finish(m_activity);
}

} // namespace Android
} // namespace tcu
