import definition = require("fps-meter/fps-native"); 

export class FPSCallback implements definition.FPSCallback {
    private impl: android.view.Choreographer.FrameCallback;
    private onFrame: (currentTimeMillis: number) => void;

    public running: boolean;

    constructor(onFrame: (currentTimeMillis: number) => void) {
        this.running = false;
        this.onFrame = onFrame;

        this.impl = new android.view.Choreographer.FrameCallback({
            doFrame: (nanos: number) => {
                this.handleFrame(nanos);
            }
        });
    }

    public start() {
        if (this.running) {
            return;
        }

        android.view.Choreographer.getInstance().postFrameCallback(this.impl);
        this.running = true;
    }

    public stop() {
        if (!this.running) {
            return;
        }

        android.view.Choreographer.getInstance().removeFrameCallback(this.impl);
        this.running = false;
    }

    private handleFrame(nanos: number) {
        if (!this.running) {
            return;
        }

        // divide by 1 000 000 since the parameter is in nanoseconds
        this.onFrame(nanos / 1000000);
        // add the FrameCallback instance again since it is automatically removed from the Choreographer
        android.view.Choreographer.getInstance().postFrameCallback(this.impl);
    }
}