/*
 * Copyright (C) 2011 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.
 */

// Copied from frameworks/base/cmds/stagefright/stream.cpp

// Note to NDK developers who happen to see this: this module uses Android internal platform APIs
// that are not part of the NDK supported APIs, and are subject to change at any time.

#include <binder/ProcessState.h>
#include <gui/Surface.h>
#include <gui/SurfaceComposerClient.h>
#include <utils/String8.h>

#include "nativewindow.h"

#if 1
#include <assert.h>
#define CHECK assert
#define CHECK_EQ(a,b) CHECK((a)==(b))
#else
#include <media/stagefright/foundation/ADebug.h>
#endif

namespace android {

sp<Surface> gSurface;
sp<SurfaceComposerClient> gComposerClient;
sp<SurfaceControl> gControl;

ANativeWindow *getNativeWindow_()
{
#if 0
    android::ProcessState::self()->startThreadPool();
#endif

    sp<SurfaceComposerClient> composerClient = new SurfaceComposerClient;
    CHECK_EQ(composerClient->initCheck(), (status_t)OK);

    sp<SurfaceControl> control =
        composerClient->createSurface(
                String8("A Surface"),
                1280,
                800,
                PIXEL_FORMAT_RGB_565,
                0);

    CHECK(control != NULL);
    CHECK(control->isValid());

    SurfaceComposerClient::Transaction{}
            .setLayer(control, 30000)
            .show(control)
            .apply();

    sp<Surface> surface = control->getSurface();
    CHECK(surface != NULL);

    gSurface = surface;
    gComposerClient = composerClient;
    gControl = control;
    // composerClient->dispose() at exit
    return surface.get();
}

void disposeNativeWindow_()
{
    gComposerClient->dispose();
}

} // namespace android

ANativeWindow *getNativeWindow()
{
    return android::getNativeWindow_();
}

void disposeNativeWindow()
{
    android::disposeNativeWindow_();
}
