/* Copyright (C) 2015 The Android Open Source Project
 **
 ** This software is licensed under the terms of the GNU General Public
 ** License version 2, as published by the Free Software Foundation, and
 ** may be copied, distributed, and modified under those terms.
 **
 ** This program is distributed in the hope that it will be useful,
 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ** GNU General Public License for more details.
 */

#pragma once

#include <QObject>

#include <memory>

// Task is a simple wrapper class, used to move the execution
// of function f to a separate QT Thread

class Task : public QObject {
    Q_OBJECT

public:
    Task(std::function<void()> f);

public slots:
    void run();

signals:
    void finished();

private:
    std::function<void()> fptr;
};

// The EmulatorQTNoWindow class is used to build a QT-Widget-less
// event loop when the parameter -no-window is passed to the android
// emulator. Much like EmulatorQtWindow, startThread(f) will spawn
// a new QT Thread to execute function f (qemu main loop).

class EmulatorQtNoWindow final : public QObject {
    Q_OBJECT

public:
    using Ptr = std::shared_ptr<EmulatorQtNoWindow>;

    static void create();
    static EmulatorQtNoWindow* getInstance();
    static Ptr getInstancePtr();

    void startThread(std::function<void()> f);

private:
    explicit EmulatorQtNoWindow(QObject* parent = 0);

private slots:
    void slot_clearInstance();
    void slot_finished();
};
